reindex: пересборка витрины проигрыванием журнала

- `healthlog reindex` собирает витрину из журнала (тела архива + учёт
  доставок) в ОТДЕЛЬНЫЙ файл базы, строго по `(received_at, id)`; рабочую
  базу читает без наката миграций и не трогает вовсе. Подмену делает
  человек при остановленном сервисе: переименование поверх открытого
  дескриптора портит базу молча.
- Журналом считается архив, а не таблица доставок: тело без учётной записи
  заводится заново (метка из ULID, размер и хеш по распакованному телу),
  запись без тела переносится, но не сворачивается. Оракул сходимости
  встроен — два отпечатка и «объектов было/стало»; пустой журнал успехом не
  считается.
- Прогон живого архива переехал на новый пакет: второго проигрывателя
  журнала в проекте не осталось, а его утверждение о ключе сна перестало
  быть константой, протухающей с каждой доставкой.
This commit is contained in:
av
2026-08-02 09:07:46 +03:00
parent 84bcbbea5c
commit 5ae0c5ff81
36 changed files with 4452 additions and 258 deletions
+9 -8
View File
@@ -15,13 +15,14 @@
недифференцированной кучей. Блокеры, накопившиеся из ревью, разобраны — их в
беклоге ноль.
Дальше — **`reindex`**, и он сейчас срочнее остального остатка разбора. После
миграции 00005 доставки числятся `pending`, а подобрать их некому: код
пересборки не написан. Данные целы (тела в архиве, объекты в витрине), но
учёт честно говорит «этим разбором не смотрели», и так будет, пока пересборки
нет. Тем же кодом закрывается половина задачи «разнести ответ и свёртку».
**`reindex` сделан**: журнал проигрывается в свежую витрину, отпечатки
сравниваются, повторный прогон ничего не меняет. Доставки, числящиеся `pending`
после миграции 00005, подбираются им же — но применяется результат подменой
базы, а её делает человек при остановленном сервисе. Тем же кодом закрывается
половина задачи «разнести ответ и свёртку»: проигрывание журнала теперь готовая
операция.
Потом — остаток разбора: тренировки и записи со своими `id` (это половина
Дальше — остаток разбора: тренировки и записи со своими `id` (это половина
потока: `workouts` и `stateOfMind` принимаются и хранятся, но не разбираются),
словарь категориальных значений.
@@ -32,8 +33,8 @@
- [x] **1. Каркас.**
- [x] **2. Приём без разбора.****подключаем телефон по локальной сети**
- [~] **3. Разбор и хранилище.** Метрики — сделано; тренировки и записи со
своими `id`, `reindex` и словарь категориальных значений — нет.
- [~] **3. Разбор и хранилище.** Метрики и `reindex` — сделано; тренировки и
записи со своими `id`, словарь категориальных значений — нет.
- [ ] **4. Каталог и род агрегации.**
- [ ] **5. Read API.**
- [ ] **6. Самоописание.**