Development record
A Capture-Time `decision` Verdict That Routes Infrastructure Choices Into The Existing ADR Store
Operator deviation (thin adoption — recorded)
This intent is scoped to an operator-elected THIN adoption (interview decision; ratified at plan-review r1 of
spc-56-fourth-intent-kind-decision-thinin the predecessor store, a spec the Go rebuild did not carry — the livespc-56is an unrelated record). Two design choices in the original draft (preserved below the line, struck through where superseded) are rejected, and the rejection is recorded here so a future reader does not re-derive the heavy design:
decisionis NOT a fourth persisted intentkind. It is a capture-time classifier VERDICT only. Every persistedkindin the codebase maps to a lifecycle directory and a routing/lint matrix (IL003,IL005,IL006,_PLAN_CANDIDATE_KINDS,reclassify). Adecisionhas no lifecycle directory under thin adoption, so a committedkind: decisionwould be an enum value with no legal home. The schemakindandkind_at_supersessionenums stay three-valued; onlysuggested_kind(the advisory capture hint) and the classifier admitdecision.- NO new
intents/decisions/{active,superseded}/store. This repo already runs a thriving ADR practice (.abcd/development/decisions/adrs/,adr-N-<slug>.md, next-free numbering, a README-defined template, supersession via thestatusfield). Two stores for one artifact class is the Single-Source-of-Truth violation this repo's conventions exist to prevent. Adecisionverdict therefore routes capture to the existing ADR store, not to a new intent lifecycle.To the facilitator it is an ADR; to the product thinker it was just another
/abcd:intent. The captured artefact is anadr-N-<slug>.mdwith the store's## Context/## Decision/## Alternatives Considered/## Consequencesbody — no## Rationalesection (rationale folds into## Context, matching the store convention).
Delivery state (amended 2026-09-26, iss-239). Nothing here is delivered. The thin adoption was ratified against a spec of the predecessor store; the Go binary has no capture-time classifier verdict, no
decisionroute into the ADR store fromabcd intent, and no "decisions are not plannable" refusal — the brief states the same (brief/04-surfaces/05-intent.md, the fourth capture verdict). This draft carries the design for a later plan;abcd decide --adrmints an ADR directly and is not this capture-time route.
Why This Matters
The three-intent-kinds taxonomy (itd-34) covers standalone, bundle-member,
and discipline. It omits a fourth shape the corpus produces in practice:
infrastructure choices that aren't user-facing and aren't rules.
Examples from real projects (these are the classifier's decision-verdict
fixtures):
- "We use Postgres for the audit trail" — not a user moment, not a rule every artefact must clear; a one-time standing choice with consequences.
- "The project is Python 3.12" — same shape.
- "The build system is Bazel, not Make" — same shape.
- "We deploy to Fly.io, not Heroku" — same shape.
None of these fit the existing kinds cleanly:
standaloneforces a press release for a thing with no user moment. The press release reads as fiction.bundle-memberis for intents coupled by shared delivery. A Postgres choice isn't coupled to a user-facing intent in that sense.disciplineis for cross-cutting rules (every X must Y). "We use Postgres" isn't structurally that shape — it's a standing choice, not a rule. There's no per-artefact enforcement, just a standing fact.
In abcd-cli today these decisions fall through three gaps: the brief (meant to stay high-level), individual native specs (the choice leaks in as a side-effect of the feature that needed it), or nowhere at all (genuinely invisible plumbing). The cost: no canonical record; the decision and its rationale are entangled with the code that consumed them — the wrong shape, because code rots and gets refactored while the decision is more stable than any one place that touches it.
The framing trick that resolves this without adding command-surface: what an
industry engineer calls an ADR, a product thinker calls an intent. Both
vocabularies point at the same artefact. The product thinker keeps writing
/abcd:intent "<text>" for every idea; the capture classifier recognises the
standing-choice signature and emits a decision verdict; the system routes the
artefact into the ADR store; the facilitator reads ADRs.
This intent is project-agnostic in the same sense itd-34 is: abcd-cli produces decisions about lint orchestration and Codex wiring; an application project produces decisions about its database, its deployment target, its language version. The verdict generalises.
What's In Scope (thin adoption)
A capture-time decision verdict (not a persisted kind)
- The capture-time kind classifier gains a fourth verdict,
decision, for the no-user-moment / not-a-per-artefact-rule / standing-choice signature. - The verdict is exposed as a CLI primitive,
intent classify-capture-kind, that reads the seed text on stdin and returns a STABLE JSON verdict ({"suggested_kind": "decision"|"standalone"|"bundle-member"|"discipline"}), because theabcd-intent-newskill is wrapper-only and has no Python classifier seam. The skill calls the CLI, then routes. Existing kind suggestions are unchanged (regression fixtures). This is distinct from the Role-3ShapeSuggestionreclassify path. suggested_kind: decisionis accepted by the intent schema;kind: decisionandkind_at_supersession: decisionremain rejected.
Routing a decision verdict to the existing ADR store
- A confirmed
decisionverdict DIVERTS capture: instead ofreserve_and_write_intent(which writesdrafts/itd-N-*.md), capture writesadr-<next-free>-<slug>.mdinto.abcd/development/decisions/adrs/, matching the store's README template EXACTLY — frontmatter (id, slug, status, date, supersedes, superseded_by, related_intents, related_rfcs, related_adrs) plus body## Context/## Decision/## Alternatives Considered/## Consequences. No## Rationale; no## Press Release; no## Acceptance Criteria. - Because a false-positive
decisionwould silently write an ADR instead of an intent draft, capture CONFIRMS: on adecisionverdict the operator confirms "capture as an ADR?" or OVERRIDES to a normal intent draft. On override the draft persists a PLANNABLEsuggested_kind(null, orstandaloneif the operator picks one) — neverdecision(an unplannable value, refused by the plan/reclassify guard). decisionis therefore NEVER written to the schemakindorkind_at_supersession, NEVER enters thedrafts/→planned/→shipped/lifecycle, NEVER gets a native spec, and is referenced downstream asadr-N(which the predecessor store's spc-48 RC linkage lint, matching onlyitd-Ntokens, ignored).
Plan/reclassify refusal guard
_choose_candidate_kindreadssuggested_kindbut only routes values in_PLAN_CANDIDATE_KINDS; an unknown value (incl.decision) would fall through to the interactive prompt and could plan asuggested_kind: decisiondraft asstandalone.plan_single/reclassifytherefore gain an EXPLICIT refusal: adecisioncandidate (via--kind decision,suggested_kind: decision, orreclassify --kind decision) raises "route this to ADR capture; decisions are not plannable"._PLAN_CANDIDATE_KINDSstays three-valued.
What's Out Of Scope
- A new
intents/decisions/store and itsactive//superseded/lifecycle. Rejected (operator deviation above) — the existing flatadrs/+ supersession-via-statusis the convention. - A persisted
kind: decision. Rejected —decisionis a verdict, never a committed kind. - Per-domain decision templates (database/deployment/language-specific fields). The abcd-framework shape is structurally identical across domains; per-domain templates belong to the project that needs them.
- Automated decision detection from code (inferring "uses Postgres" from
pyproject.toml). A separate follow-up intent. - Decision-aware code review (catching a PR that violates a standing decision). Belongs with the disciplines machinery, not here.
- Migrating existing scattered plumbing (Python 3.12, flow-next, the lint orchestrator, the Codex backend) into the ADR store. A separate downstream task.
- Planner-context pull of active decisions / a decisions fidelity reviewer. The original draft's load-bearing "pull active decisions into the planner" claim rode on itd-39 (scope-aware memory retrieval); under thin adoption the artefact is an ADR the facilitator reads directly, and the pull-into-planner mechanism is deferred to itd-39's substrate, not built here.
SOTA
Surveyed on 2026-10-23; sources, evidence tiers and the local fit risks are in the traceability-governance SOTA note.
- The thing the verdict detects has a field definition. An architectural decision is "a justified design choice that addresses a functional or non-functional requirement that is architecturally significant", and an architecturally significant requirement one with "a measurable effect on the architecture and quality" of the system (adr.github.io; MADR, which adds that "architecture" is not to be read too strictly). A standing choice that answers a requirement without being a user moment is the signature.
- The local bar is stricter than the field's. Nygard's significance is structure, quality attributes, external dependencies, interfaces and construction techniques; this repository's ADR README demands hard to reverse, surprising without context and a real trade-off. The verdict should carry the local test, or "we use library X" fills the store.
- Store semantics the thin adoption already matches: one record per decision, status-field supersession (Nygard; MADR's "superseded by ADR-0123"; adr-tools'
adr new -s N), immutability after acceptance (log4brains: "an ADR is immutable. Only its status can change"). - Models are measured on generation, not on this verdict. GPT-4 zero-shot generates "relevant and accurate Design Decisions" from an ADR's Context but "fall[s] short of human-level performance" (Dhar, Vaidhyanathan and Varma, ICSA 2024); a 2026 benchmark of ten small models finds robust zero-shot ADR generation above about 3B parameters and that semantic diversity "often correlates with hallucination". No published figure covers classifying a one-line idea as decision versus capability; the fixture set and the confirm step are load-bearing.
- MADR's optional "Confirmation" section (how compliance with the decision is checked) is where the out-of-scope decision-aware review would later attach.
- Two details in the body above are stale, left unedited: the store now mints
adr-<yymmddHHMMSS><rrrr>through adr-45's allocator, not a next-free ordinal, andabcd decide --adralready writes the README-exact skeleton, so the verdict's writer is that call rather than a second template. - Path 1 for the artefact, Path 2 for the verdict: the existing ADR store with Nygard/MADR semantics, as ruled; a host-run classification proposed against the repository's three-part test, fixture-tested, recorded by the binary rather than computed by it, with the confirm question widened to the four homes an idea can have (ADR, intent draft, issue, drop) and one mint and one skeleton writer shared with
decide --adr.
The independent fit-challenge runs at plan time.
Acceptance Criteria
The original draft's full-store acceptance criteria are superseded-by-decision
(the thin-adoption operator deviation recorded above). They are struck through in
the preserved draft below the line and are NOT requirements of any spec. The
thin-adoption criteria were written as R1–R5 of
spc-56-fourth-intent-kind-decision-thin in the predecessor store; the live spec
store holds no spec for this intent (spec_id: null), so the criteria below are
this draft's own, in summary:
- Given a product thinker records a standing choice, when they run
/abcd:intent "we use Postgres for the audit trail", then the capture classifier emits adecisionverdict, the operator confirms, and the system writes anadr-N-<slug>.mdinto the existing ADR store (README-exact template) — no intent draft, no spec, nointents/decisions/directory. - Given a false-positive
decisionverdict, when the operator OVERRIDES, then a normal intent draft is written carrying a PLANNABLEsuggested_kind(neverdecision), and it routes cleanly throughplan_single. - Given a
decisioncandidate reachesplan_single/reclassify(via--kind decision,suggested_kind: decision, orreclassify --kind decision), then it is REFUSED with "decisions are not plannable";_PLAN_CANDIDATE_KINDSstays three-valued. - Given the schema, then
suggested_kind: decisionvalidates whilekind: decisionandkind_at_supersession: decisionare rejected.
Related
- itd-34 (three-intent-kinds) — this intent extends the capture taxonomy
with a fourth CAPTURE-VERDICT value; the persisted three-
kindenum is unchanged.adr-2-three-intent-kindsis the ADR that records itd-34. .abcd/development/decisions/adrs/README.md— the store template, filename convention (adr-N-<slug>.md), andstatus-field supersession the ADR writer matches.- itd-39 (scope-aware memory retrieval) — the deferred substrate for pulling active decisions into planner context (out of scope here).
- a dated working-log entry (2026-05-22) — the discussion that produced this intent.
.abcd/logbook/grill/20260522T192535Z-itd-44/— first grill pass (lite mode); recommends re-grilling against the thin scope (this body rewrite is its prerequisite).
Superseded draft (full-store design — REJECTED, preserved for the record)
The sections below were the original draft's full-store proposal. They are superseded-by-decision under the thin-adoption operator deviation recorded at the top of this file:
decisionis NOT a persisted kind, and NOintents/decisions/store is created. Preserved so the rejected design and its rationale are not silently lost.
~~A fourth intent kind: decision~~ (superseded)
- ~~Frontmatter
kind: decision, set at plan time, suggested by the classifier at capture time.~~ - ~~Body shape:
## Decision+## Rationale+## Alternatives Considered+ (optional)## Consequences. No## Press Release. No## Acceptance Criteria.~~ - ~~Lives in
intents/decisions/with two sub-states encoded by directory:decisions/active/anddecisions/superseded/. Nodrafts/ → planned/ → shipped/lifecycle.~~ - ~~Never gets a flow-next spec. Like disciplines, decisions register by living in their directory and are referenced by other intents/specs.~~
~~Capture and classification~~ (superseded by the classifier-verdict + ADR-route design above)
- ~~
/abcd:intent plan <itd-N>acceptsdecisionas a valid kind selection; routes to the decision-specific lifecycle (no flow-next call, file moves todecisions/active/).~~ - ~~
/abcd:intent reclassify <itd-N> --kind decisionworks the same way it does for the other kinds; supersession via--kind superseded --by <itd-M>.~~
~~Discoverability at plan time~~ (superseded — deferred to itd-39)
- ~~Active decisions are pulled forward into the planner's context when planning any new feature.~~
- ~~A
decisions/index.md(auto-generated) lists active decisions.~~
~~Audit / fidelity~~ (superseded — no decision-kind intent files exist to audit)
- ~~The
intent-fidelity-revieweragent (spc-12, predecessor store) gets a Role 1 variant for decisions, with per-decision verdicts (IMPLEMENTED/IMPLEMENTED_WITH_DRIFT/NOT_IMPLEMENTED/INCONCLUSIVE).~~
~~Original full-store Acceptance Criteria~~ (superseded-by-decision)
- ~~Given the product thinker has an infrastructure choice to record, when they run
/abcd:intent "we use Postgres for the audit trail", then the classifier writessuggested_kind: decisionto the new file's frontmatter and the system asks them for rationale and alternatives at plan time.~~ - ~~Given an intent with
kind: decisionis indecisions/active/, when the facilitator plans a spec that touches the audit layer, then the active decision is included in the planner's context.~~ - ~~Given an active decision is being replaced, when the user runs
/abcd:intent reclassify <itd-N> --kind superseded --by <itd-M>, then the file moves todecisions/superseded/.~~ - ~~Given a shipped spec referenced an active decision, when
intent-fidelity-reviewerruns, then per-decision verdicts are written into the decision's## Audit Notessection.~~ - ~~Given a product thinker is browsing
/abcd:intentbare output, when the corpus contains active decisions, then decisions appear as a distinct group alongside drafts / planned / shipped / disciplines / superseded.~~
Frontmatter
| id | itd-44 |
|---|---|
| type | intent |
| lifecycle | drafts |
| severity | minor |
.abcd/development/intents/drafts/itd-44-fourth-intent-kind-decision.md
open on GitHub ↗ · commit history ↗
References2
Referenced by16
- iss-2610262031430108Invariant 11 forbids minting ids from the current maximum, but itd-44 has capture write `adr-<next-free>-<slug>.md`.related
- iss-2610262031445176Dependencies say abcd is a single Go binary and that flow-next is neither a dependency nor built, but itd-44 treats Python 3.12 and flow-next as existing plumbing.related
- iss-2610262034181775itd-44 says the planner's `_choose_candidate_kind` reads `suggested_kind`; the intent chapter says no shipped code reads that field and planning never consults it.related
- iss-2610262034191519itd-44 writes the diverted ADR as `adr-<next-free>-<slug>.md`; the intent chapter names the same ADR-store file `NNNN-<slug>.md`, zero-padded.related
- iss-2610262036171679itd-44 has capture write an ADR as adr-< next-free>-< slug>.md; the decide chapter mints ADR ids from a timestamp that reads no maximum, and names the file < stamp>-< slug>.md.related
- iss-2610262036186092The decide chapter makes abcd decide with the ADR flag the ADR store's minting verb, with embark counting only as a restore; itd-44 adds capture as a second path that writes new ADRs into the store.related
- iss-2610262037334466itd-44 files ADRs as adr-< next-free>-< slug>.md; the drain brief cites the store's ADRs as < timestamp id>-< slug>.mdrelated
- iss-2610262039106613itd-44 routes through an `abcd-intent-new` skill, but the surfaces register says abcd ships zero skillsrelated
- iss-2610262041183220The decision-verdict draft routes through an `abcd-intent-new` skill; the skills chapter says abcd ships zero skills.related
- iss-2610262041199183The decision-verdict draft adds a fourth verdict to the capture-time kind classifier; the verification matrix stages that classifier as unbuilt.related
- iss-2610262042486043itd-142 states abcd ships zero skills; itd-44 routes capture through an abcd-intent-new skillrelated
- iss-2610262044038958itd-44 writes ADRs under a next-free ordinal; itd-114 makes every minted id collision-proof across branchesrelated
- iss-2610262044186274The decision-verdict draft routes capture through an abcd-intent-new skill, but abcd ships zero skillsrelated
- iss-2610262044191365Two routes mint an ADR: the draft's capture writes adr-< next-free>, and the shipped decide verb mints ADRs with --adrrelated
- iss-2610262044540397itd-44 puts its refusal for the decision kind into a Python plan path (`_choose_candidate_kind`, `plan_single`); in shipped itd-80, planning is the native `abcd intent plan` verbrelated
- itd-50The Audit Loop Drives An Intent To Acceptance — Or Calls For A Replanbuilt on by
mentions11
- adr-2Three intent kinds (standalone / bundle-member / discipline)
- adr-45Record ids are timestamp-numeric, capture-stable, and never allocated by looking at the maximum
- iss-239Dangling pre-rebuild spec ids in the draft corpus: itd-44 (spc-56), itd-51 (spc-33/37), itd-57 (spc-48/60/62), itd-61 (spc-75) cite specs from the numbering adr-21/adr-26 reset (live store is spc-1..spc-22). Worse, intents/README.md and itd-34 assert the itd-44 lineage 'landed as itd-44 (spc-56 thin adoption)' — no such spec or decision-verdict code exists, so the record claims a delivery the tree cannot back.
- iss-261025221518995403-mental-model.md:72-81 describes in the present tense an LLM suggested_kind classifier, an intent classify-capture-kind verdict (itd-44, a draft) and a discipline_kind field with a gate registry under .abcd/disciplines/. The create path writes suggested_kind: null (internal/core/intent/create.go:471), no code reads discipline_kind, and .abcd/disciplines/ does not exist.
- iss-2610262030324496The mental model describes the capture-kind classifier as operating; the naming register marks it staged with no classifier sub-verb registered
- iss-2610262030424329The mental model presents a capture-time classifier that emits the decision verdict; the intent chapter says nothing of it exists or reads the field
- iss-261026203120918203-mental-model describes the itd-44 capture-time classifier as running; 03-out-of-scope lists itd-44 as an uncommitted draft.
- iss-261026203323929105-intent gives ADR files as zero-padded NNNN-< slug>.md, but 24-decide mints adr-< yymmddHHMMSS>< rrrr> ids with stamp-named files.
- spc-12disembark-grounds-a-lifeboat-s-open-questions-on-a-repo-s-to
- spc-48scanner-adjacency-galloping-probe-structural-fix
- spc-56Origin and production-mode keys, stamped by the command