Three tracked names, two contents:
| path | bytes | axioms | theorems | documented |
|---|---|---|---|---|
| DiscreteDM3.lean | 2,732 | 4 | 4 | no header, no comments on the axioms |
| discreteDm3.lean | 6,511 | 4 | 4 | module header naming the axioms as the conjecture |
| discretedm3.lean | 6,511 | 4 | 4 | byte-identical to the above |
APFS is case-insensitive, so a macOS checkout holds one of these and reports the survivor as modified against the index entry for its sibling. Committing that apparent modification overwrites one tracked file with another's content. That is the hazard; it is not the finding.
Not because it is larger, and not on any sorry count — neither file contains a sorry. Both declare four axioms and four theorems, and the mathematics is the same. The difference is entirely in what each one tells the reader.
discreteDm3.lean carries a module header stating that its three analytic axioms are the Collatz conjecture, marks hasStructuredCycle_collatz as "the Collatz conjecture itself", annotates collatz_converges as "as strong as the axiom it rests on", and proves the even branch of M_collatz_iff_E_collatz before isolating the odd branch as a named private axiom with its reason.
DiscreteDM3.lean is the same file with the header deleted, the annotations deleted, and M_collatz_iff_E_collatz demoted from a partially proved theorem to a bare axiom. It is a caveat-stripping regression, and it is the copy the published registry links to.
Read from the tracked pages on 2026-09-01:
Against the source:
The badge tooltip — "proof written, no unproved step" — is false for this entry. The unproved step is the axiom, and the tiering treats an axiom as not-a-step. Both statements are individually defensible and their conjunction publishes the Collatz conjecture as a machine-verified theorem. This is the failure mode the corpus already names in CLAUDE.md: sorry-free is not proved.
MEASURED AXLE/directory.html carries collatz_converges at entry 357 (from DiscreteDM3.lean) and again at entry 773 (from lean/discreteDm3.lean); 1080.html lists it at 356 and 773. The case-collision is therefore not only a git hazard — it inflates a published declaration count by duplicating the same theorem under two spellings. The same applies to entropy_monotone and M_collatz_iff_E_collatz.
Both import Mathlib.Init.Function. Checked against the v4.32.0 build at geometry/.lake/packages/mathlib on 2026-09-01:
| import | present in the v4.32.0 build |
|---|---|
| Mathlib.Init.Function | ABSENT |
| Mathlib.Data.Nat.Basic | present |
| Mathlib.Data.Nat.Factorization.Basic | present |
So the "sorry-free in source" badge was determined by parsing the text, not by building it. tools/axiom_gate.py — the real gate, which asks the kernel via #print axioms — cannot see either file, because a file that does not elaborate has no axioms to report. The declarations least able to be checked are the ones the gate is structurally blind to, and they are scored by the instrument that cannot tell an axiom from a proof.
Measured 2026-09-01 by tools/axiom_dependence.py over the roots declared in tools/corpus_roots.txt, 10 of 11 readable (io-clone was not reachable), 264 tracked .lean files:
| figure | count |
|---|---|
| axiom declarations | 61 |
| theorems / lemmas whose body names a locally declared axiom | 27 |
| …of which the body is a pass-through (≤ 80 non-space chars) | 10 |
The ten pass-throughs, shortest first:
| chars | declaration | rests on | file |
|---|---|---|---|
| 25 | entropy_monotone | meanContraction_collatz | AXLE/discreteDm3.lean |
| 25 | entropy_monotone | meanContraction_collatz | AXLE/discretedm3.lean |
| 27 | collatz_converges | hasStructuredCycle_collatz | AXLE/discreteDm3.lean |
| 27 | collatz_converges | hasStructuredCycle_collatz | AXLE/discretedm3.lean |
| 47 | critDim_3 | nBonacciRingSize_3 | GTCT/dm3CriticalityPrinciple_extended.lean |
| 47 | critDim_4 | nBonacciRingSize_4 | GTCT/dm3CriticalityPrinciple_extended.lean |
| 64 | entropic_cost_minimal_at_rank3 | nBonacciRingSize | GTCT/dm3CriticalityPrinciple_extended.lean |
| 67 | igcp_3 | dm3_criticality_principle | AXLE/CatGT/Criticality_Principle.lean |
| 69 | tribonacci_3_critical | dm3_criticality_principle_instance | GTCT/dm3CriticalityPrinciple_extended.lean |
| 77 | super | dm3_criticality_principle | AXLE/CatGT/Criticality_Principle.lean |
The seventeen longer ones are questions, not defects — a long body naming an axiom may contain real work, and several plainly do. They are listed in the tool's output and should be read once each, not swept.
Run on macOS, the scan finds discreteDm3.lean and discretedm3.lean but not DiscreteDM3.lean, because the case-collision means only one is in the working tree. The registry's link points at the one the scan cannot open. Any count of this population taken on a Mac is short by the hidden siblings; see Finding 3 in docs/leanscan-2026-09-01.md.
§1 fails if the two files differ in some way this page missed — both are short and are quoted from directly. §2 fails if the registry markup has changed since 2026-09-01; the two lines are quoted verbatim and are greppable. §3 fails if Mathlib.Init.Function is present under some other path in the build. §4 fails if the scan's regex misattributes a body; the ten flagged rows are short enough to read in full, which is the point of sorting by length.