Development record
Every question abcd's agents put to a human is asked one at a time, in plain language, with options that widen
Press Release
A question from an abcd agent is now something a person can answer without reading the record. Whenever an agent needs a human decision, at a planning interview, a decomposition routing, a grill, or any stop for a verdict, it asks one thing at a time through the host's interactive question tool: tabs for the parts of one thing, and a question that depends on an earlier answer asked alone. Each question quotes the thing being decided in full, in paragraphs and lists, carries one concrete example of what each answer would mean in practice, and offers options that widen rather than recommend: no starred default, no recommended label, and the null answer always offered. Deferral is recorded as an answer; silence is never consent. The rule ships as a rule domain that abcd installs into every repository it manages, so a session that never read the protocol still follows it from its first prompt.
"I was handed five design questions in one message, numbered, each three lines of record vocabulary," said a product thinker who answers for what their team ships. "I could not tell what any of them was asking me to choose between. Now I get one at a time, in words I use, with an example, and I answer in a click."
Why This Matters
The record already holds the two halves that matter for options: the widen-options rule and the three drafts that fix how options are offered. What it does not hold is how a question reaches a person at all. On 2026-09-01 the product thinker received the outstanding design decisions as a numbered list inside a long message and could not answer them; the same session then asked the status-line interview one question at a time and every answer landed. The difference was not the content but the delivery.
A rule that lives only in an interview page is followed by sessions that
read the page. A rule domain is injected by the loader whenever a prompt
matches its recall words, and re-injected after compaction, so it reaches
every session in this repository. Propagation is what makes it abcd's rule
rather than one repository's habit: ahoy install writes the domain into a
managed repository's rules file the way it writes the other conventions.
Decisions (product thinker, 2026-09-01)
- The register follows the addressee. A product thinker is asked in product terms: outcomes and choices, no record ids, no code, no internals. A technical facilitator is asked in the mechanism's terms, with the ids and the trade-offs. When the agent does not know which hat the human wears, the first question asks that, and the itd-200 mode records the answer so the next question does not ask again.
- Only real choices are asked (ruled by the product thinker, 2026-09-20; iss-2609202055103741). A question is asked only where two or more answers are each defensible on the record; its options are exactly those answers plus the null answer. A decision with one defensible answer is recorded as a decision line naming why no question was put, not asked.
- The question shows what it asks about (ruled by the product thinker, 2026-09-20; iss-2609202058058301). Text the human is asked to accept, edit or strike is quoted in the question itself, never referred to.
- Each register has a knowledge floor (iss-2609020716236446). The product thinker is not assumed to know version control, a shell, permissions, CI, hooks, environment variables, checksums, symbolic links or record ids; a concept below that floor is introduced in one product-terms sentence before it is used. The GRILL domain and the interview page carry the text.
What's In Scope
- The GRILL rule domain in this repository's
.abcd/rules.json, and the same text in the/abcd:intentinterview page, so the protocol and the injected rule match. - The domain in the binary's bundled defaults, so a managed repository receives it at install and update, with the usual per-repo override.
- A check that the bundled default and this repository's copy do not drift.
What's Out of Scope
- The options rule's content (itd-167, itd-168, itd-169 on the design branch): this intent delivers the asking, not the widening.
- Any harness that offers no interactive question tool: there the rule degrades to one question per message, stated as such.
Mechanism
We expect a person to answer more of the questions put to them, because a single plain question with an example is answerable where a numbered list of record vocabulary is not.
Scope Conditions
- A host without an interactive question tool degrades to one question per message, in the same order and wording.
- The register and mode rules, and the question check's mode gate, hold for abcd's own interviews (its command pages), not for questions other tools ask in a managed repository.
- The Writing Style rules on casing after a colon or semicolon stay review, never a machine check (adr-54).
Confirmed by the technical facilitator at the planning interview, 2026-10-03.
Acceptance Criteria
- R1 (facilitator; CONFIRMED 2026-10-03) Given a managed repository whose rules file declares no GRILL key, when a prompt matches the recall words, then
abcd rules GRILL --jsonrenders the domain withsource: bundled, generated from the one source that also holds the layout's field limits. - Given an agent at an abcd interview, when it needs a decision, then it asks one thing at a time through the interactive question tool (tabs for the parts of one thing; a question that depends on an earlier answer asked alone, after that answer). (Reworded by decision 2.)
- Given a question is asked, when the person reads it, then it quotes the thing being decided in full, in paragraphs and lists, carries one example of the thing being decided in the question text and, in each option's description, what choosing it means, names each option's gain and cost, and offers "decide later". (Reworded by decisions 2, 3 and 4.)
- Given the person asked is the technical facilitator, when a question is asked, then it carries the mechanism and the record ids; for the product thinker see R4. (Merged with R4.)
- Given the addressee of an abcd interview is unknown, when its first question is asked, then it asks which role the person holds before anything else. (Scoped to abcd's interviews by decision 10.)
- R2 (facilitator; CONFIRMED 2026-10-03) Given the bundled defaults declare GRILL by hand, when the defaults load, then they refuse, as they refuse a hand-written SHELL. (Replaces the drift check against a repository copy, which no longer exists, decision 8.)
- R3 (product thinker; CONFIRMED 2026-10-03) Given five decisions outstanding, when the agent needs them, then it asks about one thing at a time, tabs for the parts of one thing, never a numbered list in a message (example: five open questions about one feature's criteria as four tabs on one screen and the fifth on the next, since a screen holds at most four; a question depending on their answers comes alone afterwards).
- R4 (product thinker; CONFIRMED 2026-10-03, checked by the question check) Given the person asked is the product thinker, when a question is asked, then it names no record number and no command (example: "the project's folder of work", never "the checkout").
- R6 (facilitator; CONFIRMED 2026-10-03) Given an option labelled "(Recommended)" or starred, when the question check runs, then it refuses naming the label, and the remedy says the host's own instruction asks for it and abcd's rule reverses it, so the agent does not loop.
- R5 (product thinker; CONFIRMED 2026-10-03) Given the person answers "decide later", when the interview moves on, then the record shows that answer, and nothing is taken as agreed from silence (example: the bundle name deferred is recorded as deferred, and planning stops until it is answered).
Interview decisions (2026-10-03)
- The product thinker: keep this as one record. The asking rules and their shipping to every project abcd looks after stay together in the bundle, with the cost (about a page of text in most sessions of every project) and the setup questions it brings.
- The product thinker: the promise and criteria follow the layout decisions: "one thing at a time: tabs for the parts of one thing, and a question that depends on an earlier answer asked alone", and "the thing being decided quoted in full, in paragraphs and lists" in place of "one sentence of context". The rule text is amended to match when this is built.
- The product thinker: an example lives in the question text (one example of the thing being decided) and in each option's description (what choosing it means); the side preview may repeat it with the trade-off, never hold it alone, since a preview can be cut off.
- The product thinker: trade-offs stay neutral by the wording "each option's gain and cost, never one option's alone".
- The product thinker (the knowledge-floor ruling owed since iss-2609020716236446 was resolved without a recorded answer): the floor lives on one glossary page, and the rule carries one line pointing to it. The earlier resolution's choice of a list in the rule text was the facilitator's, not the product thinker's; this answer replaces it when built.
- The product thinker, on itd-110's "the recommended answer distinctly styled" (retired with itd-110): no option is ever styled or ordered as recommended; a recommendation appears only when the person asks for one, given in prose beside the question, never as an option. This reverses that part of itd-110.
- Decided without a question (one defensible answer: the host and the layout's decision 10 allow at most four tabs per screen): R3's example reads four tabs, then the fifth on the next screen. Found by the spec writer, 2026-10-03.
- The technical facilitator: GRILL is generated from one Go source, as SHELL is, with the layout's field limits; the generated text carries no record ids and no
go run; abcd's own repository override is deleted in the same change. - The technical facilitator: the recall cost is accepted (about 1,100 tokens in most sessions of every managed repository); a repository silences it with {"GRILL": {"state": "dormant"}}.
- The technical facilitator: the register and mode rules, and the question check's mode gate, apply to abcd's own interviews only; other tools' questions in a managed repository are not refused.
- The technical facilitator: builds_on itd-200, reverses itd-110, and three scope conditions written.
- The product thinker: itd-2609151541116052 (show the thing first) is folded into itd-2610030810350727 and superseded by it; the bundle is this record and the layout intent.
- 2026-10-03, note: decision 20 of the layout intent (itd-2610030810350727, the product thinker: "No side previews") moves each option's gain and cost into its description. A side preview hides every option's description in the host and is cut to the rows the host leaves it, so abcd's questions carry none: where decision 3 says the side preview "may repeat it with the trade-off", and where the layout intent's decision 17 puts the trade-offs in the previews, the description now holds the meaning, the gain and the cost, and the question check refuses a preview.
Review findings (design and feasibility, 2026-10-03, bundle with itd-2610030810350727 and itd-2609151541116052)
From the review recorded in the local tier (reports/review-bundle-design.md). Nothing here is settled; each item is put to its addressee at the interview.
- Blocking, mechanism: a managed repository receives a bundled rule domain through the abcd binary, never as a copy written into its rules file (setup writes the empty skeleton on purpose: the default domains live once in the binary). So the asking rules ship by joining abcd's bundled default domains, abcd's own repository drops its override in the same change, and criterion 4 becomes "the managed repository renders the rules with source: bundled", with criterion 7 (a drift check against a copy) replaced by deleting the copy.
- Blocking, the text: the rule domain as written names abcd-internal records and the
go runform, which a managed repository cannot use. Proposed: generate it from one source in the binary, as the shell rules are, together with the layout's field limits (the layout's criterion A7, widened from the limits to the whole text). - Should-fix, cost: the domain is about 1,100 tokens and recalls on everyday words (which, plan, decide, options, choose), so it would land in most sessions of every managed repository. Proposed: broad recall only for the rules that change what a person sees; the register, floor and mode rules behind narrower words; the per-repository escape stated.
- Should-fix, managed repositories: "the first question asks which hat the person wears", with the question check refusing every question while the mode reads managed, would make every managed repository's first question abcd's two-role question. Proposed: the register and mode rules cover abcd's own interviews only, and the rule text says so.
- Should-fix, staleness: criterion 1 counts four rules (the domain has twelve); three intents are named as being on a design branch (they are drafts).
Contradictions with the layout bundle's settled decisions, each for the product thinker, quoted from both sides: "one question at a time" here against the layout's decision 10 (tabs for parts of one thing, a dependent question alone); "one sentence of context" here against the layout's decision 1 (paragraphs and lists, the thing quoted in full); "options that widen rather than recommend" here against the layout's decision 17 (trade-offs in the previews, which stay neutral only if every option's cost and gain are named); and three homes for examples (the option's preview here, the question text in the layout's decisions 12 and 16, the option description in the layout's press release).
Proposed acceptance criteria (agent-seeded, unconfirmed; each walked with an example at the interview): R1 (facilitator) a managed repository with no GRILL key renders the rules from the binary with source bundled; R2 (facilitator) the bundled defaults refuse a hand-written GRILL, as they refuse SHELL; R3 (product thinker) five outstanding decisions are asked one thing at a time, tabs for the parts of one thing, never a numbered list in a message; R4 (product thinker) while the mode reads product thinker, a question names no record id and no command; R5 (product thinker) "decide later" is recorded as the answer, and nothing is taken as agreed from silence; R6 (facilitator) a "(Recommended)" or starred option is refused, and the remedy says the host's own instruction asks for it and abcd's rule reverses it.
Open Questions
- Whether the domain's recall words are wide enough to fire on every stop for a verdict, or whether the mode verb from itd-200 should inject it directly when the agent parks a stop.
Audit Notes
Fidelity review — receipt rcp-5796271104cf (verifier abcd:intent-auditor claude-opus-5-5).
Provenance: abcd:intent-auditor@claude-opus-5-5 · rubric_hash sha256:effa65b3e9e88ff29433b443ec2be159522a8b0b71cf1434526514aa61edb13e · prompt_hash sha256:659dab7db2733d2ec5ff149ef80ed4bf67dca3209c5a43294def6e3310dc8628 Input attestations: diff:1b22bae3169447f0c773d703713c7f3b6a9261e3..4b9345575123ba47c2ee6fc1cd6dc7d27804812d (PR #784, spec steps 1 and 2; the request named no range, so it was read from the merge commit's parents; digest over git diff --no-color --no-ext-diff)@sha256:74de7e73c13db25c490cff764c4e7d4b22db849d5060b879ca83ab88752ddc63; diff:cc5121f6880b750dfda60f355d1beb6c37babddd..9392a45148241c28c7140b50660637184183ec40 (PR #788, spec steps 3 to 5 and the spec close 3fdb8a4ce; digest over git diff --no-color --no-ext-diff)@sha256:b3e33525369dc8b2e9de804c8d5e66e47de3d7ccb1fb1f476a187a8ae0816f21; repository:2e03c61e454bf09ecda8cee0ae2f377157b522f7 (origin/main, where every cited file:line was read; the local audit-notes commit 18170d03f above it touches none of them)@-;
Acceptance rollup: MET 3 · MET_WITH_CONCERNS 7 · NOT_MET 0 · INCONCLUSIVE 0
Per-criterion verdicts:
- ac-1 — MET: grill.go builds the GRILL domain at load from question.AskingRules(question.Default), the one Limits value in limits.go that the question check also reads; TestManagedRepositoryGetsGrillFromTheBinary gives a repository the empty rules skeleton ahoy writes, injects GRILL through the prompt hook on 'which option should we choose', and asserts 'abcd rules GRILL --json' reports source bundled with rules equal to the generated text (R1).
evidence: internal/core/rules/grill.go:29 — "Rules: question.AskingRules(question.Default),"
evidence: internal/core/question/limits.go:42 — "var Default = Limits{"
evidence: internal/surface/cli/rules_grill_domain_test.go:49 — "skeleton :=
{"schema_version":1,"disabled":false,"domains":{}}" evidence: internal/surface/cli/rules_grill_domain_test.go:61 — "if got.Name != "GRILL" || got.Source != "bundled" {" - ac-2 — MET_WITH_CONCERNS: The first GRILL rule tells every abcd interview to ask one thing at a time through the host's question tool, the parts of one thing as tabs and a dependent question alone after its answer (asserted by TestGrillTextAsksOneThingAtATime), and the check refuses more than four questions in one call with a remedy saying the same. Concern: only that count is enforced; whether one call holds the parts of one thing, whether a dependent question waited for its answer, and whether the agent used the tool rather than a message are rule text no hook can see. evidence: internal/core/question/asking.go:37 — "Ask one thing at a time, through the host's interactive question tool, never as a numbered list in a message." evidence: internal/core/question/asking.go:39 — "A question whose answer depends on an earlier one is asked alone, after that answer." evidence: internal/core/question/check.go:131 — "Remedy: "Ask one question, or up to four parts of one thing as tabs; ask a question that depends on an earlier answer alone, after that answer."," evidence: internal/core/rules/grill_test.go:103 — "r := ruleWith(grillRules(t), "one thing at a time", "as tabs", "up to four on a screen","
- ac-3 — MET_WITH_CONCERNS: The check refuses a question with no material before its closing question line (rule 11), an option with no description (rule 5) and a question whose last option is not a decide-later label (rule 6), each tested (TestOpenQuestionQuotesAndOffersDecideLater among them); the GRILL text states quoting in full in paragraphs and lists, one example in the question text, each option's meaning in its description, and each option's gain and cost. Concerns: 'in full', the one example and the gain and cost are rule text only, since rule 11 asks for one paragraph of material and nothing reads its content; and LaterLabels admits 'None of these' in place of 'Decide later', so a question passes the check without offering decide later. evidence: internal/core/question/asking.go:47 — "The thing being decided is quoted in full in the question itself, in paragraphs and lists, never referred to" evidence: internal/core/question/asking.go:68 — "Every question carries one example of the thing being decided, in the question text, and each option's description says what choosing that option means in practice." evidence: internal/core/question/asking.go:72 — "Each option's description names its gain and its cost, never one option's alone" evidence: internal/core/question/check.go:322 — "Quote the thing being decided in full first, in paragraphs and lists, then ask; never refer to it." evidence: internal/core/question/limits.go:49 — "LaterLabels: []string{"Decide later", "None of these"}," evidence: internal/core/question/limits_test.go:333 — "func TestOpenQuestionQuotesAndOffersDecideLater(t *testing.T) {"
- ac-4 — MET_WITH_CONCERNS: The register rule gives the technical facilitator the mechanism, the ids and the trade-offs, the knowledge-floor page says leaving the ids out withholds the handle they act on, and the check's register rule never applies to a facilitator's question, so a Tech-chipped question naming a record number is admitted (the facilitator case of TestProductThinkerQuestionNamesNoRecordOrCommand). Concern: the mechanism and the ids are permitted and asked for, never required; nothing checks that a question put to the facilitator carries them. evidence: internal/core/question/asking.go:81 — "the technical facilitator gets the mechanism, the ids, and the trade-offs." evidence: .abcd/development/brief/glossary/interview/knowledge-floor.md:30 — "explaining it to them is padding, and leaving the ids out of their answer withholds the handle" evidence: internal/core/question/check.go:391 — "case Facilitator:" evidence: internal/surface/cli/guard_question_limits_test.go:338 — "t.Errorf("facilitator: the mechanism and the ids are theirs; code=%d stdout=%q stderr=%q", code, stdout, stderr)"
- ac-5 — MET_WITH_CONCERNS: One GRILL rule, scoped to abcd's own interviews and asserted by TestGrillTextScopesRegisterToAbcdInterviews, says the first question asks which role the person holds when that is not known. Concerns: it is rule text only, with no interview step or fixed question that asks the role and no check; the planning page sets the mode before the first question and the chip rule has the agent classify each question's addressee instead; and the rule's own claim that the mode records the answer is contradicted by the reset to managed on every answered question, so the answer survives only in the agent's context. evidence: internal/core/question/asking.go:83 — "In abcd's own interviews, when it is not known which role the person holds, the first question asks that, and the mode records the answer so the next question does not ask again." evidence: internal/core/rules/grill_test.go:171 — "{"role first", []string{"which role the person holds", "the first question asks that"}}," evidence: commands/intent.md:322 — "The sign-off is the product thinker's; set the mode before the first question" evidence: internal/core/mode/question.go:127 — "if err := SetAt(repoRoot, Managed); err != nil {"
- ac-6 — MET: withGrillDomain panics when the bundled rules.json declares GRILL, and mustParseDefaults calls it at load right after withShellDomain, which panics the same way on a hand-written SHELL; TestGrillDomainIsNotHandWritten asserts the embedded file declares no GRILL and TestHandWrittenGrillPanicsAtLoad asserts a hand-written GRILL panics naming the domain and 'by hand' (R2). evidence: internal/core/rules/grill.go:39 — "panic("rules: bundled defaults declare " + GrillDomain + " by hand; it is generated from internal/core/question")" evidence: internal/core/rules/rules.go:183 — "rs = withGrillDomain(rs)" evidence: internal/core/rules/shell.go:75 — "panic("rules: bundled defaults declare " + ShellDomain + " by hand; it is generated from the guard registry")" evidence: internal/core/rules/grill_test.go:82 — "func TestHandWrittenGrillPanicsAtLoad(t *testing.T) {"
- ac-7 — MET_WITH_CONCERNS: The GRILL rule asks the parts of one thing as tabs, up to four on a screen and the rest on the next, a dependent question alone after that answer, and never a numbered list in a message (TestGrillTextAsksOneThingAtATime); the check refuses five questions in one call and admits the example's four tabs and then the fifth alone. Concerns: 'never a numbered list in a message' is prose no hook sees; and since iss-2610070637562567 the rows limit no longer refuses, so five criteria lumped into one question are shown with a note instead of refused. evidence: internal/core/question/asking.go:38 — "The parts of one thing (the criteria of one feature, the paragraphs of one text) are asked as tabs, up to %s on a screen, each short, and the rest on the next screen." evidence: internal/core/question/limits_test.go:107 — "{"five questions", RuleQuestionsPerCall, facilitator(), func(f *Fields) {" evidence: internal/core/question/limits_test.go:426 — "if fs := CheckLimits(four, Default, productThinker()); len(fs) != 0 {" evidence: internal/surface/cli/guard_question.go:199 — "// The rows limit alone does not refuse (iss-2610070637562567): a question"
- ac-8 — MET_WITH_CONCERNS: Rule 9 of the check refuses a record handle, a backtick span, go run, a /abcd: command or abcd followed by one of the binary's verbs in any field of a question for the product thinker, and TestProductThinkerQuestionNamesNoRecordOrCommand refuses each case under the product-thinker mode and, with no mode store, under a Product chip (R4). Concerns: the criterion's own example, 'the checkout', is vocabulary the check does not catch, held only by the register rule and the knowledge-floor page; and since iss-2610100626211810 a chipped question is checked against its chip rather than the mode, so a question for the product thinker that the agent chips Tech or Setup is never held to the register. evidence: internal/core/question/check.go:276 — "add(fl.part, RuleRegister, hit, "no record number and no command for the product thinker"," evidence: internal/surface/cli/guard_question_limits_test.go:306 — "func TestProductThinkerQuestionNamesNoRecordOrCommand(t *testing.T) {" evidence: internal/surface/cli/guard_question.go:193 — "who = question.Unnamed" evidence: .abcd/development/brief/glossary/interview/knowledge-floor.md:52 — ""The question named the checkout, which is below the product thinker's knowledge floor; it"
- ac-9 — MET: Rule 8 refuses a label carrying '(Recommended)' in any case or opening or closing with a star, echoing the label, and its remedy RecommendedRemedy says the host's own instruction asks for a recommended first option and abcd's asking rule reverses it; TestRecommendedOrStarredOptionIsRefused asserts the deny names the label 'Number only *' and carries that remedy (R6). evidence: internal/core/question/check.go:77 — "const RecommendedRemedy = "The host's own instruction for this tool asks for a recommended first option; abcd's asking rule reverses it" evidence: internal/core/question/check.go:268 — "add(optionPart(i, "label"), RuleNeverRecommended, o.Label, "no (Recommended) label and no star mark", RecommendedRemedy)" evidence: internal/surface/cli/guard_question_limits_test.go:365 — "if !strings.Contains(lines[0], strconv.Quote("Number only *")) {" evidence: internal/surface/cli/guard_question_limits_test.go:368 — "if !strings.Contains(lines[0], question.RecommendedRemedy) {"
- ac-10 — MET_WITH_CONCERNS: The GRILL rule records deferral as an answer and never takes silence as consent (TestGrillTextRecordsDeferral), the check always requires a decide-later option, the planning page records a deferred question as deferred in the draft, the Terminal interview records the 'later' value, the build refuses a record that still asks an open question, and planning several drafts is refused without a bundle name, which holds the criterion's example (R5). Concerns: on the host path the deferral reaches the record only if the agent writes it; and planning stops mechanically only for the bundle name, elsewhere by page text limited to an open question that gates scope. evidence: internal/core/question/asking.go:78 — "Deferral is a real answer and is recorded as one; silence is never consent, and a step whose answer is missing is asked again rather than assumed." evidence: commands/intent.md:394 — "thinker defers is recorded as deferred in the draft; skipping it is not a" evidence: internal/core/intent/bundle.go:91 — "--bundle < name> is required to plan several intents as one (nothing moved)" evidence: internal/core/interview/written.go:581 — "Later: question.Option{Value: "later", Label: question.Default.LaterLabels[0]," evidence: internal/core/intent/startcheck.go:91 — "// startOpenQuestionsRow refuses a record that still asks a question."
Gap audit:
- honoured:
- One thing at a time through the host's question tool, tabs for the parts of one thing, and a question that depends on an earlier answer asked alone evidence: internal/core/question/asking.go:37 — "Ask one thing at a time, through the host's interactive question tool, never as a numbered list in a message." evidence: internal/core/question/check.go:131 — "Ask one question, or up to four parts of one thing as tabs; ask a question that depends on an earlier answer alone, after that answer."
- The thing being decided quoted in full, in paragraphs and lists, with one concrete example and what each answer means in practice evidence: internal/core/question/asking.go:47 — "The thing being decided is quoted in full in the question itself, in paragraphs and lists, never referred to" evidence: internal/core/question/asking.go:68 — "each option's description says what choosing that option means in practice"
- Options that widen rather than recommend: no starred default and no recommended label, refused by the question check evidence: internal/core/question/check.go:268 — ""no (Recommended) label and no star mark", RecommendedRemedy"
- The null answer always offered evidence: internal/core/question/check.go:246 — "as the last option; it is always offered."
- Deferral is recorded as an answer; silence is never consent evidence: internal/core/question/asking.go:78 — "Deferral is a real answer and is recorded as one; silence is never consent" evidence: commands/intent.md:394 — "thinker defers is recorded as deferred in the draft"
- The register follows the addressee: the product thinker sees no record id or command, the facilitator gets the mechanism and the ids evidence: internal/core/question/check.go:276 — "no record number and no command for the product thinker" evidence: internal/core/question/asking.go:81 — "the technical facilitator gets the mechanism, the ids, and the trade-offs."
- The same text in the planning interview page as in the injected rule domain
evidence: commands/intent.md:327 — "Written by
make asking-syncfrom internal/core/question; edit asking.go or limits.go there, never this block." evidence: cmd/asking-sync/main_test.go:47 — "func TestIntentPageAskingBlockIsGenerated(t *testing.T) {" - The knowledge floor on one glossary page the rule points at (decision 5), and the dormant escape for a repository that does not want the domain (decision 9)
evidence: internal/core/question/asking.go:85 — "the knowledge floor an explanation is measured against, is stated in full at"
evidence: internal/core/ahoy/defaults/claude-md-marker-block.md:99 — "silences it with
{"GRILL": {"state": "dormant"}}in.abcd/rules.json."
- diverged:
- The rule ships as a rule domain that abcd installs into every repository it manages, ahoy install writing it into the managed repository's rules file: delivered instead through the binary's bundled defaults, generated at load, with ahoy writing only the empty skeleton (decision 8)
evidence: .abcd/development/intents/shipped/itd-201-every-question-abcd-s-agents-put-to-a.md:56 — "
ahoy installwrites the domain into a" evidence: internal/core/rules/grill.go:44 — "rs.Domains[GrillDomain] = grillDomain()" evidence: internal/surface/cli/rules_grill_domain_test.go:47 — "The skeleton ahoy's stepRules writes: no domain declared, every bundled" - A session that never read the protocol still follows it from its first prompt: the domain is injected only on a prompt matching one of its recall words, and an agent that never received it writes no chip, so its question runs unchecked as another tool's while the mode reads managed evidence: internal/core/question/asking.go:19 — "var askingRecall = []string{"grill", "interview", "options", "decide", "decision", "plan", "choose", "which", "product thinker", "facilitator", "register"}" evidence: internal/surface/cli/guard_question.go:175 — "if !chip && st == mode.Managed {"
- A check that the bundled default and this repository's copy do not drift: the copy was deleted and a hand-written GRILL panics at load, with a drift test against the generated text in its place (decision 8) evidence: internal/surface/cli/rules_grill_domain_test.go:84 — ".abcd/rules.json declares GRILL; the domain is generated into the binary and the override is deleted" evidence: internal/core/rules/grill_test.go:49 — "func TestGrillDomainIsGeneratedFromTheAskingRules(t *testing.T) {"
- The mode records the role answer so the next question does not ask again: the mode is reset to managed on every answered question and the chip sets it per question, so the mode never holds the role evidence: internal/core/mode/question.go:127 — "if err := SetAt(repoRoot, Managed); err != nil {" evidence: internal/core/question/asking.go:90 — "the chip sets the mode when the question is asked, and the answer sets it back to managed"
- Decide later always offered (the criterion's wording): the check also admits None of these as the one later option, so decide later itself can be absent evidence: internal/core/question/limits.go:49 — "LaterLabels: []string{"Decide later", "None of these"},"
- The rule ships as a rule domain that abcd installs into every repository it manages, ahoy install writing it into the managed repository's rules file: delivered instead through the binary's bundled defaults, generated at load, with ahoy writing only the empty skeleton (decision 8)
evidence: .abcd/development/intents/shipped/itd-201-every-question-abcd-s-agents-put-to-a.md:56 — "
- missing:
- Whenever an agent needs a human decision, at any stop for a verdict: the intent's own open question 1 (whether the recall words fire on every stop for a verdict, or the mode verb should inject the domain when a stop is parked) is unanswered, and nothing injects GRILL at a parked stop, since neither the mode verb nor the mode store references the domain evidence: .abcd/development/intents/shipped/itd-201-every-question-abcd-s-agents-put-to-a.md:157 — "1. Whether the domain's recall words are wide enough to fire on every stop" evidence: internal/core/question/asking.go:19 — "var askingRecall = []string{"grill", "interview", "options""
Scope-condition dispositions:
- cond-2610030944504162 — untested: The degradation is written into the first GRILL rule every managed repository receives and asserted present by TestGrillTextAsksOneThingAtATime, but no interview ran on a host without a question tool, and the question check sees only calls to the host's question tool, so the order and wording of a question asked as a message are never checked. evidence: internal/core/question/asking.go:40 — "A host with no question tool asks one question per message, in the same order and the same words." evidence: internal/surface/cli/guard_question.go:45 — "// isQuestionTool reports whether a hook payload's tool is a question tool."
- cond-2610030944507807 — narrowed: The register, role-first and mode rules open with 'In abcd's own interviews', and a question without abcd's chip asked while the mode reads managed runs unchecked and unmarked (TestForeignQuestionIsNotRefused); but a question without the chip asked while the mode names somebody is treated as abcd's and refused on its rules (TestModeMadeQuestionAbcdsSaysSo), the trade-off the spec accepted in its open question 1, and since spc-2610180914469489 every question, another tool's included, is refused while the person is away. The delivered mode gate itself, an abcd chip refused while the mode reads managed, has since been replaced by the chip setting the mode. narrowing: Another tool's question in a managed repository escapes abcd's rules only while the mode reads managed and the person is present: while the mode names the product thinker or the facilitator, a question without abcd's chip is held to abcd's limits and register rule, and while the person is away every question is refused. evidence: internal/core/question/asking.go:80 — "In abcd's own interviews, address the person in their register" evidence: internal/surface/cli/guard_question.go:175 — "if !chip && st == mode.Managed {" evidence: internal/surface/cli/guard_question_limits_test.go:549 — "want := "treated as abcd's because the mode names " + who + "; another tool's question asked now is held to abcd's rules"" evidence: internal/surface/cli/guard_question.go:92 — "return denyCall(awayQuestionRefusal())" evidence: internal/surface/cli/guard_question_away_test.go:58 — "{name: "another tool's", payload: func(t *testing.T, cwd string) string { return askPayload(t, cwd, foreign) }},"
- cond-2610030944507744 — narrowed: The delivered question check carries no casing rule among its fourteen (rule 12 is the em dash in a list item only), the GRILL text adds no casing check, and the writing-style guide labels both rules review permanently; but a machine check that predates this intent holds that casing in one fixed grammar: every verb's one-sentence summary is parsed under test, and the parser refuses a clause after the colon that does not open with 'Writes' and a clause after the semicolon that does not open with 'refuses', case-sensitively, the capital and the lower case chosen to follow the guide. narrowing: Holds for prose, for the asking rules and for every question abcd asks; it does not hold for each verb's one-sentence summary, whose fixed grammar is machine-checked for a capital after its colon and lower case after its semicolon. evidence: internal/core/question/check.go:33 — "RuleEmDashListItem Rule = "em-dash-in-list-item" // 12: no em dash in a list item" evidence: docs/reference/writing-style.md:63 — "| After a colon: A capital letter. | review, permanently" evidence: internal/core/surface/sentence.go:14 — "// "Writes", capitalised because the writing-style guide puts a capital after a" evidence: internal/core/surface/sentence.go:97 — "return Sentence{}, fmt.Errorf("the writing clause after the colon does not open with %q", writesOpening)" evidence: internal/core/surface/sentence.go:101 — "return Sentence{}, fmt.Errorf("the refusing clause after the semicolon does not open with %q or %q"," evidence: internal/surface/cli/sentences_test.go:123 — "if _, err := surface.ParseSentence(sentence); err != nil {"
Frontmatter
| id | itd-201 |
|---|---|
| type | intent |
| lifecycle | shipped |
| kind | bundle-member |
| severity | major |
.abcd/development/intents/shipped/itd-201-every-question-abcd-s-agents-put-to-a.md
open on GitHub ↗ · commit history ↗
References2
- itd-200A managed repository shows it is managed, and whose answer the loop is waiting on, in the host's status linebuilds on
- itd-2610030810350727Every question abcd asks reads the same way, on a narrow window and a wide onerelated
Referenced by12
- iss-2610262034402021itd-201 says the itd-200 mode records which hat the human wears so it is not asked again; the board chapter says answering any abcd question resets the mode to managed.related
- iss-2610262036304277itd-201 uses the itd-200 mode to remember which role the person holds across questions; the guard chapter resets that mode to managed when each question is answeredrelated
- iss-2610262039376194itd-201 scopes a GRILL domain in this repository's `.abcd/rules.json` kept in step with the bundled copy; the configuration chapter says GRILL is generated from one Go source and abcd's own repository declares no override of itrelated
- iss-2610262041393479itd-201 says the GRILL domain and the interview page carry the knowledge-floor text; the knowledge-floor glossary page says GRILL only points to it and the page states the floor in fullrelated
- iss-2610262043114601itd-168 claims the plain-language-and-options defaults for how abcd talks to the product thinker; shipped itd-201 already fixes them.related
- iss-2610262045007603itd-201 asks which hat the human wears before the mode is set; itd-2609212130146198 refuses every question while the mode reads managedrelated
- itd-2609151541116052During the peer-listing planning interview on 2026-09-20, the agent listed the rewritten acceptance criteria in prose and then asked, through the interactive question view, whether the criteria were the product thinker's. The prose was not on screen while the question showed, so the product thinker was asked to confirm text they could not see (iss-2609202058058301). A confirming question has to carry what it confirms.related
- itd-2609212130146198The status-line badge is true at every stoprelated
- itd-2609212137129937abcd's text names the product thinker or the technical facilitator, never the maintainerbuilt on by
- itd-2610031215002409A 'what next?' menu under the board offers the next step, in a Terminal and in a Claude Code sessionrelated
- itd-2610230756259215Every question abcd asks passes its check before the person sees itbuilt on by
- spc-2610030944505997asking-and-layoutimplemented by
mentions14
- adr-54Punctuation enforcement stays mechanical-only
- dcn-26100500000000012026-10-05 — Release v0.13.0 is cut by the coordinating session abcd-d7 while the product thinker is away, and the run's agenda line is: approve the publish step. Under the product thinker's rulings of 2026-10-04 (~10:05Z, verbatim: "Yes, that order", to cut v0.13.0 now with the home rename #815 inside it and rename the folder on their return; "Yes, approve it", for the coordinating session to approve the GitHub publish deployment itself once every check has passed, then verify the downloads and the site; ~13:35, leaving overnight: "keep going autonomously so we can have a new release tomorrow morning"), the session approves the `release` environment's deployment of v0.13.0 only after the merge queue, the verify job and every other gate on the tagged commit report green, and stops with a handover instead if any does not. The cut: v0.13.0, impact breaking (decided by itd-2610030720038073, the home folder renamed to `~/.abcd.noindex` with every abcd entry point stopping until the person renames it; itd-2610030814013772, AGENTS.md the one conventions file; and iss-2610020723185314, only a personal route hands a role to a command-line runner), 55 records since v0.12.0: five shipped intents (two breaking, three additive: itd-201, itd-2610030810350727, itd-2610030821294016) and 50 resolved issues (41 fixes, one additive, one breaking, seven internal and outside the changelog); the release guard and the findings guard passed. The noindex intent's scan receipt (D6) was taken on a `.noindex` probe folder before the rename, with consent, and adr-2610030720195401 accepted with brief invariant 21 (6538ab4a). Brief fidelity: three tier-full reviews and their holds brought 25 brief sentences current before the close (9d57917c, 9e6e0aa0), and the guide's own review found one false sentence, corrected to say the rename is done in a plain Terminal (cde071b9, 405cf34d). Content commit c6441dc0, on top of 3a092b89, which the cross-check's one fix-before-tag finding required; both semantic gates ran at tier full over the first roll 317cd0cc, which differs from the content commit only by that commit and the re-cut CHANGELOG. The docs-currency-reviewer (Fable 5.1) found 2: dc-1 accepted as written (while only `~/.abcd` stands the plugin root holds no binary, so the hook refuses the rename too and the pages describe what the person meets), dc-2 a nitpick deferred to the next release notes. The brief-surface cross-check (45 pinned checkers, Opus 5.5, at most eight alive) found 144 (31 major, 94 minor, 19 nitpick), 143 valid and one invalid (x-036) on an independent classification (Fable 5.1); of the three user-facing findings x-065 (`abcd build --help` said the sub-agent ceiling is not counted, where it binds through `implement step` since ruling DR6) is fixed in 3a092b89, and x-010 and x-042 are minor and deferred; the 140 design-record findings go to the systematic brief pass iss-2609091956001547. Deferred out loud, to be captured after the tag as two records: `launch ship` reads the records at HEAD, so a spec close left uncommitted was silently missing from the cut rather than refused (the close was committed as 44a73e6f before the ingest), and `docs fidelity --apply` flags the drafted replacement while the landed sentence was hand-tidied, so .abcd/work/brief-review-flags.json carries the drafted wording for 10-docs, 15-prepare-this-repo, 22-site, 23-reading and 27-implement. Reason for deferring: neither changes what v0.13.0 ships, and the person's ruling was a release by morning.
- iss-2609020716236446The register rule (the GRILL domain in .abcd/rules.json and the itd-200 mode) tells an agent to address a product thinker in outcomes and choices and a technical facilitator in mechanism and ids, but it says nothing about ASSUMED KNOWLEDGE, and that is where explanations still miss. Observed during the 2026-09-02 design interview: a fork about repository ownership was first explained in terms of git's safe.directory, dubious-ownership refusals and the isolated git environment; the product thinker cannot be assumed to know git at all, while the technical facilitator can, and the same split holds for a merge queue, a worktree, a hook, an environment variable, a checksum, a symlink. The rule should carry an explicit knowledge floor per register: the product thinker knows the product's outcomes and the ordinary vocabulary of software use, not version control, shells, file permissions or CI; the technical facilitator knows those and the repo's record ids. An explanation for the product thinker names no tool and no mechanism the floor excludes, and where a concept is unavoidable it is introduced in one sentence in product terms (a notebook of pages, a lock, a name) before it is used. Worth deciding whether the floor is a list in the rule text, a glossary the rule points at, or both.
- iss-2609202055103741The interview rule makes the agent offer options that are not real choices, and asks a question where only one answer is sound. The GRILL domain in .abcd/rules.json says options widen and never recommend, no starred default, the null answer always available, and every question through the interactive tool one at a time. Followed literally on 2026-09-20 during the peer-listing interview, that produced a question whose three options were one sound answer beside two the record's own principle (loud-staging) already rules out, and the product thinker answered "why these options? Isn't 1 the obvious choice here?". The rule as written confuses two things: not steering the human (right) and manufacturing alternatives so a question has three of them (wrong). Ruled by the product thinker on 2026-09-20: the rule should not offer nonsense options; if there are no sensible alternatives, do not show them; if there is a single genuine answer, record it with the reason and do not put the question to the product thinker or the technical facilitator at all. Wanted: the GRILL domain reworded to say that a question is asked only where two or more answers are each defensible on the record, that the option set is exactly those answers plus the null answer, and that a decision with one defensible answer is recorded as a decision line naming why no question was asked; the itd-201 draft (every question asked one at a time, in plain language) is where the surface rule lives and should carry the same change.
- iss-2609202058058301A confirmation question must show what is being confirmed inside the question itself; the human cannot confirm what they cannot see. During the peer-listing planning interview on 2026-09-20 the agent listed the rewritten acceptance criteria in prose and then asked, through the interactive question tool, "are these thirteen criteria yours as written?"; the product thinker answered "which criteria? I cannot see them". The prose an agent writes between tool calls does not reliably reach the human; the question tool is the surface they read. The same shape recurred twice earlier in the session (an explanation of options given in prose, the question asked without it). Ruled by the product thinker: show the options, or the text to be confirmed, before asking for confirmation, in the question itself. Wanted: the GRILL domain in .abcd/rules.json and the interview steps on the intent surface page (step 8, walking every criterion; step 3, confirming the press release) say that the material a human is asked to accept, edit or strike is quoted in the question, never referred to; and the itd-201 draft (every question asked one at a time, in plain language) carries the same rule. Sibling of iss-2609202055103741 (no nonsense options): that one is about which options are offered, this one about the human seeing what they answer.
- iss-2610070637562567After the hook commands became one-line wrappers, a guard refusal still reaches the person as 'PreToolUse:<tool> hook error: [sh "${CLAUDE_PLUGIN_ROOT}/hooks/pre-tool-use.sh"]: <message>', framed as an error, because the guard blocks by exiting 2 with its message on stderr. Claude Code's hooks reference documents a structured alternative for PreToolUse: exit 0 with hookSpecificOutput.permissionDecision "deny" and permissionDecisionReason on stdout, which blocks the call (a question included) and hands the model only the reason; the command echo in front of an exit-2 message is not documented at all. Unverified here: the guide that reported it worked from summarised documentation.
- iss-2610100626211810An abcd question is refused with 'the mode reads managed' whenever the agent has not run abcd mode just before it, although the question's own chip ('Tech Q3', 'Product Q2') already names whom it is for. The mode is reset two ways: the asking rules tell the agent to set it back to managed after every answer, and the prompt hook resets it on the next prompt the session receives while a question is marked open, which in a turn of several questions can be a peer session's message or a message the person sends mid-turn (inferred from a refusal on 2026-10-10 after a peer message arrived; not yet reproduced). So an interview of several questions is refused intermittently, and the person sees the hook's error line each time (iss-2610070637562567 measured that every refusal reaches them framed as an error). The product thinker chose on 2026-10-10 to fix this in code first, before the general rewriter.
- iss-2610252224232577itd-201 promises GRILL's asking rules whenever an agent needs a human decision, at any stop for a verdict, but its own open question 1 (whether the recall words fire on every stop for a verdict, or the mode verb should inject the domain when a stop is parked) is unanswered, and nothing injects GRILL at a parked stop: neither the mode verb nor the mode store references the domain.
- itd-110The grill interview renders with clear structure and colour instead of a wall of prose: each question visually separated, the decision point, options, and the recommended answer distinctly styled, progress through the design tree visible, so the person being grilled always knows what is being asked and where they are
- itd-167The product thinker answers a stop in a medium they already use, and answers it whenever they get to it
- itd-168The product thinker sets how the system talks to them, and the defaults are plain language and options to choose from
- itd-169An agent loop that stops says who it is asking and what it needs, and never simply halts
- spc-2610030911534855a-person-can-run-abcd-s-interviews-in-a-plain-terminal
- spc-2610180914469489A session left to work on never stops while it has work