канон: «почему» больше не отправляется в architecture.md

Три документа — 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>
This commit is contained in:
av
2026-08-03 17:31:12 +03:00
co-authored by Claude Opus 5
parent d79189be18
commit 893d63d929
5 changed files with 54 additions and 62 deletions
+26 -38
View File
@@ -145,28 +145,26 @@ Module path — `git.vakhrushev.me/av/healthlog`.
- **Что такое «сделана»:** пайплайн `av-dev-pipeline:task-pipeline` пройден
целиком **и** критерии приёмки задачи проверены поимённо.
## Процесс
## Как здесь принято работать
Задачи — в [docs/tasks/BACKLOG.md](docs/tasks/BACKLOG.md) (один файл на запись,
индексы производны), цели — в [docs/tasks/PLAN.md](docs/tasks/PLAN.md). Ведёт их
скилл `av-dev-pm:tasks`, спринт и ритуал между спринтами — `av-dev-pm:session`.
Задачи и спринт ведёт `av-dev-pm`, работу над задачей — `av-dev-pipeline`.
Порядок шагов, состав проходов ревью и правила ведения задач здесь **не
пересказываются**: их дом — сами скиллы, а проектная настройка конвейера —
[docs/review.md](docs/review.md). Пересказ разъедется на первой же правке
скилла, и разойдётся молча.
Работа над задачей идёт скиллом `av-dev-pipeline:task-pipeline`: задача →
`opsx:explore``opsx:propose` → ревью спек (профиль `design`) → `opsx:apply`
ревью кода → `opsx:archive` → закрытие задачи → коммит. Ревью — скилл
`av-dev-pipeline:review-pipeline`, проходы — агенты `av-dev-pipeline:review-*`,
проектная настройка конвейера — [docs/review.md](docs/review.md).
Проектного здесь три вещи:
**Действуем автономно.** Умолчание — делать, а не спрашивать. Вопрос, который
решать не мне, **выносится в раздел «Вопросы»** файла задачи и помечается тегом
`question`; задача с открытым вопросом в спринт не берётся, а сама работа
переформулируется на остаток и доводится до коммита. Спрашиваем немедленно
только про **необратимое** — список выше.
**Действуем автономно.** Умолчание — делать, а не спрашивать. Немедленно
спрашиваем только про **необратимое** — список выше. Остальное, что решать не
мне, уходит вопросом в файл задачи, а работа переформулируется на остаток и
доводится до коммита.
**Развилка или вопрос — сперва prior art.** Проект не уникален: прежде чем
проектировать своё, смотрим, как это решено в референсах
[паспорта](docs/passport.md) и в интернете. Готовое решение либо берётся, либо
отвергается с названной причиной — и причина идёт в `architecture.md`.
**Развилка или вопрос — сперва prior art.** Проект не уникален; правило и
референсы — [docs/passport.md](docs/passport.md), раздел «Мы не делаем
уникального». Отвергли готовое решение — причина идёт в `design.md` изменения,
а оттуда промоутом в [docs/adr/](docs/adr/README.md). В `architecture.md`
обоснования больше не пишем: он переопределён как обзор.
**Поток не останавливается.** Телефон шлёт непрерывно и молча. Сломанный приём,
оставленный работать, теряет данные необратимо: доставка, не попавшая в
@@ -174,27 +172,17 @@ Module path — `git.vakhrushev.me/av/healthlog`.
## Конвенции
Механизируемое проверяет `task lint` (`.golangci.yml`): форма логов
(`sloglint`), `fmt.Print*` / `os.Getenv` / `time.Now` мимо единых точек
(`forbidigo`), сравнение ошибок (`errorlint`), сторонние пакеты ошибок
(`depguard`). Пересказывать эти правила не нужно — линтер скажет точнее.
Механизируемое проверяет `task lint` по `.golangci.yml`, прозой остаётся то,
что правилом не выражается — [docs/conventions/](docs/conventions/README.md).
Перечень правил и перечень записей есть в обоих файлах; здесь они не
дублируются.
Прозой остаётся то, что правилом не выражается:
[docs/conventions/README.md](docs/conventions/README.md) — уровень лога по адресату,
единственный логирующий чекпоинт на доменной границе, трансляция ошибки на
внешней границе, самодокументируемый `config.example.toml`, время в БД в UTC
RFC 3339, ULID через `ident`.
Отдельно: **тесты на разбор формата HAE держим на реальных пакетах** в
`testdata`. Документация формата тонкая и местами расходится с тем, что
приложение реально шлёт, — источником истины служат живые данные.
Что показал реальный поток — [docs/research/apple-health.md](docs/research/apple-health.md).
Читать **до** работы над разбором: там же лежат находки, которых нет в
документации HAE (поле `source` существует; порядок ключей в JSON нестабилен,
поэтому хеш содержимого считается по канонической форме с рекурсивной
сортировкой; мелкая группировка даёт интерполяцию, а не измерения). Файл
пополняется по мере накопления доставок.
Отдельно, потому что это решает, каким тестам верить: **тесты на разбор формата
HAE держим на реальных пакетах** в `testdata`. Документация формата тонкая и
местами расходится с тем, что приложение реально шлёт, — источником истины
служат живые данные, [docs/research/apple-health.md](docs/research/apple-health.md).
Читать **до** работы над разбором: скорее всего вопрос о формате уже закрыт
измерением.
## Язык