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

67 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# План
Это **порядок и его обоснование**, а не список работ. Единицы работы живут в
[беклоге](backlog/README.md) — одна задача, один файл, свой приоритет. План
отвечает «почему в таком порядке», беклог — «что брать следующим».
Отсюда правило: **содержимое шага здесь не перечисляется.** Шаг — это название
и статус; что именно в нём делается, знает задача. Иначе список работ живёт в
двух местах и расходится с каждой закрытой задачей. Меняется этот файл, когда
меняется порядок, а не когда закрывается задача.
## Ближайшая цель
Метрики разбираются и ложатся в часовые объекты: тела перестали быть
недифференцированной кучей. Приём отвечает `200`, не дожидаясь свёртки: её ведёт
фоновый воркер, для которого очередью служит сама таблица доставок.
**`reindex` сделан**: журнал проигрывается в свежую витрину, отпечатки
сравниваются, повторный прогон ничего не меняет. Доставки, числящиеся `pending`
после миграции 00005, подбираются им же — но применяется результат подменой
базы, а её делает человек при остановленном сервисе. Тем же кодом закрывается
половина задачи «разнести ответ и свёртку»: проигрывание журнала теперь готовая
операция.
Тренировки и записи со своими `id` разбираются: `workouts` и `stateOfMind`
половина потока — перестали лежать неразобранными. От разбора остался словарь
категориальных значений.
**Род агрегации измерен**: сверка минутного слоя с часовым разложила метрики
живого корпуса на накопительные и мгновенные, не сойдясь ни на одной. Каталог
разрезов отдаётся первым маршрутом чтения — дальше Read API, которому теперь
есть на чём строить свёртку.
Разведка закончена: правило вывода слоя, модель идентичности и формы точки
проверены на живом потоке, выводы — в [local-research.md](local-research.md).
## Шаги
- [x] **1. Каркас.**
- [x] **2. Приём без разбора.****подключаем телефон по локальной сети**
- [~] **3. Разбор и хранилище.** Метрики, тренировки и записи со своими `id`,
`reindex` — сделано; словарь категориальных значений — нет.
- [x] **4. Каталог и род агрегации.**
- [ ] **5. Read API.**
- [ ] **6. Самоописание.**
- [ ] **7. MCP.**
- [ ] **8. `healthlog import`.**
- [ ] **9. Устаревание нижнего слоя.**
- [ ] **10. Наблюдаемость.**
- [ ] **11. Деплой.**
Порядок неслучаен, и это единственное, чего нет в беклоге:
- **Каталог и род агрегации — перед Read API.** Без измеренного рода свёртка в
ответе неотличима от угадывания, а ошибиться здесь дорого: просуммировать
нижний слой значит завысить втрое.
- **`healthlog import` — перед устареванием нижнего слоя.** Пока импорт
экспорта не написан, помечать что-либо устаревшим не на основании чего.
- **Read API — перед MCP.** Адаптер собственной логики не несёт, он переводит
вызовы в те же обработчики; переводить пока нечего.
## Отложенное
Отложенных идей в плане нет: их место — [беклог](backlog/README.md) с пометкой
`[idea]`. Два дома для одной идеи расходятся, и тогда полного списка не даёт ни
один; вопрос «что мы решили отложить» задаётся беклогу.