#!/usr/bin/env python3 """readability_progress — the Gen3 series: how honest and how readable the matched C is, over time. WHY A SECOND SERIES. `docs/levers.md` (`tools/lever_progress.py`) counts LEVERS — the register pins and `asm` statements this project inserted to force a byte match — and it is the chart of Phase 36's own goal. But Gen3 is about the source being TRUE and readable, and the levers are only one of the ways it is not. Two more are measurable today and neither is a lever: * LYING CALL DECLARATIONS. A file declares `extern void f(void);` while the function really takes an argument. It compiles, it matches, and it is false — and it was the largest single blocker in Phase 36's residue: six agents independently reached byte-identical output by restoring an argument the decompiler had dropped, and the register pin in each case existed only to fake the instruction the missing argument would have emitted. * RAW CAST DEREFERENCES. `*(u16 *)(p + 0x12)` where the original wrote a struct field. A struct is not recoverable from the binary — types are erased and a retail build carries no metadata — so this number falls only as the struct layers are inferred from base+offset+width evidence and applied. Each row is dated and carries the commit it was taken at, so the chart is reproducible from the tree rather than typed (R75: a published number is generated). Append a row with `--snapshot "