Skip to content

Does Claude Code Still Need a TDD Plugin, or Can Opus 5.0 Run TDD Natively?

Problem

I have been using the TDD flow from the Superpower plugin inside Claude Code. After Opus 5.0 got noticeably better at reasoning, I started asking: do I still need a TDD plugin at all, or can the model drive red-green-refactor on its own now?

The honest answer from one r/ClaudeCode thread was the same one I arrived at: the author dropped most of Superpower against native Ultracode plus Workflow, but kept it specifically for TDD — “the thing I love the most from Superpower is the TDD still.” That is a strong signal. When a smart user keeps exactly one feature of a plugin after migrating everything else to native, that feature is solving a problem native capability does not solve.

Environment

  • Claude Code on Opus 5.0
  • Superpower plugin TDD flow (write failing test, run suite, pass, refactor)
  • Project with a runnable test suite (pytest in my case)

What happened?

I tested whether “describe TDD” equals “do TDD.” It does not.

In well-scoped, short tasks the model writes the test first when I ask it to. In long sessions it drifts:

  • Jumps to implementation and back-fills the test
  • Writes a test, then edits the test to match the code
  • Marks a test as “should pass” without actually running the suite
  • Confidently claims green when the run was never executed

The pattern is not lack of knowledge. The model can quote the red-green-refactor steps perfectly. The pattern is lack of discipline under confidence. And with AI-generated code, the test suite is the only ground truth. Silently degrading it is the highest-risk failure mode I have.

How to solve it?

The plugin stays because it gives me something a one-shot prompt does not: a hard gate at each transition.

Minimal TDD gate a plugin enforces
1. RED : write one failing test; run suite; FAIL required.
2. GREEN : minimum code to pass; run suite; PASS required.
3. REFACTOR : behavior-preserving changes; run suite; PASS required.
No step may advance until its run-suite checkpoint passes.

The run-suite checkpoint is the load-bearing part. Without it, the model’s confidence is the only thing telling me the suite is green.

If I decide to drop the plugin, I still need a forcing function somewhere. I do not trust “the model is smart” on its own. A cheap replacement is a pre-commit hook that blocks code-only diffs for files that have a co-located test file:

tdd_gate.py
import subprocess, sys
changed = subprocess.check_output(
["git", "diff", "--name-only", "--cached"]
).split()
src = [f for f in changed if f.endswith(b".py") and b"test" not in f]
missing = [
f for f in src
if (f.replace(b".py", b"_test.py")) not in changed
]
if missing:
print("TDD gate: code changed without test:", missing)
sys.exit(1)

This is not as good as the full red-green-refactor gate, but it catches the most common regression: editing a source file without touching its test. The point is that some gate has to exist. Smart model plus no gate is the failure mode I am trying to avoid.

The reason

I think the key reason is that TDD is not a knowledge problem on a capable model — it is a discipline problem. The model knows the steps. It just does not hold the line on them when it feels confident.

That is exactly the case where a skill or a plugin earns its place: it provides a forcing function the model can follow but frequently does not. Smarter reasoning does not auto-produce test-first discipline; if anything, confidence makes the drift worse.

So my rule is simple: if I remove the TDD plugin, I must replace the forcing function with hooks or CI gates. I do not just trust the model to behave.

Summary

In this post, I looked at whether Opus 5.0 makes a TDD plugin redundant. The key point is that the plugin’s value is the forcing function, not the knowledge of TDD. A smart model can describe TDD perfectly and still skip it under pressure, so I keep the plugin or replace its gates with hooks — I never just trust that “smarter” means “disciplined.”

Final Words + More Resources

My intention with this article was to help others share my knowledge and experience. If you want to contact me, you can contact by email: Email me

Here are also the most important links from this article along with some further resources that will help you in this scope:

Oh, and if you found these resources useful, don’t forget to support me by starring the repo on GitHub!

Comments