Development record
Brief is the current state; no version label, no archive directory
Context
The brief had accumulated three contradictory framings of its own lifecycle:
- Brief = stable, one-time bootstrap.
00-meta.mdframed the brief as "stable conventions...one-time bootstrap document for the v1 plugin"; future work goes through intents. - Brief = living, gets new versions on restructure. The same
00-meta.mdthen defined a versioning scheme: "v3", "v5", "future iterations becomearchive/05/,archive/06/". The brief was on its fifth iteration, witharchive/01/,archive/02/,archive/03/,archive/04/preserved as frozen historical snapshots. - Brief = stable in shape, mutable in some sections. In practice, every shipped spec with a new term mutates
02-constraints/04-naming.md(vocabulary register, hard-enforced via VR001 lint). So the brief was never actually stable — it grew monotonically with every spec.
brief/01-product/04-scope.md already said: "The brief does not get re-versioned for v2. v2 is defined by which intents have shipped." roadmap/README.md reinforced: "the intent registry remains the canonical 'what abcd does' record post-v1." But the archive policy and "v5" framing pulled the other way.
Embark surface (04-surfaces/03-embark.md) clarified the contract: embark seeds a target repo's v1 brief from a lifeboat's amended press release; subsequent ahoy/work iterates on it like any other abcd-managed project's brief. The brief is per-project, evolving, never re-versioned in normal operation.
The version-label scheme was duplicating git log brief/. The archive/<NN>/ directories were storing what git log already knows. The "v5 audit landed 40 fixes" changelog inside brief/README.md was redoing commit messages.
Decision
The brief is the current state of the project. One canonical version. Always reflects today.
- No version label on the brief. No "v5", no "fifth iteration", no
version:field. - No
archive/directory. Historical brief content is recovered viagit log brief/andgit show <commit>:brief/.... - No changelog blobs inside
brief/README.md. Pure delta narration is git's job. Inflection-point rationale (real architectural shifts) lives in ADRs (this directory). File-scoped rationale (why this section reads this way) stays inline in the brief. - History snapshots, when needed, come from disembark.
voyage/disembark/history.jsonl(per adr-35) is the audit chain. /abcd:embarkseeds a new repo's v1 brief from a lifeboat's amended press release. This is the only time a "v1 brief" framing is meaningful — at the moment a new project starts.
Generalises ADR-3 (directory-as-truth-for-lifecycle) to the brief itself: the live brief/ directory IS the brief. No parallel field, no parallel archive, no parallel iteration counter.
Alternatives Considered
- Keep version labels +
archive/<NN>/directories. Rejected: duplicatesgit log. Every iteration's "What changed since vN" section insideREADME.mdis recomputable fromgit log brief/. Storage cost is real (archive 03 alone is 1527 lines verbatim). - Version the brief but drop the
archive/directories (use git tags instead —brief-v3,brief-v5). Rejected: tags help when the brief has discrete release cuts, but the brief evolves continuously per shipped spec (vocabulary register grows on every ship). A version label that ticks every commit is a worse version label. - Split the brief into "stable canvas" and "living register". Rejected (initially considered): would require renaming half the brief's files and confusing readers. The current single-namespace brief works once we admit it's all living state — every section evolves, just at different rates. ADRs catch the inflections; git catches the deltas; brief catches the present.
- Move all historical changelog content to ADRs. Partially adopted: ADR-1 through ADR-4 capture genuine inflections that were buried in
brief/README.mdchangelog blobs. Pure delta narration ("v5 backfilled acceptance criteria for 18 intents") is not moved to ADRs — it's deleted, since git covers it.
Consequences
Gains:
- One brief, always current. New readers don't have to ask "is this the latest?"
brief/00-meta.mdshrinks dramatically — loses archive policy, version-deltas section, "fifth iteration" framing. Keeps numbered folders, padding, kebab-case, brief↔lifeboat shape contract.brief/README.mdshrinks — loses ~120 lines of changelog blobs ("What changed since v3", "v5 continuation"). Keeps navigation + reading guide.- Disembark and embark contracts (per adr-35) become simpler: they read the brief as-is, no version negotiation.
.abcd/development/decisions/adrs/becomes the canonical home for inflection-point rationale across the project.
Costs / obligations:
- The
archive/01/,archive/02/,archive/03/,archive/04/directories must be removed. Pre-removal, content audited: any rationale not already preserved (in current brief files, in ADR-1..4, or ingit log) gets extracted to a new ADR or inline brief section before deletion. brief/00-meta.mdrewritten without archive policy.brief/README.mdpurged of changelog blobs..abcd/development/roadmap/rfcs/README.mdupdated — its "abcd doesn't currently use ADRs" claim no longer holds.- New reserved vocabulary (registered in
02-constraints/04-naming.md): "decision class" (ADR / RFC / intent), and the principle thatarchive/is not used insidebrief/.
Downstream consequences:
- Future intent-driven work that previously would have triggered "v6 changelog" entries instead lands as commits + (when inflection-shaped) a new ADR.
- The "What is the brief's purpose post-v1?" question now has a single answer: the brief IS the project's current state, always. There is no post-v1.
Refined 2026-09-01 (decision log, that date; sequenced as Phase 8): 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.
Frontmatter
| id | adr-5 |
|---|---|
| type | adr |
| status | accepted |
| date | 2026-05-08 |
.abcd/development/decisions/adrs/0005-brief-is-current-state.md
open on GitHub ↗ · commit history ↗
References3
Referenced by6
- adr-1Three-layer mental model (brief / intent / spec)related
- adr-19The plugin version lives ONLY in the released artifact; the working tree stays unversioned, and the version location is chosen by a schema-validated decision, not hard-codedrelated
- adr-30Design-record information architecture — flat artefact-type foldersrelated
- adr-32The issue ledger is working-tier data, not authored recordrelated
- adr-40Review, audit, lint, and gate are four buckets, separated by what each comparesrelated
- 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
mentions22
- adr-34Intent lifecycle and phase scheduling are orthogonal axes
- adr-50Framing traces never enter the record, and automated reviewers never read them
- dcn-26071000000000052026-07-10 — CONTEXT.md goes status-free: it keeps orientation and the
- dcn-26072200000000022026-07-22 — Detector findings are triaged adversarially BEFORE fixing, and
- dcn-26080200000000032026-08-02 — iss-38 (v0.5.0 item D): hand-maintained indexes are either DELETED or GATED, never corrected and left hand-kept, because a corrected list drifts again on the next commit and nobody notices the second time either (adr-5, derive don't store). The ledger named four stale indexes; three were real and one does not hold. (1) `intents/README.md` transcribed four lifecycle directories as ASCII trees and had fallen sixteen drafts, one promotion (itd-73, listed as a draft while living in `planned/`), two disciplines and two superseded intents behind, with a `shipped/` section still calling the directory empty over thirteen shipped intents — deleted, because the enumeration carried nothing the directory does not carry better, and what a filesystem cannot state (the kind taxonomy, the lifecycle contract, the bundle history) stays. (2) `commands/README.md` (fourteen verbs named, eighteen files present) and (3) `internal/README.md` (core described as "identity/version and the read-only status snapshot" while its own later bullets described twenty packages, and `adapter/scanner` filed under planned seams although it ships with its own pattern set, redactor and tests) keep short, high-value enumerations — so those ship WITH the detector rather than as a promise to remember. The new `index_drift` rule holds a marked region (`<!-- index: <id> -->`) to the directory it enumerates in one of two modes: `exact`, where listing and directory must agree both ways, and `absent`, where every listed path must still be missing — the planned-seams shape, whose drift is a seam that shipped. Scoping is an explicit marker plus a configured entry pattern rather than a markdown-list parser: one generic rule, no bespoke parser per README, and unrelated prose beside a list cannot fire it. It fails closed three ways (region gone while the config entry remains; region parsing to zero entries; malformed spec), so half-deleting an index is a finding rather than a silent disarm. (4) The fourth instance — "the repo README Layout omits `skills/` from the plugin surface" — was investigated and does NOT hold: there is no `skills/` directory, abcd ships zero skills deliberately (the three workflows once shaped as skills became commands, closing iss-61; `brief/05-internals/08-skills.md` states it), so the Layout section is correct by omission and was left untouched. Inventing a `skills/` reference to satisfy a finding would have written a falsehood into the record to close a ticket — the same disposition iss-37 reached on its one non-holding instance. CHANGELOG: an entry, unlike iss-34's test-only pass, and impact `additive` rather than `internal` — the rule lives in the shipped lint engine that `abcd docs lint` runs, so any abcd-managed repo gains it by declaring its own pairs in `.abcd/docs-lint.json`.
- dcn-26081600000000032026-08-16 — the assessment vocabulary settled at a maintainer grill and filed as adr-40 (proposed): **four buckets — lint / review / audit / gate — separated by what each compares**, not by determinism, not by trigger. The rule was already half-recorded (05-internals/01-agents.md rules the two verdict families disjoint: "reviews assess a change, criterion verdicts assess a promise vs reality") and three shipped surfaces contradict it — `intent review` emits family 2 so it is an audit, `abcd audit` is deterministic rule-checking so it is a lint (and it consumed the `/abcd:audit` name 02-constraints/04-naming.md reserves for itd-16), and `disembark oracle` emits family 1 while the brief calls its output an audit. Grill rulings: **one surface performs exactly one act** (multi-act surfaces split at design time — cheap, because every multi-act surface abcd has is unbuilt, so they are specified rather than refactored); the buckets are a **closed list extended by PR, not a criterion** (an autonomous run given a criterion interprets it; a table lookup matches or fails); `intent ready` survives as the fourth bucket **gate** because it names a decision rather than a comparison, preserving itd-94's exit-code contract; determinism is orthogonal (itd-16's hash-chain check is a deterministic *audit*; itd-85's conformance check is a *lint* however built); automatic-vs-manual never enters a verb name (the trigger is the facilitator's, per itd-97); the oracle is the model-access seam beneath review and audit, never a bucket. **Clean break, no aliases** — pre-1.0.0, `--impact breaking` drives version derivation (iss-171 precedent), users re-download; an alias would additionally collide with the documentation discipline's ban on change-narration, leaving an undocumented silent forward. The role mapping is the operational reason the split earns its cost: product thinker reads `audit` and essentially nothing else, which makes itd-99's "never hand a product thinker a technical decision" mechanically checkable. Same grill corrected a wrong finding: iss-246 was filed claiming abcd's record documents a surface far larger than the binary with no gate catching it; **false** — the `Status` column in 04-surfaces/README.md is machine-checked by `surface_coverage` (iss-35), the brief carries ~100 inline `design target` markers, and adr-5 makes the brief aspirational by design. The real defect is narrower: `surface_coverage` is blind *inside* a row, so six of twenty rows read `shipped` then qualify themselves in prose, and documents outside the registry cite those sub-verbs as live (all three citing **predecessor-store** spec ids spc-29/spc-30, whose prose survived the migration to the native store). Fix per adr-40 §6: sub-verb tables carrying two facts per verb — bucket and existence — with `surface_coverage` extended to registered cobra sub-commands, one table serving both disciplines. Also established: the twelve-step record walk completes at ten steps; step 2 (`capture promote`) has no verb and step 12 (`capture resolve`) cannot write `resolved_by`, so **walkability is sequenced before coherence** — renaming ~90 files across a process nobody can walk is polish before function. Plan at plans/2026-08-16-process-coherence-and-walkability.md; six intents to plan, none plannable unattended. Rejected: one polymorphic `review <id>` verb (merges the disjoint families, erases the role signal), classifying acts rather than surfaces (makes the bucket a statement of intent rather than a guarantee, and hands product thinkers lint findings), three buckets without `gate` (forces `intent ready` to become `intent lint`), and adding `verify`/`validate` (itd-109's verification suite is a packaging of lints and audits, not a fifth kind).
- dcn-26081600000000042026-08-16 — the v0.5.0 release gate ruled PROMOTE ×2 (the first cut the armed
- dcn-26081600000000082026-08-16 — the v0.5.1 release gate ruled PROMOTE ×2 at content commit
- 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.
- iss-13current-state brief files carry stale status narration (spc-X shipped, today only stubs ship) inside canonical design contracts, against ADR-5.
- iss-38hand-maintained index drift: intents/README.md corpus listings have drifted from the filesystem; commands/README.md lists three of the seven plugin verb files; internal/README.md still describes core as two capabilities with adapter/scanner as a planned seam; the repo README Layout omits skills/ from the plugin surface. Detector (per adr-5 derive-dont-store): hand enumerations of sibling files are generated or deleted — a lint flags a README that enumerates directory contents by hand, or the enumeration is emitted by tooling with a drift test. Acceptance corpus: the four stale indexes above.
- iss-246`surface_coverage` is blind inside a row, so `shipped` means "the top-level verb exists" and every unbuilt sub-verb hides behind it.
- iss-2608220750029988glossary/core/brief.md's frontmatter definition says the brief defines the project before any implementation begins — contradicting adr-5 and the file's own body, which say the brief is the current state revised in place. Its When-to-use section also claims the brief lives at the root of the .abcd/ hierarchy; the path is .abcd/development/brief/.
- iss-2608220750029989The 03-evidence pages 01–03 carry leave-empty-until-disembark placeholder banners — during development, leave empty; populated post-build — contradicting adr-5's always-current doctrine. Open questions exist now and have no recordable home while the banner forbids entries. The resolution should also weigh where a hold-register-shaped record would live (see the hold-route triage seed).
- iss-2608220750029990The brief nowhere states its truth rule: everything in the brief is decided — the only variance a reader must resolve is shipped vs staged, and a staged claim says so. One paragraph in 00-meta.md citing adr-5.
- iss-2608221457227162a superseded Phase-0 pseudo-ADR sits in research/notes/ claiming ADR-01, outside every record gate
- iss-2608301327012166checkRecordJoins does not consult the retired set so one rule gives two answers about one pruned handle
- iss-2610262038235036The brief index says delivery state never lives in brief prose; the surfaces register says 06-delivery, a brief chapter, carries it in detail.
- itd-60When A Surface Ships, The Brief Describes It — Or The Intent Does Not Reach Shipped
- itd-123The Intent Audit Says Audit
- itd-143The brief gains a framing chapter under 01-product/ — the macro-why home: one section holds the project's framing, the why behind the why, and receives the brief-creation interview's committed framing products; the brief-lifeboat mapping gains the matching row so a lifeboat carries framing like any other section
- itd-2609091034175565Before an agent starts on an item, it reserves it on the shared remote, and everyone who works on the project sees the reservation