Development record
The blanket `.abcd/` exclusion claim that iss-43 corrected in the README survives across the record. Recorded rather than fixed there, because the disposition scoped iss-43 to one README line.
The blanket .abcd/ exclusion claim that iss-43 corrected in the README survives across the record. Recorded rather than fixed there, because the disposition scoped iss-43 to one README line.
What is true: the exclusion is implemented but never runs on a release. internal/core/launch/bundle.go:27-31 declares DenyNamespaces — "first-path-segment names that never ship", .abcd among them — as a structural deny no allowlist overrides, and bundle_test.go pins it (TestAbcdNamespaceStructurallyExcluded, TestDefaultDenyNewTopLevel). The wired abcd launch ship does exercise the deny, through the render path rather than the one its name suggests: launch.PrecheckPayload resolves the bundle (internal/core/launch/render.go:192) and launch.RenderPayload goes through it, both reached from internal/surface/cli/ship.go — the precheck under --payload-dir, which guards that call (internal/surface/cli/ship.go:206-208). abcd launch --dry-run exercises it unconditionally on a second path, launch.DryRun resolving the bundle directly (internal/core/launch/dryrun.go:57, from internal/surface/cli/cli.go:112). Separately, launch.Ship — the would-publish stub that "stops HERE and returns WouldPublish=true with NO network call" (internal/core/launch/ship.go:36-41) — has no production caller at all; the only calls are in dryrun_test.go. And .github/workflows/release.yml invokes neither: it builds the four binaries and uploads them with checksums.txt directly. So no release the project has cut has passed through the filter, and two channels carry .abcd/ regardless: a marketplace install takes the repository root (.claude-plugin/marketplace.json, plugin source: "./"), and GitHub attaches an auto-generated source archive to every release, .gitattributes declaring no export-ignore.
The defect is therefore narrower than "the claim is false" and sharper than "the docs are stale": prose written in the present tense describes a mechanism that exists in code but has never run on a release.
Instances — descriptive and orientation documents asserting the claim as present-tense operating fact. Line refs rot; the quotes anchor.
.abcd/work/CONTEXT.md:42— "Single repo, curated release (no dev→public mirror)..abcd/**never ships." Sharpest of the set: CONTEXT.md is the first file a session reads, and a sharp-edges bullet is trusted before anything else is.AGENTS.md:112-113— "Single repo, curated release..abcd/**stays in-tree but is excluded from the release artifact by packaging; the repo is the plugin marketplace.".abcd/README.md:4— "repo (transparent) but is excluded from the release artifact.".abcd/development/README.md:4— "repo (transparent) but excluded from the release artifact"..abcd/development/brief/02-constraints/01-platform.md:9— ".abcd/**stays in-tree but is excluded from the release artifact by packaging — exclusion is a build-time filter over the one tree, not a copy between two repos.".abcd/development/brief/05-internals/03-configuration.md:209— the record row'sCommitted?cell: "committed — excluded from the release artefact by packaging"..abcd/development/roadmap/phases/phase-1-ahoy.md:11— ".abcd/**excluded by packaging so the design record never ships in the" (the sentence continues on the following line).
Exempt, deliberately left (iss-42 and iss-44 precedent — a decision record and a dated snapshot are supposed to say what was decided then, and rewriting them to match today falsifies the record): adr-0028, which ratifies the wording; the dated plans under .abcd/development/plans/; and the bodies of intents under planned/ and shipped/, which specify the mechanism they were written to deliver.
This list is not exhaustive and must not be trusted as one. The implementing round re-enumerates first, over the whole tree, with never ships, excluded from the release, and by packaging — the survey behind this issue already surfaces further candidates in brief/01-product/, brief/04-surfaces/04-launch.md, brief/glossary/distribution/release.md and principles/script-first-mvp.md, unclassified here — and sorts each hit into the descriptive set or the exempt set before touching anything.
Fix direction, one of two, chosen once and applied consistently: wire the existing publish path so the filter runs on a real release, which makes the prose true as written; or reword the descriptive instances to the current gap, on the same channel-truthful pattern the README now carries — what every repository checkout holds against what the released binaries hold — describing the launch bundler as the implemented mechanism it is rather than an operating one. Wiring is feature work with its own design questions and is not assumed here.
Frontmatter
| id | iss-183 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | minor |
.abcd/work/issues/resolved/iss-183-abcd-never-ships-claim-survives-in.md
open on GitHub ↗ · commit history ↗
mentions8
- adr-28One repository, a curated release artifact — no dev→public mirror
- dcn-26080500000000052026-08-05 — iss-43 (v0.5.0 item D): the three-claim corpus is closed as OVERTAKEN rather than fixed — the Status section and the surface list were removed by `73428b6` (2026-07-17, "manual: Revise README with new badges and project details"), a manual revision predating the v0.5.0 plan, so the Phase 0 claim and the native review oracle / spec-task engine / autonomous run claims no longer exist to correct, and re-deriving a corpus against a rewritten document would be inventing findings to justify a ticket. That attribution is itself a correction worth recording: the round first credited the iss-143 tagline commit `48a3524`, which touches ONE README line (the strapline), because it read a SHALLOW clone whose truncation window opened well after 2026-07-17 and therefore could not see the real commit — a truncated history answers a `git log` question confidently and wrongly, and the cheap guard is `git log -S` over the file for the exact removed string, unshallowed first. Two corollaries earned the same way: the corpus's third claim was never `73428b6`'s at all (`git log -S "never shipped"` puts that line in the scaffold commit and in this branch alone), so "all three overtaken" was a second wrong attribution riding on the first; and a whole-phrase probe can miss a claim that was line-wrapped in the original, which is why `"spec/task"` reproduces where `"spec/task engine"` returns nothing. One instance survives, and it is half true rather than false, which is why it needed splitting instead of deleting: the Layout line called `.abcd/` "never shipped", which holds for the released binaries alone (release.yml uploads the four of them and `checksums.txt`, nothing else) and fails everywhere else — `.claude-plugin/marketplace.json` declares `source: "./"`, so a marketplace install takes the whole repository, and GitHub attaches auto-generated source archives to each release, which carry the directory too because `.gitattributes` declares no `export-ignore`. The line now divides on the boundary that is real: every repository checkout against the released binaries, rather than a per-channel split that would have been wrong about the release page. Doc-side deliberately: the marketplace manifest schema has no per-path exclusion, so making "never shipped" true everywhere means building a curated publish path — feature work with its own design questions, not doc repair, and writing the doc to describe a packaging mechanism that does not exist is the phantom-claim failure this item belongs to. The proposed detector (README capability and status claims resolve to wired verbs and to the roadmap) is DROPPED here and re-pointed at iss-181 as a candidate extension of the gate cross-check detector's scope, recorded as a candidate rather than a commitment because it shares that detector's two unsettled scoping questions and a second half-specified scanner would answer neither. The same claim survives across the record — CONTEXT.md's sharp-edges list, AGENTS.md, both `.abcd/` READMEs, `02-constraints/01-platform.md`, `05-internals/03-configuration.md` and `phase-1-ahoy.md`, with adr-0028, the dated plans and the planned/shipped intent bodies exempt as decision and historical records — and it is recorded as iss-183 rather than fixed here, since the disposition scoped this item to one README line. That issue also corrects a claim this round made twice: the exclusion is NOT unimplemented. `internal/core/launch/bundle.go` denies the `.abcd` namespace structurally, with tests, reachable from the wired `abcd launch ship`; it is unwired, because `Ship` stops at `WouldPublish` with no network call and `release.yml` uploads the binaries without ever invoking the verb. "No mechanism exists" and "the mechanism never runs" ask for different fixes, and only the second is true.
- dcn-26080600000000042026-08-06 — iss-183: of the two fix directions the issue offered, REWORD is
- dcn-26081600000000042026-08-16 — the v0.5.0 release gate ruled PROMOTE ×2 (the first cut the armed
- iss-42record orientation currency: CONTEXT.md is stale on the record trust caveat — its single most important orientation fact; phase-shift updates are not a required handoff step so the staleness recurs structurally; record README routing claims point at moved locations; research/ contradicts its own naming convention. Detector: a handoff checklist rule (a phase shift or trust-caveat change requires a CONTEXT.md update in the same change) plus banlist coverage for the moved routing targets. Acceptance corpus: the four instances above.
- iss-43README capability currency. Re-scoped by the 2026-08-05 maintainer disposition to one surviving instance; the original three-claim corpus is closed as filed.
- 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-194Release retention is documented in the present tense but has never run: the newest-per-line policy in brief/04-surfaces/04-launch.md:134 and the release glossary entry describe pruning as operating behaviour, and internal/core/launch/retention.go:30 implements it exactly, but nothing executes it. internal/core/launch/ship.go:41 stops before the network ('the real GitHub Release + SLSA + tag push + retention prune are a later phase'), and .github/workflows/release.yml — which publishes every release this project has actually cut — carries no retention step at all. The brief's own phase note schedules the prune as itd-70, unshipped. Same implemented-but-never-run class as iss-183, and found the same way: by reading the record against the live surface. Live evidence, 2026-08-07: six releases exist; the real preview keeps v0.1.0, v0.2.0, v0.3.0, v0.4.2 and would prune v0.4.0 and v0.4.1, so the repository's own release list contradicts the prose. Scope here is the doc-currency half only — state that the policy is computed and previewable but not yet enforced, on the channel-truthful pattern iss-183 established; wiring the prune is itd-70 and is not assumed by this item. Maintainer disposition (2026-08-07): v0.4.0 and v0.4.1 are deliberately left in place rather than pruned by hand, so itd-70 has a live fixture to exercise on arrival — the first real prune should be the shipped mechanism's, not a manual one. Related observation, possibly separable: internal/core/launch/dryrun.go:126 discards the error from GitExistingTags, so a shallow or tagless checkout yields an empty existing set and the retention preview reports nothing to prune — indistinguishable from a genuine nothing-to-prune. Reproduced in a shallow clone during this investigation before tags were fetched.