Decompose the current session's jobs-to-be-done into a parallelizable task plan for an agent team. Assigns each task a model tier (haiku / sonnet / opus) and a specialist subagent when one fits. Organises work into dependency waves with no shared-file edits inside a wave to avoid merge conflicts. Use this skill whenever the user says "team this up", "use a team", "use agent teams", "delegate this", "split this work", "parallelize this", "fan this out", "divide and conquer", or otherwise asks to coordinate multiple agents on work already discussed in the session. Also trigger when the user says a task is big and wants help farming it out, or when they explicitly invoke /team-work.
Turn what's been discussed in the current session into a clean, shareable plan for a team of agents — then run it.
Trigger on phrases like:
Also trigger when the user is clearly about to hand off a pile of discussed work and wants it organised.
The source of truth for jobs-to-be-done is the current conversation. If the user points at a GitHub issue, plan file, or branch, layer that in — but don't go hunting for it uninvited.
A single markdown plan with two things:
Then: confirm → spawn the agents.
Pick based on how confident the plan is:
| Situation | Mode |
|---|---|
| Plan is obvious, small, low-risk (≤3 tasks, no shared files, clear scope) | Act — build plan, show it briefly, spawn immediately |
| Plan has ambiguity, >3 tasks, shared files, or destructive steps | Confirm — present the plan, ask for sign-off, then spawn |
| User explicitly says "just plan it" / "don't spawn yet" | Plan only — write the plan, stop |
When in doubt, confirm. Cost of pausing is a sentence; cost of a bad fan-out is wasted runs.
Read the conversation and list everything the user has expressed a desire to get done. Be concrete: each item should name a deliverable, not a theme.
Bad: "Improve the dashboard" Good: "Add empty-state card to Base tab streak section"
If the session is vague, ask one clarifying question before drafting. Don't interrogate.
A task is atomic if:
If a task isn't atomic, split it. If two tasks are both tiny and touch the same area, merge them — the overhead of spawning an agent isn't free.
Use this heuristic. Set thinking/effort to match.
| Tier | Model | Thinking | Use for |
|---|---|---|---|
| S | haiku | low | Lookups, single-file reads, mechanical renames, file moves, simple find/replace, formatting, running a known command and reporting output, summarising a file |
| M | sonnet | medium | Typical feature work, multi-file edits, focused refactors, writing tests for existing code, implementing a well-specified component, fixing a known bug |
| L | opus | high | Architecture decisions, cross-cutting refactors, ambiguous or novel problems, tricky debugging with unclear root cause, design of new systems, security-sensitive review |
Bias toward the cheaper tier when genuinely uncertain — haiku failing fast is cheaper than opus doing trivial work. But don't send opus-shaped problems to sonnet.
Before defaulting to general-purpose, check if a specialist fits. Specialists carry domain context that would otherwise need to be re-derived.
Process:
subagent_type param).bjj-* family; iOS/SwiftUI → ios-swift-expert / bjj-ios-engineer-inherit; data pipeline → bjj-data-engineer-*; UI review → grapla-ui-reviewer; Swift navigation → swift-navigation-expert; typography → typography-grapla-expert; broad codebase exploration → Explore; planning only → Plan.general-purpose. Specialists earn their seat when domain nuance matters.If no specialist fits, use general-purpose with the chosen model tier.
Group tasks into waves. Rules inside a wave:
A wave can be a single task — that's fine when a blocker must land first.
Use this template:
# Team plan: <short title>
## Tasks
- **T1** — <goal>. Tier: S/M/L. Model: haiku/sonnet/opus. Agent: <subagent_type>. Files: <paths/globs>. Deps: none | T?, T?
- **T2** — ...
## Waves
- **Wave 1** (parallel): T1, T3, T5
- **Wave 2** (after W1): T2, T4
- **Wave 3** (after W2): T6
## Notes
<anything the user should flag or override before spawning>
Keep it tight. This is a briefing, not a dissertation.
Unless in plan-only mode:
Agent tool calls.After each wave, briefly report what landed and any surprises before kicking the next wave.
git push, force-pushes, deletions, external API calls with side effects. Those go in their own wave with user sign-off.develop.User has spent the session discussing: adding an empty state to the Base tab streak card, renaming StreakService → StreakTracker across the iOS code, and writing a data-pipeline validator for a new position field.
Plan:
# Team plan: Base tab streak + data validator
## Tasks
- **T1** — Rename StreakService → StreakTracker across grapla/. Tier: S. Model: haiku. Agent: general-purpose. Files: grapla/**/*.swift. Deps: none.
- **T2** — Add EmptyStateCard to Base tab streak section when no sessions logged. Tier: M. Model: sonnet. Agent: bjj-ios-engineer-inherit. Files: grapla/Features/App/Views/BaseTab*.swift. Deps: T1.
- **T3** — Add Zod validator for new `lever_points` field in position schema. Tier: M. Model: sonnet. Agent: bjj-data-engineer-inherit. Files: data/schemas/seed-models/position/enrichment-fields.ts, data/sources/positions/*.json sample. Deps: none.
## Waves
- **Wave 1** (parallel): T1, T3
- **Wave 2** (after W1): T2
## Notes
T2 waits on T1 because the streak view references the renamed type. T3 is fully independent of the iOS work.
Then confirm and spawn Wave 1 as two parallel Agent calls.