Instead of one AI reviewer catching what it can, six specialized agents review your code in parallel — security, architecture, testing, operations, governance, and documentation — then produce a unified verdict.
A multi-persona code and specification review harness for AI coding tools. Installs as a Lola module and works with Claude Code, Cursor, Gemini CLI, and OpenCode.
Review Council is a harness — the infrastructure around AI agents that guides their behavior and validates their output. Following harness engineering principles, it combines feedforward and feedback controls to increase the probability of correct initial results and enable self-correction:
Guides (feedforward controls) — anticipatory controls that steer reviewer behavior before action:
- Convention packs defining coding and documentation standards
- Reviewer protocol specifying evidence discipline and output format
- Project governance documents (Constitution extension point)
- Prior learnings from previous review runs (Knowledge tool extension point)
Sensors (feedback controls) — observational controls that enable self-correction after action:
- Self-attestation verification against the changeset
- Evidence checking to confirm quoted code exists in cited files
- Correction round for fixable errors (hallucinations, stale evidence)
- Quality gates (CI checks, build/test/lint results)
- Deduplication to strip redundant findings
Both control types operate computationally (deterministic CI checks, evidence verification) and inferentially (semantic analysis by specialized reviewer agents).
Review Council runs a panel of specialized reviewer agents against your code or specifications:
| Persona | Focus | Temperature |
|---|---|---|
| The Guard | Intent drift, governance, zero-waste | 0.1 |
| The Architect | Structure, patterns, conventions, DRY | 0.1 |
| The Adversary | Security, resilience, secrets, CVEs | 0.1 |
| The Tester | Test quality, coverage, isolation | 0.1 |
| The Operator | Operations, deployment, dependencies | 0.1 |
| The Curator | Documentation gaps, content triage | 0.2 |
Each reviewer agent reviews independently and returns a verdict. The council verifies every finding against actual file content — stripping fabricated evidence — then produces a unified result: APPROVE or REQUEST CHANGES.
The /review-council command invokes the six reviewer agents automatically. The module also includes three content
production agents that are invoked directly for writing tasks — they share the module's convention packs and extension
points but do not participate in the review council flow:
| Persona | Focus | Temperature |
|---|---|---|
| The Scribe | Technical docs, READMEs, API docs | 0.1 |
| The Herald | Blog posts, release notes, announcements | 0.4 |
| The Envoy | PR/comms, social media, community updates | 0.5 |
lola mod add https://github.com/unbound-force/review-council.git
lola install review-councilClone and copy the module directory into your project's AI tool configuration:
git clone https://github.com/unbound-force/review-council.git
# For Claude Code:
cp review-council/module/agents/divisor-*.md .claude/agents/
cp review-council/module/commands/review-council.md .claude/commands/
cp -r review-council/module/commands/review-council/ .claude/commands/review-council/
cp -r review-council/module/skills/review-council/ .claude/skills/review-council/Convention packs are required — all reviewer agents depend on reviewer-protocol.md. Copy them to your user or project
pack directory:
# User-level (applies to all projects):
mkdir -p "${XDG_CONFIG_HOME:-$HOME/.config}/review-council/packs"
cp review-council/module/packs/*.md "${XDG_CONFIG_HOME:-$HOME/.config}/review-council/packs/"
# Or project-level (applies to this repo only):
mkdir -p .review-council/packs
cp review-council/module/packs/*.md .review-council/packs/Adjust agent and command paths for your AI tool (.cursor/, .gemini/, etc.).
The Curator agent can file GitHub issues for documentation gaps when a Docs repo is configured (see Extension Points).
This requires the GitHub CLI (gh) to be installed and authenticated (gh auth login).
Without gh, the Curator reports gaps as review findings instead.
/review-council # auto-detect mode from workspace state
/review-council code # force code review mode
/review-council specs # force spec review mode
The /review-council command is a thin coordinator that dispatches five phases, each in its own procedure file under
commands/review-council/:
| Phase | File | Purpose |
|---|---|---|
| Prepare | prepare.md |
Mode detection, agent discovery, session setup, changeset capture |
| Quality Gates | quality-gates.md |
CI checks and quality tool (Code Review only) |
| Delegate | delegate.md |
Prompt construction, batching, agent dispatch |
| Verify | verify.md |
Attestation, evidence checking, correction round, dedup |
| Report | report.md |
Final report, prior learnings feedback |
Each phase loads only when reached — the orchestrating LLM never needs to hold the full pipeline in context.
%%{init: {'theme': 'base', 'themeVariables': {
'primaryColor': '#2f6dab',
'primaryTextColor': '#1e1e1e',
'primaryBorderColor': '#7c8ba1',
'lineColor': '#7c8ba1',
'edgeLabelBackground': '#eef2f8',
'tertiaryColor': 'transparent',
'tertiaryTextColor': '#7c8ba1',
'tertiaryBorderColor': '#7c8ba1',
'clusterBkg': 'transparent',
'clusterBorder': '#7c8ba1',
'titleColor': '#7c8ba1',
'noteBkgColor': '#eef2f8',
'noteTextColor': '#1e1e1e',
'fontFamily': 'system-ui, sans-serif'
}, 'themeCSS': '.node .nodeLabel{color:#ffffff!important;fill:#ffffff!important;}'}}%%
flowchart TD
prep["Prepare: detect mode, discover agents, capture changeset"]
qg{"Code review mode?"}
qgrun["Quality Gates: run CI checks"]
del["Delegate: construct prompts, dispatch agents in parallel"]
ver["Verify: attestation, evidence, correction, dedup"]
iter{"Verified findings remain? Iterations < 3?"}
report["Report: produce verdict, record learnings"]
prep --> qg
qg -->|yes| qgrun
qgrun --> del
qg -->|no| del
del --> ver
ver --> iter
iter -->|yes| del
iter -->|done| report
classDef sysA fill:#2f6dab,color:#ffffff,stroke:#7c8ba1
classDef sysB fill:#1d7848,color:#ffffff,stroke:#7c8ba1
classDef sysC fill:#7457b8,color:#ffffff,stroke:#7c8ba1
classDef sysD fill:#2d747e,color:#ffffff,stroke:#7c8ba1
classDef sysF fill:#5c6a82,color:#ffffff,stroke:#7c8ba1
class prep,del sysA
class qgrun sysB
class ver sysC
class report sysD
class qg,iter sysF
- Prepare — detect mode, discover agents, set up session cache at
$XDG_CACHE_HOME/review-council/, capture changeset and diff - Quality Gates — read CI config, run build/test/lint locally (code review only)
- Delegate — construct prompts with changeset, diff, and prior run context; dispatch agents in parallel with model tier guidance (capable tier for Adversary/Architect/Guard, standard for others)
- Verify — check self-attestation against changeset, verify evidence quotes exist in cited files, give agents one correction round for fixable errors, strip fabricated findings, deduplicate
- Iterate — fix verified findings, re-run delegation+verification (up to 3 iterations)
- Report — produce final verdict, record learnings for future runs
Each run creates a session directory at $XDG_CACHE_HOME/review-council/<project>/<timestamp>/ containing:
session.txt— human-readable run metadatatracking.md— structured phase-by-phase statechangeset.txt— reviewed file listdiff.patch— full patch (code review)verdicts/— per-agent output and verification loglearnings.txt— false positives and validated patterns
Convention packs define coding and documentation standards that reviewer agents check against. The module ships with these packs:
| Pack | Language | Contents |
|---|---|---|
severity.md |
Any | Shared severity level definitions |
base.md |
Any | Language-agnostic coding conventions (fallback) |
go.md |
Go | Self-contained Go conventions |
typescript.md |
TypeScript | Self-contained TypeScript conventions |
content.md |
Any | Content writing standards (content agents only) |
reviewer-protocol.md |
Any | Shared reviewer procedures and output format |
Packs are resolved in priority order (later wins):
- Module packs — shipped with this module (read-only)
- User packs —
$XDG_CONFIG_HOME/review-council/packs/ - Project packs —
.review-council/packs/in your repo
To override a shipped pack, create a file with the same name at a higher priority level. To add a new pack, drop a new
.md file into either location.
Configure optional integrations by adding a "Review Council Configuration" section to your project's AGENTS.md or CLAUDE.md:
## Review Council Configuration
- Constitution: ./GOVERNANCE.md
- Knowledge tool: my_semantic_search
- Docs repo: myorg/docs
- Quality tool: my_quality_reporter
| Extension Point | Purpose | Default |
|---|---|---|
| Constitution | Path to project governance document | Skip constitution checks |
| Knowledge tool | MCP tool name for semantic search | Skip prior learnings |
| Docs repo | GitHub repo for documentation issues | Report gaps as findings |
| Quality tool | Agent name for quality analysis | Skip quality analysis |
| Batch size | Max files per delegation batch | 20 |
All extension points are optional. The review council works without any of them — agents gracefully skip checks that require unconfigured extensions.
After installing the module, run these checks to confirm your installation is working:
1. Agent discovery
Invoke /review-council code in any git repository. You should see the council announce the discovered reviewer agents
by name. If you see "no agents found," check the Troubleshooting section below.
2. Pack resolution
Ask any reviewer agent to show which convention pack it loaded. It should reference reviewer-protocol.md for its
output format.
3. UF reference sweep (for module contributors)
From the repo root, verify no UF-specific references leaked into the module:
grep -rn \
--include="*.md" \
-e "dewey_semantic_search\b" \
-e "gaze-reporter" \
-e "muti-mind" \
review-council/module/Zero matches means the module is clean.
No agents found: Verify that divisor-*-code.md files are in your AI tool's agents directory (e.g.,
.claude/agents/ for Claude Code). Run ls .claude/agents/divisor-* to confirm. If using a different AI tool, check
its equivalent agents directory.
reviewer-protocol.md missing: All reviewer agents depend on this pack. Ensure you copied all files from
module/packs/ — not just language-specific packs.
Curator cannot file issues: Install and authenticate the gh CLI: gh auth login. Without authentication, the
Curator reports documentation gaps as findings instead of filing GitHub issues.
Review Council was extracted from the Unbound Force monorepo and restructured as a standalone Lola module. This section documents the differences between the two versions.
In Unbound Force, the entire review pipeline lives in a single file (.opencode/commands/review-council.md, ~283
lines). The extracted version splits this into a thin coordinator plus five phase files under
commands/review-council/ — prepare, quality-gates, delegate, verify, and report. The orchestrating LLM loads each
phase only when reached, so no single context window needs to hold the full pipeline.
Unbound Force uses one agent file per persona (e.g., divisor-guard.md) containing both code review and spec review
logic. The extracted version splits each reviewer persona into -code.md and -spec.md variants, so each agent file
contains only the logic for its review mode. Content agents (Scribe, Herald, Envoy) remain unsplit because they are
invoked directly for writing tasks, not through the review pipeline.
| Unbound Force | Extracted |
|---|---|
divisor-guard.md |
divisor-guard-code.md, divisor-guard-spec.md |
divisor-architect.md |
divisor-architect-code.md, divisor-architect-spec.md |
divisor-adversary.md |
divisor-adversary-code.md, divisor-adversary-spec.md |
divisor-testing.md |
divisor-testing-code.md, divisor-testing-spec.md |
divisor-sre.md |
divisor-sre-code.md, divisor-sre-spec.md |
divisor-curator.md |
divisor-curator-code.md, divisor-curator-spec.md |
divisor-scribe.md |
divisor-scribe.md (unchanged) |
divisor-herald.md |
divisor-herald.md (unchanged) |
divisor-envoy.md |
divisor-envoy.md (unchanged) |
In Unbound Force, each agent file embeds its own copy of shared procedures — evidence discipline, pack loading rules,
prior learnings queries, output format, and self-attestation requirements. The extracted version moves these into a
single reviewer-protocol.md convention pack that all reviewer agents reference, eliminating duplication and making
the protocol easier to update.
Renamed: default.md → base.md. The original name implied it was the primary pack; it is actually a
language-agnostic fallback loaded only when no language-specific pack (e.g., go.md) matches.
Removed: -custom.md companion files (default-custom.md, go-custom.md, typescript-custom.md,
content-custom.md). Unbound Force shipped tool-owned packs alongside user-owned -custom.md files in the same
directory. The extracted version uses a priority-based override system instead — drop a file with the same name into
$XDG_CONFIG_HOME/review-council/packs/ (user) or .review-council/packs/ (project) and it takes precedence over
the shipped pack.
Added: reviewer-protocol.md (see above).
Unbound Force hardcodes references to its own tooling:
- Gaze (
gaze-reporteragent) for quality analysis — replaced by the configurable Quality tool extension point - Dewey (
dewey_semantic_searchMCP tool) for prior learnings — replaced by the configurable Knowledge tool extension point - Speckit/OpenSpec workflow tier detection (
NNN-*andopsx/*branch patterns) — removed entirely
The extracted version defines these as optional extension points in a "Review Council Configuration" section of your project's AGENTS.md or CLAUDE.md. Unconfigured extensions are skipped gracefully — no tools are assumed.
Unbound Force mode detection recognizes its project-specific governance frameworks:
NNN-*branches → Speckit workflow (reviewsspecs/NNN-<name>/artifacts)opsx/*branches → OpenSpec workflow (reviewsopenspec/changes/<name>/artifacts)- Spec file scope varies by detected workflow tier
The extracted version uses a simpler heuristic: files under specs/, docs/specs/, docs/design/,
docs/superpowers/, design/, or named spec.md, plan.md, tasks.md, design.md, research.md are treated as
specification artifacts. Everything else is code. No branch-naming conventions are assumed.
The extracted version adds docs/superpowers/ as a recognized spec artifact location. This directory is where the
superpowers brainstorming skill writes design specs
(docs/superpowers/specs/YYYY-MM-DD-<topic>-design.md) and where the writing-plans skill stores implementation plans.
Unbound Force did not use this convention — the path is a net-new addition, not a migration from an existing UF path.
Files under docs/superpowers/ are classified as spec artifacts for auto-detection purposes and included in the scan
locations for Spec Review Mode. All six reviewer agents, the shared reviewer-protocol.md, and the prepare phase
recognize this path.
| Purpose | Unbound Force | Extracted |
|---|---|---|
| Agents | .opencode/agents/ |
module/agents/ |
| Commands | .opencode/commands/ |
module/commands/ |
| Command phases | (embedded in single command) | module/commands/review-council/ |
| Convention packs | .opencode/uf/packs/ |
module/packs/ |
| Skills | .opencode/skills/ (shared) |
module/skills/review-council/ |
| Module metadata | AGENTS.md (project-level) |
module/AGENTS.md (module-level) |