Development record
Three roles, who each artefact addresses, and when the loop stops
Context
The roles page describes a two-person team of a product thinker and a technical facilitator, and names automating the facilitator as an aim. That description no longer matches how the framework is meant to work, and the mismatch is not cosmetic: it decides what the machinery is allowed to do without asking.
Three defects follow from the two-role description.
A decision that belongs to one role gets argued as if it belonged to the other. Treating both roles as "the human" makes every facilitator duty look like something that must wait for a person. That reasoning was used, in this repository, to argue that closing a specification after its implementation landed had to stay manual because shipping an intent is a maintainer decision. It is not: declaring a promise delivered is facilitator work, and the argument only looked sound because the two roles were collapsed into one word.
An artefact promised to the product thinker is written for an engineer. The
roles page promises the product thinker a moment of reading the verdict on
whether the why was delivered. The verdict that exists is a per-criterion
acceptance JSON whose every claim carries a file:line evidence pointer. It is
the correct artefact for a facilitator and unreadable for the role it is
promised to.
Nothing says when the agents may proceed alone. Without a rule, every gate is a candidate for a human wait, and the framework's premise reverses: the human becomes the bottleneck the framework exists to remove.
Decision
The team is three roles, not two. A product thinker (always human) states what should exist, why, for whom, and what good looks like. A technical facilitator translates that into work agents can execute, runs the review and audit machinery, and answers when the loop stops. A team of AI agents implements. The facilitator is the only role whose occupant varies.
The facilitator is AI by default and human on activation. Activation is a mode, not a rewrite: it changes what waits for approval, and nothing else. Every gate declares its behaviour in both modes, because a gate that only makes sense with a person watching is a gate that fails silently when nobody is.
The agents run autonomously and stop only to obtain a verdict. A stop is an event with an addressee and a question, never an unexplained halt. Anything that is a step in the loop rather than a judgement is performed, not queued for someone.
Escalation reaches the product thinker only for what they can answer. That is: what should exist, whether what was delivered matches it, and trade offs that change the design. Everything else stops at the facilitator, including every question about evidence, technique, and whether a criterion was verifiable at all. A stop addressed to the product thinker that the product thinker cannot answer is a defect in the stop, not a failure of the reader.
Anything addressed to the product thinker is written in a register the
product thinker controls. The register is a configured profile with defaults
that hold until its owner changes them, and its owner is the product thinker,
not the facilitator: A reader who cannot follow the answers they are given must
be able to change how they are addressed without asking anyone. The defaults
are plain language, no filler, at least one concrete example drawn from the
product under construction rather than from the framework, trade offs stated
concretely with their options named, and selection over composition, so the
ordinary way to answer is to choose among options rather than to compose prose.
No file:line pointers and no internal identifier standing alone. An artefact
may carry a facilitator-addressed body and a product-thinker-addressed summary;
what it may not do is address one role in the register of the other.
Consequences
Addressee becomes a property of an artefact rather than an assumption about its reader, and a checkable one: presence of an example, absence of location pointers, and a bounded vocabulary are all mechanical. Because the register is configured rather than fixed, the check reads the profile rather than a constant, and a repository whose product thinker has widened or narrowed it stays conformant on their terms.
Every stop that reaches the product thinker owes a set of options. A question that can only be answered in free prose is either mis-addressed or not yet thought through, and the requirement surfaces that while it is still cheap to fix.
A stop addressed to the product thinker is a durable artefact, not a prompt on somebody's terminal. Its answer may arrive later, from a person who was not present when it was raised, through a surface that is not the command line: A stop therefore serialises whole, carries its options with it, survives the session that raised it, and is resumable by whatever answers it. Nothing in the loop may assume the product thinker is watching, and a stop that only exists as a question printed to a terminal does not satisfy this. The synchronous command-line prompt is the first implementation of that contract, not the contract.
Addressee is not surface. The command line is the facilitator's surface, and a human facilitator works there always; the product thinker does not work there at all. The two are nonetheless often in the same room or the same call, with the facilitator reading a question aloud and entering the answer given back. A product-thinker-addressed artefact therefore keeps its register even when it is rendered on a terminal, because the person it is written for is listening rather than reading. The register follows who is being asked, never where the text appears.
The intent-fidelity verdict gains a second face. Its per-criterion evidence stays as it is, for the facilitator; a plain-language summary of whether the why was delivered is what the product thinker reads.
Work that no role must judge stops waiting. Closing a specification once its implementation has landed is the immediate case.
Responsibility does not follow the work. The product thinker remains accountable for software they will not read, and the facilitator that reviews it may itself be a machine. This ADR settles who acts; it deliberately does not settle who answers for the result. That question is open in RFC-3.
Alternatives rejected
Keep two roles and treat automation as an aim. Honest about the present, but it leaves every facilitator duty arguable as a human gate, which is the defect that produced the specification-closing mistake.
Make the facilitator always human. Removes the ambiguity and the framework's point together: the product thinker could not run the process alone, which is the thing being built.
Let the agents escalate freely to whoever is available. Cheapest to implement and the fastest way to teach a product thinker that the stops are not worth reading, because most of them would be questions they cannot answer.
Amendments
- adr-2610150603484802
amends the default: a fresh install's facilitator is a person, and a
repository becomes
autoonly by a deliberate setting (product thinker, 2026-10-15, under the security standard rule).
Frontmatter
| id | adr-2609151528057260 |
|---|---|
| type | adr |
| status | accepted |
| date | 2026-08-29 |
.abcd/development/decisions/adrs/2609151528057260-three-roles-who-each-artefact-addresses.md
open on GitHub ↗ · commit history ↗
Referenced by2
- adr-2609151528057131abcd owns the product thinker's surfacerelated
- adr-2610150603484802A fresh install's facilitator is a person until the repository says autorelated
mentions11
- dcn-26091500000000092026-09-15 — The roles and loopback design workstream lands on main, executing the 2026-09-01 ruling that the branch waits for the mint verb and takes its ids at the merge. `abcd decide` now exists, so the two decisions the branch numbered 0055 and 0056 are re-minted as adr-2609151528057260 (three roles, who each artefact addresses, and when the loop stops) and adr-2609151528057131 (abcd owns the product thinker's surface), content, status and date unchanged; every citation that meant the roles decisions is re-pointed (rfc-3, the phase-8 page, the roles page, the out-of-scope list, three intent drafts, and iss-168, whose 29 August extension cited them by the colliding numbers), and main's own 0055 and 0056 keep their ids. The branch's twelve hand-numbered intent drafts (itd-165 to itd-176) collide with nothing and keep their ids, as adr-45's grandfathering allows. Occasion: itd-200 shipped today refining the two roles decisions, so their citations on main pointed at the wrong records until this landed.
- dcn-26092200000000032026-09-22 — The control-programme idea is REFRAMED, not adopted as put (product thinker, after the ideate gauntlet; research/notes/2026-09-22-ideate-abcd-operator-console.md). Two kill attempts were fatal to the idea as stated: it named the product thinker as the configurer of operator-register material, which adr-2609151528057260 bars, and it made harness-less operation the destination, inverting the host-delegated boundary whose reversal itd-2609201916151817 records as opt-in only. The reframing, adopted: an operator console SERVED BY THE BINARY over local web (no new dependency), which is also the resident process that hosts the opt-in process driver, with a separate product-thinker pane in their own register (open stops, the plain-language verdict, the pace) — the web page itd-167 already decided on; configuration stays operator-side; many repositories waits for a registered-checkout store; a localhost surface that accepts secrets needs a per-launch token; the whole sequenced after the runner and routing intents; and it must carry a falsifier, since no evidence exists that a GUI control plane beats a CLI plus a status page. Ruled with it: where abcd runs as the binary with no host session, the fallback is a HOST THE OPERATOR CONFIGURED (their main connector), never nothing; and EVERY fall back to the host is recorded — a receipt per event and a count per runner and per role in the run record — as intel on what to improve (itd-2609201916056194, planned; itd-22 widened so that "any harness" includes none).
- iss-168abcd's presence should be visible in the host harness's status line / command line: a managed repo shows an 'abcd-managed' indicator (and possibly guard health) so the user can tell at a glance whether the current session is under abcd management without running a command. Needs a per-host adapter (e.g. a statusline hook) with the usual basics-built-in stance.
- iss-2608290822140563The fidelity audit runs after the merge, so its verdict arrives when the cheap remedies are already gone, and the code refuses any other ordering: the ingest rejects an intent that is not in the shipped bucket, and the emit fires from the ship move itself, so an intent cannot be audited against the candidate diff on a branch. The stated reason is sound as far as it goes, that a report-only review must never un-ship what has already shipped, but it answers a question that only arises because the audit was placed after the merge in the first place. Audited before the merge, a failing criterion has three cheap answers: fix the branch, revise the promise before making it, or decline to merge. Audited after, it has none, because there is no un-ship path and the code is on the trunk. The counter-argument is real and should not be waved away: a branch is not the tree that lands, since the merge queue lands merge commits and a semantic conflict with a concurrently merging change can alter the delivered reality after the verdict was formed, so the post-merge audit judges what is actually true while a pre-merge one judges a candidate. The shape that gets both is to gate on the pre-merge verdict and bind it to a content hash of the tree it judged, then check deterministically after the merge that the landed content still matches, reopening the receipt only on a mismatch, which costs one hash comparison rather than a second audit and reuses the content-addressing the transcript store already relies on. Whatever the ordering, the model's verdict must stay a proposal and a human acknowledgement must remain the gate, because a non-deterministic verdict that can block a merge on its own is a trust step this repository has not taken and would train people to route around the gate.
- iss-2610251558360735docs/explanation/rationale.md:3 says abcd's bet is a small team of two roles; docs/explanation/roles.md:3 says abcd is built for three roles, per ADR-2609151528057260, whose Context retires the two-person-team description.
- iss-2610252215090992glossary/core/technical-facilitator.md:4 and :25 attribute 'the facilitator is a mode, not a person' to draft itd-97; adr-2609151528057260:52 accepted it, and adr-2610150603484802:34-42 set a fresh repository's facilitator to a person. docs/explanation/roles.md:3 and :23 still say the facilitator 'is an AI by default', against that amendment.
- itd-97The Facilitator Is a Mode, Not a Person
- itd-165A failed fidelity verdict becomes work somebody can see
- itd-167The product thinker answers a stop in a medium they already use, and answers it whenever they get to it
- itd-169An agent loop that stops says who it is asking and what it needs, and never simply halts
- itd-2610150602547271The facilitator's mode gates the merge