v0.9.0 — the right to retry (community stress-test fix)
v0.9.0 — the right to retry
A community member cloned this repo, read all ~2,400 lines, reproduced the benchmark, and then broke the design with two lines of experiment:
Fix changing timeout 5000 -> 30000: same fingerprint? true
Fix changing "admin" -> "superuser": same fingerprint? true
Because literals collapsed to STR/NUM, a legitimate parameter retry shared a fingerprint with the failed attempt — so the tool hard-blocked the correct fix with "change strategy" (when changing the constant WAS the strategy). Worse: the benchmark's own disguise list defined literal changes as matches, making its "0 false blocks" structurally circular. The biggest false-positive class lived outside the measurement.
They proposed the fix. It's shipped, exactly as designed:
Changed
- Hard blocks now require a raw-channel match — same code, constants included (only whitespace/comments stripped). Changing a constant or string is never denied.
- Collapsed-only matches (same shape, different values) get an advisory note and one hearing. A variant that fails earns its own record — its verbatim repeat then blocks.
- Retire-on-pass is raw-keyed:
timeout: 30000passing does not acquittimeout: 5000's failure. - Batch attribution disclosed: when one run fails N edits, block messages admit "attribution is approximate" with an
rl unblockpointer. - Benchmark rewritten in three honest categories: 60/60 cosmetic re-applies hard-matched - 40/40 literal variants routed to note-not-block (0 wrongly blocked) - 0/190 distinct fixes matched.
86 tests - zero dependencies - this changelog keeps its own ledger honest.