check_bm_vs_discrete.py — the discrete path silently ignores LOOP_COAL.
CLAUDE.md S1 says that at I_bin = 0 and i_discrete = I the bin_moment system IS
the discrete system. It is not, and the reason is NOT a bin_moment defect:
P.loop_coal -- 1/2<111> loop-loop coarsening, rate_kernels.cpp:1944 -- is
implemented ONLY in rhs_bin_moment. rhs_full_CD contains zero references
to it. The workbook ships LOOP_COAL = 1, so the discrete path accepts the
flag, reports it in provenance, and does nothing with it.
So the discrete arm is not the exact solution of the same equations: it is the
same equations MINUS the loop-coarsening channel. The bin_moment answer is the
physically intended one.
rate_kernels.cpp:1930 predicts exactly what the discrete arm then shows, and
calls it "the missing edge": without coarsening "the 1/2<111> mean size pins AT
the cutoff" and "the density runs 20-60x over the EUROFER97 data". Measured
here: discrete d_111 frozen at 1.759 / 1.763 / 1.760 nm across a 30x dose range,
and N_111 3.5x the bin_moment value.
Runs in ~20 s. Exits non-zero when the two paths disagree, so it can serve as a
regression test once the cause is fixed.