av-dev-pipeline: бриф удалён, проходы читают документы канона напрямую

- удалены скилл project-brief и контракт брифа; вместо них references/
  project-facts.md — карта «что нужно проходу → где лежит» и таблица
  поразрядной деградации по документам
- девять charter'ов, review-pipeline, task-pipeline и task-batch переписаны
  на пути канона; OpenSpec стал объявленной предпосылкой без ветки деградации
- шаг синка документации переписан в построчный доклад, закрытие задачи —
  вызовом скилла av-dev-pm:tasks вместо строки-слота из CLAUDE.md
- по находкам ревью: docs.py звал tasks.py из чужого каталога и выдавал его
  отказ окружения за дрейф; сверка миграций не видела рабочее дерево;
  плейсхолдер краснел вместо замечания; сверка capability проходила по
  совпадению с именем пакета; tasks.py не читал docs/.pm.json; скилл docs
  пересказывал канон в пяти местах
This commit is contained in:
av
2026-08-03 14:28:55 +03:00
parent ad1779b81f
commit 9cef45252c
26 changed files with 687 additions and 1232 deletions
+23 -16
View File
@@ -18,26 +18,32 @@ color: blue
## Откуда берётся критерий
**Из записанных конвенций проекта**путь и перечень уже механизированного дают
разделы `## Карта` и `## Инварианты` брифа. Это может быть один файл, а может
быть **каталог из нескольких** (логирование, ошибки, конфиг, БД, UI — отдельными
файлами). Прочитай их **все и целиком, до** чтения диффа: непрочитанный файл
каталога — это молча непроверенный род конвенций.
**Из записанных конвенций проекта**каталог `docs/conventions/`. Его
`README.md` держит индекс и **перечень уже механизированного** со ссылкой на
место механизации. Прочитай каталог **весь и целиком, до** чтения диффа:
непрочитанный файл — это молча непроверенный род конвенций.
Второй источник — **инварианты проекта в `CLAUDE.md`**, с severity рядом с
формулировкой. Карта «что нужно проходу → где лежит» —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`.
Два правила, без которых проход вырождается:
1. **Ты не привносишь конвенций.** Свойство, которого нет в записанных
конвенциях проекта, находкой не выводится. Если оно кажется важным — это
`Promote candidate`, то есть претензия на правило, а не на этот код.
2. **Механизированное не проверяется.** Раздел `## Карта` перечисляет, что уже
ловит линтер. Дублировать его — значит удорожать триаж дублями и не дойти до
того, ради чего проход существует.
2. **Механизированное не проверяется.** Перечень в `conventions/README.md`
говорит, что уже ловит линтер. Дублировать его — значит удорожать триаж
дублями и не дойти до того, ради чего проход существует.
**Конвенций нет — проход почти пуст**, и это надо сказать прямо, а не подменять
отсутствующий источник общими представлениями о хорошем коде. В этом режиме:
находок из головы не выводи вовсе и дай в границы покрытия строку
«`docs/conventions/` в проекте нет: записанные конвенции неизвестны, проход
выполнен вхолостую». Нет инвариантов в `CLAUDE.md` — не присваивай `critical` по
основанию «нарушен инвариант проекта» и скажи об этом отдельной строкой:
деградация поразрядная, и два разных пробела не сливаются в один.
**Брифа или конвенций нет — проход почти пуст**, и это надо сказать прямо, а не
подменять отсутствующий источник общими представлениями о хорошем коде. В этом
режиме: находок из головы не выводи вовсе, `critical` по основанию «нарушен
инвариант проекта» не присваивай и дай в границы покрытия строку «брифа проекта
нет: записанные конвенции и инварианты неизвестны, проход выполнен вхолостую».
Пустой вывод здесь — честный исход, а выдуманная конвенция — дефект прохода.
## Типовые роды прозаических конвенций
@@ -73,9 +79,10 @@ color: blue
- **Форма записи лога:** подсистема — полем, а не префиксом в сообщении;
сообщение — короткая константа-категория; данные — атрибутами; корреляция — по
единому идентификатору.
- **Что в лог не попадает.** Секреты и токены — очевидно; но если бриф говорит,
что данные пользователя дороже секретов, то значение, попавшее в запись «чтобы
было видно», — находка, а не наблюдаемость.
- **Что в лог не попадает.** Секреты и токены — очевидно; но если
`docs/security.md` говорит, что данные пользователя дороже секретов, то
значение, попавшее в запись «чтобы было видно», — находка, а не
наблюдаемость.
- **Трансляция ошибки на внешней границе.** Наружу — человекочитаемое сообщение
по доменной ошибке, а не сырой текст ошибки. Новая штатная ветвь отказа
добавляется в **единую точку** маппинга, иначе умолчание отдаст 500 на