Skip to content

fix(codex): register the three packages missing from the Codex catalog - #210

Merged
mxriverlynn merged 5 commits into
v5.5.0-betafrom
gh-198-codex
Sep 10, 2026
Merged

fix(codex): register the three packages missing from the Codex catalog#210
mxriverlynn merged 5 commits into
v5.5.0-betafrom
gh-198-codex

Conversation

@mxriverlynn

@mxriverlynn mxriverlynn commented Sep 10, 2026

Copy link
Copy Markdown
Collaborator

Closes #198. Plans and implements the fix in five commits: two documentation commits carrying the change plan, then the three change units.

What #198 reported

Three Han packages the README tells Codex users to install could not be installed:

$ codex plugin add han-documentation@han
Error: plugin `han-documentation` was not found in marketplace `han`

han-research failed identically. han-linear failed one layer deeper: absent from the catalog and never carrying a Codex manifest on any commit.

Why it happened

Four hand-maintained lists enumerate the Codex-installable packages — the han-* directory tree, the per-plugin manifests, .agents/plugins/marketplace.json, and the README — and nothing checked that they agreed.

The drift is visible in the history. 2c09799 scaffolded han-documentation and han-research and updated only the Claude marketplace; its own message says "registered in the marketplace", singular. The comparison case is 556b49e, which added han-ddd and updated both marketplace files plus CLAUDE.md, which is why han-ddd installs today.

The three units

Unit Commit What it does
1 b83712f Two catalog entries for the plugins that already had manifests
2 1928de6 han-linear's manifest, its catalog entry, and the CLAUDE.md line that recorded its absence as intentional
3 f15663f The consistency check, plus the sanity.bats header it makes stale

Each unit leaves the repository green on its own.

The check

The directory tree is the authority: every han-* directory needs both files. The han-* glob excludes the han meta-plugin structurally rather than by an exception list.

Three assertions, bash and grep only:

  1. the enumeration is non-empty, so the other two cannot pass over an empty set while looking identical to success
  2. every package has a .codex-plugin/plugin.json
  3. every package has a catalog entry whose name and path sit in the same entry, matched in a three-line window rather than tested for presence anywhere in the file

Deliberately not asserted: version parity (false for eleven of twelve pairs) and description parity (false for all twelve). Both would fail the build the day they landed, and neither is a latent goal — the release skill touches only the Claude side.

Verified to actually fail

Run against a worktree on the commit before Unit 1, with only the test file copied in:

not ok 2 every han-* package carries a Codex manifest
# codex manifest missing: han-linear/.codex-plugin/plugin.json (copy han-ddd/... and edit the package-specific fields)
not ok 3 every han-* package has a catalog entry naming it and pointing at it
# catalog entry missing: add "name": "han-documentation" with "path": "./han-documentation" to .agents/plugins/marketplace.json
# catalog entry missing: add "name": "han-linear" with "path": "./han-linear" to .agents/plugins/marketplace.json
# catalog entry missing: add "name": "han-research" with "path": "./han-research" to .agents/plugins/marketplace.json

Exactly the three packages #198 names. On HEAD: 121 tests pass, 0 fail, every lint hook passes.

Worth a reviewer's attention

  • han-linear's Codex manifest ships at 1.0.0, not the Claude manifest's 1.1.1. The release skill's own rule is that a brand-new plugin is not bumped by the release that introduces it. The two version fields are separate lineages; seeding 1.1.1 would manufacture a parity the next release destroys. No version is bumped by this PR.
  • The next release will classify han-linear as changed on the strength of the new manifest alone, and the level buckets have no entry for "gained Codex installability." Worth deciding deliberately at release time.
  • CLAUDE.md is edited, and it was not in the area originally scoped. Brought in because this change makes line 83 false, on the 556b49e precedent. Line 73 was cut for scope and is reinstatable.
  • Nothing was verified against a running Codex. No CLI was available. Every install-time claim traces to the repo's files and the error text in Codex marketplace catalog omits han-documentation, han-research, and han-linear #198; the fix copies the shape of the ten entries that demonstrably work.
  • docs/choosing-a-han-plugin.md still gives Codex readers Claude-only install commands. Left alone as outside scope; recorded as a follow-up.

Planning artifacts

docs/plans/codex-marketplace-catalog-consistency/ carries the change plan, 11 decisions, 18 current-state findings, and the scope boundary. Nine items are deferred with reopening triggers, including a reverse check on the catalog and a Codex packaging document for the han-plugin-builder guidance, which has none.

Produced with /han-planning:plan-a-change. The review round (test-engineer, devops-engineer, junior-developer) found nine defects in the draft plan, including a verification step using git stash that cannot reach committed history, and a worked JSON example whose formatting would have diverged permanently from every sibling entry.

Three Han packages the README tells Codex users to install cannot be
installed. han-documentation and han-research are absent from
.agents/plugins/marketplace.json despite having valid Codex manifests;
han-linear is absent from the catalog and has never had a manifest at
all.

The root cause is structural rather than a one-off slip. Four
hand-maintained lists enumerate the Codex-installable packages (the
directory tree, the manifests, the catalog, the README) and nothing
checks that they agree. The drift entered on 2c09799, which scaffolded
both plugins and updated only the Claude marketplace; the comparison
case is 556b49e, which updated both marketplace files plus CLAUDE.md,
which is why han-ddd installs.

The plan names the directory tree as the authority and adds one Bats
check enforcing it, in three units that each leave the repo green:
register the two plugins that already have manifests; give han-linear a
manifest, a catalog entry, and a corrected CLAUDE.md line; then add the
check.

Planned with plan-a-change. Discovery ran structural and behavioral
analysts; the review round ran test-engineer, devops-engineer, and
junior-developer, which found nine defects in the draft, including a
verification step using git stash that cannot reach committed history
and a worked JSON example that would have introduced permanent
formatting drift.
han-plugin-builder's guidance is where every plugin-asset decision in
this repo is supposed to route, and it has no document describing the
Codex packaging surface. Its only Codex mentions are plugin-naming.md's
dot rule and that file's rename checklist, which acknowledges
.codex-plugin/plugin.json and a Codex marketplace exist as things to
keep in step. Nothing states a plugin needs both to ship.

Recorded as a deferral with a reopening trigger rather than pulled into
this change: the consistency check answers the question mechanically,
and a failing check is a stronger statement than a document nobody has
to read.
Both plugins have carried a valid .codex-plugin/plugin.json since they
were scaffolded in 2c09799, but that commit updated only the Claude
marketplace, so neither name was ever resolvable:

    $ codex plugin add han-documentation@han
    Error: plugin `han-documentation` was not found in marketplace `han`

A Codex install reads the catalog first and the per-plugin manifest
second, so the lookup failed before reaching manifests that were correct
all along. Adding the two entries is the whole fix for these two.

Both entries take the four-key form every existing entry uses, and sit
after han-core and before han-planning: the Codex catalog's order is the
Claude marketplace's order with its omissions removed, so restoring the
omitted names to their Claude positions is the placement consistent with
the file.

Unit 1 of 3 from docs/plans/codex-marketplace-catalog-consistency.
Closes two of the three symptoms in #198.
han-linear failed one layer deeper than han-documentation and
han-research: it was absent from the catalog and had never carried a
.codex-plugin/plugin.json on any commit, so a catalog entry alone would
have resolved to a directory with no manifest to read. Both land here.

The manifest copies the nine fields that are byte-identical across all
twelve siblings (author, homepage, repository, license, skills, and the
four constant interface keys) and supplies the eight package-specific
ones from han-linear's README and skill description.

It ships at 1.0.0 rather than mirroring the Claude manifest's 1.1.1. The
release skill's own rule is that a brand-new plugin is not bumped by the
release that introduces it, and a Codex manifest that has never existed
is that case. The two version fields are separate lineages: the release
skill bumps {source}/.claude-plugin/plugin.json and the Claude
marketplace, and never opens a .codex-plugin file. Eleven of twelve
pairs already differ, so seeding 1.1.1 would manufacture a parity the
next release destroys.

CLAUDE.md line 83 recorded the missing manifest as intentional. This
change makes that false, and it is the file every agent reads before
scaffolding, so it is corrected here rather than left to drift. Same
shape as 556b49e, which added han-ddd and updated the Codex catalog, the
Claude marketplace, and the map together.

Unit 2 of 3 from docs/plans/codex-marketplace-catalog-consistency.
Closes the third symptom in #198.
Nothing in the test, lint, or CI chain read a manifest or a marketplace
file, so the four data fixes above would not have stopped the next
plugin repeating 2c09799. This adds the check that would have caught
#198 when han-linear and han-ddd landed.

The directory tree is the authority: every han-* directory needs a Codex
manifest and a catalog entry. The han-* glob excludes the han/
meta-plugin structurally rather than by an exception list.

Three assertions, bash and grep only:

  1. the enumeration is non-empty, so the other two cannot pass over an
     empty set while looking identical to success
  2. every package has a .codex-plugin/plugin.json
  3. every package has a catalog entry whose name and path sit in the
     same entry, matched in a three-line window rather than tested for
     presence anywhere in the file

Deliberately not asserted: version parity (false for eleven of twelve
pairs) and description parity (false for all twelve). Both would fail
the build the day they landed, and neither is a latent goal, since the
release skill touches only the Claude side.

Verified against a worktree on the commit before the data fixes: the
check fails there and names han-documentation, han-research, and
han-linear, with han-linear failing both assertions. A consistency check
nobody has seen fail is a check nobody knows works.

sanity.bats stated that test/ keeps only harness-level checks, which
this file breaks. Widened to name the second category, keeping the
clause that still decides most cases: a test covering one script sits
beside that script.

Unit 3 of 3 from docs/plans/codex-marketplace-catalog-consistency.
@mxriverlynn mxriverlynn changed the title docs: plan the fix for the Codex catalog gaps issue #198 reported fix(codex): register the three packages missing from the Codex catalog Sep 10, 2026
@mxriverlynn
mxriverlynn marked this pull request as ready for review September 10, 2026 18:15
@mxriverlynn
mxriverlynn merged commit 949dc3f into v5.5.0-beta Sep 10, 2026
2 checks passed
@mxriverlynn
mxriverlynn deleted the gh-198-codex branch September 10, 2026 18:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant