The Review

Does it work, and what did we learn?

The quality gate. You hold the finished build up against the spec you agreed, stay honest about what's not done, and name the lessons so you don't repeat them. And it's not the end: what the review finds becomes the start of the next loop.

The buildThe progressThe review
What a review actually does

Hold it up against what you agreed

A review is simple at heart: take each promise from the spec, and check whether the build kept it. Tap each promise from Retention Pulse's spec to see how it held up.

The spec promisedSurface members slipping away, while you can still save them
Bug found
The engine secretly required a next-payment date before it would count someone as "paying". So a member who genuinely pays, but whose date field was blank, sank off the worklist. The tool could hide the very paying ghost it exists to catch. Caught in review, fixed in about an hour.
The spec promisedRank by money at risk, colour by urgency
Works
The two-axis engine (colour = how bad, rank = who to call first) is real, deliberate and correct. Exactly as the spec drew it.
The spec promisedRead-only, never change member data
Works
Every action is studio-scoped and read-only. The build held the exact boundary the spec set in its "out of scope".
The spec promisedOne board, glanceable each morning
Works, with a gap
The board works. The honest gap: you can't yet message a member straight from it, even though their number is right there on the row. The review ranked that as the top thing to build next.
A good review alsoSays what it could NOT check
Honest
The review names its own limits: it read the code, it didn't run the app against live data. Saying what you couldn't verify is part of a review you can trust.

Four kept, one caught before it shipped. That's a review doing its job.

And here's mine

Retention Pulse's actual review

The real thing. It gives earned credit, names one serious problem plainly, and is honest about what it couldn't do.

Code Review + Feature Sweep
56 agents · 5 angles
47 raw → 42 confirmed
The verdict

"Genuinely well-built. The router, the two-axis engine, and the studio-scoped actions are all real, deliberate, and mostly correct, and the progress note is honest about its own gaps."

The headline finding

The engine could hide the paying ghost it exists to catch

The risk engine's idea of "paying" had drifted from the rule that feeds it, so the highest-value churn cases could be quietly mis-coloured and drop off the list. One roughly one-hour fix in two files, and the difference between the tool working and quietly lying.

What it could NOT do

Static analysis only: it read the code, it didn't run the live app against real data. Stated up front, so no one mistakes it for more than it is.

Why it's good
"It caught the one bug that mattered most, the tool hiding the member it's built to save, gave the build honest credit, and owned what it couldn't check. A review that only flatters is worthless."
The questions to ask

A review is mostly just good questions

You don't need code to review well. You need to ask the right things, and know the move when the answer is "no."

Does it do the one job from the spec?
If not, name the missing piece and have Claude fix that before anything else.
Does it work on my phone AND my desktop?
If not: "it's broken on mobile, here's what I see."
What happens when there's no data yet?
If it breaks or looks empty: "show me the empty state, and handle it gracefully."
Did it sneak in anything I didn't ask for?
If so: "remove that, it's out of scope."
What's still rough or unfinished?
Ask Claude straight, then write the honest answer into your progress note.
The loop turns

The review isn't the end. It's the next beginning.

Every bug the review found is now fixed (it's all in the progress note). And the gaps it surfaced, like "you can't message from the board yet", are simply the next thing to brainstorm. You've now watched one build go the whole way around. That's the method. Now you run it again, for whatever you build next.

Start the next loop →