jpicklyk/task-orchestrator/schema-workflow
Claude Code and agent skill by jpicklyk/task-orchestrator
- community
Checking that the SKILL.md file is still in the repository.
Internal, invoked from the orchestration context: drives a schema-typed MCP item through its gate-enforced phases, filling required notes.
Install
npx vskill@latest install jpicklyk/task-orchestrator/schema-workflowSKILL.md
Schema Workflow
Drive a work item through its gate-enforced lifecycle. The skill is schema-driven: note requirements and authoring guidance are read from the item's resolved schema at runtime, never assumed. Shapes are in `_generated/call-shapes.md`; ids below are 8-hex shorts (a full UUID is also accepted). 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.
Applies to any item whose type resolves to a schema under its pin (config effective lists the declared types). An item whose type resolves to no schema is schema-free and advances without gates.
Director mode. In director mode (the session state entered by /task-orchestrator:director, or the hardened director agent) a director never drives an item through its phases: hand it to the run's coordinator (SendMessage) or to ONE background Agent (run_in_background: true, model set). A background agent dispatched by a director is not in director mode: it runs the steps below.
Entry point
| Field | Meaning | |
|---|---|---|
item.role | queue, work, review, blocked or terminal. Absent for a lifecycle-free item | |
schema[] | every schema note: key, role, required, exists, filled, and seat when the schema is seat-aware (keys only) | |
gateStatus.canAdvance | whether start would pass right now (claim ownership and seat enforcement excluded) | |
gateStatus.missing / missingBySeat | required notes of the current phase not yet filled, and by whom | |
gateStatus.blockedBy | first failing gate: table, dependency, note or lease; present only when canAdvance is false | |
guidanceKey | first unfilled required note; resolve its text with the schema read below | |
skillPointer | skill named by that note; invoke it before filling | |
dispatch | {agent?, model?, effort?} for the item's current role | |
transitions | each allowed trigger and the role it leads to |
item.roleofterminal: nothing to do.blocked: use/status-progression; for a pending decision follow its decisions rule (answer first, resume only whenresumable).- Schema-free: the schema read answers
{schemaFree: true}. Tell the user "No schema for this item's type; use/manage-schemasto configure gates". The item still advances freely. - Lifecycle-free (role absent): never advanced; its notes are optional. Any
advancetrigger failsinvalid_transitionwithfromRole: none.
Resolve authoring text (guidance, description, skill) for the notes:
Phase progression loop
Each phase: fill the required notes, then advance.
Step 1 - Find the missing notes
Read gateStatus.missing. If it is empty and canAdvance is true, go to Step 3.
Step 2 - Fill the notes
For the note named by guidanceKey, follow its resolved guidance; if skillPointer is set, invoke that skill first and use its output. If guidanceKey is absent, use the note's description. Write the body as distilled prose; route verbatim artifacts (test output, diffs, logs) through bodyFromFile.
When you already know several bodies, send them in one notes_write call (an upsert element each). Re-read context only when you need the next guidanceKey. A note whose role differs from the schema's role fails schema_violation. A schema_pinned_conflict means the item's pin lacks a key the current config requires: repin it (items_write repin), then retry.
Step 3 - Advance
Read data.results[0]:
| Field | Check | |
|---|---|---|
newRole | the phase entered (previousRole is also present) | |
cascades | parents re-evaluated: {itemId, previousRole, targetRole, applied, blocked?}; when blocked, reason and missing[] (gate), contended[] (resource) or blockers[] (dependency) | |
unblocked | items that were waiting on this one | |
expectedNotes | note keys the new phase expects; fill these next | |
dispatch | the profile for newRole | |
paused | {decisionId}: the transition landed and the run just paused on its budget. Stop dispatching into the run; a director or human answers the decision |
A failed transition is ok: false with call-level partial_failure; the reason is data.results[0].error.code:
gate_blocked:data.results[0].error.detail.missing[]names the notes still unfilled. Fill them (Step 2) and retry; no need to re-read first. Also readdetail.violations[].gatein that same error:missingandviolationsmay both be present, and a review-pending or independence violation is not cleared by filling notes.resource_unavailable(data.results[0].error.kind: transient): not a note gate. Another item holds a resource this item's traits declare. Do not fill notes and do not spin-retry; reportdata.results[0].error.detail.resources[]anddata.results[0].error.retryAfterMsand see/status-progression.dependency_unmet: a blocker is unfinished; diagnose with/dependency-manager.not_claim_holder: someone else holds the claim; only the holder can transition.seat_forbidden: the item is a member of an open or paused run whose schema declares seats, and your caller is not allowed that trigger (detail.allowedSeatslists who is; it always starts withcoordinator). If you are the run's coordinator, resend with the run's coordinator token as top-levelseatToken; otherwise leave the transition to the run. Never retry it token-less.run_paused: astartunder a token of a run that is paused on its budget or attempt limit. Readdetail.pauseReasonanddetail.pauseDecisionId; stop and never retry. A director or human answers the decision.invalid_transition: readdetail.fromRoleanddetail.allowed; the trigger is not valid from that role.
Step 4 - Repeat or finish
If expectedNotes lists unfilled required notes, go back to Step 2. If newRole is terminal the item is complete. Otherwise keep working and fill notes as progress is made.
Phase-specific guidance
| Phase | Typical purpose | Filled | |
|---|---|---|---|
| queue | requirements, design, reproduction steps | during planning, before work | |
| work | implementation notes, test results | during or after implementation | |
| review | verdicts, deploy or verification notes | after implementation |
Keys vary per schema; take them from schema[], never from assumption.
Orchestrator and subagent responsibility
Protocol injection is agent-type gated. The subagent-start hook injects the Agent-Owned-Phase Protocol only when the dispatched agent_type resolves to implementer or reviewer (bare or plugin-qualified, for example task-orchestrator:implementer). Any other agent type gets no injected protocol: dispatch the phase owner as task-orchestrator:implementer or task-orchestrator:reviewer, or paste the protocol text into the prompt. The hook is also silent for a headless ralph iteration (TASK_ORCHESTRATOR_MODE=headless-iteration).
Orchestrator:
- fills queue notes during planning and dispatches with the item id;
- reads the profile for the phase being dispatched INTO: the
dispatchof theadvanceresult once the transition is made, oritems_readschema(dispatch,dispatchBySeat) when the agent will enter the phase itself;items_readcontextreturns only the current role's profile. Passsubagent_type = dispatch.agentwhen set, and always passmodelexplicitly; - after agents return, advances with
startand checksnewRole:reviewmeans dispatch reviewers or review inline,terminalmeans a schema without review notes; - performs the review-to-terminal transition after the verdict.
Implementer (entry seat): the seat the schema marks enters calls start once to enter work, fills work notes with the loop above, returns, and never calls advance again.
Reviewer and other non-entry seats: a reviewer is dispatched into an item already in review. It must NOT call start (from review that lands terminal). It reads items_read context, fills the review notes, reports the verdict and returns. Test authors, extractors and read-only seats never call advance.
Invariant: only an entry seat moves its item, and only into its own phase; the orchestrator owns every other transition.
Item in an open run. On a member of an open or paused run whose schema declares seats, the orchestrator's advance, notes_write and items_write carry the run's coordinator token as top-level seatToken. With it only orchestrator-seat note keys are writable; other seat-owned keys answer note_owned_by_other. See current/docs/config-reference.md ("Seat transitions"). Find the membership by listing the root's runs, then reading each run's frontier (a non-terminal member is in ready, inFlight or waiting):
Repeat the list with status: "paused"; one status per call.
Pre-dispatch recipe: a seat at a parent
Before dispatching a seat (a feature reviewer, a closing step) at a parent, read the parent and branch on its role:
| Parent role | Action | |
|---|---|---|
| queue | run the parent's own check; start it when canAdvance | |
work, canAdvance true | start to move it to review, then dispatch | |
work, canAdvance false | fill the orchestrator-owned missing notes; surface the seat-owned ones (missingBySeat) to their seats | |
| review | dispatch | |
| no review phase in its schema | never start: it lands terminal. Decide whether the parent needs a seat at all |
Never dispatch a reviewer at a work-role parent. Note that the terminal cascade from the last child into a review-role parent is suppressed (cascades[] shows applied: false, review-pending), so a review parent needs an explicit complete, or its review and then start.
Creating a schema item
Set type to a declared schema key (config effective types; a wrong one fails schema_violation with data.results[0].error.detail.availableTypes):
The answer is {ok, id, version}; read items_read schema for the notes and start filling queue notes, then follow the loop. See /create-item for anchoring.
Error recovery
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingclaude-plugins/task-orchestrator/skills/schema-workflow/SKILL.md
Popularity
- Repository stars
- 211
- Repository forks
- 25
- 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/schema-workflow)