Files
healthlog/internal/store/migrations/00005_delivery_uncovered.sql
av 34e5109b6d непокрытые секции доставки видны в статусе разбора
- половина потока (50 доставок из 104) не несёт metrics вовсе и до сих пор
  числилась parsed: ретеншен, поверив статусу, срезал бы тела stateOfMind,
  которых в экспорте Apple нет
- разбор перечисляет верхнеуровневые ключи data, непокрытые проглатываются
  декодированием: тело 40 МиБ из непокрытой секции удерживает 0 МиБ
- статус partial и колонка delivery.uncovered_sections; миграция переводит
  прежние parsed в pending — им верить нельзя
- витрина не изменилась: отпечаток совпал с прогоном до изменения
2026-08-01 21:25:59 +03:00

36 lines
2.9 KiB
SQL

-- +goose Up
-- Секции тела, которых разбор не покрыл. JSON-массив имён (`["stateOfMind"]`),
-- пустой список — `[]`.
--
-- Массивом, а не строкой с разделителем: имя ключа приходит из чужого тела и
-- может содержать что угодно, включая пробел и запятую. JSON снимает вопрос
-- разделителя, согласуется с колонкой headers и читается из SQLite через
-- json_each, если ретеншену это понадобится.
--
-- Колонка — ответ на вопрос «что останется потерянным, если тело удалить».
-- Для stateOfMind ответ необратим: в экспорте Apple его нет (находка 46),
-- доставки HAE для него единственный источник.
ALTER TABLE delivery ADD COLUMN uncovered_sections TEXT NOT NULL DEFAULT '[]';
-- Статус parsed, поставленный кодом, который частичного разбора не различал,
-- ничего не доказывает: под ним лежат и полностью разобранные доставки, и
-- доставки из одних тренировок с нулём точек (48 из 99 на живом архиве).
-- Ретеншен, ради которого признак и заводится, поверил бы им и срезал тела.
--
-- pending — консервативный статус: ретеншен не трогает его никогда, а подбор
-- pending пересвернёт доставки из архива. Свёртка идемпотентна, повторный
-- прогон журнала состояния не меняет.
--
-- Целевой перевод только строк с points = 0 рассматривался и отвергнут: он
-- опирается на наблюдение «секции не смешиваются», собранное за двое суток
-- потока, а ставить на такое наблюдение необратимое удаление тел значит
-- повторять ошибку, ради которой задача и заведена.
UPDATE delivery SET parse_status = 'pending' WHERE parse_status = 'parsed';
-- +goose Down
-- ВНИМАНИЕ: миграция односторонняя ПО ДАННЫМ. Down снимает колонку, но какие
-- доставки были parsed, восстановить неоткуда — состояние пересобирается из
-- архива, а не откатом. До появления подбора pending строки останутся в этом
-- статусе.
ALTER TABLE delivery DROP COLUMN uncovered_sections;