Getting it into your agent
This one installs as part of its plugin. Adding the marketplace and installing the plugin brings it with everything else the plugin ships.
/plugin marketplace add SteveGJones/ai-first-sdlc-practices/plugin install sdlc-model-councilWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/commands/stevegjones/ai-first-sdlc-practices/council-run)<a href="https://agentmods.dev/commands/stevegjones/ai-first-sdlc-practices/council-run"><img src="https://agentmods.dev/badge/commands/stevegjones/ai-first-sdlc-practices/council-run/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/commands/stevegjones/ai-first-sdlc-practices/council-run"><img src="https://agentmods.dev/badge/commands/stevegjones/ai-first-sdlc-practices/council-run.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00000 | $0.01339 |
| Opus 5.5 | $0.00000 | $0.00536 |
| Sonnet 5.5 | $0.00000 | $0.00268 |
| Haiku 4.5 | $0.00000 | $0.00134 |
Grade A, and why
council-run scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 90 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Run a council play — a cross-model fan-out — over the given task. v1 ships
one play, Diff+Synthesis: the same task goes to a decorrelated panel of
models, and the council-judge agent synthesises their responses into one
attributed verdict with a baseline delta (did the panel beat the single best
model?). This is the novel work no per-vendor plugin does.
Arguments: $ARGUMENTS — parse task-type=, input= (a file path or inline
text), optional play= (default diff-synthesis), cast= (pin explicit model
addresses, comma-separated), budget-usd=, k= (default 3).
Scripts live under ${CLAUDE_PLUGIN_ROOT}/scripts/council/. Do this:
-
Resolve policy. Load the
council-policyskill. If the project is commissioned (.sdlc/model-council/policy.jsonexists), read the entry fortask-typeto get the play, the cast (pinned addresses or acast_rule), and the budget guardrail. If NOT commissioned, say so plainly ("this project isn't commissioned; using heuristics") and fall back: play =diff-synthesis, cast = built live from.sdlc/model-council/roster.jsonif present, else ask the user forcast=. An explicitcast=/play=/budget-usd=argument always overrides policy — note that you did. -
Materialise the task. Write the task to a file (if
input=is a path, use it; if inline text, write it to a scratch file under./tmp/). -
Set up the play (deterministic spine, no models yet):
scripts/council/play.sh setup --dimension <task-type> --k <k> \ --roster .sdlc/model-council/roster.json \ --diversity .sdlc/model-council/diversity.json \ --task-file <task-file> [--cast <pinned>] [--budget-usd N]It prints
PLAY_DIR=…and a dispatch table oflabel<TAB>model<TAB>result-file. The manifest records the baseline_member (the roster's best single model for this task) — that's what the synthesis is measured against. -
Fan out — one delegation-runner per member, in a single message (respect the cap of 5). For each dispatch-table row, parse the model address
adapter:model[@effort]intobackend/model/effortand dispatch thedelegation-runneragent with that backend, the same task (fromtask.md), andposture=read-only. Each runner returns its unified block with an Answer file path. Do NOT read the answers into your context. -
Collect on disk (no context inheritance). For each member, copy its runner's Answer file to
<PLAY_DIR>/<label>.result.mdwithcp— the answer text goes to disk under its blind label, never through your context. A member that ERROR/TIMEOUT/NO_OUTPUT'd has no usable answer — leave its result file absent (it becomes a non-survivor). -
Check quorum:
scripts/council/play.sh combine-check --play-dir <PLAY_DIR>If
verdictisPLAY-DEGRADED(survivors < quorum), report that honestly and stop — a panel that couldn't reach quorum must not be dressed up as a confident synthesis. -
Synthesise (blind). Dispatch the
council-judgeagent (Sonnet) with thePLAY_DIRand the manifest'sbaseline_label. It readscombine/blind-bundle.md+task.md(models anonymised as Model A/B/…) and writescombine/synthesis.mdwith Convergent / Divergent(attributed) / Adjudication / Confidence / Baseline delta sections. -
Un-blind and report.
scripts/council/play.sh unblind --play-dir <PLAY_DIR> --in <PLAY_DIR>/combine/synthesis.mdre-attaches the real model addresses (provenance restored). Present that synthesis to the user, then append a spend line —
Council spend: $X across N models— summing each member's cost viascripts/council/usage.py <handle-dir>. Finally append one line to.sdlc/model-council/outcomes.jsonl:{"play":"diff-synthesis","dimension":"<task-type>","cast":[…],"baseline_member":"…","ts":"…"}(the measurability ledger; whether the user accepted or reverted the result is recorded later, out of scope for v1).
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2mo ago First seen · 90 lines · 0 tokens per session scan A 2708af237b0e
council-run is a command published in the GitHub repository SteveGJones/ai-first-sdlc-practices (42 stars, last pushed 1mo ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 1,339 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-03.
council-run compared with commands from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| council-runSteveGJones/ai-first-sdlc-practices | Command | 42 | 1mo ago | MIT | A | 0 | Claude Code |
| checklistgithub/spec-kit | Command | 149k | 2d ago | MIT | A | 13 | Claude Code |
| clarifygithub/spec-kit | Command | 149k | 2d ago | MIT | A | 27 | Claude Code |
| specifygithub/spec-kit | Command | 149k | 2d ago | MIT | A | 13 | Claude Code |
| analyzegithub/spec-kit | Command | 149k | 2d ago | MIT | A | 26 | Claude Code |
| convergegithub/spec-kit | Command | 149k | 2d ago | MIT | A | 35 | Claude Code |
| implementgithub/spec-kit | Command | 149k | 2d ago | MIT | A | 14 | Claude Code |