Development record
Three-layer mental model (brief / intent / spec)
Terminology note. The how layer is named the spec. This ADR's title and body were updated by the spec-terminology-rename ADR (adr-11), which records the rename decision and its rationale.
Context
Early iterations of abcd's documentation conflated three distinct kinds of question into one corpus: what is this project? (canvas), why does this user-facing change matter? (forward-looking justification), and how do we build this concrete thing? (engineering plan). The original brief tried to hold all three at once, which made it large, hard to reorder, and impossible to ship in chunks. Scope creep entered through the engineering door because there was no surface that disciplined product clarity before engineering scope.
Plumbing work (adapters, agents, harness, hooks) had no natural home. Forcing press-release format on plumbing produced strained or mistargeted prose; treating plumbing as silent infrastructure left no acceptance gate for it.
Decision
abcd organises development work in three layers, each tuned to the kind of question it answers:
- Brief — the what. Shared canvas; covers user-facing scope AND plumbing infrastructure. Read by anyone needing to understand the project as a whole.
- Intent — the why (user-facing). Press-release-shaped (Amazon working-backwards), with persona quote, scope, and Given-When-Then acceptance criteria. Lives as standalone documents so it can be reordered, bundled, deferred, or killed without disturbing the brief or each other.
- Spec — the how. A native minimal spec store — specs and tasks are directories whose location encodes status, over a dependency graph — with the companion harness
ccpmas the primary deeper backend (adr-26). Plan-reviewed before work; completion-reviewed after. Traces back to either an intent (user-facing) or a brief phase (plumbing) or a discipline (cross-cutting rule).
Acceptance discipline applies uniformly across both surfaces (intent and brief-phase), in Given-When-Then format. The intent-fidelity-reviewer agent compares delivered reality against intent acceptance; phase audit compares reality against brief-phase acceptance. The format is uniform; the home differs to match the nature of the work.
Alternatives Considered
- Single unified "spec" surface (one document type for all work). Rejected: forces press-release format on plumbing (mistargeted) and forces engineering-shape on user-facing capability (kills product clarity). The friction is load-bearing — different jobs need different shapes.
- Brief + intent only (no separate spec layer). Rejected: specs are how-to-build artefacts; mixing them with why-it-matters intents collapses the press-release discipline. The native spec layer (adr-26) provides a clean engineering surface; folding it into intents would duplicate.
- Intent + spec only (no brief). Rejected: plumbing has no user moment to press-release. Without a brief, plumbing would either become silent (no acceptance gate) or be forced into intent shape (mistargeted prose). The brief carries the project-as-a-whole canvas that neither intent nor spec can hold.
Consequences
Gains:
- Product-thinking is disciplined before engineering scope (intent's press-release format is the gate).
- Plumbing has a home with a uniform acceptance format (brief phases).
- Intents can be reordered/bundled/killed without rewriting the brief.
- The
intent-fidelity-revieweragent has a single audit shape to apply across two surfaces.
Costs / obligations:
- Three surfaces means three places to look — discoverability cost on first read. Mitigated by the reading guide in
brief/README.md. - Bidirectional links (intent ↔ spec, ADR ↔ intent) require lint enforcement (
internal/core/lint). - Cross-document fidelity becomes a real audit category (codes
XD001–XD007); without it, drift between brief and intents goes undetected.
Downstream decisions enabled:
- ADR-2 (three intent kinds) — once the brief/intent/spec split exists, intents can have distinct shapes (standalone/bundle/discipline).
- ADR-35 (lifeboat as coverage experiment; supersedes adr-4) — disembark snapshots the brief; the layer model defines what gets snapshotted.
- ADR-5 (brief is current state) — once the brief is the canvas (not a versioned artefact), git covers history and intents cover forward-looking work.
Frontmatter
| id | adr-1 |
|---|---|
| type | adr |
| status | accepted |
| date | 2026-05-04 |
.abcd/development/decisions/adrs/0001-three-layer-mental-model.md
open on GitHub ↗ · commit history ↗
References6
- adr-2Three intent kinds (standalone / bundle-member / discipline)related
- adr-5Brief is the current state; no version label, no archive directoryrelated
- adr-9Phase as a product-reflection layer between brief and intentrelated
- adr-11One canonical word for a specced block of work — specrelated
- adr-26A native minimal spec layer with the companion harness `ccpm` as the primary deeper backendrelated
- adr-35The lifeboat is a coverage experiment — read-only, out-of-tree, and proven before it is packed (supersedes adr-4)related
Referenced by1
- adr-2609212115255771Phases and milestones are retired: sequencing is dependencies rendered as status, the checkpoint is the derived releaserelated
mentions5
- iss-2608221457227162a superseded Phase-0 pseudo-ADR sits in research/notes/ claiming ADR-01, outside every record gate
- iss-2608230847432286a gate that validates a proxy for a claim switches off the vigilance an absent gate would have preserved
- iss-2608301308367566record_stores values are not containment-checked so a committed config walks the record gate outside the repository
- iss-2610040732240935Record pages scroll sideways at 360 px whenever a record's title or source path holds a long unbroken token, and the overflow audit cannot see it. Every ADR minted with a timestamp id shows its source path, .abcd/development/decisions/adrs/<16 digits>-<slug>.md, as one mono span in the side panel's reclinks paragraph, and the run up to the first hyphen is about fifty characters with no break opportunity: /record/adr/adr-2609091248200336/ measures scrollWidth 374 at 360 px. adr-2610031751065746 and adr-2610031751066232 also carry a home-relative path in their titles, which overflows the record page's h1 (scrollWidth 455). The stylesheet sets no overflow-wrap on body, the title or reclinks, so a block whose text has nowhere to break widens the page. The site-screenshots audit samples only the lowest-numbered record of each type (adr-1, itd-1, iss-1), whose paths and titles are short, so these pages have overflowed since timestamp ADRs began without the job noticing.
- itd-6RepoPrompt over MCP is one opt-in reviewer route, beside the host's own agents