LLMs write code that accretes — duplicated blocks, dead files, stale docs, structural sprawl. CodeEraser measures it, judges it, and gates it with a score that is only allowed to get better.
GitHub Releases — Windows · Linux · macOS, GUI + CLI + judgment core, SHA256-pinnedcargo install codeeraser/plugin marketplace add skymanbp/CodeEraser$ ce check --roast check score 822/1000 | axes 0:4 1:0 2:42 3:0 4:0 5:0 6:79 | 42 candidates ratchet: 0 added, 0 removed, 0 over, 1 tolerance drawn -> pass roast: entropy is losing, slowly. keep the eraser warm.
Real output — CodeEraser judging its own repository. The ratchet only shrinks: every violation is banked in a baseline, and new entropy fails the gate.
The gate. One 0–1000 score over seven axes, a shrink-only ratchet against the banked baseline, and a hard floor for CI.
T1/T2 clone detection via winnowing fingerprints, with a clone-block budget your repo can only ratchet down.
T3 near-clones judged by tree edit distance in the Haskell core — renamed and reshaped copies included.
Liveness verdicts on a cached reference graph: no kept in-edge, no entry flag — dead, and the gate says so.
Duplicated prose across docs and comments, judged by exact Jaccard over live segments.
Tree-scale entropy: layout divergence, doc staleness, redundancy axes over the whole repository.
Size, complexity and readability per file and function — the classic metrics, core-graded.
Your score across mainline history — cached per commit, rebuildable, honest about direction.
As a Claude Code plugin: duplicate writes intercepted at the moment of writing, audits at stop, health at session start.
Every release binary is pinned by SHA256 in
plugin/bin/manifest.env and verified before publish; installers carry a
SHA256SUMS you can check offline. Code signing is deliberately out of scope —
the hash chain is the permanent anchor. Measurement lives in Rust, judgment in Haskell,
and this repository gates itself with its own tool on every commit.