oven: the papermill starts again, and stops undoing its own bookmark master
`papers/SCORE.md` promises that a push to `papers/` rebuilds the PDFs within a minute. It has not done that since May. Nothing failed — the promise just quietly stopped being kept, and the only place that said so was a `running: false` in a JSON blob nobody reads. On 2026-05-13 at 21:36 UTC a systemd drop-in appeared on the oven, `pause-papers-poller.conf`, setting `PAPERS_POLLER_DISABLED=1`. Ten minutes later `b53eca237a` landed — "kill papers auto-build commit loop" — and two days after that `f5c79b82d6` moved the PDFs off git and onto rsync. So the brake went on, the fix went in, and the brake stayed on for four months. Nothing in this repo ever recorded that the flag exists, and `deploy.sh` rewrites `override.conf` from scratch "so stale directives do not survive deploys" while never looking at the drop-ins sitting beside it. The brake was still load-bearing, though, because the loop was never actually cured. On 2026-03-18 an over-broad `git add -A` committed `.last-papers-built-hash`, so the poller's one piece of state became a *tracked* file — and every build ends with `git checkout -- "."` to sweep up xelatex dirt, which reverts that file to the commit it was captured in. `aaa62f4a`, 2026-03-21. The poller would build the mill, lose its place, re-derive the same six-month diff on the next tick, and go again, pushing a fresh metadata commit each lap. The self-commit author guard cannot catch it: a diff that wide has plenty of human authors in it. So the marker moves into `.git/oven-state/`, the one directory that `checkout`, `reset --hard` and `clean -fd` all leave alone. State that a build reverts underneath itself is not state. The rest is making the next failure louder than this one was. The poller now reports why it is off rather than only that it is off, and whether its ticks are still landing — a timer that exists and a timer that runs look identical from `running` alone. `npm run doctor` grows a papermill check that reads all of that and says the sentence out loud, next to the knot/mirror check it is a sibling of: reachability tells you a box answers, not that it is doing its job. Build history survives a restart now, because `recent: []` meant both "never built" and "restarted since", which are not the same answer to the only question anyone asks. And a build whose PDFs never reach lith stops calling itself a success — the LaTeX was clean, the shelf is still empty, and saying "success" to that is how a broken mill looks healthy from outside. Deploys clear the pause from now on. An emergency brake is not configuration; if the loop really comes back, pull it again and write down why. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A1xZ1BonXHyds6EzF5H9Hb