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:
parent
29ccd4082f
commit
47edb7509f
4 changed files with 1185 additions and 35 deletions
|
|
@ -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
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue