feat: RFC 0050 graduated panel rotation implementation

Judge-driven panel evolution for alignment dialogues:

- Add `Graduated` as default rotation mode
- New `blue_dialogue_evolve_panel` tool for panel specification
- Panel sampling is now a suggestion (`suggested_panel`) not mandate
- Judge can override Round 0 panel before spawning agents
- Fresh experts (pool/created) get automatic context briefs
- Support for on-demand expert creation with focus areas
- Track panel history with source counts (retained/pool/created)

Key workflow changes:
- Phase 1: Review suggested panel, override if needed
- Phase 2+: Evolve panel based on dialogue dynamics
- `expert_source` param in round_prompt for context brief generation

Updates skill documentation with graduated rotation guidelines and
7 key rules including "REVIEW THE SUGGESTED PANEL".

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Eric Garcia 2026-02-02 08:08:31 -05:00
parent 29ccd4082f
commit 47edb7509f
4 changed files with 1185 additions and 35 deletions

View file

@ -2,7 +2,7 @@
| | |
|---|---|
| **Status** | Draft |
| **Status** | Approved |
| **Date** | 2026-02-01 |
| **ADRs** | 0014 (Alignment Dialogue Agents) |
| **Extends** | RFC 0048 (Alignment Expert Pools) |
@ -31,7 +31,7 @@ Worse: when a tension emerged around regulatory risk, there was no mechanism to
Instead of algorithmic rotation with fixed parameters, the **Judge decides** how to evolve the panel each round. The MCP server provides infrastructure; the Judge provides judgment.
### Rotation Mode: `graduated`
### Rotation Mode: `graduated` (Default)
```json
{
@ -39,7 +39,7 @@ Instead of algorithmic rotation with fixed parameters, the **Judge decides** how
}
```
That's it. No `rotation_config`. The Judge receives guidelines in the skill prompt.
This is now the **default** rotation mode. No `rotation_config` needed. The Judge receives guidelines in the skill prompt.
### Judge Guidelines (in alignment-play skill)

File diff suppressed because it is too large Load diff

View file

@ -1668,7 +1668,7 @@ impl BlueServer {
},
{
"name": "blue_dialogue_round_prompt",
"description": "Get a fully-substituted prompt for a specific agent and round, ready to pass directly to the Task tool. Use this instead of manual template substitution.",
"description": "Get a fully-substituted prompt for a specific agent and round, ready to pass directly to the Task tool. Use this instead of manual template substitution. RFC 0050: Supports graduated rotation with expert_source and focus parameters.",
"inputSchema": {
"type": "object",
"properties": {
@ -1696,6 +1696,15 @@ impl BlueServer {
"type": "array",
"items": { "type": "string" },
"description": "Optional source files for grounding"
},
"expert_source": {
"type": "string",
"enum": ["retained", "pool", "created"],
"description": "RFC 0050: How the expert joined the panel. Fresh experts (pool/created) get context briefs."
},
"focus": {
"type": "string",
"description": "RFC 0050: Optional focus area for created experts"
}
},
"required": ["output_dir", "agent_name", "agent_emoji", "agent_role", "round"]
@ -1733,6 +1742,56 @@ impl BlueServer {
"required": ["dialogue_title", "round"]
}
},
{
"name": "blue_dialogue_evolve_panel",
"description": "RFC 0050: Judge-driven panel evolution for graduated rotation. Specify exactly which experts to include, their sources (retained/pool/created), and create new experts on-demand.",
"inputSchema": {
"type": "object",
"properties": {
"output_dir": {
"type": "string",
"description": "Output directory (e.g., /tmp/blue-dialogue/topic-slug)"
},
"round": {
"type": "integer",
"description": "Round number"
},
"panel": {
"type": "array",
"description": "Array of expert specifications for this round",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Pastry name (e.g., Muffin, Scone)"
},
"role": {
"type": "string",
"description": "Expert role (e.g., Value Analyst)"
},
"source": {
"type": "string",
"enum": ["retained", "pool", "created"],
"description": "How the expert joined: retained from prior round, pulled from pool, or created on-demand"
},
"tier": {
"type": "string",
"enum": ["Core", "Adjacent", "Wildcard"],
"description": "Required for created experts"
},
"focus": {
"type": "string",
"description": "Optional focus area for the expert"
}
},
"required": ["name", "role", "source"]
}
}
},
"required": ["output_dir", "round", "panel"]
}
},
// Phase 8: Playwright verification
{
"name": "blue_playwright_verify",
@ -2512,6 +2571,7 @@ impl BlueServer {
"blue_dialogue_save" => self.handle_dialogue_save(&call.arguments),
"blue_dialogue_round_prompt" => self.handle_dialogue_round_prompt(&call.arguments),
"blue_dialogue_sample_panel" => self.handle_dialogue_sample_panel(&call.arguments),
"blue_dialogue_evolve_panel" => self.handle_dialogue_evolve_panel(&call.arguments),
// Phase 8: Playwright handler
"blue_playwright_verify" => self.handle_playwright_verify(&call.arguments),
// Phase 9: Post-mortem handlers
@ -3849,6 +3909,11 @@ impl BlueServer {
crate::handlers::dialogue::handle_sample_panel(args)
}
fn handle_dialogue_evolve_panel(&mut self, args: &Option<Value>) -> Result<Value, ServerError> {
let args = args.as_ref().ok_or(ServerError::InvalidParams)?;
crate::handlers::dialogue::handle_evolve_panel(args)
}
fn handle_playwright_verify(&mut self, args: &Option<Value>) -> Result<Value, ServerError> {
let args = args.as_ref().ok_or(ServerError::InvalidParams)?;
crate::handlers::playwright::handle_verify(args)

View file

@ -5,14 +5,14 @@ description: Run multi-expert alignment dialogues with parallel background agent
# Alignment Play Skill
Orchestrate multi-expert alignment dialogues using the N+1 agent architecture from ADR 0014 and RFC 0048.
Orchestrate multi-expert alignment dialogues using the N+1 agent architecture from ADR 0014, RFC 0048, and RFC 0050.
## Usage
```
/alignment-play <topic>
/alignment-play --panel-size 7 <topic>
/alignment-play --rotation wildcards <topic>
/alignment-play --rotation none <topic>
/alignment-play --rfc <rfc-title> <topic>
```
@ -21,13 +21,13 @@ Orchestrate multi-expert alignment dialogues using the N+1 agent architecture fr
| Parameter | Default | Description |
|-----------|---------|-------------|
| `--panel-size` | pool size or 12 | Number of experts per round |
| `--rotation` | `none` | Rotation mode: none, wildcards, full |
| `--rotation` | `graduated` | Rotation mode: **graduated** (default), none, wildcards, full |
| `--max-rounds` | `12` | Maximum rounds before stopping |
| `--rfc` | none | Link dialogue to an RFC |
## How It Works
### Phase 0: Pool Design (RFC 0048)
### Phase 0: Pool Design
Before creating the dialogue, the Judge:
@ -52,24 +52,129 @@ Before creating the dialogue, the Judge:
{ "role": "Risk Manager", "tier": "core", "relevance": 0.90 },
{ "role": "Portfolio Strategist", "tier": "adjacent", "relevance": 0.70 },
{ "role": "ESG Analyst", "tier": "adjacent", "relevance": 0.65 },
{ "role": "Supply Chain Analyst", "tier": "adjacent", "relevance": 0.55 },
{ "role": "Macro Economist", "tier": "wildcard", "relevance": 0.40 },
{ "role": "Contrarian", "tier": "wildcard", "relevance": 0.35 }
{ "role": "Contrarian", "tier": "wildcard", "relevance": 0.35 },
{ "role": "Regulatory Expert", "tier": "wildcard", "relevance": 0.30 }
]
},
"panel_size": 5,
"rotation": "none"
"panel_size": 6
}
```
### Phase 1+: Round Execution
The MCP server samples a **suggested panel** using weighted random selection. Higher relevance = higher selection probability. Core experts almost always selected; Wildcards provide variety.
1. The returned **Judge Protocol** contains: round workflow, agent prompt template, file architecture, scoring rules, convergence config
2. **Follow the protocol.** It is the single source of truth for execution.
3. The MCP server samples experts from the pool using weighted random selection
4. Higher relevance = higher selection probability
5. Core experts almost always selected; Wildcards provide variety
### Phase 1: Review & Override (RFC 0050)
**CRITICAL**: You MUST use the Task tool to spawn REAL parallel agents. Do NOT simulate experts inline. The whole point is N independent Claude agents running in parallel via the Task tool.
The suggested panel is just that — a suggestion. **Review it before Round 0:**
1. Check `suggested_panel` in the response from `blue_dialogue_create`
2. Ask: Are critical perspectives missing? Is a key expert not included?
3. **If the panel looks good** → proceed to Round 0
4. **If experts are missing** → call `blue_dialogue_evolve_panel` with `round: 0` to override:
```json
{
"output_dir": "/tmp/blue-dialogue/data-design",
"round": 0,
"panel": [
{ "name": "Muffin", "role": "API Architect", "source": "pool" },
{ "name": "Cupcake", "role": "Data Architect", "source": "pool" },
{ "name": "Scone", "role": "Security Engineer", "source": "pool" }
]
}
```
### Phase 2: Round 0 — Opening Arguments
1. Create round directory: `mkdir -p {output_dir}/round-0`
2. Get prompts for each agent via `blue_dialogue_round_prompt`
3. **Spawn ALL agents in ONE message** using Task tool (parallel execution)
4. Collect responses, score contributions, write artifacts
### Phase 3+: Graduated Panel Evolution
**After Round 0, YOU decide how to evolve the panel.**
Before each subsequent round, evaluate the dialogue and decide:
- Which experts should **continue** (retained)
- Which experts from the pool should **join** (pool)
- Whether to **create** new experts for emerging tensions (created)
Use `blue_dialogue_evolve_panel` to specify your panel:
```json
{
"output_dir": "/tmp/blue-dialogue/investment-strategy",
"round": 1,
"panel": [
{ "name": "Muffin", "role": "Value Analyst", "source": "retained" },
{ "name": "Cupcake", "role": "Risk Manager", "source": "retained" },
{ "name": "Scone", "role": "Supply Chain Analyst", "source": "pool" },
{ "name": "Palmier", "role": "Geopolitical Risk Analyst", "source": "created", "tier": "Adjacent", "focus": "Taiwan semiconductor concentration" }
]
}
```
Then spawn the panel using `blue_dialogue_round_prompt` with the `expert_source` parameter:
```
blue_dialogue_round_prompt(
output_dir="/tmp/blue-dialogue/investment-strategy",
agent_name="Palmier",
agent_emoji="🧁",
agent_role="Geopolitical Risk Analyst",
round=1,
expert_source="created",
focus="Taiwan semiconductor concentration"
)
```
Fresh experts (source: "pool" or "created") automatically receive a **context brief** summarizing prior rounds.
## Panel Evolution Guidelines
### Retention Criteria
- **High scorers**: Experts who contributed sharp insights should continue
- **Unresolved advocates**: Experts defending positions with open tensions
- **Core relevance**: Experts central to the domain should anchor continuity
### Fresh Perspective Triggers
- **Stale consensus**: If the panel is converging too easily, bring challengers
- **Unexplored angles**: Pull in experts whose focus hasn't been represented
- **Low-scoring experts**: Consider rotating out experts who aren't contributing
### Targeted Expert Injection
When a specific tension emerges that no current expert can address:
1. Check if the pool has a relevant expert → `source: "pool"`
2. If not, **create a new expert**`source: "created"` with tier and focus
Example: Tension T03 raises supply chain concentration risk, but no Supply Chain Analyst is on the panel:
```json
{ "name": "Palmier", "role": "Supply Chain Analyst", "source": "created", "tier": "Adjacent", "focus": "Geographic concentration, single-source risk" }
```
### Panel Size Flexibility
- Target panel size is a guideline, not a constraint
- You may run a smaller panel if the dialogue is converging
- You may expand briefly to address a complex tension
### Expert Creation
You are not limited to the initial pool. If the dialogue surfaces a perspective that no pooled expert covers, create one. The pool was your starting point, not your ceiling.
> *"The elephant is larger than we thought. Let me get someone who knows about tusks."*
> — The Judge
## Alternative Rotation Modes
If you don't want Judge-driven evolution, specify a different mode:
| Mode | Behavior | Use Case |
|------|----------|----------|
| `graduated` | **Judge decides** panel each round (default) | Full control, targeted expertise |
| `none` | Fixed panel all rounds | Simple deliberation |
| `wildcards` | Core/Adjacent persist, Wildcards resample | Moderate variety |
| `full` | Complete resample each round | Maximum diversity |
## Expert Pool Design Examples
@ -111,11 +216,14 @@ For a pool of P experts with panel size N:
## Blue MCP Tools
- `blue_dialogue_create` — Creates dialogue with expert_pool, returns Judge Protocol
- `blue_dialogue_round_prompt` — Get fully-substituted prompts for each agent
- `blue_dialogue_sample_panel` — Manually sample a new panel for a round (RFC 0048)
- `blue_dialogue_lint` — Validate .dialogue.md format
- `blue_dialogue_save` — Persist to .blue/docs/dialogues/
| Tool | Purpose |
|------|---------|
| `blue_dialogue_create` | Creates dialogue with expert_pool, returns Judge Protocol |
| `blue_dialogue_evolve_panel` | **RFC 0050**: Specify panel composition for graduated rotation |
| `blue_dialogue_round_prompt` | Get fully-substituted prompts for each agent |
| `blue_dialogue_sample_panel` | Manually sample a new panel (non-graduated modes) |
| `blue_dialogue_lint` | Validate .dialogue.md format |
| `blue_dialogue_save` | Persist to .blue/docs/dialogues/ |
## Agent Spawning
@ -138,10 +246,12 @@ The `general-purpose` subagent has access to all tools including Write, which is
## Key Rules
1. **DESIGN THE POOL FIRST** — You are the 💙 Judge. Analyze the problem domain and design appropriate experts.
2. **NEVER submit your own perspectives** — You orchestrate, you don't participate
3. **Spawn ALL agents in ONE message** — No first-mover advantage
4. **Follow the Judge Protocol exactly** — It contains the round workflow, artifact writing steps, scoring rules, and convergence criteria
5. **Use `general-purpose` subagent_type** — NOT `alignment-expert`. The general-purpose agents have access to all tools including Write, which is required for file output
2. **REVIEW THE SUGGESTED PANEL** — The sampled panel is a suggestion. Override it with `blue_dialogue_evolve_panel(round=0)` if critical experts are missing.
3. **EVOLVE THE PANEL** — After each round, use `blue_dialogue_evolve_panel` to shape subsequent panels based on dialogue dynamics.
4. **NEVER submit your own perspectives** — You orchestrate, you don't participate
5. **Spawn ALL agents in ONE message** — No first-mover advantage
6. **Follow the Judge Protocol exactly** — It contains the round workflow, artifact writing steps, scoring rules, and convergence criteria
7. **Use `general-purpose` subagent_type** — NOT `alignment-expert`. The general-purpose agents have access to all tools including Write, which is required for file output
## The Spirit of the Dialogue