LeanSpec — Spec Coding Skill
Teach agents spec coding: the practice of treating specs as durable
artifacts that drive development, not ephemeral planning notes. LeanSpec
provides the methodology and the leanspec CLI; each adapter (markdown,
GitHub Issues, ADO, Jira, …) speaks its backend's native language. The skill
is deliberately adapter-agnostic — never hard-code a status value, priority
name, or field key here.
Start every session with capability discovery
Before reading, writing, or linking any specs, run:
leanspec capabilities -o json
The output is your source of truth. It tells you:
- The active adapter's name (
markdown, github, ado, …).
- Which metadata fields exist and their types/enum values.
- Which field plays each semantic role (
status, priority, tags,
assignee, due_date) on this adapter.
- Which link types the backend understands (
parent, depends_on, …).
Use the returned enum values as the only valid vocabulary. If you want to move
a spec into the "working" state, look up the semantic status field, pick the
value the adapter calls "work is underway," and send that — don't assume it's
called in-progress.
Core principles
- Specs are durable artifacts. They persist beyond the session, they are
reviewable, and they link to code. They are not plan-mode scratch pads.
- Methodology, not mechanics. The five phases below apply whether your
backend is a markdown folder, a GitHub repo, or a Jira project.
- Discovery first. Always read what exists before writing anything new.
- Intent before implementation. Capture why first, how second.
- Verify against reality. Never trust a status field alone — check code,
commits, tests, CI.
- Use the adapter's vocabulary. No hard-coded field names or values.
The five phases
1. Discover
Understand the current state of the project before touching anything.
- Run
leanspec capabilities -o json (session start).
- Run
leanspec board to see the current shape of the project.
- Run
leanspec search "<keywords>" to find related items.
- If a close match exists, consider extending or linking to it rather than
creating a new item.
2. Create
Capture intent as a new, durable artifact.
- Run
leanspec create <short-name> with every known field in a single call
(title, body, semantic fields like status/priority, tags, parent,
dependencies). Never create an empty item and then patch it.
- Write the body with:
- Overview — what problem this solves and why it matters.
- Requirements — a checklist of independently verifiable items.
- Non-goals — what's explicitly out of scope.
- Acceptance criteria — measurable definition of done.
- Link relationships as they emerge. Use the adapter's declared link types
(typically
parent for hierarchy and depends_on for blockers — confirm
via capabilities).
3. Refine
Make the spec implementation-ready before coding starts.
- Locate files, modules, and APIs referenced in the spec; verify they exist.
- Find existing patterns to reuse; note concrete paths and function signatures
in the spec.
- Validate dependencies are available.
- Gate: no blocking unknowns; every checklist item is specific and actionable.
4. Implement
Execute against the refined spec.
- Read the spec (
leanspec view <id>), including parent, children, and
dependencies.
- Transition the spec into its "work underway" state via
leanspec update <id> using the adapter's declared status value.
- Work the checklist in order; stay inside the scope boundaries; document
decisions and discoveries inside the spec as they happen.
- If you find out-of-scope work, create a new spec and link it rather
than expanding the current one.
5. Verify
Close the loop against reality, not status.
- Run the project's quality gates (tests, typecheck, lint, build).
- Re-read the spec's acceptance criteria and tick each one only if you can
point to the commit, test, or file that proves it.
- Transition the spec to its adapter-declared "done" state, and append a
short implementation note.
- If anything failed, stay in-progress, fix the cause, and re-run.
Relationship types
Relationships are adapter-declared. Check capabilities.link_types. The two
most common shapes:
- Parent / child — an umbrella decomposed into child items. A child
doesn't make sense without its parent; the parent completes when all its
children do.
- Depends on — a blocker. Both items are independent work; one just has
to ship first.
Decision flowchart:
- Is item B part of item A's scope? → parent/child.
- Does item B just need item A finished first? → depends-on.
- Never use both for the same pair.
Litmus test: "If item A didn't exist, would item B still make sense?"
No → B is A's child. Yes → B depends on A.
Managing evolving work
- Content changes — use
leanspec update --content or edit the item body.
- Metadata changes — use the supported
leanspec update flags
(--status, --priority, --assignee, --add-tags, --remove-tags,
etc.) for adapter-declared fields. Each flag accepts values from the
adapter's capabilities. The skill never writes raw frontmatter or YAML.
- Scope creep — split. Create a sibling spec and link it; update the
original's non-goals to reference the split.
- Obsolete work — transition to the adapter's "closed/archived" state
rather than deleting; history matters.
Context economy
- Keep each item under ~2000 tokens. Split if larger.
- Favour bullet lists over prose.
- Use references to external docs rather than copying them.
- Checklists are for actionable items only — plain lists for everything else.
Best practices — at a glance
- Never create items manually. Always use
leanspec create.
- Never edit raw metadata. Use
leanspec update.
- Always discover first. Run
board / search before create.
- Always pass every known field to
create. No empty-then-patch.
- Always verify before closing. Tests, typecheck, lint, build.
- Trust the adapter's vocabulary. Re-run
capabilities if anything feels
ambiguous.
References
1---2name: leanspec3description: The spec-coding methodology for AI-assisted development. Use when planning features, creating/refining/implementing/verifying specs, or organising a project. Works with whatever spec backend your team already uses — local markdown, GitHub Issues, Azure DevOps, Jira — by delegating platform-specific details to a LeanSpec adapter.4---56# LeanSpec — Spec Coding Skill78Teach agents **spec coding**: the practice of treating specs as durable9artifacts that drive development, not ephemeral planning notes. LeanSpec10provides the methodology and the `leanspec` CLI; each **adapter** (markdown,11GitHub Issues, ADO, Jira, …) speaks its backend's native language. The skill12is deliberately adapter-agnostic — never hard-code a status value, priority13name, or field key here.1415## Start every session with capability discovery1617Before reading, writing, or linking any specs, run:1819```bash20leanspec capabilities -o json21```2223The output is your source of truth. It tells you:2425- The active adapter's name (`markdown`, `github`, `ado`, …).26- Which metadata fields exist and their types/enum values.27- Which field plays each **semantic role** (`status`, `priority`, `tags`,28 `assignee`, `due_date`) on this adapter.29- Which link types the backend understands (`parent`, `depends_on`, …).3031Use the returned enum values as the only valid vocabulary. If you want to move32a spec into the "working" state, look up the semantic `status` field, pick the33value the adapter calls "work is underway," and send that — don't assume it's34called `in-progress`.3536## Core principles37381. **Specs are durable artifacts.** They persist beyond the session, they are39 reviewable, and they link to code. They are not plan-mode scratch pads.402. **Methodology, not mechanics.** The five phases below apply whether your41 backend is a markdown folder, a GitHub repo, or a Jira project.423. **Discovery first.** Always read what exists before writing anything new.434. **Intent before implementation.** Capture *why* first, *how* second.445. **Verify against reality.** Never trust a status field alone — check code,45 commits, tests, CI.466. **Use the adapter's vocabulary.** No hard-coded field names or values.4748## The five phases4950### 1. Discover5152Understand the current state of the project before touching anything.53541. Run `leanspec capabilities -o json` (session start).552. Run `leanspec board` to see the current shape of the project.563. Run `leanspec search "<keywords>"` to find related items.574. If a close match exists, consider extending or linking to it rather than58 creating a new item.5960### 2. Create6162Capture intent as a new, durable artifact.63641. Run `leanspec create <short-name>` with every known field in a single call65 (title, body, semantic fields like status/priority, tags, parent,66 dependencies). Never create an empty item and then patch it.672. Write the body with:68 - **Overview** — what problem this solves and why it matters.69 - **Requirements** — a checklist of independently verifiable items.70 - **Non-goals** — what's explicitly out of scope.71 - **Acceptance criteria** — measurable definition of done.723. Link relationships as they emerge. Use the adapter's declared link types73 (typically `parent` for hierarchy and `depends_on` for blockers — confirm74 via `capabilities`).7576### 3. Refine7778Make the spec implementation-ready before coding starts.79801. Locate files, modules, and APIs referenced in the spec; verify they exist.812. Find existing patterns to reuse; note concrete paths and function signatures82 in the spec.833. Validate dependencies are available.844. Gate: no blocking unknowns; every checklist item is specific and actionable.8586### 4. Implement8788Execute against the refined spec.89901. Read the spec (`leanspec view <id>`), including parent, children, and91 dependencies.922. Transition the spec into its "work underway" state via93 `leanspec update <id>` using the adapter's declared status value.943. Work the checklist in order; stay inside the scope boundaries; document95 decisions and discoveries inside the spec as they happen.964. If you find out-of-scope work, create a **new** spec and link it rather97 than expanding the current one.9899### 5. Verify100101Close the loop against reality, not status.1021031. Run the project's quality gates (tests, typecheck, lint, build).1042. Re-read the spec's acceptance criteria and tick each one only if you can105 point to the commit, test, or file that proves it.1063. Transition the spec to its adapter-declared "done" state, and append a107 short implementation note.1084. If anything failed, stay in-progress, fix the cause, and re-run.109110## Relationship types111112Relationships are adapter-declared. Check `capabilities.link_types`. The two113most common shapes:114115- **Parent / child** — an umbrella decomposed into child items. A child116 doesn't make sense without its parent; the parent completes when all its117 children do.118- **Depends on** — a blocker. Both items are independent work; one just has119 to ship first.120121**Decision flowchart:**1221231. Is item B part of item A's scope? → parent/child.1242. Does item B just need item A finished first? → depends-on.1253. Never use both for the same pair.126127**Litmus test:** "If item A didn't exist, would item B still make sense?"128**No** → B is A's child. **Yes** → B depends on A.129130## Managing evolving work131132- **Content changes** — use `leanspec update --content` or edit the item body.133- **Metadata changes** — use the supported `leanspec update` flags134 (`--status`, `--priority`, `--assignee`, `--add-tags`, `--remove-tags`,135 etc.) for adapter-declared fields. Each flag accepts values from the136 adapter's capabilities. The skill never writes raw frontmatter or YAML.137- **Scope creep** — split. Create a sibling spec and link it; update the138 original's non-goals to reference the split.139- **Obsolete work** — transition to the adapter's "closed/archived" state140 rather than deleting; history matters.141142## Context economy143144- Keep each item under ~2000 tokens. Split if larger.145- Favour bullet lists over prose.146- Use references to external docs rather than copying them.147- Checklists are for actionable items only — plain lists for everything else.148149## Best practices — at a glance150151- **Never create items manually.** Always use `leanspec create`.152- **Never edit raw metadata.** Use `leanspec update`.153- **Always discover first.** Run `board` / `search` before `create`.154- **Always pass every known field to `create`.** No empty-then-patch.155- **Always verify before closing.** Tests, typecheck, lint, build.156- **Trust the adapter's vocabulary.** Re-run `capabilities` if anything feels157 ambiguous.158159## References160161- [references/adapters.md](./references/adapters.md) — how adapters work and162 how to write your SOP on top of them.163- [references/workflow.md](./references/workflow.md) — the five-phase workflow164 with examples.165- [references/commands.md](./references/commands.md) — CLI reference.166- [references/best-practices.md](./references/best-practices.md) — detailed167 patterns and anti-patterns.168- [references/examples.md](./references/examples.md) — end-to-end scenarios169 on markdown, GitHub Issues, and Azure DevOps backends.