Compare commits

..
2 Commits
Author SHA1 Message Date
avandClaude Opus 5 3103526de2 каталог вместо файла в 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>
2026-08-04 09:02:46 +03:00
avandClaude Opus 5 dd3bb0f965 README: добавлен раздел «Снятие» — обратное подключению
Актуально для av-dev-backlog: плагин устарел и снимается с проекта по
мере перевода задач на docs/tasks/. Порядок обязателен — сначала canon,
потом uninstall, иначе проект остаётся со старой раскладкой и без
скилла, который её понимает.

Проверено на одноразовых проектах, не выведено из документации:
- uninstall правит два места — enabledPlugins в settings.json проекта и
  запись в installed_plugins.json; кэш-снимок и extraKnownMarketplaces
  не трогает;
- вызванная не из проекта, команда отказывается словами is not installed
  in project scope, а не снимает наугад, как plugin update;
- ручная правка settings.json не убирает запись реестра, но та же
  команда добирает её и при уже пустом enabledPlugins.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 09:02:31 +03:00
3 changed files with 111 additions and 2 deletions
+72
View File
@@ -1080,3 +1080,75 @@ HTML-комментарии, невидимые в отрендеренном ma
проверок репозитория: **ошибка в блоке не видна при чтении** — текст проверок репозитория: **ошибка в блоке не видна при чтении** — текст
правдоподобен, дифф разумен, падает только рендер. Расхождение с прозой правдоподобен, дифф разумен, падает только рендер. Расхождение с прозой
скрипт не ловит и не притворяется, что ловит: это работа правила 63. скрипт не ловит и не притворяется, что ловит: это работа правила 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
строк архитектуры — там вопрос не стоит вовсе, и принимать по нему решение
значит принимать его без предмета.
+35 -1
View File
@@ -27,7 +27,7 @@
архитектура, обязательный триаж. Девять агентов-проходов. архитектура, обязательный триаж. Девять агентов-проходов.
- **av-dev-git** — `commit`: сообщения в личном стиле. - **av-dev-git** — `commit`: сообщения в личном стиле.
- **av-dev-backlog** — **устарел**, заменён `av-dev-pm`. Живёт до перевода - **av-dev-backlog** — **устарел**, заменён `av-dev-pm`. Живёт до перевода
последнего проекта. последнего проекта; как снять с проекта — [Снятие](#снятие).
Соглашение об именах: имя **плагина** длинное с префиксом `av-dev-`, имена Соглашение об именах: имя **плагина** длинное с префиксом `av-dev-`, имена
**скилов** внутри — короткие. Вызов выходит вида `/av-dev-<плагин>:<скилл>`. **скилов** внутри — короткие. Вызов выходит вида `/av-dev-<плагин>:<скилл>`.
@@ -186,6 +186,40 @@ EOF
**Изменения применяются после перезапуска Claude Code** — работающая сессия **Изменения применяются после перезапуска Claude Code** — работающая сессия
держит скиллы в контексте и про новый снимок не знает. держит скиллы в контексте и про новый снимок не знает.
## Снятие
Действие, обратное подключению. Актуально для `av-dev-backlog`: плагин устарел,
и с каждого проекта снимается по мере перевода задач на канон `docs/tasks/`.
**Сначала перевод, потом снятие.** Задачи переводит `/av-dev-pm:canon`
(`docs/backlog/``docs/tasks/`). Снять плагин раньше — остаться со старой
раскладкой и без скилла, который её понимает.
```bash
cd /path/to/project
claude plugin uninstall av-dev-backlog@av-dev-skills --scope project
```
Команда правит два места: убирает строку из `enabledPlugins` в
`.claude/settings.json` проекта и запись из реестра
`~/.claude/plugins/installed_plugins.json`. Снимок в
`~/.claude/plugins/cache/av-dev-skills/av-dev-backlog/<версия>/` не трогает — он
общий для всех проектов. Маркетплейс тоже остаётся: `extraKnownMarketplaces`
нужен остальным плагинам.
`--scope project` обязателен по той же причине, что и при установке: умолчание у
команды — user. `cd` в проект обязателен, но здесь ошибка слышна — вызванная не
оттуда, команда откажется словами `is not installed in project scope`, а не
снимет плагин наугад, как это делает `plugin update`.
**Убрать строку из `settings.json` руками — половина дела:** запись в реестре
переживает такую правку, и в инвентаризации проект продолжает числиться. Лечится
той же командой из каталога проекта — она отработает и когда в `settings.json`
уже пусто.
Снялось или нет — видно инвентаризацией из раздела [Обновление](#обновление).
**Применяется после перезапуска Claude Code**, как и обновление.
## Структура репозитория ## Структура репозитория
``` ```
+4 -1
View File
@@ -114,7 +114,10 @@
## 2. healthlog — первая боевая проверка ## 2. healthlog — первая боевая проверка
- [ ] `canon adopt`; `docs/backlog/``docs/tasks/` - [ ] `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) - [ ] завести `security.md` с периметром первой строкой (J)
- [ ] `review-journal.md``review.md` + настройка конвейера (K, L) - [ ] `review-journal.md``review.md` + настройка конвейера (K, L)
- [ ] `conventions.md``conventions/`, `local-research.md``research/` (G) - [ ] `conventions.md``conventions/`, `local-research.md``research/` (G)