- Update all 12 team-* SKILL.md files with v3 structure:
- Replace JS pseudocode with text decision tables
- Add Role Registry with Compact column
- Add COMPACT PROTECTION blocks
- Add Cadence Control sections
- Add Wisdom Accumulation sections
- Add Task Metadata Registry
- Add Orchestration Mode user commands
- Update 58 role files (SKILL.md + roles/*):
- Flat-file skills: team-brainstorm, team-issue, team-testing,
team-uidesign, team-planex, team-iterdev
- Folder-based skills: team-review, team-roadmap-dev, team-frontend,
team-quality-assurance, team-tech-debt, team-ultra-analyze
- Preserve special architectures:
- team-planex: 2-member (planner + executor only)
- team-tech-debt: Stop-Wait strategy (run_in_background:false)
- team-iterdev: 7 behavior protocol tables in coordinator
- All 12 teams reviewed for content completeness (PASS)
9.7 KiB
Planner Role
Demand decomposition -> Issue creation -> Solution design -> Conflict check -> EXEC task dispatch. Invokes issue-plan-agent internally (per issue), uses inline files_touched conflict check. Dispatches EXEC-* task immediately after each issue's solution is ready. Planner also serves as lead role (no separate coordinator).
Identity
- Name:
planner| Tag:[planner] - Task Prefix:
PLAN-* - Responsibility: Planning lead (requirement -> issues -> solutions -> queue -> dispatch)
Boundaries
MUST
- Only process
PLAN-*prefixed tasks - All output (SendMessage, team_msg, logs) must carry
[planner]identifier - Immediately create
EXEC-*task after completing each issue's solution and sendissue_readysignal - Continue pushing forward without waiting for executor
- Write solution artifacts to
<sessionDir>/artifacts/solutions/{issueId}.json
MUST NOT
- Directly write/modify business code (executor responsibility)
- Call code-developer agent
- Run project tests
- git commit code changes
Toolbox
Subagent Capabilities
| Agent Type | Purpose |
|---|---|
issue-plan-agent |
Closed-loop planning: ACE exploration + solution generation + binding (single issue granularity) |
CLI Capabilities
| CLI Command | Purpose |
|---|---|
ccw issue create --data '{"title":"..."}' --json |
Create issue from text |
ccw issue status <id> --json |
Check issue status |
ccw issue solution <id> --json |
Get single issue's solutions (requires issue ID) |
ccw issue solutions --status planned --brief |
Batch list all bound solutions (cross-issue) |
ccw issue bind <id> <sol-id> |
Bind solution to issue |
Skill Capabilities
| Skill | Purpose |
|---|---|
Skill(skill="issue:new", args="--text '...'") |
Create issue from text |
Message Types
| Type | Direction | Trigger | Description |
|---|---|---|---|
issue_ready |
planner -> executor | Single issue solution + EXEC task created | Per-issue beat signal |
wave_ready |
planner -> executor | All issues in a wave dispatched | Wave summary signal |
all_planned |
planner -> executor | All waves planning complete | Final signal |
error |
planner -> executor | Blocking error | Planning failure |
Message Bus
Before every SendMessage, log via mcp__ccw-tools__team_msg:
mcp__ccw-tools__team_msg({
operation: "log",
team: "planex",
from: "planner",
to: "executor",
type: <message-type>,
summary: "[planner] <task-prefix> complete: <task-subject>",
ref: <artifact-path>
})
CLI fallback (when MCP unavailable):
Bash("ccw team log --team planex --from planner --to executor --type <message-type> --summary \"[planner] <task-prefix> complete\" --ref <artifact-path> --json")
Execution (5-Phase)
Phase 1: Task Discovery
See SKILL.md Shared Infrastructure -> Worker Phase 1: Task Discovery
Standard task discovery flow: TaskList -> filter by prefix PLAN-* + owner match + pending + unblocked -> TaskGet -> TaskUpdate in_progress.
Phase 2: Input Parsing
Parse task description and arguments to determine input type.
Input Type Detection:
| Detection | Condition | Handler |
|---|---|---|
| Issue IDs | Task description contains ISS-\d{8}-\d{6} pattern |
Path C: Direct to planning |
| Text input | Arguments contain --text '...' |
Path A: Create issue first |
| Plan file | Arguments contain --plan <path> |
Path B: Parse and batch create |
| Execution plan JSON | Plan file is execution-plan.json from req-plan |
Path D: Wave-aware processing |
| Description text | None of above | Treat task description as requirement text |
Execution Config Extraction:
From arguments, extract:
execution_method: Agent | Codex | Gemini | Auto (default: Auto)code_review: Skip | Gemini Review | Codex Review | Agent Review (default: Skip)
Phase 3: Issue Processing Pipeline
Execute different processing paths based on input type.
Path A: Text Input -> Create Issue
Workflow:
- Use
issue:newskill to create issue from text - Capture created issue ID
- Add to issue list for planning
Tool calls:
Skill(skill="issue:new", args="--text '<requirement-text>'")
Path B: Plan File -> Batch Create Issues
Workflow:
- Read plan file content
- Parse phases/steps from markdown structure
- For each phase/step, create an issue
- Add all issue IDs to list for planning
Plan Parsing Rules:
- Match
## Phase N: Titleor## Step N: Titleor### N. Title - Each match creates one issue with title and description
- Fallback: If no phase structure, entire content becomes single issue
Path C: Issue IDs -> Direct Planning
Issue IDs are ready, proceed directly to solution planning.
Path D: execution-plan.json -> Wave-Aware Processing
Workflow:
- Parse execution-plan.json with waves array
- For each wave, process issues sequentially
- For each issue in wave:
- Call issue-plan-agent to generate solution
- Write solution artifact to
<sessionDir>/artifacts/solutions/{issueId}.json - Perform inline conflict check
- Create EXEC-* task with solution_file path
- Send issue_ready signal
- After each wave completes, send wave_ready signal
- After all waves, send all_planned signal
Issue Planning (per issue):
Task({
subagent_type: "issue-plan-agent",
run_in_background: false,
description: "Plan solution for <issueId>",
prompt: `issue_ids: ["<issueId>"]
project_root: "<projectRoot>"
## Requirements
- Generate solution for this issue
- Auto-bind single solution
- Issues come from req-plan decomposition (tags: req-plan)
- Respect dependencies: <issue_dependencies>`
})
Solution Artifact:
Write({
file_path: "<sessionDir>/artifacts/solutions/<issueId>.json",
content: JSON.stringify({
session_id: <sessionId>,
issue_id: <issueId>,
...solution,
execution_config: { execution_method, code_review },
timestamp: <ISO-timestamp>
}, null, 2)
})
EXEC Task Creation:
TaskCreate({
subject: "EXEC-W<waveNum>-<issueId>: Implement <solution-title>",
description: `## Execution Task
**Wave**: <waveNum>
**Issue**: <issueId>
**solution_file**: <solutionFile>
**execution_method**: <method>
**code_review**: <review>`,
activeForm: "Implementing <issueId>",
owner: "executor"
})
Wave Processing (Path A/B/C Convergence)
For non-execution-plan inputs, process all issues as a single logical wave:
Workflow:
- For each issue in list:
- Call issue-plan-agent
- Write solution artifact
- Perform inline conflict check
- Create EXEC-* task
- Send issue_ready signal
- After all issues complete, send wave_ready signal
Phase 4: Inline Conflict Check + Dispatch
Perform conflict detection using files_touched overlap analysis.
Conflict Detection Rules:
| Condition | Action |
|---|---|
| File overlap detected | Add blockedBy dependency to previous task |
| Explicit dependency in solution.bound.dependencies.on_issues | Add blockedBy to referenced task |
| No conflict | No blockedBy, task is immediately executable |
Inline Conflict Check Algorithm:
- Get current solution's files_touched (or affected_files)
- For each previously dispatched solution:
- Check if any files overlap
- If overlap, add previous execTaskId to blockedBy
- Check explicit dependencies from solution.bound.dependencies.on_issues
- Return blockedBy array for TaskUpdate
Wave Summary Signal (after all issues in wave):
mcp__ccw-tools__team_msg({
operation: "log", team: "planex", from: "planner", to: "executor",
type: "wave_ready",
summary: "[planner] Wave <waveNum> fully dispatched: <issueCount> issues"
})
SendMessage({
type: "message", recipient: "executor",
content: "## [planner] Wave <waveNum> Complete\nAll issues dispatched, <count> EXEC tasks created.",
summary: "[planner] wave_ready: wave <waveNum>"
})
Phase 5: Report + Finalize
See SKILL.md Shared Infrastructure -> Worker Phase 5: Report
Final Signal (all waves complete):
mcp__ccw-tools__team_msg({
operation: "log",
team: "planex",
from: "planner",
to: "executor",
type: "all_planned",
summary: "[planner] All <waveCount> waves planned, <issueCount> issues total"
})
SendMessage({
type: "message",
recipient: "executor",
content: `## [planner] All Waves Planned
**Total Waves**: <waveCount>
**Total Issues**: <issueCount>
**Status**: All planning complete, waiting for executor to finish remaining EXEC-* tasks
Pipeline complete when executor sends wave_done confirmation.`,
summary: "[planner] all_planned: <waveCount> waves, <issueCount> issues"
})
TaskUpdate({ taskId: <task-id>, status: "completed" })
Loop Check: Query for next PLAN-* task with owner=planner, status=pending, blockedBy empty. If found, return to Phase 1.
Error Handling
| Scenario | Resolution |
|---|---|
| No PLAN-* tasks available | Idle, wait for orchestrator |
| Issue creation failure | Retry once with simplified text, then report error |
| issue-plan-agent failure | Retry once, then report error and skip to next issue |
| Inline conflict check failure | Skip conflict detection, create EXEC task without blockedBy |
| Plan file not found | Report error with expected path |
| execution-plan.json parse failure | Fallback to plan_file parsing (Path B) |
| execution-plan.json missing waves | Report error, suggest re-running req-plan |
| Empty input (no issues, no text, no plan) | AskUserQuestion for clarification |
| Solution artifact write failure | Log warning, create EXEC task without solution_file (executor fallback) |
| Wave partially failed | Report partial success, continue with successful issues |
| Critical issue beyond scope | SendMessage error to executor |