
Models Consensus
- 30 installs
- 1 repo stars
- Updated August 4, 2026
- robsonrung/rar-skills
Runs a multi-round, stance-driven multi-model council with blinded analyses, moderated rebuttals, and a final decision report over native and runner seats.
About
A skill that moderates a council of multiple AI model seats through structured disagreement, rebuttals, and synthesis to reach a decision. A developer uses it when a repository design or architecture decision benefits from multi-model validation and tradeoff surfacing.
- Multi-round stance-driven council with blinded openings, rebuttals and a decision report
- Moderates native and runner-backed seats across Opus, Codex, Gemini, GLM, Kimi and more
Models Consensus by the numbers
- 30 all-time installs (skills.sh)
- +6 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #9,316 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/robsonrung/rar-skills --skill models-consensusAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 30 |
|---|---|
| repo stars | ★ 1 |
| Last updated | August 4, 2026 |
| Repository | robsonrung/rar-skills ↗ |
What it does
Runs a multi-round, stance-driven multi-model council with blinded analyses, moderated rebuttals, and a final decision report over native and runner seats.
Files
Models Consensus
Moderate a council of native seats and local runner skills. Do not act as one of the voting seats. The moderator's job is to run a deterministic preflight, launch only real seats, preserve independence accounting, surface disagreements that actually change scope or behavior, and enforce cost and recovery guardrails.
Seat Discovery
Detect available seats from host-native tools and installed CLI runners. See references/repo-configuration.md for the repository-specific seat catalog, default models, and CLI prerequisites. Adapt RUNNER_BASE_PATH when using this skill in another repository.
Do not claim a seat participated unless the preflight confirms a real execution path for it.
Host Tool Compatibility
Council logic is host-agnostic, but concrete tools differ by platform. See references/runner-invocations.md for the full host capability mapping and native vs. runner launch patterns. Branch all seat launch instructions by host capability.
For any user-facing question, use the Interactive Questions protocol.
Mandatory Preflight
Run preflight before building any round prompt.
0. Resolve seat selection mode
Before the full preflight, determine whether seat selection is automatic or user-directed. Always resolve startup seat selection before running smoke tests or launching any round.
- Accept
auto: truein a structured payload. - Accept
--autoin a free-form user request as shorthand forauto: true. - If
autoor--autois present, skip the startup seat-selection question and target every available seat. Only target all seats when--autoorauto: trueis explicitly set; do not auto-select seats just because interactive startup questioning is unavailable. - Otherwise, ask the user which models or CLIs to use before running smoke tests or launching any round. Never skip the startup seat-selection question in non-
--autoruns. - In non-
--autoruns, if startup selection is still unresolved after the available question channels, stop withawaiting_user_decision.
Selection workflow:
- Do a lightweight capability discovery first: detect host-native seat support and runner binary presence only.
- Build a
candidate_seatslist from that lightweight discovery. - Ask one startup selection question following the Interactive Questions protocol.
- Prefer one multi-select question when the host supports it, rather than a series of yes/no prompts. Include
All available (Recommended)plus the detected candidate seats. - Multi-select startup prompt template:
Which models to use? [ ] All available (Recommended) [ ] Claude Opus 4.8 [ ] Claude Sonnet 4.6 [ ] Codex [ ] Gemini [ ] Kimi [ ] Gemma [ ] GLM [ ] Minimax Omit seats that are not present in candidate_seats.
- If the host tool only supports a small single-choice menu, ask a preset question with:
1. All available (Recommended) 2. Core seats only 3. Specify seats manually
- If the user chooses manual selection, ask one concise follow-up question listing the detected seat IDs and accept a comma-separated subset. Use an interactive follow-up question when the host supports one; use a plain-text seat-picking follow-up only when needed.
- Plain-text startup prompt template when no interactive selection tool is available:
Which models to use? Detected seats: <comma-separated seat IDs> Reply with a comma-separated subset or 'all'. Set selection_source=plain_text_manual when this fallback branch is used, and wait for user input.
- Treat
Core seats onlyas the highest-diversity non-duplicate set available. See references/repo-configuration.md for the core-seats definition. - Persist
selected_seatsandselection_sourcein state, and emit the selected and omitted seats, before continuing to smoke tests.
1. Detect host-native seats
- If
Agentexists, Claude Opus 4.8 and Claude Sonnet 4.6 use native seats. - If
spawn_agentandwait_agentexist, Codex uses a native seat. - Otherwise, those seats may use runner scripts if the local CLI exists.
2. Check local runner prerequisites
Use shell commands to verify binaries, auth, and one cheap headless smoke test for every runner-backed seat you intend to launch. Only run smoke tests for seats included by selected_seats or by --auto.
Minimum checks:
claudeinPATHgeminiinPATHkimi-cliinPATHwhen the Kimi seat is under considerationqweninPATHwhen any Gemma, GLM, or Minimax seat is under consideration
Mandatory seat smoke tests:
- Run a minimal non-interactive invocation for every runner-backed seat with the exact model you plan to use.
- Run every runner-backed seat with
--disable-fallback. Councils must fail a seat explicitly instead of silently borrowing another provider. - See references/runner-invocations.md for per-seat auth rules, including the critical Claude
--barerule and Qwen transport rule.
Treat missing binaries, missing credentials, or failing smoke tests as seat blockers, not soft warnings.
3. Determine artifact mode
Prefer persisted artifacts in .ai-workflow/consensus/ only when writes are safe.
Set artifact mode to:
persistedwhen.ai-workflow/consensus/exists or its parent is writableinlinewhen writes are blocked, risky, or unavailable in the current mode
Apply the per-mode behaviors from references/operations.md#artifact-policy.
4. Build a seat table
For each potential seat, record:
seatselection_status:selected,omitted_by_user, orunavailablerequested_runnerexecution_path:native,runner, orunavailableeffective_providereffective_modelwhen knownblocked_reasonwhen unavailable
Do not launch any seat until this table is complete.
Deterministic Seat Selection
Use these rules:
1. Prefer native Claude seats over claude-runner. 2. Prefer native Codex seats over any CLI path. 3. On a Codex host, the Codex seat must run as a native subagent. 4. Use runner scripts only when the native seat path is unavailable. 5. Treat runner fallback to another provider as loss of seat independence. 6. If Gemini CLI is missing, skip Gemini entirely. 7. If Kimi CLI is missing, skip Kimi entirely. 8. If Qwen CLI is missing, skip Gemma, GLM, and Minimax entirely. 9. Use GLM Critic only after all unique-provider seats have been considered. 10. Treat Gemma, GLM, and Minimax as separate providers for diversity accounting unless the smoke test proves they resolve to the same effective provider and model. 11. Continue with the remaining seats and lower confidence; never fabricate a missing seat.
Cost Governance and Crash Recovery
Both procedures live in references/operations.md; read them on demand:
- When more than 4 seats are selected, read references/operations.md#cost-governance before launching seats and apply its cost-transparency rules.
- At preflight, if
state_pathexists withstatus != complete, read references/operations.md#crash-recovery-and-state-resumption and resume from state instead of restarting.
Response Schema Validation
Seat outputs ARE schema-validated before they enter the moderator digest: each is checked against the per-round required-field list, retried once on failure, then marked malformed_output and excluded if still invalid. The field lists, validation behavior, and the retry schema-reminder template live in references/operations.md#response-schema-validation.
Interactive Questions
Every user-facing question must use the best available interactive host tool first, on both CLI and app surfaces. Treat plain-text questioning as a last resort only when no interactive tool is available in the current host or mode.
Questioning workflow: 1. Detect which interactive question/input tools are exposed by the current host and current mode. 2. Prefer a tool that can present structured choices or multiple short questions in one call. 3. If the first tool is unavailable, unsupported in the current mode, or errors immediately, try the next interactive tool. 4. Use concise plain-text questions only after exhausting interactive tool options.
Preferred host mappings:
- Claude Code:
AskUserQuestion - Codex:
request_user_inputwhen the current mode exposes it - any other host: the equivalent native interactive question/input tool, if available
- only if none of the above are available: a concise plain-text question with 2-3 options
Additional rules:
- Never choose plain text just because an interactive tool is less convenient.
- If only one question fits per interactive call, use repeated interactive calls rather than switching to plain text.
- When the host supports multiple questions in one call, batch related questions together to reduce back-and-forth.
Never tell the user to reply with numbered choices when an interactive question tool exists.
Startup seat-selection question: governed by preflight step 0 — that is the single normative rule for when and how to ask.
Degrade Gracefully
Apply these rules when the council cannot run at full strength:
- Missing seat: continue and lower overall confidence one level.
- Fallback seat: mark the original seat as unavailable for independence accounting.
- Shared provider, different models: keep both seats but note the shared-provider caveat.
- Same effective provider and same model: collapse to one independent source and call out the lost diversity.
- Malformed output: retry once, then mark seat unavailable and continue.
- Inline artifact mode: return
report_path=nullandstate_path=null, plus a note that persistence was skipped because writes were unavailable.
Use confidence bands:
high: 4+ independent seats with no critical blockersmedium: 2-3 independent seats, or meaningful fallback duplicationlow: 1 independent seat, or unresolved blockers on key disagreement points
Moderator time budget:
- Prefer a finite moderation window for opening statements. Recommended defaults: 2-3 minutes for native seats, 10-15 minutes for runner seats.
- Once at least 3 independent providers have completed and the major disagreements are already clear, stop waiting unless another seat is likely to change the decision materially.
- After moderation cutoff, close native seats you no longer need and kill unfinished runner processes so councils do not leave background work behind.
Input Format and Mode Behavior
The input payload schema (question, context_files, max_iterations, session_id, auto, mode, plus the --auto shortcut) and the per-mode pausing behavior are in references/operations.md#input-format and references/operations.md#mode-behavior. Startup seat selection is governed by preflight step 0 in all modes.
Council Model
Assign one stance per active seat per round. See references/stance-rotation-schedule.md for the explicit per-seat, per-round stance mapping and fallback rules.
Available stances:
supportive_with_integritycritical_with_responsibilitybalanced_synthesisdevils_advocatepragmatic_engineering
The stance-to-runner-role mapping lives in the same reference.
If fewer seats are available than unique stances, drop duplicate coverage before dropping unique stances.
Discussion Protocol
1. Build the shared brief
Always include:
- the question
- context file paths only
- the current objective
- previous round digest and user decisions when
iteration > 1 - the required response schema
In persisted mode, write prompt files only for runners that need them. In inline mode, keep the brief in memory and pass it directly.
2. Run blinded opening statements
Round 1 inputs:
- shared brief
- stance overlay
- no peer outputs
- no moderator conclusion
Required response schema: the Round 1 fields from Response Schema Validation.
3. Moderate the round
Normalize outputs into:
agreement_pointsdisagreement_pointsdecision_optionsevidence_gapsfollow_up_questions
Do not paste long verbatim runner output into later rounds. Pass only a compact moderator digest.
4. Run rebuttal and refinement rounds
Later rounds get:
- shared brief
- current stance overlay
- prior moderator digest
- explicit instructions to rebut, concede, refine, or integrate
Required response schema: the later-rounds fields from Response Schema Validation.
5. Classify convergence
Use one of:
full_agreementconvergingmaterial_disagreementblocked_on_context
Heuristic definitions:
full_agreement: all selected seats share the samerecommended_directionand no seat raises a blocking objection.converging: all seats agree onrecommended_directionbut differ on implementation details, risk weighting, or acceptance criteria.material_disagreement: ≥2 seats hold opposingrecommended_directionvalues, and at least one objection affects scope, behavior, or architecture (not style or preference).blocked_on_context: seats agree that the question cannot be answered without additional information, file contents, or external validation.
Capture:
agreement_pointsdisagreement_pointsleading_optionminority_concernsopen_questions
6. Handle disagreement
Trigger when:
- disagreement remains material after a round
- the decision depends on priorities or preferences
- more context is required
- any recommendation would lead to code or document changes
In interactive mode, ask focused questions with: 1. recommended option first 2. minority alternative(s) 3. Run another round to refine positions when another round could help
Ask these questions using the Interactive Questions protocol.
If a required answer is still missing after available question channels, stop with awaiting_user_decision.
In autonomous mode:
- record each disagreement
- include
recommended_resolution - include
resolution_reasoning - continue to stop conditions
7. Update state
When artifact mode is persisted, update state after every iteration with:
- assigned stances
- seat outputs
- moderator digest
- convergence classification
- user decisions
- recommendation log
- runner execution metadata
- independence accounting
When artifact mode is inline, keep the same structure in memory and return it inline instead of writing it.
8. Stop condition
Stop when:
- full agreement is reached
- the user selects a direction in
interactivemode - all rounds complete in
autonomousmode max_iterationsis reached
9. Handoff after approval
Only after the user approves a direction:
- build a compact handoff brief
- include the final recommendation, minority concerns, and acceptance criteria
- use a native seat when available
- otherwise invoke the selected runner with
--role implementeror--role codereviewer
Do not hand off automatically when the user asked only for analysis.
Final Report
When artifact mode is persisted, write .ai-workflow/consensus/{session_id}.md with: 1. question and status 2. preflight summary, including seat selection source and selected seats 3. iteration summary 4. agreement points 5. divergence points 6. user decision summary for any non-unanimous result 7. final recommendation 8. recommended next runner and handoff goal 9. confidence assessment
When artifact mode is inline, return the same sections inline.
Output Contract
Return: 1. report_path or null 2. state_path or null 3. concise inline summary 4. preflight seat table 5. selected seats and selection source
Important Rules
1. Preflight first. Never launch seats from assumptions. 2. Resolve seat selection per preflight step 0 before running smoke tests or rounds. 3. Use the same shared brief for every participant in a round; only the stance overlay changes. 4. Keep opening statements blinded from peer outputs. 5. Treat the moderator as separate from all council seats. 6. Rotate stances across iterations using references/stance-rotation-schedule.md to reduce model-position bias. 7. Continue gracefully when one runner fails; never fabricate missing outputs. 8. In interactive mode, never apply recommendation-derived edits without explicit user approval. 9. Prefer continuation over repetition when moving from consensus to implementation.
interface:
display_name: "Models Consensus"
short_description: "Moderate a multi-model decision council"
default_prompt: "Use $models-consensus to moderate a stance-driven council across all detected model seats for this repository decision."
Operations Reference
Operational detail for models-consensus: cost governance, crash recovery, response schema validation, artifact policy, runner launch policy, input format, and mode behavior. Read the relevant section when its trigger in SKILL.md fires.
Cost Governance
Multi-model councils can be expensive. Enforce cost transparency before launching seats.
Pre-flight cost estimate:
- After seat selection, estimate total token volume:
(selected_seats.count) × (avg_input_tokens + avg_output_tokens). - Use rough defaults: ~4k input tokens per seat (brief + context), ~2k output tokens per seat.
- Warn the user when >4 seats are selected in non-auto mode: "Council will invoke N models, roughly X tokens total across providers. Proceed?"
Token budgets:
- Cap per-seat output at ~4k tokens for moderation feasibility.
- If shared brief + context files exceed ~8k tokens per seat, truncate or summarize context files before the round.
- Prefer concise briefs over verbatim file dumps.
Cost-conscious defaults:
- In non-
--autoruns, make "Core seats only" the recommended startup choice rather than "all available." - When
--autoselects 5+ seats, emit a cost warning before the first round. - Track cumulative token usage across rounds in state for post-council reporting.
Crash Recovery and State Resumption
Council state is resumable. Treat .ai-workflow/consensus/{session_id}.json as the source of truth for progress.
Resume handshake:
- At preflight, check if
state_pathexists andstatus != complete. - If resuming, load prior round outputs, seat assignments, and moderator digests from state.
- Set
resumed_fromto the previous state'slast_completed_round. - Skip to the next uncompleted round; do not re-run completed rounds.
Orphaned process cleanup:
- When resuming, identify any runner PIDs or background tasks from the prior session and terminate them before launching new seats.
- In
inlinemode, recovery is limited to what fits in the current context; persist key digests to state when possible.
State update cadence:
- In
persistedmode, write state after every iteration. - In
inlinemode, still build the same state structure in memory so it can be returned or persisted if the mode changes.
Response Schema Validation
Validate seat outputs before accepting them into the moderator digest. Seat outputs ARE schema-validated against the field lists below.
Round 1 required fields:
stanceposition_summarykey_argumentsrisks_or_limitsrecommended_directionconfidencequestions_for_the_council
Later rounds required fields:
updated_positionwhat_changedpoints_concededremaining_objectionsbest_next_stepconfidence
Validation behavior:
- If a response is missing required fields, retry once with a compact schema reminder prepended to the prompt.
- If the retry also fails, mark the seat as
malformed_output, exclude it from the digest, and degrade gracefully. - Do not fabricate missing fields from the seat's partial output.
Schema reminder template (prepend to prompts when retrying):
Respond in JSON with exactly these top-level keys: [list keys].
No markdown fencing. No extra commentary outside the JSON object.Artifact Policy
Determine artifact mode in preflight, then apply the per-mode behaviors here.
When artifact mode is persisted, use:
- state:
.ai-workflow/consensus/{session_id}.json - report:
.ai-workflow/consensus/{session_id}.md - per-round outputs:
.ai-workflow/consensus/{session_id}-round-{n}-{seat}-output.json - optional prompt files only when the selected runner requires them
- prefer runner-level
--output-filewrites over shell redirection so incomplete seats do not leave misleading zero-byte artifacts
When artifact mode is inline:
- do not create temp prompt files; build prompts in memory
- do not require
.ai-workflow/consensus/ - return the final report and state inline, with
report_pathandstate_pathset tonull - keep round digests and moderator digests in memory
Runner Launch Policy
Launch seats using native host tools when available; fall back to runner scripts only when native paths are unavailable. See runner-invocations.md for complete invocation patterns, auth rules, and the runner output contract.
Runner seats invoke local CLIs and may send prompt context, selected files, and runner metadata to their configured providers. Prefer --restrict-tools for review and planning seats. Do not pass permission bypass or full auto flags unless the user has explicitly approved unattended write capable execution for that run.
Key flags for every runner-backed seat:
--disable-fallback(mandatory)--timeout 900--jsonfor wrapper envelope--output-filefor persisted artifacts
In inline mode, combine stance and brief into a single positional prompt. In persisted mode, use --prompt-file flags when the runner supports them.
Input Format
Expected input payload:
question: requiredcontext_files: optional list of repo-relative or absolute file pathsmax_iterations: optional, default4session_id: required unique identifierauto: optional boolean, defaultfalsemode: optional,interactive(default) orautonomous
Free-form shortcut:
--autois equivalent toauto=true
Mode Behavior
Startup seat selection is governed by preflight step 0 in SKILL.md (the single normative rule). Mode only affects later pausing:
interactive: pause later only when disagreement is material or preference-sensitive.autonomous: run the rounds without further pauses and return recommendations and reasoning.
Repository Configuration
This reference documents the default seat-to-runner mapping for a repository. Adapt paths and model defaults if using this skill in another project.
Runner Base Path
In this repo, all runner scripts live under:
.agents/skills/{runner-name}/scripts/run_{runner-name}.pyWhen adapting this skill to another project, update the base path or set a RUNNER_BASE_PATH variable.
Available Seats
| Seat | Native Tool | Runner Fallback | Default Model |
|---|---|---|---|
| Claude Opus 4.8 | Agent (Claude Code) | claude-runner --model claude-opus-4-8 | claude-opus-4-8 |
| Claude Sonnet 4.6 | Agent (Claude Code) | claude-runner --model claude-sonnet-4-6 | claude-sonnet-4-6 |
| Codex | spawn_agent + wait_agent (Codex host) | codex-runner --model gpt-5.5 | gpt-5.5 |
| Gemini | — | gemini-runner | runner default or verified local CLI model |
| Kimi | — | kimi-runner --model kimi-code/kimi-for-coding | kimi-code/kimi-for-coding |
| Gemma | — | gemma-runner --model google/gemma-4-31b-it | google/gemma-4-31b-it |
| GLM Pragmatic | — | glm-runner --model z-ai/glm-5.2 | z-ai/glm-5.2 |
| GLM Critic | — | glm-runner --model z-ai/glm-5.2 | z-ai/glm-5.2 |
| Minimax | — | minimax-runner --model minimax/minimax-m2.7 | minimax/minimax-m2.7 |
CLI Prerequisites
| Seat(s) | Required Binary | Notes |
|---|---|---|
| Claude (runner fallback) | claude | Must pass auth smoke test |
| Gemini | gemini | Must pass auth smoke test |
| Kimi | kimi-cli | Must pass auth smoke test |
| Gemma, GLM, Minimax | qwen | Shared transport; must pass per-model smoke test |
Core Seats Definition
"Core seats" refers to the highest-diversity non-duplicate set available: 1. Native Codex (when on Codex host) 2. Native Claude seats (when on Claude Code host) 3. Gemini 4. Kimi 5. One of Gemma or GLM
Duplicate-coverage seats (e.g., GLM Critic) are only considered after core seats are exhausted.
Artifact Directory
Persisted council artifacts write to:
.ai-workflow/consensus/In this repo, the .ai-workflow/ directory is guaranteed writable.
Runner Invocation Reference
Complete invocation patterns for every council seat, organized by host capability.
Table of Contents
1. Host Tool Mapping 2. Native Seat Patterns 3. Runner Fallback Patterns 4. Auth and Transport Rules 5. Runner Output Contract
---
Host Tool Mapping
Treat host tooling as a compatibility layer. Council logic stays the same; concrete tools differ by platform.
| Capability | Claude Code | Codex |
|---|---|---|
| Native Claude seat | Agent | unavailable |
| Native Codex seat | unavailable | spawn_agent + wait_agent |
| Interactive question UI | AskUserQuestion | request_user_input when available, otherwise any equivalent host-native interactive input tool before plain-text fallback |
| Shell execution | Bash / Shell | exec_command |
| Read persisted output | Read / ReadFile | exec_command (sed, cat, python3 -m json.tool) |
Never refer to Claude-only tool names as if they are universal. Branch all seat launch instructions by host capability. When the workflow needs user input, use the Interactive Questions protocol in SKILL.md.
---
Native Seat Patterns
Claude Opus 4.8 (Claude Code host)
Agent(
subagent_type="general-purpose",
description="Claude Opus 4.8 council seat — round {n}",
model="claude-opus-4-8",
prompt="<stance overlay>\n\n---\n\n<shared brief>",
run_in_background=true
)Use model="claude-sonnet-4-6" for the Sonnet 4.6 seat.
Codex (Codex host)
spawn_agent(
fork_context=false,
model="gpt-5.5",
reasoning_effort="medium",
message="<stance overlay>\n\n---\n\n<shared brief>"
)For adversarial or research-heavy rounds, raise reasoning_effort to high.
If full-history context inheritance is needed, either spawn without explicit model and reasoning_effort overrides, or keep fork_context=false and pass the task-local brief directly.
Critical: On a Codex host, do not invoke codex-runner or codex exec for the Codex seat.
---
Runner Fallback Patterns
Use runner scripts only when the native seat path is unavailable. Pass --disable-fallback so councils fail a seat explicitly instead of silently borrowing another provider.
Claude Opus 4.8 / Sonnet 4.6 (runner fallback)
python3 .agents/skills/claude-runner/scripts/run_claude.py \
--prompt-file .ai-workflow/consensus/{session_id}-round-{n}-stance-claude-opus.md \
--prompt-file .ai-workflow/consensus/{session_id}-round-{n}-brief.md \
--timeout 900 \
--role planner \
--model claude-opus-4-8 \
--output-format json \
--json \
--no-session-persistence \
--restrict-tools \
--disable-fallback \
--output-file .ai-workflow/consensus/{session_id}-round-{n}-claude-opus-output.json \
--metadata-json '{"session":"{session_id}","round":{n},"seat":"claude-opus","stance":"supportive_with_integrity"}'Use --model claude-sonnet-4-6 for the Sonnet 4.6 seat.
In inline artifact mode, combine the prompt and pass it as a single positional prompt instead of --prompt-file flags.
Codex (runner fallback — non-Codex hosts only)
python3 .agents/skills/codex-runner/scripts/run_codex.py \
--prompt-file .ai-workflow/consensus/{session_id}-round-{n}-codex.md \
--timeout 900 \
--role challenger \
--model gpt-5.5 \
--effort high \
--json \
--ephemeral \
--restrict-tools \
--disable-fallback \
--output-file .ai-workflow/consensus/{session_id}-round-{n}-codex-output.json \
--metadata-json '{"session":"{session_id}","round":{n},"seat":"codex","stance":"devils_advocate"}'codex-runner supports --effort none|minimal|low|medium|high|xhigh. Use high for adversarial or research-heavy rounds, mirroring the native Codex seat guidance.
Gemini
python3 .agents/skills/gemini-runner/scripts/run_gemini.py \
--prompt-file .ai-workflow/consensus/{session_id}-round-{n}-gemini.md \
--timeout 900 \
--role synthesizer \
--json \
--output-format json \
--disable-fallback \
--output-file .ai-workflow/consensus/{session_id}-round-{n}-gemini-output.json \
--metadata-json '{"session":"{session_id}","round":{n},"seat":"gemini","stance":"balanced_synthesis"}'Do not depend on speculative Gemini-only flags such as --thinking-budget or a read-only convenience mode.
Kimi
python3 .agents/skills/kimi-runner/scripts/run_kimi.py \
--prompt-file .ai-workflow/consensus/{session_id}-round-{n}-kimi.md \
--timeout 900 \
--role implementer \
--model kimi-code/kimi-for-coding \
--output-format stream-json \
--json \
--no-session-persistence \
--restrict-tools \
--disable-fallback \
--output-file .ai-workflow/consensus/{session_id}-round-{n}-kimi-output.json \
--metadata-json '{"session":"{session_id}","round":{n},"seat":"kimi","stance":"pragmatic_engineering"}'Gemma
python3 .agents/skills/gemma-runner/scripts/run_gemma.py \
--prompt-file .ai-workflow/consensus/{session_id}-round-{n}-gemma.md \
--timeout 900 \
--role planner \
--model google/gemma-4-31b-it \
--output-format stream-json \
--json \
--no-session-persistence \
--restrict-tools \
--disable-fallback \
--output-file .ai-workflow/consensus/{session_id}-round-{n}-gemma-output.json \
--metadata-json '{"session":"{session_id}","round":{n},"seat":"gemma","stance":"supportive_with_integrity"}'GLM Pragmatic
python3 .agents/skills/glm-runner/scripts/run_glm.py \
--prompt-file .ai-workflow/consensus/{session_id}-round-{n}-glm.md \
--timeout 900 \
--role implementer \
--model z-ai/glm-5.2 \
--output-format stream-json \
--json \
--no-session-persistence \
--restrict-tools \
--disable-fallback \
--output-file .ai-workflow/consensus/{session_id}-round-{n}-glm-output.json \
--metadata-json '{"session":"{session_id}","round":{n},"seat":"glm","stance":"pragmatic_engineering"}'GLM Critic
Use only as a duplicate-coverage seat after unique-provider seats are accounted for.
python3 .agents/skills/glm-runner/scripts/run_glm.py \
--prompt-file .ai-workflow/consensus/{session_id}-round-{n}-glm-critical.md \
--timeout 900 \
--role codereviewer \
--model z-ai/glm-5.2 \
--output-format stream-json \
--json \
--no-session-persistence \
--restrict-tools \
--disable-fallback \
--output-file .ai-workflow/consensus/{session_id}-round-{n}-glm-critical-output.json \
--metadata-json '{"session":"{session_id}","round":{n},"seat":"glm-critical","stance":"critical_with_responsibility"}'Minimax
python3 .agents/skills/minimax-runner/scripts/run_minimax.py \
--prompt-file .ai-workflow/consensus/{session_id}-round-{n}-minimax.md \
--timeout 900 \
--role challenger \
--model minimax/minimax-m2.7 \
--output-format stream-json \
--json \
--no-session-persistence \
--restrict-tools \
--disable-fallback \
--output-file .ai-workflow/consensus/{session_id}-round-{n}-minimax-output.json \
--metadata-json '{"session":"{session_id}","round":{n},"seat":"minimax","stance":"devils_advocate"}'---
Auth and Transport Rules
--disable-fallback
Always pass --disable-fallback to runner-backed seats. Councils must fail a seat explicitly instead of silently borrowing another provider.
Claude --bare rule
Do not use --bare for Claude runner seats when relying on Claude OAuth or keychain-backed login. Claude's own help states that --bare disables OAuth and keychain auth, so a logged-in terminal can still fail with Not logged in in headless mode if --bare is passed. Only use --bare when ANTHROPIC_API_KEY or an explicit apiKeyHelper-based configuration is the intended auth path.
Qwen transport rule
Treat the shared qwen CLI as transport, not independence. Gemma, GLM, and Minimax remain distinct seats when their effective providers or models differ, even though they share the same local wrapper binary.
---
Runner Output Contract
All runner-script paths return a wrapper envelope with fields such as:
successstdoutstderrreturn_coderunnereffective_runnerroleprompt_fileorprompt_fileswhen applicablesession_filewhen applicable
Important:
--jsoncontrols the wrapper envelope.- Native CLI JSON or JSONL output stays in
stdout. - Every runner skill in this repo emits
agent_message(the clean final answer) when it can extract one, andsession_idwhen the underlying CLI reports it — preferagent_messageover parsingstdout. For the Claude seat this requires--output-format jsonorstream-json. Do not assumeusageor token-cost fields exist unless the specific runner emitted them. - When
--output-fileis used, treat the file as the source of truth. Stdout may be only a small acknowledgment payload.
Normalize native-seat output into the same envelope shape before comparing seats.
Stance Rotation Schedule
Rotate stances across iterations to reduce model-position bias. The moderator applies this schedule per seat based on the round number.
Round 1: Natural Stances
Each model starts in its natural role:
| Seat | Round 1 Stance | Runner Role |
|---|---|---|
| Claude Opus 4.8 | critical_with_responsibility | codereviewer or adversarial |
| Claude Sonnet 4.6 | supportive_with_integrity | planner or implementer |
| Codex | devils_advocate | challenger |
| Gemini | balanced_synthesis | synthesizer |
| Kimi | pragmatic_engineering | implementer |
| Gemma | supportive_with_integrity | planner |
| GLM Pragmatic | pragmatic_engineering | implementer |
| GLM Critic | critical_with_responsibility | codereviewer or adversarial |
| Minimax | devils_advocate | challenger |
The Runner Role column above is the canonical stance-to-runner-role mapping (supportive_with_integrity -> planner or implementer, critical_with_responsibility -> codereviewer or adversarial, balanced_synthesis -> synthesizer, devils_advocate -> challenger, pragmatic_engineering -> implementer). For blocked_on_context investigation rounds, use the researcher runner role.
Round 2: Cross-Stance Pressure
Each seat adopts a stance that challenges its Round 1 position:
| Seat | Round 2 Stance | Purpose |
|---|---|---|
| Claude Opus 4.8 | balanced_synthesis | Step back and weigh alternatives fairly |
| Claude Sonnet 4.6 | critical_with_responsibility | Stress-test the supportive position |
| Codex | critical_with_responsibility | Ground devil's advocacy in constructive critique |
| Gemini | pragmatic_engineering | Move from synthesis to actionable evaluation |
| Kimi | balanced_synthesis | Evaluate tradeoffs beyond implementation details |
| Gemma | pragmatic_engineering | Translate support into concrete feasibility |
| GLM Pragmatic | balanced_synthesis | Evaluate own pragmatism against alternatives |
| GLM Critic | devils_advocate | Escalate critique to fundamental objection |
| Minimax | critical_with_responsibility | Ground adversarial position in specific risks |
Round 3: Convergence / Integration
Final round focuses on integration or decisive critique:
| Seat | Round 3 Stance | Purpose |
|---|---|---|
| Claude Opus 4.8 | pragmatic_engineering | Recommend specific implementation path |
| Claude Sonnet 4.6 | balanced_synthesis | Reconcile findings and recommend direction |
| Codex | balanced_synthesis | Synthesize objections into final assessment |
| Gemini | critical_with_responsibility | Final sanity check on consensus direction |
| Kimi | critical_with_responsibility | Identify last-mile risks in the leading option |
| Gemma | balanced_synthesis | Reconcile support with discovered constraints |
| GLM Pragmatic | critical_with_responsibility | Flag overlooked practical blockers |
| GLM Critic | balanced_synthesis | Channel critique into constructive refinement |
| Minimax | balanced_synthesis | Synthesize adversarial findings into final view |
Fallback Rules
- If fewer than 3 seats are available, skip Round 3 and run only 2 rounds.
- If a seat's output in Round 1 already matches the Round 3 stance for that seat, keep the Round 2 assignment for Round 2 but shift Round 3 to
balanced_synthesisto ensure the seat contributes to convergence. - If the user explicitly pauses the council to provide direction, resume from the next round using the scheduled stance for that round number — do not restart the rotation.