validate
An optional formal validator of .task/ artifact formats. It is not a slash command, not a gate, and no hook calls it. The skills run it narrowly — each capture validates the one file it just wrote (the result lands in its digest), and /task:roadmap-to-workflow sweeps all in its setup gate; anything wider is a manual self-check you run by hand.
Usage
bash "${CLAUDE_PLUGIN_ROOT}/skills/validate/validate.sh" [ all | task <slug> | roadmap <slug> | spec <slug> ]What it checks
task <slug> — .task/task/<slug>.md:
- line 1 is a
# <Title>; - a
---separator is present; ## Descriptionis present;## Planis optional — if present, it has ≥1### Step N:block;## Testsis optional — if present, it has ≥1### Test N:block;## Executionis present (presence only);- each
Spec:header's slug resolves to an existing spec — a miss is aWARN, not an error. The slug is read from the link text, soSpec: [<slug>](../spec/<slug>.md)and a bareSpec: <slug>check identically; - a
Spec:header whose link target isn't../spec/<slug>.mdis a secondWARN— the label and the target disagree, which is what a rename leaves behind.
roadmap <slug> — .task/roadmap/<slug>.md:
- ≥1 item heading
### - [ ] N. <title>— the checkbox prefix is required; - a heading that nearly matches is an error too —
[X]uppercase, a double space around the checkbox,####, or a bullet-plus-number with the checkbox deleted. Such a heading is invisible to the autopilot, so catching it here is what stops an item from silently dropping out of a run. It is reported even when every heading has drifted; - item numbers are unique;
**Dependencies:**on an unchecked item is a no-dependency token (—,-,none,n/a) or a comma-separated list of item numbers; each number must name an item in the same file, and an item may not list itself. A space-separated1 2is reported as such, rather than being read as item12;- the file uses LF line endings — with CRLF the driver keeps the trailing CR and loses
**Model:**hints; - each item carries
### Context/### Goal/### Outcomes/### Acceptance criteria(Invariants optional); - dangling
Spec:headersWARN.
spec <slug> — .task/spec/<slug>.md: line 1 is a # <Title>; ≥1 ## N. numbered section.
all — every task, roadmap, and spec file.
Errors vs warnings
- An
ERRORmarks a genuine structural problem worth fixing before you hand a file to an implementing session. - A
WARN(e.g. a danglingSpec:reference — the pipeline's one cross-file check) never blocks anything. - A missing
.task/CLAUDE.mdexits 2 — the one precondition failure that stops a run. The message names the path it looked at and points you at the four capture skills, each of which writes.task/CLAUDE.mdinline on first use.
Because it's advisory, nothing forces you to run it directly. One caveat: /task:roadmap-to-workflow runs validate.sh all in its own setup gate and refuses to start when an ERROR is reported against the roadmap you picked — so for that command a roadmap ERROR is effectively blocking, and fixing it is the way forward. Errors on any other artifact never stop it. Its whole purpose is to catch a hand-edit that drifted from the format. See Troubleshooting for reading the output.
Does not
- Run from a hook — none exists. Beyond each capture's own post-write check and
/task:roadmap-to-workflow's gate sweep, you call it by hand. - Fix or rewrite files — it reports, never edits.
- Gate committing — a FAIL blocks nothing; the implementing session commits regardless. (
/task:roadmap-to-workflowis the one command that does stop on a roadmapERROR, before it starts — see above.)