From odin
Creates structured specifications before coding to clarify requirements, surface assumptions, and align on scope. Use when starting a new project, feature, or significant change with ambiguous or incomplete requirements.
How this skill is triggered — by the user, by Claude, or both
Slash command
/odin:spec-driven-developmentThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Write a structured specification before writing any code. The spec is the shared source of truth between you and the engineer who asked for the work: it fixes what is being built, why, and how completion will be judged. Code written without a spec is a guess.
Write a structured specification before writing any code. The spec is the shared source of truth between you and the engineer who asked for the work: it fixes what is being built, why, and how completion will be judged. Code written without a spec is a guess.
Single-line fixes, typo corrections, or changes whose requirements are unambiguous and self-contained.
Four phases. Do not advance to the next phase until the current one is validated by the human.
SPECIFY ──→ PLAN ──→ TASKS ──→ IMPLEMENT
│ │ │ │
▼ ▼ ▼ ▼
Human Human Human Human
reviews reviews reviews reviews
Start from a high-level vision. Ask clarifying questions until the requirements are concrete.
Surface assumptions first. Before writing any spec content, list what you are assuming and force a correction:
ASSUMPTIONS I'M MAKING:
1. Runtime target is a long-running service (not a CLI or batch job)
2. Auth uses signed session cookies (not bearer tokens)
3. Persistence is a relational store, inferred from the existing schema
4. Only current language/runtime versions are supported (no legacy targets)
→ Correct me now or I proceed with these.
Do not silently fill in ambiguous requirements. The spec exists to surface misunderstandings before code is written; an unstated assumption is the most dangerous form of misunderstanding.
Write a spec covering six core areas:
Objective — what is being built and why, who the user is, what success looks like.
Commands — full executable commands with flags, not bare tool names. Record them for the stack the project actually uses:
# Node / npm
Build: npm run build
Test: npm test -- --coverage
Lint: npm run lint --fix
Dev: npm run dev
# Rust / cargo
Build: cargo build --release
Test: cargo test
Lint: cargo clippy -- -D warnings
Run: cargo run
Project structure — where source lives, where tests go, where docs belong. The layout is stack-specific; capture the one that applies:
# TypeScript service
src/ application source
src/lib/ shared utilities
tests/ unit + integration tests
e2e/ end-to-end tests
docs/ documentation
# Python package
src/pkg/ package source
tests/ unit + integration tests
docs/ documentation
pyproject.toml build + dependency config
Code style — one real snippet of the project's style beats paragraphs describing it. Include naming conventions, formatting rules, and an example of accepted output in the project's language.
Testing strategy — which framework, where tests live, coverage expectations, and which test level covers which concern.
Boundaries — three tiers:
Spec template:
# Spec: [Project/Feature Name]
## Objective
[What is being built 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 completion is judged — specific, testable conditions]
## Open Questions
[Anything unresolved that needs human input]
Reframe instructions as success criteria. Translate vague requirements into measurable conditions, whatever the domain:
REQUIREMENT: "Make the dashboard faster"
REFRAMED:
- LCP < 2.5s on a 4G connection
- Initial data load completes in < 500ms
- No layout shift during load (CLS < 0.1)
REQUIREMENT: "The batch job is too slow"
REFRAMED:
- Processes 1M records in < 90s on the reference host
- Peak resident memory < 512 MB
- Exits non-zero on any partial failure
→ Are these the right targets?
Concrete targets let you loop, retry, and solve toward a defined goal instead of guessing what "faster" means.
From the validated spec, produce a technical implementation plan:
The plan must be reviewable: the human reads it and either approves the approach or names the part to change.
Break the plan into discrete, implementable tasks:
Task template:
- [ ] 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, test-first: turn each task's acceptance criteria into a failing test, then write the code that makes it pass. At each step, load only the spec sections and source files the current task needs; do not flood the working context with the entire spec. Verify each task against its acceptance criteria before starting the next.
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 is documentation, not specification. The spec's value is forcing clarity before code. |
| "The spec will slow us down" | A 15-minute spec prevents hours of rework. Fifteen minutes of waterfall beats fifteen hours of debugging. |
| "Requirements will change anyway" | That is why the spec is a living document. An outdated spec still beats no spec. |
| "The user knows what they want" | Even clear requests carry implicit assumptions. The spec surfaces them. |
Before proceeding to implementation, confirm:
npx claudepluginhub outlinedriven/odin-claude-plugin --plugin odinCreates structured specifications before coding for new projects, features, or changes with unclear requirements. Covers objectives, commands, project structure, code style, testing strategy, and boundaries.
Guides spec-driven development through phases: research, requirements, design, tasks, autonomous task-by-task implementation. Decomposes large epics into ordered specs with progress tracking.
Orchestrates spec-driven development workflow (Requirements → Design → Tasks → Implementation) with approval gates. Activates for structured feature planning or 'use spec-driven'.