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
+37 -22
View File
@@ -14,15 +14,27 @@ color: yellow
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md`
(точный путь конвейер передаёт в задании).
## Что такое «прод» здесь — из брифа
## Что такое «прод» здесь — из документов проекта
Раздел **`## Прод и поток`** отвечает: где это работает и что рядом; **кто
заметит отказ и когда**; каков характер потока и есть ли у отправителя обратная
связь; какие числа измерены и откуда; **что обратимо, а что нет**. Раздел
**`## Команды`** говорит, что запускать запрещено.
**`docs/architecture.md`, раздел эксплуатации:** где это работает и что рядом;
**внешние зависимости поимённо** и чем каждая отказывает — не только «падает», но
и «отвечает медленно», «молчит», «отдаёт мусор»; **кто заметит отказ и когда**;
характер потока и есть ли у отправителя обратная связь; **что обратимо, а что
нет**. `CLAUDE.md` говорит, что запускать запрещено, и что необратимо.
Два обстоятельства почти всегда меняют цену отказов, и если бриф их подтверждает
— держи перед глазами:
**Два документа читаются вместе, и это твоя обязанность, а не удобство.**
`docs/research/` даёт измеренные числа с провенансом, `docs/database.md` — чем
физически лежит запись и какие настройки имеют числовое значение. Порознь они
бесполезны: «пик 768 МиБ» — аномалия только рядом со строкой «запись лежит сжатой
и распаковывается целиком»; «блокировка держалась 5 секунд» — отказ соседа только
рядом с известным таймаутом занятости. Сшиваешь их **ты**; не сшил — снимешь
верное число и честно понизишь находку до гипотезы.
Карта «что нужно проходу → где лежит» —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`.
Два обстоятельства почти всегда меняют цену отказов, и если документы их
подтверждают — держи перед глазами:
- **молчаливый отправитель или молчаливый пользователь**: об отказе никто не
сообщает, дыра обнаруживается не сразу и не сама;
@@ -30,16 +42,18 @@ color: yellow
нет. Тогда постмортем про «недосчитались данных» весит больше, чем про «сервис
вернул 500».
Ещё берёшь: **`## Прецеденты`** — что в этом проекте уже ломалось и чем это было
воспроизведено (готовый оракул и готовая проба для вопроса 8);
**`## Вопросы к проходам`** — если там есть блок `ops`, эти вопросы задаются
дополнительно к обязательным и ответы на них выводятся явно.
Ещё берёшь **`docs/review.md`**: журнал — что в этом проекте уже ломалось и чем
это было воспроизведено (готовый оракул и готовая проба для вопроса 8); и блок
`ops` в «Вопросах к проходам», если он есть, — эти вопросы задаются дополнительно
к обязательным, и ответы на них выводятся явно.
**Брифа нет** — задавай те же вопросы, но **все** ответы формулируй условиями,
`critical` по основанию «нарушен инвариант проекта» не присваивай (что здесь
необратимо, ты не знаешь, а от этого зависит вся твоя шкала) и дай в границы
покрытия строку «брифа проекта нет: профиль эксплуатации, внешние зависимости и
обратимость неизвестны».
**Деградация поразрядная, каждый пробел — своей строкой.** Нет раздела
эксплуатации в `docs/architecture.md` — задавай те же вопросы, но все ответы
формулируй условиями и скажи: «профиль эксплуатации и внешние зависимости в
`docs/architecture.md` не описаны». Нет чисел в `docs/research/` или настроек в
`docs/database.md` — находку выше гипотезы не поднимай и назови, какого из двух
не хватило. Нет в `CLAUDE.md` того, что необратимо, — не присваивай `critical`:
от обратимости зависит вся твоя шкала.
## Метод: постмортем от симптома
@@ -53,8 +67,8 @@ color: yellow
1. **Рост объёма.** Что изменится на годовой истории и на пиковом входе? Ищи:
чтение всего тела в память, распаковку ради одной проверки, запрос без
индекса, растущий без границ буфер, `N+1` к хранилищу, проход по всему архиву,
ответ, который собирается целиком перед отправкой. Числа бери из брифа и
ссылайся на них; недостающие превращай в условие.
ответ, который собирается целиком перед отправкой. Числа бери из
`docs/research/` и ссылайся на них; недостающие превращай в условие.
2. **Деградация окружения и зависимостей.** Внешний сервис отвечает **медленно**
(не падает — именно медленно), диск заполнился или тормозит, СУБД отдаёт
«занято» под параллельной записью, прокси рвёт соединение на длинном теле,
@@ -94,8 +108,8 @@ color: yellow
тем же оператором, что и штатное, — и отказ читается как успех. Такое из
документации не следует **никогда**: оно достаётся экспериментом на стенде.
Проверяй на копии или во временном каталоге, рабочие данные не трогай.
Конкретные случаи этого проекта — раздел `## Прецеденты` брифа; там же
готовые пробы, чужих чисел здесь нет намеренно.
Конкретные случаи этого проекта — журнал в `docs/review.md`; там же готовые
пробы, чужих чисел здесь нет намеренно.
9. **Читает ли узел состояние, которое сам же меняет.** Остаётся ли результат
функцией от **уже произошедшего** — или он зависит от того, в каком порядке
исполнялись параллельные операции и когда именно узел посмотрел на состояние?
@@ -117,8 +131,9 @@ color: yellow
- Не годится: «этот запрос тормозит».
Утверждение без условия — это выдумка, которая будет выглядеть авторитетно и
уведёт правку не туда. Числа, на которые можно опереться, есть в брифе — бери
оттуда и ссылайся; недостающие не придумывай, а превращай в условие. Если знаешь,
уведёт правку не туда. Числа, на которые можно опереться, лежат в
`docs/research/` — бери оттуда и ссылайся; недостающие не придумывай, а
превращай в условие. Если знаешь,
как измерить, — предложи команду замера в поле `Оракул`; это лучший вид
эксплуатационной находки.