Ship with skills, not vibes
Not a list of tools — one main line with a few on-ramps. From a vague idea to a commit: what to type at each step, where to stop, and the places this goes quietly wrong.
01
Three concepts to get straight first
This page describes mattpocock/skills (MIT licence), version 1.2.3, with 25 published skills. These skills are not TauX's work; this guide is. Every test, pitfall and scenario below was written by us after reading the official documentation and the issues. It is neither a translation nor a reproduction.
Miss any of these and every skill after them gets used wrong.
One: who can invoke it
This is the only classifying axis in the whole pack.
| User-invoked | Model-invoked | |
|---|---|---|
| Who triggers it | Only a human typing its name. No other skill can call it either | You can type it, and the agent will reach for it on its own |
| Configuration | disable-model-invocation: true |
Neither is set |
| Who the description is for | Humans — it appears in the slash command list | The model, with plenty of trigger phrasing |
| What it is | An orchestrator — it decides how the flow runs | A discipline — reusable methodology |
Three consequences in practice
- A document saying "then run
/implement" means you type it. The agent will not carry on by itself. - The harness does not put user-invoked skills into the list it injects, so agents routinely report that these are not installed. They are. Type it anyway.
- To see what is actually installed, read
.claude-plugin/plugin.json— that is the authority.
The rule itself: a user-invoked skill may call a model-invoked one, and never another user-invoked one.
Two: four roles
Main line
The fixed path from idea to shipped: grill-with-docs → to-spec → to-tickets → implement → code-review.
On-ramp
Generates work, then merges onto the main line: triage (things other people filed), wayfinder (too large for one session), improve-codebase-architecture (a periodic survey that produces subjects).
Standalone
Reach for it any time and put it down after: prototype, research, diagnosing-bugs, resolving-merge-conflicts, wizard, handoff, teach, to-questionnaire, wait-what, grill-me.
Vocabulary
No flow of its own — precise words, borrowed by other skills: codebase-design (module shape), domain-modeling (domain language), writing-for-agents (documents agents read), grilling (the interview primitive).
The vocabulary layer is the easiest to misuse
They have no flow. Say "go ahead" to codebase-design and the agent invents a process of its own, then burns 100k tokens refactoring something nobody asked about (filed as issue 449). Run the vocabulary layer with a driver skill on top and the vocabulary underneath.
Three: the phase boundary
A block of work inside a session is a phase — interview, implementation, QA. The question "what do I do with my context" only arises between two phases. Mid-phase there is no choice: carry on, or hand the rest to a subagent.
| Order | Option | When to pick it |
|---|---|---|
| 1 | Carry on | The next phase needs this one's actual words, or your smart zone still has room. The only option that preserves primary material, so rule it out first before considering anything else |
| 2 | clear | Everything behind you is disposable. Cheapest, and one-way if you judged wrong |
| 3 | handoff | Something needs to move: another harness, another directory, a colleague, or a side thread you want to fork off |
| 4 | subagent | The task is tight enough to finish without you there |
| 5 | compact | None of the above. It is the floor rather than the first choice, and it is where most cases land |
The two most often confused: handoff is not a general bridge between windows; what it buys is portability. compact is the bottom of the tree, not a reflex. The three preserve different things — compact preserves your intent, clear preserves nothing, and handoff preserves the work's ability to move. And all three turn the conversation — primary material — into a summary, which is secondary.
02
Installing: two routes, pick one
Two installation methods, two philosophies. Install both and you have two copies of every skill.
Route A — subscribe
claude plugins install mattpocock-skills
Or, inside a session, /plugin install mattpocock-skills. It is on the official marketplace, so no source to add first, and updates arrive on their own.The cost: read-only. You cannot edit it.
Route B — editable
npx skills@latest add mattpocock/skills
It asks which skills to install and onto which agents. Make sure setup-matt-pocock-skills is ticked. The files land in your repo as ordinary files you own, editable however you like. Update it yourself with npx skills update.
Route B's trap
A SKILL.md you edited by hand is overwritten by npx skills update. Anything you want to persist goes inin your own CLAUDE.md / AGENTS.md (see section 09), or say it at every invocation — do not edit the skill file.
Trying the beta bucket
npx skills@latest add mattpocock/skills --skill=<name>
The plugin does not ship these. At the time of writing the in-progress bucket holds loop-me, writing-beats, writing-fragments, writing-shape, claude-handoff, setup-ts-deep-modules. No documentation pages, and liable to change or vanish. There is also a misc bucket outside the plugin: git-guardrails-claude-code (a hook that blocks dangerous git commands), setup-pre-commit, migrate-to-shoehorn, scaffold-exercises.
03
Setup, once per repo
/setup-matt-pocock-skills is a precondition for every engineering skill, not a step in the flow.
| Decision | What it proposes | When it actually asks |
|---|---|---|
| Issue tracker | Guesses from your git remote | Every time — this is the only real choice |
| Triage labels | Reuses the five standard names | Only if triage is installed |
| Domain document layout | Single context: one CONTEXT.md plus docs/adr/ |
Only if it detects a monorepo |
Four tracker options: GitHub (needs gh), GitLab (needs glab), Local markdown (.scratch/<feature>/ — you do not even need a remote), Other (you write a paragraph describing your workflow).
Local markdown is a first-class option, not a fallback: solo project, no remote, fully supported. Do not run it alongside GitHub on the same project — they replace each other, they do not stack.
"Other" is not a placeholder either — it is how Jira, Linear and Azure DevOps work here. You describe your workflow, it writes your words into docs/agents/issue-tracker.md, and downstream skills follow that text. This is also why none of this is tied to GitHub, and why you never edit a skill file to change tracker.
Three pitfalls worth knowing about
One: it does not create your labels
triage-labels.md is only a mapping table. On a fresh GitHub repo those labels do not exist, so applying one fails. Create them once yourself:
gh label create needs-triage
gh label create needs-info
gh label create ready-for-agent
gh label create ready-for-human
gh label create wontfix
gh label create bug
gh label create enhancement
To use wayfinder, five more have to exist first (gh fails outright on a label that is not there): wayfinder:map, wayfinder:grilling, wayfinder:prototype, wayfinder:research, wayfinder:task.
Two: it looks at which files exist, not which harness you use
You are on Codex but the repo still has a stray CLAUDE.md, so the ## Agent skills section lands somewhere Codex will never read. Fix: move it by hand into AGENTS.md, or make AGENTS.md the real one and have CLAUDE.md hold a single line pointing at it.
Three: rerun it after updating the skills
The seed templates change, so an older issue-tracker.md may no longer match. When downstream behaviour turns odd, rerunning is the cheapest fix.
How to tell it worked
docs/agents/issue-tracker.mdanddomain.mdexist (plustriage-labels.md) if triage is installed- The instruction file your harness actually reads now contains
## Agent skills - From then on
/to-ticketsstops asking where issues go, and/triageapplies labels rather than inventing them - Not one word of the skill files changed. If setup edited a
SKILL.md, something went wrong
04
All 25, mapped
The dependency column is the one that matters in practice — with a dependency missing, a skill degrades quietly into improvisation.
| Skill | Invoked by | Role | In one line |
|---|---|---|---|
| setup-matt-pocock-skills | User | Setup | Run once per repo: tracker, labels, document layout |
| ask-matt | User | Router | Describe your situation; it tells you which sequence to type |
| grilling | Model | Primitive | The round-by-round interview engine every other grilling skill is built on |
| grill-me | User | Standalone | Stateless interview. No repo needed, subject need not be code |
| grill-with-docs | User | Main line, head | The same interview, plus reading the codebase and writing CONTEXT.md and ADRs |
| wayfinder | User | On-ramp | Work too large for one session, drawn as a map of decision tickets |
| to-spec | User | Main line | Condenses the conversation into a spec and files it. No further interviewing |
| to-tickets | User | Main line | Cuts a spec or conversation into tracer-bullet tickets and declares the blocking edges |
| implement | User | Main line | Works the ticket, drives tdd internally, runs code-review at the end, commits |
| tdd | Model | Engine | Red-green, and tests only on a pre-agreed seam |
| code-review | Model | Main line, tail | Two-axis review — Standards and Spec — of the diff against a fixed point |
| triage | User | On-ramp | Runs issues other people filed through a state machine |
| improve-codebase-architecture | User | On-ramp | Scans the codebase for deepening opportunities and produces an HTML report |
| prototype | Model | Standalone | Answers one design question with throwaway code |
| diagnosing-bugs | Model | Standalone | Six-phase diagnosis for hard bugs and performance regressions. No theorising before a red loop exists |
| research | Model | Standalone | A background agent reads primary sources and leaves a cited markdown file |
| resolving-merge-conflicts | Model | Standalone | Resolves each hunk by intent, runs the checks, finishes the merge, never aborts |
| wizard | Model | Standalone | Generates an interactive bash script that walks a human through the steps only a human can do |
| codebase-design | Model | Vocabulary | Precise words for module, interface, depth and seam, plus four principles |
| domain-modeling | Model | Vocabulary | Actively builds and sharpens the domain language, writing into CONTEXT.md and ADRs as it goes |
| handoff | User | Standalone | Compresses the current conversation into a portable handoff document |
| teach | User | Standalone | Turns the current directory into a teaching workspace that persists across sessions |
| to-questionnaire | User | Standalone | Turns a decision only somebody else can make into a questionnaire |
| wait-what | User | Standalone | Type it when the last answer did not land; the agent re-pitches it |
| writing-for-agents | Model | Vocabulary | Guidelines for documents agents read: skills, instruction files, specs, prompts |
Two branches worth remembering
- The prototype branch. When the interview hits a question nobody can answer in words until they see something, stop, prototype it, and come back with a one-line answer.
- Spec and tickets only pay off across sessions. For a change that fits in one context window, go straight from
grill-with-docstoimplementand skip the two in between.
05
The seven steps, worked through
The worked example
An internal tools repo (Next.js and Postgres) needs a contract-expiry reminder: list contracts expiring within 30 days, email the owner, show a red dot in the admin panel. It crosses schema, API, UI and mail. It is broad enough to be worth the full flow.
Step 1 — grill a vague idea into decisions
/grill-with-docs I want to add a contract expiry reminder
Start a clean conversation and turn plan mode off. Plan mode pushes the agent to produce a plan quickly, which is the opposite of staying in the question.
What happens
It reads your codebase, then asks questions in rounds. Each round is the current frontier — every question whose prerequisites are settled, asked at once — so you are never asked something still hanging in the air. The format is fixed: a numbered heading, the body, and one line of recommended answer. Thirteen questions usually take three rounds; forty-six across four rounds is an ordinary session.
How to answer
1 yes
2 the second one
3 no — our contracts have no partial termination
4 I do not know
The biggest failure mode is passivity. Answer "agreed" forty times and you get a plan the agent wrote and you nodded at — it feels productive because it is long. But nothing was actually decided, and the result carries a certainty it did not earn. Being active means this: when a question is pitched shallower than you need, push back; when the scope is drifting, say so; and when you genuinely do not know, say so — that is a real answer.
grillable vs ungrillable
"One long form or three pages?" "How should this interaction feel?" — questions like these cannot be talked out; they need something to react to. Stop, prototype it, come back with a one-line answer. Pushing on an ungrillable question is the main way a session session blows up: the agent keeps rephrasing, you keep guessing, and the scope inflates to fill the uncertainty.
| What got resolved | Where it lands |
|---|---|
| A term — this project's own word for something | CONTEXT.md, written at that moment, not batched at the end |
| A decision that is hard to reverse, surprising without context, and the result of a real trade-off | docs/adr/ , as an ADR |
| Everything else you decided | In the conversation only. Nowhere else |
What that third row means
Almost everything you worked out exists only in this context window. So do not clear, do not compact — go straight on to /to-spec.
CONTEXT.md is a glossary and only a glossary: no implementation detail, no spec, no scratch notes. An ADR needs all three conditions at once, so most sessions produce zero ADR, and that is by design.
Use your best model here. Grilling draws on the model's own intuition for how systems break; implementation leans more on context and can run cheaper.
Step 2 — turn what was decided into a document that survives
/to-spec, in the same conversation. Do not open a new one.
It does not interview you. By this point everything that needed deciding is decided, so it synthesises — from the conversation, the codebase, CONTEXT.md and the ADRs.
A spec is a record of decisions, not where they get made
It exists because context windows end. Everything you just grilled out sits in a conversation about to be discarded; the spec is that conversation's survivor. So it verifies nothing and decides nothing. Any sentence in a spec that you did not say is a defect.
It confirms the seams with you first
Before writing a word it drafts which seams — the public boundaries where a test observes behaviour — this feature should be tested on, and brings them to you. It prefers an existing seam to a new one, and takes the highest one it can. Ideally the whole change has exactly one. That pre-agreed seam then travels downstream: tdd writes tests only on a pre-agreed seam, and code-review checks whether any unagreed seam was used.So answer this exchange properly rather than deferring it to implementation.
| Where you are | What to run |
|---|---|
| Nothing decided yet | grill-with-docs first |
| Decided, and it fits in one context window | Go straight to implement and skip the spec |
| Decided, and the work spans several sessions | /to-spec, then /to-tickets |
| Just cleared a wayfinder map | /to-spec #<map_issue> |
Common pitfalls
ready-for-agentlabel, misread. A spec gets tagged with it, meaning "this no longer needs triage" — an entry qualification, not a work order. But if you have an unattended agent polling that label, it cannot tell the difference and will try to do the whole spec in one go. Fix: exclude the parent spec explicitly in that agent's prompt, or/to-ticketshas run, remove the label.- Refactoring work does not fit the template. The template leans hard on user stories, and architectural work forced into one becomes a story nobody asked for. Lean on the implementation-decisions and testing-decisions sections instead, and let the durable architectural decisions land as ADRs out of
grill-with-docs. - It does not check for duplicates. It will not search the tracker for an existing issue, and it will not link the ADRs it is following. Search the busy areas yourself first.
- A large spec gets truncated. Past a certain size the tracker cannot return the issue cleanly, and there is no local copy to fall back on.
/to-specand/to-tickets: do not clear and do not compact in between.
Step 3 — cut it into tracer bullets
/to-tickets, same window — or /to-tickets #<spec_issue>. A plan that exists only in the conversation works too — it reads the conversation directly.
| Horizontal (wrong) | Vertical (right) | |
|---|---|---|
| A ticket delivers | One layer of the change — all the schema in one ticket, all the API in another | A thin path through every layer |
| Once landed | Nothing moves until every layer is in place | It demos on its own |
| Acceptance criteria | Have to reach into work another ticket owns | Only assess what this ticket owns |
This is the most-violated rule, and the cost has been measured. One team cut 26 tickets by layer — corpus, producer, aggregator, selector — and averaged 20 agent runs to close each ticket, roughly three-quarters of it rework. Their own retrospective traced every category of failure to the horizontal slicing rather than to implementation quality.
The check to run
Ask one question of every ticket: "when this is done, what can I demo?" If the answer is not a behaviour, it is a horizontal slice. Some people add a demo-path line to each ticket and report it pushes the model towards vertical decomposition.
Before it files anything
Prefactoring: it looks first for work that makes the change easy, and puts that ahead of the change itself. Then it hands you a numbered list and interrogates it: is the granularity right, are the blocking edges real, should any be merged or split. Nothing reaches the tracker before you approve it — the interrogation step is where you push back.
Wide refactors are the one exception
One shape breaks the tracer-bullet rule: a single mechanical change whose blast radius covers the whole codebase — renaming a field, swapping a shared type. One edit breaks a thousand call sites and no vertical slice can land green. Use expand–migrate–contract: Expand — the new form sits beside the old one and nothing breaks. Migrate — move call sites in batches sized by blast radius, one ticket per batch, each blocked by expand, and CI stays green because the old form is still there. Contract — delete the old form once nothing calls it, blocked by every migrate batch.
Common pitfalls
- Twelve tickets for a three-line change. Over-decomposition is the commonest friction. Tell it to merge them at the interrogation step. The more fundamental answer: if the whole change fits in one context window, you do not need this skill at all.
- Sub-issues are not created on GitHub. Known and unfixed (issue 554), worse on Codex.
ghhas supported this natively since v2.94:gh issue create --parentandgh issue edit --add-sub-issue. - "Blocked by" only appears in the body. Same family of problem (issue 513). GitHub has this natively:
gh issue create --blocked-by. Because blockers are filed first, the number is always available at creation time. - Acceptance criteria that assess nothing. For each one, state what observation would prove it false, and confirm it is red at the starting commit.
- The tickets are filed — now what? Nothing assigns them. Look at the board, count the tickets with no open blockers, and start that many agent sessions. One ticket per fresh context, clearing in between.
Step 4 — one ticket, one session
/implement https://github.com/you/repo/issues/12
Why the full reference matters
/implement #2’s #2 resolves against any numbered list the agent can see — and in a fresh session that might be a todo file or a checklist rather than the tracker you configured. It resolves confidently and does not fail closed, so you will not notice immediately when it is wrong. Pass the full URL or owner/repo#2, and have it read the title back before starting.
The five beats of a run
- Read the ticket or spec and derive the seam
- Drive
tddon the pre-agreed seam, one red-green slice at a time - Typecheck often, running a single test file as it goes
- Run the full suite once at the end
- Run
code-review, then commit to the current branch
What it never does
It never reopens the plan. No interview, no clarifying round, no alternative proposal. What was decided upstream is the input, and its job is to turn that into a commit. That is exactly the difference from typing "do this" at a fresh agent, which will redesign as it goes.
| Symptom | What is happening |
|---|---|
| It finished but the ticket is still open and the criteria unticked | Correct and expected. There is no closing step; it stops at the commit. You close the ticket yourself — this bites hardest on the dependency chain, because the frontier is defined as tickets whose blockers are all closed, and if nobody closes anything nothing ever becomes work |
| Can it do every ticket at once, in parallel? | No. In one checkout ckout, running several implements in parallel is worse than unsupported: field reports from a single afternoon include an amend landing on another session's commit, a stash disappearing, and commits going to the wrong branch. The community workaround und is a worktree, though the stash is still shared |
| Can it open a PR? | Not built in. It commits to the current branch and will not create one for you. Some people override that at invocation |
| code-review says it cannot see my changes | It reviews diff <fixed-point>...HEAD, excluding staged and working-tree changes. implement runs the review before committing, so unless there is an intermediate commit that diff is empty. Commit first, then review |
| One ticket burned 150k tokens | Usually the ticket is too big rather than the skill misused. A run covers exploring the codebase, red-green on each seam, the full suite and the review, so over 100k tokens is normal.The leverage is upstream: size the ticket so it fits a fresh window. If one keeps blowing out, split it rather than raising the effort setting |
Some people deliberately skip the built-in review: an agent reviewing its own code favours its own solution. Running code-review separately against a fixed point in a clean session is a reasonable alternative.
Step 5 — the red-green engine
tdd is a reference, not a driver. It holds the rules of the loop; someone else runs the session — you, or implement.
Red-green
Write a failing test, then write only enough code to pass it. Do not write the next test ahead of time. There is no refactor phase — removed in June 2026, because agents almost never performed it and because review and implementation work better in separate sessions. Refactoring belongs to code-review.
Vertical slice
One seam, one test, one minimal implementation, then repeat. The first cycle is the tracer bullet, proving a path works end to end. The opposite is writing all the tests and then all the code — which verifies imagined behaviour, checking the shape of things rather than what a user does, and locks you into a test structure before you understand the implementation.
Pre-agreed seam
The rule is absolute: no test without a confirmed seam. On the full chain, seams are agreed at to-spec; called on its own, it asks you directly.
| Antipattern | How it shows |
|---|---|
| Implementation-coupled | You rename an internal function, behaviour is unchanged, and the tests break. Mocking your own collaborators, asserting call counts, verifying through a database query instead of the interface |
| Tautological | The expected value is computed the same way the code computes it, so the test cannot fail.The expected value has to come from somewhere else: a known-good literal, a hand-worked example, the spec |
| Horizontal slicing | A batch of tests lands before any implementation does |
Mock only at system boundaries — external APIs, time, randomness. Sometimes the filesystem or the database. Never mock your own modules.
Common pitfalls
- "It asked me which test seam and I have no idea." The commonest friction (issue 607). The prompt lists candidate seams by name without saying what each catches and what it misses. Ask the agent for the trade-off: what does a component-level seam miss that an integration seam catches, and how much slower is it? This is exactly why the full chain agrees seams at
to-spec. - It writes the implementation before the test. This happens. The skill is written to live with it, and no instruction makes an agent comply every time. If a particular slice genuinely needs strictness, watch it run.
- It writes a browser test first and then spins. Reports of an agent writing Playwright, running it repeatedly against a feature that does not exist yet, and concluding the test is broken. Declare it in the repo instruction file: browser tests come after the behaviour work works.
- It does not know about your other tickets. Run against one, it will happily propose work belonging to a sibling (issue 129). Giving it the spec alongside the ticket helps; cutting the tickets correctly in the first place helps more.
Step 6 — the two-axis review
/code-review main
You must supply the fixed point. Without one it asks rather than guesses, and it verifies the ref resolves and the diff is non-empty before spawning any sub-agent.
| Standards | Spec | |
|---|---|---|
| The question | Was it done right? | Was it the right thing to do? |
| What it reads | The repo's own written standards, plus a built-in smell baseline | The originating issue or spec |
| What it reports | Explicit violations, which can be hard failures, plus smells, which are always judgement calls | Missing or partly implemented requirements, scope creep, requirements implemented wrongly |
| Every finding must cite | A standards file and clause, or a smell name and the hunk | The line of the spec |
The two axes run in separate sub-agents and cannot see each other's reasoning. The report ends with the worst finding on each axis and refuses to pick an overall winner across them — because a change can pass one and fail the other: code that follows every convention but does the wrong thing passes Standards and fails Spec; code that follows the ticket exactly but breaks the repo's conventions does the reverse.A blended verdict lets the axis that passed cover for the one that failed.
The smell baseline is the floor beneath Standards: the twelve code smells from chapter 3 of Fowler's Refactoring. Each is a "this might be" heuristic, never a hard violation, and each is stated as what it is and how to fix it — so a finding arrives with an action already attached. Anything your linter already handles is skipped by both axes.
Common pitfalls
- It collides with the built-in command of the same name. The most reported issue, unfixed. The built-in one hunts bugs in a diff; this one checks compliance with standards and spec. With both installed one wins, and which depends on how they were installed.
- Sub-agents invoke it again and spawn more agents. Reproduced by several people across several harnesses, once reaching more than fifty. The fix on a fork is a line in each sub-agent brief: do not invoke code-review e-review or spawn additional agents; perform the review directly.Running this unattended, watch the agent count.
- Should it run in the same session as the coding? Prefer a new one. Somebody put it well: reviewing yourself in the same context is confirmation bias with a slash command attached.
- Can the findings be trusted? Not without checking. A sub-agent's output is a hypothesis, not evidence. It aggregates two reports without verifying each against the files, so a citation may point at the wrong place or overstate the impact. Read the citation before acting on the finding.
- Why does every run find something new? Changes create new surface, and the judgement half is not deterministic. There is no convergence guarantee. Treat one pass as a list of leads, act on the ones backed by a written rule, and stop — do not run it until it comes back clean. It will not.
Step 7 — closing out, and the loop
The loop for one ticket:
- clear context
/implement <ticket>—tddruns inside it- commit
/code-review <fixed-point>in a clean session- Close the ticket and tick the criteria by hand — implement does not do this
- Take the next ticket off the frontier and go back to step 1
Cadence
- Daily. The main line. One ticket per session, clearing in between.
- Every few days.
/improve-codebase-architecture, turning structural debt into subjects that feed back onto the main line. - When work arrives from outside.
/triage. On a project with no external reporters you will rarely reach for it. - When a skill gap turns up.
/teach, in a directory of its own.
Do not forget
The one thing in the whole chain nobody does for you is closing the ticket and ticking the criteria. Implement stops at the commit. The dependency chain only advances when you close things — otherwise the frontier never produces anything new toable.
06
By situation: which skill to reach for
Everything off the main line is a branch you take in a specific situation. Ordered here by the situation you are in.
Standalone — prototype
I cannot talk this one out
It writes throwaway code that answers one question. The question comes first and shapes everything after it; a prototype answering the wrong question is pure waste however good it looks. "Throwaway" constrains how it is written, not whether it must be destroyed. No tests, no error handling beyond making it run, no abstraction, no persistence.
The two branches produce very different things. "Does this logic or state model feel right?" gets you a single shareable HTML file — with a state panel, a free-play button and tabbed walkthroughs, everything labelled in domain language, ready to hand to a designer or a domain expert to try for themselves. The logic behind it is a clean pure module that never touches the DOM, so once validated it lifts straight into production code. "What should this look like?" gets you several radically different UI variants on the same route, switched with a floating bar. The variants have to disagree on structure rather than colour — three lightly tweaked card grids are wallpaper, not a prototype.
The moment you catch yourself hardening it, you have stopped prototyping — adding tests, wiring a real database, generalising for something you might need later.
What to do with the output. The answer — the verdict and the question it settled — goes somewhere durable: a commit message, an ADR, the implementation issue. The prototype itself is not deleted and does not go to main; commit it to prototype/<name> branch, never merged, with a pointer left on the implementation issue.
Pitfalls. Agents suggest prototyping when you should be implementing — a naming problem: to an agent unfamiliar with the flow it reads like the obvious next step after a ticket exists. And do not prototype a whole app: there is no natural stopping point, momentum turns it into the product, and code with no tests and no error handling meets users that way.
Standalone — research
An external fact is blocking a decision
It works only from primary sources — official documentation, source code, specifications, first-party APIs — tracing every claim back to whichever one owns the answer. It does not answer you in the conversation; the output is a file, with a link on every claim. The decisive move: the reading runs in a background agent.
Research is legwork you delegated, not thinking you outsourced.
Pitfall. It spawns a second copy of itself (issue 530): the skill tells the caller to start a background agent without constraining the agent type, so what starts is a general-purpose agent holding the same tools and instructions, which starts another. Somebody measured a single research task burning roughly 450k tokens across three overlapping executions, the duplicate finishing half an hour later entirely out of sight. Check the background task list after invoking it and stop the duplicates.
Three more. The inverse failure: if your global instructions forbid further delegation, the background agent politely declines and the skill quietly does nothing. "High-trust source" is the model's own judgement with no allowlist, so your real mitigation is following two or three citations at random — landing on a summary of the thing rather than the thing itself means the run failed. There is no stopping criterion, so scope is your responsibility: one API, one behaviour, one version claim comes back far better than "research X".
A research file is not an ADR. ADRs stay; research files get archived or deleted once used. A stale research file is worse than none — it poisons every later read of the repo.
Standalone — diagnosing-bugs
Something is broken and I do not know why
Six phases: build a repro, minimise it, rank hypotheses, instrument, fix with a regression test, clean up.
It will not let the agent form a theory before a tight feedback loop exists. A named command, already run once, red on this bug, and green once fixed. A coding agent handed a bug report defaults to reading the code and guessing; this skill blocks that.No command that can go red means no phase 2.That gate is the entire value of the skill.
Having a loop is not the goal; a tight one is. Fast — seconds. Deterministic — the same verdict every time. Sharp — asserting your exact symptom, not "it did not crash". And runnable unattended. A thirty-second flaky loop is barely better than none. For an intermittent bug the goal is not a clean repro but a higher reproduction rate: loop the trigger, parallelise, add load, inject sleeps.
Ways to build one, in order of preference
- A failing test on a seam that reaches the bug
- curl or an HTTP script against a dev server
- A CLI call with fixture input, diffed against a known-good snapshot
- A headless browser script asserting DOM, console or network
- Replaying a capture — a saved request, payload or event log
- A throwaway harness — the smallest subset of the system, one function call
- A property or fuzz loop, for "sometimes the output is wrong"
- A bisect harness you can hand to
git bisect run - A differential loop — same input, old version against new
- A human-in-the-loop bash script, as a last resort
| Gate | What must be true |
|---|---|
| To enter phase 2 | A named command, already run, with its output pasted in (sensitive values masked), that goes red on this bug |
| To enter phase 3 | The repro reproduces and has been minimised — every element left is load-bearing |
| To enter phase 4 | Three to five ranked, falsifiable hypotheses, each with its prediction stated, shown to you before any is tested |
| To enter phase 5 | Each probe maps to a specific prediction, one variable at a time, every debug line carrying a greppable tag |
| Done | The original repro no longer reproduces, all instrumentation is removed, and the hypothesis that turned out right is written into the commit message |
Pitfalls. It fires on lightweight questions where you only wanted a direct answer — the most reported problem (issue 578, four people describing the same shape). Say "answer directly, do not diagnose", or turn off its model invocation. Do not use it to hunt for where the performance problem is — it diagnoses a failure you can already name. It does not stop to ask before writing the fix; phase 3 is the only human checkpoint.
Standalone — resolving-merge-conflicts
I am stuck in a merge or rebase conflict
It refuses to treat a conflict as a text problem. Before touching a hunk it traces both sides back to primary sources — the commit message, the PR, the originating issue — so it is choosing between two intentions rather than between two blocks of text, and it keeps both wherever they are compatible. Where they genuinely are not, it picks the side matching this merge's stated goal and states the trade-off. It never invents new behaviour to paper over a conflict, and it does not abort: the merge is always carried to a finished commit.
It also finds the repo's own automated checks and runs them before committing — because a merge is the easiest place in git to produce something that satisfies both branches and passes neither one's tests.
Extra practical knowledge. Do not partition files between parallel tasks to avoid conflicts — it costs more than it saves. The one discipline worth keeping is large refactors first. When working in parallel worktrees, the merge back is best done by the session that wrote the change, because only that session knows the intent. Batching everyone's conflicts onto the last agent throws away exactly what this skill works to reconstruct.
On-ramp — improve-codebase-architecture
The codebase is rotting
It scans the codebase for deepening opportunities — places where a shallow module, whose interface is nearly as complex as what it hides, could become a deep one — writes them up as an HTML report, and then grills whichever candidate you pick.
It never changes code. A whole run produces one HTML file and one conversation. The refactor itself happens later, in another session, through the normal build flow. That is what makes it a survey rather than a refactoring tool, and why it is worth running against a codebase you are not ready to touch yet.
Two filters. The deletion test: imagine removing this module — does complexity concentrate behind a smaller interface, or disperse across the callers? Only concentrating cases get a card. Unless you name a region it also reads recent commit history first and biases the scan towards paths that are changing — a deepening in code nobody touches is a refactor you will never cash in.
Three strength labels. Strong — the deletion test passes cleanly and the friction is real; take it seriously. Worth exploring — it makes sense, but the payoff depends on where the code goes next. Speculative — listed for completeness, and mostly safe to ignore.
| Situation | How to use it |
|---|---|
| Routine maintenance | Every few days, or whenever there is a gap. Stops structure rotting between features |
| Before a large piece of work | Point it at the spec: "how do we make this change easy?"This is the most effective prompt |
| Brownfield audit | Run it against a large, unstructured, vibe-coded repo repo to see what shape it actually is |
| Testing legacy code | Use it to find the missing seams first, then write tests against hard-to-test code |
Pitfalls. "It grilled me for an hour about one idea" is the loudest complaint — say "do not grill me, just give me the report" when you invoke it. The report opens unstyled and without diagrams because it loads resources from a CDN, fails silently when blocked, and the agent cannot see it — it never renders that page — so tell it to use inline CSS and hand-written SVG. One candidate per session. It will almost never say your codebase is fine — an all-Speculative report is it telling you, in the only way it can, that it found nothing.
On-ramp — triage
Other people have filed a pile of issues
Only for issues you did not create. Raw bug reports, feature requests from outside, an external PR that appeared overnight. to-tickets produces tickets that are agent-ready by construction, so running triage on them is wasted effort at best. It recommends and waits: it gives you its category and status judgement with reasons, and applies nothing until you say so.
Everything triaged ends up with exactly one category role and one status role. Two categories: bug and enhancement. Five statuses: needs-triage (you need to assess it), needs-info (waiting on the reporter; back to needs-triage once they reply), ready-for-agent (fully specified, with an agent brief), ready-for-human (the same brief plus why it cannot be delegated), wontfix (closed, with the reason recorded).
wontfix comes in three kinds, and the difference matters because only one of them gets written into the knowledge base. Already implemented: leave a comment pointing at where it lives, and do not file it in out-of-scope — that is a built feature, not a rejected one, and filing it there pollutes the deduplication check. A rejected bug: explain politely and close. A rejected enhancement: write a file in the out-of-scope directory and link to it from the closing comment. That directory holds one markdown file per rejected concept rather than one per issue — and triage reads the whole directory before assessing anything, matching by concept rather than keyword.
Verify before writing the brief. For a bug, follow the reporter's steps; for a PR, check it out and run the relevant tests. Then report one of three outcomes: confirmed with a code path, could not reproduce, or not enough detail to try — which is itself the strongest needs-info signal there is. All of it exists to make the agent brief good, and that brief is written to be durable rather than precise: types, signatures and behavioural contracts, and never file paths or line numbers, because an issue may sit for weeks while the code beneath it moves.
Pitfalls. Labels are not created for you. Five statuses are not enough is the most-cited gap — blocked, deferred and implemented have all been asked for and none shipped. And do not turn it loose on a whole backlog at once — the "show me what needs attention" pass is a cheap list meant for picking from, and across twenty issues an agent quietly treats it as the evidence base — while it returns issue bodies and not comments.
On-ramp — wayfinder
This piece of work will not fit in one session
It takes on work too large for one agent session — where you can name the destination but cannot yet see the route — and draws it as a shared map on the tracker, made of decision tickets, then resolves them one at a time until the route is clear.
It plans; it does not execute. Each ticket holds a question that produces a decision when resolved, rather than a slice of build work. The map is finished when nothing remains to be decided before somebody builds the thing. This is the rule agents break most break.
The boundary against grill-with-docs is session count, not project size. Fits in one conversation: use grilling, which is cheaper and better. Does not fit: wayfinder. Reaching forwayfinder on a well-scoped feature is a common mistake.
Four things on a map. Destination — what the end looks like, named before any ticket exists. Decisions so far — one line per closed ticket, each linking to where the detail actually lives. Not yet specified, the fog of war — decisions you can see coming but cannot yet state precisely. The test is whether you can state the question precisely right now, not whether you can answer it. Out of scope — work judged outside the destination, closed and never graduated. The map is an index, not storage; a decision lives only in its own ticket.
The frontier is the set of tickets that are open, unblocked and unclaimed. A session claims one by assigning it to itself before doing any work, so the assignee is the claim. Tickets are referred to by name throughout, never a bare number — a wall of issue numbers is unreadable in prose.
| Type | Mode | When to use it |
|---|---|---|
| grilling | HITL | The default. The question can be talked out |
| prototype | HITL | "What should this look like?" — a question that cannot be talked out. The artefact links off the ticket as an asset |
| research | AFK | A fact outside the working directory is blocking a decision. Launched while the map is drawn, burning in parallel |
| task | Either | Nothing to decide, but manual work is blocking one — granting access, registering a service, moving data so the shape becomes visible |
task is the only type that does rather than decides, and it exists to unblock a decision, never to deliver part of the destination. It is the type most often got wrong in practice: agents treat it as an implementation step and start writing product code inside the map.research is the one exception to one-ticket-per-session.
Three fatal pitfalls. One: the agent starts writing production code mid-session — the most reported failure. "Plan, do not execute" can be overridden in the map's Notes, and the Notes are written by the agent, so the constraint and its exemption live in the same file, owned by the party being constrained. One user watched an agent write "this map carries execution" into its own Notes, read it back as permission in a later session, and start work on a production server. Two: you still run /to-spec and /to-tickets — after the map is empty — the decision tickets all closed with it, and what remains is a map full of linked decisions, which is not a build plan. Three: do not run grilling tickets in parallel — two sessions share no context, so you get asked in one what you just answered in the other.
And one measured account: "I drew 27 tickets and by the thirteenth none of the rest made sense." Two counters: scope the map to one bounded destination — a well-defined epic performs far better than a vague "implement V1" — and prototype aggressively. The author's phrasing: wayfinder is prototypemaxxing, not planmaxxing.
Standalone — handoff
Something needs to move
It compresses the current conversation into a handoff document — a markdown file written to the OS temp directory rather than the workspace, so a fresh agent can read it and pick up.
What it buys is portability, not compression. That makes it much narrower than it sounds: you only need the file when work has to move. Four triggers: switching harness, moving to another directory or repo, handing work to a colleague, and forking off a side thread found mid-phase.
The most-skipped use is the fork. You stay in your own session and hand a copy of the accumulated context to a second agent working in parallel. The prototype branch works exactly this way: you are deep in a design conversation, hit something only running code can settle, and do not want to spend a hard-won thread on looking it up. Hand off to a prototype session, get the answer, bring it back, and cite it in the original thread.Two crossings, one live conversation, nothing re-explained.
What travels: the live thread — what is in flight, why, and what is next — plus a suggested set of skills. Secrets are masked before writing. It deliberately carries none of what is already written down: spec, plan, ADR, issue, commit, diff are referenced by path or URL, never copied.
Pitfalls. The file lives in a temp directory with a long path that differs per OS — ask for the path and write it down before moving on. Some environments clear temp between sessions, so if the next one will not start soon, copy it somewhere durable. Hand it to the next agent by pointing at the path. Do not paste a summary into a shell command — one containing special characters gets mangled, and the typical failure is silent truncation; "It captures the what and not the why" is fair criticism, so pass what the next session is for as a parameter, and watch for unverified beliefs written down as facts.
Standalone — to-questionnaire
The answer is in somebody else's head
It turns a decision you cannot make alone into a questionnaire for whoever holds the piece you are missing.
It grills the sending, not the subject. Interviewing you about the subject would be pointless — not knowing the subject is why you are writing to somebody else. So it asks only the two things you can always answer: who it is for — their role, expertise and relation to you, which fixes the register and how much context the document has to carry — and what you need back — the specific decision or fact you cannot settle alone, which becomes the checklist the result is measured against. Everything after that is drafting.
The shape of the document: one line of purpose, a short paragraph of context for somebody who has never been inside your head, questions most important first and grouped by topic, one idea per question and never compound, and explicit permission to answer "I do not know" — flagged uncertainty is useful, a confident guess that reads as fact is not. It ends with a catch-all.
It deliberately does not branch and does not take multiple recipients. Three people holding three pieces means running it three times. The commonest use is a grilling that has stalled: run it in the same conversation — it has no ingest t stage, and it works after a grilling purely because that session is already in the context.
Standalone — wait-what
That last answer did not land
The agent re-pitches what it just said: supplying the context you were missing, in plain words, using the vocabulary from your project's CONTEXT.md.
This skill is three lines long, and that is the design rather than an unfinished draft. A skill against verbosity fails by growing: four hundred lines telling a model to be concise still produces verbosity, because what the model reads is the volume, not the plea.
The name is the mechanism. The leading word is wait. "Be more concise" is an instruction about the agent's output, and a model complies by cutting words — leaving you more lost. Wait is about your state: it says understanding failed here. An agent told to be shorter writes a telegram; an agent told "wait, you lost me" will go back and re-pitch. Every popular alternative names the output, and the model overcorrects into a register that is shorter without being clearer. Naming the listener asks for both halves: fewer words and the premise you were missing.
It also says re-pitch that rather than "the last message" — what lost you is usually bigger than one paragraph, and how far back to go is the agent's call. The real cure is establishing shared language in advance; wait-what repairs the one that already went wrong.
Standalone — teach
I want to learn something, over many days
It turns the directory you run it in into a standing teaching workspace, and teaches a subject across multiple sessions through a series of short, self-styled HTML lessons.
It does not teach from what the model already knows. Parametric knowledge is treated as untrustworthy: before teaching it finds high-trust sources, records them, and cites them in every lesson. It is stateful — mission, resources, lessons and learning records all live in the directory as files:
| Path | What goes in it |
|---|---|
| MISSION.md | Why you are learning this. Everything else hangs off it; without it, the first thing it does is interview you until it exists |
| RESOURCES.md | Curated sources, split into Knowledge and Wisdom (Wisdom meaning community sources) |
| lessons/ | Numbered lessons — the main unit of teaching |
| reference/ | Compressed cheat sheets, algorithms, glossaries — the documents you actually return to |
| learning-records/ | ADR-style records of what you have demonstrably learned, used to decide what to teach next |
| assets/ | Reusable components — the first is a shared stylesheet — so the lessons look like one course |
| NOTES.md | Teaching preferences you have stated |
The central idea is storage strength — long-term retention — rather than fluency, the sense of recall in the moment that feels like mastery while reading and is gone a week later. It builds the first with desirable difficulty. Knowledge comes first, and difficulty is the enemy there — it consumes the working memory you need to understand. Skill is drilled afterwards through tight feedback loops, where difficulty becomes the tool.Lessons are rarely reread; reference documents are — so a lesson's compressed essence belongs in the reference directory rather than buried in the lesson that introduced it.
Pitfalls. Files can land in the wrong place (issue 377 — somebody's lessons were written into the global skills directory), so name the directory explicitly at the start. The correct quiz answer is always the first option (confirmed across models, unfixed, and one contributor measured 33 out of 33 across nine lessons). There is no assessment step, so state your existing knowledge and your gaps in the first message. There is no spaced-repetition schedule — ask for revision yourself.
Not only for code — the non-code uses outnumber the code ones in the record. Within code, the strongest use is not learning a language from scratch but finding your bearings in an unfamiliar codebase or a new team's stack. The author suggested a neat combination: when a grilling reaches something you do not understand, do not stop the grilling to learn it — handoff to a teaching workspace, learn it there, and come back.
Standalone — wizard
There is a manual process only a human can do
It generates an interactive bash script that walks a human through a manual procedure step by step — wiring up a third-party service, running a one-off migration, moving a project from state A to state B.
The agent writes the script and never runs it. You run it on your own machine. So a wizard is not instructions you follow — it is a program that drives the process and holds the state, and your part is clicking, pasting and pressing Enter.Stage is one focused task on one screen, and the script clears the terminal between stages.
Scoping comes before the script. It reads your repo rather than asking cold — environment files, compose files, framework config, and every secret and variable reference in the CI configuration. Each of those is a value the wizard must produce. Then it gives you an ordered stage list to confirm, and only afterwards maps each stage to the exact path a human walks. Where it does not know what the current UI looks like, it asks you or checks the documentation rather than inventing the clicks.
The template has already solved the UX: progress, confirmation gates, opening URLs across platforms, hidden input for secrets, idempotent writes to the environment file, writing CI secrets, and a closing summary of what it had to skip. The fixed library half is identical in every wizard and never hand-edited — consistency is the point. The agent writing a wizard never runs it end to end, using static validation instead. The first run is yours, and that run is the test.
Pitfalls. There is no going back a step — a typo at stage three means interrupting and rerunning, which is cheap because values already written to the environment file come back as defaults. Arrow keys are broken in the prompts (issue 741); backspace works. It does not check the state of third-party services. API key never enters the model's context — but a key you pasted into the chat during scoping is in the context like any other pasted text.
Vocabulary — codebase-design
What shape should a module be
It fixes the words you use when designing modules, defines each precisely, bans the loose alternatives, and states the principles that follow from them.
| Word | Meaning |
|---|---|
| Module | Anything with an interface and an implementation. Deliberately scale-independent — a function, a class, a package, a slice across layers |
| Interface | Everything a caller must know to use it correctly — everything: type signatures, plus invariants, ordering constraints, error modes, required configuration and performance characteristics |
| Depth | Leverage at the interface. Deep is a lot of behaviour behind a small interface. Shallow is where the interface is nearly as complex as the implementation |
| Seam | A place where you can change behaviour without editing there. It is the interface's location |
| Adapter | The concrete thing satisfying an interface at a seam. It names the role, not the material |
| Leverage | What the caller gets from depth: more capability per unit of interface learned |
| Locality | What the maintainer gets from depth: changes, bugs and verification concentrate in one place |
Depth is deliberately not defined as implementation lines over interface lines — that metric rewards writing a fatter implementation. What is used here is depth-as-leverage.
Four principles. Depth is a property of the interface, not the implementation. The deletion test: remove the module — if complexity disappears it was a pass-through; if it reappears across N callers it is earning its keep. The interface is the test surface — wanting to test past it means the module is the wrong shape. One adapter is a hypothetical seam; two adapters make it a real one.
Pitfall. Do not use it as a driver (issue 449). Told to "continue and advance the open items", the agent grabs whatever it finds that most resembles an action, re-explores code a previous session already mapped, and runs a long time before asking you anything.Name a driver skill and let this one sit underneath it.
Vocabulary — domain-modeling
The words are fighting each other
It builds and sharpens the project's ubiquitous language while you design — challenging words that conflict with the glossary, forcing a precise term when you reach for a vague one, and stress-testing a relationship with concrete scenarios until the boundaries are exact.
It is an active discipline, not a passive one. Reading CONTEXT.md to borrow vocabulary is a one-line habit any skill can have; this one is for when you are changing the model. Which is why it interrupts you: it writes into CONTEXT.md — mid-conversation, at the moment a term is settled — because the batched version is a session's summary, and the live version is that session's actual output.
Two artefacts, two standards. CONTEXT.md holds terms — what a thing is, in a sentence or two. The threshold for writing is a vague word becoming a formal term; the timing is immediate; and it never holds implementation detail, spec, scratch notes or general programming concepts. An ADR holds one decision in one to three sentences — context, choice, reason — and the threshold is all three at once: hard to reverse, surprising without context, the result of a real trade-off. And it is offered, never assumed.
The rule to actually remember is the CONTEXT.md one, because it is the one that breaks in practice: it is a glossary and only a glossary. Left unattended, a model reads "write it into CONTEXT.md" as permission to persist every answer you gave, and the file becomes a running spec. This is the most reported problem with the skill, across several models.
The move that makes this skill worth having. When you state how something works, it checks the code and lays the contradiction out: "your code cancels the whole Order, but you just said partial cancellation is possible — which is it?" Language and code are forced to agree out loud, before either is changed. Limits: it cross-references only the code and what is already committed, and does not search your issue tracker — so a naming conflict argued out and deliberately settled months ago in a closed issue gets raised again as new.
Pitfalls. CONTEXT.md grows past 500 lines — size is the symptom, not the disease. Tell it directly to make the file concise and strip the implementation detail. Only once the file is genuinely lean and still spans two domains no reader wants in their head at once should you consider splitting it, because splitting a bloated file just gives you several bloated files. Automatic invocation is its weakest point: a grilling that finishes with CONTEXT.md untouched is this happening — name the skill explicitly. An agent-written glossary nobody reviewed is worse than none: it becomes confident-sounding folklore that later sessions treat as truth.
Vocabulary — writing-for-agents
I am writing a document an agent will read
Skills, instruction files, specs, runtime prompts, READMEs — anything an agent reads. Different wrappers, same craft.
Its default move is deletion, not explanation. Ask an agent to write instructions for another agent and most of the words go on explaining what the model already knows — every one of those lines is a no-op: paid for in context, changing nothing. This reference is the lens for finding them, which is why it earns as much on documents you already have as on a blank file.
Two kinds of load. Context load is what permanently loaded material costs in the agent's window: a line in the instruction file, a skill description, anything present every turn whether or not it is ever triggered. Cognitive load is the cost on you: which documents exist and when to reach for which. You are the index. That is not a cost to minimise — it is the price of human control. Once those two are clear, most writing decisions become the same trade-off made in different places.
Five levers. Context pointer — a reference that sits in context, names material outside it, and encodes when to go and fetch it. How reliably an agent reaches through it is decided by the pointer's wording, not its target. Information hierarchy — the ladder from in-file steps, to in-file reference, to reference behind a pointer. Completion criteria — the defence against premature completion. Leading words — compressed concepts already in the model's pre-training, anchored twice: in the body for execution, in the pointer for triggering. Pruning — single source of truth, relevance, and the no-op test applied sentence by sentence.
The no-op test is behavioural, not aesthetic. Delete the line and ask whether the agent's behaviour changed. A sentence that fails it gets deleted whole rather than reworded. When people disagree about one, run the document to settle it rather than arguing. The tests: the document gets better as it gets shorter, and you will be surprised how little is left. Nothing is said twice — repetition is the most reliable sign a document has never been tested.
Standalone — grill-me
I have an idea that has not taken shape
It interviews you about a loose idea until you can commit to it. You do not need a worked-out plan to start — producing that plan is what the session is for. It is stateless: no files, no workspace. What remains is the sharper version in your head. The subject need not be code and you need no repo.
Turn plan mode off. It pushes the agent to produce a plan quickly, which is the opposite of staying in the question.
What it looks like when it is working. You disagree with something — a session you never pushed back in is a session you did not need. Questions arrive in a few rounds rather than a long drip, and later rounds visibly build on what you said earlier. You end up somewhere you did not expect, because a question turned over a decision you had been making implicitly. And by the end you can defend every choice to somebody who was not in the room.
Count rounds, not questions. Forty-six questions across four rounds is an ordinary session. Two hundred means the scope is too large — and a very long session drifts into the dumb zone, where the context window is full enough that question quality drops. Once the grilling is done and you are committed, do not start a new session — that conversation's context is the value.
Router — ask-matt
I do not know which one to reach for
It recommends, then stops. No grilling, no spec, no files opened, and it will not launch the skill it just named — what you get is what to type next, and then you type it. The unit it thinks in is a flow: a path through skills rather than a single skill.
Honest limits worth knowing. It is a hand-written map, it lags the repo, and it only knows this pack's skills. It will tell you half the skills are not installed — known and unfixed: most of what it routes to is user-invoked, the harness leaves those out of the list it injects, and the agent treats that list as complete and reports them missing.They are installed.
It can also describe another skill's behaviour wrongly, answering from its own one-line summary rather than from the skill. One detailed report traced three instances in a single session, including advice to skip to-spec — that SKILL.md was never opened, and the cost was a missed seam check and tickets that underestimated the work. When it makes a load-bearing claim about another skill, have it open that SKILL.md.
Where it sits. ask-matt is a secondary source above the pack. When the router and a SKILL.md disagree, the SKILL.md is right.
07
Four worked scenarios
The main-line example is in section 05. These are the four next most common situations.
Scenario A — intermittent 500s in production
The situation. A customer reports that submitting sometimes returns a 500, and you cannot reproduce it.
- Somebody else reported it, so take the on-ramp:
/triage. Can you reproduce it from their steps? If not,needs-info— or decide to chase it now. - Chasing it now means a fresh session:
/diagnosing-bugs, and say explicitly "build me a loop that goes red first".
Phase 1 is the only hard gate, and the only one you need to watch
It must hand you a command that has already been run, with its output pasted in, and that is red on this bug. For an intermittent bug the goal is not a clean repro but a higher reproduction rate. With no red command, do not let it into phase 2. When it starts guessing, pull it back.
The rest is mechanical: minimise, with every remaining element justified as load-bearing; three to five ranked falsifiable hypotheses, which is the only human checkpoint; tagged probes; the regression test before the fix; clean up; and the hypothesis that turned out right written into the commit message.
One branch to know about. When there is no correct seam for that regression test, it should say so rather than write a shallow test that gives false comfort — "there is no seam" is itself the finding, and it goes to improve-codebase-architecture.
Scenario B — inheriting a legacy repo nobody tidied
The situation. You have joined an eight-year-old project, or inherited a vibe-coded repo. No ADRs, no domain language, no design principles.
- Day one.
/setup-matt-pocock-skillsfor the tracker and document layout. - Day one.
/grill-with-docs, asking it to build up this existing repo throughCONTEXT.md. Expect a long interview — some report more than fifty questions before the file took shape — and steer it actively. It reads the code and asks you what it found, and which of the words already in the code are the right words is yours to decide. - Day two.
/improve-codebase-architecture, opening with "do not grill me, give me the report first". An all-Speculative report means it found nothing; pick a Strong candidate. - Day two. One candidate at a time: let it grill that candidate, and the output is a decision rather than a diff. Then on to
to-spec,to-tickets,implement. - Afterwards. Rerun the architecture survey every few days as maintenance.
Why that order
Establish the shared vocabulary first and the architecture survey's output improves dramatically — candidates come back named "the Order intake module", in your words, rather than "FooBarHandler".
Honest expectations. On genuinely out-of-control projects, people report it "helped a bit and was not enough"; on an eight-year-old legacy codebase somebody watched the model circle in place, while the same skill produces a clean map on a tidy repo. There is currently no skill dedicated to this case.
Scenario C — a large greenfield project
The situation. A new product module from nothing, with no clear route, and obviously more than one conversation can settle.
- Make sure the five
wayfinder:labels exist —ghfails outright on one that does not. /wayfinder. The first act is naming the destination. It is asking for the destination of the whole map, not of this session; scope it to one bounded epic rather than "implement V1".- It runs one breadth-first grilling and draws the Destination, Decisions so far, the fog, and Out of scope. The test between fog and ticket is whether you can state the question precisely right now. If the opening grill finds no fog at all, it should stop and say this is too small to need a map.
- Research tickets are launched while the map is being drawn and burn in parallel; the rest go one at a time, claimed by assigning them to yourself.
- For each one resolved: post the resolution comment, close the ticket, leave a line on the map, and then stop. Clearing fog ahead of it graduates whatever is now stateable into new tickets.
- Once the map is empty:
/to-spec #<map_issue>— pass the map itself, not an individual decision ticket — then/to-tickets,/implement.
The three fatal pitfalls are listed under wayfinder in section 06: the agent starts writing production code, do not skip to-spec, do not run grilling tickets in parallel.
Scenario D — a decision that is not about code at all
The situation. A business decision — whether to start a product line, how to price a proposal, the argument structure of an article.
- Start a clean conversation — you do not need to be in a repo — turn plan mode off, and run
/grill-me. - Answer round by round, numbered, in one go. Push back on questions pitched too shallow; say so when the scope is drifting; "I do not know" is a real answer.
- A question you can only answer once you see something is ungrillable. Outside code that usually means: sketch a page, build a spreadsheet, or ask one customer.
- When the answer is in somebody else's head, run
/to-questionnairein the same conversation, send it, and start the next round when the answers come back. - It is stateless: no files, no workspace. What it leaves is the sharper version in your head.
08
Known pitfalls
Ordered by the symptom you notice first. Serious means it costs you money or time.
| Symptom | Serious | What to do |
|---|---|---|
| The agent says some skills are not installed | — | User-invoked skills do not enter the model's list. They are installed. Type it anyway. The authority is .claude-plugin/plugin.json |
gh says the label does not exist | — | setup does not create labels — run gh label create once |
| The interview dumps every question at once with no recommended answers | — | grilling grilling or domain-modeling did not load. Ask the agent which skills it loaded |
A good interview but CONTEXT.md never changed | — | domain-modeling domain-modeling did not load. Name it explicitly |
CONTEXT.md has grown past 500 lines | — | It absorbed implementation detail. Tell it directly to make the file concise and strip that out |
| Reading the spec keeps getting truncated | Serious | Between those two steps, do not clear or compact. Run both in the same window |
| Twelve tickets for a three-line change | — | Tell it to merge them at the interrogation step. If the change really is small, go straight to implement and skip this skill |
| Tickets cut one per layer | — | Ask each ticket what it can demo when done; if the answer is not a behaviour, it is a horizontal slice |
| No sub-issues created; blocked-by only in the body | — | Known and unfixed. Do it afterwards with gh issue create --parent, --add-sub-issue, --blocked-by |
| Acceptance criteria already pass before any work starts | — | For each one, ask what observation would prove it false, and confirm it is red at the starting commit |
/implement #2 did something entirely unrelated | Serious | #2 resolves against any numbered list it can see. Pass the full URL and have it read the title back |
| It finished but the ticket is open and criteria unticked | — | Expected behaviour — there is no closing step. Close the ticket yourself, so the dependency chain can advance |
| code-review says it cannot see my changes | — | It diffs to HEAD, excluding anything uncommitted. Commit first, then review |
| Several implements in parallel produced strange git states | Serious | Not supported in one checkout. Use a worktree, though the stash is still shared |
| Name collision with the built-in code-review | — | Remove the built-in one, or fork this under a new name |
| Review sub-agents spawn more agents | Serious | Known and unfixed; one run reached more than fifty. Watch the agent count when running unattended; add a line to the fork forbidding further spawning |
| Every review run finds something new | — | No convergence guarantee. Treat it as a list of leads, act on the ones backed by a written rule, then stop |
| Research burned 450k tokens | Serious | nesting bug (issue 530). It spawns a second copy of itself. Check the background task list after invoking it |
| You wanted one answer and it went off building a repro | — | Say "answer directly, do not diagnose", or turn off its model invocation |
| It writes the implementation before the test | — | It happens; the skill lives with it. If a slice needs strictness, watch it run |
| It writes a browser test first and then spins | — | Declare it in the repo instruction file: browser tests come after the behaviour works |
| The architecture report opens unstyled and without diagrams | — | An external CDN was blocked. Tell it to use inline CSS and hand-written SVG |
| It grilled me for an hour instead of offering options | — | Say "do not grill me, just give the report" when invoking it |
| Saying "go" to a vocabulary skill burned 100k tokens | Serious | It has no flow. Name a driver skill and let it sit underneath |
| The wayfinder agent started writing production code | Serious | Notes can override "plan, do not execute", and the Notes are written by the agent. Read the Notes first |
| By ticket 13 of 27 the rest stopped making sense | — | Scope the map to one bounded epic, and prototype aggressively |
| Three paragraphs per grilling question, and it is exhausting | — | Lower the reasoning effort and add a plain-language line to the global instruction file. Unresolved |
| The handoff file has gone | — | Temp directories get cleared. Ask for the path and copy it somewhere durable if you need to |
| Lessons were written into the global skills directory | Serious | issue 377. Name the directory explicitly and confirm where the first lesson lands |
| The correct quiz answer is always A | — | Known and unfixed — 33 out of 33. Treat position as meaningless, or ask for a component that shuffles at render time |
| A typo in the wizard and no way back a step | — | There is no back. Interrupt and rerun — saved values come back as defaults. Arrow keys are broken; use backspace |
I edited a SKILL.md and the update wiped it | Serious | npx skills update overwrites it, and plugin installs are read-only. Put long-term behaviour in your own instruction file |
09
Suggested lines for your own instruction file
This is customisation through the supported route — edits to a skill file get overwritten; these do not. Copy the whole block into your CLAUDE.md or AGENTS.md.
## Agent behaviour
- When grilling, ask one question at a time.
- Do not start implementing without my explicit permission.
- Browser and end-to-end tests are written after the behaviour works,
never as the first red test.
- Keep questions and recommendations short. One paragraph maximum
per question.
- When a skill asserts something about another skill's behaviour,
open that skill's SKILL.md before acting on it.
- code-review sub-agents must not invoke /code-review or spawn
additional agents; perform the review directly.
What each line prevents
- One question at a time: restores the single-question rhythm. Recommended for anyone reading slowly, working in a second language, or who needs the scaffolding to focus.
- Do not start implementing without permission: stops grilling starting work of its own once the frontier empties — which happens on weaker models and at low effort.
- Browser tests last: stops tdd writing Playwright first and spinning.
- Keep questions and recommendations short Mitigates verbosity in wayfinder and grilling.
- Open the
SKILL.mdbeing asserted about first. Stops ask-matt misdescribing another skill from its own summary. - Review sub-agents must not spawn agents. Stops runaway fan-out — this is the line fork users measured as effective.
10
Vocabulary
These are the shared language of the whole pack. Without them, the output of a skill will not read.
| Word | Definition |
|---|---|
| Seam | A place where you can change behaviour without editing there. Tests live on seams. It is the interface's location |
| Pre-agreed seam | A seam agreed before any code is written. This is why the tests last: the implementation underneath can be rewritten without touching them |
| Tracer bullet | A thin but complete path through every layer, demoable on its own the moment it lands |
| Vertical / horizontal slice | Vertical is one path through every layer, and correct. Horizontal is one layer at a time, which is wrong and the most common failure |
| Deep / shallow module | Deep is a lot of behaviour behind a small interface; shallow is where the interface is nearly as complex as the implementation |
| Deletion test | Imagine deleting the module: does complexity concentrate behind a smaller interface, which earns its place, or spread out to the callers, which makes it a pass-through |
| Locality / Leverage | Locality is what the maintainer gets — changes concentrate in one place. Leverage is what the caller gets: behaviour per unit of interface learned |
| Design tree / Frontier / Round | A design tree is decisions hanging off decisions; the frontier is the set of decisions whose prerequisites are all resolved; a round asks the whole frontier at once |
| Grillable / ungrillable | A question that can be talked out, against one that needs something to react to, which goes to prototype instead |
| Fog of war | A decision on a wayfinder map you can see coming but cannot yet state precisely |
| Decision ticket | The wayfinder unit: it holds a question that produces a decision when resolved. It is not a slice of build work to execute |
| Destination | What the end of an entire wayfinder map looks like. Naming it is the first act of drawing one |
| Spec / Ticket | A spec is the destination and the decisions fixing it, and it is kept. A ticket is an execution step toward it, and is thrown away once used |
| Primary / secondary source | Primary is the conversation itself, commits, official documentation, and source code. Secondary is any summary. Primary wins on conflict |
| Context pointer | A reference in context that names material outside it and encodes when to go and fetch it |
| Progressive disclosure | Moving reference material only one branch needs behind a pointer, keeping the main file readable |
| Context load / Cognitive load | The first is what permanently loaded material costs in the model's window. The second is what knowing which documents exist and when to use them costs you |
| No-op | A line of text whose deletion changes no agent behaviour. It is paid for in context and changes nothing |
| Leading word | A compressed concept already in the model's pre-training — tight, red, tracer bullet — that the agent thinks with |
| Storage strength / fluency | Long-term retention, against the sense of recall in the moment — the second reads as mastery while you are in it and is gone a week later |
| Smart zone / dumb zone | The context window still has room, against being full enough that quality drops |
| HITL / AFK | Human in the loop — it needs a live exchange — against something that finishes without you there |
| Phase boundary | Between two blocks of work; the only place to ask what to do with your context |
| Expand–migrate–contract | The three stages of a wide refactor: add the new form beside the old, move call sites in batches, delete the old once nothing calls it |
11
Seven antipatterns
The most common ways this gets used wrong.
- Passive grilling. Forty "agreed"s and out comes a plan the agent wrote and you nodded at. A session you never pushed back in is a session you did not need.
- Clearing or compacting between to-spec and to-tickets. Almost everything you grilled out lives only in that context window. Cut it and the spec quietly loses what you actually decided.
- Running triage on tickets you generated.
to-ticketsproduces agent-ready tickets by construction. Triage is the on-ramp for work other people filed. - Reaching for wayfinder on a well-scoped feature. The test is session count: if it fits in one conversation use
grill-with-docs, which is cheaper and better. - Using a vocabulary skill as a driver. Say "go ahead" to
codebase-designordomain-modelingand the agent invents a process and burns a lot of tokens. Name a driver. - Running the review in the coding session. Reviewing yourself in the same context is not review; it is confirmation bias with a slash command attached.
- Customising by editing
SKILL.md. Updates overwrite it and plugin installs are read-only. Put long-term behaviour in your own instruction file.
And one meta-antipattern
Treating the process as a substitute for thinking. The author takes the opposite position in the README: approaches that help by taking over the process charge you your control for it, and make bugs in the process itself hard to fix. These skills are deliberately kept small, editable, and composable. Output quality tracks the quality of your answers, not the number of questions.
12
A 14-day learning plan
About 30 to 60 minutes a day, on a real project of your own.
| Day | What to do | How to know it passed |
|---|---|---|
| 01 | Read the three underlying ideas; install the plugin or skills.sh (pick one); run setup in a repo; create the labels | Three files exist under docs/agents/, and the instruction file has ## Agent skills |
| 02 | /grill-me on a non-code decision. Practise pushing back on purpose | At least three push-backs, and you can defend every choice to someone who was not there |
| 03 | /grill-with-docs on your existing repo for one small feature | CONTEXT.md grows line by line as you go, and 0 to 1 ADRs come out |
| 04 | Continue in the same conversation with /to-spec. Read the seam and out-of-scope sections properly | You remember making every decision in the spec |
| 05 | Continue in the same window with /to-tickets. At the interrogation step ask each ticket what it can demo | Every ticket demos a behaviour, and the top one has no blockers |
| 06 | /implement the first ticket (full URL) and watch the trace throughout | You can see the tdd call in the trace, and it reaches a commit |
| 07 | Run /code-review main in a fresh session. Chase every citation | Two separate reports, and you reject at least one finding |
| 08 | Read the codebase-design vocabulary as a dictionary, not a process | The words component, service, and boundary stop appearing in your design talk |
| 09 | Hit a question that cannot be talked out and run /prototype | A shareable HTML file or a few structurally different variants, and a one-line answer |
| 10 | Run /diagnosing-bugs on a real bug. Watch the Phase 1 gate closely | You see red command output before you see the first theory |
| 11 | /improve-codebase-architecture — remember to say "report first" — and pick one Strong candidate | An HTML report, and one candidate grilled into a decision |
| 12 | Practise a fork with /handoff: keep the main conversation and open a parallel session | The original session is untouched, and the new agent starts work without you re-explaining |
| 13 | Practise /wait-what and /to-questionnaire, and write section 09 into your instruction file | The re-explanation is shorter and clearer, and the questionnaire can be sent as is |
| 14 | Run /wayfinder on work that is genuinely too big, scoped down to one bounded epic | The destination is written before any ticket, and every open ticket reads as a question |
The rhythm afterwards: the main line daily, the architecture sweep every few days, and /teach opening a dedicated directory whenever a skill needs filling in.
13
One-page cheatsheet
Once per repo
/setup-matt-pocock-skills— tracker, labels, and document layout
The main line, idea to ship
/grill-with-docs— there is a repo, and one session covers it/to-spec— only needed across sessions. Same window, do not clear/to-tickets— cut tracer bullets and declare blocking edges. Same window/implement <full ticket URL>— one ticket per session, clear in between/code-review <fixed-point>— run in a clean session, commit first
On-ramps
/triage— issues other people filed/wayfinder— it does not fit in one session. Clear, then come back to/to-spec/improve-codebase-architecture— a structural check-up every few days
Any time
/grill-me— no repo, no files, and the subject need not be code/prototype— design questions that cannot be talked out, one question at a time/research— external facts. Runs in the background; check it did not spawn twice/diagnosing-bugs— hard bugs. No guessing before there is a red loop/resolving-merge-conflicts— you are already stuck in a conflict/wizard— manual processes only a human can do/handoff— something needs to move, or you are forking a branch/to-questionnaire— The answer is in somebody else's head/wait-what— you did not follow what just went past/teach— learning a subject across many days/ask-matt— you do not know which one to use. It recommends, then stops
The vocabulary layer. Do not use it as a driver
codebase-design, domain-modeling, grilling, writing-for-agents
Five options at a phase boundary, judged in order
continue → clear → handoff → subagent → compact
Sources
What this tutorial is based on
Based on the mattpocock/skills plugin version 1.2.3, covering the 25 published skills. Written and rewritten after reading that repo's README.md, CONTEXT.md, all 25 official skill documents, .claude-plugin/plugin.json, and CHANGELOG.md. The repo is released under the MIT licence.
This page is a tutorial written independently by TauX. It is not a translation or a reproduction of the official documentation. The skills themselves, their names, and their behaviour belong to the original author. The arrangement, the tests, the terminology, and every comment on this page were written by TauX and do not represent the original author's position.
Every issue number here is an issue in that repo, and most were still open at the time of writing. That means two things: the pitfalls are real, and they may already be fixed. If something behaves oddly, search that repo for the symptom first — the best fate for a hard-coded list of pitfalls is that one day all of it expires.
The version marker is not decoration. These skills move fast — to-prd was renamed to-spec in v1.1, and the refactor stage of tdd was removed in June 2026 — and without a version number a reader cannot tell which part of a tutorial still holds.
Want this flow inside your own team?
The tools are public. The hard part is wiring them into the tracker, the standards, and the delivery rhythm you already have. That part we have done before.