Development record
The brief's surface chapters are a generated reflection of the shipped surface, so a shape claim cannot drift
Press Release
Sequenced 2026-09-01 as a delivery rung of Phase 8 — the brief is the shipped state; the phase records the sync rule and its one legitimate lead.
The design record stops being able to lie about the shipped surface. Each surface chapter in the brief carries a generated block — the verb's flags, sub-verbs, exit codes, schema fields and counts, derived from the command tree at build time and drift-tested like the CLI reference already is. The prose around it keeps doing what only prose can: saying why the surface exists, what it refuses to do, and which trade was made. A shape claim can no longer drift, because nobody writes one by hand.
The measurement that prompted this is uncomfortable. A full-tier brief-to-surface crosscheck at the 0.6.2 release gate returned 147 discrepancies across 23 chapters. Of those, exactly one touched a file the release bundle carries. The rest were the record describing a product that had moved: a PATH entry documented as a symlink when it has been an owned copy since spc-35, a user-scope directory tree missing two of the three directories that actually exist, a detection pass enumerating twelve steps where fourteen run.
The same day, the same reviewers found zero discrepancies across the 775 lines of
docs/reference/cli/commands.md. That file is generated and drift-tested. That is the whole argument."I read the brief to learn what the tool does before I touch it," said Maya, an autonomous-development practitioner whose agents read the record the same way. "When a chapter says the PATH entry is a symlink and the binary writes a copy, I do not discover a documentation bug. I write code against a surface that does not exist, and the mistake looks like mine."
"We already knew how to fix this and had done it once," said Kira, who maintains the surface. "The CLI reference is generated, so it is right. The brief is typed, so it rots. We were keeping two copies of the same fact and hand-maintaining the one nobody could check."
Why This Matters
The brief drifts steadily, not in bursts. Of 124 findings resolvable to a blaming commit, 66 were last written in one month and 58 in the next — an even rate, in every class. Roughly half the false claims survived four releases, each of which recorded a PROMOTE receipt against this same detector at 26, 28 and 37 findings.
So the gate has been running and passing while the record got worse. That is the
proxy-gate class (iss-2608230847432286) with a demonstration attached, and the
deterministic half makes it sharper: surface_coverage blocked a commit during
this very release for a missing history drain table row, and passed green
while false prose claims sat beside those rows. Row presence stands in for
chapter correctness.
The diagnosis is that a chapter 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 never worth
hand-writing.
false-claimandstale-countare shape by definition, and mostundocumented-surfaceis the binary growing something a chapter's shape section never learned. - Intent — why a surface exists, what it refuses to do, which trade was made. Not derivable, and structurally unable to drift against code, because it is not a claim about code shape.
Two copies of one fact, one of them authoritative: one-canonical-primitive
violated at two copies rather than three.
Decisions (grilled 2026-09-01)
The maintainer resolved the open questions at the planning interview; these are commitments, not options.
- One generated appendix per chapter. The block sits at the end of the chapter under a marker; the prose above it never states a flag or sub-verb.
- A staged chapter gets an empty block that says unbuilt. Every chapter carries a block; one whose surface has not shipped reads that there is no shipped surface, so the reader learns it from the same place as the flags.
- Flags and sub-verbs only, first. Exit codes and JSON output fields stay prose until the binary records them somewhere a generator can read.
- The external-state category stays out. The two-way split (derivable from the tree, or rationale) holds; a claim about external state is neither and is not this intent's to check.
- Sequenced as Phase 8, the brief is the shipped state, with itd-60 as the other rung; standalone kind, its own spec.
What's In Scope
- One generated appendix per chapter. Each surface chapter carries a single
generated block at its end, under a marker. The block is derived from the same
command tree that already produces
docs/reference/cli/commands.mdand.abcd/development/release/surface.json, and a drift test fails when the committed block and the tree disagree. - Flags and sub-verbs, first. The block carries the verb's flags and its sub-verbs, because those are what the command tree records today. Exit codes and JSON output fields stay prose until the binary records them somewhere a generator can read; the seam is built so admitting them later is a generator change, not a re-cut.
- Every chapter carries a block, including a staged one. A chapter whose surface has not shipped gets an empty block that says so — there is no shipped surface — so a reader learns the surface is unbuilt from the same place they read the flags, rather than from the block's absence.
- A marker that keeps prose hand-written. The generated region is delimited, so a chapter's rationale above the marker is never machine-authored and never clobbered, and the prose above the marker states no flag and no sub-verb.
- The trust rule as an ADR plus a brief invariant: shape claims are derived, never hand-authored.
- Retiring the hand-written shape prose the generated block replaces, chapter by chapter, so the 124 findings are closed by construction rather than by a sweep that starts rotting the next day.
surface_coveragestays, and says what it is. It remains the row-level presence check over the surfaces index, labelled as such, so nothing reads it as a chapter-correctness gate.
What's Out of Scope
- A claim about external state. A third category surfaced while this was
drafted and fits neither half of the split: a claim that is checkable in
principle but has no local source to check against — the worked example is
wrangler.jsoncrecording a dashboard setting with no durable local home, where eight of eight pull requests on 2026-08-23 built through an integration the record says is off. It is the most dangerous of the three shapes, because the plan to change the external state and the assertion that it had changed were written by the same hand in the same file, and it reads as a completed decision rather than as an unchecked claim. Neither generation nor prose reaches it. The two-way split stands for this intent; the category is held by iss-2608231607594913 (refining iss-2608220150157502) and a remedy that reads the real external state is that record's to propose. - A "you changed a surface, so touch its chapter" gate. It forces an edit without forcing correctness, which is a phantom gate — worse than none, and the precise class this intent is an instance of.
- A new principle.
one-canonical-primitivealready says it; this is an application, and the confirmed decomposition records "none new" deliberately. - Generating the rationale. Prose about why is the half that cannot drift and the half worth a human. This intent therefore does not make a hand-maintained behavioural claim safe: ordering guarantees, failure semantics and what a verb refuses stay prose and stay hand-maintained.
- Fixing the 147 by hand ahead of the seam. The corpus is evidence; a hand sweep destroys the dataset and buys a clean brief that drifts again at the measured rate.
Mechanism
Facilitator-seeded from the measurement this intent rests on. The maintainer stated no mechanism claim at the interview; strike this line and the paragraph under it if it is not the claim being made.
We expect this to work because it has already worked here, once, on the same
class of content: docs/reference/cli/commands.md is generated from the command
tree and pinned by TestReferenceMatchesCommittedPage, and it returned zero
discrepancies on the day the hand-written brief returned 147. The mechanism needs
no new infrastructure — the generator, the snapshot and the drift test all exist
and run every CI pass — and a false-claim or stale-count finding about a
generated block in the next crosscheck run is what would show it wrong.
Scope Conditions
None stated.
SOTA
Doc-generation from a command tree is the presumptive answer and is what cobra ecosystems do by default. The adversary-filtered question is not whether to generate but where to cut, because a fully generated chapter loses the rationale that makes the brief worth reading. The cut proposed here — generated shape, hand-written why — is the narrow version, chosen because the measurement says shape is where the drift is.
Acceptance Criteria
- Given a surface chapter with a generated appendix under its marker, when a verb gains a flag or a sub-verb and the appendix is not regenerated, then the drift test fails and names the chapter and the missing claim.
- Given a chapter's hand-written rationale above the marker, when the appendix is regenerated, then nothing above the marker changes.
- Given a chapter whose surface has not shipped, when the generator runs, then the chapter carries an empty block under the same marker stating there is no shipped surface, so the reader learns the surface is unbuilt from where they would have read the flags.
- Given the generated appendix, when it is composed, then it carries the verb's flags and sub-verbs and nothing else — an exit code or a JSON output field stays prose until the binary records it where a generator can read it.
- Given a surface chapter's prose above the marker, when it is checked, then it states no flag and no sub-verb; the shape claims live only in the appendix.
- Given a full-tier brief-to-surface crosscheck run after the seam lands,
when its findings are classified, then no finding is a
false-claimorstale-countabout a flag or a sub-verb the generated appendix covers. - Given
surface_coverage, when it reports, then it names itself as the row-level presence check over the surfaces index and claims nothing about whether a chapter's prose is correct. - Given the crosscheck's non-reproducibility (iss-2608231409595789), when progress is assessed, then it is assessed on which chapters are implicated rather than on a finding count, because the count is not a metric.
Open Questions
Every question below was put to the maintainer at the planning interview on 2026-09-01 and answered there; the answers are the rulings in the Decisions section above. The section is kept so a later reader sees what was asked.
- Resolved — where the seam is. One generated appendix per chapter, at the end, under a marker. Not per section: the per-section cut preserves the most rationale and costs the most machinery, and the appendix keeps the prose hand-written for a fraction of it.
- Resolved — whether the snapshot carries enough. Flags and sub-verbs only, first. Exit codes and JSON output fields are the gaps, and they stay prose until the binary records them somewhere a generator can read, rather than being invented into the snapshot to fill the block.
- Resolved — a chapter documenting a staged surface. It gets an empty block that says there is no shipped surface. Every chapter carries a block, so a reader never has to infer anything from a block's absence.
- Resolved — what happens to
surface_coverage. Left as the row-level check it is, and labelled as that. Leaving it was always defensible; leaving it unlabelled is what let it read as a chapter-correctness gate. - Resolved — the third, external-state category. Recorded as out of scope above. The two-way split stands for this intent, and the category is held by iss-2608231607594913, refining iss-2608220150157502.
Audit Notes
Filed from iss-2608231346137587, whose Routing section carries the four-piece
decomposition confirmed by the maintainer on 2026-08-23 (verdict SPLIT), graded
into the dated decomposition-calibration corpus. Capability here; trust rule to
an ADR plus a brief invariant; stance deliberately none new; plumbing to the
brief.
The evidence base is three full-tier crosscheck runs preserved out-of-tree with
their content commits, manifest hash and tier. Read it with
iss-2608231409595789 in hand: the runs returned 125, 126 and 147, and runs 2
and 3 are a controlled comparison — the brief is byte-identical between their
commits, so the detector's whole subject was held constant and it still returned
17% more findings. Which chapters are implicated is broadly stable; how many and
of what class is not.
Fidelity review — receipt rcp-2769c7a59830 (verifier intent-auditor claude-fable-5-1).
Provenance: intent-auditor@claude-fable-5-1 · rubric_hash sha256:effa65b3e9e88ff29433b443ec2be159522a8b0b71cf1434526514aa61edb13e · prompt_hash sha256:f360a0544725b3e1f3d6e1cd643a8db5c614b5927043c3e33f22721caf04a0db Input attestations: diff:4480c5a8^1..4480c5a8 (PR #671 merge, reachable from e2ab1ddc)@sha256:f5b5a456f7bc0f072a578eb663a9d4c3843ec8ae412aaf0abed0264d0a5a2221;
Acceptance rollup: MET 4 · MET_WITH_CONCERNS 3 · NOT_MET 0 · INCONCLUSIVE 1
Per-criterion verdicts:
- ac-1 — MET: TestSurfaceAppendicesMatchCommandTree regenerates every chapter from the live tree and Drift() names the chapter and each missing line; on a scratch copy of HEAD, adding a
colourflag toversionwithout regenerating failed the test with04-surfaces/12-version.mdandmissing: | --colour | bool |evidence: internal/surface/cli/brief_appendix_test.go:15 — "func TestSurfaceAppendicesMatchCommandTree(t *testing.T)" evidence: internal/core/surface/appendix.go:643 — "the generated appendix disagrees with the command tree" evidence: internal/core/surface/appendix_test.go:199 — "func TestAppendixDriftNamesTheMissingClaim" - ac-2 — MET: RenderChapter returns the bytes above the opening marker unchanged plus the regenerated region, markerLines refuses prose after the end marker, and the idempotence test asserts the prose prefix is byte-identical across two regenerations evidence: internal/core/surface/appendix.go:243 — "func RenderChapter(text, appendix string) (string, error)" evidence: internal/core/surface/appendix_test.go:147 — "func TestRenderChapterPreservesProseAndIsIdempotent"
- ac-3 — MET_WITH_CONCERNS: The staged reflect chapter carries the markers around the declared unbuilt sentence and a test pins the exact text; the concern is that the same sentence is emitted for the three host-delegated commands whose register rows read
shipped(consult, ingest, prepare-this-repo), so a generated block states there is no shipped surface where the register says there is one evidence: .abcd/development/brief/04-surfaces/09-reflect.md:119 — "There is no shipped surface: the command tree registers noabcd reflectverb" evidence: internal/core/surface/appendix.go:71 — "func UnbuiltSentence(path string) string" evidence: .abcd/development/brief/04-surfaces/13-consult.md:144 — "There is no shipped surface: the command tree registers noabcd consultverb" evidence: .abcd/development/brief/04-surfaces/README.md:28 — "| 13 |/abcd:consult| shipped |" - ac-4 — MET: ComposeAppendix is handed paths, flags and sub-verbs only, and the cobra-tree test asserts an exit-code annotation, a JSON schema and an example in a verb's metadata never reach the appendix evidence: internal/core/surface/appendix.go:87 — "func ComposeAppendix(paths []string, tree []Command) string" evidence: internal/surface/cli/brief_appendix_test.go:84 — ""Exit codes:", "3 refused", "schema_version", "widgets.v1"" evidence: internal/core/surface/appendix_test.go:128 — "func TestComposeAppendixCarriesOnlyFlagsAndSubVerbs"
- ac-5 — MET_WITH_CONCERNS: TestSurfaceChapterProseStatesNoShape passes over all 25 chapters and, on a scratch copy, fired at
12-version.md:8when--checkreturned to the prose; two ruled narrowings remain: the## Sub-verbstable above the marker still states sub-verbs by hand (exempt, checked by surface_coverage), and the check fires only on flags the tree registers, so a flag abcd never or no longer registers passes as another program's evidence: internal/surface/cli/brief_appendix_test.go:35 — "func TestSurfaceChapterProseStatesNoShape(t *testing.T)" evidence: internal/core/surface/appendix.go:357 — "if inSubVerbs && (strings.HasPrefix(t, "|") || strings.HasPrefix(t, ">"))" evidence: internal/core/surface/appendix.go:367 — "if s := text[m[4]:m[5]]; longs[s]" evidence: .abcd/development/decisions/adrs/2609231028044006-surface-chapter-shape-claims-are-derived.md:60 — "The chapter's## Sub-verbstable and its standard note are the one exception" - ac-6 — INCONCLUSIVE: No full-tier brief-to-surface crosscheck has run after the seam landed; the delivery records the run as owed at the next release gate and nothing in the diff or the tree classifies post-seam findings, so the outcome cannot be verified from the inputs evidence: .abcd/development/release-gate/README.md:63 — "Owed at the next release gate: itd-147's ac-6." evidence: .abcd/development/research/data/2026-08-23-brief-surface-crosscheck/README.md:110 — "That run is the next release gate's crosscheck."
- ac-7 — MET: Every surface_coverage finding from both the index pass and the sub-verb pass is prefixed with SurfaceCoverageLabel, which names the row-level presence check and disclaims chapter prose, and two tests pin the prefix and the label's wording evidence: internal/core/lint/lint.go:725 — "const SurfaceCoverageLabel = "row-level presence check over the surfaces index and each chapter's sub-verb table (it judges rows, not whether a chapter's prose is correct): "" evidence: internal/core/lint/lint.go:430 — "findings = append(findings, labelSurfaceCoverage(sc)...)" evidence: internal/core/lint/subverbs_test.go:361 — "func TestSubVerbFindingsCarryTheRowLevelLabel"
- ac-8 — MET_WITH_CONCERNS: The research note records the baseline as a per-chapter table across the three runs and states that the stable signal is the set of files rather than the numbers; the concern is that the post-seam assessment itself has not been made, because it depends on the crosscheck run ac-6 still owes evidence: .abcd/development/research/data/2026-08-23-brief-surface-crosscheck/README.md:69 — "## Chapters implicated: the baseline itd-147 is assessed against" evidence: .abcd/development/research/data/2026-08-23-brief-surface-crosscheck/README.md:104 — "Twenty-three files are implicated across the three runs."
Gap audit:
- honoured:
- one generated appendix per chapter, at the end, under a marker pair; all 25 chapter files carry exactly one begin and one end marker evidence: internal/core/surface/appendix.go:40 — "AppendixBegin = "< !-- surface-appendix:begin" evidence: .abcd/development/brief/04-surfaces/12-version.md:73 — "< !-- surface-appendix:begin"
- the appendix is derived from the same command-tree walk that builds the compatibility snapshot, and one generator writes both evidence: internal/surface/cli/brief_appendix.go:17 — "surface.RegenerateChapters(dir, commandSurface(NewRootCommand()))" evidence: cmd/abcd-gen-surface/main.go:60 — "chapters, refused := cli.SurfaceChapters(root)"
- a drift test fails
go testwhen the committed block and the tree disagree, naming the chapter and the claim evidence: internal/surface/cli/brief_appendix_test.go:24 — "if d := ch.Drift(); d != "" {" - the hand-written flag and sub-verb prose was retired chapter by chapter and a check keeps it out evidence: .abcd/development/brief/04-surfaces/12-version.md:8 — "The one exception is the opt-in online check" evidence: internal/surface/cli/brief_appendix_test.go:47 — "for _, c := range surface.ProseShapeClaims(prose, ch.Commands, tree)"
- the trust rule is recorded as an ADR and as brief invariant 18 evidence: .abcd/development/decisions/adrs/2609231028044006-surface-chapter-shape-claims-are-derived.md:38 — "Every shape claim the brief's surface chapters" evidence: .abcd/development/brief/02-constraints/03-invariants.md:49 — "18. Shape claims in the brief's surface chapters are derived, never hand-authored"
- surface_coverage stays and names itself the row-level presence check evidence: internal/core/lint/lint.go:725 — "row-level presence check over the surfaces index" evidence: .abcd/development/brief/04-surfaces/README.md:48 — "the row-level presence check over this index"
- a staged chapter carries an empty block that says there is no shipped surface evidence: .abcd/development/brief/04-surfaces/09-reflect.md:119 — "There is no shipped surface"
- a malformed or unregistered chapter is refused by name and the rest are still regenerated evidence: internal/core/surface/appendix_test.go:362 — "func TestRegenerateChaptersSkipsAndReportsARefusedChapter"
- diverged:
- the unbuilt sentence was promised for a chapter whose surface has not shipped; it is also emitted for the three shipped host-delegated commands, so their generated block contradicts their
shippedregister row evidence: .abcd/development/brief/04-surfaces/13-consult.md:144 — "There is no shipped surface: the command tree registers noabcd consultverb" evidence: .abcd/development/brief/04-surfaces/14-ingest.md:95 — "There is no shipped surface" evidence: .abcd/development/brief/04-surfaces/15-prepare-this-repo.md:153 — "There is no shipped surface" evidence: .abcd/development/brief/04-surfaces/README.md:191 — "They are host-delegated commands, with a command page and no Go verb" - the prose above the marker was promised to state no sub-verb; the
## Sub-verbstable and its note above the marker still state sub-verbs by hand, as a ruled exception checked by surface_coverage evidence: .abcd/development/decisions/adrs/2609231028044006-surface-chapter-shape-claims-are-derived.md:60 — "table and its standard note are the one exception" evidence: internal/core/surface/appendix.go:307 — "The## Sub-verbssection's table and its standard blockquote note are exempt" - the prose check fires only on flags the command tree registers, so a flag spelt in prose that abcd never or no longer registers is treated as another program's and passes
evidence: internal/core/surface/appendix.go:367 — "if s := text[m[4]:m[5]]; longs[s]"
evidence: .abcd/development/decisions/adrs/2609231028044006-surface-chapter-shape-claims-are-derived.md:59 — "Another program's flag (git's
--force) and the same words as" - every chapter carries a block holds for files in 04-surfaces only; the staged worktree surface documented in the internals chapter carries none
evidence: .abcd/development/brief/04-surfaces/README.md:40 — "| 25 |
/abcd:worktree| staged |" evidence: internal/core/surface/appendix.go:521 — "!strings.ContainsAny(lt[1], "/#")"
- the unbuilt sentence was promised for a chapter whose surface has not shipped; it is also emitted for the three shipped host-delegated commands, so their generated block contradicts their
- missing:
- a full-tier crosscheck run after the seam, classified so that no finding is a false-claim or stale-count about a covered flag or sub-verb (ac-6), and the chapter-implicated assessment against it (ac-8) evidence: .abcd/development/release-gate/README.md:63 — "Owed at the next release gate: itd-147's ac-6." evidence: .abcd/development/release-gate/README.md:70 — "Delete this paragraph in the change that records the result."
ac-6 outcome check at the v0.10.0 release gate (2026-09-24)
The first full-tier brief-surface cross-check after the generated appendix
landed ran its 40 pinned checkers over fa744b41 (content commit 64ea8f62,
receipt .abcd/work/reviews/64ea8f62201970b9b242b59d0b7e7aab4c3d5baa/iss35-brief-surface-crosscheck.json).
Of its 154 unique findings, an independent classification found 17 that are a
false-claim or stale-count about the existence, name or set of a flag or
sub-verb of a command the appendix lists. ac-6 is NOT MET: one of the 17
(x-049, captured as iss-2609240519422232) sits in 04-surfaces/14-ingest.md
above the appendix marker, where this intent's rule that the prose states no
flag and no sub-verb applies, and the prose there enumerates ingest sub-verbs
without history ingest. The other 16 sit in 01-product, 02-constraints,
05-internals and the glossary, which carry no appendix, so they are outside
the seam this intent installed; they are deferred with the rest of the brief
drift to iss-2609091956001547. The seam held in 34 of the 35 brief documents
it covers; the drift its press release claims to end persists in the chapters
it does not reach.
ac-6 met by the ingest chapter fix (2026-09-25)
ac-6 is met, against the v0.10.0 classification, by commit 7dafb541, which resolves iss-2609240519422232. The
one finding of the 17 that sat inside the seam (x-049) was the ingest chapter's
prose above its appendix marker enumerating ingest sub-verbs without
history ingest. The fix does not add the missing verb, because this intent's
rule is that the prose there states no sub-verb: the paragraph names none
and defers the list to the generated CLI reference. With it, none of the 17
false-claim or stale-count findings the v0.10.0 classification found sits in a
chapter's prose above an appendix marker. The other 16 stay outside the seam
and deferred to iss-2609091956001547. The next full-tier crosscheck is what
would show this wrong: a false-claim or stale-count about a flag or sub-verb
the appendix covers, found above a marker.
Grounds
- pursued: a shape claim nobody writes by hand cannot drift; a false-claim or stale-count finding about a generated block in the next crosscheck run shows it was wrong
Frontmatter
| id | itd-147 |
|---|---|
| type | intent |
| lifecycle | shipped |
| kind | standalone |
| severity | major |
.abcd/development/intents/shipped/itd-147-the-brief-s-surface-chapters-are-a.md
open on GitHub ↗ · commit history ↗
Referenced by10
- adr-2609231028044006Shape claims in the brief's surface chapters are derived, never hand-authoredrelated
- adr-2610290238168123The brief states the design and why; each command's page states what abcd does, once, and is the copy checked against the coderelated
- iss-2610262031549181itd-147's press release says the generated appendix carries exit codes, schema fields and counts; invariant 18 says flags and sub-verbs only.related
- iss-2610262033108186itd-147 says surface-chapter prose never states a flag; the launch chapter's prose names the `dry-run` flagrelated
- iss-2610262036368072itd-147 says a chapter's prose above the generated appendix never states a flag or sub-verb; the docs chapter's prose states which of its verbs take the configuration and rootrelated
- iss-2610262037477814itd-147 rules that a surface chapter's hand-written prose never states a sub-verb; 27-implement states its sub-verbs above the generated appendix in a table and in proserelated
- iss-2610262041289117itd-147 is sequenced as Phase 8; the phase glossary entry says roadmap phases run 0–7related
- iss-2610262043106501The brief-realisation draft treats the brief as the target design in the present tense; itd-147 sequences the brief as the shipped state.related
- iss-2610262045047151itd-122 gives every surface chapter a hand-kept sub-verb table; itd-147 forbids a chapter's hand-written text from stating any sub-verbrelated
- spc-2609020906356450The brief's surface chapters carry a generated appendix that cannot driftimplemented by
mentions18
- dcn-26090100000000052026-09-01 — The brief is the shipped state, consolidated without a new intent (maintainer). The request "a product thinker must be able to understand the current shipped state of the repository by looking only at the brief" is already adr-5's decision and is delivered by two existing drafts, itd-60 (the doc-fidelity pass that gates spec close on the brief reflecting delivery) and itd-147 (generated surface blocks so a shape claim cannot drift), so no umbrella intent is filed; the drift records from the v0.7.0 receipts link to them and the two exact duplicate pairs close as duplicates. Added to the decision: brief, record and release stay in sync, with one legitimate lead — a brief edited after a release was cut is ahead of that release until the next cut, and the gap closes at the cut rather than between cuts. The work is sequenced as Phase 8, "the brief is the shipped state"; the design branch's unmerged "closed loop" phase takes 9 when it merges. itd-61, the reverse direction, stays adjacent as an open question of the phase.
- dcn-26092300000000042026-09-23 — The proxy-gate class joins enforcement-claims-are-facts as one paragraph, not as a sibling principle (product thinker, ruling on iss-2608230847432286; one-canonical-primitive): a gate that runs and reports green is evidence only for the property it measures over the subjects it measures, so a gate that measures a proxy, or exempts the cases that matter, withdraws vigilance just as a phantom gate does, and an exemption from a gate carries the gate's own burden of proof. Detectors for the class are commissioned and need planning; itd-147 already cites the class. The adjacent sampling case (iss-2608230817034768), an assurance nobody issued but a reader inferred, is NOT admitted, because it would remove the class's boundary.
- dcn-26092400000000032026-09-24 — Release v0.10.0 is cut by autonomous run A, and the run's agenda line is: approve the publish step. Under ruling A2 of the product thinker's run A interview (2026-09-23 07:52Z, "approve the publish step": the product thinker authorises the run to approve the release environment itself once every gate is green), the run approves the `release` environment's deployment of v0.10.0 only after the merge queue, the verify job and every other gate on the tagged commit report green, and stops with a handover instead if any does not. The cut: v0.10.0, impact breaking, 43 records since v0.9.0 (nine shipped intents, thirty-four resolved or declined issues, four of them breaking), content commit 64ea8f62, the composer's payload accepted on the first ingest and recomposed once for two docs-currency findings. Both semantic gates ran at tier full: docs-currency-reviewer (Fable 5.1) with three findings, two fixed and one deferred because the load check's intent stays planned pending the product thinker's ruling on the stray definition (iss-2609231947544298); the brief-surface cross-check (40 pinned checkers, Opus 5.5, four at a time under the run's ceiling) with 154 findings, all deferred to their records: four user-facing ones captured as iss-2609240519413467, iss-2609240519418856, iss-2609240519471816 and iss-2609240519427388, one inside an appendix chapter captured as iss-2609240519422232, which records itd-147's ac-6 as not met, and the design-record drift to the systematic brief pass iss-2609091956001547.
- dcn-26102711123302352026-10-27 — The product thinker ruled on 2026-10-27 that the design brief shows the target design, in the present tense, with a status tag where a part is built, rather than the shipped state. With the ruling that behaviour lives in the command pages, the brief holds the product as aimed for and why, and the command pages hold what abcd does today. This reverses itd-147's currency rule, so a superseding ADR is owed, and the brief's checks are rebuilt around the status overlay.
- iss-2608220150157502Cloudflare non-production branch builds run only the version command, so branch previews repeat the production build instead of building the branch — observed and recorded as comments in wrangler.jsonc. The adr-48 deploy design replaces these with a labelled preview deployed from Actions on push to main and turns Cloudflare's automatic production builds off
- iss-2608230847432286a gate that validates a proxy for a claim switches off the vigilance an absent gate would have preserved
- iss-2608231346137587A full-tier `iss35-brief-surface-crosscheck` at content commit `7a4ee00`
- iss-2608231409595789`.abcd/development/release-gate/manifest.json` describes itself as "the
- iss-2608231607594913Cloudflare Git-integration branch builds run for pull request branches even though wrangler.jsonc records them as disabled, so an unmerged commit reaches a third-party build system before review. wrangler.jsonc carries 'automatic production builds: disabled' and 'automatic branch builds: disabled', kept in-tree because the dashboard setting has no other durable record. On 2026-08-23 a Cloudflare build ran for a pull request branch at 10:00 UTC and the integration bot posted a successful-deployment comment naming the build id. That build was not Actions: .github/workflows/site.yml triggers on workflow_call, workflow_dispatch and push to main only, and it did not run on that commit; the workflow header itself states that the main-push preview replaces the Cloudflare branch builds that ran only the version command. Two consequences. Operationally, every pull request commit is cloned by a third party before merge, and Cloudflare exposes no delete endpoint for a build record or its logs, so whatever reaches a build log cannot be withdrawn without a vendor support request. Durably, the in-tree record is wrong in the confident direction: a reader checking whether branch builds run gets a clear no. Suggested direction: reconcile the dashboard setting with wrangler.jsonc and decide which is authoritative. A maintainer decides; this record reports.
- iss-2609091956001547The iss-35 brief-surface crosscheck does not converge on a clean run. Three
- iss-2609211105010877Two lanes that each add a verb to the same surface conflict by construction: commands/intent.md, the CLI's dispatcher and its test file, docs/reference/cli/commands.md and release/surface.json all took every lane's edit, and every merge of main into a later lane resolved the same files again (lanes A and B on the intent page, B and C on the page and the lifecycle, C and D on the CLI file and the generated pages). Nothing warns a lane when a sibling branch edits the page it is about to edit, and the generated files double the conflict surface. Wanted, as an observation for the implement verb: a lane brief names the sibling branches touching its files (git can answer it at branch time), and the generated surfaces are regenerated on the merged tip rather than merged by hand.
- iss-2609231931006041itd-147 ac-3 (fidelity audit): the generated appendix of the three host-delegated commands says 'There is no shipped surface' while their register rows read shipped. UnbuiltSentence (internal/core/surface/appendix.go) is emitted for any chapter whose command the Go tree does not register, and /abcd:consult, /abcd:ingest and /abcd:prepare-this-repo are shipped host-delegated commands with a command page and no Go verb (04-surfaces/README.md, No skills). The block therefore states a false claim about the surface — the class the intent exists to remove — in 13-consult.md, 14-ingest.md and 15-prepare-this-repo.md. A host-delegated chapter needs its own sentence: shipped as a command page, with no Go verb and so no flags or sub-verbs to list; the generator can tell the cases apart from the register's Status column, which it already parses.
- iss-2609231931064874itd-147 ac-6 and ac-8 (fidelity audit): the intent's outcome check is owed and has no ledger record. The intent shipped by PR #671 with ac-6 (a full-tier brief-to-surface crosscheck after the seam lands classifies to no false-claim or stale-count about a covered flag or sub-verb) and ac-8 (progress assessed on which chapters are implicated) deferred to the next release gate; the only carrier is a paragraph in .abcd/development/release-gate/README.md that asks to be deleted when the result is recorded. Nothing in CI or the release cut asserts it, so a cut that skips the classification leaves the intent's headline outcome unverified with nothing to show it. The fidelity audit recorded ac-6 INCONCLUSIVE and ac-8 MET_WITH_CONCERNS for this reason. Resolve by running the full-tier crosscheck at the next release gate, classifying its findings chapter by chapter against the baseline table in research/data/2026-08-23-brief-surface-crosscheck/README.md, and recording the result with the run's commit in itd-147's Audit Notes.
- iss-2609240519422232The ingest surface chapter's prose above its generated-appendix marker enumerates ingest sub-verbs and omits 'history ingest', the one v0.10.0 crosscheck finding inside a chapter where itd-147's rule (prose above the marker states no flag and no sub-verb) applies; itd-147 ac-6 is therefore not met at fa744b41 (finding x-049).
- iss-2609290448510918The predecessor-store qualifier sweep reaches past the six intents iss-2609261536147903 named: outside drafts/ and those six, 192 citation sites across about forty intents name a spc-N at or below spc-70 that is not the citing intent's own spec, with no '(predecessor store)' on the line. Some are live cross-references (the cold-reading family's intents cite each other's live specs), and some are the predecessor store's (itd-4, itd-6, itd-29, itd-47 and itd-49 describe pre-rebuild work in its terms), so each site needs the same reading against the live spec it collides with; the specs charter's Two spc-N Namespaces section is the rule. Found while sweeping the pattern of iss-2609261536147903 in lane drainDrift3; a census script over intents/{planned,shipped,disciplines} reproduces the count.
- itd-60When A Surface Ships, The Brief Describes It — Or The Intent Does Not Reach Shipped
- spc-35hook-binary-to-persistent-data-dir
- spc-2610100613109045a-person-who-types-abcd-sees-only-the-commands-people-use