Skills mattpocock skills Engineering workflow

tdd

Use it when:
You want a feature or bug fix built test-first, or ask for red-green-refactor or integration tests.
It does:
Has you agree which public interfaces get tested, then loops: one failing test, then just enough code to pass it.
You get:
Code built in small slices, with tests that check behavior and survive refactoring.
Unlike test-driven-development:
The TDD skill in obra's Superpowers set refactors inside the loop; this one leaves refactoring for a later code review.
Runs:
By itself whenever you ask for test-first work.

Skill 17 of 24 in the Engineering workflow bundle, after implement-spec and before codebase-design.

TL;DR

Less a procedure than the rulebook for each red-green cycle: write a failing test (red), then make it pass (green). Before any test, the agent proposes which public interfaces to test at, the places where behavior can be observed without reaching inside, each with a note on what it catches and misses. You confirm them, and no test goes anywhere else. Then it works in vertical slices: one test, then the least code that passes it, then the next, each shaped by what the last one taught. Tests check what the code does through its interface, not how: no mocks of your own modules (only of outside systems such as payment APIs or the clock), no private methods, no checking the database behind the interface's back. It also bans tests that can't fail because they compute the expected value the same way the code does, and writing all the tests before any code. Test names follow the project's glossary if there is one.

Summarizes the skill at 5beb35b.

npx skills add https://github.com/mattpocock/skills --skill tdd
Total Downloads
1,216,304 on skills.sh, Nov 9, 2026
Repo stars
318,714 mattpocock/skills
First seen
Feb 10, 2026 on skills.sh
Weekly Downloads
32.9K
-20% over the 8 weeks to Nov 9
Weekly values
Week toInstalls
Sep 2141,124
Sep 2836,998
Oct 542,084
Oct 1254,986
Oct 1944,593
Oct 2639,153
Nov 235,932
Nov 932,876
Category

Test-first work, implementation from specs, git hygiene and scope control.

Everything for building software: planning, coding, debugging, design, frameworks, cloud, agents and skills.

Type

A multi-step process the agent follows: interview, debug, run a TDD loop, review.

Effect

Its own steps create or change files, git state or local tools.

Needs

Instructions only. Works in any agent that supports skills.

Publisher

Everyone else. Unverified vendor claims default to community.

Topics

SKILL.md

From mattpocock/skills at 5beb35b. Checked daily, last changed Oct 20, 2026.

Frontmatter
name: tdd
description: Test-driven development. Use when the user wants to build features or fix bugs test-first, mentions "red-green-refactor", or wants integration tests.

Test-Driven Development

TDD is the red → green loop. This skill is the reference that makes that loop produce tests worth keeping: what a good test is, where tests go, the anti-patterns, and the rules of the loop. Every section applies on every cycle: consult them before and during the loop, not after.

When exploring the codebase, read GLOSSARY.md (if it exists) so test names and interface vocabulary match the project's domain language, and respect ADRs in the area you're touching.

What a good test is

Tests verify behavior through public interfaces, not implementation details. Code can change entirely; tests shouldn't. A good test reads like a specification: "user can checkout with valid cart" tells you exactly what capability exists, and it survives refactors because it doesn't care about internal structure.

See tests.md for examples and mocking.md for mocking guidelines.

Seams: where tests go

A seam is the public boundary you test at: the interface where you observe behavior without reaching inside. Tests live at seams, never against internals.

Test only at pre-agreed seams. Before writing any test, write down the seams under test and confirm them with the user. No test is written at an unconfirmed seam. You can't test everything, so agreeing the seams up front is how testing effort lands on the critical paths and complex logic instead of every edge case.

Ask: "What's the public interface, and which seams should we test?" Give each proposed seam a one-line note on what it catches and what it misses.

When the shape of that interface is itself in question (how deep the module is, where the seam belongs, what the interface should expose), call the Skill tool with "codebase-design" for the vocabulary. It is the shared source of the module, interface, depth, seam, adapter, leverage and locality terms, and it is a reference to consult, not a session to run.

Anti-patterns

  • Implementation-coupled: mocks internal collaborators, tests private methods, or verifies through a side channel (querying the database instead of using the interface). The tell: the test breaks when you refactor but behavior hasn't changed.
  • Tautological: the assertion recomputes the expected value the way the code does (expect(add(a, b)).toBe(a + b), a snapshot derived by hand the same way, a constant asserted equal to itself), so it passes by construction and can never disagree with the code. Expected values must come from an independent source of truth: a known-good literal, a worked example, the spec.
  • Horizontal slicing: writing all tests first, then all implementation. Bulk tests verify imagined behavior: you test the shape of things rather than user-facing behavior, the tests go insensitive to real changes, and you commit to test structure before understanding the implementation. Work in vertical slices instead: one test → one implementation → repeat, each test a tracer bullet that responds to what the last cycle taught you.

Rules of the loop

  • Red before green. Write the failing test first, then only enough code to pass it. Don't anticipate future tests or add speculative features.
  • One slice at a time. One seam, one test, one minimal implementation per cycle.
  • Refactoring is not part of the loop. It belongs to the review stage (see the code-review skill), not the red → green implementation cycle.