0019 — Two rungs are asked on one snapshot, and agreement drives

The decision

The founder's ladder governs. Two rungs are asked independently on one evidence snapshot; agreement is the decision; a disagreement is settled by Fable, once. It supersedes ADR-0016's Fable → Astra → human ordering and overrides the operator task criterion in ~/.claude/jobs/tasks/sess-propflow-b1/task.json.

  1. Fable and Astra are asked independently, concurrently, on the SAME evidence snapshot, with stable option IDs. Neither sees the other's answer. Concurrency is the mechanism; the claim is independence plus a frozen snapshot — sequential consultation lets the first answer anchor the second and turns a second opinion into an echo, and two calls that straddle a new commit or comment are not answering the same question. Options carry stable IDs so "they agree" is a string identity on a validated rec, never a prose comparison.

  2. Agreement drives. That is the decision. No human step, no confirmation, no queue entry.

  3. A disagreement gives Fable exactly ONE reconsideration, and its ACTIONABLE verdict wins. One reconsideration, not a loop. Actionable is load-bearing: a reconsideration that returns NEEDS HUMAN, flips under the options-reversed guard, or trips the class gate is not a ruling and goes to the human queue. A tie may end at a human; a coin-flip dressed as a ruling may not.

  4. Two seats answered by ONE model is a single-rung answer, and never reads as agreement. If Fable is unreachable, ADR-0016's fall-through means the first call is answered by Astra — comparing that to the --only-astra call would be Astra corroborating Astra, guaranteed self-agreement wearing the clothes of concurrence. It is ledgered single_rung and the raiser is told Fable never ran. (Already enforced: ~/.local/bin/puller:1439.)

  5. Three outcomes are NOT ordinary votes and are separated from a substantive answer, because each has a different remedy:

    Non-vote What it means What happens
    Unavailable no model rung could be reached — a capped seat, an expired bearer, a timeout, a reply with no json exit 2 → bounded retry, honour retry_after. exit 4 → durable; the decision link enters the human queue immediately. Never a refusal, never a dissent, and a missing second opinion never re-blocks a lane.
    Insufficient evidence a rung was reached and says it cannot settle this on what it was given human queue, with the receipt naming the gap. The raiser may raise a new question with the evidence attached; the original is never silently re-asked (ADR-0017 rule 7).
    Outside authority the question asks for an act no agent may take — posting as him, a production write, spending money, a promise to a person human queue, terminal. Checked before any spend.
  6. Authority restrictions cannot be overruled by model agreement. Two models agreeing that someone else's credentials should be used does not authorize it. Agreement is evidence about a choice; it is never a grant of permission. fable-decide's money/commitment class gate survives this ADR unchanged and fires regardless of agreement — it is the second layer behind the authority check, and it is broader than "authority": it overrides concurrence on money and commitments even when both rungs are clean and aligned. It was paid for on 2026-08-07 by the unit-607 renewal rate, RESOLVED by both passes at high confidence and wrong.

  7. A rung REACHED AND DECLINED is terminal, from either seat. Astra's clean answer never overturns Fable's refusal, and Fable's ruling never overturns Astra's. This is ADR-0016 rule 2 applied to both seats rather than to one, and it is the half of ADR-0016 this ADR most depends on.

  8. Exit codes are honoured as they already read. exit 0 RESOLVED, read answered_by; exit 2 ERROR — bounded retry, honour retry_after; exit 3 NEEDS HUMAN — terminal, never re-asked; exit 4 WALLED — durable, do NOT burn repeated paid calls against it; exit 64 USAGE — a typo, never retried.

  9. A decision link may enter the human queue IMMEDIATELY without waking the founder immediately. Entering the queue and waking a person are two acts, not one. Wake urgency keys off deadline or consequence — never off a provider outage. A weekly Fable wall must not deliver every question raised during it to a sleeping founder at once, each one looking exactly like a question a model considered and declined.

What dies and what carries

ADR-0004 requires a superseding record to carry three parts. This is part 1.

Superseded in ADR-0016 — these lines no longer state the rule:

⚠️ Every line number below is ADR-0016's own numbering, and the Status amendment in the same commit deliberately adds NO line so they stay true. The first draft of that amendment added a bullet and silently shifted lines 9, 57 and 70 by one — which would have made every citation here, and in PR #135 and ADR-0017, point one line off. Anything editing ADR-0016's header must preserve its line count or re-derive these citations.

Carried forward from ADR-0016, unchanged and load-bearing here:

Overridden — the operator task criterion. ~/.claude/jobs/tasks/sess-propflow-b1/task.json:3, verbatim: "You are gonna be the operator Right, you're gonna be driving all the sub-agents. You're gonna be driving the astras … and if something needs true help it should do the fable decision and if it still can't then you can raise a decision link".

⚠️ Read exactly, this is not a third consultation ladder at all, and it should stop being cited as one. The Astras in that sentence are workers being driven, not a rung being consulted; the only consultation named is "the fable decision"; and "if it still can't" is ambiguous between cannot be reached and was reached and declined — the one distinction ADR-0016 exists to keep apart. Under this ADR the Operator asks both rungs and raises a decision link only on a non-vote or a refusal. The task file is the Operator's live artifact and is not edited by this ADR; the override is recorded here and should be appended there by its owner.

Inventory of the superseded surface

ADR-0004 part 2. The inventory is what was missing when tmux "was deleted intentionally" yet drive-send.sh, a skill mode, and an authorizing memory entry all survived.

Surface State under this ADR Action
~/.local/bin/fable-decideTHE LADDER block (lines 47–60) Still accurate as the first call's internal behaviour. Its ordering is no longer the whole rule. Fence: the header must point at the CONCURRENCE block as the governing rule, not read as complete on its own.
~/.local/bin/fable-decideCONCURRENCE block (lines 94–118), --only-astra Shipped and correct. Same two-pass reversal, same class gate, no fabricated fallback block, answered_by: astra. None. This is the mechanism.
~/.local/bin/puller:1295–1344 — the concurrence rule Shipped and substantially this ADR. Ladder → --only-astra--no-astra tie-break. See the two divergences below.
~/.local/bin/puller:1439answered_by != "fable"astra-only Shipped; it is decision 4. Closes the Astra-vs-Astra self-corroboration hole. None. Keep a control on it.
~/.local/bin/puller:1486–1512 — the tie-break Diverges from decision 3 (below). Reconcile.
ADR-0016 Status line Says Accepted with no pointer forward. Amend to Superseded-by-0019 for the ordering clause; the reached/declined rule stays Accepted. A reader who opens 0016 alone must not act on line 9.
PR #135 / origin/decider-adr As written it recorded the same 22:33 statement without superseding ADR-0016 — its line 34: "ADR-0016's ladder is correct and it is not this." Merging both ladder statements would have made three live ladders four. Reconciled in this effort. #135 is re-scoped to the delivery rung and renumbered docs/adr/0020-a-ruling-goes-back-to-whoever-is-blocked.md. Its ladder adjudication is deleted — this ADR owns it, and 0020 restates none of it. What survives is the half this ADR does not cover: the last hop, delivering a ruling back to the parked raiser, and the measured zero-wake bug behind it.
PR #132 / origin/astra-relaunch-catalog Carried a file numbered 0018 while its heading and PR title both said ADR-0017, which origin/main already took. Reconciled in this effort. #132 holds 0018 — filename, heading and PR title now agree. The number line is settled: 0018 the Astra lane, 0019 this ADR, 0020 the delivery rung. Nothing is claimed twice.
docs/the-four-roles.md — "The Fable decider", the THERE ARE TWO MODEL RUNGS NOW block Stated the fall-through as the rule a reader should act on — a live restatement of superseded line 9. Fenced in this commit. The block now reads as the first call's internal behaviour and points here for the governing rule; the reached/declined half beside it is untouched, because this ADR rests on it.
SYSTEMS.md — the decision-ladder entry (job string, docs[]) job described the fall-through as the whole rule, and docs[] cited only ADR-0016 — so a reader who followed the catalog landed on superseded line 9 with no pointer forward. Fixed in this commit. job names the concurrence rule; docs[] carries this ADR alongside 0016.
SYSTEMS.md — the puller entry's "Ladder routing" paragraph Read "goes to fable-decide (Fable → Astra → a human)" — a fourth live statement of the superseded ordering, in the catalog rather than an ADR. Fixed in this commit.
Memory reference_fable_decide_flags_and_session_cap_exit2 Flag and exit-code pointers; unaffected by the ordering change. None.

Where this rule outruns the shipped code

Named rather than left as an implication, because the value of this ADR is that it is the one place the mechanics are right.

  1. The tie-break is asked FRESH, not shown both rationales. ⚠️ Decision 3 does not settle this either way, and this ADR does not settle it here. Decision 3 says only that a disagreement gives Fable one reconsideration whose actionable verdict wins; it is silent on what Fable is shown. "Shown both rationales" is the mechanics reviewer's specification (Astra, gpt-6-astra, named in Deciders), not the founder's words and not a numbered decision — an earlier draft of this paragraph attributed it to Decision 3, which does not contain it. It is recorded as an open mechanism question rather than a decided rule, because the two readings are different questions and the difference is not cosmetic. The shipped tie-break is fable-decide --no-astra — Fable asked again, cold (puller:1487, via RUNGS["fable"] at puller:1344). fable-decide is built around exactly this hazard, quoting Gera on 2026-08-02 (fable-decide:129): "If we tell them 'this is what we think, what do you think?' then it's just going to be 'oh yeah, I can see this and this.'" — and the file's own conclusion at line 132, "A model handed your conclusion agrees with it. A model handed ONE SIDE's evidence reaches that side's conclusion and sounds independent doing it — which is worse, because you now have false corroboration."

    The reconciliation, and it is the whole reason the reversal guard survives the tie-break: showing both rationales is admissible only because the reconsideration is still two concurrent options-reversed passes whose flip is reported as NEEDS HUMAN. Anchoring that a reordering can flip is caught. Anchoring that survives reordering is what the founder asked for — Fable ruling with the dissent in front of it rather than re-rolling the same dice. A reconsideration shown both rationales but run as a single pass would be the false-corroboration failure with none of the guard, and must not ship.

  2. The three non-votes have no structured taxonomy on the receipt. needs_human_why (fable-decide:401) is free text, and the class gate returns a reason string (fable-decide:902). Insufficient evidence and outside authority are therefore distinguishable by a reader but not by a caller. Decision 5 gives them different remedies, so this gap is real: until a field carries it, the separation is enforced by the human-only ACTION pattern list running before any spend, and by nothing else.

  3. Wake urgency is not yet keyed to deadline or consequence. Decision 9 is a rule about a queue that currently has one urgency. Entering the queue is shipped; the urgency split is not.

The cost, stated plainly

This ladder is more expensive than either thing it supersedes, and that is a deliberate trade, not an oversight.

Model calls Passes (each call is two, options reversed)
ADR-0016's ladder, healthy day 1 2
This ADR, agreement 2 4
This ADR, disagreement 3 6

Count passes, not consultations — fable-decide runs every call twice with the options in opposite order, so the headline "two consultations" is four model runs, and three is six. Bounded twice on disk: a per-tick question cap (PULLER_CONCUR_CAP, default 1) and a per-day invocation cap in an append-only ledger, and an unreadable spend ledger holds routing for the day — a job that cannot account for its spending does not get to spend.

The justification is that the founder is the scarce resource, not the tokens. On 2026-09-10 the fleet spent ninety minutes with five questions parked reporting "pending Fable" while a healthy Astra sat unasked, and a human had to be the one to notice. Twice that evening Gera noticed a problem before the Operator did. Doubling a model bill to stop doing that is not a close call. Said here rather than left for someone to discover from an invoice — and the honest version of the trade is that the third call, the tie-break, is the one that could grow without anyone watching, which is why the caps are per-tick and per-day rather than per-question.

Alternatives considered