Root cause: team_msg --team parameter maps directly to filesystem path
.workflow/.team/{value}/.msg/, so using team-name creates wrong directory.
Changes:
- All team skills (14 skills, 80+ files): Changed team=<team-name> to
team=<session-id> with clear documentation
- Added NOTE in every file: "team must be session ID (e.g., TLS-xxx-date),
NOT team name. Extract from Session: field in task description."
- CLI fallback examples updated: --team brainstorm -> --team <session-id>
Skills fixed:
- team-brainstorm, team-coordinate, team-frontend, team-issue
- team-iterdev, team-lifecycle-v3, team-planex, team-quality-assurance
- team-review, team-roadmap-dev, team-tech-debt, team-testing
- team-uidesign, team-ultra-analyze
Also includes new team-executor skill for lightweight session execution.
14 KiB
name, description, allowed-tools
| name | description | allowed-tools |
|---|---|---|
| team-executor | Lightweight session execution skill. Resumes existing team-coordinate sessions for pure execution. No analysis, no role generation -- only loads and executes. Session path required. Triggers on "team executor". | TeamCreate(*), TeamDelete(*), SendMessage(*), TaskCreate(*), TaskUpdate(*), TaskList(*), TaskGet(*), Task(*), AskUserQuestion(*), Read(*), Write(*), Edit(*), Bash(*), Glob(*), Grep(*) |
Team Executor
Lightweight session execution skill: load session -> reconcile state -> spawn workers -> execute -> deliver. No analysis, no role generation -- only executes existing team-coordinate sessions.
Architecture
+---------------------------------------------------+
| Skill(skill="team-executor") |
| args="--session=<path>" [REQUIRED] |
| args="--role=<name>" (for worker dispatch) |
+-------------------+-------------------------------+
| Session Validation
+---- --session valid? ----+
| NO | YES
v v
Error immediately Role Router
(no session) |
+-------+-------+
| --role present?
| |
YES | | NO
v | v
Route to | Orchestration Mode
session | -> executor
role.md |
Session Validation (BEFORE routing)
CRITICAL: Session validation MUST occur before any role routing.
Parse Arguments
Extract from $ARGUMENTS:
--session=<path>: Path to team-coordinate session folder (REQUIRED)--role=<name>: Role to dispatch (optional, defaults to orchestration mode)
Validation Steps
-
Check
--sessionprovided:- If missing -> ERROR: "Session required. Usage: --session="
- Do NOT proceed
-
Validate session structure (see specs/session-schema.md):
- Directory exists at path
team-session.jsonexists and valid JSONtask-analysis.jsonexists and valid JSONroles/directory has at least one.mdfile- Each role in
team-session.json#roleshas corresponding.mdfile inroles/
-
Validation failure:
- Report specific missing component
- Suggest re-running team-coordinate or checking path
- Do NOT proceed
Validation Checklist
Session Validation Checklist:
[ ] --session argument provided
[ ] Directory exists at path
[ ] team-session.json exists and parses
[ ] task-analysis.json exists and parses
[ ] roles/ directory has >= 1 .md files
[ ] All session.roles[] have corresponding roles/<role>.md
Role Router
Dispatch Logic
| Scenario | Action |
|---|---|
No --session |
ERROR immediately |
--session invalid |
ERROR with specific reason |
No --role |
Orchestration Mode -> executor |
--role=executor |
Read built-in roles/executor/role.md |
--role=<other> |
Read <session>/roles/<role>.md |
Orchestration Mode
When invoked without --role, executor auto-starts.
Invocation: Skill(skill="team-executor", args="--session=<session-folder>")
Lifecycle:
Validate session
-> executor Phase 0: Reconcile state (reset interrupted, detect orphans)
-> executor Phase 1: Spawn first batch workers (background) -> STOP
-> Worker executes -> SendMessage callback -> executor advances next step
-> Loop until pipeline complete -> Phase 2 report
User Commands (wake paused executor):
| Command | Action |
|---|---|
check / status |
Output execution status graph, no advancement |
resume / continue |
Check worker states, advance next step |
Role Registry
| Role | File | Type |
|---|---|---|
| executor | roles/executor/role.md | built-in orchestrator |
| (dynamic) | <session>/roles/<role-name>.md |
loaded from session |
COMPACT PROTECTION: Role files are execution documents. After context compression, role instructions become summaries only -- MUST immediately
Readthe role.md to reload before continuing. Never execute any Phase based on summaries.
Shared Infrastructure
The following templates apply to all worker roles. Each loaded role.md follows the same structure.
Worker Phase 1: Task Discovery (all workers shared)
Each worker on startup executes the same task discovery flow:
- Call
TaskList()to get all tasks - Filter: subject matches this role's prefix + owner is this role + status is pending + blockedBy is empty
- No tasks -> idle wait
- Has tasks ->
TaskGetfor details ->TaskUpdatemark in_progress
Resume Artifact Check (prevent duplicate output after resume):
- Check if this task's output artifacts already exist
- Artifacts complete -> skip to Phase 5 report completion
- Artifacts incomplete or missing -> normal Phase 2-4 execution
Worker Phase 5: Report + Fast-Advance (all workers shared)
Task completion with optional fast-advance to skip executor round-trip:
- Message Bus: Call
mcp__ccw-tools__team_msgto log message- Params: operation="log", team=, from=, to="executor", type=, summary="[]
", ref= teammust be session ID (e.g.,TC-my-project-2026-02-27), NOT team name. Extract from task descriptionSession:field -> take folder name.- CLI fallback:
ccw team log --team <session-id> --from <role> --to executor --type <type> --summary "[<role>] ..." --json
- Params: operation="log", team=, from=, to="executor", type=, summary="[]
- TaskUpdate: Mark task completed
- Fast-Advance Check:
- Call
TaskList(), find pending tasks whose blockedBy are ALL completed - If exactly 1 ready task AND its owner matches a simple successor pattern -> spawn it directly (skip executor)
- Otherwise -> SendMessage to executor for orchestration
- Call
- Loop: Back to Phase 1 to check for next task
Fast-Advance Rules:
| Condition | Action |
|---|---|
| Same-prefix successor (Inner Loop role) | Do not spawn, main agent inner loop (Phase 5-L) |
| 1 ready task, simple linear successor, different prefix | Spawn directly via Task(run_in_background: true) |
| Multiple ready tasks (parallel window) | SendMessage to executor (needs orchestration) |
| No ready tasks + others running | SendMessage to executor (status update) |
| No ready tasks + nothing running | SendMessage to executor (pipeline may be complete) |
Fast-advance failure recovery: If a fast-advanced task fails, the executor detects it as an orphaned in_progress task on next resume/check and resets it to pending for re-spawn. Self-healing. See monitor.md.
Worker Inner Loop (roles with multiple same-prefix serial tasks)
When a role has 2+ serial same-prefix tasks, it loops internally instead of spawning new agents:
Inner Loop flow:
Phase 1: Discover task (first time)
|
+- Found task -> Phase 2-3: Load context + Execute work
| |
| v
| Phase 4: Validation (+ optional Inline Discuss)
| |
| v
| Phase 5-L: Loop Completion
| |
| +- TaskUpdate completed
| +- team_msg log
| +- Accumulate summary to context_accumulator
| |
| +- More same-prefix tasks?
| | +- YES -> back to Phase 1 (inner loop)
| | +- NO -> Phase 5-F: Final Report
| |
| +- Interrupt conditions?
| +- consensus_blocked HIGH -> SendMessage -> STOP
| +- Errors >= 3 -> SendMessage -> STOP
|
+- Phase 5-F: Final Report
+- SendMessage (all task summaries)
+- STOP
Phase 5-L vs Phase 5-F:
| Step | Phase 5-L (looping) | Phase 5-F (final) |
|---|---|---|
| TaskUpdate completed | YES | YES |
| team_msg log | YES | YES |
| Accumulate summary | YES | - |
| SendMessage to executor | NO | YES (all tasks summary) |
| Fast-Advance to next prefix | - | YES (check cross-prefix successors) |
Wisdom Accumulation (all roles)
Cross-task knowledge accumulation. Loaded from session at startup.
Directory:
<session-folder>/wisdom/
+-- learnings.md # Patterns and insights
+-- decisions.md # Design and strategy decisions
+-- issues.md # Known risks and issues
Worker load (Phase 2): Extract Session: <path> from task description, read wisdom files.
Worker contribute (Phase 4/5): Write discoveries to corresponding wisdom files.
Role Isolation Rules
| Allowed | Prohibited |
|---|---|
| Process own prefix tasks | Process other role's prefix tasks |
| SendMessage to executor | Directly communicate with other workers |
| Use tools appropriate to responsibility | Create tasks for other roles |
| Fast-advance simple successors | Spawn parallel worker batches |
| Report capability_gap to executor | Attempt work outside scope |
Executor additionally prohibited: directly write/modify deliverable artifacts, call implementation subagents directly, directly execute analysis/test/review, generate new roles.
Cadence Control
Beat model: Event-driven, each beat = executor wake -> process -> spawn -> STOP.
Beat Cycle (single beat)
======================================================================
Event Executor Workers
----------------------------------------------------------------------
callback/resume --> +- handleCallback -+
| mark completed |
| check pipeline |
+- handleSpawnNext -+
| find ready tasks |
| spawn workers ---+--> [Worker A] Phase 1-5
| (parallel OK) --+--> [Worker B] Phase 1-5
+- STOP (idle) -----+ |
|
callback <-----------------------------------------+
(next beat) SendMessage + TaskUpdate(completed)
======================================================================
Fast-Advance (skips executor for simple linear successors)
======================================================================
[Worker A] Phase 5 complete
+- 1 ready task? simple successor? --> spawn Worker B directly
+- complex case? --> SendMessage to executor
======================================================================
Executor Spawn Template
Standard Worker (single-task role)
Task({
subagent_type: "general-purpose",
description: "Spawn <role> worker",
team_name: <team-name>,
name: "<role>",
run_in_background: true,
prompt: `You are team "<team-name>" <ROLE>.
## Primary Instruction
All your work MUST be executed by calling Skill to get role definition:
Skill(skill="team-executor", args="--role=<role> --session=<session-folder>")
Current requirement: <task-description>
Session: <session-folder>
## Role Guidelines
- Only process <PREFIX>-* tasks, do not execute other role work
- All output prefixed with [<role>] tag
- Only communicate with executor
- Do not use TaskCreate to create tasks for other roles
- Before each SendMessage, call mcp__ccw-tools__team_msg to log (team=<session-id> from Session field, NOT team name)
- After task completion, check for fast-advance opportunity (see SKILL.md Phase 5)
## Workflow
1. Call Skill -> get role definition and execution logic
2. Follow role.md 5-Phase flow
3. team_msg(team=<session-id>) + SendMessage results to executor
4. TaskUpdate completed -> check next task or fast-advance`
})
Inner Loop Worker (multi-task role)
Task({
subagent_type: "general-purpose",
description: "Spawn <role> worker (inner loop)",
team_name: <team-name>,
name: "<role>",
run_in_background: true,
prompt: `You are team "<team-name>" <ROLE>.
## Primary Instruction
All your work MUST be executed by calling Skill to get role definition:
Skill(skill="team-executor", args="--role=<role> --session=<session-folder>")
Current requirement: <task-description>
Session: <session-folder>
## Inner Loop Mode
You will handle ALL <PREFIX>-* tasks in this session, not just the first one.
After completing each task, loop back to find the next <PREFIX>-* task.
Only SendMessage to executor when:
- All <PREFIX>-* tasks are done
- A consensus_blocked HIGH occurs
- Errors accumulate (>= 3)
## Role Guidelines
- Only process <PREFIX>-* tasks, do not execute other role work
- All output prefixed with [<role>] tag
- Only communicate with executor
- Do not use TaskCreate to create tasks for other roles
- Before each SendMessage, call mcp__ccw-tools__team_msg to log (team=<session-id> from Session field, NOT team name)
- Use subagent calls for heavy work, retain summaries in context`
})
Integration with team-coordinate
| Scenario | Skill |
|---|---|
| New task, no session | team-coordinate |
| Existing session, resume execution | team-executor |
| Session needs new roles | team-coordinate (with --resume) |
| Pure execution, no analysis | team-executor |
Error Handling
| Scenario | Resolution |
|---|---|
| No --session provided | ERROR immediately with usage message |
| Session directory not found | ERROR with path, suggest checking path |
| team-session.json missing | ERROR, session incomplete, suggest re-run team-coordinate |
| task-analysis.json missing | ERROR, session incomplete, suggest re-run team-coordinate |
| No roles in session | ERROR, session incomplete, suggest re-run team-coordinate |
| Role file not found | ERROR with expected path |
| capability_gap reported | Warn only, cannot generate new roles (see monitor.md handleAdapt) |
| Fast-advance spawns wrong task | Executor reconciles on next callback |