implement-spec
Skill5 starsChanged 19 days agoMITView on GitHub
Linear-driven implementation loop. Take the next unassigned issue from a Linear project and drive it to Done — orient, design, delegate the implementation, verify with a gate plus one blind e2e pass, quick non-blocking review, PR, merge, close in Linear with follow-ups, then the next issue. Serial, context-free between iterations, batched releases. Run once (/implement-spec), on one issue (/implement-spec ABC-123) or unattended (/loop 45m /implement-spec).
- Reads credentials
- Commits and pushes
107 other projects use a version of this.
Adopted by
Most recently taken up by
- maxatwork/skillstheir own version, first seen Nov 8, 2026
- rodeyseijkens/skillstheir own version, first seen Nov 8, 2026
- ivanrvpereira/.agentstheir own version, first seen Nov 8, 2026
- 5thlayer/skillworkstheir own version, first seen Nov 8, 2026
- dfirmin/compasstheir own version, first seen Nov 8, 2026
- zhikedan/mattpocock-skills-dshtheir own version, first seen Nov 8, 2026
Used with
Projects with it also use implement-spec-with-codex, close-spec and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
dzhngSkillimplement-spec-with-codex
Run [implement-spec](../implement-spec/SKILL.md) with Codex doing the implementation passes while you orchestrate, integrate, and review. Use when the user asks to implement a spec with Codex, or to run implement-spec with Codex as the implementer.
Also in 4 projects that use this
dzhngSkillclose-spec
When a spec under specs/<feature>/ is done shipping (a write-spec build, or any planned task that produced a spec), archive it to specs/done/ and rewrite it from a build-plan into a durable rationale — the why, the principles, the invariants — pointing back to the real code for the how. Use when implementation has landed and the plan no longer matches what shipped, or the user says a feature/spec is finished. Pairs with [write-spec](../write-spec/SKILL.md) (the plan this closes) and [review](../review/SKILL.md) (run before closing).
Also in 4 projects that use this
wolverin0Skillaudit-decisions
Standardize remediation decisions, baseline-policy entries, and legal-review banners for accepted, deferred, or policy-blocked audit findings.
Also in 4 projects that use this
saffron-healthSkillget-pr-reviews
Get nicely formatted output of the last review comments on a PR. Used internally by other skills.
Also in 3 projects that use this
saffron-healthSkillpush-everything
Stage ALL changes in the repository (not just session changes), commit, and push. Use when you need to commit all pending changes.
Also in 3 projects that use this
transitive-bullshitSkillcompare-screenshots
Compare screenshots against the intended design, distinguishing approved references from historical baselines. Use for iterative implementation matching, before/after visual review, objective image telemetry, or checking a lone capture for flat, empty, or badly framed content.
Also in 4 projects that use this
- +5 more from dzhng
Other versions107 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 107
- mattpocock/skills★ 309ksame name
- formbricks/formbricks★ 13ksame name
- ArcReel/ArcReel★ 6.3ksame name
- vinvcn/mattpocock-skills-zh-CN★ 5.5ksame name
- withcoral/coral★ 4.9ksame name
- dzhng/jevgrep★ 3.2ksame name
- dzhng/skills★ 1.5ksame name
- a16z/jolt★ 1.1ksame name
- cashew-labs/libretto★ 898same name
- saffron-health/libretto★ 883same name
97 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository19 other files it gives its agents.
- code-reviewSkill
- context-guardSkill
- graylog-searchSkill
- html-slide-deckSkill
- image-generationSkill
- jiraSkill
- lighthouseSkill
- mac-maintenanceSkill
- mysql-schema-designSkill
- phaser-gamedevSkill
- pixelart-cleanupSkill
- pixellab-apiSkill
- pixellabSkill
- product-hunt-launchSkill
- promo-videoSkill
- publish-report-artifactSkill
- seo-blogSkill
- seo-optimizationSkill
- usage-statuslineSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
14 rules. 0 are common, 10 are distinctive, and 4 are very specific to this project.
0
Common
Most of the 100 edited versions we read keep these.
10
Distinctive
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 17
Context does not survive iterations; the repo and Linear do: Every iteration starts from git status, the project's CLAUDE.md, its progress …
- Distinctive: line 29
Every failure that reached verification is a missing check: Add the test, lint rule or policy test that would have caught it — in the same …
- Distinctive: line 54
Read the progress file. Read CLAUDE.md again — compaction may have dropped the project's hard rules.
- Distinctive: line 56
Run the gate. If the project has a live URL, hit its health endpoint.
- Very specific: line 151
The gate, bare: Read its exit status, not a grep of its output — piping it into grep/head replaces the exit code with the filter's, and a …
- Very specific: line 167
Do not touch the working tree while the agent runs — not an edit, not a checkout, reset, rebase or stash.
- Distinctive: line 182
After verification is green the orchestrator reads the diff itself, inline — correctness, security, the project's domain rules, obvious …
- Distinctive: line 184
No multi-agent review workflows, no adversarial panels, no spawned review agents, no pre-merge fix loops.
- Distinctive: line 192
If the config names an independent reviewer (e.g.
- Very specific: line 210
After a deploy, check the health endpoint reports the version you just released — not merely 200.
- Distinctive: line 236
Every failure that reached verification is a missing rule, not bad luck.
- Distinctive: line 260
The same fix failed twice: Stop guessing: diagnose inline, or delegate one focused diagnosis to a strong agent.
- Very specific: line 263
No unblocked issue left: hand every remaining issue back with a BLOCKED: comment, summarize the project state, and pause until something …
- Distinctive: line 267
Never leave an issue In Progress at the end of an iteration unless a branch with commits is genuinely mid-flight.
“Common” is measured: kept by at least 6 in 10 of the 100 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
implement-spec — the Linear implementation loop
You are the orchestrator of an implementation loop whose queue is a Linear project. One iteration = one issue driven to Done: designed by you, implemented by a delegated agent, verified, reviewed, merged, closed in Linear with a comment — and then the loop turns and selects the next issue. It never stops after one iteration; it ends only when the project has no issue left that is neither Done nor waiting on a human. Never leave the repository red.
Five principles carry the whole thing. Everything below is their consequence.
- Context does not survive iterations; the repo and Linear do. Every
iteration starts from
git status, the project'sCLAUDE.md, its progress file and the gate — never from memory of the previous run. - Serial, not parallel. One issue is merged before the next is taken. Parallelism lives inside an issue (fan-out for reading, review, a judge panel), never across issues — so there is nothing to merge back and no merger agent. Throughput comes from running unattended, not from worktrees.
- Only a red gate blocks. Review findings become follow-up issues; a failing gate (typecheck/lint/tests, CI, e2e) is the only thing that stops a merge. No pre-merge confirmations, no pre-merge fix loops.
- The verifier never sees the diff. A tester that knows how the code works stops testing the requirement and starts confirming the code.
- Every failure that reached verification is a missing check. Add the test, lint rule or policy test that would have caught it — in the same iteration. Prose rules erode as context fills; a check does not.
0. What the loop needs
- Linear MCP connected (
list_issues,get_issue,save_issue,save_comment,list_issue_statuses,get_document). The exact tool names differ slightly between Linear MCP builds — look them up with ToolSearch once per iteration, do not guess. - A project config block in the repo's
CLAUDE.md(team, project, gate command, release command, live URL, e2e tooling). Format and defaults: references/project-config.md. If the block is missing, bootstrap it first (derive what you can from the repo and Linear, write it, commit it) — that is the whole first iteration. - A gate command that returns a real exit code (typecheck + lint + tests).
- A progress file (default
docs/progress.md) — the only state that survives between iterations. Keep it short: current work, failed approaches, open questions. Git history is the changelog, this is not.
1. Orientation — before touching anything
git statusandgit log --oneline -5. Is the tree clean? Is there an unmerged branch from a previous iteration? A branch with commits whose issue is still In Progress is your own unfinished work — resume it (§2).- Read the progress file. Read
CLAUDE.mdagain — compaction may have dropped the project's hard rules; they are non-negotiable and must be held fresh. - Run the gate. If the project has a live URL, hit its health endpoint. Anything red before you start is your task — the previous iteration left breakage and it comes first, before any new issue.
2. Task selection — the Linear protocol
Full detail: references/linear-protocol.md. The short form:
- Unassigned issues are the loop's queue. An assigned issue belongs to a human — never take it, never edit it. Assignment is how people claim work on this backlog, and it is also how the loop hands work back (§11).
- Resume an In Progress issue only if it is unassigned and a branch with commits exists. In Progress with no branch means a human moved it there to say "this next" — a priority hint, not work already underway.
- Otherwise: milestone order as listed on the project, within a milestone by priority (Urgent > High > Medium > Low), then by issue number. Issues without a milestone come last. Skip anything blocked (§11).
- An explicit argument (
/implement-spec ABC-123) overrides selection; it may not be an issue assigned to someone other than the user. - Claim it: move it to In Progress and post a one-line comment that you are
starting it and on which branch. Use the issue's
gitBranchName.
3. Blast radius
- You may edit everything in the repo the config does not exclude — code,
tests, docs, CI, build files. Migrations, auth and billing code merge
autonomously too; the safety net is the gate + CI + additive-only migrations
- a human reviewing the released result.
- A file is a gate file when something runs it — CI workflows,
Dockerfiles, compose files, a real
.env, anything on a server. Inert documentation, examples and templates are not, however deployment-shaped their names look. If the config listsconfirm_before_editingpaths, stop and ask before touching those; derive the list from the runs-it test, never from what it said last month. - Secrets, servers and production config stay in human hands. The loop holds no credentials for them and must not ask for any.
- A decision with more than two plausible outcomes: pick the most reversible, record it in the issue, keep moving. Block only when the choice is genuinely irreversible or needs something only a human has (§11).
- Never widen scope opportunistically. Work outside the acceptance criteria becomes a new Linear issue, not an extra commit.
4. Design — inline, scaled to risk
Shape every issue before implementation, inline — no spawned design agent. For an ordinary issue that is a few deliberate paragraphs inside the brief: boundaries, conflicts with in-flight work, what to watch. For anything that settles a shape that is expensive to rewrite — a data model, a security boundary, a ledger, a public API — write a full design note into the issue description (interfaces, schema, edge cases, what must never reach the client, what a migration must keep backward compatible). Comments are editable and get lost; the description is the spec the implementer and reviewers work from.
5. Implementation — delegated
Production code is written by the strongest available model, never by a
smaller one: in Claude Code, an Agent with model: "opus" (or inline when
the session itself runs on it). The orchestrator writes the brief, spawns the
agent, and reviews its report and diff when it returns. Follow-up fixes go back
to the same agent (SendMessage keeps its context), not into inline edits
by the orchestrator.
The agent starts with nothing but the repo and its tools, so the brief is what makes the issue finishable without questions. Communicate through pointers, not copies: the issue identifier, the document names, the file paths, the previous commits — paste only what the agent cannot fetch itself and what exists nowhere else yet (the §4 design decisions, the boundaries). Template: references/implementation-brief.md. It always carries:
- a pointer to the issue — its description and acceptance criteria are binding — and to the relevant Linear documents or spec sections (pasted only when the agent has no Linear access);
- a pointer to the project's hard rules in
CLAUDE.md, and the design decisions already made, stated as closed; - the working rules: test-first for pure logic (prefer invariants over transcribed outputs), test integrity is absolute (never delete, skip, weaken or retarget a test to get green — a red test is a finding; if a test is genuinely wrong, say so in the commit message), verify new dependencies exist and are the intended package before installing, install through the lockfile;
- branch from
gitBranchName, small commits, run the gate as you go, keep the progress file current and commit it with the work; - hard boundaries: no push, no PR, no Linear, no release. Those are the orchestrator's.
A long-running agent that dies mid-task leaves work uncommitted — commit its partial state before restarting anything.
6. Verification
Detail and the lessons behind each rule: references/verification.md.
- The gate, bare. Read its exit status, not a grep of its output — piping
it into
grep/headreplaces the exit code with the filter's, and a lint error scrolls past into a red commit. - Everything provable over HTTP, the orchestrator checks itself with
curlor a short script, before spawning anything: status codes, tampering (a crafted body the server must refuse), secret leaks (fetch the served HTML and bundles and grep them). Two minutes, better evidence than a screenshot. Confirm each check fails without the fix (stash, re-run, restore) — a check that passes for a reason you have not established is not evidence. - One blind e2e pass by a cheaper model (
Agent,model: "sonnet", Chrome DevTools MCP or whatever the config names). It gets only the acceptance criteria, the URL and test credentials — never the diff, the plan or the reasoning. At most 5 criteria, aim for 2–3, the main scenario only, minutes not a quarter of an hour. Everything a unit test or an HTTP check can carry is pushed down first; e2e is the most expensive level there is and runs once.- Do not touch the working tree while the agent runs — not an edit, not a
checkout,reset, rebase or stash. Hot reload changes the page under a black-box tester; if the tree moved, throw the run away and re-run. - A criterion for a bug fix asserts the invariant that prevents the bug, not the symptom that was visible.
- The report is per criterion, PASS/FAIL with evidence — screenshot, URL, commit SHA, console error count, status codes, the test account. Conclusions without artifacts do not count. The agent never fixes code and never touches Linear.
- Do not touch the working tree while the agent runs — not an edit, not a
- Post the e2e report (and screenshots) as a comment on the Linear issue. Fix what failed, re-run the whole pass, not just the failed step.
- Skip e2e for docs-only and test-only diffs; say so in the Linear comment.
7. Review — quick, non-blocking
After verification is green the orchestrator reads the diff itself, inline — correctness, security, the project's domain rules, obvious simplifications. No multi-agent review workflows, no adversarial panels, no spawned review agents, no pre-merge fix loops.
- A red-gate finding (would break the build, ship a secret to the client, corrupt data, violate a hard rule) goes back to the implementation agent before merge. That is the only thing that blocks.
- Everything else becomes a follow-up Linear issue, and the merge proceeds.
- One short review note on the issue: what was looked at, what was filed.
- If the config names an independent reviewer (e.g. a Codex CLI review at milestone tags), run it at milestone boundaries, not per issue.
8. Merge and release
- No open PRs at iteration end. Open the PR only when everything needed to
merge it is in hand — verification and review done. Open it, let CI run,
merge it, in the same iteration (
gh pr merge --merge --autoor the project's merge style; never push straight to the default branch). - Merging is per issue; releasing is per block of work. Cut a release when
the block is worth looking at, when something is genuinely urgent (a live
bug, a security fix), or when the config says
release_policy: per-task. A deploy costs a pipeline run, a migration window and a slice of a human's attention — spending all three on one copy fix is waste. Between releases the loop keeps merging and the default branch accumulates. - Migrations in a release are additive only (expand → migrate → contract): dropping or renaming ships in a later release, after the new version has run for a while — otherwise a rollback meets a schema it cannot read.
- After a deploy, check the health endpoint reports the version you just
released — not merely 200.
gh run list --limit 1right aftergh release createoften returns the previous run, already green; match the run by title and then trust only the live answer. Then a smoke pass of the key flow against the live URL, and watch the error tracker for the new release for ten minutes. A spike means roll back first, investigate second. - Release notes list every issue in the batch.
9. Linear bookkeeping
Comments and issues are written in the project's working language
(config linear_language, default: the language the existing issues use) —
that is the humans' channel. Code, commits and PRs follow the repo's language
(usually English). Templates for every comment the loop posts:
references/linear-protocol.md.
- Issue → Done with a comment summarizing the work and linking the PR (and the release when one happened).
- File follow-up issues for everything discovered and left out of scope — review findings, missing tests, ideas — each with a one-line rationale and the originating issue linked. Small related follow-ups may be batched into one iteration when they touch the same code.
- Then turn the loop and select the next issue without pausing.
10. Ratchet
Every failure that reached verification is a missing rule, not bad luck. In
the same iteration add the check that would have caught it — a test, a lint
rule, a policy test, a line in CLAUDE.md — and say so in the Done comment.
Prose rules erode as context fills; a check does not.
11. When to stop and hand back to a human
A stop condition is never a follow-up issue — follow-ups are for out-of-scope discoveries. The unattended loop resumes by itself when the situation changes.
Waiting is a state, and In Progress is not it. An issue blocked on a human gets all three of:
- assigned to the human who can unblock it (the config's
owner, or the issue's creator), - moved to
Waitingif the team has that state — otherwise back toTodo(checklist_issue_statuses; an API token cannot create states), - a
BLOCKED:comment (in the project's language) naming exactly what is needed and what is already done without it.
Stop conditions:
- The issue needs credentials, access or a decision only a human can make.
- A change to something the config lists under
confirm_before_editing. - The same fix failed twice. Stop guessing: diagnose inline, or delegate one focused diagnosis to a strong agent. If that does not resolve it, write the state into the progress file and the issue, hand it back. No third try.
- No unblocked issue left: hand every remaining issue back with a
BLOCKED:comment, summarize the project state, and pause until something unblocks. Never stop while an unblocked issue remains.
Never leave an issue In Progress at the end of an iteration unless a branch with commits is genuinely mid-flight.
12. Launch modes
| Invocation | Behaviour |
/implement-spec | One pass: one issue to Done, then the drained-queue / next-issue summary and stop. |
/implement-spec ABC-123 | Same, but on that issue (must be unassigned or the user's own). |
/loop 45m /implement-spec | Unattended: pass after pass; after the queue drains it pauses and picks work up on a later wake-up as soon as anything unblocks. |
Anti-patterns (each one cost a real iteration somewhere)
- Giving the e2e agent the diff or the plan — it confirms the code instead of testing the requirement.
- Five browser criteria "to be thorough" — a run that stalls at 23 minutes produces nothing; the same feature as two browser criteria plus an HTTP script finished in under three with better evidence.
task verify | grep error— the exit code you read is grep's.- Trusting
gh run list --limit 1after a release — it is usually the previous, already-green run. - Asserting on a serialized payload instead of rendered text — framework
payloads dedupe strings and reference arrays by index;
"revealed",37does not mean the value is 37. - Checking the symptom of a bug instead of the invariant the fix establishes — the bug walks back in through the one word the criterion missed.
- Leaving an issue In Progress "for tomorrow" with no branch — the board stops telling the truth about what is moving.
- Taking an assigned issue because it looks easy — assignment is someone's claim.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

