board-meeting-protocol
The Beamix 4-round board-meeting protocol: R0 framing, R1 independent verdicts, R2 cross-critique, R3 fresh-context synthesis. Includes JSON output schema per round, persona routing rules, and Zod val
SKILL.md.claude/skills/board-meeting-protocol/SKILL.md
GitHubBoard Meeting Protocol
Quick reference
R0 brief → R1 personas opening → R2 cross-critique → R3 synthesis → 1 verdict. Verdict in JSON; rationale in prose. No 5th round.
When to use
- Any decision tagged
board-meetingin Linear - Decisions classified
tier:irreversible - Strategic questions (pricing changes, vendor locks, org model changes)
- When CEO determines a decision requires cross-persona stress-testing
When NOT to use
- For implementation decisions (those route to CTO, tier:lite or full)
- For quick tactical choices (use the normal CEO → C-suite path)
- For recurring operational questions (use standing Routines)
The seven personas
| Persona | File | Focus | Routes when |
|---|---|---|---|
| Visionary | _personas/visionary.md |
Long-term product + market bets | Always |
| Strategist | _personas/strategist.md |
Competitive positioning, bets, trade-offs | Always |
| Architect | _personas/architect.md |
Technical feasibility, reversibility, cost | Always |
| Risk-Modeler | _personas/risk-modeler.md |
Failure modes, probabilities, mitigations | Always |
| Customer-Voice | _personas/customer-voice.md |
Real customer pain, churn triggers, JTBD | Always |
| Aria | _personas/aria.md |
Vendor procurement skeptic | decision_type:vendor |
| Broad-Adversary | _personas/broad-adversary.md |
Strategic KILL thesis | decision_type:strategic |
The four rounds
R0 — Independent framing (CEO only)
CEO writes a structured framing document BEFORE spawning any personas. This prevents anchoring bias in R1.
{
"round": "R0",
"topic": "Evaluate Mem0 vs self-hosted pgvector for episodic agent memory",
"decision_type": "vendor",
"context": {
"current_state": "No episodic memory — agents restart cold each session",
"options_under_consideration": ["Mem0 cloud (Hobby tier)", "Self-hosted pgvector in Supabase"],
"constraints": ["Must not block MVP sprint", "Max $50/mo additional spend"],
"reversibility": "hard — switching memory stores requires re-embedding 6 months of sessions"
},
"questions_for_personas": [
"What are the top 2 risks of each option?",
"What would make you change your vote?",
"What's the fastest path to a provably wrong decision?"
]
}
R1 — Independent verdicts (all personas in parallel)
Each persona is spawned with ONLY the R0 framing. No cross-persona context. Returns a typed JSON verdict.
{
"round": "R1",
"persona": "risk-modeler",
"verdict": "PROCEED_WITH_CONDITIONS",
"top_risks": [
{
"id": "FM-1",
"description": "Mem0 API unavailable during critical agent run — episodic context lost",
"probability": "medium",
"impact": "high",
"mitigation": "Write-ahead queue in Supabase with Inngest retry"
}
],
"conditions": ["Implement fallback queue before going to paid tier"],
"kill_condition": "If vendor unavailability causes >3 agent failures in a week",
"confidence": "medium",
"source_round": "risk-modeler-r1"
}
Valid verdict values: PROCEED | PROCEED_WITH_CONDITIONS | PAUSE | KILL
R2 — Cross-critique (personas read R1 outputs, may change votes)
Each persona receives ALL R1 verdicts. They may update their verdict. Must cite which R1 verdict influenced them.
{
"round": "R2",
"persona": "architect",
"verdict": "PROCEED_WITH_CONDITIONS",
"changed_from_r1": false,
"influenced_by": ["risk-modeler-r1 FM-1 mitigation is implementable"],
"new_findings": [
"Self-hosted pgvector requires monthly embedding re-runs — ops overhead underestimated in R0"
],
"updated_conditions": ["Add pgvector complexity to reversibility score"],
"source_round": "architect-r2"
}
R3 — Fresh-context synthesis (Synthesizer Routine, Opus model)
The Synthesizer Routine receives a NEW context window with only:
- R0 framing
- All R1 JSON outputs
- All R2 JSON outputs
It does NOT see the R0-R2 conversation. This prevents recency bias.
{
"round": "R3",
"synthesizer": "synthesizer-routine",
"final_verdict": "PROCEED_WITH_CONDITIONS",
"locked_decisions": [
{
"id": "D1",
"decision": "Adopt Mem0 cloud (Hobby → Starter at 50 paying customers)",
"rationale": "Faster MVP; pgvector self-hosting adds 2-3 days ops work",
"source_persona_round": "strategist-r2",
"reversibility": "hard",
"six_month_review": "2026-11-16"
}
],
"preserved_dissent": {
"persona": "broad-adversary",
"thesis": "KILL — vendor lock accepted without validated migration path",
"vindication_conditions": ["API unavailability >3 agent failures in week", "Cost exceeds $100/mo before first revenue"]
},
"open_questions_deferred": ["Export pipeline design → Phase 3"],
"sources": ["R1-risk-modeler.md", "R1-architect.md", "R2-strategist.md", "R2-broad-adversary.md"]
}
Zod validation
CEO validates all R1, R2, and R3 outputs against a Zod schema before accepting. Malformed JSON = round must be re-run.
const R1VerdictSchema = z.object({
round: z.literal('R1'),
persona: z.string(),
verdict: z.enum(['PROCEED', 'PROCEED_WITH_CONDITIONS', 'PAUSE', 'KILL']),
top_risks: z.array(z.object({
id: z.string(),
description: z.string(),
probability: z.enum(['low', 'medium', 'high']),
impact: z.enum(['low', 'medium', 'high']),
mitigation: z.string(),
})),
conditions: z.array(z.string()),
kill_condition: z.string(),
confidence: z.enum(['low', 'medium', 'high']),
source_round: z.string(),
});
Session file output
After R3, CEO writes all artifacts under:
docs/08-agents_work/2026-05-16-agent-rethink/board-review/
R1-visionary.md
R1-strategist.md
R1-architect.md
R1-risk-modeler.md
R1-customer-voice.md
R1-broad-adversary.md (or R1-aria.md for vendor decisions)
R2-*.md
R3-synthesis.md
DECISIONS.md gets one entry citing all sources.
See also
war-room-orchestration— [[war-room-orchestration]]anthropic-routines— [[anthropic-routines]]multi-agent-brainstorming— [[multi-agent-brainstorming]]architecture-decision-records— [[architecture-decision-records]]
Anti-patterns
- Sharing R0 framing between R1 personas before they write their independent verdicts
- Allowing the Synthesizer to see the full R0-R2 conversation (defeats fresh-context purpose)
- Skipping Zod validation on R1/R2 outputs (hallucinated fields corrupt synthesis)
- Omitting
preserved_dissentin R3 (the KILL thesis must be recorded, not paraphrased away) - Using board meeting for operational or implementation decisions (overhead is too high)
- Failing to write session files — sources must be citable