How to Audit a Mathematical Claim
The two audits before this one each caught a single bad claim. This one is the general method behind them, written as a lesson, because the individual audits — grepping a file, quoting a missing citation — read a little comically on their own. The discipline underneath is simple and it is the same discipline that produced everything sound in this series: do the math, then write the claim — in that order. What follows is how to check whether someone (including yourself) did.
1. Don't trust the label
A green Lean 4 · 0 sorry tag, a status cell that says Proved, a DOI
in the reference list — these are claims about evidence, not evidence. The row that
started WP-28 sat in a five-domain table wearing the same styling as two machine-checked rows.
Styling is free. The audit's only move is to stop reading the label and go find the thing it
points at.
2. Read the paper — don't grep it
This is the confession, and it is why this paper exists. A full-text search tells you
where a word appears; only reading tells you whether the math is there.
WP-28 grepped GameTheory_Full_Pack.html for "circadian" and found two hits, which
was enough to flag the one bad row — but it missed that the same paper genuinely
derives its network-game threshold and openly self-flags the circadian row as
unsourced. Grep is a smoke detector. It is not a reading. Read the model, the assumptions, and
the step where the number is produced.
3. Find the three things every real result has
A derivation (the math that yields the number), a dataset (if it is empirical), and reproducible code (if it is numerical). If any of the three is "cited elsewhere," follow the citation until it touches ground. A result missing all three is not a weak result; it is a placeholder that looks like one.
4. Beware the phantoms
Three specific shapes of nothing, each dressed as something:
| Phantom | What it looks like | Seen here |
|---|---|---|
| Phantom code | a script named as the source of a number, absent from the repo | value_iteration_midstream.py — cited for σ* ≈ 1/3, nowhere on disk |
| Phantom citation | a concept-DOI that always resolves to the latest deposit, so it never 404s and never points anywhere specific | "Appendix A, Grossi (2026a)" → the series concept DOI; the appendix "not yet written" |
| Phantom row | a number with no model, data, or citation, riding a convergence table as an independent confirmation | the "circadian trader" g₃₃ ≈ 1/3 (the paper itself labels it Unsourced) |
5. A closed form is not a real solve
A clean formula is often a coarse approximation. The network-game paper gives an analytical threshold σ* = √(b/a) ≈ 0.665 and a numerical one σ* ≈ 0.33; the same corpus's stability radius ε₀ = 1/3 is the coarse symmetric Grönwall estimate that Book 4, Ch 10 refines to r* ≈ 0.776. Neither closed form is a lie — they are the first term. Report both, and say which one is the coarse bound and which is the real solve.
6. Smell the fitted correction
When a "correction factor" is exactly what maps the closed form onto the target constant, be suspicious. The paper closes the 0.665 → 0.33 gap with ψ ≈ 0.50, narrated as two effects each contributing "~25%." A total that is precisely the number needed, split into equal halves, is the fingerprint of a result reverse-engineered to its answer and decorated afterward. A genuine correction is computed independently and lands where it lands.
7. Check that the model closes
Chase the equations to their boundary. The analytical threshold needs "V earns rent at σ = 0" (a constant b > 0) — yet the payoff as written, R_V = βσ(1−γ)·min(v,1)·|I| − v²/2, is identically zero at σ = 0. The mechanism that produces the whole result is off the page. A claim whose generating math is incomplete on the page cannot be reproduced or refuted — it can only be rebuilt.
8. When the math is missing, rebuild it — fresh
A fresh build always works in your favor: you can run it, and sometimes you improve on the original. Rather than hunt the phantom script, we rebuilt the value iteration from the stated payoffs, with every missing piece named in the open (the AR(1) imbalance dynamics; V's baseline rent b₀). It runs — and it turns the vague "invariant" into a precise statement:
So the coefficient a is nailed down by the model; σ* is a one-parameter family in the
unstated rent b₀; and "1/3" and "0.665" are simply two points on that curve, each chosen by a
number no one wrote down. The ψ ≈ 0.5 "correction" is the gap between two guesses of b₀. The
reproducible build is committed as value_iteration_midstream.py — the phantom is
now a real file, and the honest claim it supports is: σ* = √(b₀/a), a ≈ 9.5, and b₀ must be
measured.
9. The verdicts
| Verdict | Meaning |
|---|---|
| Proved | math present and reproduced (ideally kernel-checked) |
| Derived, coarse | a closed form that a numerical solve refines — keep both, label them |
| Cited elsewhere | the backing exists but off-page; follow it to ground before believing it |
| Underdetermined | the result depends on a quantity the source never states (σ* here) |
| Fitted | a free factor chosen to hit a target, then narrated as a mechanism |
| Unsourced | no derivation, data, or citation found — the honest label for a phantom |