feat(council): four-model council plugin#134
Conversation
|
Caution Review failedThe pull request is closed. 📝 WalkthroughWalkthroughThis PR introduces a five-agent council plugin expanding the ecosystem from 7 to 8 plugins (23 commands, 6 skills, 14 agents). It adds comprehensive agent specifications for Opus captain, Sonnet researcher/synthesizer, Sonnet clarity, and Haiku janitor with inlined identities. It also updates the conversation-analyzer agent and provides an extensive multi-agent orchestration guide. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant OpusCaptain as Opus Captain
participant SonnetR as Sonnet Researcher
participant SonnetS as Sonnet Synthesizer
participant SonnetC as Sonnet Clarity
participant HaikuJ as Haiku Janitor
User->>OpusCaptain: /council [task]
OpusCaptain->>OpusCaptain: Decompose task<br/>into subtasks
OpusCaptain->>SonnetR: Dispatch research<br/>subtasks
OpusCaptain->>SonnetS: Dispatch reasoning<br/>subtasks
par Parallel Execution
SonnetR->>SonnetR: Verify facts<br/>Gather sources<br/>Cite evidence
SonnetS->>SonnetS: Chain reasoning<br/>Validate steps<br/>Identify breaks
end
SonnetR-->>OpusCaptain: Return FINDING/<br/>SOURCE/CONFIDENCE
SonnetS-->>OpusCaptain: Return REASONING/<br/>CONCLUSION/BREAKS
OpusCaptain->>SonnetC: Dispatch clarity<br/>analysis
SonnetC->>SonnetC: Analyze outputs<br/>Identify gaps &<br/>misalignments
SonnetC-->>OpusCaptain: Return GAPS/<br/>ASSUMPTIONS/CONFIDENCE
OpusCaptain->>OpusCaptain: Synthesize draft<br/>using all feedback
OpusCaptain->>HaikuJ: Dispatch for cleanup
HaikuJ->>HaikuJ: Flag bloat<br/>Remove filler<br/>Count words
HaikuJ-->>OpusCaptain: Return BLOAT_FLAG/<br/>CUTS/WORD_COUNT
OpusCaptain->>OpusCaptain: Apply cuts<br/>Finalize answer
OpusCaptain-->>User: Deliver final<br/>answer
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes 🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary of ChangesHello @ANcpLua, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request significantly enhances the system's capabilities by introducing a sophisticated multi-agent Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
The pull request introduces a new 'council' plugin, which orchestrates multiple AI agents (Opus captain, Sonnet researcher, synthesizer, clarity, and Haiku janitor) for complex tasks. This is a significant addition that enhances the multi-agent capabilities of the system. The changes also include various documentation updates across several .md files to reflect the new plugin, update existing rules, and improve clarity. The marketplace.json has been updated to include the new plugin and reflect the increased agent count. The conversation-analyzer.md agent has been upgraded to use the opus model with a rewritten prompt, which should improve its effectiveness. Overall, the changes are well-structured and contribute positively to the project's functionality and documentation.
CLAUDE.md
Outdated
| See `docs/ARCHITECTURE.md` for the complete repository layout, plugin structure, and ecosystem diagram. | ||
|
|
||
| Key paths: | ||
| - Plugins: `plugins/<name>/` — 7 plugins (22 commands, 5 skills, 9 agents) |
There was a problem hiding this comment.
The number of plugins listed here is still 7, but with the addition of the 'council' plugin, it should be 8. Please update this count to maintain accuracy.
| - Plugins: `plugins/<name>/` — 7 plugins (22 commands, 5 skills, 9 agents) | |
| - Plugins: `plugins/<name>/` — 8 plugins (23 commands, 6 skills, 14 agents) |
docs/ARCHITECTURE.md
Outdated
| │ └── dependabot.yml # Dependency update config | ||
| │ └── trigger-docs.yml # Triggers ancplua-docs rebuild on push to main | ||
| │ | ||
| ├── plugins/ # 7 plugins (22 commands, 5 skills, 9 agents) |
There was a problem hiding this comment.
The number of plugins listed in the architecture diagram is outdated. With the addition of the 'council' plugin, the count should be 8. Please update this to reflect the current number of plugins.
| ├── plugins/ # 7 plugins (22 commands, 5 skills, 9 agents) | |
| ├── plugins/ # 8 plugins (23 commands, 6 skills, 14 agents) |
There was a problem hiding this comment.
Pull request overview
Introduces a new plugins/council plugin that defines a multi-agent “council” workflow (captain + specialists + janitor), alongside documentation/ruleset updates and a model upgrade for Hookify’s conversation-analyzer agent.
Changes:
- Added the
councilplugin (agents, command, skill, manifest, README, and “soul” files). - Updated
hookify/agents/conversation-analyzer.mdto useopusand revised its opening prompt. - Refactored/clarified several repo docs and
.claude/rules/*guidance; updated marketplace + changelog accordingly.
Reviewed changes
Copilot reviewed 28 out of 28 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| plugins/hookify/agents/conversation-analyzer.md | Switches agent model to opus and rewrites the initial framing text. |
| plugins/council/.claude-plugin/plugin.json | Adds council plugin manifest (name/version/commands/skills/etc.). |
| plugins/council/README.md | Documents council concept, usage, and structure. |
| plugins/council/commands/council.md | Adds /council command docs describing the dispatch sequence. |
| plugins/council/skills/invoke/SKILL.md | Adds the “invoke” skill describing how the council runs. |
| plugins/council/agents/opus-captain.md | Defines captain agent (orchestration/synthesis). |
| plugins/council/agents/sonnet-researcher.md | Defines researcher agent (evidence-first, WebSearch/WebFetch). |
| plugins/council/agents/sonnet-synthesizer.md | Defines synthesizer agent (step-by-step reasoning/verification). |
| plugins/council/agents/sonnet-clarity.md | Defines clarity agent (gap/assumption/conflict detection). |
| plugins/council/agents/haiku-janitor.md | Defines janitor agent (bloat detection + CUTS list). |
| plugins/council/souls/opus-captain.md | Adds “soul” identity file for captain. |
| plugins/council/souls/sonnet-researcher.md | Adds “soul” identity file for researcher. |
| plugins/council/souls/sonnet-synthesizer.md | Adds “soul” identity file for synthesizer. |
| plugins/council/souls/sonnet-clarity.md | Adds “soul” identity file for clarity agent. |
| plugins/council/souls/haiku-janitor.md | Adds “soul” identity file for janitor. |
| .claude-plugin/marketplace.json | Registers the new council plugin and updates marketplace metadata description. |
| CHANGELOG.md | Records the council plugin addition + various docs/rules changes. |
| docs/ARCHITECTURE.md | Updates repo layout and plugin structure documentation. |
| docs/PLUGINS.md | Updates plugin creation guidance and capability examples. |
| docs/WORKFLOWS.md | Adds notes about commit-integrity hook and cross-repo docs trigger workflow. |
| docs/QUICK-REFERENCE.md | Adds /hookify:help and clarifies Exodia skill invocation vs slash commands. |
| CLAUDE.md | Repoints architecture/CI sections to docs and updates routing tree entries. |
| .claude/rules/thought-transparency.md | Removes sections to avoid duplication/contradiction with other rules. |
| .claude/rules/solid-principles.md | Compresses and replaces bullet list with a responsibility table. |
| .claude/rules/error-handling.md | Adjusts “retry” guidance for local tool failures. |
| .claude/rules/engineering-principles.md | Fixes duplicated #25 tag (now #25b). |
| .claude/rules/devops-calms.md | Renames Recovery Time → MTTR and clarifies coordination channels. |
| .claude/rules/engineering-philosophy.md | Removes duplicated rule file. |
Comments suppressed due to low confidence (1)
docs/ARCHITECTURE.md:45
- The plugin count/command/skill/agent totals in this directory tree are now outdated (it still says 7 plugins / 22 commands / 5 skills / 9 agents). With the new
councilplugin added, update this line and the plugin list below to reflect the current totals and includecouncil.
├── plugins/ # 7 plugins (22 commands, 5 skills, 9 agents)
│ ├── exodia/ # Multi-agent orchestration (9 commands + 2 skills: eight-gates, hades)
│ ├── metacognitive-guard/ # Cognitive amplification + commit integrity + CI
│ ├── otelwiki/ # OpenTelemetry documentation + auto-sync
│ ├── hookify/ # User-configurable rule-based hooks
│ ├── feature-dev/ # Guided feature development + code review
│ ├── dotnet-architecture-lint/# .NET build pattern enforcement
│ └── ancplua-project-routing/ # Cross-repo specialist agent routing
CLAUDE.md
Outdated
| See `docs/ARCHITECTURE.md` for the complete repository layout, plugin structure, and ecosystem diagram. | ||
|
|
||
| Key paths: | ||
| - Plugins: `plugins/<name>/` — 7 plugins (22 commands, 5 skills, 9 agents) |
There was a problem hiding this comment.
The "Key paths" plugin totals are now inconsistent with the repository (it still says 7 plugins / 22 commands / 5 skills / 9 agents, but marketplace metadata and the new council plugin imply 8 / 23 / 6 / 14). Please update the totals here to keep the repo metadata consistent.
| - Plugins: `plugins/<name>/` — 7 plugins (22 commands, 5 skills, 9 agents) | |
| - Plugins: `plugins/<name>/` — 8 plugins (23 commands, 6 skills, 14 agents) |
| "description": "Four-model council: Opus captain coordinates three Sonnet specialists (researcher, synthesizer, clarity) plus a Haiku janitor. Each agent identity lives in its soul CLAUDE.md — passive context, zero activation cost.", | ||
| "author": { | ||
| "name": "ANcpLua", | ||
| "email": "" |
There was a problem hiding this comment.
This plugin.json has a couple of issues that can break validation/consistency: (1) it describes a "Four-model council" but the plugin uses Opus + Sonnet + Haiku (3 models) across 5 agents; (2) author.email is an empty string (prefer omitting the field if unknown); (3) author.name casing differs from other plugin manifests (mostly "AncpLua"). Consider updating these fields to match the repo’s existing manifests and avoid misleading users.
| "description": "Four-model council: Opus captain coordinates three Sonnet specialists (researcher, synthesizer, clarity) plus a Haiku janitor. Each agent identity lives in its soul CLAUDE.md — passive context, zero activation cost.", | |
| "author": { | |
| "name": "ANcpLua", | |
| "email": "" | |
| "description": "Three-model council: Opus captain coordinates three Sonnet specialists (researcher, synthesizer, clarity) plus a Haiku janitor (five agents across Opus, Sonnet, and Haiku). Each agent identity lives in its soul CLAUDE.md — passive context, zero activation cost.", | |
| "author": { | |
| "name": "AncpLua" |
plugins/council/README.md
Outdated
| Inspired by Grok 4.20's 4-agent architecture — same mechanism, adapted for Claude: each agent's identity | ||
| lives in its soul file (`souls/`), loaded as passive context. No activation cost. No "should I use this | ||
| skill?" decision. The agent *is* its soul from token 1. | ||
|
|
There was a problem hiding this comment.
The README states each agent "loads its soul file" and that souls/ contains "the actual identities", but nothing in this plugin references souls/ (the full identity content is duplicated directly in agents/*.md). Either wire up souls/ via a hook/additionalContext mechanism or adjust the README to reflect that the agent definitions themselves contain the identity to avoid drift between the two copies.
CHANGELOG.md
Outdated
|
|
||
| ### Added | ||
|
|
||
| - **`plugins/council`**: New plugin — four-model council (opus-captain, sonnet-researcher, sonnet-synthesizer, sonnet-clarity, haiku-janitor). Each agent identity defined in a soul file (`souls/`) loaded as passive context. Inspired by Grok 4.20's multi-agent architecture. Invoke via `/council [task]`. |
There was a problem hiding this comment.
This CHANGELOG entry says identities are "loaded as passive context" from souls/, but the plugin currently duplicates the identity text directly inside agents/*.md and nothing references souls/. Update the entry to match the actual mechanism (or implement the soul loading) so the changelog is accurate.
| - **`plugins/council`**: New plugin — four-model council (opus-captain, sonnet-researcher, sonnet-synthesizer, sonnet-clarity, haiku-janitor). Each agent identity defined in a soul file (`souls/`) loaded as passive context. Inspired by Grok 4.20's multi-agent architecture. Invoke via `/council [task]`. | |
| - **`plugins/council`**: New plugin — four-model council (opus-captain, sonnet-researcher, sonnet-synthesizer, sonnet-clarity, haiku-janitor). Each agent identity is defined directly in its `agents/*.md` file and used as passive context. Inspired by Grok 4.20's multi-agent architecture. Invoke via `/council [task]`. |
plugins/council/commands/council.md
Outdated
| @@ -0,0 +1,37 @@ | |||
| --- | |||
| description: >- | |||
| Invoke the four-model council on any complex task. Opus captain decomposes and synthesizes. | |||
There was a problem hiding this comment.
The council is described as "four-model" here, but the agents/models listed are Opus + Sonnet + Haiku (3 distinct models) and 5 agents total. Consider renaming this to "multi-model" or "five-agent" (or otherwise clarify what "four-model" means) to avoid misleading users.
| Invoke the four-model council on any complex task. Opus captain decomposes and synthesizes. | |
| Invoke the multi-model, five-agent council on any complex task. Opus captain decomposes and synthesizes. |
plugins/council/README.md
Outdated
| | `sonnet-researcher` | claude-sonnet-4-6 | Evidence, sources, verification — never speculates | | ||
| | `sonnet-synthesizer` | claude-sonnet-4-6 | Logic, code, math — shows all work | | ||
| | `sonnet-clarity` | claude-sonnet-4-6 | Gaps, assumptions, misalignment — blind-spot detection | | ||
| | `haiku-janitor` | claude-haiku-4-5 | Removes filler and redundancy from final output | |
There was a problem hiding this comment.
Model naming is inconsistent here: the table lists haiku-janitor as claude-haiku-4-5, but the agent definition uses claude-haiku-4-5-20251001. Align the README model values with the actual agents/*.md frontmatter to avoid confusion.
| | `haiku-janitor` | claude-haiku-4-5 | Removes filler and redundancy from final output | | |
| | `haiku-janitor` | claude-haiku-4-5-20251001 | Removes filler and redundancy from final output | |
.claude-plugin/marketplace.json
Outdated
| }, | ||
| { | ||
| "name": "council", | ||
| "description": "Four-model council: Opus captain decomposes and synthesizes, three Sonnet specialists run in parallel (researcher, synthesizer, clarity), Haiku janitor cleans output. Each agent identity lives in a soul CLAUDE.md — passive context, zero activation cost.", |
There was a problem hiding this comment.
This plugin entry repeats the claim that each agent identity lives in a soul CLAUDE.md loaded as passive context, but nothing in the plugin references souls/ (identity text is duplicated in agents/*.md). Update the marketplace description (or implement the loading mechanism) so it reflects reality and doesn’t promise behavior users won’t get.
| "description": "Four-model council: Opus captain decomposes and synthesizes, three Sonnet specialists run in parallel (researcher, synthesizer, clarity), Haiku janitor cleans output. Each agent identity lives in a soul CLAUDE.md — passive context, zero activation cost.", | |
| "description": "Four-model council: Opus captain decomposes and synthesizes, three Sonnet specialists run in parallel (researcher, synthesizer, clarity), Haiku janitor cleans output. Agent identities are defined in the plugin's agents/*.md specs; no external soul files are loaded.", |
| "skills": ["skills/my-skill"], | ||
| "commands": ["commands/my-command.md"], | ||
| "agents": ["agents/my-agent.md"], | ||
| "hooks": "hooks/hooks.json" | ||
| } | ||
| ``` | ||
| > **Note:** `hooks/hooks.json` is loaded by Claude Code when declared in `plugin.json`. |
There was a problem hiding this comment.
The plugin.json example and note here don’t match how plugins in this repo are structured: existing manifests use directory strings for commands/skills (e.g. "./commands"), and hooks are present without being declared in plugin.json. Update this section (especially the hooks field + note) to align with the repo’s actual plugin/template conventions.
| "skills": ["skills/my-skill"], | |
| "commands": ["commands/my-command.md"], | |
| "agents": ["agents/my-agent.md"], | |
| "hooks": "hooks/hooks.json" | |
| } | |
| ``` | |
| > **Note:** `hooks/hooks.json` is loaded by Claude Code when declared in `plugin.json`. | |
| "skills": "./skills", | |
| "commands": "./commands", | |
| "agents": "./agents" | |
| } |
Note:
hooks/hooks.jsonis discovered automatically when present; you do not need ahooksfield inplugin.json.
| │ └── <agent>.md # Custom agent definitions (YAML frontmatter) | ||
| ├── hooks/ | ||
| │ └── hooks.json # Event hooks (auto-loaded by convention) | ||
| │ └── hooks.json # Event hooks (declared in plugin.json, loaded by Claude Code) |
There was a problem hiding this comment.
This claims hooks/hooks.json is "declared in plugin.json" to be loaded, but existing plugins in this repo ship hooks/hooks.json without a hooks field in plugin.json (e.g., hookify/exodia/metacognitive-guard). Update this documentation to match actual repo/plugin behavior (either convention-based loading or the real declaration mechanism).
| │ └── hooks.json # Event hooks (declared in plugin.json, loaded by Claude Code) | |
| │ └── hooks.json # Event hooks (loaded by Claude Code via convention if present) |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 57a80255a2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| description: >- | ||
| Council researcher. Finds evidence, verifies claims, cites sources. Never speculates. Returns | ||
| structured FINDING/SOURCE/DATE/CONFIDENCE/GAPS output. Uses claude-sonnet-4-6. | ||
| model: claude-sonnet-4-6 |
There was a problem hiding this comment.
Use a resolvable Sonnet model identifier
This agent is pinned to claude-sonnet-4-6, but the repo’s own model assertions currently enumerate Sonnet as claude-sonnet-4-5-20250929 / claude-sonnet-4-5 (see plugins/metacognitive-guard/blackboard/assertions.yaml). Because the council pipeline depends on three Sonnet agents, an unresolvable model ID will prevent those subtasks from launching and break /council execution for affected environments; please switch all council Sonnet agents to a supported Sonnet identifier.
Useful? React with 👍 / 👎.
plugins/council/README.md
Outdated
| Inspired by Grok 4.20's 4-agent architecture — same mechanism, adapted for Claude: each agent's identity | ||
| lives in its soul file (`souls/`), loaded as passive context. No activation cost. No "should I use this | ||
| skill?" decision. The agent *is* its soul from token 1. |
There was a problem hiding this comment.
Wire soul files into the actual agent loading path
The plugin documents that identities are loaded from souls/ as passive context, but there is no runtime wiring to those files (no manifest or hook reference; agent behavior is defined directly in agents/*.md). In practice, changing a soul file will not change agent behavior, which creates silent drift between the documented architecture and the prompts that actually execute.
Useful? React with 👍 / 👎.
- Delete souls/ directory — content already inlined in agents/*.md - Fix "four-model" → "five-agent" across all files - Fix haiku model ID: haiku-4-5 → haiku-4-5-20251001 in README - Update plugin counts: 7→8 plugins, 22→23 commands, 5→6 skills, 9→14 agents - Remove souls/ references from README, marketplace.json, plugin.json, CHANGELOG - Fix dispatch flow description in SKILL.md and commands/council.md - Fix clarity escalation rule: "incorporate" → "surface verbatim, do not fill" - Add BLOAT_FLAG procedure to haiku-janitor and captain escalation rules - Add agents declaration to plugin.json (later removed — invalid schema field) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Five agents with baked-in identities (souls): opus-captain decomposes via structured ticket format, researcher + synthesizer run in parallel, clarity reads their raw output for gaps, haiku-janitor flags bloat. Decomposition gate: Opus must fill SUBTASK/OWNER/EXPECTED/DEPENDENCY for every subtask or stop — prevents underspecified briefs. Synthesis gate: Opus gets one scoped intervention — flag internal inconsistencies as ACTION:flagged only, no re-derivation. Also upgrades hookify/conversation-analyzer to opus model. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Delete souls/ directory — content already inlined in agents/*.md - Fix "four-model" → "five-agent" across all files - Fix haiku model ID: haiku-4-5 → haiku-4-5-20251001 in README - Update plugin counts: 7→8 plugins, 22→23 commands, 5→6 skills, 9→14 agents - Remove souls/ references from README, marketplace.json, plugin.json, CHANGELOG - Fix dispatch flow description in SKILL.md and commands/council.md - Fix clarity escalation rule: "incorporate" → "surface verbatim, do not fill" - Add BLOAT_FLAG procedure to haiku-janitor and captain escalation rules - Add agents declaration to plugin.json (later removed — invalid schema field) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
0302c07 to
344ab2b
Compare
Summary
plugins/councilplugin — five agents with baked-in identities via soul fileshookify/conversation-analyzertoopusmodel with rewritten promptKnown issue (not blocking)
Soul files are loaded via hardcoded absolute path (
~/.claude/plugins/cache/council/souls/). If install path differs, agents run on frontmatter only. Fix is to inline souls into agent files — left for follow-up to keep this PR reviewable.Test plan
/council [question]and verify correct dispatch sequence: researcher + synthesizer parallel → clarity → opus synthesis → haiku cleanup./tooling/scripts/weave-validate.shclaude plugin validate .🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Documentation