отработаны находки ревью кода
Триаж свёл 62 сырые находки девяти проходов к 33 причинам: 3 блокера, 4 «сейчас», 2 развилки. Все закрыты регрессионными тестами. - схема точки сна определяется по самой точке, а не по индексу в исходном массиве: одна пропущенная точка меняла эпизод и сводку местами - доставка сворачивается одной транзакцией: частичное состояние было недетерминированным (восемь прогонов — семь состояний) - граница размера на распакованном теле: 400 КиБ gzip разворачивались в 400 МиБ мимо max_body_mb - столкновение — расхождение канонических форм, а не байтов; WARN с координатами объекта; payload без HTML-экранирования - выравнивание по местной метке: получасовые зоны уводили часовую выгрузку в minute - доставка из одних суточных сводок больше не отвергается целиком - единицы не переписываются молча; счётчик считает сохранённые точки - все выходы Fold логируются, исход пишется на переживающем отмену контексте Четыре развилки вынесены блокерами в беклог.
This commit is contained in:
@@ -34,6 +34,15 @@
|
||||
- **THEN** точка не попадает в хранилище
|
||||
- **AND** факт учитывается в итоге разбора доставки
|
||||
|
||||
#### Scenario: Точка с нечитаемым концом интервала пропускается
|
||||
|
||||
- **WHEN** точка несёт `end`, который не разбирается
|
||||
- **THEN** точка не попадает в хранилище
|
||||
- **AND** факт учитывается отдельным счётчиком
|
||||
|
||||
Вырождать такую точку в мгновенную нельзя: две записи с общим началом получили
|
||||
бы одну координату, и одна исчезла бы молча. Тело остаётся в архиве.
|
||||
|
||||
### Requirement: Вывод слоя гранулярности
|
||||
|
||||
Система SHALL выводить слой точки из **выравнивания меток времени**, а не из
|
||||
@@ -45,6 +54,12 @@
|
||||
но **не выводится** — он назначается схемам с фиксированной гранулярностью
|
||||
(см. «Разделение схем под одним именем метрики»).
|
||||
|
||||
Выравнивание SHALL считаться по метке в **исходной зоне**, а не по метке в UTC.
|
||||
HAE строит сетку по местному времени; ровный местный час в зоне со смещением на
|
||||
половину (`+0530`, `+0545`, `+0930`) даёт UTC-метку на середине часа, и часовая
|
||||
выгрузка целиком уехала бы в слой `minute` — где столкнулась бы с настоящей
|
||||
минутной автоматизацией и завысила сумму минутного слоя вдвое.
|
||||
|
||||
Слоем метрики SHALL становиться **самое мелкое** выравнивание среди её меток, а
|
||||
не преобладающее. Измерено: у плотных метрик выравнивания перемешаны
|
||||
(`active_energy` — 1320 минутных меток и 21 часовая, `heart_rate` — 654
|
||||
@@ -67,6 +82,11 @@
|
||||
- **WHEN** в доставке у метрики не меньше десяти точек с метками
|
||||
- **THEN** слой определяется выравниванием её собственных меток
|
||||
|
||||
#### Scenario: Зона с получасовым смещением не делает часовую выгрузку минутной
|
||||
|
||||
- **WHEN** метки стоят на ровном местном часе, а смещение зоны равно `+0530`
|
||||
- **THEN** слой метрики `hour`
|
||||
|
||||
#### Scenario: Одна метка на середине часа делает метрику минутной
|
||||
|
||||
- **WHEN** у плотной метрики десять меток стоят ровно на часе, а одна — на
|
||||
@@ -79,6 +99,16 @@
|
||||
- **THEN** она получает самый мелкий слой среди плотных метрик этой доставки
|
||||
- **AND** её собственное выравнивание во внимание не принимается
|
||||
|
||||
#### Scenario: Доставка, где всем метрикам слой назначен схемой
|
||||
|
||||
- **WHEN** в доставке нет метрик, которым слой надо выводить, — все точки
|
||||
принадлежат схемам с фиксированной гранулярностью
|
||||
- **THEN** доставка сохраняется, а слой доставки не выводится и не требуется
|
||||
|
||||
Иначе доставка автоматизации, настроенной только на сон, отвергалась бы
|
||||
целиком — и необратимо: исход детерминирован, и пересборка повторяла бы его
|
||||
вечно.
|
||||
|
||||
#### Scenario: В доставке нет плотных метрик
|
||||
|
||||
- **WHEN** ни у одной метрики доставки нет десяти точек
|
||||
@@ -163,6 +193,20 @@ Export шлёт под одним именем, чтобы одно имя оз
|
||||
(`totalSleep`/`core`/`rem`/`deep`/`awake` с меткой на местной полуночи). Общих
|
||||
полей, кроме `date` и `source`, у них нет.
|
||||
|
||||
Схема точки SHALL определяться по самой точке, а не по её месту в исходном
|
||||
массиве. Список разобранных точек отфильтрован пропусками, и соответствие по
|
||||
индексу съезжало бы от одной пропущенной точки: эпизод уезжал бы под имя
|
||||
суточной сводки со слоем `day`, сводка — под имя эпизода. Метрика и слой входят
|
||||
в координату, поэтому ошибка необратима — точки из объекта не удаляются, и
|
||||
пересборка воспроизвела бы её.
|
||||
|
||||
#### Scenario: Пропущенная точка не сдвигает разметку схем
|
||||
|
||||
- **WHEN** в метрике `sleep_analysis` перед суточной сводкой стоит точка без
|
||||
разбираемой метки
|
||||
- **THEN** сводка всё равно сохраняется под именем `sleep_analysis_summary` со
|
||||
слоем `day`
|
||||
|
||||
#### Scenario: Поэпизодная запись сна
|
||||
|
||||
- **WHEN** точка `sleep_analysis` содержит поле `value`
|
||||
|
||||
Reference in New Issue
Block a user