Experimental. AI Council is not yet validated by external users. API costs apply per consultation.
ai-council
Council-first — try the council BEFORE the user, on these classes
A DESIGN DECISION THE AGENT CANNOT SETTLE FROM THE TREE GOES TO THE COUNCIL
FIRST, NOT TO THE USER FIRST. THE USER IS THE ESCALATION, NOT THE DEFAULT.
NEVER PRESENT A COUNCIL VERDICT THAT WAS NOT REACHED. AN INCONCLUSIVE RUN
IS REPORTED AS INCONCLUSIVE, AND WHATEVER YOU DECIDE INSTEAD IS LABELLED
OWN ANALYSIS.
Interrupting the user is the expensive path: it costs a round trip and their
attention, and on a question two models could have settled it buys nothing they
wanted to be asked. So the ordering is tree → council → user, and the
council leg is the one that gets skipped.
Classes that go to the council first — each is a judgement with a real
trade-off and no answer in the tree:
| Class |
Example |
| Competing implementations of one feature |
two sessions shipped the same phase; discard, overwrite, or merge |
| Which of N designs, all defensible |
four declared types with a derived fifth, or five declared |
| Reopening a recorded decision |
an ADR or honest-null blocks a change that now looks net-positive |
| Scope re-cut inside an authorized task |
this phase splits into two, or absorbs the next |
| Is the evidence sufficient to conclude |
n=1 measurement, a proxy metric, an unreplicated finding |
Classes that still go straight to the user, and the council never substitutes
for them: anything behind the Hard Floor
(non-destructive-by-default) ·
spend · a scope EXPANSION beyond what was authorized · a decision whose inputs
only the user holds (a preference, a deadline, a business constraint) · the
high_impact and user_required classes, which
ask-when-uncertain routes to the user by
Iron Law. A council cannot consent on the user's behalf, and asking it to is not
autonomy, it is laundering.
When the council cannot answer
Measured 2026-08-17: a run returned 0 of 2 seats, both cli_quota_exhausted,
with the counters at 72/50 and 99/50. The CLI reported it correctly as
INCONCLUSIVE — DEGRADED and did not print a quorum it had not reached. Three
things follow, and the first is the one under pressure:
- Never dress your own verdict as the council's. A fan-out, a solo read, or
your own judgement is a legitimate substitute only when named as such —
the boundary
council-availability
states.
- Do not bounce to the user just because the council failed. An
unreachable council does not upgrade a decidable question into a
user-required one. Decide it, label it own analysis, state the reason the
council was unavailable, and name what would change the answer.
- Escalate only if it is genuinely undecidable without them — the two
options are close AND the cost of being wrong is high AND nothing in the tree
separates them. Then say the council was attempted and why it failed, so the
user is not asked to arbitrate something they will assume was already tried.
agent-config council:status is free and answers availability; council_cli estimate <file> is free and answers parse-and-cost. Run both before concluding
the council is not an option — and note the question goes in a file, since
prose passed as an argument overflows the argument limit.
When to use
- The host agent has drafted a roadmap, plan, or design and wants an
external critique that is not biased by its own framing.
- The user asks "what would Claude / GPT say about this?" or invokes
/council.
- A PR diff or commit range needs a second-opinion review beyond the
internal four-judge pass.
- A free-form proposal benefits from being challenged by an outside
reviewer before it calcifies into work.
Do NOT use when:
- The decision is internal-only and budget matters more than diversity
of opinion → use
subagent-orchestration (in-session, no network,
no money).
- The task is iterated build → review → fix with full repo access by a
single strong model (the reviewer needs to see the working diff and
return actionable fixes) → that is team mode (
/team), the depth
complement to the council's breadth. The council is artefact-only and
never grants the external model repo access or the host's framing; team
mode deliberately does the opposite. Neither replaces the other.
- The artefact contains secrets that cannot be redacted with the
bundler's pattern set → ask the user before sending.
- The user has not configured any council member → state that and stop;
do not silently fall back to anything. But "not configured" is
decided by the CLI, never by the project tree — see the rule below.
Configuration is ALWAYS user-global
THE COUNCIL CONFIG IS ALWAYS USER-GLOBAL. NEVER SEARCH THE PROJECT FOR IT.
THE ABSENCE OF A COUNCIL FILE IN A PROJECT SAYS NOTHING ABOUT WHETHER
THE COUNCIL IS CONFIGURED. ONLY THE CLI / RESOLVER DECIDES THAT.
The council config lives at one place only:
~/.event4u/agent-config/settings/.ai-council.yml (per
ADR-104,
superseding ADR-093). It is configured once per developer and works
in every project, worktree, and CWD — including consumer repos that
carry none of this package's internals.
Before claiming the council is unavailable, you MUST run the CLI
(council:estimate) and read its exit code + message. Never conclude
"council not configured in this project" from missing project files:
scripts/ai_council (a package-internal directory, absent from every
consumer repo), .agent-settings.yml (the legacy block was removed in
ADR-093), or a project-local .ai-council.yml (never read — ADR-104).
Eyeballing the project for any of these and then deciding solo — instead
of running the resolver — is the canonical failure ADR-104 exists to stop.
The only escape from the user-global location is $AI_COUNCIL_CONFIG, an
explicit absolute path for tests / power users — still not a project search.
When NOT to invoke — necessity self-check
The Phase 6 necessity classifier (see
ai-council-config § Necessity classifier)
runs as a pre-flight gate inside the CLI and skips the council when
the prompt looks like routine work. Route around it BEFORE the gate
fires so the user never pays the classifier-pause cost on a request
that obviously did not need a council in the first place.
Skip the council and stay in-session for:
- Bugfix shape — stack trace, error, crash, failing test, "broken",
regression. Use
systematic-debugging or bug-investigate.
- Syntax / format / lint —
typo, formatting, lint, indent,
import order, simple rename. Use the language skill directly
(php-coder, eloquent, nextjs-patterns, etc).
- Single-file implementation — "this function", "this method",
"this file", "one-liner", "small change", "add a getter". Use the
language skill directly.
- Documentation lookup — "what is X", "how does Y work", "example
of Z", "syntax of W". Use
codebase-retrieval or the docs skill,
never the council.
Invoke the council when:
- Architectural / structural — system boundaries, coupling,
refactor strategy, migration plan, rewrite vs redesign.
- Multi-axis trade-off — stakeholders disagree; competing
alternatives need weighing; "pros and cons" is the actual ask.
- Strategic / direction — "should we …", "shall we …", roadmap
shape, long-term technical direction.
- Explicit ambiguity — the user wrote "unsure / uncertain /
ambiguous / second opinion / sanity check".
Agent orchestration MUST call council_cli with
--invocation agent so the gate can skip silently on routine
requests. User-typed /council keeps the default
(--invocation user_explicit); the user gets the educational message
--proceed-anyway override path. Mode block ignores
--proceed-anyway by design — cost-strict opt-in.
Goal
Bring in independent external models to critique a project
artefact. Independent means: the council members never see the host
agent's reasoning, internal state, or framing language — only the
artefact (roadmap, diff, prompt, file set) plus a neutral system
prompt that asks them to think on their own merits.
Neutrality guidelines (Iron Law)
THE COUNCIL NEVER SEES THE HOST AGENT'S ANALYSIS, REASONING, OR FRAMING.
ROUND 1 SEES THE ARTEFACT + THE NEUTRAL SYSTEM PROMPT. NOTHING ELSE.
ROUND 2+ MAY SEE PRIOR PEER REPLIES — ANONYMISED ONLY, NEVER ATTRIBUTED, NEVER THE HOST'S.
THE HOST AGENT IS THE CONVENER, NEVER A REVIEWER.
If you find yourself wanting to "frame" the artefact for the council,
stop. Framing is exactly what kills the second-opinion value. Use the
unbiased system prompts in scripts/ai_council/prompts.ts; do not
roll your own.
The host runs the council and synthesises convergence — it is the
convener, not a reviewer. The reviewer-ban is structural: the host
wrote (or framed) the artefact and cannot critique it independently.
Anonymising the host as "Reviewer C" is worse than excluding it — the
user is told they got an outside vote when they did not. Externals
down → surface and skip; never substitute the host as a reviewer.
Modes
This skill is a router head. Everything above is true in every mode and stays
here: which decision classes reach the council at all, what to do when it cannot
answer, the user-global configuration fact, the necessity self-check, and the
neutrality Iron Law. So does the output format below — it is an ordered MUST that
a pointer cannot carry. The operational manuals live in references/; load the
one the task calls for, not the set.
| Task |
Mode body |
Covers |
| Pick an execution mode, or handle a degraded one |
references/execution-modes.md |
Manual-mode and CLI-mode UX, the cost-gate bypass for non-billable members, degradation modes |
| Run a session end to end |
references/procedure.md |
The neutrality context-handoff, the numbered procedure, the convener-skeptic stance, why a mechanism claim needs a probe rather than a second opinion, what this is NOT |
| Place the artefact, or render the synthesis |
references/output-and-synthesis.md |
Output path convention with its forbidden and exempt sets, lens-aware synthesis templates, the --prose-synthesis escape hatch, renderer lens resolution |
| Estimate or gate the spend, or check what is redacted |
references/cost-and-redaction.md |
Redaction expectations, cost awareness, the pre-call estimate format, the stale price-table gate, the mid-flow overrun callback |
| Multi-round debate, deep tier, advisors, replay, low-impact fast-path |
references/advanced-modes.md |
rounds:N debate, the deep-reasoning tier and its manual-mode parity, /council debate, Karpathy peer-review, thinking-style advisors, the decision-replay artefact, the Lightweight-QA fast-path with its own Iron Law and output markers |
Two of those bodies carry obligations a pointer cannot summarise: the
output-path convention is enforced by CI, and the Lightweight-QA fast-path
markers are required verbatim by
fast-path-marker-visibility.
Load the body before acting in either mode rather than working from memory of it.
Procedure
- Inspect first. Run the necessity self-check above and read the artefact
you are about to hand over. It is cheaper to not convene than to convene and
discard.
- Confirm availability —
agent-config council:status, never an inference
from the project tree (see § Configuration is ALWAYS user-global).
- Pick the execution mode from
references/execution-modes.md.
- Run the session per the numbered procedure in
references/procedure.md, under the neutrality
Iron Law above — the preamble is not optional and the question is never
authored toward a conclusion.
- Estimate the spend before the call per
references/cost-and-redaction.md.
- Write the artefact in the output format below, at the path
references/output-and-synthesis.md
fixes, then apply the convener-skeptic verdict yourself — convergence is not
correctness.
Output format
Every council reply MUST contain, in this order:
- Header line with mode, member count, and total token cost.
- One section per member, titled
### <provider> · <model>,
containing the member's verbatim output.
- Convergence / Divergence summary — bullet list, every claim
attributed by provider name. When the convergence settles a
question as "don't relitigate" / locked / a durable disposition,
the summary MUST record two additional lines, per
decision-revisit-gate:
scope: (exactly which mechanism or question is settled — narrow
enough that a superficially similar but different proposal is not
silently covered) and revisit-if: (at least one concrete condition
that reopens it — new evidence class, model-generation or tooling
change, an N-th blocked encounter, or an age threshold). A lock
recorded without both lines is an authoring error. Also state
whether the disposition is settled-by-evidence (an eval ran) or
settled-by-decision (a maintainer call) — the latter is cheaper
to reopen and should say so.
- Host verdict per finding — one row per finding with
accept
/ accept-with-modification / reject / needs-input plus a
one-line reason citing host evidence (file:line, ADR, contract).
See Critical evaluation above.
- User-facing options — numbered block per
user-interaction,
carrying the host verdict in each option, with "discard council
input" always present as an option.
The host agent NEVER ships council output as its own reasoning, and
NEVER ships the host verdict as council output. Provider attribution
stays visible in the per-member sections; host verdicts stay
attributed to the host.
Tally-vs-reasoned boundary. Option-level decisions (which design /
approach to take) use the council stance tally — the Convergence /
Divergence summary aggregates member stances across the option set.
Finding-level review (is this specific bug/line real) uses the
reasoned validation in code-review
(each finding stands on its own traced reason, never a vote count). The
two never cross-apply — no resolving a design option by
reasoned-validating one member's take, no resolving a bug finding by
counting council votes. Mirrored in code-review so the boundary is
grep-checkable from both sides.
Do NOT
- Do NOT paraphrase council output into the host agent's voice — strip
attribution and you've stripped the value.
- Do NOT surface council findings to the user without a host verdict
— convergence ≠ correctness, and the user deserves the agent's
reasoned filter, not a raw forward.
- Do NOT pre-warm the council with the host agent's analysis or
identity — that primes the reviewer and collapses diversity.
- Do NOT silently truncate a too-large bundle — surface the size and
ask for narrower scope.
- Do NOT spend against an unbounded budget without asking — a billable
member with neither
max_total_usd nor daily_limit_usd set has no
ceiling, and autonomy is not a ceiling.
- Do NOT reuse SDK clients across invocations — re-load keys via
load_*_key() each call.
Gotchas
Real failure modes seen in the wild:
- Bias-by-framing: agent pastes "I think X is the right answer,
what do you think?" → council rubber-stamps. Symptom: 100%
convergence, zero unique insight. Fix: send artefact only, neutral
preamble, no host reasoning.
- Silent budget overrun:
cost_budget_exceeded mid-fan-out, agent
retries one member to "complete" the council. Result: skewed sample,
hidden spend. Fix: surface partial result, stop, ask user.
- Identity leak: roadmap text contains "the agent decided…" —
reviewer infers host model and mirrors it. Fix: redact host-agent
identity strings before bundling.
| Anti-pattern |
Why it's wrong |
Correct approach |
| "Pre-warm" the council with the agent's own analysis. |
Bias attack — collapses the reviewer to a yes-man. |
Send the artefact text only. |
| Paste the host-agent identity ("I am Augment / Claude Code…") |
Identity primes the reviewer's model. |
Neutrality preamble in prompts.ts already handles this. |
| Silently truncate a too-large bundle. |
Misleads the reviewer into thinking they saw the whole thing. |
Bundler raises BundleTooLarge; surface and ask for narrower scope. |
| Reuse the same SDK client across calls without re-loading the key. |
Leaks the key in long-lived process state. |
Each invocation builds fresh clients from load_*_key(). |
| Spend against a billable member with no configured ceiling because "the council is standing-authorized". |
Standing authorization is a bound the user set once, not a blank cheque. No ceiling = nothing was authorized. |
Surface the estimate and ask, exactly in that one case (Procedure § 3). |
| Re-ask per invocation once a ceiling exists. |
The ceiling already carried the decision; re-asking is the approval burden this default removed. |
Fan out; let on_overrun ask on breach. |
| Forward council convergence to the user as numbered options without a host verdict. |
Convergence ≠ correctness; the council never saw the codebase. |
Apply the Critical evaluation lens; tag every finding accept / accept-with-modification / reject / needs-input with one-line reason. |
| Reject a finding on preference, not evidence. |
"I don't like this" is not a verdict. |
Cite the file, line, ADR, or contract that justifies the rejection — or surface as needs-input. |
| Paraphrase council output into the host's own analysis to defend a verdict. |
Strips attribution, breaches direct-answers no-invented-facts. |
Verdict cites host evidence (file:line); council output stays attributed in the per-member sections. |
Redaction and cost
Both moved verbatim to
references/cost-and-redaction.md: what the
bundler's redaction pass strips, the cost-awareness rules, the pre-call estimate
format, the stale price-table gate, and the mid-flow overrun callback. A breach
without on_overrun short-circuits the remaining members — surface the partial
result and ask, never retry silently.
Advanced modes
Multi-round debate, the deep-reasoning tier, Karpathy peer-review, thinking-style
advisors, the decision-replay artefact and the Lightweight-QA fast-path moved
verbatim to references/advanced-modes.md. Each
is opt-in and each prices higher than a single round; none is a default.
See also
/council command — the user-facing entry point.
subagent-orchestration skill — internal multi-agent variant (no
network, no spend, but no diversity of weights either).
/team command — collaborative cross-model review WITH repo access
(depth); council is breadth on an artefact, team is one strong model in
the repo. Different mechanism, not a competitor.
scripts/ai_council/prompts.ts — neutrality preamble + per-mode
system prompts.
scripts/ai_council/advisors.ts — replace-mode planning + persona
resolution.
scripts/ai_council/bundler.ts — redaction pattern set + size
guard.
docs/customization.md § ai_council.* — settings reference.
docs/contracts/ai-council-config.md § advisors — schema + precedence
contract.
docs/contracts/ai-council-config.md § Decision-replay artefact —
Phase 9 audit trail contract + redaction modes.
scripts/ai_council/replay.ts — pure projection renderer (no model
calls).
1---2name: ai-council3description: Use when polling external AIs (OpenAI, Anthropic) outside the host session for a neutral second opinion on a roadmap, diff, prompt, or file set — or 'cross-check with another model'.4---56> **Experimental.** AI Council is not yet validated by external users. API costs apply per consultation.78<!-- cloud_safe: degrade -->910# ai-council1112## Council-first — try the council BEFORE the user, on these classes1314```15A DESIGN DECISION THE AGENT CANNOT SETTLE FROM THE TREE GOES TO THE COUNCIL16FIRST, NOT TO THE USER FIRST. THE USER IS THE ESCALATION, NOT THE DEFAULT.17NEVER PRESENT A COUNCIL VERDICT THAT WAS NOT REACHED. AN INCONCLUSIVE RUN18IS REPORTED AS INCONCLUSIVE, AND WHATEVER YOU DECIDE INSTEAD IS LABELLED19OWN ANALYSIS.20```2122Interrupting the user is the expensive path: it costs a round trip and their23attention, and on a question two models could have settled it buys nothing they24wanted to be asked. So the ordering is **tree → council → user**, and the25council leg is the one that gets skipped.2627**Classes that go to the council first** — each is a judgement with a real28trade-off and no answer in the tree:2930| Class | Example |31|---|---|32| Competing implementations of one feature | two sessions shipped the same phase; discard, overwrite, or merge |33| Which of N designs, all defensible | four declared types with a derived fifth, or five declared |34| Reopening a recorded decision | an ADR or honest-null blocks a change that now looks net-positive |35| Scope re-cut inside an authorized task | this phase splits into two, or absorbs the next |36| Is the evidence sufficient to conclude | n=1 measurement, a proxy metric, an unreplicated finding |3738**Classes that still go straight to the user, and the council never substitutes39for them:** anything behind the Hard Floor40([`non-destructive-by-default`](../../rules/non-destructive-by-default.md)) ·41spend · a scope EXPANSION beyond what was authorized · a decision whose inputs42only the user holds (a preference, a deadline, a business constraint) · the43`high_impact` and `user_required` classes, which44[`ask-when-uncertain`](../../rules/ask-when-uncertain.md) routes to the user by45Iron Law. A council cannot consent on the user's behalf, and asking it to is not46autonomy, it is laundering.4748### When the council cannot answer4950Measured 2026-08-17: a run returned **0 of 2 seats**, both `cli_quota_exhausted`,51with the counters at 72/50 and 99/50. The CLI reported it correctly as52`INCONCLUSIVE — DEGRADED` and did not print a quorum it had not reached. Three53things follow, and the first is the one under pressure:54551. **Never dress your own verdict as the council's.** A fan-out, a solo read, or56 your own judgement is a legitimate substitute **only when named as such** —57 the boundary [`council-availability`](../../rules/council-availability.md)58 states.592. **Do not bounce to the user just because the council failed.** An60 unreachable council does not upgrade a decidable question into a61 user-required one. Decide it, label it own analysis, state the reason the62 council was unavailable, and name what would change the answer.633. **Escalate only if it is genuinely undecidable without them** — the two64 options are close AND the cost of being wrong is high AND nothing in the tree65 separates them. Then say the council was attempted and why it failed, so the66 user is not asked to arbitrate something they will assume was already tried.6768`agent-config council:status` is free and answers availability; `council_cli69estimate <file>` is free and answers parse-and-cost. Run both before concluding70the council is not an option — and note the question goes in a **file**, since71prose passed as an argument overflows the argument limit.7273## When to use7475* The host agent has drafted a roadmap, plan, or design and wants an76 **external** critique that is not biased by its own framing.77* The user asks "what would Claude / GPT say about this?" or invokes78 `/council`.79* A PR diff or commit range needs a second-opinion review beyond the80 internal four-judge pass.81* A free-form proposal benefits from being challenged by an outside82 reviewer before it calcifies into work.8384Do NOT use when:8586* The decision is internal-only and budget matters more than diversity87 of opinion → use `subagent-orchestration` (in-session, no network,88 no money).89* The task is **iterated build → review → fix with full repo access by a90 single strong model** (the reviewer needs to see the working diff and91 return actionable fixes) → that is **team mode** (`/team`), the depth92 complement to the council's breadth. The council is artefact-only and93 never grants the external model repo access or the host's framing; team94 mode deliberately does the opposite. Neither replaces the other.95* The artefact contains secrets that cannot be redacted with the96 bundler's pattern set → ask the user before sending.97* The user has not configured any council member → state that and stop;98 do not silently fall back to anything. **But "not configured" is99 decided by the CLI, never by the project tree** — see the rule below.100101## Configuration is ALWAYS user-global102103```104THE COUNCIL CONFIG IS ALWAYS USER-GLOBAL. NEVER SEARCH THE PROJECT FOR IT.105THE ABSENCE OF A COUNCIL FILE IN A PROJECT SAYS NOTHING ABOUT WHETHER106THE COUNCIL IS CONFIGURED. ONLY THE CLI / RESOLVER DECIDES THAT.107```108109The council config lives at one place only:110`~/.event4u/agent-config/settings/.ai-council.yml` (per111[ADR-104](../../../docs/decisions/ADR-104-ai-council-config-global-only.md),112superseding ADR-093). It is configured **once per developer** and works113in **every** project, worktree, and CWD — including consumer repos that114carry none of this package's internals.115116Before claiming the council is unavailable, you MUST run the CLI117(`council:estimate`) and read its exit code + message. **Never** conclude118"council not configured in this project" from missing project files:119`scripts/ai_council` (a package-internal directory, absent from every120consumer repo), `.agent-settings.yml` (the legacy block was removed in121ADR-093), or a project-local `.ai-council.yml` (never read — ADR-104).122Eyeballing the project for any of these and then deciding solo — instead123of running the resolver — is the canonical failure ADR-104 exists to stop.124125The only escape from the user-global location is `$AI_COUNCIL_CONFIG`, an126explicit absolute path for tests / power users — still not a project search.127128## When NOT to invoke — necessity self-check129130The Phase 6 necessity classifier (see131[`ai-council-config § Necessity classifier`](../../../docs/contracts/ai-council-config.md))132runs as a pre-flight gate inside the CLI and skips the council when133the prompt looks like routine work. Route around it BEFORE the gate134fires so the user never pays the classifier-pause cost on a request135that obviously did not need a council in the first place.136137Skip the council and stay in-session for:138139* **Bugfix shape** — stack trace, error, crash, failing test, "broken",140 regression. Use `systematic-debugging` or `bug-investigate`.141* **Syntax / format / lint** — `typo`, `formatting`, `lint`, `indent`,142 `import order`, simple rename. Use the language skill directly143 (`php-coder`, `eloquent`, `nextjs-patterns`, etc).144* **Single-file implementation** — "this function", "this method",145 "this file", "one-liner", "small change", "add a getter". Use the146 language skill directly.147* **Documentation lookup** — "what is X", "how does Y work", "example148 of Z", "syntax of W". Use `codebase-retrieval` or the docs skill,149 never the council.150151Invoke the council when:152153* **Architectural / structural** — system boundaries, coupling,154 refactor strategy, migration plan, rewrite vs redesign.155* **Multi-axis trade-off** — stakeholders disagree; competing156 alternatives need weighing; "pros and cons" is the actual ask.157* **Strategic / direction** — "should we …", "shall we …", roadmap158 shape, long-term technical direction.159* **Explicit ambiguity** — the user wrote "unsure / uncertain /160 ambiguous / second opinion / sanity check".161162Agent orchestration MUST call `council_cli` with163`--invocation agent` so the gate can skip silently on routine164requests. User-typed `/council` keeps the default165(`--invocation user_explicit`); the user gets the educational message166+ `--proceed-anyway` override path. Mode `block` ignores167`--proceed-anyway` by design — cost-strict opt-in.168169## Goal170171Bring in **independent** external models to critique a project172artefact. Independent means: the council members never see the host173agent's reasoning, internal state, or framing language — only the174artefact (roadmap, diff, prompt, file set) plus a neutral system175prompt that asks them to think on their own merits.176177## Neutrality guidelines (Iron Law)178179```180THE COUNCIL NEVER SEES THE HOST AGENT'S ANALYSIS, REASONING, OR FRAMING.181ROUND 1 SEES THE ARTEFACT + THE NEUTRAL SYSTEM PROMPT. NOTHING ELSE.182ROUND 2+ MAY SEE PRIOR PEER REPLIES — ANONYMISED ONLY, NEVER ATTRIBUTED, NEVER THE HOST'S.183THE HOST AGENT IS THE CONVENER, NEVER A REVIEWER.184```185186If you find yourself wanting to "frame" the artefact for the council,187stop. Framing is exactly what kills the second-opinion value. Use the188unbiased system prompts in `scripts/ai_council/prompts.ts`; do not189roll your own.190191The host runs the council and synthesises convergence — it is the192convener, not a reviewer. The reviewer-ban is structural: the host193wrote (or framed) the artefact and cannot critique it independently.194Anonymising the host as "Reviewer C" is worse than excluding it — the195user is told they got an outside vote when they did not. Externals196down → surface and skip; never substitute the host as a reviewer.197198## Modes199200This skill is a router head. Everything above is true in every mode and stays201here: which decision classes reach the council at all, what to do when it cannot202answer, the user-global configuration fact, the necessity self-check, and the203neutrality Iron Law. So does the output format below — it is an ordered MUST that204a pointer cannot carry. The operational manuals live in `references/`; load the205one the task calls for, not the set.206207| Task | Mode body | Covers |208|---|---|---|209| Pick an execution mode, or handle a degraded one | [`references/execution-modes.md`](references/execution-modes.md) | Manual-mode and CLI-mode UX, the cost-gate bypass for non-billable members, degradation modes |210| Run a session end to end | [`references/procedure.md`](references/procedure.md) | The neutrality context-handoff, the numbered procedure, the convener-skeptic stance, why a mechanism claim needs a probe rather than a second opinion, what this is NOT |211| Place the artefact, or render the synthesis | [`references/output-and-synthesis.md`](references/output-and-synthesis.md) | Output path convention with its forbidden and exempt sets, lens-aware synthesis templates, the `--prose-synthesis` escape hatch, renderer lens resolution |212| Estimate or gate the spend, or check what is redacted | [`references/cost-and-redaction.md`](references/cost-and-redaction.md) | Redaction expectations, cost awareness, the pre-call estimate format, the stale price-table gate, the mid-flow overrun callback |213| Multi-round debate, deep tier, advisors, replay, low-impact fast-path | [`references/advanced-modes.md`](references/advanced-modes.md) | `rounds:N` debate, the deep-reasoning tier and its manual-mode parity, `/council debate`, Karpathy peer-review, thinking-style advisors, the decision-replay artefact, the Lightweight-QA fast-path with its own Iron Law and output markers |214215Two of those bodies carry obligations a pointer cannot summarise: the216output-path convention is enforced by CI, and the Lightweight-QA fast-path217markers are required verbatim by218[`fast-path-marker-visibility`](../../rules/fast-path-marker-visibility.md).219Load the body before acting in either mode rather than working from memory of it.220221## Procedure2222231. **Inspect first.** Run the necessity self-check above and read the artefact224 you are about to hand over. It is cheaper to not convene than to convene and225 discard.2262. **Confirm availability** — `agent-config council:status`, never an inference227 from the project tree (see § Configuration is ALWAYS user-global).2283. **Pick the execution mode** from229 [`references/execution-modes.md`](references/execution-modes.md).2304. **Run the session** per the numbered procedure in231 [`references/procedure.md`](references/procedure.md), under the neutrality232 Iron Law above — the preamble is not optional and the question is never233 authored toward a conclusion.2345. **Estimate the spend before the call** per235 [`references/cost-and-redaction.md`](references/cost-and-redaction.md).2366. **Write the artefact** in the output format below, at the path237 [`references/output-and-synthesis.md`](references/output-and-synthesis.md)238 fixes, then apply the convener-skeptic verdict yourself — convergence is not239 correctness.240241## Output format242243Every council reply MUST contain, in this order:2442451. **Header line** with mode, member count, and total token cost.2462. **One section per member**, titled `### <provider> · <model>`,247 containing the member's verbatim output.2483. **Convergence / Divergence summary** — bullet list, every claim249 attributed by provider name. **When the convergence settles a250 question as "don't relitigate" / locked / a durable disposition**,251 the summary MUST record two additional lines, per252 [`decision-revisit-gate`](../../rules/decision-revisit-gate.md):253 `scope:` (exactly which mechanism or question is settled — narrow254 enough that a superficially similar but different proposal is not255 silently covered) and `revisit-if:` (at least one concrete condition256 that reopens it — new evidence class, model-generation or tooling257 change, an N-th blocked encounter, or an age threshold). A lock258 recorded without both lines is an authoring error. Also state259 whether the disposition is **settled-by-evidence** (an eval ran) or260 **settled-by-decision** (a maintainer call) — the latter is cheaper261 to reopen and should say so.2624. **Host verdict per finding** — one row per finding with `accept`263 / `accept-with-modification` / `reject` / `needs-input` plus a264 one-line reason citing host evidence (file:line, ADR, contract).265 See *Critical evaluation* above.2665. **User-facing options** — numbered block per `user-interaction`,267 carrying the host verdict in each option, with "discard council268 input" always present as an option.269270The host agent NEVER ships council output as its own reasoning, and271NEVER ships the host verdict as council output. Provider attribution272stays visible in the per-member sections; host verdicts stay273attributed to the host.274275> **Tally-vs-reasoned boundary.** Option-level decisions (which design /276> approach to take) use the council **stance tally** — the Convergence /277> Divergence summary aggregates member stances across the option set.278> Finding-level review (is this specific bug/line real) uses the279> **reasoned validation** in [`code-review`](../code-review/SKILL.md)280> (each finding stands on its own traced reason, never a vote count). The281> two never cross-apply — no resolving a design option by282> reasoned-validating one member's take, no resolving a bug finding by283> counting council votes. Mirrored in `code-review` so the boundary is284> grep-checkable from both sides.285286287## Do NOT288289- Do NOT paraphrase council output into the host agent's voice — strip290 attribution and you've stripped the value.291- Do NOT surface council findings to the user without a host verdict292 — convergence ≠ correctness, and the user deserves the agent's293 reasoned filter, not a raw forward.294- Do NOT pre-warm the council with the host agent's analysis or295 identity — that primes the reviewer and collapses diversity.296- Do NOT silently truncate a too-large bundle — surface the size and297 ask for narrower scope.298- Do NOT spend against an unbounded budget without asking — a billable299 member with neither `max_total_usd` nor `daily_limit_usd` set has no300 ceiling, and autonomy is not a ceiling.301- Do NOT reuse SDK clients across invocations — re-load keys via302 `load_*_key()` each call.303304## Gotchas305306Real failure modes seen in the wild:307308- **Bias-by-framing:** agent pastes "I think X is the right answer,309 what do you think?" → council rubber-stamps. Symptom: 100%310 convergence, zero unique insight. Fix: send artefact only, neutral311 preamble, no host reasoning.312- **Silent budget overrun:** `cost_budget_exceeded` mid-fan-out, agent313 retries one member to "complete" the council. Result: skewed sample,314 hidden spend. Fix: surface partial result, stop, ask user.315- **Identity leak:** roadmap text contains "the agent decided…" —316 reviewer infers host model and mirrors it. Fix: redact host-agent317 identity strings before bundling.318319| Anti-pattern | Why it's wrong | Correct approach |320|---|---|---|321| "Pre-warm" the council with the agent's own analysis. | Bias attack — collapses the reviewer to a yes-man. | Send the artefact text only. |322| Paste the host-agent identity ("I am Augment / Claude Code…") | Identity primes the reviewer's model. | Neutrality preamble in `prompts.ts` already handles this. |323| Silently truncate a too-large bundle. | Misleads the reviewer into thinking they saw the whole thing. | Bundler raises `BundleTooLarge`; surface and ask for narrower scope. |324| Reuse the same SDK client across calls without re-loading the key. | Leaks the key in long-lived process state. | Each invocation builds fresh clients from `load_*_key()`. |325| Spend against a billable member with no configured ceiling because "the council is standing-authorized". | Standing authorization is a *bound* the user set once, not a blank cheque. No ceiling = nothing was authorized. | Surface the estimate and ask, exactly in that one case (Procedure § 3). |326| Re-ask per invocation once a ceiling exists. | The ceiling already carried the decision; re-asking is the approval burden this default removed. | Fan out; let `on_overrun` ask on breach. |327| Forward council convergence to the user as numbered options without a host verdict. | Convergence ≠ correctness; the council never saw the codebase. | Apply the *Critical evaluation* lens; tag every finding `accept` / `accept-with-modification` / `reject` / `needs-input` with one-line reason. |328| Reject a finding on preference, not evidence. | "I don't like this" is not a verdict. | Cite the file, line, ADR, or contract that justifies the rejection — or surface as `needs-input`. |329| Paraphrase council output into the host's own analysis to defend a verdict. | Strips attribution, breaches `direct-answers` no-invented-facts. | Verdict cites host evidence (file:line); council output stays attributed in the per-member sections. |330331## Redaction and cost332333Both moved verbatim to334[`references/cost-and-redaction.md`](references/cost-and-redaction.md): what the335bundler's redaction pass strips, the cost-awareness rules, the pre-call estimate336format, the stale price-table gate, and the mid-flow overrun callback. A breach337without `on_overrun` short-circuits the remaining members — surface the partial338result and ask, never retry silently.339340## Advanced modes341342Multi-round debate, the deep-reasoning tier, Karpathy peer-review, thinking-style343advisors, the decision-replay artefact and the Lightweight-QA fast-path moved344verbatim to [`references/advanced-modes.md`](references/advanced-modes.md). Each345is opt-in and each prices higher than a single round; none is a default.346347## See also348349- `/council` command — the user-facing entry point.350- `subagent-orchestration` skill — internal multi-agent variant (no351 network, no spend, but no diversity of weights either).352- `/team` command — collaborative cross-model review WITH repo access353 (depth); council is breadth on an artefact, team is one strong model in354 the repo. Different mechanism, not a competitor.355- `scripts/ai_council/prompts.ts` — neutrality preamble + per-mode356 system prompts.357- `scripts/ai_council/advisors.ts` — replace-mode planning + persona358 resolution.359- `scripts/ai_council/bundler.ts` — redaction pattern set + size360 guard.361- `docs/customization.md` § `ai_council.*` — settings reference.362- `docs/contracts/ai-council-config.md` § advisors — schema + precedence363 contract.364- `docs/contracts/ai-council-config.md` § Decision-replay artefact —365 Phase 9 audit trail contract + redaction modes.366- `scripts/ai_council/replay.ts` — pure projection renderer (no model367 calls).