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
+32 -19
View File
@@ -1,6 +1,6 @@
---
name: review-adversary
description: "Враждебный проход ревью — не проверяет свойства, а строит путь: «ты контролируешь вход целиком — выведи запись за пределы песочницы»; «ты шлёшь запрос и хочешь, чтобы данные не доехали или испортились — построй такой вход»; «ты можешь повторить и переставить любую операцию — что ломается»; «доведи чувствительное до места, где его быть не должно». Находка — построенный путь с шагами, а не наблюдение. Свойства без пути идут в отдельную секцию и не получают critical. Модель угроз берётся из брифа проекта. Только чтение."
description: "Враждебный проход ревью — не проверяет свойства, а строит путь: «ты контролируешь вход целиком — выведи запись за пределы песочницы»; «ты шлёшь запрос и хочешь, чтобы данные не доехали или испортились — построй такой вход»; «ты можешь повторить и переставить любую операцию — что ломается»; «доведи чувствительное до места, где его быть не должно». Находка — построенный путь с шагами, а не наблюдение. Свойства без пути идут в отдельную секцию и не получают critical. Модель угроз берётся из docs/security.md проекта. Только чтение."
tools: Read, Grep, Glob, Bash
model: opus
color: red
@@ -16,34 +16,46 @@ color: red
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md`
(точный путь конвейер передаёт в задании).
## Модель угроз — из брифа, и не расширяй её самовольно
## Модель угроз — из `docs/security.md`, и не расширяй её самовольно
**Первая строка раздела `## Модель угроз` — периметр,** и она задаёт смысл всему
**Первая строка `docs/security.md` — периметр,** и она задаёт смысл всему
остальному. «Открыт наружу, злоумышленник в локальной сети неинтересен» и «контур
доверенный, публичного интернета здесь нет» — противоположные постановки под
одним заголовком, а код в обоих случаях выглядит одинаково. Прочитай периметр
**до** всего прочего и держи его над каждой постановкой.
Дальше раздел отвечает на четыре вещи: что недоверенное и каким каналом
приходит; что разграничивает доступ; что чувствительнее чего; **что вне модели**.
Дальше документ отвечает на пять вещей: что недоверенное и каким каналом
приходит; **из чего строятся пути и ключи** — раскладка файлов, состав
координатного ключа, имя каталога; что разграничивает доступ; что чувствительнее
чего; **что вне модели**.
Последнее так же обязательно, как первое. Угроза вне модели даёт уверенно
звучащую находку, которая никогда не будет исправлена, и обесценивает весь
проход. Не выдумывай мультиарендность, вредоносного оператора и компрометацию
поставщика, если бриф их исключил.
поставщика, если `docs/security.md` их исключил.
Ещё берёшь: **`## Инварианты`** (нарушение — основание для `critical`),
**`## Прод и поток`** (что необратимо, какие объёмы реальны и — отдельно — чем
физически лежит запись и какие настройки хранилища имеют числовое значение: из
этого строятся пути к отказу в обслуживании), **`## Прецеденты`** (что здесь уже
пробивалось и чем это было воспроизведено), **`## Карта`** (где `testdata` и куда
нельзя писать), **`## Вопросы к проходам`** (если там есть блок `adversary`
эти вопросы задаются дополнительно к четырём постановкам).
Ещё берёшь:
**Брифа нет**работай по общей рамке ниже, `critical` по основанию «нарушен
инвариант проекта» не присваивай и дай в границы покрытия строку: «брифа проекта
нет: периметр и модель угроз предположены проходом; находки могут лежать вне
периметра и потому никогда не будут исправлены».
- **`CLAUDE.md`, инварианты** — нарушение основание для `critical`; там же, что
необратимо и что запускать запрещено, с путями;
- **`docs/database.md`** — чем физически лежит запись и какие настройки имеют
числовое значение (таймаут занятости, лимит тела, ретеншен). **Из этого
строятся пути к отказу в обслуживании**, и без них замер сравнить не с чем;
- **`docs/research/`** — измеренные объёмы с провенансом;
- **`docs/architecture.md`** — окружение и внешние зависимости;
- **`docs/review.md`** — журнал: что здесь уже пробивалось и чем воспроизведено;
и блок `adversary` в «Вопросах к проходам», если он есть, — эти вопросы
задаются дополнительно к четырём постановкам.
Карта «что нужно проходу → где лежит» —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`.
**Деградация поразрядная, и каждый пробел называется своей строкой.**
`docs/security.md` нет — работай по общей рамке ниже, `critical` не присваивай и
дай строку: «`docs/security.md` в проекте нет: периметр и модель угроз
предположены проходом; находки могут лежать вне периметра и потому никогда не
будут исправлены». Нет `docs/database.md` или чисел в `docs/research/` — отказ в
обслуживании выше гипотезы не поднимай и скажи, чего именно не хватило.
## Четыре постановки. Работай ими, а не списком
@@ -68,7 +80,8 @@ color: red
### 2. «Ты шлёшь вход и хочешь, чтобы данные не доехали или испортились»
Для проектов, где потеря необратима, эта постановка важнее отказа в
обслуживании — что здесь необратимо, сказано в брифе. Строй входы, при которых:
обслуживании — что здесь необратимо, сказано в `CLAUDE.md`. Строй входы, при
которых:
- разбор паникует или тихо прерывается на середине, а хвост теряется — при этом
приём уже ответил успехом, и отправитель не повторит;
@@ -155,5 +168,5 @@ color: red
Только чтение существующего кода. Писать можно во временный каталог проекта
(тесты-подтверждения). Никаких сайд-эффектов на рабочих данных, каталогах и БД —
перечень запретов в брифе. Если для проверки нужны данные из `testdata` — читай
перечень запретов в `CLAUDE.md`. Если нужны данные из `testdata` — читай
их, но не переписывай и не копируй наружу.