каталог вместо файла в docs/ — отложено, критерий записан

Тема 16. Порог в строках триггером не становится: единственный документ
у порога — healthlog/docs/architecture.md, 1662 строки, но в нём десять
маркеров долга, а разделы «Слои гранулярности», «Тренировки и прочие
секции», «Свёртка и размер ответа» — поведение, чей дом openspec/specs/,
где уже лежат пять capability. Порог сработал бы там, где надо доводить
переезд, и дал бы долгу постоянное жильё.

- шов выноса — другой читатель или другой срок жизни: review.md
  (настройка стабильна, журнал растёт) и architecture по «окружение,
  деплой, наблюдатель»; расщепление по решениям отвергнуто — у «почему»
  дом adr/; security.md и passport.md остаются файлами;
- вводить — только с одной точкой входа: <имя>/README.md и есть прежний
  документ, каждый файл каталога достижим ссылкой из него (ловится
  сегодняшним check_links). docs/architecture.md упомянут в репозитории
  66 раз, развилка «файл или каталог» размножится на девять charter'ов;
- решение после переезда healthlog: замерить остаток, жмёт — канон
  версии 3. TODO шаг 2 дополнен пунктом, 1611 строк исправлены на 1662.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-04 09:02:46 +03:00
co-authored by Claude Opus 5
parent dd3bb0f965
commit 3103526de2
2 changed files with 76 additions and 1 deletions
+72
View File
@@ -1080,3 +1080,75 @@ HTML-комментарии, невидимые в отрендеренном ma
проверок репозитория: **ошибка в блоке не видна при чтении** — текст
правдоподобен, дифф разумен, падает только рендер. Расхождение с прозой
скрипт не ловит и не притворяется, что ловит: это работа правила 63.
## 16. Каталог вместо файла в `docs/` — отложено до переезда healthlog (2026-08-04)
### Что было
Вопрос: разрешить документам в корне `docs/` быть не только файлом, но и
каталогом — когда документ описывает несколько принципиальных решений или
перерастает 400–500 строк. Паспорт остаётся файлом в любом случае: компактность
и есть его функция.
Механизм в каноне уже работает — `conventions/`, `research/`, `adr/` каталоги с
обязательным `README.md`-индексом, — так что вопрос не «можно ли», а «от чего
лечим».
### Решено
**CCC. Порог в строках триггером не становится.** Замер по проектам: у порога
ровно один документ — `healthlog/docs/architecture.md`, 1662 строки. В нём
десять маркеров долга, а разделы — «Слои гранулярности» (211 строк), «Тренировки
и прочие секции» (222), «Условный запрос», «Свёртка и размер ответа», «Форма
ответа». Это **поведение**, чей нормативный дом `openspec/specs/`, где у проекта
уже лежат пять capability. Остальные документы 108–438 строк, `jellybit` — 169.
Порог сработал бы ровно там, где надо не разносить, а доводить переезд, и дал бы
долгу постоянное жильё: разложить 1662 строки по файлам дешевле, чем вынести их
в спеки, а после раскладки давление исчезнет и второй дом поведения останется
навсегда.
**DDD. Шов выноса — другой читатель или другой срок жизни, а не размер.** По
этому критерию кандидатов два. `review.md` — сильнее прочих: у него уже записаны
два раздела с разными сроками жизни, настройка конвейера стабильна и читается
проходами, а журнал дефектов растёт неограниченно. `architecture.md` — по шву
«окружение, деплой, наблюдатель», у которого отдельный читатель `ops`. А вот
расщепление архитектуры **по принципиальным решениям отвергнуто**: у факта
«почему решено так» дом `adr/`, и вынесенные разделы немедленно станут его
вторым домом.
**EEE. `security.md` и `passport.md` каталогом не становятся.** У `security.md`
ценность именно в цельности: периметр первой строкой и «что вне модели» читаются
враждебным проходом за один раз, а разнесённые — расходятся первыми. У
`database.md` механизм заводить не под что: 241 и 211 строк.
**FFF. Если вводить — точка входа остаётся одна.** `docs/architecture.md`
упомянут в репозитории 66 раз: девять charter'ов, карта `project-facts.md`,
`docs.py`, скелеты. Развилка «файл или каталог» размножится на девять «прочитай
либо обойди». Поэтому форма жёсткая: каталог легален только при
`<имя>/README.md`, и он **и есть** прежний документ — обзор целиком со ссылками
на вынесенное, а не оглавление к нему. Каждый файл каталога обязан быть достижим
ссылкой из `README.md`; это проверяется сегодняшним механизмом ссылок `docs.py`
и ловит файл-сироту. Вынеся раздел, `README.md` на него **ссылается, а не
пересказывает** — тот же приём, которым в архитектуре уже описаны компоненты со
ссылкой на capability.
**GGG. Решение отложено до конца переезда `healthlog` (шаг 2 TODO).** Порядок:
довести поведение в спеки, замерить остаток. Жмёт после этого — вводить каноном
версии 3, и сразу для `review.md` и `architecture.md`, а не для всех документов
корня скопом.
### Что из этого следует
65. **Цена изменения — версия канона, а не правка одного файла.** Обратной
совместимости у канона нет, поэтому в счёт входят: `docs.py` (`check_stray` с
его `ALLOWED_FILES`/`ALLOWED_DIRS`, `check_required` — обязательный путь
становится развилкой, `check_capabilities` — сегодня читает ровно один файл),
`skeletons.md`, `project-facts.md`, девять charter'ов, запись в
`changelog.md` канона и ветка `upgrade` в скилле `canon`.
66. **Раздутый документ канона — сначала подозреваемый, потом кандидат на
вынос.** Диагностика перед раскладкой — счёт маркеров долга
(`grep -c "<!-- канон:"`) и вопрос, не поведение ли это. Разложить дрейф по
файлам значит перестать его видеть.
67. **Материал для решения даёт `healthlog`, а не `jellybit`.** У второго 169
строк архитектуры — там вопрос не стоит вовсе, и принимать по нему решение
значит принимать его без предмета.
+4 -1
View File
@@ -114,7 +114,10 @@
## 2. healthlog — первая боевая проверка
- [ ] `canon adopt`; `docs/backlog/``docs/tasks/`
- [ ] `architecture.md` 1611 строк → обзор, остаток маркерами (W)
- [ ] `architecture.md` 1662 строки → обзор, остаток маркерами (W)
- [ ] после выноса поведения — замерить остаток `architecture.md` и решить по
каталожной форме: жмёт → канон версии 3 для `architecture.md` и
`review.md`, точка входа `README.md` (тема 16, GGG, 65)
- [ ] завести `security.md` с периметром первой строкой (J)
- [ ] `review-journal.md``review.md` + настройка конвейера (K, L)
- [ ] `conventions.md``conventions/`, `local-research.md``research/` (G)