Files
healthlog/docs/plan.md
T
av 03edf1087d Каталог разрезов и измеренный род агрегации
- род метрики выводится сверкой минутного слоя с часовым: часовое значение
  сходится с суммой минутных — накопительная, со средним — мгновенная, иначе
  `unknown` и свёртка не предлагается вовсе. На живом архиве (123 доставки,
  31 метрика) 7 накопительных, 9 мгновенных, противоречащих часов ноль
- `GET /api/v1/metrics` под токеном чтения отдаёт единицы, слои с границами и
  род вместе с основанием измерения; род нигде не хранится — он функция витрины,
  а витрина функция журнала, устаревать в нём нечему
- миграция 00009: покрывающий индекс, чтобы каталог отвечал по учётным колонкам,
  не разжимая содержимое объектов
2026-08-02 19:23:59 +03:00

5.0 KiB
Raw Blame History

План

Это порядок и его обоснование, а не список работ. Единицы работы живут в беклоге — одна задача, один файл, свой приоритет. План отвечает «почему в таком порядке», беклог — «что брать следующим».

Отсюда правило: содержимое шага здесь не перечисляется. Шаг — это название и статус; что именно в нём делается, знает задача. Иначе список работ живёт в двух местах и расходится с каждой закрытой задачей. Меняется этот файл, когда меняется порядок, а не когда закрывается задача.

Ближайшая цель

Метрики разбираются и ложатся в часовые объекты: тела перестали быть недифференцированной кучей. Приём отвечает 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]. Два дома для одной идеи расходятся, и тогда полного списка не даёт ни один; вопрос «что мы решили отложить» задаётся беклогу.