- находки 48 и 49: единицы не менялись ни разу; настоящих столкновений 0.65%, несравнимых наборов полей нет, тай-брейк берёт меньшее в 96% случаев - edinicy-metriki-v-razreze закрыт: гипотеза не подтвердилась замером - тай-брейк отложен до каталога рода агрегации
61 lines
4.2 KiB
Markdown
61 lines
4.2 KiB
Markdown
# Непокрытые секции доставки видны в статусе разбора
|
||
|
||
**Приоритет:** высокий
|
||
|
||
Была блокером, вынутым ревью кода задачи `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](otvet-i-svyortka.md).
|
||
- Запретить ретеншену смотреть на `parse_status` — нулевая цена сейчас, но
|
||
ретеншен становится тупым и не защищает от «тело разобрано неверно, а мы его
|
||
уже срезали».
|
||
|
||
Список непокрытых ключей — дешёвая честность, и он же закрывает задачу «не
|
||
пропустить момент, когда поедет новая секция».
|
||
|
||
## Что делать
|
||
|
||
1. `hae.Parse`: перечислить верхнеуровневые ключи `data` и вернуть те, что
|
||
разбор не покрыл. Один `json.Decoder` по верхнему уровню, **без чтения
|
||
содержимого** — секции доходят до десятков МиБ.
|
||
2. Статус `partial` рядом с `parsed`/`failed`; миграция, если статус хранится
|
||
ограниченным набором.
|
||
3. Свёртка пишет непокрытые ключи в исход доставки и логирует их один раз —
|
||
именами ключей, без содержимого.
|
||
4. Тест на фикстуре с секцией, которой разбор не знает: статус `partial`,
|
||
ключ в списке, точки метрик при этом сохранены.
|
||
|
||
## Связано
|
||
|
||
- [retenshen-syrogo-arhiva](retenshen-syrogo-arhiva.md) — решить **до** неё.
|
||
- [proverka-novyh-sekcij](proverka-novyh-sekcij.md) — тот же признак закрывает
|
||
и её: момент появления новой секции становится событием в логе.
|
||
- [trenirovki-i-zapisi](trenirovki-i-zapisi.md) — по мере разбора секций список
|
||
непокрытых сокращается сам.
|