Loading...
Loading...
Convene 11 role-specialized Claude agents to debate technical decisions in parallel, with the invoking Claude acting as CEO
npx skill4agent add aradotso/design-skills design-council-orchestrationSkill by ara.so — Design Skills collection.
SendMessage# Add the plugin marketplace
/plugin marketplace add sjsyrek/claude-plugins
# Install design-council
/plugin install design-council@sjsyrekgit clone https://github.com/sjsyrek/design-council.git
cd design-council
git checkout v0.2.0
/plugin marketplace add .
/plugin install design-council@sjsyrek━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DESIGN COUNCIL PLAN
Mode: DEBATE
Roster (8 seats):
• principal-engineer [opus]
• platform-engineer [sonnet]
• security-engineer [sonnet]
• test-engineer [sonnet]
• performance-engineer [sonnet]
• product-manager [opus]
• technical-writer [opus]
• qa-engineer [sonnet]
Budget:
~180k tokens (cached brief saves ~9k × 8)
~4–7 min wall-clock (3 debate rounds)
Opening prompt:
"Should the /search endpoint paginate with
cursor tokens or offset/limit?"
Reply: go | swap X for Y | drop X | add X | abort
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━# Accept as-is
go
# Swap models
swap principal-engineer for sonnet
# Add a seat
add domain-expert
# Remove a seat
drop ui-ux-designer
# Cancel
abort~/.claude/councils/<slug>/brief.mdCLAUDE.md// Conceptual — the CEO does this automatically
await Promise.all([
Agent({
name: "principal-engineer",
run_in_background: true,
team_name: "design-council-2026-05-17-pagination",
model: "claude-opus-4",
prompt: `You are the principal-engineer seat.
Brief: file://~/.claude/councils/pagination/brief.md
Four delivery rules:
1. Handshake: DM "READY: principal-engineer" within 10s
2. Cross-talk: SendMessage only (never Execute)
3. Final verdict: via SendMessage to CEO
4. Idle summary: <100 chars
Opening question:
Should /search paginate cursor or offset?`
}),
Agent({ name: "security-engineer", ... }),
Agent({ name: "platform-engineer", ... }),
// ... 5 more
]);READY: <seat-name>tmuxPaneIdHANDSHAKE: 8/8 ok | verdict=PROCEEDSendMessageFrom: security-engineer
To: CEO
CONCERNS
Offset pagination leaks record counts (DoS vector).
Cursor tokens must be HMAC-signed with rotation.
Need rate-limit strategy regardless of choice.APPROVECONCERNSBLOCK// CEO orchestration (automatic)
if (security.verdict === "CONCERNS" && platform.verdict === "APPROVE") {
SendMessage({
from: "CEO",
to: "security-engineer",
text: "DM platform-engineer: they approved offset. Argue your HMAC requirement."
});
SendMessage({
from: "CEO",
to: "platform-engineer",
text: "security-engineer has concerns about offset. Respond to their HMAC point."
});
}From: security-engineer
To: platform-engineer
Your offset approval ignores enumeration risk.
Without signed cursors, scrapers can walk the
entire dataset. Do you have a mitigation?From: platform-engineer
To: security-engineer
Rate limiting is orthogonal to pagination style.
Offset + jittered delays caps enumeration to
same ROC as cursor. Offset is simpler to cache.## Decision: Cursor pagination with signed tokens
security-engineer's enumeration concern is valid
and not fully mitigated by rate limiting (jitter
still allows sequential walks). platform-engineer's
caching argument applies to both schemes via
`cache_token` param. **Adopt cursor pagination
with HMAC-SHA256 signed tokens (rotate key daily).**
Deferred: Rate limit strategy (filed as BEAD-127).━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DECISION LOG (DRAFT)
Reply: save | amend "<changes>" | discard
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━save# Decision log
~/.claude/councils/2026-05-17-pagination/log.md
# Structure
---
slug: pagination
date: 2026-05-17
mode: DEBATE
roster: [principal-engineer, security-engineer, ...]
primary-tracker-id: BEAD-126 # if beads detected
linked-tracker-ids: [BEAD-127]
status: resolved
---
# Opening Prompt
Should /search paginate cursor or offset?
# Resolved Disagreements
...
# Arbitration Decisions
...
# Execution Plan
File ownership:
- src/api/search.ts → platform-engineer context
- src/auth/tokens.ts → security-engineer context
- tests/api/search.test.ts → test-engineer contextSendMessageTeamDeletecore:
- principal-engineer # Architecture synthesis (opus)
- platform-engineer # Infra / deployment (sonnet)
- integration-engineer # API contracts / compat (sonnet)
- test-engineer # Test strategy (sonnet)
- qa-engineer # Quality gates (sonnet)
- security-engineer # Threat model (sonnet)
- performance-engineer # Latency / throughput (sonnet)
- product-manager # User impact / scope (opus)
- ui-ux-designer # Interface / flows (sonnet)
- accessibility-specialist # A11y / WCAG (sonnet)
- technical-writer # Docs / clarity (opus)
opt-ins:
- devops-engineer # CI/CD / observability
- finops-engineer # Cloud cost / budget
- legal-compliance # GDPR / SOC2 / licensing
- domain-expert # Named SME (you provide context)
- historian # Past decisions / ADRsui-ux-designeraccessibility-specialistsecurity-engineerplatform-engineerui-ux-designer# Add domain expert
add domain-expert
# CEO will prompt you for context:
# "What domain? Provide 2–3 sentence brief."principal-engineerproduct-managertechnical-writerhistoriantest-engineerperformance-engineersecurity-engineerswap security-engineer for opus# CEO runs automatically
bd memories # → brief.md
bd ready # → brief.md (active context)
bd show <id> # → brief.md (if user referenced a bead)# CEO translates DEFER decisions to tracker items
bd create \
--title "Implement rate limiting for /search" \
--type task \
--parent BEAD-126 \
--context "From design-council-2026-05-17-pagination: security-engineer raised enumeration concern"# Close primary bead under debate
bd close BEAD-126 --force # if dependency inversion flagged
# Log tracker IDs in frontmatter
primary-tracker-id: BEAD-126
linked-tracker-ids: [BEAD-127, BEAD-128]# At any phase
stop the councilstatus: halted# User invocation
"Council review of PR #47 (no debate)"isolation: "worktree"// CEO provides this in execution plan
await Agent({
name: "implement-cursor-pagination",
isolation: "worktree",
model: "claude-sonnet-4",
prompt: `Implement cursor pagination per design-council-2026-05-17-pagination.
Decision log: file://~/.claude/councils/2026-05-17-pagination/log.md
File ownership (avoid conflicts):
- src/api/search.ts (yours)
- tests/api/search.test.ts (yours)
DO NOT TOUCH:
- src/auth/tokens.ts (security-engineer's impl)
Brief: file://~/.claude/councils/pagination/brief.md`
});references/implementation-handoff.mddesign-council# In auto-memory
2026-05-10: design-council: security-engineer seat
over-indexes on HMAC signatures. For internal APIs,
skip security seat unless user data is involved.MEMORY OVERRIDE (from 2026-05-10):
Skip security-engineer for internal APIs unless
user data involved. Prior councils over-rotated
on HMAC signatures.// settings.json (Claude Code)
{
"teammateMode": "auto" // or "tmux" to force
}HANDSHAKE: 6/8 ok | verdict=DEGRADEDTeamCreateAgent~/.claude/councils/<slug>/log.mddegraded-roster: [security-engineer]add security-engineerperformance-engineerbd$PATH# From log.md
# Deferred: Implement rate limiting
bd create \
--title "Implement rate limiting for /search" \
--context "From design-council-2026-05-17-pagination"references/tracker-integration.md~/.claude/councils/<slug>/brief.md| Metric | Review Mode | Debate Mode (3 rounds) |
|---|---|---|
| Wall-clock | 2–3 min | 4–7 min |
| Tokens | 60–90k | 150–250k |
| Seats (typical) | 4–6 | 6–11 |
| Cache savings | ~5k × seats | ~9k × seats |
~/.claude/councils/<slug>/brief.md
# Contents
- CLAUDE.md constraints
- Referenced specs
- Memory overrides
- Beads context (if detected)~/.claude/councils/<yyyy-mm-dd>-<slug>/log.md
# Frontmatter
---
slug: pagination
date: 2026-05-17
mode: DEBATE
roster: [principal-engineer, ...]
primary-tracker-id: BEAD-126
status: resolved
---// In a TypeScript project
// User says: "convene council to review this cache layer"
// CEO automatically:
// 1. Reads current file context
// 2. Assembles brief from CLAUDE.md + memory
// 3. Shows plan card
// 4. On "go": spawns roster# User: add domain-expert
# CEO: "What domain? Provide brief."
# User:
PostgreSQL query optimization. We're deciding
between materialized views vs. incremental
aggregates. Expert should eval EXPLAIN plans.You are domain-expert (PostgreSQL query optimization).
Context: Eval materialized views vs. incremental
aggregates. Review EXPLAIN plans in brief.
Brief: file://~/.claude/councils/cache-layer/brief.md# Execution Plan
## Phase 1: Cursor Token Implementation
Owner: platform-engineer context
Files:
- src/api/search.ts
- src/types/pagination.ts
## Phase 2: HMAC Signing
Owner: security-engineer context
Files:
- src/auth/tokens.ts
- src/auth/rotation.ts
## Phase 3: Integration Tests
Owner: test-engineer context
Files:
- tests/api/search.test.ts
- tests/auth/tokens.test.ts
## Merge Strategy
Worktree per phase. Merge order: 1 → 2 → 3.
Conflict expected: src/api/search.ts (line 47, imports).
Resolution: Accept Phase 2 (security adds token import).~/.claude/councils/export COUNCIL_TRACKER_CMD="jira" # Default: bd
export COUNCIL_TRACKER_CREATE_ARGS="create --project DESIGN"references/tracker-integration.mdTeamCreateAgent.run_in_backgroundreferences/implementation-handoff.mdreferences/tracker-integration.mdCHANGELOG.md