From slow-powers
Use when implementing any feature, refactoring, or writing a bugfix.
How this skill is triggered — by the user, by Claude, or both
Slash command
/slow-powers:test-driven-developmentThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Write the test first. Watch it fail. Write minimal code to pass. Refactor.
evals/baseline/BASELINE.mdevals/baseline/NOTES.mdevals/baseline/benchmark.jsonevals/evals.jsonevals/fixtures/helper-tautology/formatMoney.tsevals/fixtures/helper-tautology/package.jsonevals/fixtures/helper-tautology/test-utils.tsevals/fixtures/paginated-fetch/package.jsonevals/fixtures/paginated-fetch/userList.tsevals/fixtures/render-user-card/package.jsonevals/fixtures/render-user-card/userCard.tsevals/fixtures/slugify/package.jsonevals/fixtures/slugify/utils.tstesting-anti-patterns.mdWrite the test first. Watch it fail. Write minimal code to pass. Refactor.
THE IRON LAW: NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST.
Write production code before the test? Delete it. Start over. Do not keep it for "reference" or "adapt" it. Delete means delete.
Violating the letter of the rules is violating the spirit of the rules.
REQUIRED PREREQUISITE: You must have already completed
slow-powers:working-in-isolation— establish an isolated workspace before writing any test or production code.
REQUIRED NEXT SKILL: You must complete
slow-powers:verifying-development-worknext, after the TDD implementation work is done and before claiming the task is complete or handing work back to the user.
./testing-anti-patterns.md first.npm test / pytest / go test.test('retries failed operations 3 times', async () => {
let attempts = 0;
const operation = async () => {
attempts++;
if (attempts < 3) throw new Error('fail');
return 'success';
};
const result = await retryOperation(operation);
expect(result).toBe('success');
expect(attempts).toBe(3);
});
test('retry works', async () => {
const mock = jest.fn()
.mockRejectedValueOnce(new Error())
.mockRejectedValueOnce(new Error())
.mockResolvedValueOnce('success');
await retryOperation(mock);
expect(mock).toHaveBeenCalledTimes(3);
});
While writing or changing a test, check it against this table. If a row matches, read the named section of ./testing-anti-patterns.md before moving on — mocks are the most common source of these, but not the only one.
| If your test… | Anti-pattern | Section to read |
|---|---|---|
asserts on a mock / *-mock element instead of real output | testing mock behavior | Testing Mock Behavior |
| needs a method on a production class that only tests call | test-only methods in production | Test-Only Methods in Production |
| mocks a method without knowing its side effects | mocking without understanding | Mocking Without Understanding |
| uses a mock with only the fields you happen to need | incomplete mocks | Incomplete Mocks |
| is written after the implementation, with no failing test first | tests as afterthought | Tests as Afterthought |
stubs by call order (...Once chains) or asserts "call N" / "the last call" | order-dependent mocks/assertions | Order-Dependent Mocks and Assertions |
| has more mock setup than test logic | over-complex mocks | When Mocks Become Too Complex |
| Excuse | Reality |
|---|---|
| "This is too simple to test" | Simple code breaks. Test takes 30 seconds. |
| "I'll test after to verify it works" | Tests passing immediately prove nothing. |
| "I already know what the code should look like" | Knowing the answer doesn't mean the requirement is specified. |
| "Testing this would be trivial" | Trivial tests are cheap; skipping them costs later. |
| "I'll add tests later, I promise" | Later never comes. The codebase drifts. |
| "The spirit of TDD is what matters, not the letter" | Violating the letter is violating the spirit. |
All of these mean: delete code. Start over with TDD.
Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub slowdini/slow-powers --plugin slow-powers