2026-06-16-candidate-registry-robustness-sota · iteration 08 · 2026-06-16
Every change to a candidate is now a hash-chained event — editing any past entry out-of-band breaks the chain and the registry detects it. Backfilled onto all 44 rows and verified.
entry_hash) computed from the previous event's fingerprint — like Git history or a mini-blockchain (Certificate-Transparency style). A row also stores its head_hash (the tip). Quietly editing a past note, stage, or date no longer matches the recomputed chain.--verify-chain report history chain broken at seq 0 (exit 1). A normal stage change extends the chain cleanly and stays intact. --verify-chain is wired into --validate and /registry:doctor, and is its own /registry:verify-chain command.--migrate now chains every row (44/44), idempotently. On the real ledger: validate PASS, tamper-evidence intact, all ids/stages/history preserved — purely additive (each event gains seq + prev_hash + entry_hash; each row gains head_hash).hashlib wasn't imported in the ledger tool — the throwaway test exposed it (0/44 chained). Fixed the import, re-ran: 44/44 chained, tampering detected. This is exactly why every change is tested on a copy before the real ledger is touched.input_lock (data snapshot + code SHA + params hash + harness version) + a subject_digest, so a verdict can't be reused on a different data window; tighten → promoting to also require a complete lock.event[0] prev_hash = 000…0 (genesis) entry_hash = H(0x01 ‖ prev ‖ H(0x00 ‖ content)) event[1] prev_hash = event[0].entry_hash entry_hash = H(… ‖ prev ‖ …) event[2] prev_hash = event[1].entry_hash … row.head_hash = last entry_hash ← edit any past content ⇒ recomputed hashes diverge ⇒ DETECTED
python3 findings/evolution/shared_data/candidate_ledger.py --verify-chain · or /registry:verify-chain · also folded into /registry:doctor and /registry:validate.