Development record
A full-tier `iss35-brief-surface-crosscheck` at content commit `7a4ee00`
A full-tier iss35-brief-surface-crosscheck at content commit 7a4ee00
returned 125 discrepancies: 58 false-claim, 38 undocumented-surface, 15
stale-count, 7 criterion-violation, 7 fictional-layout. Exactly one points at a
file the release bundle carries (commands/memory.md, fixed in this cut); the
other 124 are .abcd/development/brief/, which ships in no release (adr-28), so
no installer is misled. Contributors reading the record are.
The class counts above are one run's observation, not a measurement. A second full-tier run hours later, on a tree differing only by seven shipped-doc fixes, returned 126 findings with false-claim at 48 and undocumented-surface at 50 — the same chapters, redistributed. See iss-2608231409595789. What is reproducible is WHICH chapters drift (29 of 33 files common to both runs); the counts and classes are not. Scope the intent on the stable half.
The corpus is preserved at
.abcd/.work.local/scratch/brief-drift-2026-08-23/crosscheck-findings.json with
the run's content commit, manifest hash and tier. It earns promotion to a dated
research note when the intent below is filed. Do not fix the 124 by hand
before mining it — the whole value of this run is that it is evidence.
What the corpus already says
124 of 125 findings resolve to a blaming commit via git blame on their
file:line. The dates are the finding: 66 of them were last written in
2026-07 and 58 in 2026-08 — evenly spread, in every class. So this is not one bad merge that outran its
record; it is a steady rate. Roughly half the false claims were written in July
and survived four releases — v0.4.2, v0.5.1, v0.6.0, v0.6.1 — each of which
recorded a PROMOTE receipt against this same detector, at 26, 28 and 37 findings
respectively.
That is the real defect, and it is the proxy-gate class again
(iss-2608230847432286): the gate ran, reported, went green, and the thing it
measures got steadily worse. receipt_gate never coupled the verdict to the
finding count, and surface_coverage — the deterministic half — checks that a
registered sub-verb has a ROW in the chapter's table, never that the prose
beside the row is true. It blocked a commit today for a missing history drain
row while 124 false prose claims sat green beside it.
Diagnosis
The brief mixes two kinds of content with two different failure modes in the same paragraphs:
- Shape — flags, sub-verbs, exit codes, schema fields, counts, file layouts.
Derivable from the command tree, therefore checkable, therefore should never
be hand-written.
false-claimandstale-countare shape by definition, and mostundocumented-surfaceis the binary growing something the chapter's shape section never learned. - Intent — why a surface exists, what it refuses to do, which trade was made. Not derivable, and cannot drift against code, because it is not a claim about code shape.
The comparison that makes it concrete, from the same repo on the same day:
docs/reference/cli/commands.md is generated and drift-tested, and the same
reviewers found ZERO discrepancies across its 775 lines. The brief is
hand-written prose and returned 124. The brief holds a second, hand-maintained
copy of a fact the command tree already owns — one-canonical-primitive
violated at two copies rather than three.
Direction, not yet decided
Generate or deterministically check the shape; let the prose carry only the why. A chapter becomes a generated shape block plus hand-written rationale, and the shape then cannot drift.
Explicitly rejected: a "you changed a surface, so touch its brief chapter" gate. It forces an edit without forcing correctness, which is a phantom gate — the exact class this issue is an instance of.
Routing
This warrants an intent, and the maintainer has said so. The four-piece split below was hand-run and confirmed by the maintainer on 2026-08-23, with the intent to be filed after the 0.6.2 cut — so the next session files from this routing rather than re-running the interview:
- capability -> intent: the brief's surface chapters become a generated reflection of the shipped surface;
- trust rule -> ADR + brief invariant: shape claims are derived, never hand-authored;
- stance -> principle: none new,
one-canonical-primitivealready says it; - plumbing -> brief: the generation mechanism and where the seam sits.
Verdict: SPLIT, confirmed. Open questions the corpus should answer first: did the surface change and the brief change land in the same commit (the hypothesis that locates the seam); which chapters drift fastest normalised by surface churn; and how many releases each false claim survived.
Grounds
- pursued: a shape claim nobody writes by hand cannot drift; a false-claim or stale-count finding about a flag or sub-verb a generated appendix covers, in the next full-tier crosscheck, would show it wrong
Frontmatter
| id | iss-2608231346137587 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | major |
.abcd/work/issues/resolved/iss-2608231346137587-brief-surface-chapters-drift-steadily.md
open on GitHub ↗ · commit history ↗
mentions9
- adr-28One repository, a curated release artifact — no dev→public mirror
- adr-2609231028044006Shape claims in the brief's surface chapters are derived, never hand-authored
- dcn-26082600000000052026-08-26 — Bug-hunt round 8 (bughunt-b): baseline green after unshallowing
- dcn-26082600000000062026-08-26 — Bug-hunt round 9 (bughunt-a): baseline green after unshallowing
- dcn-26082900000000012026-08-29 — v0.6.8 semantic gates: two maintainer judgements recorded so they are not re-litigated. (a) The iss35 cross-check was RE-RUN against the final content commit (00f1509d) rather than accepting an earlier full-tier run whose tree was amended in flight: a receipt attests one sha and the earlier run could not honestly name one; at ~13 minutes wall and ~1.7M tokens a re-run is cheaper than the ambiguity. (b) PROMOTE with a disposition on every finding (60, all independently re-verified, 0 refuted) rather than HOLD: the findings are the design brief lagging the shipped surface (iss-2608231346137587, whose corpus rule forbids hand-fixing ahead of the mining intent), not something the release introduced or ships, and a HOLD would block a correct changelog behind debt the record already owns. Also noted: the local_username payload rule collides with product vocabulary on a machine whose account name is a common word (iss-2608291444328326); the release push used a HOME symlink alias so the pre-push preflight could run in full, never --no-verify, and CI re-ran every gate under its own account.
- iss-2608230847432286a gate that validates a proxy for a claim switches off the vigilance an absent gate would have preserved
- iss-2608231409595789`.abcd/development/release-gate/manifest.json` describes itself as "the
- iss-2608250743421381two slash-command argument-hints advertise sub-verbs the binary refuses, in the one string a user reads before invoking. commands/ahoy.md:4 offers '[status | install | uninstall | doctor | dry-run]': 'abcd ahoy status' exits 2 with unknown command — bare 'abcd ahoy' is the status render — and the real sub-verb identity-check is absent from the hint. commands/launch.md:4 offers '[dry-run | ship | scaffold]': dry-run is a FLAG, so 'abcd launch dry-run' exits 2 while 'abcd launch --dry-run' exits 0; the binary registers only scaffold and ship. Both files' own bodies get it right, so the drift is confined to the frontmatter hint, which is exactly the part no prose reader checks and the part the harness surfaces first. The brief does NOT get it right: 04-surfaces/01-ahoy.md's dispatch sentence carries the same phantom status token, which is brief-tier and tracked under iss-2608231346137587. A first attempt at this fix ALSO added identity-check to the ahoy hint, which is wrong in the other direction: that verb is deliberately CLI-only, the command page carries a scoping note saying it stays a bare-CLI entrypoint rather than a plugin sub-verb, and the page carries a flow section for every other hinted token and none for it. The plugin dispatch set is install, uninstall, doctor and dry-run. This is a shipped surface, not record drift: commands/ is carried in the release bundle, so the adr-28 disposition that covers brief-tier findings does not apply. Found by the iss-35 crosscheck's plugin-command-surface probe at the v0.6.6 gate; the docs-currency pass had not flagged it across three runs, because its scope reads command prose rather than frontmatter.
- itd-147The brief's surface chapters are a generated reflection of the shipped surface, so a shape claim cannot drift