15 KiB
Council Review Workflow
Purpose
This document defines a user-facing brainstorming and review workflow where three reviewer agents analyze the same target from different perspectives, return structured suggestions, and then have their suggestions grouped and tallied.
This is intended to be exposed as a separate skill because a user may explicitly ask for this workflow, for example:
- "Use the council review skill"
- "Start a three-reviewer brainstorm"
- "Have three reviewers propose optimizations"
Under the hood, this workflow should reuse orch and inbox. It does not need a separate infrastructure binary in v1.
Why This Is A Separate Skill
This workflow is not just generic scheduling. It has:
- fixed reviewer roles
- a fixed collection and tally process
- a distinct output format
- user-visible semantics around agreement and disagreement
That makes it a good skill boundary even if the execution still rides on orch.
Default Model
The default council has three reviewer agents with intentionally different lenses:
architecture-reviewer: architecture, boundaries, interfaces, compositionimplementation-reviewer: code simplicity, maintainability, duplication, practicalityrisk-reviewer: regressions, correctness, security, operability
These are roles, not necessarily permanently running services. orch council start may dispatch them as three worker tasks for the same target.
Default Choices
If the user does not specify otherwise, use these defaults:
- analysis only, no code changes
- show
consensusandmajorityin the main report - keep
minorityout of the main report unless it is unusually valuable - fixed reviewer roles:
architecture-reviewer,implementation-reviewer,risk-reviewer - support both text targets and codebase targets
- emit both a human-readable markdown report and
--json - persist council inputs, reviewer outputs, grouped recommendations, and final report metadata in
orch - use
normalproposal grouping instead ofstrict - use
low|medium|highconfidence values - reuse the normal
orch run_idnamespace rather than creating a separate id space
These defaults are intended to make the workflow useful out of the box without making it too expensive or too conservative.
What The Council Produces
Each reviewer should return:
- key findings
- proposed modifications
- rationale
- confidence
- optional risks or tradeoffs
The system then groups similar proposals across reviewers and assigns a vote count.
Voting Model
Do not collapse everything into a single "all or nothing" rule by default.
Recommended output buckets:
consensus: 3 of 3 reviewers support the proposalmajority: 2 of 3 reviewers support the proposalminority: 1 of 3 reviewers supports the proposal
Recommended behavior:
- if the user asks for "only unanimous ideas", show only
consensus - otherwise show
consensusfirst, thenmajority, and only includeminorityif it is especially insightful
This keeps user feedback useful without making the system overly conservative.
Execution Model
The council workflow should be implemented as an orch council command group.
Recommended phases:
- create a council review run for a target
- dispatch three reviewer tasks
- wait for all three reviewer responses
- group similar suggestions
- tally votes
- produce a report for the leader or directly for the user
The recommended default report policy is:
- main report:
consensusandmajority - optional appendix:
minority
CLI Shape
Recommended command group:
orch council startorch council waitorch council tallyorch council report
orch council start
Create and dispatch a three-reviewer council run.
Suggested flags:
--run RUN_ID--target TEXT--target-file PATH--target-type text|repo|mixed--mode brainstorm|review--only-unanimous--output markdown|json|both
Behavior:
- creates three review tasks with fixed reviewer roles
- dispatches them through
orch - records the council metadata for later tally
Default behavior:
--mode brainstorm--target-type mixed--output both- unanimous-only disabled unless explicitly requested
- reviewer count fixed at
3in v1
orch council wait
Block until all reviewer outputs arrive or the timeout is reached.
Suggested flags:
--run RUN_ID--timeout-seconds N
Behavior:
- waits until all three reviewer tasks reach terminal task states
- returns current reviewer task statuses on both wake and timeout
orch council tally
Group similar suggestions and count supporting reviewers.
Suggested flags:
--run RUN_ID--similarity strict|normal--json
Behavior:
- reads the three reviewer outputs
- parses structured reviewer findings from completed reviewer result messages
- groups proposals by normalized intent
- records supporter count and dissent
- persists grouped recommendations in
orchstorage
orch council report
Produce the final council report.
Suggested flags:
--run RUN_ID--show consensus|majority|minority|all--json
Default behavior:
- report
consensus,majority - also allow a markdown artifact for user-facing output
Run Identity
Council runs should reuse the existing orch run_id namespace.
This keeps:
- storage simpler
- waiting and event handling consistent
- reporting compatible with the rest of
orch
There is no need for a second run identifier system in v1.
Supported Inputs
The workflow should support three common target shapes:
text: a prompt, design note, requirement, or copied problem statementrepo: a repository path or code snapshot to inspectmixed: a text brief plus repository context
Recommended default is mixed because many useful brainstorms need both goal context and code context.
Target Reference Schema
The council input should allow both free text and explicit references.
Suggested shape:
{
"run_id": "council_blog_001",
"target": {
"target_type": "mixed",
"prompt": "Review the current blog architecture and propose optimizations.",
"target_file": "brief.md",
"repo_path": ".",
"task_id": "T4"
}
}
Recommended field meanings:
prompt: optional human brieftarget_file: optional design note or copied context filerepo_path: optional repository root for code inspectiontask_id: optional existingorchtask reference when the brainstorm is about a specific task
This keeps the input flexible without making the protocol ambiguous.
Confidence Enum
Use a simple confidence enum in v1:
lowmediumhigh
Avoid more granular values unless later evidence shows they are useful.
Reviewer Output Schema
Each reviewer should return a structured document like:
{
"reviewer_role": "architecture-reviewer",
"findings": [
{
"title": "Split API contract from UI implementation details",
"summary": "The current structure mixes transport contracts with view concerns.",
"proposal": "Move API contract definitions into a dedicated module and keep UI-specific mapping local to the UI layer.",
"rationale": "This lowers coupling and reduces integration churn.",
"confidence": "high",
"tags": ["architecture", "coupling"],
"target_refs": {
"repo_path": ".",
"files": ["src/api/contracts.ts", "src/ui/admin/posts.tsx"]
}
}
]
}
The tally step should map semantically similar proposal values into one grouped recommendation.
Required reviewer output expectations:
reviewer_rolemust match one of the assigned council rolesconfidencemust uselow|medium|highproposalshould describe one actionable recommendationtarget_refsmay point to files, repo path, or task id when relevant
Grouped Recommendation Schema
After tally, the system should persist grouped proposals with support counts.
Suggested shape:
{
"run_id": "council_blog_001",
"grouped_recommendations": [
{
"group_id": "grp_01",
"proposal": "Move API contract definitions into a dedicated module.",
"bucket": "consensus",
"support_count": 3,
"supporters": [
"architecture-reviewer",
"implementation-reviewer",
"risk-reviewer"
],
"dissenters": [],
"rationale_summary": "All three reviewers agree the current structure is too coupled.",
"tags": ["architecture", "coupling"],
"source_finding_ids": [
"architecture-reviewer:f01",
"implementation-reviewer:f03",
"risk-reviewer:f02"
]
}
]
}
Proposal Grouping Rules
The default grouping mode should be normal.
Recommended interpretation:
strict: only group nearly identical proposalsnormal: group proposals that clearly recommend the same underlying change even if phrased differently
In v1, normal should be the default because it is more useful for brainstorming workflows.
Persistence Model
Council review should persist its state in orch instead of remaining purely ephemeral.
Recommended persisted objects:
- council run metadata
- council reviewer assignments
- reviewer outputs
- grouped recommendations
- final report metadata and artifact paths
This makes it possible to:
- resume after interruption
- audit how a recommendation was formed
- regenerate user-facing reports
- compare multiple council runs over time
JSON Output Shapes
orch council start should return enough information for downstream automation.
Suggested shape:
{
"ok": true,
"command": "council-start",
"run_id": "council_blog_001",
"mode": "brainstorm",
"target_type": "mixed",
"output": "both",
"reviewers": [
{
"reviewer_role": "architecture-reviewer",
"task_id": "CR1",
"status": "dispatched"
},
{
"reviewer_role": "implementation-reviewer",
"task_id": "CR2",
"status": "dispatched"
},
{
"reviewer_role": "risk-reviewer",
"task_id": "CR3",
"status": "dispatched"
}
]
}
orch council tally should return grouped recommendations.
Suggested shape:
{
"ok": true,
"command": "council-tally",
"run_id": "council_blog_001",
"similarity": "normal",
"counts": {
"consensus": 2,
"majority": 3,
"minority": 1
},
"grouped_recommendations": [
{
"group_id": "grp_01",
"bucket": "consensus",
"support_count": 3,
"proposal": "Move API contract definitions into a dedicated module."
}
]
}
orch council report should support both machine and human output.
Suggested JSON shape:
{
"ok": true,
"command": "council-report",
"run_id": "council_blog_001",
"show": ["consensus", "majority"],
"report_artifacts": [
{
"kind": "markdown",
"path": ".orch/reports/council_blog_001.md"
}
],
"summary": {
"consensus": 2,
"majority": 3,
"minority": 1
}
}
Read-Only By Default
This workflow should be analysis-first by default.
- reviewers should inspect the target and return suggestions
- reviewers should not change code unless the user explicitly asks for proposal patches
If patch proposals are later enabled, they can still run through orch with worktrees, but that should be a separate mode.
When To Use It
Use this workflow when:
- the user explicitly asks for structured brainstorming
- the user wants multiple perspectives on a design or codebase
- the user wants proposals ranked by agreement
- the user wants a more rigorous alternative to a single-agent suggestion list
Do not use it when:
- the task is a simple direct implementation request
- a single code review is enough
- time or cost should be minimized
Relationship To Existing Docs
- architecture.md: overall system split
- orch-cli.md: leader-facing scheduling surface used to execute the council
- inbox-cli.md: transport used by reviewer tasks
Recommended Storage Shape
One simple approach is to add council-specific tables inside the shared orch database.
Suggested tables:
CREATE TABLE IF NOT EXISTS council_runs (
run_id TEXT PRIMARY KEY,
mode TEXT NOT NULL,
target_type TEXT NOT NULL,
output_mode TEXT NOT NULL,
only_unanimous INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS council_inputs (
run_id TEXT PRIMARY KEY,
prompt TEXT NOT NULL DEFAULT '',
target_file TEXT NOT NULL DEFAULT '',
repo_path TEXT NOT NULL DEFAULT '',
target_task_id TEXT NOT NULL DEFAULT '',
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS council_reviewers (
run_id TEXT NOT NULL,
reviewer_role TEXT NOT NULL,
task_id TEXT NOT NULL,
status TEXT NOT NULL,
PRIMARY KEY (run_id, reviewer_role)
);
CREATE TABLE IF NOT EXISTS council_findings (
run_id TEXT NOT NULL,
reviewer_role TEXT NOT NULL,
finding_id TEXT NOT NULL,
title TEXT NOT NULL,
summary TEXT NOT NULL,
proposal TEXT NOT NULL,
rationale TEXT NOT NULL,
confidence TEXT NOT NULL,
tags_json TEXT NOT NULL DEFAULT '[]',
target_refs_json TEXT NOT NULL DEFAULT '{}',
PRIMARY KEY (run_id, reviewer_role, finding_id)
);
CREATE TABLE IF NOT EXISTS council_groups (
run_id TEXT NOT NULL,
group_id TEXT NOT NULL,
proposal TEXT NOT NULL,
bucket TEXT NOT NULL,
support_count INTEGER NOT NULL,
supporters_json TEXT NOT NULL DEFAULT '[]',
dissenters_json TEXT NOT NULL DEFAULT '[]',
rationale_summary TEXT NOT NULL DEFAULT '',
tags_json TEXT NOT NULL DEFAULT '[]',
source_finding_ids_json TEXT NOT NULL DEFAULT '[]',
PRIMARY KEY (run_id, group_id)
);
Embedded Skill Draft
The following block is a draft SKILL.md for the user-facing council review skill.
```markdown
---
name: council-review
description: Use this skill when the user explicitly asks for a multi-reviewer brainstorming or review workflow. It launches three reviewer roles with different perspectives, collects their suggestions, groups similar proposals, tallies agreement, and reports consensus, majority, and minority recommendations. Use it for structured idea generation or design critique, not for ordinary task execution.
---
# Council Review
Use this skill when the user wants a structured three-reviewer brainstorm or review.
## Reviewer Roles
- architecture-reviewer
- implementation-reviewer
- risk-reviewer
## Rules
- Treat this as an analysis workflow, not a code-writing workflow, unless the user explicitly asks for patch proposals.
- Use `orch council` as the execution surface.
- Default to the fixed reviewer roles architecture, implementation, and risk.
- Collect all three reviewer responses before tallying.
- Group similar suggestions before counting votes.
- Use `normal` grouping and `low|medium|high` confidence unless the user asks otherwise.
- If the user asks for unanimous-only output, show only `consensus`.
- Otherwise present `consensus` first, then `majority`, then optional `minority`.
- Support both text and repository context when available.
- Persist the council run and grouped outputs in `orch`.
## Typical Commands
```bash
orch council start --run council_blog_001 --target-file brief.md --target-type mixed --mode brainstorm --output both --json
orch council wait --run council_blog_001 --timeout-seconds 900 --json
orch council tally --run council_blog_001 --similarity normal --json
orch council report --run council_blog_001 --show consensus,majority --json
```
```