Files
healthlog/docs/backlog/nerazobrannye-sekcii-dostavki.md
T
av 349a227ab1 блокеры разобраны замером: три стали задачами, один закрыт
- находки 48 и 49: единицы не менялись ни разу; настоящих столкновений 0.65%,
  несравнимых наборов полей нет, тай-брейк берёт меньшее в 96% случаев
- edinicy-metriki-v-razreze закрыт: гипотеза не подтвердилась замером
- тай-брейк отложен до каталога рода агрегации
2026-08-01 19:33:47 +03:00

4.2 KiB
Raw Blame History

Непокрытые секции доставки видны в статусе разбора

Приоритет: высокий

Была блокером, вынутым ревью кода задачи razbor-metrik-v-obekty (профиль deep, проход негативного пространства). Решение принято — ниже задача.

Что не так сегодня

Разбор читает только data.metrics. Доставка, состоящая из workouts, stateOfMind, symptoms или ecg, помечается parse_status=parsed с нулём точек — неотличимо от доставки с пустой секцией метрик.

Само по себе некритично: секции пока не разбираются сознательно, тела лежат в архиве. Опасность в сцепке с ретеншеном. Ретеншен по замыслу срезает архив до следующего проверенного экспорта. Если он будет ориентироваться на parse_status, он снесёт тела, которые числятся разобранными, — а для stateOfMind это необратимо: в экспорте Apple его нет (находка 46), доставки HAE для него единственный источник.

Цена ошибки здесь не «придётся пересобрать», а «истории состояния разума больше не существует».

Что решено

Вариант (1): разбор возвращает список верхнеуровневых ключей data, которые он не покрыл; статус доставки — partial.

Почему он, а не альтернативы:

  • Считать parsed только полностью разобранную доставку, а остальные держать в pending — дёшево, но pending перестаёт означать «ещё не смотрели», и подбор зависших доставок теряет свой признак. А подбор pending как раз появляется задачей otvet-i-svyortka.
  • Запретить ретеншену смотреть на parse_status — нулевая цена сейчас, но ретеншен становится тупым и не защищает от «тело разобрано неверно, а мы его уже срезали».

Список непокрытых ключей — дешёвая честность, и он же закрывает задачу «не пропустить момент, когда поедет новая секция».

Что делать

  1. hae.Parse: перечислить верхнеуровневые ключи data и вернуть те, что разбор не покрыл. Один json.Decoder по верхнему уровню, без чтения содержимого — секции доходят до десятков МиБ.
  2. Статус partial рядом с parsed/failed; миграция, если статус хранится ограниченным набором.
  3. Свёртка пишет непокрытые ключи в исход доставки и логирует их один раз — именами ключей, без содержимого.
  4. Тест на фикстуре с секцией, которой разбор не знает: статус partial, ключ в списке, точки метрик при этом сохранены.

Связано

  • retenshen-syrogo-arhiva — решить до неё.
  • proverka-novyh-sekcij — тот же признак закрывает и её: момент появления новой секции становится событием в логе.
  • trenirovki-i-zapisi — по мере разбора секций список непокрытых сокращается сам.