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
+34 -50
View File
@@ -64,31 +64,24 @@ description: Вести содержимое документов канона
**ADR цитирует решение оттуда и ссылается на источник.** Не пересказывает и не
сочиняет заново.
Заводится, когда верно одно из трёх:
**Триггер заведения, форма имени и правило замены — в
[каноне](../canon/references/canon.md), раздел `adr/`.** Здесь они не
повторяются: копия правила расходится с оригиналом на первой же смене версии
канона, а расходится незаметно.
- **дорогой откат** — переделка стоит дороже переписывания одного файла;
- **намеренный отказ** от очевидного подхода — чтобы не переоткрывать «а почему
мы не сделали X»;
- **пересмотр прежнего решения** — тогда у старой записи обязателен статус
`заменено на ADR-…`, а у новой в контексте строка «Заменяет ADR-…».
Твоя часть — **применить триггер к этой задаче и сказать вслух, сработал он или
нет**. Строка «adr/ — не требуется: решение рутинное» и есть то, ради чего
чек-лист существует; её отсутствие неотличимо от «забыл посмотреть».
Не заводится для рутины и для того, что видно из кода и `git log`.
Порядок: имя `ADR-ГГГГ-ММ-ДД-slug.md`, дата — когда решение **принято**, слаг
английский; тело по `docs/adr/template.md`; строка в индексе `docs/adr/README.md`
сверху. Активная запись статуса не имеет.
Порядок работы: открой архивный `design.md` change, найди в `Decisions` то, что
проходит триггер, процитируй решение и его причину, сошлись на источник, добавь
строку в индекс `docs/adr/README.md` сверху.
## Чистка `architecture.md`
Обзор не держит поведение — его нормативный дом `openspec/specs/`. Раздел, где
поведение осталось, помечается маркером долга:
```
<!-- канон: поведение → openspec/specs/<capability> -->
```
`docs.py` считает маркеры и печатает числом; **гейт от них не краснеет** — это
долг, а не отказ, иначе постепенный переезд стал бы невозможен.
Обзор не держит поведение — его нормативный дом `openspec/specs/`. **Форма
маркера долга и правило «гейт от них не краснеет» — в
[каноне](../canon/references/canon.md), раздел `architecture.md`.**
Разбирается порциями: раздел вычищается той задачей, которая его касается.
Содержимое не выбрасывается, а переезжает — требования в дельта-спеку change,
@@ -97,45 +90,36 @@ description: Вести содержимое документов канона
## Запись в `research/`
Наблюдение о внешнем мире: что реально шлёт источник, чем документация формата
расходится с практикой. **Число — с провенансом**: команда или условия, которыми
получено, чтобы его можно было перепроверить.
расходится с практикой. **Требование провенанса и правило про расходящееся
число — в [каноне](../canon/references/canon.md), раздел `research/`.**
Число без источника проход обязан читать как условие. Число, чей источник по
ссылке не подтвердился, **не переписывается по догадке** — остаётся с пометкой
«расходится с источником: там <что нашли>». Молча подставить «правильное» число
хуже всего: расхождение перестанет быть видно, а причина останется.
Твоя часть — заметить, что по ходу задачи узналось новое о внешних данных, и не
дать этому остаться в контексте. Признак: ты правил разбор, опираясь на то, чего
нет ни в одном документе.
## Запись в `review.md`
Два раздела с разными сроками жизни, и путать их нельзя.
Файл держит два раздела с разными сроками жизни — журнал дефектов и настройку
конвейера. **Что в каком и в какой форме — в
[каноне](../canon/references/canon.md), раздел `review.md`**; подробности формы
записи и выбор адреса, куда она ведёт, — в конвейере ревью,
`references/review-journal.md`.
**Журнал дефектов.** Запись на каждый воспроизведённый дефект с пометкой
**проскочил / пойман ревью**. Пишется сразу, а не ретроспективно: со временем
теряется не факт, а причина непоймания — единственное, ради чего журнал есть.
Форма: где, симптом, чем воспроизведён, почему не поймали (для проскочивших),
что меняем. Вывод «ничего не меняем, цена поимки выше цены дефекта» — законный
исход.
**Настройка конвейера.** Типовые узлы; типовые ложноположительные; вопросы к
проходам поимённо с провенансом; недоступно проверке. Последний раздел делится
на «не проверит ни один проход» (принципиальная граница, по факту промаха не
пересматривается) и «перестали проверять сознательно» — этот **пересматривается
первым**, как только что-то проскочило.
Твоя часть на синке: **дефект пишется сразу**, а не «потом, когда починим».
Со временем теряется не факт, а причина непоймания — единственное, ради чего
журнал есть. И решение о сужении проверок (перестали звать проход, понизили
профиль) обязано попасть в раздел настройки, а не остаться в отчёте ревью.
## Промоут в конвенции
Находка → конвенция → правило линтера → **удаление из прозы**. Процедура
принадлежит конвейеру ревью и живёт в его `references/promote.md`; здесь только
то, что касается документа:
Находка → конвенция → правило линтера → **удаление из прозы**. Процедура целиком
принадлежит конвейеру ревью и живёт в его `references/promote.md`; роль каталога
конвенций — в [каноне](../canon/references/canon.md).
- формулировка — **проверяемое свойство**, а не совет;
- в прозе остаётся только то, что принципиально не выражается правилом;
- как только правило работает, формулировка из `conventions/<тема>.md`
**удаляется**, а правило попадает в перечень механизированного в
`conventions/README.md` со ссылкой на место механизации.
Непойманное место механизации означает, что проход по конвенциям будет
добросовестно проверять уже проверенное.
Твоя часть — **третий шаг, который пропускают чаще всего**: правило заработало,
а формулировка осталась в прозе, и проход продолжает проверять уже проверенное.
На синке это отдельная строка: «conventions/ — правило X механизировано,
формулировка удалена» либо «не требуется».
## Чего этот скилл не делает