- род метрики выводится сверкой минутного слоя с часовым: часовое значение сходится с суммой минутных — накопительная, со средним — мгновенная, иначе `unknown` и свёртка не предлагается вовсе. На живом архиве (123 доставки, 31 метрика) 7 накопительных, 9 мгновенных, противоречащих часов ноль - `GET /api/v1/metrics` под токеном чтения отдаёт единицы, слои с границами и род вместе с основанием измерения; род нигде не хранится — он функция витрины, а витрина функция журнала, устаревать в нём нечему - миграция 00009: покрывающий индекс, чтобы каталог отвечал по учётным колонкам, не разжимая содержимое объектов
5.0 KiB
План
Это порядок и его обоснование, а не список работ. Единицы работы живут в беклоге — одна задача, один файл, свой приоритет. План отвечает «почему в таком порядке», беклог — «что брать следующим».
Отсюда правило: содержимое шага здесь не перечисляется. Шаг — это название и статус; что именно в нём делается, знает задача. Иначе список работ живёт в двух местах и расходится с каждой закрытой задачей. Меняется этот файл, когда меняется порядок, а не когда закрывается задача.
Ближайшая цель
Метрики разбираются и ложатся в часовые объекты: тела перестали быть
недифференцированной кучей. Приём отвечает 200, не дожидаясь свёртки: её ведёт
фоновый воркер, для которого очередью служит сама таблица доставок.
reindex сделан: журнал проигрывается в свежую витрину, отпечатки
сравниваются, повторный прогон ничего не меняет. Доставки, числящиеся pending
после миграции 00005, подбираются им же — но применяется результат подменой
базы, а её делает человек при остановленном сервисе. Тем же кодом закрывается
половина задачи «разнести ответ и свёртку»: проигрывание журнала теперь готовая
операция.
Тренировки и записи со своими id разбираются: workouts и stateOfMind —
половина потока — перестали лежать неразобранными. От разбора остался словарь
категориальных значений.
Род агрегации измерен: сверка минутного слоя с часовым разложила метрики живого корпуса на накопительные и мгновенные, не сойдясь ни на одной. Каталог разрезов отдаётся первым маршрутом чтения — дальше Read API, которому теперь есть на чём строить свёртку.
Разведка закончена: правило вывода слоя, модель идентичности и формы точки проверены на живом потоке, выводы — в local-research.md.
Шаги
- 1. Каркас.
- 2. Приём без разбора. ← подключаем телефон по локальной сети
- [~] 3. Разбор и хранилище. Метрики, тренировки и записи со своими
id,reindex— сделано; словарь категориальных значений — нет. - 4. Каталог и род агрегации.
- 5. Read API.
- 6. Самоописание.
- 7. MCP.
- 8.
healthlog import. - 9. Устаревание нижнего слоя.
- 10. Наблюдаемость.
- 11. Деплой.
Порядок неслучаен, и это единственное, чего нет в беклоге:
- Каталог и род агрегации — перед Read API. Без измеренного рода свёртка в ответе неотличима от угадывания, а ошибиться здесь дорого: просуммировать нижний слой значит завысить втрое.
healthlog import— перед устареванием нижнего слоя. Пока импорт экспорта не написан, помечать что-либо устаревшим не на основании чего.- Read API — перед MCP. Адаптер собственной логики не несёт, он переводит вызовы в те же обработчики; переводить пока нечего.
Отложенное
Отложенных идей в плане нет: их место — беклог с пометкой
[idea]. Два дома для одной идеи расходятся, и тогда полного списка не даёт ни
один; вопрос «что мы решили отложить» задаётся беклогу.