Триаж свёл 62 сырые находки девяти проходов к 33 причинам: 3 блокера, 4 «сейчас», 2 развилки. Все закрыты регрессионными тестами. - схема точки сна определяется по самой точке, а не по индексу в исходном массиве: одна пропущенная точка меняла эпизод и сводку местами - доставка сворачивается одной транзакцией: частичное состояние было недетерминированным (восемь прогонов — семь состояний) - граница размера на распакованном теле: 400 КиБ gzip разворачивались в 400 МиБ мимо max_body_mb - столкновение — расхождение канонических форм, а не байтов; WARN с координатами объекта; payload без HTML-экранирования - выравнивание по местной метке: получасовые зоны уводили часовую выгрузку в minute - доставка из одних суточных сводок больше не отвергается целиком - единицы не переписываются молча; счётчик считает сохранённые точки - все выходы Fold логируются, исход пишется на переживающем отмену контексте Четыре развилки вынесены блокерами в беклог.
3.6 KiB
Судьба доставки, у которой разобрана не вся секция data
Приоритет: блокеры
Вынуто ревью кода задачи razbor-metrik-v-obekty (профиль deep, проход
негативного пространства). Решить до реализации ретеншена.
Что решить
Разбор читает только data.metrics. Доставка, состоящая из workouts,
stateOfMind, symptoms или ecg, помечается parse_status=parsed с нулём
точек — неотличимо от доставки с пустой секцией метрик.
Почему это блокер, а не задача
Само по себе это некритично: секции пока не разбираются сознательно, тела лежат в архиве. Опасность в сцепке с ретеншеном.
Ретеншен по замыслу срезает архив до следующего проверенного экспорта. Если он
будет ориентироваться на parse_status, он снесёт тела, которые числятся
разобранными, — а для stateOfMind это необратимо: в экспорте Apple его
нет (находка 46), доставки HAE для него единственный источник.
То есть цена ошибки здесь не «придётся пересобрать», а «истории состояния разума больше не существует».
Варианты и цена
(1) Разбор возвращает список верхнеуровневых ключей data, которые он не
покрыл; статус partial.
Цена: малая — один json.Decoder по верхнему уровню, без чтения содержимого.
Ретеншен и reindex получают честный признак, а в логе появляется момент,
когда поток принёс новую секцию (ровно то, ради чего заведена задача
proverka-novyh-sekcij).
(2) Считать parsed только доставку, у которой разобрано всё; остальные —
pending.
Цена: малая, но pending перестаёт означать «ещё не смотрели», и подбор
зависших доставок теряет свой признак.
(3) Ничего не менять, но ретеншену запретить смотреть на parse_status —
резать только по дате экспорта.
Цена: нулевая сейчас, но ретеншен становится тупым и не защищает от «тело
разобрано неверно, а мы его уже срезали».
Рекомендация
(1). Список непокрытых ключей — дешёвая честность, и он же закрывает задачу «не пропустить момент, когда поедет новая секция».
Что стоит без решения
Ничего: сегодня ретеншена нет, тела не удаляются. Задача — не дать сцепке сложиться позже.
Связано: retenshen-syrogo-arhiva — решить до неё; proverka-novyh-sekcij — тот же признак закрыл бы и её.