From ultrapowers
This skill should be used when implementing any feature or bugfix, before writing implementation code. Also when fixing a bug without a regression test, or when tempted to 'write tests after'.
npx claudepluginhub jaidhyani/jai-cc-plugins --plugin ultrapowersThis skill uses the workspace's default tool permissions.
Write the test first. Watch it fail. Write minimal code to pass. Refactor.
Verifies tests pass on completed feature branch, presents options to merge locally, create GitHub PR, keep as-is or discard; executes choice and cleans up worktree.
Guides root cause investigation for bugs, test failures, unexpected behavior, performance issues, and build failures before proposing fixes.
Writes implementation plans from specs for multi-step tasks, mapping files and breaking into TDD bite-sized steps before coding.
Write the test first. Watch it fail. Write minimal code to pass. Refactor.
No production code without a failing test first. If the test didn't fail, it doesn't prove anything. If you didn't watch the test fail, you don't know if it tests the right thing.
Exceptions: Throwaway prototypes, generated code, config files. Ask if unsure.
One test, one behavior, clear name. Use real code — mocks only when unavoidable.
Run the test. Confirm it fails because the feature is missing (not a typo or import error).
Test passes immediately? It's testing existing behavior. Fix the test.
Write the simplest code that makes the test pass. Don't add features, don't refactor, don't "improve" beyond what the test requires.
Run the test. Confirm it passes. Confirm other tests still pass.
After green only. Remove duplication, improve names, extract helpers. Keep tests green. Don't add behavior.
Next failing test for next behavior.
Tests written after code pass immediately. Passing immediately proves nothing — the test might verify the wrong thing, test implementation instead of behavior, or miss edge cases. Test-first forces edge case discovery before implementing.
"I'll write tests after" and "tests after achieve the same goals" are the most common rationalizations. They don't. Tests-after answer "what does this do?" Tests-first answer "what should this do?"
Delete it. Start over with a test.
Implement fresh from tests. Manual testing does not satisfy TDD.
| Problem | Signal |
|---|---|
| Don't know how to test | Write the assertion first. The API you wish existed. |
| Test too complicated | Design too complicated. Simplify the interface. |
| Must mock everything | Code too coupled. Inject dependencies. |
| Test setup is huge | Extract helpers. Still complex? Simplify design. |
If you catch yourself doing any of these, stop and restart with TDD: