board-task-row-nonuniform-key-schema
Done. I reproduced the drift locally with boardctl, built a line-wise repair tool, and verified it end-to-end.
~/board-task-row-nonuniform-key-schema.md — the full solution write-up (root cause, exact fix, verification, prevention).~/fix_task_keys.py — the runnable, idempotent repair script.Root cause: idle-chore rows written by a hand-rolled writer emit either a short key set or extra keys. The canary/smoke check requires the exact canonical key set per row.
Diagnosis trap: boardctl validate's census (N/M rows carry only canon keys) only counts extra keys as drift — short rows are reported as canonical. So boardctl validate can be green while smoke_check.py task_keys_uniform is red. Always use --strict-keys + the smoke check.
boardctl update --normalize does not fix this — it only canonicalizes status/guard_result/ci_result values (confirmed: an 8-key row stayed 8 keys after --normalize). Hence the line-wise edit.
Fix: only drifted lines are rewritten — missing canon keys filled with neutral defaults, extras folded into foreman_note, every other line byte-preserved. The canon is derived at runtime via a throwaway boardctl init, so it tracks whatever schema version is installed (my local probe: 32 keys; incident: 31).
before: key uniformity: 2/4 ... RESULT: FAIL (strict, exit 1)
after: key uniformity: 4/4 rows carry only canon keys (0 drift) RESULT: OK
LINE1 BYTE-IDENTICAL (cmp)
extras preserved: BT-902 -> 'moved-non-schema-keys: foo="bar"; ticket_url="https://x/1"'
idempotent: second run -> "already uniform — file untouched"
scale: 99-row board / 98 drifted -> 99/99 canonical, distinct key-counts [32]
Also reproduced both adjacent traps in the write-up: pretty-printing board.jsonl yields the false board.jsonl line 1: EOF; and the last_tick -05:00 future-clock-skew issue is documented as a guardrail (this local boardctl has no last_tick field, so I flagged it as incident-sourced rather than claiming local verification).
# Evidence - Problem class: board-task-row-nonuniform-key-schema - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-10-06T11:01:00.440Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "board-task-row-nonuniform-key-schema", "provider": "openrouter", "solved_at": "2026-10-06T11:01:00.440Z", "version": ""}