89be673854
Две дырки свипера временных заметок: - Не было свипа на старте: заметки, протухшие во время простоя, ждали до часа до первого тика @Interval. Добавил onApplicationBootstrap (best-effort, не блокирует boot). - Гонка без блокировки: re-check и removePage не были атомарны, «Сделать постоянной» могла проскочить между ними. Теперь re-check идёт в транзакции с FOR UPDATE SKIP LOCKED: сериализуется с toggleTemporary (тот же row-lock) и пропускает строки, захваченные другим воркером/инстансом (без двойной обработки). Удаление идёт ВНУТРИ этой транзакции. removePage получил опциональный trx: чтобы удалять под блокировкой без deadlock на вложенной независимой транзакции. Броадкаст PAGE_SOFT_DELETED при переданном trx отложен на commit через registerAfterCommit (откат больше не рассылает фантомное удаление); без trx поведение прежнее. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>