An atelier for the way you build.

Install TBaguette’s Atelier

Install (or update) TBaguette’s Atelier — a skills library for coding agents — into whichever agent you are. Use your shell tool. Before you start: confirm git is available (git --version). If it isn't, tell me and stop — there's nothing else to try. It is a single git repo, https://github.com/LeSplooch/tbaguette-skills.git, shipping an integration for each harness it supports (Claude Code, Codex, Cursor, Devin, GitHub Copilot CLI, Copilot in VS Code, Copilot coding agent, Gemini CLI, Hermes, Kimi Code, OpenCode, Pi). Work out which one you are running in, then take the matching route — you know your own install mechanism better than this prompt does. If you genuinely can't tell which one you are, say so and ask me, rather than falling through to the first route below. Route A — you read Claude Code's skills directory. Target: ~/.claude/skills/TBaguette (Windows: %USERPROFILE%\.claude\skills\TBaguette). Figure out which case applies: 1. <target>/.git exists — update in place: git -C <target> pull. 2. <target> doesn't exist, or exists and is empty — install fresh: git clone https://github.com/LeSplooch/tbaguette-skills.git <target>. 3. <target> exists, has content, isn't a git repo, but contains CATALOG.md and skills/ — this is very likely a previous TBaguette install that lost its own git history. Say that plainly, not a "naming collision", and ask me whether to move it aside and re-clone, rather than doing that yourself. 4. Anything else already at that path — stop. Do not delete or modify it. Tell me there's a naming collision that needs a manual look. Route B — you install plugins or extensions from a git URL with your own command. Use it, against this same repo: Hermes is `hermes plugins install LeSplooch/tbaguette-skills --enable`, where the flag is not optional — Hermes only prompts to enable a plugin when it has a terminal to prompt in, so run from a tool it would otherwise install disabled and load nothing. Hermes also security-scans what it installs, and this library trips that scan: a hundred skills about secrets, untrusted input and shell scripting read, to a pattern matcher, like the things they teach you to watch for. The findings are informational. If the scan stops the install because there is no terminal to confirm in, show me the report and the command and let me decide — do not re-run it with --force on my behalf. Kimi Code is `/plugins install https://github.com/LeSplooch/tbaguette-skills` from inside a session or `kimi plugin install https://github.com/LeSplooch/tbaguette-skills.git` from a shell, Gemini CLI is `gemini extensions install https://github.com/LeSplooch/tbaguette-skills`, Codex is `codex plugin marketplace add LeSplooch/tbaguette-skills` and then installing tbaguette-atelier from it. GitHub Copilot CLI takes two steps rather than one, because the install command needs a marketplace to name first: `copilot plugin marketplace add LeSplooch/tbaguette-skills`, then `copilot plugin install tbaguette-atelier@tbaguette-dev`. In VS Code it is not a shell command at all — tell me to run **Chat: Install Plugin From Source** from the Command Palette and paste https://github.com/LeSplooch/tbaguette-skills.git when it asks; don't clone anything yourself in place of that. If it's a command only I can type, print me the exact line instead of substituting a filesystem clone for it. Route C — you load plugins from a config file. Show me the exact entry and ask before editing — never edit my config silently. On OpenCode that entry is "tbaguette-skills@git+https://github.com/LeSplooch/tbaguette-skills.git", added to the "plugin" array in opencode.json. If you are the Copilot coding agent, the file is .github/copilot/settings.json in the repository you are working on, and both fields are objects rather than arrays: "extraKnownMarketplaces" gets {"tbaguette-dev": {"source": {"source": "github", "repo": "LeSplooch/tbaguette-skills"}}} and "enabledPlugins" gets {"tbaguette-atelier@tbaguette-dev": true}. That edits a repository I share with other people, so show it to me and wait, the same as any other config. Route D — none of those. Don't invent a path. Find the directory your harness actually reads: its own dotdir in my home directory, or an existing skills/, plugins/, or extensions/ folder — confirmed to be there, not assumed. Clone-or-pull into a TBaguette-named directory inside it, following Route A's four cases. If nothing you find is clearly right, clone nothing: tell me what you checked and ask. Whichever route: never delete, move, or overwrite anything to make room. If the clone or pull command itself fails (network, permissions, auth), show me the actual error rather than retrying blindly or guessing why. After a successful install, verify rather than assume. For a clone you placed yourself: - <target>/.git exists and git -C <target> rev-parse HEAD succeeds. - <target>/CATALOG.md exists and <target>/skills/ is non-empty. - Read <target>/.claude-plugin/plugin.json's "version" field, if present, so you can tell me which version I'm now on. For a harness-managed install, verify it the way your harness reports installed plugins — on Hermes that is `hermes plugins list`, and the row has to say enabled, not just present. Then tell me what happened (installed fresh, updated, or already current), which version, and the reload step for my agent specifically — restarting it, Claude Code's /reload-plugins, Kimi Code's /new, Hermes' `hermes gateway restart`. Skills then invoke as tbaguette-atelier:skill-name. Flag one more thing, because it applies to this very conversation: this session started before the install, so it is still running on the skill list it had at startup, and nothing you just did changes that. Tell me to open a new conversation to pick up the latest — or, if I want to stay in this one, to invoke tbaguette-atelier:using-tbaguette here (if you have no skill tool, read skills/using-tbaguette/SKILL.md from the install instead).

Paste into whichever coding agent you use — it works out which harness it's in and installs the right way for it. It needs a shell tool, which rules out Claude Desktop; on Claude Code it's been exercised against Claude Sonnet (Max).

Only ever touches this folder — verified against your other skills, not just claimed. See how.

Restart your agent (in Claude Code, /reload-plugins), then invoke a skill as tbaguette-atelier:skill-name. On Claude that means Claude Code specifically — the Claude Desktop app and claude.ai chat load skills from your account instead of this folder, so cloning here won’t make them appear there.

A conversation that was already open when you installed or updated — including the one you installed from — is still running on the skill list it started with. Open a new conversation to pick up the latest, or invoke tbaguette-atelier:using-tbaguette in the old one.

New to the Atelier? Getting started walks through the reload, how skills fire without being asked, and what to do when nothing seems to happen.

102 Claude Code skills for the craft between the ticket and the commit, across 12 categories — findable by name, browsable below, and written like something a colleague actually handed you. Grown out of my own projects over time, this collection is created and updated automatically — and often — by Claude Opus, always its latest version, as I code.

Show me the skills

Fresh from the oven

Last 48 hours

Update notes

  1. A climb mod, and Claude Code can dispatch TBaguette's implementer, reviewer and investigator by name

    • New, and separate from the skills: climb, a Claude Code mod in the same marketplace (/plugin install climb --marketplace LeSplooch/tbaguette-skills). Start it with /climb 20 npm test: the mod queues the first iteration, then after every iteration it runs the check itself, so the model's own account of how it did never counts. It logs exit code, score (from a score: N line), check time and turn time to .climb-log.tsv, refuses edit-tool changes to paths you protect, and queues the next iteration until the check passes, the budget runs out, the score stops improving, the check hangs, or you stop it. A prompt you send yourself mid-climb is answered normally and does not count. --in <folder> runs the check, keeps the log and resolves protected paths in another folder. A band above the prompt shows the trail. It is the tool half of designing-verifiable-goals, which now points to it. The mod API is early access, and nothing in the skills depends on the mod.
    • The three delegation roles that Copilot CLI already had are now Claude Code agent types too: tbaguette-atelier:implementer, tbaguette-atelier:reviewer and tbaguette-atelier:investigator, shipped in the plugin's agents/ folder. Each carries its role's standing rules from delegating-tasks-with-review-gates, so a dispatch holds only the task itself instead of the whole pasted template. The reviewer and investigator have no edit or write tool (they keep a shell, so this limits them rather than sealing them). None pins a model: name one per dispatch.
    • delegating-tasks-with-review-gates now says to dispatch those types where the harness lists them, rather than a general-purpose agent.
Read all 20 updates
  1. A climb mod, and Claude Code can dispatch TBaguette's implementer, reviewer and investigator by name

    • New, and separate from the skills: climb, a Claude Code mod in the same marketplace (/plugin install climb --marketplace LeSplooch/tbaguette-skills). Start it with /climb 20 npm test: the mod queues the first iteration, then after every iteration it runs the check itself, so the model's own account of how it did never counts. It logs exit code, score (from a score: N line), check time and turn time to .climb-log.tsv, refuses edit-tool changes to paths you protect, and queues the next iteration until the check passes, the budget runs out, the score stops improving, the check hangs, or you stop it. A prompt you send yourself mid-climb is answered normally and does not count. --in <folder> runs the check, keeps the log and resolves protected paths in another folder. A band above the prompt shows the trail. It is the tool half of designing-verifiable-goals, which now points to it. The mod API is early access, and nothing in the skills depends on the mod.
    • The three delegation roles that Copilot CLI already had are now Claude Code agent types too: tbaguette-atelier:implementer, tbaguette-atelier:reviewer and tbaguette-atelier:investigator, shipped in the plugin's agents/ folder. Each carries its role's standing rules from delegating-tasks-with-review-gates, so a dispatch holds only the task itself instead of the whole pasted template. The reviewer and investigator have no edit or write tool (they keep a shell, so this limits them rather than sealing them). None pins a model: name one per dispatch.
    • delegating-tasks-with-review-gates now says to dispatch those types where the harness lists them, rather than a general-purpose agent.
  2. Before a long run starts, build the check it will climb

    • New skill, designing-verifiable-goals, for the moment a goal is about to be handed to a run that will iterate on its own for hours or days: a loop or goal command, an overnight port, "do not stop until it is twice as fast". What such a run actually pursues is the check it is graded against at each iteration, so the skill has you build that check first. Use the strongest kind that exists: a pinned reference, then measured behaviour, then a model judging, with a person only at checkpoints. Make failures part of what must match, keep a slice of cases the run never sees, put a speed target behind correctness rather than trading against it, and write the bar where you want the run to stop, because it will stop there. When the check is a model judging likeness to a reference, the skill treats that judge as something the run will optimize: the reference you pick decides the result, and the judge counts only once it has rejected a deliberately broken copy. It also covers what goal texts usually leave out: a line per iteration, written by the harness rather than the run, logging time spent waiting against time spent working, and a second session asking on a schedule what is blocking the run.
    • evaluating-llm-output now says what changes when a judge sits inside a loop that iterates until it approves: each of its leanings becomes the direction the output moves, so re-check it against what the loop produced, not against what existed before.
    • fanning-out-independent-work now treats memory and cores as a shared surface, next to ports and temp space. When several workers each run a heavy build or test suite on one machine, their footprints add up, and past the edge the operating system can kill the dispatching session itself along with its background agents. Before dispatching, measure one heavy step's peak memory (/usr/bin/time -v reports it on Linux), multiply it by how many workers will hit it at once, and compare that with available memory. If it does not fit, queue the heavy step and keep the rest parallel, and commit work in progress as soon as it builds. The skill now also triggers when several workers will build or test on one machine.
  3. A change too large for one reviewer is read by several, each on one area

    • handing-off-for-review now covers the change that cannot be split: a hand-merged result of parallel workers. Give each reviewer one area chosen by where the change can fail, a detached copy of the one commit under review so line references stay true while the authors keep working, and the instruction that the authors' reports and passing tests are not evidence. Ask for defects only, each with a failure scenario, and keep the readers apart until every report is in. Verify each claim in the code, then take the fixes in order of independent agreement: two readers naming the same defect in different words is stronger than one reader's severity label, though a lone report still gets verified rather than dropped. Its description: now routes to it.
  4. Verify the upload before you publish the pointer, not after

    • deciding-reversibility now says where the check goes when a release uploads files and then flips one cheap pointer that running clients poll — a manifest, a tag, a DNS record. Fetch each file from its public address, hash the bytes you received and compare with the digest the pointer is about to carry, and make the flip conditional on that comparison; afterwards check only that the pointer is being served. A bad upload then cannot roll out at all, where the same finding after the flip arrives once the first clients have already run it. Its description: now covers the case, and a symptom row and a red flag carry it.
  5. A limit the owner changes mid-run is a ruling, and a pause ends when they say so

    • orchestrating-work-end-to-end now has a row, in its table of envelope changes, for the moment an owner sets, tightens, lifts or replaces a bound on a running job: a pause until told to continue, a cap on parallel agents, a spending ceiling. Each change goes into the Rulings log with its value, who set it, when and what lifts it; older lines stay as written and the new one names what it replaces, so the newest is the whole bound. The run also says which of its work it touches and, if the owner meant it for other sessions too, tells them in the same message. A new paragraph under the table covers the pause that matters most: it is lifted by what it names, not by the clock, so a run that resumes because a quota reset has swapped its own condition for the owner's.
  6. An approved release note is approved wording, not checked facts

    • writing-release-notes now says that approving a note does not check the details in it. An approver usually reads for tone, for what is in and what is left out, and takes every count, name, default and limit on trust from whoever drafted it, so a detail written from memory and then approved has been checked by no one. Re-derive each one from the code, configuration or data it describes, at the latest after the approval and before the note goes out; correct a slip without asking again and say so, and go back to the approver only when a correction changes what the line means. Its description: now covers a note someone approved that is about to be published, and a symptom row carries it.
  7. A retry refused by a check its own first attempt passed

    • designing-for-idempotency now says where the key lookup goes: after authentication and before any precondition on state. A first attempt that succeeded changed the state its own checks read (the balance it debited, the stock it reserved, the name it claimed), so a retry that validates first is refused, and the caller who lost the first response hears insufficient balance about an operation that went through. On a hit the handler answers from the key's record without re-validating. It also warns that a failure path which undoes "the record for this key" deletes the first attempt's success when this attempt is a retry, and says to undo only what this attempt wrote. A symptom row carries it.
  8. A peer handed the same request is crew, even in a checkout of its own

    • orchestrating-work-end-to-end now reads the Crew dial past the checkout. A requester can give one request to two sessions without saying so; each works in a quiet tree of its own and reads solo, the two builds diverge wherever the request left a choice open (the storage shape, the names on the wire), and they first meet at the live target both deploy to. The envelope reference now says to read what peer sessions are working on when the run is routed and again before the first live step, and to settle one owner by message before design, while the other build is still a plan; when peers cannot be listed, to ask the requester. It reads as shared tree, and the dial table, the mid-run table and a failure row carry it.
  9. Files you staged in a shared checkout are the next writer's to commit

    • atomic-commits now covers the other direction of a sweep. Its shared-tree section warned against staging someone else's files; it now says that files you stage and leave between commands are committed by whoever next runs a git commit that names no paths, under their message, however carefully you named your own paths. The rule is to commit with the paths repeated on the commit (git commit -m "<message>" -- <paths>), which also keeps another writer's staged files out of yours, and to leave nothing staged when a command ends. It notes the two cases that form does not reach — a new file, which needs its add in the same command, and a hunk-level split, which would commit the whole file — and how to undo a sweep that has not been pushed. A symptom row carries it.
  10. A dedupe key per route lets a second route re-send what the first already handled

    • designing-for-idempotency now separates the retries of one operation from two operations aimed at one target. Where the rule is "once per target" and two routes can do it — a single reply and a bulk reply command, a webhook and a nightly sweep — a key minted per operation or scoped per route only dedupes each route against itself, so the second one re-sends what the first handled, every key correct and no retention window long enough to help. It says to check the target's own state on every route (reserved atomically), or key on the target in one shared store, and to read every line of a bulk send's dry run until then. The scope rule now says operation type names the effect, never the code path, and the description: and a symptom row carry the new case.
  11. Four quiet failures named: a shell loop that stops early, committed output that drifts, a retention rule that eats the archive, a path rule that waves code through

    • portable-shell-scripting now warns that a command inside a while read loop shares the loop's stdin and can eat the lines not yet read: ssh, cat, an installer's prompt or a nested read is enough, and the loop ends with status 0 having handled one or two lines. It says to give such commands </dev/null or feed the loop from another descriptor, and to test with at least two input lines. The description: now routes this case to the skill.
    • keeping-copies-in-sync now says that generated output stops being safe from drift the moment it is committed: a served site or checked-in client is a second copy again, and commits made with hooks off, merges and hooks that regenerate from unstaged edits all publish it stale. It asks for the check where the output becomes public, on the pushed revision built by its own generator, and not on the working tree. The description: now routes this case to the skill.
    • deciding-reversibility now treats a retention rule as a way a safety net gets cut: a "keep the newest N" or "older than D" job names a folder and a clock, so a deliberate archive sitting beside rolling copies is the oldest file there and is deleted first, silently. It asks you to match the rotating kind of file by pattern, keep what must survive where no rotation reaches, and name the oldest file a rule would take before arming it. The description: now routes this case to the skill.
    • reviewing-code-deeply now covers the path-shaped exemption: a rule that lightens review for "docs only" or "generated" changes by excluding a directory also exempts the hand-written scripts and styles that publishing layouts put in the same directory, so a change to executable code gets classed as prose. It asks you to exclude what the generator writes by its own list of outputs and to test the filter on a change touching both kinds. The description: now routes this case to the skill.
  12. Changing a layer with no test runner now has a shape

    • writing-the-failing-test-first now covers code that sits where no test can run: a UI layer with no component runner, a deploy script, a rendering path only a browser exercises. It asks you to pull each rule out into something a plain test can reach and drive that red-first, to check the remaining wiring some way you can watch, and to say in the report which part was checked by hand. The harness is offered as a choice with its cost rather than added or skipped silently. The description: now routes this case to the skill.
    • checkpointing-long-runs now lists a deliberate pause as a checkpoint seam: before stopping, write down the resume point, where the unfinished work lives, and what is still running or waiting on a person, so a "where are we?" mid-run is answered from the record and not from the last notification.
  13. Pushing a shared branch now means checking whose commits go with it

    • landing-a-finished-branch now says that a push publishes the branch tip, not just your change: on a branch another session also commits to, everything ahead of the remote goes out with it. Before pushing it asks you to list those commits (git log @{u}..HEAD), attribute each, and leave out or hold back anything that is not yours, for example by pushing from a clean worktree. The description: now routes this case to the skill.
  14. A rule over a closed list is now tested by walking the list

    • property-based-testing now says what to do when a property ranges over a small catalogue the code already lists (themes, locales, roles, enum members): iterate that list instead of sampling it, cross it with the other dimension, check the list is not empty, and name the failing member in the report. It also asks for one more case that reconstructs the originally reported input and asserts it measured badly, so the sweep is shown capable of failing. The skill's description: now routes closed-catalogue questions to it.
  15. Correcting a page for a changed behaviour now means searching it for the old one

    • writing-durable-docs now covers the second half of updating a document when behaviour changes. The section you rewrote is right, but the same behaviour is often still described in a table row, an FAQ answer or a store copy, in other words, and the page now contradicts itself. The skill says to search the document and every copy of it for the feature's name and the old behaviour's verbs (not for your new wording), read each hit, and edit it or keep it with a reason. The description: field now routes a page-being-corrected request to it.
  16. A fix checked only by looking now needs a before-build

    • reproducing-bugs now covers the defect whose only check is a look (a visual fault, behaviour on one device): the commit before the fix is the control. Keep it buildable in a throwaway tree, run identical steps on the same device and data against the unfixed build and then the fixed one, and compare the captures. A symptom that vanished alongside an unrelated change of setup would otherwise be credited to the fix.
  17. Defects only a real screen shows now get a guard

    • regression-test-from-bug now says what to do when no test at any layer can render the failure (text clipped by its container, an element pushed off a small screen): verify once on the real target, then pin a conservative proxy for the cause in the content's own test, such as a length or line-count ceiling set from the measurement with margin, and say plainly that it is a proxy.
  18. A trigger from outside meets the state that exists when it arrives

    • modeling-state-machines now covers deep links, push actions, widget taps and scheduled jobs that fire while the thing they act on is still starting up: the handler's first chance to run is a moment inside start-up, not the state the person is looking at. Gate on an explicit ready state where the machine has one; otherwise act on a settled read (unchanged for a short quiet period, within a hard cap that degrades on purpose), built as a small pure function and tested with a changing, a constant and a never-settling sequence.
  19. A capture on someone else's device is output you cannot take back

    • redacting-sensitive-output now covers the agent as the emitter: a screenshot of a surface that aggregates unrelated content (a notification shade, a launcher, an inbox, a tab strip, terminal scrollback) records the owner's private data beside the one item the task wanted, and the model that loads the image has seen it. The rule is to prefer a structural query filtered to the subject, assert the foreground context before capturing, and, if a stray capture happens anyway, delete it at once and say so. The skill's description: routes to it for screenshots and recordings.
  20. Four skills get a rule they were missing

    • formidable's craft floor now covers the widths between phone and desktop (a row that gains an item breaks first at the width where it stops fitting) and controls that grow for emphasis: a transform enlarges the click target too, so it can swallow a neighbour's clicks. Keep the hit target fixed and test at the neighbour's edge.
    • performance-profiling says to measure size on the artifact that ships. A part's share before the optimizer and compressor can be many times its share after them.
    • caching-strategy asks you to cost the miss rate against the capacity the cache protects before settling a TTL, not only to ask how fast the data moves.
    • rate-limiting-and-backpressure warns that removing a retry at one layer does not lower the rate if the layer above re-drives the failure on its own tick.

Older than these, the whole record lives in UPDATES.md.

Judgment and meta

11 skills
using-tbaguette

Use at the start of every conversation, in every project…

Judgment and meta
orchestrating-work-end-to-end Updated

Use when a request will take more than one edit and nothing has decided yet how much process it needs — a feature…

Judgment and meta
clairvoyance

Use when a request has been understood and is about to be executed and nothing has yet asked whether it is the right request; before a…

Judgment and meta
calibrating-confidence

Use when stating a fact, a cause, a version detail, or an API name that was not checked in this session…

Judgment and meta
estimating-effort

Use when asked how long something will take, how big a change is, or whether work fits a given window; when producing a plan, schedule…

Judgment and meta
deciding-reversibility Updated

Use when a choice is blocking progress and the deliberation is costing more than the choice would, when picking a name, a library…

Judgment and meta
steelmanning-alternatives

Use when an approach was adopted because it was the first one that worked and no other was seriously examined…

Judgment and meta
managing-scope-drift

Use when work has grown past what was asked or the diff is larger than the request implies…

Judgment and meta
revalidating-decisions

Use when a recorded decision — an ADR, design doc, wontfix, runbook line…

Judgment and meta
reading-specifications

Use when turning a ticket, issue, bug report, RFC, standard, design doc, or a user's request into work; when requirements are vague…

Judgment and meta
scoping-before-building

Use when an idea, feature request, or new project needs to become an approved design before any code gets written…

Judgment and meta

Landing changes

10 skills
atomic-commits

Use when a working tree has grown several unrelated changes, when deciding what belongs in one commit…

Landing changes
writing-commit-messages

Use when writing or rewriting a commit message, when drafting a subject line, when a history reads as "fix", "wip"…

Landing changes
incremental-migration

Use when replacing a system, library, API, storage engine, or data format that is already in use…

Landing changes
refactoring-safely

Use when restructuring existing code without changing what it does, when a change touches many call sites at once…

Landing changes
judging-duplication

Use when two pieces of code look nearly identical and merging them is the obvious cleanup, when a reviewer asks why a near-copy exists…

Landing changes
deleting-code

Use when removing code, a feature, an endpoint, a config key, a column, or a dependency that appears unused…

Landing changes
feature-flagging

Use when hiding unfinished work behind a toggle, when planning a gradual rollout, a kill switch, or a dark launch…

Landing changes
resolving-merge-conflicts

Use when a merge or rebase reports conflicts, when a long-lived branch has diverged and integration looks painful…

Landing changes
isolating-work-with-worktrees

Use when starting work that shouldn't touch the current checkout, before running a multi-step plan you might need to abandon cleanly…

Landing changes
landing-a-finished-branch

Use when implementation is done and its tests are green and it's time to decide how the branch lands, when choosing between a local merge…

Landing changes

Testing

11 skills
designing-test-data

Use when a test's setup is longer than its assertions, when fixtures are shared across files…

Testing
auditing-new-input-categories

Use when extending a system to handle a new category of input — a new script or writing system, file format, payment method…

Testing
property-based-testing

Use when example tests only cover the cases someone thought of, when testing parsers, serializers, encoders, sorting, comparators…

Testing
testing-the-untestable

Use when a test calls the wall clock, sleeps, hits the network, writes to the real filesystem, reads environment variables…

Testing
flaky-test-triage

Use when a test passes on rerun, fails only in CI, fails only when the whole suite runs, fails after midnight or across a DST change…

Testing
regression-test-from-bug

Use when a defect has been reported, reproduced, or patched, when writing a test for a production incident or hotfix…

Testing
characterization-testing

Use when changing, refactoring, extracting, porting, or deleting code that has no tests…

Testing
choosing-test-scope

Use when deciding whether a behavior belongs in a unit, integration, contract, or end-to-end test…

Testing
grounding-test-doubles

Use when writing a mock, stub, fake, or fixture for something you do not control — an HTTP API, a vendor SDK, a queue, a device…

Testing
writing-the-failing-test-first

Use when implementing any new feature, fixing a bug, or changing existing behavior — before any production code gets written.

Testing
evaluating-llm-output Updated

Use when a feature's correctness depends on text, a label, a decision…

Testing

Debugging and performance

9 skills
reproducing-bugs

Use when a bug report must be turned into a failure that happens on demand, when a defect cannot be reproduced locally…

Debugging and performance
bisecting-failures

Use when something worked before and is broken now, when the culprit is one of many commits, config keys, dependency upgrades, data rows…

Debugging and performance
reading-stack-traces

Use when a crash, exception, panic, traceback, core dump, or error log must be interpreted…

Debugging and performance
debugging-concurrency

Use when a failure depends on timing, thread or task interleaving, or load, when a test passes alone but fails in parallel, when a hang…

Debugging and performance
observing-production-safely

Use when diagnosing a live system that users depend on, when the only evidence sits behind production data, when enabling a debug flag…

Debugging and performance
performance-profiling

Use when something is slow and the cause is unknown, when an optimization needs proof that it helped, when latency, throughput…

Debugging and performance
finding-resource-leaks

Use when memory, file descriptors, sockets, threads, connections, timers, or event subscriptions grow without bound…

Debugging and performance
diagnosing-before-fixing

Use when a bug, test failure, crash, or any behavior that doesn't match what the code should do needs a fix and none has been proposed…

Debugging and performance
responding-to-incidents

Use when something is broken in production right now — an outage, a degradation, a bad deploy, data going wrong in flight…

Debugging and performance

Designing systems

15 skills
designing-apis

Use when defining an interface other code will call — a public function or library entry point, an HTTP or RPC endpoint…

Designing systems
modeling-errors

Use when deciding how a failure should be represented or handled — choosing between exceptions, result or either types, error codes…

Designing systems
designing-for-idempotency

Use when an operation can arrive more than once — retries after a timeout with an unknown outcome, at-least-once queues…

Designing systems
choosing-concurrency-model

Use when work must happen at the same time and the approach is undecided — OS threads, async or event loops, actors and message passing…

Designing systems
modeling-state-machines

Use when something has a lifecycle — order, job, connection, upload, session, subscription, device…

Designing systems
drawing-boundaries

Use when deciding what belongs together — module, package, crate, library, process…

Designing systems
caching-strategy

Use when adding a cache, memo table, CDN layer, or precomputed read path, when users report stale or wrong data after saving a change…

Designing systems
schema-evolution

Use when changing a contract that is already in production — adding, removing, renaming, or retyping a field in a database schema…

Designing systems
data-migrations

Use when backfilling, transforming, re-encoding, or relocating data that already exists at a size too large for one transaction…

Designing systems
configuration-management

Use when adding an environment variable, setting, toggle, or config file entry, when secrets and configuration are tangled together…

Designing systems
instrumenting-for-observability

Use when deciding what to log, measure, or trace, when an incident could not be explained from the telemetry that existed…

Designing systems
rate-limiting-and-backpressure

Use when a system is receiving more load than it can serve, when designing throttling, quotas, or 429 responses…

Designing systems
tracking-data-provenance

Use when a record can be written from more than one kind of source — measured, imported, inferred, user-asserted…

Designing systems
keeping-copies-in-sync

Use when the same fact — a version number, a policy document, a lockfile entry…

Designing systems
building-llm-features

Use when code calls a language model at runtime — adding the first call, choosing or changing the model identifier…

Designing systems

Communicating

10 skills
writing-durable-docs

Use when writing or restructuring documentation — READMEs, guides, API references, onboarding material…

Communicating
writing-agent-instructions

Use when writing, generating, trimming, or reviewing a file a coding agent reads as standing instructions — AGENTS.md, CLAUDE.md…

Communicating
writing-adrs

Use when recording a technical or architectural decision — picking between technologies, changing a system boundary…

Communicating
writing-release-notes

Use when preparing release notes, a changelog, an upgrade guide, or a version announcement; when a release contains breaking changes…

Communicating
writing-postmortems

Use when writing an incident review or postmortem after an outage, degradation, data loss, failed deploy…

Communicating
reviewing-code-deeply

Use when reviewing someone else's change — a pull request, patch, diff, or commit series — deciding what deserves a comment…

Communicating
explaining-technical-work

Use when writing an explanation of technical work for another person — a status update, a summary of a change or an investigation…

Communicating
crouton

Use when asked for terse, compressed, or token-saving output — "caveman mode", "be brief", "keep it short", "stop explaining"…

Communicating
handing-off-for-review Updated

Use when completing a task or feature and about to hand it off before merging, when stuck and a fresh perspective would help…

Communicating
verifying-review-feedback

Use when code review feedback lands on your own change — from a person, a bot…

Communicating