Development record
abcd plans unattended and asks only what a person owns
Press Release
A person hands abcd an issue or an idea and says build it. abcd takes it from there without a terminal of its own: it promotes the issue, conducts the planning interview, plans the intent and starts the build, launching the person's own claude where no host session is driving. Along the way it puts to the person only the decisions that are theirs to make, each in their role's words (outcomes and choices for the product thinker, mechanism and trade-offs for the technical facilitator), and settles everything the record already answers itself, writing down what it settled and why. A decision only a person can make parks the work that depends on it, and nothing else; abcd never adopts a product decision on a person's behalf, and a question left unanswered stays asked.
Why This Matters
On 2026-10-24 a product thinker asked for one issue to be built (/abcd:build iss-2610140652230444). Getting from that request to a running build took six verbs,
three refusals and two questions about abcd's own record-keeping, and it then stopped at
a planning interview the person could not run: the session sent them to the terminal
verb, the verb needs a runner on a paid API key, their account is a subscription, and
the verb's refusal never said that the session itself may conduct the interview
(commands/intent.md, "Planning interview (host-run, with the human present)"). Each refusal was correct by its own rule. Together they
make a person do the orchestration abcd exists to do, and they ask questions (which
category, which link, which route) that are about abcd rather than about the product.
The person's own words: "too complicated. Not working … the user (TF / PT) is only presented with the options it can answer."
Mechanism
We expect a person to reach a running build from one request, answering only their own
decisions, because three things change together: (1) the unattended path gets a model
it can actually start: the person's own claude, under their own login
(iss-2610240932215918), or the host session already driving (iss-2610240932444000);
(2) deciding whether to ask is taken away from the agent that writes the plan and given
to a separate detection pass with a structured output, each open decision carrying an
owner (product thinker, technical facilitator, or the record) and the evidence that
settles it, because models asked to plan almost never ask unprompted, even on badly
underspecified input (Ambig-SWE, ICLR 2026, https://arxiv.org/abs/2502.13069v3; Su and
Cardie 2026, https://arxiv.org/abs/2605.25284), and separating detection from execution
is what measurably helped (https://arxiv.org/abs/2603.26233); and (3) a person-owned
decision becomes a durable parked question that blocks only the work depending on it,
resumed by session id when answered (the deferred-tool round trip:
https://code.claude.com/docs/en/hooks; LangGraph's interrupt model:
https://docs.langchain.com/oss/python/langgraph/interrupts). Shown wrong if, over the
next ten requests run this way, the person is asked a question whose answer the record
already held, or a product decision is found settled without a person's recorded
answer.
Scope Conditions
- One person's own machine and own model account; abcd starts the person's unmodified
claudebinary and never reads, mints or stores a credential. - Unattended means the person answers within a working day; work longer than that between answers is outside what this claim is about.
- The repository is managed by abcd, with its decision store, its issue ledger and its intent store, so the record a pass reads to settle a decision exists.
- Claude Code alone: the deferred-tool round trip is its feature, and another runner is outside this claim until it offers a structured output naming the open decisions and a resume by session id.
Acceptance Criteria
- Given an issue
build <iss-N>hands back on its category or its severity, when a person runs it, then the refusal also names the route that reaches a build from there:capture promote <iss-N>when no intent delivers it, orbuild <itd-N>naming the intent that does (the promoted refusal already names its intent,internal/core/capture/eligible.go:238-245). - Given a draft intent and a host session driving, when the planning interview runs, then the session conducts it through the same answers record the terminal interview writes, and no runner route is required.
- Given a draft intent and no host session, when the planning interview runs on
a machine whose model account is a subscription, then abcd starts the person's own
claudeunder that login and the interview proceeds; an interview whose run did not load abcd's question hook is refused before its first turn, naming the hook. - Given a planning pass over a draft, run separately from the agent that writes the plan, when it finishes, then every open decision it found is recorded with its owner (product thinker, technical facilitator, or the record) and its evidence; each whose owner is the record cites the record id that settles it and is written into the intent's Decisions with that id; and only the rest are put to a person.
- Given a seeded draft whose one open decision a cited decision record already answers, when the pass runs, then no question is put to a person and the Decisions line names that record (the GRILL rule that a decision with one defensible answer is recorded, not asked, made checkable by the cited id).
- Given a decision whose owner is the product thinker, when it is put, then it is asked in product terms with no record ids or internals, and one whose owner is the technical facilitator is asked with the mechanism and ids, as the GRILL register rule already says; the new part is that the owner is recorded before the question is drafted.
- Given a parked question, when the person has not answered it, then the work that depends on it stays parked, other work proceeds, and nothing adopts a default; an answer resumes the parked session by its id.
- Given a request carried through to a running build this way, when the run's record is read, then it lists every question put to a person, its owner, and every decision settled from the record with the id that settled it.
Decomposition
Hand-run four-piece table (DECOMPOSITION, itd-84), 2026-10-24. Routing awaits a person's confirmation.
| Piece | Record home | Verdict |
|---|---|---|
| Capability: unattended promote, interview, plan, build with parked person-owned questions | this intent | FILE-AS-IS |
| Trust rule: a machine never adopts a product decision; a parked question never times out into a default; abcd never handles a model credential | ADR + brief invariant (owed) | SPLIT |
| Stance: the human's adoption is the gate | existing principle verifier-selects-gates-decide |
no new record |
| Plumbing: the subscription runner, the host route, the promotion link | iss-2610240932215918, iss-2610240932444000, iss-2610240932493158 | captured |
Open Questions
- Does this reverse dcn-2607180000000002 (plan sign-off is implicit in a human running
intent plan; agents are barred from unattended planning)? The intent proposes that an agent may runintent planwhen every product-owned decision in the plan carries a person's recorded answer. Reversal flag, advisory: the product thinker rules it. - Does this reverse ruling RN2 (dcn-2610020000000016, the claude runner on a paid key only)? iss-2610240932215918 carries the evidence and the probe it waits on. Reversal flag, advisory: RN2 was the technical facilitator's ruling, so the technical facilitator rules it.
Typed Links
- reverses
dcn-2607180000000002(advisory, unconfirmed): agents barred from unattended planning. - reverses
dcn-2610020000000016(RN2, advisory, unconfirmed), and with it the--barepremise ofdcn-2610161624025493. - refines
iss-2610222000271964(a drain run from a plain terminal launches claude itself): the same launch, for planning. - builds on
itd-2610030810370060(plain-Terminal interviews): the written interview this intent makes reachable without a paid route. - builds on
itd-2609201916056194(the command-line runner).
Audit Notes
Empty. Populated by intent-auditor when intent moves to shipped/.
Frontmatter
| id | itd-2610240933025076 |
|---|---|
| type | intent |
| lifecycle | drafts |
| severity | minor |
.abcd/development/intents/drafts/itd-2610240933025076-a-person-hands-abcd-an-issue-or-an-idea.md
open on GitHub ↗ · commit history ↗
References2
- itd-2609201916056194A role runs through the command-line harness the operator chose, and every fall back to the host is recordedbuilds on
- itd-2610030810370060abcd's interviews run in a plain Terminal, with the same question layoutbuilds on
mentions11
- dcn-26071800000000022026-07-18 — Acceptance-criteria sign-off is implicit in a human running
- dcn-26100200000000162026-10-02 — Ruling RN2 of the technical facilitator, FINAL (2026-10-02, asked in plain words by abcd-a2 [75597f]; same local-tier file as the H3-0 entry above; recorded by lane rd2), verbatim: "YES, SEALED, PAID KEY ONLY — runner keeps --bare with an API key; only machine-layer (personal) routes may hand a role to a runner; repo routes skipped with a warning; subscription-only owners run the role in their own session." It supersedes the provisional answer, "TREAT IT LIKE A PAID SERVICE", given with the note "are you sure it cannot run via a subscription? Investigate first.", which stood only until a research pass returned: no flag set short of the bare flag seals project instructions, plugins, skills and agents (code.claude.com/docs/en/cli-reference, read 2026-10-02), and the vendor's terms do not permit third-party developers to route requests through Free, Pro or Max plan credentials on behalf of their users (code.claude.com/docs/en/legal-and-compliance, read 2026-10-02). Not built at this entry's base; lane runnerSeal of autonomous run A builds it with OC1 and OC2.
- dcn-26101616240254932026-10-16 — A headless claude run whose role's contract grants the shell gets its permission prompts answered by abcd's guard through the harness's --permission-prompt-tool, naming the one tool of an 'abcd guard approve' MCP server that the launch passes inline with --mcp-config and --strict-mcp-config, under --permission-mode default; the shell is no longer pre-granted on that launch, so every shell command the harness would ask about reaches the guard, which approves only a clean allow (no entry, signal or diagnostic, a program the line names, no inline code handed to a non-shell interpreter) and refuses every other prompt with the guard's reason. The expected shape, a PreToolUse hook in a per-launch --settings file, cannot work: --bare skips every hook, those --settings declares included (probed on claude 2.1.301: a SessionStart and a UserPromptSubmit hook from --settings ran without --bare and not with it), and dropping --bare would let the repository's hooks, plugins and CLAUDE.md run. A role whose contract grants no shell keeps dontAsk, which already refuses every prompt; opencode has no per-launch approval callback and is unchanged; the person's host settings are never touched. This change adds no sandbox; sandboxing autonomous runs is a separate later step (dcn-2610161619296615). Grounds: claude --help 2.1.301; code.claude.com/docs/en/cli-reference, /headless, /agent-sdk/permissions, /agent-sdk/user-input; live probes of the prompt tool's request and allow/deny answers, and of --bare connecting an --mcp-config server.
- iss-2610140652230444Every review should run as a pair of models from two classes, with the top class only an occasional advisor. The classes are vendor-neutral: top, middle, the class below it, and smallest (the scale itd-2610100704270254 uses). For one vendor today, Anthropic, they are Fable, Opus, Sonnet and Haiku. The rule is stated in classes so it survives model churn and holds for any vendor whose models map onto them.
- iss-2610222000271964abcd drain run from a plain terminal stops at its first move: it reserves the first eligible issue, writes a host-judgement request, and waits for an agent session to answer it, so a person who types abcd drain in a terminal gets no fixes (seen 2026-10-22 20:47 BST on a second machine: 213 eligible, 0 lanes opened, iss-2610120138028442 reserved for 2h and left). The person wants abcd drain to work from the plain terminal by launching claude sessions itself to judge each remedy and drive each lane.
- iss-2610240932215918The claude runner cannot run on a Claude subscription, so a person without an API key has no route to any role abcd runs from a plain terminal: the planning interview, a build's implementer and validators, the drain's judge.
- iss-2610240932444000`abcd intent interview` never hands the interview to a host session, and its refusal names only a runner, so a person sent to the verb is not told that the session they are in may conduct the interview.
- iss-2610240932493158The two-way pair that marks an issue as promoted (the issue's `related_intents` naming an intent that names it back in `related_issues`) cannot tell an issue the intent delivers from an issue the intent only cites as evidence, so an evidence-only issue reads as promoted and `capture promote` refuses it.
- iss-2610241256347199No verb that adds or moves a record in an indexed directory regenerates the index that lists it. Only go generate ./internal/surface/cli (cmd/abcd-gen-surface, through lint.RegenerateIndexes) rewrites the generated regions, such as the drafts list in .abcd/development/brief/06-delivery/03-out-of-scope.md and the ADR index. So filing a draft intent, planning one out of drafts/, or minting an ADR with decide --adr leaves a region stale, and record-lint's index_drift blocker refuses the next make preflight. On 2026-10-24 a hand-filed draft (itd-2610240933025076) failed preflight this way. The region then conflicted on a rebase over main, because every branch that files a draft edits the same list.
- iss-2611031146255825No abcd verb drives an intent build to done unattended: implement step takes one stage and exits, so a build of several steps needs something outside abcd to re-run it after each stage, wait out the merge queue, step again once the lane's pull request merges, and open the next lane. On 2026-11-03 the coordinator did this with a polling helper script (drive-run.sh) and timed wake-ups; drain --drive (itd-2610222215485265) covers drain lanes only, and itd-2610240933025076 starts a build but does not carry it through.
- itd-84An Intent Is Decomposed Before It Is Filed, And A Reversal Is Only Ever Flagged