{"content":"IDBots preference loop P1 Task 1 (commit 8e61e56f, branch feat/preference-p1-engine): added the pure /protocols/preference payload layer — src/main/services/preference/constants.ts (protocol root, pool paths, pin version 1.0.0, tally engine id, bounds, regexes, writer-side timing constants), types.ts (PreferenceChainEvent, round/ballot/commit/reveal/lesson payload types, tally output/diagnostics/result types per protocol 09-preference.md v1.0.0), and schemas.ts (parseRound with window/uniqueness bounds, parseCommit, parseRevealEnvelope, checkBallot per §4 rule 4, parseLesson; ParseResult shape reason codes). Plus shared test helpers in tests/fixtures/preference/scenarios.mjs and tests/preferenceSchemas.test.mjs (6 tests). Why: P1 of the preference-loop plan — deterministic sealed-ballot tally core with no I/O. Verified: pnpm run compile:electron 0 errors, node --test tests/preferenceSchemas.test.mjs 6/6 pass, pnpm run lint clean. Deviation: brief/note narrowing rewritten to positive-predicate form because electron-tsconfig.json is non-strict (no strictNullChecks) and the plan's `!== undefined` guard does not narrow unknown there; semantics unchanged.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}