Don’t ship on
one opinion.
consilium-py runs a dialectical review of a proposed change through independent AI voices — one proposes, one weighs the risk, one audits — then returns a single graded verdict with a confidence score. From any terminal, script, or HTTP endpoint.
one deliberation, start to verdict
Generator
Proposes
3–5 approaches
+ a preferred one
Conservator
Weighs risk
reversibility,
regression
Control
Audits
correctness,
disagreements
The pipeline
One proposal, three lenses, one verdict.
Every deliberation passes through three AI voices in sequence. The Generator runs first, blind to any risk framing — so the ideas aren’t anchored by caution before they exist.
Generator · first
Proposes the options
Lays out 3–5 approaches with their trade-offs and picks a preferred one. Sees the change on its own terms, with no risk framing to anchor it.
Conservator
Weighs the risk
Scores each candidate for risk, reversibility, and regression potential. An irreversibility flag is a hard veto — it can block the whole change.
Control · last
Audits the record
Checks correctness and glossary compliance, and surfaces where the voices disagree — the signal that a change needs a second look.
A veto cascade turns the three voices into one Report: an unparseable voice, a failed audit, or an irreversible flag each force a block; otherwise the verdict and a confidence score fall out of how much the voices agree.
Get started
Run it anywhere you already work.
A terminal command, a Python call, or an HTTP endpoint — the same engine behind each.
Command line
# install, then point it at a change pip install consilium-py export OPENROUTER_API_KEY=sk-or-... consilium deliberate "Add Redis caching to the API" consilium check # review your staged git diff consilium serve # open the web UI consilium ingest docs/ # feed reference docs into RAG
Python
from consilium import deliberate report = deliberate( "Add rate limiting", mode="dialectic", ) print(report.verdict) # GO print(report.confidence) # 0.82
HTTP
# pip install 'consilium-py[server]' curl -X POST localhost:8123/deliberate \ -H "Content-Type: application/json" \ -d '{"proposal": "Add a /health route"}' # → {"verdict":"GO","confidence":0.82,...}
Four modes
Scale the scrutiny to the stakes.
Start fast and cheap; escalate to a full council when a change is worth it.
--skeptic-can-override it can downgrade the verdict.StateGraph — for teams already standardized on LangGraph orchestration.The verdict
Six outcomes, no ambiguity.
Every deliberation resolves to exactly one verdict and a confidence score — a decision you can act on or route.
GO
The approach is sound. Proceed.
MODIFY
Proceed, with the noted changes applied first.
STOP
Don’t proceed as proposed — the risks outweigh it.
BLOCK
A hard gate tripped: an unparseable voice, a failed audit, or an irreversible risk.
ESCALATE
The voices disagree enough that a human should decide.
ANSWER
Not a change proposal — a question, answered directly.
Under the hood
Batteries, opt-in.
The core is small and dependency-light. Everything below is an optional extra that guards its own imports.
provider/model. Or use --model claude-cli with no API key at all, just a Claude subscription.consilium ingest <path> chunks your docs into the index; retrieval cites its source in the report.POST /deliberate endpoint plus a self-contained web UI. consilium serve picks a free port and opens a browser.# implements: tag linked to a requirement doc; a drift gate fails the build when code and spec diverge — so the docs can’t quietly rot away from the code.Ship it
From git push to Cloud Run.
The package ships with the infrastructure to run it — containerized, provisioned as code, and gated by CI. Not an afterthought: the whole path is in the repo.
Dockerfile
Container
python:3.12-slim
→ uvicorn
Artifact Registry
Image
build & push
to GCP
Terraform
Provision
infra/ as code
terraform apply
Cloud Run v2
Serve
scales to zero,
private by default
Stack
pytest suite (3.11 + 3.12) and the requirement-drift gate on every push, and validates the Terraform on every infra/ change. On a version tag it publishes the package to PyPI via OIDC trusted publishing and pushes a container image to GHCR. Every action is pinned to a commit SHA and kept current by Dependabot — closing the supply-chain gap that floating version tags leave open.apply is a documented step today; wiring it to CI via Workload Identity Federation is the next increment.