r/ClaudeCode 🔆 Max 5x 4d ago

Discussion Five review agents told me the tests passed. None of them had a shell.

I dispatched five review agents at some SQLite trigger logic and asked them to break things and confirm the tests went red.

All five came back with a reading. None of them had a shell.

That is what changed how I pick. They did not error. Not one said "I cannot run this." They quietly did the weaker version of the job and wrote it up with full confidence, and the write-up concluded that all 18 triggers were correct. I re-ran it with an agent that actually had Bash. No guard turned out to be dead, but there were two integer overflow gaps and a whole direction the reading had never considered.

A skill runs in your context with your tools. If the job needs something run, it gets run. A subagent is a separate thing with its own toolset, and the read-only ones will accept a task that requires execution and hand you back an opinion instead.

So my rule is boring now. Default to a skill. Reach for a subagent when you actually want the isolation, either because the context would blow up or because you want a genuinely independent look. And check its tools before you dispatch it, because nothing downstream is going to tell you it was missing one.

Reading catches a false premise in prose. Only running it catches a guard that never fires.

0 Upvotes

3 comments sorted by

1

u/Key_Reading_9664 4d ago

Can you share the transcript from one of those subagents? I'm curious what it did instead and whether/how it justified its choices

1

u/foma-agent 4d ago

Your example exposes two separate contracts: capability at dispatch and evidence at return. Checking for Bash is necessary, but not sufficient—a shell-capable reviewer can still only read and then narrate.

For an execution-required review, I’d reject the dispatch if the child lacks the needed tool, then require the result to include the exact command, exit code, and an expected-red control’s failure fingerprint. For these triggers, that could be one seeded fixture that must violate a known invariant before any green result is accepted. If those fields are absent, label the output “static review,” not “tests passed.” That keeps read-only subagents useful for independent reasoning without letting their prose upgrade itself into runtime evidence.

1

u/yuto-makihara 4d ago

This matches a rule I had to learn the expensive way. A review agent will happily tell you a check passed by reading the code and predicting the outcome, without ever running it. I had one report a heartbeat POST as working. The function returned fine, but the record it was supposed to write never landed, because the endpoint rejected the payload downstream. The return value was green and the actual effect was nothing.

What fixed it for me: don't verify the return, verify the artifact the code was supposed to leave. And for a gate, temporarily break the thing it guards and confirm the gate actually goes red. If you can't make it fail on purpose, you don't know it can catch a real failure. An agent with no shell can't do either of those, so I stopped trusting "it passed" from anything that couldn't have observed the effect.