Development record
An intent that is not planned cannot be implemented: abcd gains a machine-checkable implement-readiness gate that refuses with a remedy and offers the planning interview
Press Release
You ask your agent to implement itd-93. Instead of improvising against a draft
whose acceptance criteria nobody confirmed, it runs abcd intent ready itd-93,
reads the NOT READY verdict, and tells you plainly: "itd-93 is not specced, so
it cannot be implemented yet — want to plan it together?" The interview that
follows is yours: you confirm the press release, resolve the open questions,
and accept, edit, or strike every acceptance criterion. Only then does the
agent run abcd intent plan — your sign-off act — and the minted spec becomes
the design record it builds against. Autonomous drain runs get the same gate
for free: exit 1 is a journaled SKIP, never a guess.
Why This Matters
Today "is this intent ready to implement" is re-derived from prose by every run (the drain-run skip filter) and by every human conversation. iss-83 already records the failure mode: a missing plan precondition invites the agent to synthesize one, re-introducing the guess-the-gate risk that fail-closed design exists to prevent. Facilitator-seeded acceptance criteria look real but carry no maintainer sign-off; nothing machine-checkable distinguishes them. A single read-only verb with a strict exit-code contract closes both holes: humans get a refusal with a remedy and an offered interview, runs get a deterministic step-0 gate.
Acceptance Criteria
- Given an intent in
drafts/(regardless of how good its seeded acceptance criteria look), whenabcd intent ready <itd-N>runs, then it reports NOT READY with abucketfailure whose remedy names the exact next step (abcd intent plan <itd-N>after maintainer confirmation, or the planning interview when acceptance criteria are missing) and the process exits 1. - Given a planned intent whose linked spec body still carries the minted
_Draft:stub, whenabcd intent readyruns, then thespec_bodycheck fails with a write-the-spec-body remedy and the process exits 1. - Given a planned intent with a linked spec whose reciprocal
intent:matches and whose body is written, whenabcd intent readyruns, then all four checks (bucket,acceptance_criteria,spec_link,spec_body) pass and the process exits 0. - Given a structural fault (malformed id, unknown intent, unreadable record),
when
abcd intent readyruns, then it exits 2 with a one-line diagnostic — distinguishable by exit code from a NOT READY verdict (exit 1). - Given the plugin surface
/abcd:intent, when a user asks the host to implement an intent for whichreadyexits 1, then the surface instructs the host to refuse, present each failing check's detail and remedy, and offer the planning interview — and forbids authoring acceptance criteria or runningabcd intent planwithout the human's explicit in-session sign-off. - Given the run protocol, when an unattended run picks an intent-backed item,
then its step 0 is
abcd intent ready <itd-N>and a nonzero exit is a journaled SKIP, never an improvised plan.
Open Questions
None recorded yet — the scaffold surface questions that block itd-93 do not apply here; this gate is self-contained (read-only reporter + docs).
Audit Notes
Fidelity review — receipt rcp-20c38dc58b6c (verifier abcd:intent-fidelity-reviewer claude-fable-5).
Provenance: abcd:intent-fidelity-reviewer@claude-fable-5 · rubric_hash sha256:dd8ae17ee7f52cb06ade6cbb844a346a5a1b582f2490e82480face9765c74a5f · prompt_hash sha256:95792472ae74ca0469f69a51c618946e0d33cb1380032460099ed4b469d67e86 Input attestations: diff:a87dfb9892243e9e069249d512912c63081937a8 (PR #103, merge 3b42d4e) plus current tree on docs/itd-94-record-catchup: internal/core/intent/ready.go, internal/core/intent/ready_test.go, internal/surface/cli/cli.go, commands/abcd/intent.md, .abcd/development/plans/2026-07-12-abcd-run-protocol.md@-; rubric:.abcd/.work.local/reviews/rcp-20c38dc58b6c.request.md@sha256:dd8ae17ee7f52cb06ade6cbb844a346a5a1b582f2490e82480face9765c74a5f;
Acceptance rollup: MET 6 · MET_WITH_CONCERNS 0 · NOT_MET 0 · INCONCLUSIVE 0
Per-criterion verdicts:
- ac-1 — MET: Live run on draft itd-97 exits 1 with a failing bucket check whose remedy names
abcd intent plan itd-97after maintainer confirmation; the no-criteria branch remedies via the planning interview at ready.go:114 and is asserted at ready_test.go:80. evidence: cmd: go run ./cmd/abcd intent ready itd-97 (exit 1) — "[fail] bucket: itd-97 is a draft — an intent that is not planned cannot be implemented / remedy: confirm the Acceptance Criteria with the maintainer, then runabcd intent plan itd-97" evidence: internal/core/intent/ready.go:111-115 — "if acCount > 0 { …abcd intent plan %s} else { … run the planning interview (/abcd:intent) …" evidence: internal/core/intent/ready_test.go:80 — "if !strings.Contains(bucket.Remedy, "planning interview")" - ac-2 — MET: No live stub-spec subject exists on the branch (grep of specs/open found no
_Draft:; host forbade manufacturing one), so judged from the shipped detector and its watched test: specBodyCheck fails on spec.BodyIsStub with a write-the-spec-body remedy, asserted by TestReadyPlannedStubSpecBody, and any not-ready result maps to exit 1 at cli.go:1196-1198. evidence: internal/core/intent/ready.go:199-201 — "if spec.BodyIsStub(string(data)) { … Remedy = fmt.Sprintf("write the spec body at %s, then re-runabcd intent ready %s"" evidence: internal/core/spec/spec.go:135-140 — "const stubMarker = "_Draft: describe what " … func BodyIsStub(content string) bool" evidence: internal/core/intent/ready_test.go:164-166 — "body.OK || !strings.Contains(body.Remedy, "write the spec body")" evidence: internal/surface/cli/cli.go:1196-1198 — "if !res.Ready { return &exitError{Code: 1} }" - ac-3 — MET: Live run on planned itd-88 (bidirectionally linked to spc-3, body written) reports all four named checks passing and exits 0. evidence: cmd: go run ./cmd/abcd intent ready itd-88 (exit 0) — "abcd intent ready — itd-88 READY (planned) / [ ok ] bucket / [ ok ] acceptance_criteria / [ ok ] spec_link: linked to spc-3 (bidirectional) / [ ok ] spec_body: … is written" evidence: internal/core/intent/ready.go:13-18 — "CheckBucket = "bucket" … CheckAcceptanceCriteria … CheckSpecLink … CheckSpecBody"
- ac-4 — MET: Unknown id itd-9999 and malformed id not-an-id each produce a one-line stderr diagnostic and exit 2 (observed as
exit status 2from go run), via the structural-fault mapping at cli.go:1174 — distinct from the exit-1 not-ready path. evidence: cmd: go run ./cmd/abcd intent ready itd-9999 (exit 2) — "abcd: abcd intent ready: intent: itd-9999 not found in any bucket / exit status 2" evidence: cmd: go run ./cmd/abcd intent ready not-an-id (exit 2) — "abcd: abcd intent ready: intent: id "not-an-id" must match ^itd-[0-9]+$ / exit status 2" evidence: internal/surface/cli/cli.go:1173-1174 — "return &exitError{Code: 2, Msg: "abcd intent ready: " + err.Error()}" - ac-5 — MET: The committed plugin surface carries THE RULE: on exit 1 the host must refuse, present each failing check's detail and remedy, offer the planning interview, and is forbidden from improvising acceptance criteria or running
abcd intent planwithout the human's explicit in-session sign-off. evidence: commands/abcd/intent.md:49-54 — "Exit 1 (not ready): DO NOT IMPLEMENT. Do not improvise acceptance criteria … do not runabcd intent planon your own authority … present each failing check'sdetailandremedy… offer the planning interview" evidence: commands/abcd/intent.md:70-72 — "the human accepts, edits, or strikes each … Seeded criteria are proposals, never approvals." evidence: commands/abcd/intent.md:80-81 — "This invocation IS the maintainer's sign-off act — never run it unattended or infer consent." - ac-6 — MET: The run protocol's Step 0 for intent-backed items is
abcd intent ready <itd-N>; nonzero exit is a journaled SKIP, and unattended planning/criteria-authoring/spec-synthesis is explicitly forbidden. evidence: .abcd/development/plans/2026-07-12-abcd-run-protocol.md:65-70 — "Step 0 for any intent-backed item: runabcd intent ready <itd-N>. A nonzero exit is a SKIP — journal the rendered findings and move on. Never runabcd intent plan, author acceptance criteria, or synthesize a spec in an unattended run" evidence: commands/abcd/intent.md:90-92 — "exit 1 fromreadyis a SKIP: journal the rendered findings and move to the next item."
Gap audit:
- honoured:
- A single read-only verb with a strict exit-code contract (0 ready / 1 not ready / 2 fault) gates implementation evidence: internal/surface/cli/cli.go:1159-1162 — "Exit codes are the machine seam an autonomous run gates on: 0 ready, 1 not ready … 2 structural fault." evidence: cmd: go run ./cmd/abcd intent ready itd-97|itd-88|itd-9999 — "observed exits 1 / 0 / 2"
- Refusal tells the user plainly the intent is not specced and offers the planning interview;
abcd intent planis the human sign-off act evidence: commands/abcd/intent.md:52-54 — ""<itd-N>is not specced, so it cannot be implemented yet" … offer the planning interview" evidence: commands/abcd/intent.md:80 — "This invocation IS the maintainer's sign-off act" - Autonomous drain runs get the same gate for free: exit 1 is a journaled SKIP, never a guess evidence: .abcd/development/plans/2026-07-12-abcd-run-protocol.md:65-70 — "a missing gate is a STOP, never an invitation to improvise one"
- Readiness re-uses the same acceptance-criteria parser as Plan and the fidelity review, so the gates cannot disagree evidence: internal/core/intent/ready.go:131-133 — "through the same parser Plan and the fidelity review use (countAcceptanceCriteria)"
- diverged:
- The intent title promises the gate "refuses with a remedy"; terminal buckets (shipped, disciplines, superseded) deliberately refuse without one — remedies attach only to fixable states evidence: internal/core/intent/ready.go:101-102 — "Terminal buckets carry no remedy: there is nothing to fix, the answer is simply no."
- missing: (none)
Frontmatter
| id | itd-94 |
|---|---|
| type | intent |
| lifecycle | shipped |
| kind | standalone |
| severity | minor |
.abcd/development/intents/shipped/itd-94-an-intent-that-is-not-planned-cannot-be.md
open on GitHub ↗ · commit history ↗
References1
- itd-27Domain Experts Get Their Intents Grilled Before Anyone Codes Themsupersedes
Referenced by8
- adr-40Review, audit, lint, and gate are four buckets, separated by what each comparesrelated
- iss-2610262035127167itd-94 says autonomous drain runs are held by the intent readiness gate; the intent chapter says the drain verb's lanes are issuesrelated
- iss-2610262038051992itd-94 says autonomous drain runs inherit the implement-readiness gate, exit 1 a journaled SKIP; 35-drain's lanes are issue runs checked only by the drain rule and the peers checkrelated
- iss-2610262042222565itd-94 has the agent run `abcd intent plan` as the person's sign-off; the plan entry has the human run it and says it is never inferred from consent.related
- iss-2610262045139907itd-94 has autonomous drain runs implementing intents; itd-82 defines drain as working issues only and leaves picking intents to `abcd build next`related
- iss-2610262045201587itd-94 has the agent run `abcd intent ready itd-93` with no other argument and read its verdict; itd-179 makes `intent ready` refuse without a grounds argumentrelated
- itd-30Design Fictions As An Alternative Capture Format For Intentsblocks
- spc-9an-intent-that-is-not-planned-cannot-be-implemented-abcd-gaiimplemented by
mentions27
- dcn-26071800000000022026-07-18 — Acceptance-criteria sign-off is implicit in a human running
- dcn-26072400000000052026-07-24 — Next-run queue reshaped by the grill: the small consequences
- 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-83The /abcd:run protocol has no precondition that the PLAN file itself exists: its fail-closed check covers a missing or malformed mandatory PLAN *field* (ROLE / RECOVER STATE) but not a wholly-absent PLAN *file*. In the drain #2 run the /loop fired against a PLAN_PATH that did not resolve on HEAD because the plan was being authored concurrently in another worktree and only merged mid-session (HEAD moved 54fef5f -> 137f8de under the running session). The runner correctly fail-closed but the gap invited synthesizing a substitute plan. Fix (protocol robustness): add an explicit step 0 — resolve PLAN_PATH on current HEAD; if the file does not exist, STOP and report without synthesizing a replacement plan (synthesis re-introduces the guess-the-gate risk fail-closed exists to prevent). Add an operational note: a plan-driven loop must only be launched after its PLAN is merged to the branch it reads. Secondary: at burst start git fetch + re-derive HEAD rather than trusting the session-start snapshot — here both the snapshot and NEXT.md were stale (NEXT.md described already-committed itd-81 work as uncommitted). Acceptance: the protocol names a missing-plan-file STOP distinct from missing-field, and forbids substitute-plan synthesis.
- 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.
- iss-2610170309585684The glossary term .abcd/development/brief/glossary/core/intent.md gives /abcd:intent grill itd-27 as a working usage example (lines 37-38), but abcd intent --help lists no grill sub-verb, itd-27 was superseded by itd-94, and the glossary README now calls the grill a design target.
- iss-261025221421783305-intent.md:448-499 (§ 5), the grill row (:319) and the PRD-freeze block (:221-226) keep the predecessor's grill/PRD design: itd-27 is superseded by itd-94, which carries none of it, and no GL003/GL005/GR002 code exists. intents/README.md:177-185 and :239-251 keep the same fields in its template.
- iss-2610252215019685glossary/README.md:172-209 describes /abcd:intent grill as 'a design target (itd-27)', but itd-27 is superseded by itd-94 (intents/superseded/itd-27-grill-skill-and-glossary.md:3); interview/embark.md and interview/session.md define stable terms for the same superseded design, and only planned itd-50:91 still leans on it.
- iss-2610252215141901Four pages (press release, context, naming, mental model) still carry /abcd:intent grill (itd-27) as designed or staged and Role 3 intent shape as a third auditor role. itd-27 is superseded by itd-94 (01-build-sequence.md:99-102: 'There is no grill sub-verb'), and itd-48:19 moved the shape role to the kinds lint.
- iss-2610262030459678The press release lists intent grill as a designed companion per itd-27; the intent chapter says itd-27 is superseded by itd-94
- iss-2610262030467492The context page carries intent grill as designed-not-built per itd-27; the intent chapter says its intent is superseded
- iss-2610262030468053The naming register marks /abcd:intent grill staged under itd-27; the intent chapter says itd-27 is superseded
- iss-261026203115329204-naming registers /abcd:intent grill as a staged sub-verb under itd-27; the build sequence says itd-27's grilling is the planning interview under itd-94, which supersedes it.
- iss-261026203115927702-context lists grill and ship as remaining intent design targets; the build sequence says there is no intent ship and no grill sub-verb, shipping running through spec close and grilling through the planning interview.
- iss-2610262031280238The press release counts /abcd:run, the itd-29 operator surface, among the plumbing in scope; the build sequence says the run seam does not ship, no run verb is registered and itd-29 is superseded.
- iss-2610262033434648The out-of-scope page says itd-27 (the grill sub-verb) is scoped into the planned phases; the intent chapter says itd-27 is superseded by itd-94 and no grill sub-verb ships.
- iss-2610262034293679itd-55 says abcd already stress-tests acceptance criteria with the grill; the intent chapter says no grill sub-verb ships.
- iss-2610262035075414itd-42 is scoped as a capability of an existing /abcd:intent grill sub-verb; the intent chapter says no grill sub-verb ships
- iss-2610262038247394The surfaces register keeps grill as a live design target to become an `intent` sub-verb; the build sequence says itd-94's planning interview supersedes it.
- iss-2610262040249675The build sequence says itd-27's grilling is now the planning interview; the glossary README keeps /abcd:intent grill as a live itd-27 design target.
- iss-2610262040257210The internals index gives /abcd:grill a design target of promotion to /abcd:intent grill; the build sequence says the grill is superseded by itd-94's planning interview.
- iss-2610262041175899The foundations-auditor draft says abcd already stress-tests acceptance criteria with the grill; the build sequence says there is no grill sub-verb.
- itd-24Completed Releases Get A Retrospective
- itd-88Know What a Repo Can and Cannot Tell You — Before You Trust the Lifeboat
- itd-93abcd Scaffolds a Release Gate That Works on the First Try
- itd-97The Facilitator Is a Mode, Not a Person
- spc-3lifeboat-coverage-experiment