2026-06-16-candidate-registry-robustness-sota · iteration 05 · 2026-06-16
Adding a candidate now AUTO-runs the novelty check and records the result, and the ledger can no longer be corrupted or lose appends when multiple sessions write at once — verified end-to-end without touching the real ledger.
candidate_ledger.py --add automatically runs the novelty check first: covered → the add is refused (it's already in the catalog); needs_review → blocked unless you pass --confirm-dup; unique → added, with a dedup record (status, mechanism, score, matched ids, content hash) stamped on the row. A standalone --novelty "NAME" command runs the gate on demand.--add/--set-stage run inside an exclusive file lock and re-read the file fresh, so the parallel bigblack panes serialize and cannot clobber each other's appends — closing the failure class behind the old 29,908-duplicate incident.dedup.status=unique · re-adding the same name in different case → refused (the gate sees the new row immediately) · --set-stage works · the file re-loads as valid JSONL. The live 44-row ledger stayed exactly 44 throughout.--validate; every existing command behaves the same; the new dedup field is purely additive. candidate_ledger.py parses and runs on the env's Python 3.14 with no new dependencies.migrate() pass to backfill dedup + content hash onto the existing 44 rows, so historical candidates carry the same provenance new ones get.→ promoting requires all three axes PASS + leakage gates) and stable opaque spec-hash ids./registry:doctor and /registry:check-full commands (Eon slash-command standard).--add does now--add --name "X" --family F ...
└─ acquire exclusive lock → re-read ledger fresh
└─ novelty_check(X)
covered → REFUSE (already in catalog)
needs_review → BLOCK unless --confirm-dup
unique → append row + stamp dedup{status,mechanism,score,matched_ids,spec_hash}
└─ atomic write (temp → fsync → rename → fsync dir) → release lock| test (on throwaway copy) | result |
|---|---|
| add a covered name | refused, rows stayed 44 |
| add a brand-new name | added 44→45, dedup=unique |
| re-add same (different case) | refused — gate sees the new row |
| set-stage on new row | ok → pending |
| real ledger during tests | untouched (44 rows, still valid) |