Writing three hundred pages of mathematics on your own raises a practical problem: who rereads it. I have no editor, no proofreader, and my chapters are long enough to exhaust the patience of anyone I’d ask as a favour.
The obvious answer today is to have a model reread the text. The obvious answer, though, works badly, and it’s worth explaining why. If I ask for an opinion on the chapter from the same assistant I wrote it with, I almost always get one of two pathologies: a rubber stamp, because the text already went through its idea of good, or a list of invented problems, because I asked it to find some and it is eager to help. Either way I’ve lost an hour and learned nothing about the chapter.
What I needed was a separation of roles, not a better model. So I wrote a Claude Code plugin that enforces one.
The mechanism is simple. Claude is the orchestrator: it reads the chapter on its own, before asking anything, then calls in the external reviewer, filters what comes back and applies the changes it accepted. The external reviewer is Codex, read-only, and that’s the rule I won’t bend: it never touches the files, it only produces findings. Two different model families on the same text notice different things, especially when one of them wrote the text and the other didn’t.
The review runs in two separate phases, and the order matters. Content first: factual correctness, logical order, definitions, missing steps. Then, only after I’ve read the synthesis and decided the chapter holds up, style: rhythm, register, repetitions, calques. Doing both at once produces reviews where a sign error and a comma carry the same weight, and they don’t. Every finding arrives with a severity: blocking when it compromises understanding, significant when it’s an imprecision or a local opacity, minor when it’s polish.
The part of the machinery I’m proudest of is the one that protects the text from me. Each phase closes with a mandatory verification pass on the updated file, and in that pass the reviewer doesn’t just recheck the patches: the findings I rejected are put back in front of it, with a request to confirm them or argue back. If the disagreement doesn’t resolve, it doesn’t vanish: it lands at the bottom of the synthesis as an open question, to be decided with a cool head. Without that step the orchestrator becomes the bottleneck of the whole review, and filtering is exactly where it’s easiest to fool yourself.
For the book there’s then a third phase, born out of the English edition. On a translated text, content correctness has already been verified on the original, so instead of a content phase you run a fidelity phase: the sections of source and translation are paired and compared one pair at a time, looking for omissions, additions, meaning shifts, terminology drift. And defects in the original too, when they surface right there.
All of it rests on something I already had: the book’s rules file. A reviewer that doesn’t know which choices are deliberate will drag the text back toward the average, and I get to reject the same findings over and over. Declaring the accepted jargon and the untouchable conventions up front is what separates a useful review from a normalisation pass.
The plugin is public, MIT licensed, and not yet mature. The most instructive defect turned up last week: one extra field in the manifest silently prevented the commands from being registered, and in a certain loading mode the plugin appeared installed and was completely mute. No error, no warning, just commands that didn’t exist.
A second opinion doesn’t arrive because you brought in a second model. It arrives because you gave it a different role and took away its right to sign off on changes.
Last modified on 2026-07-23