Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Turns an approved PRD into a technical spec — the HOW of one change to a capability. Use after a change has been scoped and its PRD approved, to decompose it into building blocks and route each to its governing rule file. Refuses to run without an approved PRD. Cites rule-file paths; never restates rule content.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 1% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -12% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -8% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -35% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 120% | 0% |
change-spec produces a spec — the HOW of one change: the building blocks it introduces, restructures, or removes, each routed to its governing rule file, plus the decision records that constrain it. It consumes an approved PRD as input and never re-derives the product why. It is a router: it points at the rule files in laravel-rules / inertia-rules, it never copies what those rules say. The spec it produces, once human-approved, is the input to spec-breakdown.
Generic skill — hard-codes no path. Resolve the state-tree root from the project's CLAUDE.md (project-declared paths, DESIGN_PRODUCT_PIPELINE.md §2); default docs/, and say which you used. {capabilities-root} means {declared-root}/capabilities (default docs/capabilities).
Before producing a spec you MUST, in order:
prd.md.It is usable ONLY if its frontmatter has status: approved with approved_by and approved_on populated. If it is draft, unapproved, or the approval was invalidated by a later edit — STOP. Tell the user the PRD needs (re-)approval via change-scope first. You may not spec an unapproved PRD.
it does not reinterpret or expand it. If the PRD's product intent looks wrong, STOP — that is a change-scope problem, not something to fix here.
(see "Routing to the rules skills").
Hard rules:
summarize, or paraphrase what a rule says into the spec.
Provenance (see below). No inference may be load-bearing.
For every building block in the spec, name its governing rule file by looking it up in the relevant skill's Routing Table:
laravel-rules Routing Table;resources/js → the inertia-rules Routing Table.Cite the rule file by PATH (e.g. rules/data-objects/conventions.md). Do not invent paths — use the Routing Table. You may open a rule file to confirm a building block is being specced correctly, but you MUST NOT copy its content into the spec. The spec tells the implementer WHICH rule file governs each block; the implementer opens it at the code STOP gate. A spec that paraphrases a rule has rebuilt the cheat-sheet the rules skills exist to prevent.
Write the spec to {capabilities-root}/{capability-slug}/changes/{NNNN}-{slug}/spec.md.
Frontmatter:
---
change: {NNNN}-{slug}
capability: {capability-slug}
why-link: changes/{NNNN}-{slug}/prd.md
status: draft
approved_by:
approved_on:
---The why-link cites the PRD by change SLUG path, never a bare number.
Body — every section required; sections collapse for a small change, never absent:
name · type · change · rule file · decision records · deviation where change is new / restructured / removed, rule file is the path from the rules-skill Routing Table, decision records is the constraining record IDs or none, and deviation names any rule this block deliberately departs from, with justification, or none.
precedence applied.
inference, and anyunresolved technical question. Nothing load-bearing left silent.
governed (see Precedence).
contradicts or invalidates, flagged for a human ruling.
The spec contains no product re-litigation. It contains no rule content — only rule-file paths.
A project's documented decisions outrank the rules skills. Read them if the project keeps them — change-spec never requires them and never hard-codes their location; the project's CLAUDE.md declares which exist (commonly docs/adr/, docs/postmortem/, docs/learnings/). Read the document body, never the title or a commit message.
Three moves, all recorded in the spec:
building-blocks table and in "Decision records consulted".
a stub in "Proposed decision records". change-spec proposes; a human decides. This is the only thing change-spec may suggest writing to a decision-record folder.
"Superseded decision records" for a human ruling. change-spec never silently overrides a decision record.
Every claim in the spec about how the project does something is labelled:
project;
No inference may be load-bearing in the spec. Every inference appears in "Inferences & open questions". When implementation begins, each inference must be resolved against the rule file or decision record before the building-block code is written.
A change may need more than one spec — e.g. a domain spec and an HTTP/Inertia spec, delivered as separate tasks. Splitting is a judgment you own: split when the parts have distinct building blocks, distinct rule skills, or a clean dependency boundary (one unblocks the other). When you split, each spec file is spec-{n}-{slug}.md in the change folder, each carries its own frontmatter and approval, and each cites the same PRD. Do not split a small change for the sake of it; do not cram a genuinely two-layered change into one spec.
A spec is approved only by an explicit human act — the same rule as a PRD. You cannot approve it; a sub-agent cannot; vague assent does not count.
blocks, the change types, the deviations, and especially any superseded decision records. Explicitly invite rejection or revision.
status: approved, approved_by,approved_on into the spec frontmatter.
draft, clear the fields, seek fresh approval.
spec-breakdown (stage 5) consumes a spec only if it is status: approved with current approval fields.
Other measured skills in the registry, with their headline benchmark lift.