LLM-Council-Decide

April 23, 2026 · View on GitHub

A council-pattern LLM app for structured decision analysis.

You hand the council a decision you're wrestling with — the options, the context, the stakes — and each council member evaluates it through a different formal decision-making framework. A Chairman then synthesises across frameworks into a single, defensible recommendation.

Part of the LLM-Council-Projects index. Inspired by karpathy/llm-council.

Why

Most "should I do X?" thinking is unstructured — a gut-feel pros/cons list on the back of a napkin, usually biased toward whatever the decider already wants. Formal frameworks fix this, but they each have blind spots:

  • A weighted matrix makes the numbers look crisp but hides which weights are load-bearing.
  • A pre-mortem catches failure modes but undervalues upside.
  • 10/10/10 tames emotional spikes but smears over near-term constraints.
  • SWOT is easy but often shallow.

Running several frameworks in parallel and then reconciling them is how good decisions actually get made. This tool automates that — each council member owns exactly one framework, applies it rigorously, and the Chairman reconciles.

The framework catalogue

A wide library of decision-making frameworks is available. Each council run uses up to 5 — enough to triangulate, not so many that the dossier becomes a wall of noise. The panel can be specified by the user or chosen by a selector agent tailored to the decision's nature.

#FrameworkScope
1Pros & ConsBaseline exhaustive listing with certainty markers and magnitude ranking
2Weighted Decision MatrixQuantitative — criteria, weights, option scores, sensitivity to weight changes
3Expected ValueProbability × payoff across scenarios, with variance and tail-risk flags
410/10/10 Rule (Suzy Welch)Temporal — consequences at 10 minutes / 10 months / 10 years
5Regret Minimization (Bezos)View from 80: which choice will you regret less?
6Type-1 / Type-2 Doors (Bezos)Reversibility classifier — how much analysis does this decision deserve?
7Pre-Mortem / Inversion (Klein / Munger)Failure-first — imagine the decision was a disaster and work back
8Second-Order Thinking (Marks)First-order effects are obvious; chain "and then what?" at least twice
9OODA Loop (Boyd)Observe-Orient-Decide-Act under time pressure and adversarial conditions
10Cynefin Framework (Snowden)Classify the situation (clear/complicated/complex/chaotic) and match decision style
11Kepner-TregoeSeparates Musts (binary filters) from Wants (scored preferences) plus risk analysis
12SWOTStrategic — internal strengths/weaknesses × external opportunities/threats
13Six Thinking Hats (de Bono)Multi-perspective — facts, feelings, caution, optimism, creativity, process
14Munger LatticeworkApply multiple disciplinary lenses (psych, econ, physics, biology, stats, game theory, history)
15WRAP (Chip & Dan Heath)Elaborate — Widen options, Reality-test, Attain distance, Prepare to be wrong

The catalogue spans from elementary to elaborate deliberately. The selector agent picks a diverse panel — avoiding stacking frameworks that would all agree on the same decision, and ensuring at least one framework is structurally positioned to challenge the user's apparent lean.

See all with uv run python -m backend.main --list.

Panel selection

Three modes:

  1. Auto-select (recommended): --auto-select — the selector agent reads the brief and chooses up to 5 frameworks matched to the decision's reversibility, time horizon, stakes, and emotional loading.
  2. User-specified: --frameworks pros_cons,pre_mortem,wrap — name exactly which frameworks to apply.
  3. Default: neither flag — falls back to a general-purpose panel (pros_cons, weighted_matrix, pre_mortem, wrap, ten_ten_ten).

Pipeline

User decision brief (free-text or voice transcript)


Context parser ─ extracts the decision, options, stakes, deadline, stakeholders, constraints


Framework council (fan-out) ─ each member applies exactly one framework and returns a structured analysis


Cross-review ─ each member reviews the others (framework identities anonymised)


Chairman ─ synthesises across frameworks into a final recommendation with confidence + dissent


Typst ─ polished PDF decision dossier

Output: the decision dossier

The Chairman always produces this structure:

  1. Decision restated — in one paragraph, so the user can check the council got it right.
  2. Per-framework verdicts — one-line bottom line from each of the seven frameworks.
  3. Where frameworks agree — the robust signal.
  4. Where frameworks disagree — the honest uncertainty, with the disagreement surfaced not smoothed.
  5. Recommended decision — one of the options, or "gather more information", with explicit reasoning.
  6. Confidence level — with the specific things that would change the recommendation if they changed.
  7. Kill criteria / reversal plan — the signals that should make the user abandon or reverse this decision later.

Stack

  • API: OpenRouter (one key, many models).
  • Council models: configurable in backend/config.py.
  • Chairman: configurable; defaults to a strong reasoning model.
  • Report: Typst → PDF.

Setup

uv sync
cp .env.example .env   # then edit: OPENROUTER_API_KEY=sk-or-v1-...

Running

# Auto-select panel (selector agent picks up to 5 frameworks for this decision):
uv run python -m backend.main --brief examples/brief-job-offer.md --auto-select

# Or specify the panel yourself:
uv run python -m backend.main --brief my-decision.md --frameworks pros_cons,regret_minimization,pre_mortem,wrap

# List every framework in the catalogue:
uv run python -m backend.main --list

# Pipe stdin:
cat my-decision.md | uv run python -m backend.main --auto-select

The PDF decision dossier lands in out/.

Claude Code skills

Two skills ship with this repo:

  • start-decide-council (.claude/skills/start-decide-council/) — conversational entry point. Captures the decision brief from the user (typed or voice), runs the panel, surfaces the dossier.
  • typst-council-report (.claude/skills/typst-council-report/) — reusable skill that renders a council result to a typeset PDF via Typst. Also used by the other LLM-Council-* repos.

Status

Template / scaffold — pipeline wiring, framework prompts, Typst template, and example briefs included. Drop in your OPENROUTER_API_KEY and it runs.

Relationship to other council variants

See LLM-Council-Projects § My Own Variations for the full set. Where Homehunter is domain-specific (house search), this one is method-specific — it can chew on any decision, but the personas aren't people, they're frameworks.


Daniel Rosehill (not a bot) · github.com/danielrosehill