Workflow Plan Review
Router Required Reading
Do not read ts-plan or ts-review in the router. Pass those skill names
verbatim to the dispatched judges.
Role
Workflow Plan Review is a router.
It runs a fixed sequence:
(judge-plan -> judge-review){1,n}
It dispatches judge passes to subagents, reads status and finding dispositions,
and routes the next pass. It never plans, reviews, edits artifacts, or changes
the plan content itself.
The router's only write target is the work log. Any artifact change belongs
to a dispatched judge.
Use this when the user asks for an implementation plan and wants a review loop.
This skill does not implement code. The plan is the primary artifact.
Artifact Contract
- This workflow has one primary artifact: the plan.
- Pass 1 creates the plan and records one
plan link in ## Artifacts.
- Later planning passes rewrite the same plan file.
- Do not create
revised, v2, or replacement plan files for review findings.
## Artifacts must contain exactly one plan link. Remove competing plan
links before returning.
- Review artifacts and the work log are supporting artifacts.
Sub-Agent Selection
Use this section when this skill dispatches sub-agent judges.
- Choose the first available entry for the judge role.
- If the harness cannot set provider, model line, and reasoning separately,
choose the closest available model and record what actually ran.
- Do not dispatch extra judges just to use every entry.
Planning Judge
| Priority |
Provider |
Model line |
Reasoning |
| 1 |
OpenAI |
astra latest |
high |
| 2 |
Anthropic |
fable latest |
high |
| 3 |
OpenAI |
sol latest |
high |
| 4 |
Anthropic |
opus latest |
high |
| 5 |
Cursor |
composer |
high |
Review Judge
| Priority |
Provider |
Model line |
Reasoning |
| 1 |
OpenAI |
astra latest |
high |
| 2 |
Anthropic |
fable latest |
high |
| 3 |
OpenAI |
sol latest |
high |
| 4 |
Anthropic |
opus latest |
high |
| 5 |
Cursor |
composer |
high |
Workflow
- CREATE_LOG
- DISPATCH_PLAN
- DISPATCH_REVIEW
- ROUTE_NEXT_PASS
- HANDLE_DEVELOPER_FEEDBACK
CREATE_LOG
- Use the
ts-log skill to create the shared work log.
- Record the user request as
Source request:. Link a design artifact when one
exists, or copy the request inline.
- In this workflow, the router owns log creation and routing state. Each
judge pass owns its own log entry, artifact links, findings, worker dispatch
count, types, providers, model lines, reasoning levels, and handoff.
- The router must record the exact selected provider, model line, and reasoning
level for each dispatched judge in the work log.
- When composing a judge prompt, replace
<provider>, <model-line>, and
<reasoning> with the actual selected values.
- Always pass the same log path to every judge pass.
- Use the owning skill's artifact directory for each pass: plans in
docs/plans/, reviews in docs/reviews/, work logs in docs/work-logs/.
- Sub-agents must start with fresh context. Never fork parent history. Use a
self-contained prompt: cwd, log path, source request, relevant artifacts, and
output contract.
- Always close sub-agents once they return. After each pass returns its status
line, kill the spawned sub-agent before routing the next pass; do not let them
stick around.
DISPATCH_PLAN
- Dispatch a planning judge from the
Planning Judge list.
- Prompt:
You are the planning judge. Use `skill: ts-plan`.
Work log path: <path>.
Dispatched judge: provider <provider>, model line <model-line>, reasoning <reasoning>.
Task input:
- On pass 1: produce the plan for the linked source request from the log.
- If the log contains developer feedback, use it as input to rewrite the affected
plan sections.
- On later passes: read the canonical `plan` artifact linked in `## Artifacts`,
use open blocking findings and the latest review handoff as inputs, and
rewrite that same file so the affected plan sections are correct.
- On later passes, make the smallest revision that resolves each blocker.
Treat suggested fixes as advice.
- Escalate before adding a product goal or making a decision reserved for the
user.
- On later passes, return `STATUS: BLOCKED: missing canonical plan artifact` if
the log has no valid `plan` link.
- Preserve review-owned direct writing edits recorded in the log unless an open
finding explicitly requires changing them.
Artifact destinations:
- Pass 1 plan artifact: `docs/plans/YYYY-MM-DD_HH:MM_<plan-name>.md`.
- Later pass plan artifact: the existing `plan` path linked in `## Artifacts`.
- Work log: `<path>`.
- Record exactly one canonical `plan` link in `## Artifacts`.
Before returning, you must:
- Write the plan artifact using the `ts-plan` artifact rules.
- For revisions, write back to the canonical `plan` path. Do not add a second
plan link.
- Write or update the work log at `<path>`.
- Keep the work log as coordination state with links, finding dispositions,
pass status, and handoff.
- Record the dispatched judge and every worker as provider, model line, and
reasoning level in the work log.
- Record worker dispatches as `<count> (<type>: <provider>/<model-line>/<reasoning>, ...)`, e.g.
`2 (api-contract: openai/terra latest/medium, test-inventory: anthropic/sonnet latest/medium)`.
Return exactly one status line:
STATUS: DONE
STATUS: BLOCKED: <reason>
STATUS: ESCALATE: <reason>
DISPATCH_REVIEW
- Dispatch a review judge from the
Review Judge list.
- Prompt:
You are the review judge. Use `skill: ts-review`.
Work log path: <path>.
Dispatched judge: provider <provider>, model line <model-line>, reasoning <reasoning>.
Review the canonical `plan` artifact linked in `## Artifacts`
against the source request. Score the plan only; there is no implementation diff
in this workflow. Return
`STATUS: BLOCKED: missing valid plan artifact link` until that target exists.
The source request, named design, and recorded user decisions define the review
contract. Principles do not add product goals. The first formal review is
`initial`; later reviews are `follow-up`.
For a new inspection, run all review types from `skill: ts-review`.
When dispatched to resolve pending review questions, resume adjudication
from the existing artifact. Preserve mode, finding IDs, and admission; inspect
only missing or changed evidence.
Workers do not know the mode or prior rulings. Classify their findings:
- `regular`: found initially or introduced by an identified later revision
- `out-of-scope`: no basis in the review contract or plan revision
- `carried`: the same open finding remains unresolved
- `regression`: the same resolved finding has recurred
- `late`: first reported in a follow-up without a later revision that caused it
`carried` and `regression` require the prior ID and the same requirement and
impact. A broader defect gets its own class. New follow-up findings default to
`late`; use `regular` only when evidence names the later revision that caused
it. Record `**Admission:**` and `**Scope Basis:**` with the requirement,
decision, finding ID, or plan revision.
Technical-writing review may edit the canonical plan artifact when `ts-review`
allows a direct writing edit. Keep the same canonical plan link.
Rule on every finding before assigning work. Keep rejected, resolved, and
duplicate findings in the review artifact without remediation tasks.
For deferred rulings, record the finding IDs and exact questions in the log and
return `STATUS: ESCALATE: review context needed` for the router to relay.
Apply these dispositions only to upheld findings, using final severity:
- Critical and high `regular`, `carried`, and `regression`: `fix now`.
- Critical and high `late`: `fix now` only when the plan would otherwise
violate the request, contradict itself, or leave required work undecided.
- Other `late`, low, or `out-of-scope`: executable `follow-up`.
- A new product goal or user decision: `STATUS: ESCALATE`.
This is a formal workflow review, not an informal review. You must write a
separate review artifact, even when there are no findings.
Keep upheld and deferred findings in `## Open Findings`, with ruling, reasoning,
final severity, admission, scope basis, disposition, and next action. Remove
closed entries from that section; retain every finding in the review artifact.
Review status semantics:
- `STATUS: DONE`: review completed with no blocking findings or deferred rulings.
- `STATUS: BLOCKED`: review completed with blocking findings for the next planning pass.
- `STATUS: ESCALATE`: a human decision or exception is needed.
Before returning, you must:
- Write the review artifact using the `ts-review` artifact rules.
- Write or update the work log at `<path>`.
- Use these artifact destinations:
- Review artifact: `docs/reviews/YYYY-MM-DD_HH:MM_<review-type>_<review-name>.md`.
- Work log: `<path>`.
- Record the review artifact link in `## Artifacts`.
- Keep the work log as coordination state with links, finding dispositions,
pass status, worker metadata, and handoff.
- If direct edits were made, record changed paths and purpose in the review
artifact and work log handoff.
- Record the dispatched judge and every worker as provider, model line, and
reasoning level in the work log.
- Record worker dispatches as `<count> (<type>: <provider>/<model-line>/<reasoning>, ...)`, e.g.
`2 (automatic-testing: anthropic/fable latest/high, robustness: openai/astra latest/high)`.
Return exactly one status line:
STATUS: DONE
STATUS: BLOCKED: <reason>
STATUS: ESCALATE: <reason>
ROUTE_NEXT_PASS
- Read
## Open Findings and ## Current State from the log before deciding.
- Count each completed review round once in
## Current State. A review paused
for context and its resumed adjudication belong to the same round.
- If subagent dispatch fails (tool error, no return), stop with
STATUS: BLOCKED: subagents unavailable.
- If a dispatched judge returns no status line or more than one, stop with
STATUS: BLOCKED: invalid handoff.
- If planning returns
BLOCKED or ESCALATE, stop and report.
- If review returns
ESCALATE, relay its recorded questions or decision to the
user. Leave the next handoff in ## Current State; stop until answered.
- If review returns
BLOCKED, route from ## Open Findings.
- Treat any
fix now finding as blocking. Use the review judge's disposition;
do not reclassify findings in the router.
- If review has no blocking findings or deferred rulings, stop with
STATUS: DONE.
- If review has blocking findings and the round limit is not reached, dispatch
planning again with the same log path and canonical plan path.
- If developer feedback arrives after any router report, handle it through
HANDLE_DEVELOPER_FEEDBACK.
- Default round limit is 5 unless the user sets another. One round is one
planning pass followed by one review pass.
- If the round limit is reached with open blocking findings, stop with
STATUS: BLOCKED: review loop limit reached.
HANDLE_DEVELOPER_FEEDBACK
- Record user feedback verbatim in
## Timeline and its next handoff in
## Current State, including feedback after STATUS: DONE.
- Route answers to pending review questions back to a fresh review judge with
the same log and review artifact. Resume adjudication in the same round;
the judge records reusable context and updates the rulings.
- Route plan change requests to planning as a new round, then review. Pass the
same log and canonical plan paths and any accompanying context answers.
- Before dispatch, update only the work log. Never edit the plan.
Stop Conditions
STATUS: DONE: latest review pass completed with no blocking findings or
deferred rulings in ## Open Findings.
STATUS: BLOCKED: <reason>: required input, dependency, or verification is
unavailable. Includes subagents unavailable, invalid handoff, and
review loop limit reached.
STATUS: ESCALATE: <reason>: a human decision is needed.
1---2name: ts-workflow-plan-review3description: Run a plan-review loop. Only explicitly triggered by user.4---56# Workflow Plan Review78## Router Required Reading910- skill: ts-log1112Do not read `ts-plan` or `ts-review` in the router. Pass those skill names13verbatim to the dispatched judges.1415## Role1617Workflow Plan Review is a router.1819It runs a fixed sequence:2021`(judge-plan -> judge-review){1,n}`2223It dispatches judge passes to subagents, reads status and finding dispositions,24and routes the next pass. It never plans, reviews, edits artifacts, or changes25the plan content itself.2627The router's only write target is the work log. Any artifact change belongs28to a dispatched judge.2930Use this when the user asks for an implementation plan and wants a review loop.31This skill does not implement code. The plan is the primary artifact.3233## Artifact Contract3435- This workflow has one primary artifact: the plan.36- Pass 1 creates the plan and records one `plan` link in `## Artifacts`.37- Later planning passes rewrite the same plan file.38- Do not create `revised`, `v2`, or replacement plan files for review findings.39- `## Artifacts` must contain exactly one `plan` link. Remove competing plan40 links before returning.41- Review artifacts and the work log are supporting artifacts.4243## Sub-Agent Selection4445Use this section when this skill dispatches sub-agent judges.4647- Choose the first available entry for the judge role.48- If the harness cannot set provider, model line, and reasoning separately,49 choose the closest available model and record what actually ran.50- Do not dispatch extra judges just to use every entry.5152### Planning Judge5354| Priority | Provider | Model line | Reasoning |55| --- | --- | --- | --- |56| 1 | OpenAI | `astra` latest | `high` |57| 2 | Anthropic | `fable` latest | `high` |58| 3 | OpenAI | `sol` latest | `high` |59| 4 | Anthropic | `opus` latest | `high` |60| 5 | Cursor | `composer` | `high` |6162### Review Judge6364| Priority | Provider | Model line | Reasoning |65| --- | --- | --- | --- |66| 1 | OpenAI | `astra` latest | `high` |67| 2 | Anthropic | `fable` latest | `high` |68| 3 | OpenAI | `sol` latest | `high` |69| 4 | Anthropic | `opus` latest | `high` |70| 5 | Cursor | `composer` | `high` |7172## Workflow73741. CREATE_LOG752. DISPATCH_PLAN763. DISPATCH_REVIEW774. ROUTE_NEXT_PASS785. HANDLE_DEVELOPER_FEEDBACK7980### CREATE_LOG8182- Use the `ts-log` skill to create the shared work log.83- Record the user request as `Source request:`. Link a design artifact when one84 exists, or copy the request inline.85- In this workflow, the router owns log creation and routing state. Each86 judge pass owns its own log entry, artifact links, findings, worker dispatch87 count, types, providers, model lines, reasoning levels, and handoff.88- The router must record the exact selected provider, model line, and reasoning89 level for each dispatched judge in the work log.90- When composing a judge prompt, replace `<provider>`, `<model-line>`, and91 `<reasoning>` with the actual selected values.92- Always pass the same log path to every judge pass.93- Use the owning skill's artifact directory for each pass: plans in94 `docs/plans/`, reviews in `docs/reviews/`, work logs in `docs/work-logs/`.95- Sub-agents must start with fresh context. Never fork parent history. Use a96 self-contained prompt: cwd, log path, source request, relevant artifacts, and97 output contract.98- Always close sub-agents once they return. After each pass returns its status99 line, kill the spawned sub-agent before routing the next pass; do not let them100 stick around.101102### DISPATCH_PLAN103104- Dispatch a planning judge from the `Planning Judge` list.105- Prompt:106107```text108You are the planning judge. Use `skill: ts-plan`.109110Work log path: <path>.111Dispatched judge: provider <provider>, model line <model-line>, reasoning <reasoning>.112113Task input:114- On pass 1: produce the plan for the linked source request from the log.115- If the log contains developer feedback, use it as input to rewrite the affected116 plan sections.117- On later passes: read the canonical `plan` artifact linked in `## Artifacts`,118 use open blocking findings and the latest review handoff as inputs, and119 rewrite that same file so the affected plan sections are correct.120- On later passes, make the smallest revision that resolves each blocker.121 Treat suggested fixes as advice.122- Escalate before adding a product goal or making a decision reserved for the123 user.124- On later passes, return `STATUS: BLOCKED: missing canonical plan artifact` if125 the log has no valid `plan` link.126- Preserve review-owned direct writing edits recorded in the log unless an open127 finding explicitly requires changing them.128129Artifact destinations:130- Pass 1 plan artifact: `docs/plans/YYYY-MM-DD_HH:MM_<plan-name>.md`.131- Later pass plan artifact: the existing `plan` path linked in `## Artifacts`.132- Work log: `<path>`.133- Record exactly one canonical `plan` link in `## Artifacts`.134135Before returning, you must:136- Write the plan artifact using the `ts-plan` artifact rules.137- For revisions, write back to the canonical `plan` path. Do not add a second138 plan link.139- Write or update the work log at `<path>`.140- Keep the work log as coordination state with links, finding dispositions,141 pass status, and handoff.142- Record the dispatched judge and every worker as provider, model line, and143 reasoning level in the work log.144- Record worker dispatches as `<count> (<type>: <provider>/<model-line>/<reasoning>, ...)`, e.g.145 `2 (api-contract: openai/terra latest/medium, test-inventory: anthropic/sonnet latest/medium)`.146147Return exactly one status line:148STATUS: DONE149STATUS: BLOCKED: <reason>150STATUS: ESCALATE: <reason>151```152153### DISPATCH_REVIEW154155- Dispatch a review judge from the `Review Judge` list.156- Prompt:157158```text159You are the review judge. Use `skill: ts-review`.160161Work log path: <path>.162Dispatched judge: provider <provider>, model line <model-line>, reasoning <reasoning>.163164Review the canonical `plan` artifact linked in `## Artifacts`165against the source request. Score the plan only; there is no implementation diff166in this workflow. Return167`STATUS: BLOCKED: missing valid plan artifact link` until that target exists.168The source request, named design, and recorded user decisions define the review169contract. Principles do not add product goals. The first formal review is170`initial`; later reviews are `follow-up`.171172For a new inspection, run all review types from `skill: ts-review`.173When dispatched to resolve pending review questions, resume adjudication174from the existing artifact. Preserve mode, finding IDs, and admission; inspect175only missing or changed evidence.176Workers do not know the mode or prior rulings. Classify their findings:177- `regular`: found initially or introduced by an identified later revision178- `out-of-scope`: no basis in the review contract or plan revision179- `carried`: the same open finding remains unresolved180- `regression`: the same resolved finding has recurred181- `late`: first reported in a follow-up without a later revision that caused it182183`carried` and `regression` require the prior ID and the same requirement and184impact. A broader defect gets its own class. New follow-up findings default to185`late`; use `regular` only when evidence names the later revision that caused186it. Record `**Admission:**` and `**Scope Basis:**` with the requirement,187decision, finding ID, or plan revision.188Technical-writing review may edit the canonical plan artifact when `ts-review`189allows a direct writing edit. Keep the same canonical plan link.190191Rule on every finding before assigning work. Keep rejected, resolved, and192duplicate findings in the review artifact without remediation tasks.193For deferred rulings, record the finding IDs and exact questions in the log and194return `STATUS: ESCALATE: review context needed` for the router to relay.195Apply these dispositions only to upheld findings, using final severity:196- Critical and high `regular`, `carried`, and `regression`: `fix now`.197- Critical and high `late`: `fix now` only when the plan would otherwise198 violate the request, contradict itself, or leave required work undecided.199- Other `late`, low, or `out-of-scope`: executable `follow-up`.200- A new product goal or user decision: `STATUS: ESCALATE`.201202This is a formal workflow review, not an informal review. You must write a203separate review artifact, even when there are no findings.204Keep upheld and deferred findings in `## Open Findings`, with ruling, reasoning,205final severity, admission, scope basis, disposition, and next action. Remove206closed entries from that section; retain every finding in the review artifact.207208Review status semantics:209- `STATUS: DONE`: review completed with no blocking findings or deferred rulings.210- `STATUS: BLOCKED`: review completed with blocking findings for the next planning pass.211- `STATUS: ESCALATE`: a human decision or exception is needed.212213Before returning, you must:214- Write the review artifact using the `ts-review` artifact rules.215- Write or update the work log at `<path>`.216- Use these artifact destinations:217 - Review artifact: `docs/reviews/YYYY-MM-DD_HH:MM_<review-type>_<review-name>.md`.218 - Work log: `<path>`.219- Record the review artifact link in `## Artifacts`.220- Keep the work log as coordination state with links, finding dispositions,221 pass status, worker metadata, and handoff.222- If direct edits were made, record changed paths and purpose in the review223 artifact and work log handoff.224- Record the dispatched judge and every worker as provider, model line, and225 reasoning level in the work log.226- Record worker dispatches as `<count> (<type>: <provider>/<model-line>/<reasoning>, ...)`, e.g.227 `2 (automatic-testing: anthropic/fable latest/high, robustness: openai/astra latest/high)`.228229Return exactly one status line:230STATUS: DONE231STATUS: BLOCKED: <reason>232STATUS: ESCALATE: <reason>233```234235### ROUTE_NEXT_PASS236237- Read `## Open Findings` and `## Current State` from the log before deciding.238- Count each completed review round once in `## Current State`. A review paused239 for context and its resumed adjudication belong to the same round.240- If subagent dispatch fails (tool error, no return), stop with `STATUS: BLOCKED: subagents unavailable`.241- If a dispatched judge returns no status line or more than one, stop with `STATUS: BLOCKED: invalid handoff`.242- If planning returns `BLOCKED` or `ESCALATE`, stop and report.243- If review returns `ESCALATE`, relay its recorded questions or decision to the244 user. Leave the next handoff in `## Current State`; stop until answered.245- If review returns `BLOCKED`, route from `## Open Findings`.246- Treat any `fix now` finding as blocking. Use the review judge's disposition;247 do not reclassify findings in the router.248- If review has no blocking findings or deferred rulings, stop with `STATUS: DONE`.249- If review has blocking findings and the round limit is not reached, dispatch250 planning again with the same log path and canonical plan path.251- If developer feedback arrives after any router report, handle it through252 `HANDLE_DEVELOPER_FEEDBACK`.253- Default round limit is 5 unless the user sets another. One round is one254 planning pass followed by one review pass.255- If the round limit is reached with open blocking findings, stop with256 `STATUS: BLOCKED: review loop limit reached`.257258### HANDLE_DEVELOPER_FEEDBACK259260- Record user feedback verbatim in `## Timeline` and its next handoff in261 `## Current State`, including feedback after `STATUS: DONE`.262- Route answers to pending review questions back to a fresh review judge with263 the same log and review artifact. Resume adjudication in the same round;264 the judge records reusable context and updates the rulings.265- Route plan change requests to planning as a new round, then review. Pass the266 same log and canonical plan paths and any accompanying context answers.267- Before dispatch, update only the work log. Never edit the plan.268269## Stop Conditions270271- `STATUS: DONE`: latest review pass completed with no blocking findings or272 deferred rulings in `## Open Findings`.273- `STATUS: BLOCKED: <reason>`: required input, dependency, or verification is274 unavailable. Includes `subagents unavailable`, `invalid handoff`, and275 `review loop limit reached`.276- `STATUS: ESCALATE: <reason>`: a human decision is needed.