- роадмап отвечает «что умеет и чего не умеет»: PLAN.md → ROADMAP.md, четыре
канонические секции, достигнутые звенья строками в «Готово», цели
переформулированы возможностями приложения
- задачи: род работы и «Затрагивает» набору спринта, 34 заголовка в форму
действия, «Завершение» целей перечнями со ссылкой из каждой задачи
- вычитка проходами task-form и doc-wording, починены протухшие факты в README,
паспорте и review.md
- `GET /api/v1/metrics/{name}?from&to&layer` — ряд точек за период; конверт
объявляет слой, измеренный род, его применимость к отданному ряду и границу
окна измерения, а сам ряд собирается из одного слоя, выбранного по охвату
точек внутри периода
- use-case вынесен в `internal/points`, чтение — одним входом `store.ReadSeries`
под одной транзакцией; правило выбора слоя остаётся в домене и приходит в
хранилище колбэком
- `writeJSON` перестал экранировать HTML-символы и перестал глушить отказ
записи: дословность содержимого точки иначе не удерживается, а оборванное
тело уходило под видом успешного `200`
- доменные типы internal/catalog лишились json-тегов и MarshalJSON; типы
metricWire/layerWire/aggregationWire и перевод catalogWire живут в транспорте,
тело отказа тоже получило объявленный тип — байты ответа не изменились
- заведён сторож: обход графа типов ответа утверждает, что домен не доезжает до
сериализации, плюс требование json-тега на полях транспортных структур и
заведомо красные случаи к обоим правилам
- решение с ценой обеих сторон записано в architecture.md и ADR; шаг lint в
гейте получил свой кеш — общий на машину красил прогон находками из чужого
worktree
- свёртка спрашивает журнал, встречалось ли имя строго раньше по паре
(received_at, id), и пишет WARN с атрибутом uncovered_new; повторные молчат.
Признак выводится, а не хранится — реестр был бы второй копией факта
- добавлена подкоманда `healthlog uncovered`: перечень накопленного, чтение
только на чтение, экранированные имена и названные границы носителя
- синк документации: ADR о выводе новизны из журнала, две записи в журнал
дефектов, два правила промоутом в конвенции, терминал оператора назван
адресатом недоверенного входа
- на master после ff-слияния база диффа равна HEAD, все go-шаги пропускаются,
и вакуумный прогон выглядит зелёным
- тот же прогон с явной базой нашёл красный lint
- байтовый порядок канонических форм остался тай-брейком только внутри одной
доставки: на живом корпусе он решал 98,8% спорных координат и системно хранил
меньшее значение, из-за чего step_count терял род и verify:archive был красным
- правило перестало быть коммутативным осознанно, поэтому порядок свёртки
приведён к журнальному: проход воркера прекращается на отложенной доставке,
а свёртка вне порядка журнала пишет WARN
- заведены счётчики PointsHeld и PointsErased — удержание полнотой и
единственное направление, в котором правило теряет содержание
- фазы сна, контекст пульса и имена тренировок попадают в реестр
`category_value` (миграция 00010): строка хранится дословно, выведенный код
лежит рядом отдельной записью, а не полем внутри точки
- словарь и синонимы кодов живут в бинаре (`internal/healthkit`); локаль из
`Accept-Language` сужает поиск, но в ключ реестра не входит — заголовков в
сыром архиве нет
- наблюдение входит в отпечаток витрины, выведенный код — нет: он производная
от словаря, а не от журнала
- три задачи с решением от 2026-08-02 сохраняли тег question и непустой раздел
«Вопросы», то есть sprint take отказал бы их взять
- там же названы два числа сессии: ориентир 5–8 задач ничем не замерян, а отбор
по --stale слеп, пока у каталога нет собственной истории правок
Три документа — CLAUDE.md, паспорт и openspec/config.yaml — велели писать
причину отвергнутого решения в architecture.md. По канону дом «почему» это
design.md изменения и промоут в docs/adr/, а architecture.md переезд как раз
опустошает: обоснования шли ровно туда, откуда их вычищают.
Раздел «Процесс» в CLAUDE.md пересказывал шаги пайплайна дословно — тот же
второй дом, что уже вычищен из config.yaml. Осталось три вещи, которые
действительно проектные: автономность, prior art, «поток не останавливается».
config.yaml пересказывал паспорт и инвариант безопасности — стали ссылками.
docs/review.md ссылался на healthlog-review-rubric и healthlog-task-pipeline,
удалённые вместе с проектными копиями. Первое — указание на будущее, поэтому
исправлено на проходы rubric и ops; второе оставлено историей с пометкой.
README.md называл architecture.md домом «принятых решений» и не упоминал
database.md и adr/ вовсе.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- беклог и план переехали в docs/tasks (38 задач, 11 целей), слаги
переименованы с транслита на английские, 85 ссылок поправлены
- conventions.md разобран в docs/conventions/, local-research.md — в
docs/research/, review-journal.md — в docs/review.md с разделом настройки
конвейера; заведены security.md, adr/ и .pm.json
- шаг docs.py check добавлен в task gate; поведение в architecture.md помечено
девятью маркерами долга, database.md получил настройки с числовым значением