docs: документация приведена к канону av-dev-pm 4

- каждая запись каталога задач получила тип вместо тега kind: и префикса
  заголовка; секция роадмапа «Разработка» стала «Сопровождением», порядок
  секций канонический
- поправлены протухшие факты: нереализованные маршруты Read API, MCP и
  `healthlog import`, словарь слоёв в инварианте, семантика гейта по покрытию
  диффа, периметр перестал дублировать security.md
- замер слияния переведён с находки 49 на находку 54, заполнены Purpose спек
  storage и parsing
This commit is contained in:
av
2026-08-05 19:09:35 +03:00
parent e4f62785d8
commit 3d24248075
66 changed files with 322 additions and 227 deletions
+12 -7
View File
@@ -13,7 +13,7 @@
Коллектор данных Apple Health. Принимает выгрузки из Health Auto Export и
родного экспорта Apple, хранит их и отдаёт другим моим проектам — через HTTP
API и через MCP. Это **хранилище, а не аналитика**: принять, дедуплицировать,
API и, в планах, через MCP. Это **хранилище, а не аналитика**: принять, дедуплицировать,
сохранить, отдать. Не переименовывать поля Apple, не интерпретировать
значения. Агрегат считается только в ответе на запрос и только там, где род
метрики измерен.
@@ -22,7 +22,7 @@ API и через MCP. Это **хранилище, а не аналитика**
Go, один статический бинарь (`CGO_ENABLED=0`). SQLite (`modernc.org/sqlite`,
чистый Go), `chi`, `sqlx`, `goose` (миграции), `pelletier/go-toml/v2`,
`log/slog`, ULID через `internal/ident`.
`log/slog`, ULID (`github.com/oklog/ulid/v2`) через `internal/ident`.
Module path — `git.vakhrushev.me/av/healthlog`.
@@ -65,8 +65,10 @@ Module path — `git.vakhrushev.me/av/healthlog`.
образ жизни» на языке телефона, а родной экспорт — коды HealthKit, и без
словаря эти два источника не сойтись.
- **Своей агрегации в хранении нет — есть слои.** `critical`, обратимо
пересборкой. Метрика лежит в той подробности, в какой пришла (`sample`/`raw`/`minute`/`hour`); слой выводится
из выравнивания меток, а не из заголовка HAE — тот врёт.
пересборкой. Метрика лежит в той подробности, в какой пришла
(`sample`/`raw`/`minute`/`hour`/`day`); слой выводится
из выравнивания меток, а не из заголовка HAE — тот врёт. Перечень слоёв один и
лежит в [docs/database.md](docs/database.md), таблица `bucket`.
- **Агрегация в ответе — только измеренная.** `critical`, обратимо: ответ не
хранится, но потребитель уже принял по нему решение. Род свёртки выводится
сверкой слоёв между собой (часовое = сумма минутных → накопительная, = среднее →
@@ -110,9 +112,12 @@ Module path — `git.vakhrushev.me/av/healthlog`.
- **Исходы:** 0 — зелёный; ненулевой — красный, и до его починки опиниативные
проходы ревью **не запускаются**.
- **Что красит безусловно:** любой файл из `./data` в индексе, любой токен в
индексе, непокрытая изменённая строка, миграция без правки `docs/database.md`.
Причина одна на все: это ровно те отказы, которые не видны глазами и стоят
необратимо.
индексе, миграция без правки `docs/database.md`. Причина одна на все: это
ровно те отказы, которые не видны глазами и стоят необратимо. Покрытие
изменённых строк задумано тем же классом, но сегодня гейт от него **не
краснеет**: `scripts/diff-coverage.py` всегда возвращает `0`, и шаг печатает
`OK` при любом покрытии — разбор непокрытых строк остаётся человеку или
проходу ревью. Запись 2026-08-04 в [docs/review.md](docs/review.md).
- **Чего в гейте намеренно нет и кто обязан это гонять:**
`task verify:archive` (минута прогона, данные есть только на этой машине) и
`task verify:busy` (около 50 секунд). Гоняет их **человек или оркестратор задачи**