Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Creates specs before coding. Use when starting a new project, feature, or significant change and no specification exists yet. Use when requirements are unclear, ambiguous, or only exist as a vague idea.
.claude/skills/addyosmani-spec-driven-development/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -19% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 145% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 148% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 287% | 0% |
Write a structured specification before writing any code. The spec is the shared source of truth between you and the human engineer — it defines what we're building, why, and how we'll know it's done. Code without a spec is guessing.
When NOT to use: Single-line fixes, typo corrections, or changes where requirements are unambiguous and self-contained.
Spec-driven development has four phases, preceded by a scope check (Phase 0) that activates only when one request bundles several independently testable capabilities. Do not advance to the next phase until the current one is validated.
SPECIFY ──→ PLAN ──→ TASKS ──→ IMPLEMENT
│ │ │ │
▼ ▼ ▼ ▼
Human Human Human Human
reviews reviews reviews reviewsMost requests describe one capability. If this one does, skip this phase and go straight to Specify — Phase 0 exists for the exception, not the rule, and it puts no hierarchy on single-capability features.
Detection. Decompose before specifying when a single requirement bundles several independently testable capabilities:
Propose a capability map before writing any spec. Small and reviewable — a module table plus a build order, not a project plan:
markdown# Capability Map: [Initiative Name] | Module id | Responsibility | Depends on | |---|---|---| | identity | Accounts, sessions, SSO | — | | billing | Plans, invoices, payments | identity | | notifications | Email and webhook fan-out | identity | | reporting | Usage dashboards | billing, notifications | Build order: identity → billing, notifications → reporting
billing depends on identity; the contract between them belongs in the provider module's spec (see api-and-interface-design for designing it).The map is gated like every phase. The human reviews module boundaries, dependency direction, and build order before any module spec is written. Getting the map wrong is expensive; reviewing ten lines is not.
Then recurse per module. Run Specify → Plan → Tasks → Implement for each module in dependency order. Each module gets its own spec, scoped to that module's objective, boundaries, and success criteria. Save the approved map at the project root and each module's spec alongside it, named by module id (SPEC-identity.md, SPEC-billing.md) — the map, not filename guessing, is the index of what exists.
Start with a high-level vision. Ask the human clarifying questions until requirements are concrete.
Surface assumptions immediately. Before writing any spec content, list what you're assuming:
ASSUMPTIONS I'M MAKING:
1. This is a web application (not native mobile)
2. Authentication uses session-based cookies (not JWT)
3. The database is PostgreSQL (based on existing Prisma schema)
4. We're targeting modern browsers only (no IE11)
→ Correct me now or I'll proceed with these.Don't silently fill in ambiguous requirements. The spec's entire purpose is to surface misunderstandings before code gets written — assumptions are the most dangerous form of misunderstanding.
Write a spec document covering these six core areas:
Build: npm run build Test: npm test -- --coverage Lint: npm run lint --fix Dev: npm run dev
src/ → Application source code src/components → React components src/lib → Shared utilities tests/ → Unit and integration tests e2e/ → End-to-end tests docs/ → Documentation
Spec template:
markdown# Spec: [Project/Feature Name] ## Objective [What we're building and why. User stories or acceptance criteria.] ## Tech Stack [Framework, language, key dependencies with versions] ## Commands [Build, test, lint, dev — full commands] ## Project Structure [Directory layout with descriptions] ## Code Style [Example snippet + key conventions] ## Testing Strategy [Framework, test locations, coverage requirements, test levels] ## Boundaries - Always: [...] - Ask first: [...] - Never: [...] ## Success Criteria [How we'll know this is done — specific, testable conditions] ## Open Questions [Anything unresolved that needs human input]
External spec tools: This workflow is format-agnostic. If the project already uses OpenSpec or another specification system, keep that system's artifact format and storage conventions instead of creating a duplicate SPEC.md. This skill owns the clarification, content, and approval gates; the external tool owns how the approved spec is represented.
Reframe instructions as success criteria. When receiving vague requirements, translate them into concrete conditions:
REQUIREMENT: "Make the dashboard faster"
REFRAMED SUCCESS CRITERIA:
- Dashboard LCP < 2.5s on 4G connection
- Initial data load completes in < 500ms
- No layout shift during load (CLS < 0.1)
→ Are these the right targets?This lets you loop, retry, and problem-solve toward a clear goal rather than guessing what "faster" means.
With the validated spec, generate a technical implementation plan:
> Follow planning-and-task-breakdown for the dependency-graph mapping and vertical-slicing mechanics behind these steps; it is the canonical source. The bullets above are a lightweight summary; if they ever diverge, planning-and-task-breakdown takes precedence. > > Output convention: Save the plan to tasks/plan.md and record the task list in the task list target defined by planning-and-task-breakdown (default tasks/todo.md; projects may designate an external tracker instead). Create tasks/ if it does not exist. Downstream commands (/build, etc.) expect these defaults.
The plan should be reviewable: the human should be able to read it and say "yes, that's the right approach" or "no, change X."
Break the plan into discrete, implementable tasks:
> Follow planning-and-task-breakdown for the full task-sizing and dependency-ordering mechanics; it is the canonical source. The template below is a lightweight inline form; if they ever diverge, planning-and-task-breakdown takes precedence.
Task template:
markdown- [ ] Task: [Description] - Acceptance: [What must be true when done] - Verify: [How to confirm — test command, build, manual check] - Files: [Which files will be touched]
Execute tasks one at a time following skills/incremental-implementation/SKILL.md (incremental-implementation) and skills/test-driven-development/SKILL.md (test-driven-development). Use skills/context-engineering/SKILL.md (context-engineering) to load the right spec sections and source files at each step rather than flooding the agent with the entire spec.
The spec is a living document, not a one-time artifact:
| Rationalization | Reality | |---|---| | "This is simple, I don't need a spec" | Simple tasks don't need long specs, but they still need acceptance criteria. A two-line spec is fine. | | "I'll write the spec after I code it" | That's documentation, not specification. The spec's value is in forcing clarity before code. | | "The spec will slow us down" | A 15-minute spec prevents hours of rework. Waterfall in 15 minutes beats debugging in 15 hours. | | "Requirements will change anyway" | That's why the spec is a living document. An outdated spec is still better than no spec. | | "The user knows what they want" | Even clear requests have implicit assumptions. The spec surfaces those assumptions. | | "It's one big feature; splitting it is overhead" | If acceptance criteria cluster into independently testable groups, a monolithic spec forces every downstream task to reason over the whole contract. A ten-line capability map is the cheap alternative. | | "I'll decompose during planning" | Planning slices tasks within a spec. By then the oversized artifact already exists — module boundaries and dependency direction must be decided before the spec is written, not after. |
Before proceeding to implementation, confirm:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | pass→pass | 17,504 | 15,682 | -10% | 1 | 1 | 0% | 1,675 | 3,440 | +105% | 0 | 0 | — |
case-01 | fail→pass | 33,439 | 15,593 | -53% | 1 | 1 | 0% | 5,223 | 4,234 | -19% | 0 | 0 | — |
case-02 | fail→pass | 39,757 | 31,513 | -21% | 1 | 1 | 0% | 5,672 | 7,086 | +25% | 0 | 0 | — |
case-03 | fail→pass | 25,314 | 37,257 | +47% | 1 | 1 | 0% | 2,997 | 7,343 | +145% | 0 | 0 | — |
case-04 | fail→pass | 28,426 | 11,250 | -60% | 1 | 1 | 0% | 1,275 | 3,159 | +148% | 0 | 0 | — |
case-05 | fail→fail | 15,478 | 24,166 | +56% | 1 | 1 | 0% | 1,812 | 5,358 | +196% | 0 | 0 | — |
case-06 | fail→fail | 18,944 | 24,104 | +27% | 1 | 1 | 0% | 2,563 | 6,108 | +138% | 0 | 0 | — |
case-07 | pass→pass | 17,910 | 15,711 | -12% | 1 | 1 | 0% | 2,112 | 4,327 | +105% | 0 | 0 | — |
case-08 | fail→pass | 8,881 | 18,266 | +106% | 1 | 1 | 0% | 1,270 | 4,911 | +287% | 0 | 0 | — |
case-09 | fail→pass | 24,108 | 15,281 | -37% | 1 | 1 | 0% | 3,632 | 5,223 | +44% | 0 | 0 | — |
case-10 | fail→pass | 14,493 | 9,415 | -35% | 1 | 1 | 0% | 1,912 | 4,081 | +113% | 0 | 0 | — |
case-11 | fail→pass | 18,923 | 5,874 | -69% | 1 | 1 | 0% | 1,825 | 3,561 | +95% | 0 | 0 | — |
case-12 | fail→pass | 29,958 | 40,465 | +35% | 1 | 1 | 0% | 2,006 | 3,858 | +92% | 0 | 0 | — |
case-13 | fail→pass | 26,107 | 39,672 | +52% | 1 | 1 | 0% | 1,886 | 4,106 | +118% | 0 | 0 | — |
case-14 | pass→pass | 21,163 | 10,115 | -52% | 1 | 1 | 0% | 1,899 | 3,461 | +82% | 0 | 0 | — |
case-15 | fail→pass | 21,127 | 12,019 | -43% | 1 | 1 | 0% | 1,990 | 3,759 | +89% | 0 | 0 | — |
case-16 | fail→pass | 68,369 | 20,925 | -69% | 1 | 1 | 0% | 2,275 | 3,787 | +66% | 0 | 0 | — |
case-17 | fail→pass | 12,950 | 6,564 | -49% | 1 | 1 | 0% | 2,090 | 3,345 | +60% | 0 | 0 | — |
case-18 | fail→pass | 22,578 | 11,901 | -47% | 1 | 1 | 0% | 1,980 | 3,627 | +83% | 0 | 0 | — |
case-19 | pass→pass | 16,834 | 12,642 | -25% | 1 | 1 | 0% | 1,561 | 3,788 | +143% | 0 | 0 | — |
case-20 | fail→pass | 17,557 | 8,489 | -52% | 1 | 1 | 0% | 1,405 | 3,048 | +117% | 0 | 0 | — |
case-21 | pass→pass | 20,458 | 18,020 | -12% | 1 | 1 | 0% | 2,086 | 4,407 | +111% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +68 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/17/2026 | +59% |
| gemini-3.6-flash | verified | 8/7/2026 | +61% |
Other measured skills in the registry, with their headline benchmark lift.