- каждая запись каталога задач получила тип вместо тега kind: и префикса заголовка; секция роадмапа «Разработка» стала «Сопровождением», порядок секций канонический - поправлены протухшие факты: нереализованные маршруты Read API, MCP и `healthlog import`, словарь слоёв в инварианте, семантика гейта по покрытию диффа, периметр перестал дублировать security.md - замер слияния переведён с находки 49 на находку 54, заполнены Purpose спек storage и parsing
2.6 KiB
✨ Проверять целостность собранной витрины до подмены
- Тип: feature
- Категория: Ядро
- Зачем: Подмена файла необратима, а годность выхода подтверждена отпечатком на ещё открытом дескрипторе
- Теги: goal:journal-and-rebuild
healthlog reindex собирает витрину в отдельный файл и снимает с него
отпечаток, а подмену делает человек: остановить сервис, переименовать файл,
поднять обратно. Это единственный необратимый шаг всей операции — и
единственный, перед которым мы ничего не проверяем.
Отпечаток сегодня снимается на ещё открытом дескрипторе: он говорит, что
свёртка сошлась, но не говорит, что файл на диске корректен как база SQLite.
Между «свёртка сошлась» и «файл цел» помещается всё, о чём предупреждает
How To Corrupt An SQLite Database:
оборванный fsync, полный диск, ФС, соврала о записи. Человек в этот момент
уже удалил рабочую витрину.
Что делать: после закрытия файла и до того, как команда объявит результат
годным к подмене, открыть его заново и прогнать PRAGMA integrity_check.
Не прошёл — команда завершается отказом и прямо говорит, что подменять нечем.
Дёшево: одна страница кода, один прогон по готовому файлу. Ценно ровно в тот момент, когда всё остальное уже пошло не так.
Готово, когда reindex на заведомо испорченном выходном файле отказывается
называть результат годным, а на здоровом — не замедляется заметно.
Связано: cmd/healthlog/reindex.go, docs/architecture.md → «Пересборка».
Двигает строку «Завершения» цели: «Годность собранной витрины подтверждена до подмены файла».