Agent skill
speclet-council
Run parallel multi-model reviews on .speclet/draft.md and emit Council artifacts
Install this agent skill to your Project
npx add-skill https://github.com/danielcastro-dev/speclet/tree/main/.opencode/skill/speclet-council
Metadata
Additional technical details for this skill
- phase
- planning
- workflow
- speclet
SKILL.md
Speclet Council Skill
Run a multi-model council review over an existing .speclet/draft.md, then emit audit artifacts.
What I Do
- Validate
.speclet/draft.mdexists before any work - Invoke four reviewers in parallel with per-reviewer timeouts and retries
- Collect critiques and generate a Review Status Header (succeeded vs. failed models)
- Synthesize feedback using Thematic Clustering and collapsible HTML tags
- Write
.speclet/council-session.mdand.speclet/council-summary.md - Write optional
.speclet/draft.review.md(full Council Review) - Support
--dry-runmode with mocked reviewer outputs
When to Use Me
Use this after a draft exists and before converting to spec:
Use the speclet-council skill
Setup (Required)
Reviewers must be configured in your oh-my-opencode.json:
plan-reviewer-opus(architecture)plan-reviewer-sonnet(documentation clarity)plan-reviewer-gemini(edge cases and scalability)plan-reviewer-gpt(implementability)
Permissions (recommended):
read: allowwebfetch: allow (optional)edit: denybash: deny
Do not edit oh-my-opencode.json from this repo; document this setup for the user.
Inputs
.speclet/draft.md(required)- Reviewer prompts in
.opencode/skill/speclet-council/prompts/
Outputs
.speclet/council-session.md(full audit log).speclet/council-summary.md(executive summary).speclet/draft.review.md(optional full review)
Your Task
Step 1: Validate Draft Exists
Check for .speclet/draft.md.
If missing, fail with:
❌ Missing .speclet/draft.md
Run speclet-draft first to create a draft before using speclet-council.
Step 2: Load Reviewer Prompts
Use these prompt templates:
.opencode/skill/speclet-council/prompts/reviewer-opus.md.opencode/skill/speclet-council/prompts/reviewer-sonnet.md.opencode/skill/speclet-council/prompts/reviewer-gemini.md.opencode/skill/speclet-council/prompts/reviewer-gpt.md
Each prompt defines a strict output contract. Pass the draft content inline after the prompt.
Step 3: Parallel Review Invocation
Launch all reviewers in parallel using call_omo_agent with run_in_background=true.
Pseudo-flow:
for (const reviewer of ["opus", "sonnet", "gemini", "gpt"]) {
const prompt = `[PROMPT TEMPLATE CONTENT]\n\nDraft Content:\n${draftContent}`;
call_omo_agent(
subagent_type="explore",
description=`Council Review: ${reviewer}`,
prompt=prompt,
run_in_background=true,
session_id=reviewer
);
}
Defaults:
- Per-reviewer timeout: 500s
- Max retries: 3
- Backoff: 1s → 2s → 4s
Step 4: Classify Errors and Retry
Retry only for transient errors. If using call_omo_agent, monitor the task status via background_output.
Transient errors:
- Timeouts
- Rate limit / 429
- Temporary network failures
Do not retry for:
- Invalid model name
- Permission denied
- Missing agent configuration
If a reviewer fails after max retries, record the failure and continue.
Step 5: Collect Results
Retrieve each task with background_output(task_id="...", block=true) and map it back to its reviewer.
Note: Ensure you wait for all tasks to complete or timeout before proceeding to synthesis.
Review Status Header: Generate a summary table or list showing the status of each reviewer.
- ✅ [Model Name] (Success)
- ⚠️ [Model Name] (Failed/Timeout)
If zero reviewers succeed, fail with:
❌ All reviewers failed
Check API keys, network, or agent configuration. Try again or reduce the reviewer set.
Step 6: Synthesize Council Review
Use a specialized synthesis prompt to consolidate all issues using Thematic Clustering:
- Thematic Grouping: Identify shared problems across reviewers and group them under a single descriptive heading.
- Nuance Preservation: Do NOT delete unique details. If Reviewer A found a race condition and Reviewer B found a general concurrency limit in the same area, list them both as distinct perspectives under the same theme.
- UX Formatting: Use HTML
<details>and<summary>tags. The summary MUST contain the severity (🔴 HIGH, 🟡 MEDIUM, 🟢 LOW) and the theme title. - Reviewer Attribution: Clearly state which models identified each issue.
- Language Parity: Detect the language of the draft and ensure the synthesis matches it exactly.
- HTML Integrity: Ensure all
<details>blocks are correctly opened and closed.
Write the full Council Review into .speclet/draft.review.md (not into draft.md).
# Council Review
### Status
- ✅ plan-reviewer-opus
- ✅ plan-reviewer-sonnet
- ⚠️ plan-reviewer-gemini (Timeout)
- ✅ plan-reviewer-gpt
<details>
<summary>🔴 HIGH: [Theme Title]</summary>
- **Reviewers:** Opus, GPT
- **Problem:** [Consolidated description of the theme]
- **Specific Notes:**
- **Opus:** [Unique architectural nuance]
- **GPT:** [Unique implementation detail]
- **Consolidated Suggestion:** [Actionable fix merging both suggestions]
</details>
Step 7: Write Council Artifacts
Write .speclet/council-session.md with a deterministic audit log:
# Council Session
- Started: YYYY-MM-DD HH:MM
- Finished: YYYY-MM-DD HH:MM
## Review Tasks
- plan-reviewer-opus
- task_id: <id>
- status: success|failed
- attempts: N
- error: [if failed]
- plan-reviewer-sonnet
- task_id: <id>
- status: success|failed
- attempts: N
- error: [if failed]
## Critiques
### plan-reviewer-opus
[raw critique output]
### plan-reviewer-sonnet
[raw critique output]
Write .speclet/council-summary.md as an executive summary:
# Council Summary
- Total issues: N
- By severity: High H / Medium M / Low L
- By reviewer: opus X / sonnet Y / gemini Z / gpt W
## Decisions
- Accepted: [list]
- Rejected: [list]
- Deferred: [list]
## Draft Changes
- Council Review saved to .speclet/draft.review.md
Step 8: Git Commit Rule
If the repo is clean and draft changes were written, create a commit for the specific artifacts:
git add .speclet/council-session.md .speclet/council-summary.md .speclet/draft.review.md
git commit -m "feat(speclet-council): save council review"
If repo is dirty or git is unavailable, skip the commit and warn the user.
Step 9: Dry-Run Mode
When invoked with --dry-run:
- Do not call external models
- Use mocked reviewer outputs embedded in the skill
- Still write council-session.md, council-summary.md, and draft.review.md
Use this to validate the workflow without API costs.
Notes
- This skill never modifies
draft.md; use speclet-consolidate to merge accepted feedback. - English-First Protocol: Internal orchestration prompts and background task instructions are in English for reliability, but final user-facing output matches the draft's language.
- Webfetch policies can only be enforced via reviewer prompts or disabled in agent config.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
speclet-loop
Deprecated. Use /ralph-loop instead.
speclet-consolidate
Merge accepted council feedback into draft.md and keep review artifacts separate
speclet-draft
Generate a collaborative draft document with clarifying questions for a new feature
speclet-spec
Convert a draft document into an executable spec.json with trackable stories
speclet-ticket
Convert a large draft into individual tickets for isolated implementation sessions
speclet-learn
Generate explanatory lessons after completing speclet stories to develop mechanical coding fluency
Didn't find tool you were looking for?