Files
healthlog/docs/backlog/edinicy-metriki-v-razreze.md
T
av cd7a4c1493 отработаны находки ревью кода
Триаж свёл 62 сырые находки девяти проходов к 33 причинам: 3 блокера,
4 «сейчас», 2 развилки. Все закрыты регрессионными тестами.

- схема точки сна определяется по самой точке, а не по индексу в исходном
  массиве: одна пропущенная точка меняла эпизод и сводку местами
- доставка сворачивается одной транзакцией: частичное состояние было
  недетерминированным (восемь прогонов — семь состояний)
- граница размера на распакованном теле: 400 КиБ gzip разворачивались в
  400 МиБ мимо max_body_mb
- столкновение — расхождение канонических форм, а не байтов; WARN с
  координатами объекта; payload без HTML-экранирования
- выравнивание по местной метке: получасовые зоны уводили часовую выгрузку
  в minute
- доставка из одних суточных сводок больше не отвергается целиком
- единицы не переписываются молча; счётчик считает сохранённые точки
- все выходы Fold логируются, исход пишется на переживающем отмену контексте

Четыре развилки вынесены блокерами в беклог.
2026-08-01 19:02:05 +03:00

3.7 KiB

Единицы метрики: часть координаты или свойство объекта

Приоритет: блокеры

Вынуто ревью кода задачи razbor-metrik-v-obekty (профиль deep, найдено тремя проходами независимо).

Что решить

Единицы измерения живут колонкой объекта — одна на все точки часа. Что делать, когда в тот же час приезжают точки в других единицах.

Почему это не мелочь

Внутри точки единиц нет: проверено на 89 доставках, поле units не встретилось ни разу, оно живёт только на уровне метрики. Значит у точки, сохранённой раньше, не остаётся ничего, по чему её единицы восстановимы — кроме сырого архива, пока он жив.

Смена реальна и не требует злого умысла: переключатель единиц в настройках HAE, смена локали телефона, переименование единицы в новой версии приложения.

Варианты и цена

(1) Единицы — часть координаты объекта (метрика + слой + единицы + час). Цена: миграция, ключ шире, каталог разрезов обязан показывать единицы. Зато точки никогда не подписаны чужим — разные единицы просто разные ряды.

(2) Первое непустое побеждает, расхождение — WARN и счётчик (сделано сейчас как безопасное умолчание). Цена: нулевая, уже работает. Но час, начавшийся в километрах, останется километровым навсегда, даже если телефон окончательно переехал на мили.

(3) Хранить обе величины у объекта (units и units_seen). Цена: малая, но это откладывание решения: читателю всё равно придётся выбирать.

Рекомендация

(1), если единицы вообще могут меняться на живом потоке — а они могут. Сегодняшний (2) безопасен, но оставляет систематическую ложь в подписи.

Что стоит без решения

Ничего не теряется: сохранённые единицы больше не перезаписываются молча (было — пришедшие всегда побеждали), расхождение считается в MergeStats.UnitsConflicts и даёт WARN в свёртке.

Отдельная тонкость, которую надо закрыть тем же решением: единицы не входят в хеш содержимого, поэтому доставка с теми же точками и исправленными единицами уходит по ветке «ничего не изменилось» и колонку не трогает. То есть единицы сегодня обновляются тогда и только тогда, когда изменилось содержимое, — правило, которого никто не формулировал.