Development record
the release-gate manifest pins 17 briefDocs while four shipped surface chapters (guard, ideate, identity, banlist) are outside the pin, so every full-tier crosscheck attests coverage it never ran
issueresolvedminoriss-387
the release-gate manifest pins 17 briefDocs while four shipped surface chapters (guard, ideate, identity, banlist) are outside the pin, so every full-tier crosscheck attests coverage it never ran
Evidence
.abcd/development/release-gate/manifest.json:22-37pins 17briefDocs;brief/04-surfaces/README.mdrows 17-20 (/abcd:guard,/abcd:ideate,/abcd:identity,/abcd:banlist) are Status: shipped with chapters17-guard.md..20-banlist.mdon disk, none pinned.brief-surface-crosscheck.js:52reads onlyinput.briefDocs— disk is never consulted.- Proof the chapters were skipped, not passed: the newest full-tier receipt (
.abcd/work/reviews/dc4de340…/iss35-brief-surface-crosscheck.json,manifestHashequal to the current file) contains findings only for the 17 pinned docs + 5 surfaces — zero from chapters 17-20, whilegit ls-treeshows all four present at the content commit.release-gate/README.md:86-87("the 17-document brief-doc list", "22 = 17 brief docs + 5 surfaces", full tier = "the whole brief-doc list") makesfulla false coverage claim riding on a signed attestation. - Not a freeze: the manifest was edited between cuts (
manifestHashchanged across the v0.4.x/v0.5.0 receipts, consistent with the16-audit.md→16-lint.mdrename), and the runbook has no refresh step — the pin simply was not maintained as surfaces shipped. - Refuter verdict: CONFIRMED (minor, drift; top-priority record item). The pinned prompt's 10-of-19 command roster is a separate, known-but-unrecorded deferral (dcn-2608050000000002:
promptHashpins prompt text "by an algorithm nothing in the tree computes or verifies, so it is left untouched") — the prompt text andpromptHashare deliberately NOT edited by this round's fix.
Resolution note
Pre-merge review caught that the first fix was itself N−1 of N: the shipped
21-update.md chapter (/abcd:update, itd-130, merged the same morning) was a
fifth unpinned chapter. The final fix pins all five (guard/ideate/identity/
banlist/update), giving 22 briefDocs + 5 surfaces = checkerCount 27.
Frontmatter
| id | iss-387 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | minor |
.abcd/work/issues/resolved/iss-387-the-release-gate-manifest-pins-17.md
open on GitHub ↗ · commit history ↗
mentions7
- dcn-26080500000000022026-08-05 — iss-44 + iss-160 + iss-161 + iss-162 (v0.5.0 item D, one work item): the plugin surface is reconciled with every document describing it, and the reconciliation is a MOVE rather than a rename, because the harness's namespace rule leaves no other answer. Verb files under `commands/abcd/` registered as `/abcd:abcd:<verb>` — a `commands/` subdirectory IS a namespace segment, and this one was named after the plugin, so the prefix appeared twice and every documented `/abcd:<verb>` was an unknown command (iss-161). Flattening into `commands/` is what makes the printed guidance runnable, which is why iss-162 needed no rewrite at all: all eighteen verb files already spelled `/abcd:<verb>` in their self- and cross-references — verified by grep across every one rather than assumed — so the guidance was correct prose about a name nothing registered. On iss-160 the fix direction was settled by evidence, not preference: the loader registers every markdown file under `commands/`, requiring no frontmatter and exempting no name (this repo's own iss-110 records `agents/README.md` registering as an agent; the published plugin reference describes commands purely as flat `.md` files with no ignore list), so NO in-place form keeps a readme unregistered and the only reliable home is outside the auto-discovery root. It goes to the brief's surface registry, which already enumerates the same surface and is already machine-checked against it — folding the doc into the gate that guards it rather than leaving a second enumeration to drift. The cost is one repointed link in a 2026-07-12 plan, paid because `links_resolve` is a blocker and a dangling pointer is not history. iss-44's three instances close with them: `ahoy` gains a section per sub-verb (with `identity-check` carrying an explicit CLI-only note, because its exit code is the point of wiring it into a hook — an absence recorded as a decision is not a gap), every `make build` remedy is replaced by the `go run ./cmd/abcd …` fallback the same paragraphs already carried, and `memory`'s renders stop naming a front door from `internal/core`, which is transport-agnostic by boundary rule: the heading a plain-CLI reader sees must not claim they invoked a plugin command they may not have installed. Detectors first, both watched failing: a surface-parity test over the real command tree and the real directory (flat-and-commands-only, every sub-verb reachable or scoped, no unrunnable remedy), and a string-literal check over `internal/core/memory` — literals, not comments, because prose explaining a surface may name it. `surface_coverage` gains a `bare_command` field so the flat directory's top-level board file is excluded the way README already is, rather than demanding a registry row that cannot exist; hardcoding the name would have been wrong in a lint engine that ships to repos whose plugin is not called abcd. Left alone deliberately: the historical citations of `commands/abcd/` across decisions, shipped intents, closed specs, research and resolved issues — they describe the tree as it was, and rewriting them would trade a true record for a tidy one. Not fixed here, and reported instead: the release-gate manifest's `promptHash` pins prompt text this change edits, by an algorithm nothing in the tree computes or verifies, so it is left untouched rather than guessed at.
- dcn-26082000000000082026-08-20 — Bug-hunt round 3 (hunt B), branch bughunt-b/round-3. Baseline
- iss-44plugin surface parity: commands/abcd/ahoy.md drives only the bare read-only detect while the CLI registers install, uninstall, doctor, and dry-run — doctor and dry-run are read-only so a keep-mutation-away-from-agents policy cannot explain their absence, and the landing commit claimed the sub-verbs were wired through the plugin command; every plugin command remedy for abcd not on PATH says make build, which cannot produce an on-PATH abcd; plain-CLI abcd memory ask output is headed as a plugin slash command. Detector: a surface-parity check — every CLI sub-verb is reachable from the plugin markdown or carries an explicit scoping note, and remedy text is exercised by a test. Acceptance corpus: the three instances above.
- iss-160The installed plugin surface exposes a spurious /abcd:README command: the harness registers every markdown file under commands/ as a slash command, so the folder's own README.md leaks into the command list. The doc needs a home or form that the command loader ignores.
- iss-161Plugin verbs render as /abcd:abcd:<verb> instead of /abcd:<verb>: the verb files live in commands/abcd/, and the harness maps a commands/ subdirectory to a namespace segment, so the directory name duplicates the plugin prefix. Verbs need to live flat under commands/ (or the subdirectory renamed away from the plugin name) for the documented /abcd:<verb> surface.
- iss-162The surface's own guidance is unreachable under the double namespace: ahoy's next-step output (and the command docs) reference /abcd:ahoy and skill-style args like 'install', but the harness registers the verb as /abcd:abcd:ahoy — following the printed instruction yields 'Unknown command: /abcd:ahoy' / 'Args from unknown skill: install'. The rendered guidance must match the registered command names, whatever iss-161 settles on.
- itd-130`abcd update` completes a chosen update in one verb