How a "Semi-Automatic Review" Harness Stabilized My Claude Code Workflow

1. The Conclusion

Claude Code, used as-is, is unstable. 👉 But once you wire reviews in as a structure, it stabilizes dramatically.

2. The Familiar Pain

👉 Exactly how a junior human engineer behaves.

3. The Real Problem

The problem is not the prompt.

The problem is trying to guarantee quality with the AI alone.

👉 The fix is harness design.

4. What I Did (Very Simple)

When I say “review it,” 👉 a review is forced to run, by design.

5. The Whole Picture

Normal mode

(development)

"review it"

Review-only mode triggers

Structural checks

Fix instructions

👉 That’s all there is to it.

6. The Implementation Core

▸ ① ADR Locks Down the Rules

docs/harness/adr/0001-review-mode.md

👉 Think of it as the “constitution.”

▸ ② CLAUDE.md Defines the Trigger

review

👉 This switches modes.

▸ ③ Templates Lock Down the Output

docs/harness/templates/review-template.md

👉 Prevents review drift.

▸ ④ Save the Reports

docs/harness/reports/

👉 Quietly important — for preventing recurrence.

7. Why I Didn’t Go Full-Harness (Important)

The conclusion first:

👉 It’s too heavy. I dropped it.

The full setup looks like this:

Planner → Generator → Reviewer → Evaluator

It’s the ideal architecture, but in practice:

And on top of that:

👉 Token consumption explodes.

With a full harness:

The result:

👉 An ideal architecture, but overkill for this use case (small fixes).

For my actual use case:

In this phase:

Structural decay matters more than design mistakes.

👉 So just the Reviewer was enough.

8. Why I Made It “Semi-Automatic”

I could fully automate it. I deliberately didn’t.

Three reasons:

▸ ① Avoid Pointless Reviews

If you review every mid-flight or half-written change:

👉 Even humans don’t do this.

▸ ② It Creates a Thinking Break

You stop here, on purpose.

👉 This is enormously important.

▸ ③ I Hold the Trigger

レビューして

That single phrase:

👉 Switches from dev mode to review mode.

👉 This was the version that actually felt right.

9. Where I Got Burned (Important)

▸ ❌ The First Failure

👉 The AI review was not reproducible.

▸ The Fix

For each viewpoint:
- Definition
- NG example
- OK example

👉 This is what made it stable.

10. The Other Critical Piece

▸ Defining the Review Target

Skip this and you’re in hell:

What exactly are we reviewing?

▸ The Solution

Default: the diff from `git status`

Options:

review  --all
review  *****

👉 Now it feels like CI.

11. The Before / After

▸ Before

▸ After

12. The Essence

What I’m actually doing is this:

Have AI write.
Have AI break.
Have AI fix.

👉 The same structure as a human team.

13. How It Actually Felt

👉 The biggest win was AI readability.

14. Caveats

15. Where This Extends

Apply the same idea and you get:

👉 A full AI team.

16. Summary

👉 Semi-automatic review is the right level of compromise.

17. Bonus (Copy-Paste)

review

That single line is enough to trigger the whole review pipeline.

👉 And honestly, that’s the biggest deal.