Spec: the contract everything else cites
The point is a document later work can be checked against: /blueprint cross-validates
its plan with it, /e2e-test derives cases from its criteria, /revise uses it as the
scope fence. That only works if the spec is product-level, testable, and stably
addressable — which is what this skill enforces. /spec says what and why; how belongs
to /blueprint.
Principles
- WHAT and WHY, never HOW. Everything is stated in user-observable terms. Litmus:
two different implementations should both be able to satisfy the spec. Technical
constraints appear only when they are genuine product constraints (compliance,
platform), not design preferences.
- Testable or it isn't a criterion. Each acceptance criterion is a concrete scenario
with an observable outcome — something an end-to-end test could execute black-box.
"The feature should be fast/intuitive/robust" is a goal at best, never a criterion.
- Stable IDs, append-only. Criteria carry IDs that later skills cite; IDs are never
renumbered or reused, and deletions leave holes. See
references/format.md.
- Never invent answers. Unknowns become marked assumptions or open questions;
blocking questions go to the user, batched, once.
- Non-goals are load-bearing. What the feature deliberately does not do is the fence
against scope creep in every later skill — write them as deliberately as the goals.
Workflow
- Orient. Find the repo's existing spec convention — a specs directory, its index,
its ID scheme — and read the specs adjacent to this feature. The repo's convention
wins; only where there is none, use the default in
references/format.md — read it
now. Decide create vs amend: a feature that already has a spec gets an amendment,
not a rival document.
- Extract. From the request and the repo: the users involved, the pain being solved,
current behavior being changed, adjacent specs and invariants touched. Distill
candidate goals and constraints; inventory the unknowns.
- Ask what blocks the shape. Split the unknowns: answers that change the spec's
structure (who it serves, where its boundary sits, what success is) are asked as one
batched round of questions — then wait. Everything else proceeds as a marked
assumption or an open question in the draft. Zero silent inventions.
- Draft per the format: overview and goals, non-goals, user-observable behavior,
acceptance criteria as ordered testable steps with IDs — happy path, edges, and error
behavior all as criteria — invariants (feature-local in the file; a cross-cutting one
proposed for the global invariants doc, flagged), and open questions last. When
amending: new criteria take fresh IDs, removed ones leave holes, and the diff should
read as "what changed about the product's contract".
- Cross-check. Every goal is covered by at least one criterion; every criterion is
black-box testable; nothing contradicts an existing spec or invariant — a conflict is
surfaced to the user, never silently overridden in either direction; non-goals don't
contradict the goals.
- Present and gate. Deliver the spec with its open questions surfaced; a spec is a
contract, so the user signs off before anything downstream builds on it. Committing
and PR-ing it is
/submit's job, on request.
Definition of done
Related skills
/blueprint plans against the spec · /e2e-test tests from its criteria · /revise
uses it as the scope fence · /repo-docs sets up the docs layout specs live in.
1---2name: spec3description: Turn a fuzzy feature request into a reviewable product spec — goals, non-goals, testable acceptance criteria with stable IDs, invariants — that later skills cite by path and ID. Use when the user says "/spec", "spec this out", "write a product spec", "turn this idea into requirements", or brings a feature request that needs a contract before planning or building.4---56# Spec: the contract everything else cites78The point is a document later work can be *checked against*: `/blueprint` cross-validates9its plan with it, `/e2e-test` derives cases from its criteria, `/revise` uses it as the10scope fence. That only works if the spec is product-level, testable, and stably11addressable — which is what this skill enforces. `/spec` says what and why; how belongs12to `/blueprint`.1314## Principles1516- **WHAT and WHY, never HOW.** Everything is stated in user-observable terms. Litmus:17 two different implementations should both be able to satisfy the spec. Technical18 constraints appear only when they are genuine product constraints (compliance,19 platform), not design preferences.20- **Testable or it isn't a criterion.** Each acceptance criterion is a concrete scenario21 with an observable outcome — something an end-to-end test could execute black-box.22 "The feature should be fast/intuitive/robust" is a goal at best, never a criterion.23- **Stable IDs, append-only.** Criteria carry IDs that later skills cite; IDs are never24 renumbered or reused, and deletions leave holes. See `references/format.md`.25- **Never invent answers.** Unknowns become marked assumptions or open questions;26 blocking questions go to the user, batched, once.27- **Non-goals are load-bearing.** What the feature deliberately does not do is the fence28 against scope creep in every later skill — write them as deliberately as the goals.2930## Workflow31321. **Orient.** Find the repo's existing spec convention — a specs directory, its index,33 its ID scheme — and read the specs adjacent to this feature. The repo's convention34 wins; only where there is none, use the default in **`references/format.md` — read it35 now.** Decide create vs amend: a feature that already has a spec gets an amendment,36 not a rival document.372. **Extract.** From the request and the repo: the users involved, the pain being solved,38 current behavior being changed, adjacent specs and invariants touched. Distill39 candidate goals and constraints; inventory the unknowns.403. **Ask what blocks the shape.** Split the unknowns: answers that change the spec's41 structure (who it serves, where its boundary sits, what success is) are asked as one42 batched round of questions — then wait. Everything else proceeds as a marked43 assumption or an open question in the draft. Zero silent inventions.444. **Draft** per the format: overview and goals, non-goals, user-observable behavior,45 acceptance criteria as ordered testable steps with IDs — happy path, edges, and error46 behavior all as criteria — invariants (feature-local in the file; a cross-cutting one47 proposed for the global invariants doc, flagged), and open questions last. When48 amending: new criteria take fresh IDs, removed ones leave holes, and the diff should49 read as "what changed about the product's contract".505. **Cross-check.** Every goal is covered by at least one criterion; every criterion is51 black-box testable; nothing contradicts an existing spec or invariant — a conflict is52 surfaced to the user, never silently overridden in either direction; non-goals don't53 contradict the goals.546. **Present and gate.** Deliver the spec with its open questions surfaced; a spec is a55 contract, so the user signs off before anything downstream builds on it. Committing56 and PR-ing it is `/submit`'s job, on request.5758## Definition of done5960- [ ] Repo convention honored, or the default format used and said so; create vs amend61 decided deliberately.62- [ ] Blocking questions asked once, batched; every remaining unknown is a marked63 assumption or open question — none invented.64- [ ] Every criterion has a stable ID, an ordered scenario, and an observable outcome;65 IDs append-only.66- [ ] Goals each covered by a criterion; edges and error behavior specified, not implied.67- [ ] No implementation content; non-goals present and real.68- [ ] No contradiction with existing specs/invariants, or the conflict is surfaced.69- [ ] User sign-off requested before downstream work cites the spec.7071## Related skills7273`/blueprint` plans against the spec · `/e2e-test` tests from its criteria · `/revise`74uses it as the scope fence · `/repo-docs` sets up the docs layout specs live in.