jpicklyk/task-orchestrator/status-progression
Claude Code and agent skill by jpicklyk/task-orchestrator
- community
Checking that the SKILL.md file is still in the repository.
Navigates role transitions for MCP work items: shows the current role, gate status, missing notes and the right trigger; use when a user says: advance this item, move to work, start this task, complete this item, what's the next status, why can't I advance, unblock this, cancel this item, reopen this, or check gate status.
Install
npx vskill@latest install jpicklyk/task-orchestrator/status-progressionSKILL.md
Status Progression
Guides role transitions for a work item: identify it, read its gate status, fill missing notes, advance, and recover from a blocked or failed transition. Shapes are in `_generated/call-shapes.md` (advance transition); semantics are in current/docs/api-reference.md ("advance" and "items_read"). Ids below are 8-hex shorts and any id field also takes the full UUID. Read every answer through the envelope: ok, then data.results[0] (ok or error) and data.summary {ok, failed}. When a write element fails, the call-level error is only partial_failure (no detail, no fix): read code, kind (retry class), detail and fix from data.results[0].error. A read (select) call reports its failure in the call-level error.
Director mode
Director mode is the session state entered by /task-orchestrator:director (or by running as the hardened director agent). Here the director-safe reads are items_read get and blocked (they show the role, the block reason, a decisionId and whether the item is resumable). Never run advance, notes_write or items_read context in director mode. Answering an open decision goes through /task-orchestrator:director. Every transition, a resume once the item is resumable included, is delegated: SendMessage the run's coordinator when the item is a member of an open or paused run, otherwise dispatch ONE background Agent (run_in_background: true, model set) that runs the steps below. The agent reports the item id, the role before and after, and one line on any gate or block, never note bodies. A background agent dispatched by a director is not in director mode: it runs the steps below.
Step 1: Identify the item
Resolve $ARGUMENTS to an id with a search; if several match, show them via AskUserQuestion. With no argument, ask for an id or a title fragment.
Step 2: Read the state
Render a status card from the answer:
| Field | Show | |
|---|---|---|
item.role | the role (absent for a lifecycle-free item: no card, it has no lifecycle) | |
gateStatus.canAdvance | open or blocked (seat enforcement and claim ownership are not checked, so a member of an open run can still answer seat_forbidden) | |
gateStatus.missing, missingBySeat | each missing note key and role, and which seat owns it | |
gateStatus.blockedBy | first failing gate: table, dependency, note, lease | |
guidanceKey | resolve its text with items_read schema (fields: ["guidance"]) and show it as Guidance | |
transitions | the allowed triggers and the role each leads to | |
item.blockedReason, item.decisionId | for a blocked item: why it is blocked (below) | |
decisions[] | the item's decisions, withdrawn ones excluded: id, class, status, and the chosen option once answered |
A schema-free item has an open gate: the schema read answers {schemaFree: true}.
Step 3: Fill missing notes
If canAdvance is false because of notes, fill them from the conversation; ask the user when the content cannot be inferred. Send them in one call, an upsert element per note:
Re-read context and confirm canAdvance is true. Only one guidanceKey is returned at a time (the first unfilled required note); schema[] lists all of them.
Step 4: Advance
Report from data.results[0]:
| Field | Report | |
|---|---|---|
previousRole, newRole | the transition | |
cascades | parents that moved, or were suppressed (applied: false, with blocked or reason) | |
unblocked | items now actionable | |
expectedNotes | notes the new phase expects |
Omit a line when its field is empty.
Triggers
| Trigger | From | To | Notes | |
|---|---|---|---|---|
start | queue, work, review | work, review, terminal | review to terminal; work to terminal when the schema has no review notes. Gates the current phase | |
complete | any non-terminal, non-blocked | terminal | checks required notes of every phase | |
cancel | any non-terminal | terminal | statusLabel cancelled; bypasses note gates, not claim ownership | |
block / hold | any non-terminal, non-blocked | blocked | take reason (below) | |
resume | blocked | previous role | clears the reason | |
reopen | terminal | queue | clears statusLabel, bypasses note gates (not claim ownership), and is a pin point (the item is re-pinned to the current config) |
Blocked items
block and hold take an optional reason: awaiting_decision, dependency, resource or manual (default). reason: awaiting_decision requires a decisionId naming an open or acknowledged decision on that item. Get one by raising with block: true (runs_write raise), which raises and blocks in one unit; do not send a bare block for a decision (see references/decisions.md). A decisionId with any other reason, or reason/decisionId on a trigger other than block/hold, is invalid_request:
items_readgetandcontextshowblockedReasonanddecisionIdfor a blocked item.items_readblockedlists blocked items: each entry hasblockType(explicitordependency) andblockers[](threshold,satisfied); an explicit entry also hasreason, and anawaiting_decisionentry addsdecisionIdandresumable(true once the decision is answered, withdrawn or missing).- Answering a decision never resumes the item. Resume only when the entry is
resumable: true(orcontextdecisions[]shows thedecisionIdanswered, or no longer lists it: withdrawn decisions are left out); while the decision is open or acknowledged, the next step is to have it answered (the director board), not aresume.resumeclears the reason. The full rule, and how to carry the ruling to the next dispatch, is in references/decisions.md. - Decisions are listed on the item in
contextdecisions[];runs_readdecisionsis director-only. - Errors to recognize (on
data.results[0].error):invalid_requestwithdetail.fields[].field/decisionId(required withawaiting_decision, names no decision, belongs to another item, or is already answered or withdrawn).decision_closedis aruns_writeack/answer/withdrawerror (director profile), never anadvanceerror.invalid_transitionwithdetail.fromRole: none(a lifecycle-free item takes no trigger).
Troubleshooting
`gate_blocked`. data.results[0].error.detail.missing[] lists the notes. Fill them (Step 3) and retry. Also read detail.violations[].gate: missing and violations may both be present, and a review-pending or independence violation is not cleared by filling notes.
`seat_forbidden`. The item is a member of an open or paused run whose schema declares seats, and the caller may not send that trigger. detail.allowedSeats names who may (it always starts with coordinator). The run's coordinator resends with its coordinator token as top-level seatToken; otherwise leave the transition to the run, and never retry it token-less. This also covers resume of a decision-blocked run member: the coordinator sends it with its token, and a member seat may resume only if its seat transitions: list resume. Or close the run first.
`run_paused`. A start under a token of a run paused on its budget or attempt limit. Read detail.pauseReason and detail.pauseDecisionId; the answer comes through the director board. Do not retry.
Blocked by a dependency (`dependency_unmet`). Find the blockers; advance them first, then this item appears in their unblocked:
Use /dependency-manager to view or change the edges.
Item is in the blocked role and `start` fails. start is not valid from blocked. Read blockedReason first. A pending decision (awaiting_decision, not resumable) must be answered, not resumed. Otherwise send resume (see Triggers), re-read context, then start.
Skip the review phase. complete jumps from work straight to terminal but checks every phase's required notes; fill what is missing or use cancel.
`resource_unavailable` (kind transient). A shared resource the item declares through a trait is held by another item. This is not a note gate: do not fill notes and do not spin-retry. Report data.results[0].error.detail.resources[] and data.results[0].error.retryAfterMs, work a different item, and retry later. To see the holder, read context resourceLeases (holderItemId, expiresAt); an operator can clear a stuck lease with DELETE /api/v1/resources/leases/{key} (admin). See Workflow Guide, Resource Leasing.
A parent cascaded unexpectedly. Cascades are by design: the first child starting moves a queued parent to work; the last child reaching terminal moves the parent to terminal. The cascades list shows each parent and why. A parent in review is never moved by that cascade (applied: false, review-pending): it needs its own explicit complete (or its review, then start).
`invalid_transition`. Read data.results[0].error.detail.fromRole and .allowed. A terminal item allows only reopen; a lifecycle-free item (fromRole: none) allows nothing.
Item is terminal and should be worked again. Send reopen; it returns to queue and its terminal parent returns to work.
What next? The next ready item, ranked by priority (limit defaults to 1):
An empty answer with a reason (claim_held, dependency_unmet) means wait; no reason means nothing matches.
For work inside an open run, the run's frontier is the authoritative ready list (ready, with inFlight and waiting beside it):
Example: gated flow
contextshowsrole: queue,canAdvance: false,missing: ["feature-summary"].- Resolve its guidance, draft the note from the conversation,
notes_writeupsert it withrole: "queue". contextagain:canAdvance: true.advancetransitionstartanswersnewRole: workandexpectedNotesfor the work phase. Fill those as work proceeds, then return control; the orchestrator advances to review or terminal.
Quick decision guide
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingclaude-plugins/task-orchestrator/skills/status-progression/SKILL.md
Popularity
- Repository stars
- 170
- Repository forks
- 18
- 7-day trend score
- 26
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 18 Mar 2026, 7 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/jpicklyk/task-orchestrator/status-progression)