Spec-driven development · MCP · GitHub App

Git knows what changed.Specky knows what stopped matching.

Your agent reads the accepted spec over MCP. A human says yes to every change. The pull request is checked against that exact version — with evidence from CI, not the agent's word.

Free for one developer · no token metering · EU-hosted · your code never leaves GitHub.

contract · Mark a task as done contract matches
spec · acceptedv1.0 @7b2d0e4
A user can mark a task as done
  • A done task moves to the bottom of the list
  • A done task is shown with a strikethrough
  • Done tasks disappear from the "Today" view
accepted by Mario · 2026-09-24
code · PR #14built @7b2d0e4
Specky-Req: 01M3…EDK@7b2d0e4
  • test_done_to_bottom passed in CI · 4f1c9a2
  • test_done_strikethrough passed in CI · 4f1c9a2
  • "Today" view agent report only
  • test_undo_within_5s waiting for CI
code_ready · hash current · 2/3 in CI
agent → get_spec_markdown · what_changed → 0 changes · built against the version a human accepted
/plugin marketplace add SpeckyContractCheck/specky-plugin
/plugin install specky@specky
/specky:init
Three commands in Claude Code. /specky:init creates the project and writes three lines into CLAUDE.md, so every session starts from the spec. Other clients: name the project in the web app, paste one command.
Claude Code · pluginclaude.aiCodexGemini CLI
The problem

The agent ships faster than anyone can check
what it was supposed to build.

The agent reads yesterday's spec

Requirements live in a chat history, a stale spec.md, or the last prompt someone remembered. Every new session starts from whatever it finds.

Nobody actually said yes

The agent "clarified" the requirement with itself. A month later nobody can say who accepted what, when, or in which version.

The PR says done. Does it?

Agent pull requests arrive bigger and faster than anyone can review. "Done" is the agent's word, not a fact checked against the criteria.

84% of agent-authored pull requests get no human review at all — or are reviewed only by other agents.

33,596 pull requests, arXiv 2605.02273, 2026.

How it works

One loop. The agent does the work, a human owns the yes.

Five moments from one session. Press play or pick a step. Nothing here calls a model.

Claude Code · session
propose_requirements returns a change_id, not a requirement. The spec is untouched until a human decides.
Accepted requirements are created already accepted, with the acceptor's name and a content hash. Rejections keep their reason.
The trailer binds the commit to an exact version. code_ready without the current hash is refused.
Contract matches specky[bot] ✓ status: success
  • ✅01M3…EDK v1.0 "Mark a task as done" — accepted by Mario, 2026-09-24 · 2/3 criteria verified in CI · hash current
    • ✅A done task moves to the bottom of the list — test_done_task_moves_to_bottom passed in CI (4f1c9a2)
    • ✅A done task is shown with a strikethrough — test_done_task_strikethrough passed in CI (4f1c9a2)
    • ⚠️Done tasks disappear from the "Today" view — agent report only · confirm manually in Specky or add a specky: crit marker
Evidence comes from your CI's JUnit report, not the agent. A status, not a gate: blocking is up to your branch protection.
Contract mismatch specky[bot] ✗ status: failure
  • ❌01M3…EDK — hash stale: you built against 7b2d0e4 (v1.0), current is a9f3e1c (v1.1)
  • ↕Changed since: criterion added by Anna, 2026-09-26 — "Undo restores a done task within 5 seconds"
  • ↩Requirement is back in get_work_queue → drift_after_code_ready. The agent's next session starts there.
  • ·Nothing was silently lost. Nobody had to remember to tell the agent.
This is the moment a file in the repo cannot catch: the spec moved after the code was declared ready.

The spec is not a document you write once. It is the record the agent reads every session — and the thing the PR is checked against.

What a file can't hold

Four things spec.md will never do for you.

01 · The record

Requirements your agent can't misread.

Every requirement carries acceptance criteria, a version and a content hash. The agent reads the current state over MCP — never a chat history — and a new session asks only what_changed.

get_spec_markdownwhat_changedget_work_queueexternal_ref → Jira / Linear

One source of truth, served to the agent, readable by humans.

02 · The gate

The agent proposes. A human accepts.

New requirement, reworded criterion, deprecation — all arrive as proposals. You decide in the conversation or in the web app; Specky records who, when and which version. Done, to-fix, collisions and open questions are human decisions too.

accept_proposalsdecide_realizationdecide_collisionsanswer_questions

Attribution by construction. No "the AI decided" in the history.

03 · The proof

Evidence on the pull request, not a promise.

Tests marked with the criterion they cover, a commit trailer with the hash, a GitHub App that reads the JUnit report from CI. Per criterion: passed in CI, waiting, agent's word only, confirmed manually, failing.

Specky-Req: id@hash# specky: crit …JUnit from Actionsstatus + one comment

A status, not a gate. Blocking is up to your branch protection.

04 · The drift

It notices when the spec moved under the code.

A requirement changed after code_ready, a failing check, a criterion edited after its test passed, a requirement untouched for 60 days — each lands in the work queue with a reason. Contradictions between requirements arrive with a suggested clarification.

drift_after_code_readystale_evidencefailing_pull_requestsinactive_requirements

Specky knows what stopped matching. Before the reviewer has to.

Who it's for

One developer, or a team that has to prove what was agreed.

Developer with an agent

You + Claude Code

Your agent gets a spec it cannot misread and a queue it cannot forget. You get a record of every yes you gave.

  • Plugin install, /specky:init, done — three lines in CLAUDE.md
  • Agent reads the current spec over MCP, never chat history
  • Drift after code_ready lands in the agent's work queue
  • PR comment with CI evidence per criterion
  • No token metering — your agent runs on your subscription
Free · 3 projects · 1 seatStart free
Team · software house

Developers, a lead, and the client who signs off

One record of what was accepted, by whom and in which version — readable by the people who build and the people who pay for it.

  • Roles: owner, developer, client, viewer — viewers are free
  • Every acceptance has a name, a date and a version; every change has a diff
  • Snapshots freeze scope for a milestone
  • Tracker keys (linear:ENG-123, Jira) in the queue and on the PR
  • The same MCP + PR check for every developer's agent
€12 / seat / monthGet Team
Why not just spec.md?

Keep your files. Specky adds what a file can't hold.

Markdown in the repo is the right place for conventions — /specky:init writes there itself. Spec Kit and Kiro write the spec. Specky is for what happens after: versions, owners, drift, proof.

  CLAUDE.md · spec.md Spec Kit · Kiro Jira · Linear Specky
Agent reads the current spec yes — as a file yes — as files yes — via MCP yes — current state + delta since last session
Criteria with version and content hash git history only git history only no yes — v2.1 @a9f3e1c per requirement
Human acceptance with attribution no review gate, by convention status change yes — who, when, which version; agents can't self-accept
Drift after the code was declared ready no no — specs are static no yes — back in the agent's work queue
CI evidence per criterion on the PR no no add-ons yes — GitHub App status and comment
Works with any agent yes Kiro: its own IDE yes yes — MCP; plugin for Claude Code

Specky doesn't replace your tracker, your IDE or your repo files — it is the contract between the agent and the people who accept the work.

Trust

Your code stays on GitHub. Your spec stays yours.

Specky writes no code and stores none. The GitHub App reads pull request metadata, the specky: crit markers in your tests and the CI results — it keeps the verdict, not your repository.

No model in the loop. Reading, proposing, accepting and checking are deterministic. The one optional model call, the spec review, runs on your own key (BYOK) or a small included pool — never trained on.

Hosted in the EU (Hetzner), under GDPR, with a full change history per requirement. Export everything as Markdown at any time.

FAQ

Questions, answered.

Do I need Claude Code?
No. Specky is an MCP server, so any MCP client can connect. The Claude Code plugin is the fastest path: three commands wire both MCP addresses, add the /specky:* skills and anchor the project in CLAUDE.md. With claude.ai, Codex or Gemini CLI you name the project in the web app first, then paste one ready-made command to the agent — the project ID is already in it.
What happens when a requirement changes after the code was declared ready?
The agent anchored to a specific content hash. When the text or the criteria change, that anchor goes stale: the PR check turns red and says what changed, and the requirement returns to the agent's work queue as drift_after_code_ready. Nothing is silently lost, and nobody has to remember to tell the agent.
Does Specky write or read my code?
It writes none — your agent writes the code. The GitHub App reads what the check needs: pull request metadata, the specky: crit markers in your tests and the JUnit results from CI. Your code stays on GitHub; Specky stores the verdict, not the repository.
Does Specky call an LLM on my behalf?
Not in the everyday loop. Reading the spec, proposing, accepting, marking code ready and checking the PR are deterministic — your agent does the thinking on your subscription. The only model call is the on-demand spec review (/specky:check): on your own key (BYOK) or from a small included monthly pool.
Can the agent accept its own proposals?
No. Acceptance, done / to-fix, collision and question decisions require a human in an interactive session, and the agent may call them only when you ask for it in that conversation. An autonomous agent gets decision_requires_interactive_client. The gate is enforced on the server, not in a prompt.
Can I link requirements to Jira or Linear?
Yes. Every requirement can carry an external reference such as linear:ENG-123 or a Jira key. It shows up in the web app, in get_work_queue and in the PR comment — the tracker stays the tracker, Specky stays the contract.

Give your agent a spec it can't misread — and a PR check that proves it.

Free for one developer. Team €12 per seat per month. No card to start.