From maestro
Handles single-task execution in a maestro project: spec authoring, task claiming, iteration through verify/block/ship, and automatic handoff envelopes.
How this skill is triggered — by the user, by Claude, or both
Slash command
/maestro:maestro-taskThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are working in a maestro project. Author a product-spec, materialize one task per PR, claim it, iterate until `task verify` returns PASS, then ship.
You are working in a maestro project. Author a product-spec, materialize one task per PR, claim it, iterate until task verify returns PASS, then ship.
This skill covers the single-task path (light-mode specs, one PR). For multi-PR work, see maestro-mission — heavy-mode specs decompose into a batch of child tasks via mission from-spec → mission decompose.
Auto-activate when:
tsk-...) or says "resume this task"..maestro/specs/ exists).Do not activate for one-liner edits or read-only questions.
maestro-design — do not write spec markdown by hand without grilling.claim and block emit a handoff envelope to .maestro/handoffs/<hnd-...>.json. This is automatic; do not invent parallel handoff files. ship, verify, and abandon do not emit yet.--reason. Same for abandon and verify --verdict {human,block}.maestro-mission.spec new (light) → task from-spec → claim → [doing → verify ↔ blocked] → ready → ship
maestro spec new <slug> # mode defaults to light
maestro spec new <slug> --mode heavy # promote when multi-PR
maestro spec new <slug> --title "Human-readable title"
The grill protocol in maestro-design walks the spec through acceptance_criteria + non_goals + work_type before this verb runs. If you found yourself at this skill without a spec, jump to maestro-design first.
maestro task from-spec .maestro/specs/<slug>.md
Creates a task in draft. Print the returned tsk-... id back to the user.
maestro claim <id> --agent <agent-id>
# heavy-mode specs auto-create a worktree under <parent>/<repo>-<task_id>
maestro claim <id> --skip-worktree # opt out of auto-worktree
The hot-path alias claim is identical to task claim. --agent is recorded on the task and the transition evidence.
maestro verify <id>
maestro verify <id> --json # full JSON envelope
maestro verify <id> --verdict human --reason "needs UX call" # stays at verifying, exit 2
maestro verify <id> --verdict block --reason "infra missing" # → blocked, exit 3
Exit codes (see maestro-verify for the full protocol):
0 PASS — the task auto-advances verifying → ready. Move to step 5.1 FAIL — fix the cited violations, edit, then verify again. The task stays at verifying.2 HUMAN — explicit human verdict, task stays at verifying. Hand off and stop.3 BLOCK — task → blocked. Surface the reason; do not retry without guidance.maestro block <id> --reason "missing-credentials"
maestro abandon <id> --reason "out-of-scope after grill"
Both transitions emit an evidence row and an observability row. block also emits a handoff envelope; abandon does not.
maestro ship <id>
maestro ship <id> --pr-url https://github.com/owner/repo/pull/123
ship is the manual ready → shipped flip.
If, mid-claim, the task turns out to be two or three smaller pieces, split it rather than overloading the verify loop:
maestro task split <parent-id> "Wire the API" "Wire the UI" "Add tests"
maestro task split <parent-id> "first half" "second half" --parallel
maestro task split <parent-id> "title" --agent <agent-id> # assert claimant
claimed or doing. Children are created as draft with
slugs <parent.slug>-1, <parent.slug>-2, …, and inherit mission_id,
spec_path, and worktree_path from the parent.child[i].blocked_by = [child[i-1]]. Pass
--parallel to give every child an empty blocked_by.blocked_by gains the new child ids, so the parent stays in flight
while you claim and ship each child individually. task get <parent> now
shows a children: section and an external blocked_by: section.--cascade to abandon
the descendants post-order; without it, non-terminal children block the
abandon with TASK_ABANDON_CASCADE_BLOCKED.maestro abandon <parent-id> --reason "scope dropped" --cascade
task claim does for you.maestro/evidence/<date>.jsonl..maestro/runs/<task-id>/observability.jsonl.mode: heavy specs (and only those), creates a worktree at <parent>/<repo>-<task_id> on a branch feat/<slug> off main. Persists the record at .maestro/worktrees/<task-id>.json on the primary repo. The path is printed in the (worktree …) suffix.task:claim handoff envelope at .maestro/handoffs/<id>.json carrying agent_id, worktree_path, and spec_path.Worktree failures (git not initialized, branch already exists, etc.) are logged to stderr but never block the claim — the task still reaches claimed.
Every transition writes an evidence row. For verification commands that do not run through task verify, record explicitly:
maestro evidence record --task <id> --command "bun test" --exit 0
maestro evidence record --task <id> --kind manual-note --note "Verified UI on staging 1280x800"
For AI review / threat-model rows, see maestro-verify.
maestro task list # all tasks
maestro task list --state claimed
maestro task list --mission-id pln-... # children of a mission
maestro task get <id>
maestro task observe is the ad-hoc inspection verb for the agent's own worktree: one-shot metric query or last-N log lines. It does not gate any verdict — that is runtime check's job (see maestro-verify).
maestro task observe metrics 'up' --prometheus-url http://localhost:9090
maestro task observe metrics 'rate(errors[5m])' --json
maestro task observe logs --log-file ./app.log --lines 50 --filter error
Flags:
--prometheus-url <url> overrides MAESTRO_PROMETHEUS_URL.--log-file <path> overrides MAESTRO_DEV_LOG_FILE.--lines N (logs only, default 100).--filter <substring> (logs only, plain substring match).--json emits a JSON envelope instead of plain text.--record --task <id> writes a manual-note evidence row tagged [dev-observation:metrics] / [dev-observation:logs] so the observation appears in evidence list.Exit codes: 0 success, 1 config error (missing URL/path, --record without --task), 2 backend unreachable / empty vector / fs read error. The verb is one-shot — there is no --follow.
maestro recover --task <id> # reset working tree to last PASS verdict's tree
maestro recover --task <id> --dry-run
maestro worktree create <slug> # explicit worktree (use when task claim's auto-create did not run)
recover finds the latest PASS verdict for the task, runs git reset --hard to its tree_sha, removes .maestro/runs/<id>/, and records a recovery evidence row at witnessed-by-maestro. Refuses dirty trees unless --force.
If task verify repeats the same violations after two iterations, the loop is stuck. Choose one:
Fix Recipe in docs/principles/<rule>.md.maestro gc slop-cleanup to see the violation grouped with the rest of the codebase.mode: heavy and use maestro-mission to break the work into smaller verifiable PRs.The MCP tool surface mirrors the CLI:
| MCP tool | CLI equivalent |
|---|---|
maestro_task_list, maestro_task_get | maestro task list, maestro task get |
maestro_task_create | maestro task from-spec |
maestro_task_claim | maestro task claim |
maestro_task_block, maestro_task_unblock | maestro task block, maestro task abandon (no native unblock; re-claim from blocked) |
maestro_task_abandon | maestro task abandon — accepts cascade: true to recursively abandon non-terminal split-children |
maestro_task_split | maestro task split — parent_id, titles[], optional parallel, optional agent_id |
maestro_task_complete | maestro task ship |
maestro_evidence_record, maestro_evidence_list | maestro evidence record, maestro evidence list |
maestro_contract_show, maestro_contract_amend | maestro contract show, maestro contract amend |
maestro_verdict_show, maestro_verdict_request | maestro verdict show, maestro verdict request |
maestro_handoff_list, maestro_handoff_show | .maestro/handoffs/*.json (read directly; see maestro-handoff) |
maestro_handoff_emit, maestro_handoff_pickup | emit envelope outside lifecycle / mark picked up (see maestro-handoff) |
maestro_task_list accepts mission_id to filter to a mission's children. The MCP schema is strict — unknown fields fail rather than getting silently dropped.
If MCP is unavailable, fall back to the CLI verbs above.
The next phase after this skill depends on where the single-task loop exits:
ship → loop is done. Surface the PR URL; no downstream skill.block → the next agent enters via maestro-handoff and reads the task:block envelope. Surface block_reason and stop.verify --verdict human → surface the reason to the user; do not retry. The user (or a follow-up agent via maestro-handoff) decides next.maestro-verify is the protocol you run inside this skill at step 4, not a handoff target.Pass a claimed task with a clean evidence trail — not an in-flight scratchpad. Do not invoke spec authoring or planning from this skill.
maestro-design — grill-protocol spec authoring (run before task from-spec).maestro-mission — heavy-mode multi-PR work (skip task from-spec; use mission from-spec + mission decompose).maestro-verify — canonical verification protocol (PASS / FAIL / HUMAN / BLOCK routing).maestro-setup — setup (idempotent default action) and setup check.docs/cli-reference.md — verb-by-verb reference.npx claudepluginhub reinamaccredy/maestro --plugin maestroDecomposes a heavy-mode product spec into a phased mission with child tasks, persisted as JSONL files. Activates after `maestro-design` produces a heavy spec or when a task needs to be promoted to multi-PR work.
Executes the next TaskMaster task using the implementation plan with CDD verification. Dispatches a subagent to implement, verifies subtasks with evidence, and loops until all tasks are complete.