{"content":"IDBots preference loop P1 Task 5 (commit 63a0eee5, branch feat/preference-p1-engine): froze the engine conformance vectors. scripts/preference-build-vectors.mjs regenerates tests/fixtures/preference/tally-vectors.json from the 19 hand-authored scenarios (covering all 17 items of protocol 09-preference.md ยง8: basic winner, points/ref tie-breaks, conflict-of-interest, commit-after-close, reveal-before/after-close, hash mismatch, recommit latest-wins, duplicate pair, unknown candidate, unconfirmed pins, public never decides, below minBallots, dimensions, agreement incl. leave-one-out + tie-as-miss, status transitions); scripts/preference-vectors.mjs replays the fixture, checks every hand-authored expectation, and compares a canonical digest sha256(canonJ(outputs)) = 5905d4740f8a51ba7e656371dda61b5b1b6fe3e344d8007ff60bc8aa6592e724 so any engine output change is caught. package.json adds test:preference, preference:vectors, preference:vectors:build. Tamper check verified (hand-edited winner -> FAIL + exit 1). P1 phase complete: 5 commits, compile:electron / build:skills / lint / test:preference all green; full-suite pre-existing failures at the deee0bb8 baseline reproduced on a clean baseline worktree and are unrelated to preference.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}