Development record
`surface_coverage` is blind inside a row, so `shipped` means "the top-level verb exists" and every unbuilt sub-verb hides behind it.
surface_coverage is blind inside a row, so shipped means "the top-level verb exists" and every unbuilt sub-verb hides behind it.
The Status column in .abcd/development/brief/04-surfaces/README.md is machine-checked: the surface_coverage record-lint rule asserts every shipped row has a backing commands/<name>.md or skills/<name>/, every staged row has none, and in reverse that every real surface has a row. That check is correct and it works — at surface granularity. It cannot see sub-verbs.
The consequence is visible in the registry itself: six of twenty rows read shipped and then qualify themselves in prose. /abcd:embark ("the full embark chapter ... remains a design target"), /abcd:launch ("packaging/publishing the artefact remains a design target"), /abcd:intent ("refine / grill / ship / consistency / shape / reclassify ... remain design targets"), /abcd:capture ("promote is a design target"), /abcd ("the richer board ... is a design target"), /abcd:banlist ("the remaining slices"). The partial-ness is honestly recorded and entirely unenforceable, because it lives in prose the lint does not read.
Documents outside the registry then cite those sub-verbs as live, because nothing checks them. Three did so at the time of filing, all now corrected: 02-constraints/04-naming.md called capture promote "live as of spc-30/itd-46"; 05-internals/01-agents.md said "spc-29 ships" both intent consistency and intent shape; the intents/README.md lifecycle diagram presented intent ship, intent reclassify, an intent_lifecycle_hook, and the bundle and discipline paths of intent plan as live steps. Each cites a predecessor-store spec id (spc-29, spc-30): the capability shipped in an older spec store and the prose survived the migration to the native one.
Two defects, one fix. The Status enum is two-valued while reality is three-valued (fully / partly / not at all), and the check does not reach sub-verb granularity. Per adr-40 both close together: each surface file under 04-surfaces/ carries a sub-verb table recording two facts per verb — which bucket it is (lint / review / audit / gate) and whether it exists (shipped / staged) — and surface_coverage extends to check each row against registered cobra sub-commands in both directions. A staged row for capture promote then cannot be called live elsewhere without failing the build.
Supersedes the original text of this entry, which claimed abcd's record documents a surface substantially larger than the binary with no gate catching the drift. That framing was wrong: the marking convention exists (some hundred inline design target, not yet shipped markers), the detector exists (surface_coverage, iss-35), and the brief is aspirational by design per adr-5. The defect is narrower and precisely located.
Frontmatter
| id | iss-246 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | major |
.abcd/work/issues/resolved/iss-246-abcd-s-record-documents-a-surface.md
open on GitHub ↗ · commit history ↗
mentions10
- adr-5Brief is the current state; no version label, no archive directory
- adr-40Review, audit, lint, and gate are four buckets, separated by what each compares
- 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).
- iss-35brief-vs-shipped-surface reconciliation: 05-internals/08-skills.md claims abcd ships zero user-facing skills and six top-level commands while 04-surfaces/README.md itself tables nine and /abcd:consult and /abcd:ingest are shipped; the shipped skills violate the brief criterion that any artefact mutation is a command, not a skill; the skills/ layout described (abcd-ahoy, commit-attribution, secrets-and-pii) is fictional vs the real consult/ and ingest/; the implemented, user-reachable abcd docs lint and abcd history verbs have no home in 04-surfaces at all; the operator-internal paragraph contradicts the commands/ directory that exists. Detector (per spec-moves-with-the-surface): a record-lint cross-check that every entry under commands/ and skills/ resolves to a brief surface row, and every brief surface row resolves to a shipped or explicitly staged surface. Acceptance corpus: each falsified claim above — the check fails on all of them today. Fix amends the criterion or the surface in one change, never silently.
- itd-46`/abcd:intent "<text>"` And `/abcd:capture "<text>"` Become Symmetric Create Paths
- itd-122The Registry Cannot Wave Its Hands
- itd-146abcd's help renders in labelled command groups, and the grouping is gated like every other surface claim
- spc-27the-registry-cannot-wave-its-hands-every-surface-file-carrie
- spc-29the-conformance-check-calls-itself-lint-abcd-audit-becomes-a
- spc-30the-lifeboat-verdict-says-what-it-is-disembark-oracle-become