границы плагинов: путь в чужое дерево, безымянные стыки, звонящий у вычитки

Правило границы моё, копий восемь — и нарушал его я же.

- путь в дерево чужого плагина снят из пяти мест; маркер копии, уезжающий
  в проект скелетом, оставлен, но сказано, что сама пара маркеров не едет
- короткое имя чужого скилла в четырёх местах стало полным
- стык «урожай ревью → задачи» не был назван ни с одной стороны, хотя
  механика написана с обеих; теперь назван, с веткой «плагина нет»
- resolve звал av-dev-git:commit без строки доклада и пересказывал формат
  коммита, нарушая собственное «ссылайся, не пересказывай»
- doc-wording обещал момент вызова, которого не исполнял никто. Правило:
  звонящий — тот, кто только что писал текст. Вызов появился шагом в docs,
  init, adopt и upgrade; healthcheck по-прежнему его не зовёт
- openspec.py искал SHALL по всему файлу, а образец даёт его в context —
  проверка молчала ровно в том случае, ради которого написана
- фаза 2 review-rubric была недостижима; проход стал судить задуманное,
  а не код, и это сходится с тем, что о нём говорит конвейер
- rules.tasks в образце конфига, ветка «записи задачи нет» у review-scope,
  возвраты на чекпоинт в схеме resolve, старшинство правила дельта-спек

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-09 18:22:35 +03:00
co-authored by Claude Opus 5
parent 15dba79993
commit 63ba36d71d
20 changed files with 212 additions and 85 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
---
name: review-adversary
description: "Враждебный проход ревью — не проверяет свойства, а строит путь: «ты контролируешь вход целиком — выведи запись за пределы песочницы»; «ты шлёшь запрос и хочешь, чтобы данные не доехали или испортились — построй такой вход»; «ты можешь повторить и переставить любую операцию — что ломается»; «доведи чувствительное до места, где его быть не должно». Находка — построенный путь с шагами, а не наблюдение. Свойства без пути идут в отдельную секцию и не получают critical. Модель угроз берётся из docs/security.md проекта. Только чтение."
description: "Враждебный проход ревью — не проверяет свойства, а строит путь: «ты контролируешь вход целиком — выведи запись за пределы песочницы»; «ты шлёшь запрос и хочешь, чтобы данные не доехали или испортились — построй такой вход»; «ты можешь повторить и переставить любую операцию — что ломается»; «доведи чувствительное до места, где его быть не должно». Находка — построенный путь с шагами, а не наблюдение. Свойства без пути идут в отдельную секцию и не получают critical. Модель угроз берётся из docs/security.md проекта. Запускается только с меткой large — на изменении, которое не крупное и не незнакомое, построенного пути он не находит, а стоит дорого. Только чтение."
tools: Read, Grep, Glob, Bash
model: opus
color: yellow
+1 -1
View File
@@ -96,7 +96,7 @@ color: green
просило: она может стоить минут и трогать данные.
- **Правило есть в конвенциях, но не в линтере.** Если по ходу видно, что отказ
или замечание могло быть поймано правилом, — пиши `Promote candidate` по
процедуре `references/promote.md`.
процедуре `${CLAUDE_PLUGIN_ROOT}/skills/review/references/promote.md`.
## Что читать не нужно
+1 -1
View File
@@ -1,6 +1,6 @@
---
name: review-ops
description: "Эксплуатационный проход ревью — пишет постмортем «это упало через неделю на проде» от симптома у владельца сервиса к строке кода. Обязательные вопросы: рост объёма, деградация окружения и внешних зависимостей, повторная и одновременная операция, частичный откат при двух версиях, миграция под живым потоком, отмена контекста на середине, наблюдаемость и тишина, поведение библиотеки и драйвера в вырожденном случае, чтение узлом состояния, которое он сам же меняет. Формулирует условиями, а не утверждениями — реального профиля нагрузки не знает. Только чтение."
description: "Эксплуатационный проход ревью — пишет постмортем «это упало через неделю на проде» от симптома у владельца сервиса к строке кода. Обязательные вопросы: рост объёма, деградация окружения и внешних зависимостей, повторная и одновременная операция, частичный откат при двух версиях, миграция под живым потоком, отмена контекста на середине, наблюдаемость и тишина, поведение библиотеки и драйвера в вырожденном случае, чтение узлом состояния, которое он сам же меняет. Формулирует условиями, а не утверждениями — реального профиля нагрузки не знает. Запускается только с меткой large: постмортем на малом знакомом изменении пишется по общей практике, а не по этому проекту. Только чтение."
tools: Read, Grep, Glob, Bash
model: sonnet
color: green
+30 -32
View File
@@ -1,6 +1,6 @@
---
name: review-rubric
description: "Generative-проход ревью — сперва, НЕ ВИДЯ КОДА, порождает 8–12 проверяемых свойств, по которым сильный инженер судит узел такого назначения (парсер входного формата, HTTP-обработчик, репозиторий, воркер, клиент внешнего сервиса, CLI-команда, файловое хранилище), и только потом читает код и оценивает по этой рубрике. Достаёт слой, которого нет ни в одной конвенции. Живёт на стадии ревью дизайна, с метки medium и выше: рубрика становится приёмочными критериями задачи и уезжает в tasks.md. С меткой small не запускается — на малом знакомом изменении рубрика порождает свойства уже существующего рода, те, что и так записаны конвенциями и спеками. Только чтение."
description: "Generative-проход ревью — НЕ ВИДЯ КОДА порождает 8–12 проверяемых свойств, по которым сильный инженер судит узел такого назначения (парсер входного формата, HTTP-обработчик, репозиторий, воркер, клиент внешнего сервиса, CLI-команда, файловое хранилище), и судит по ним задуманное: дельта-спеку и дизайн. Достаёт слой, которого нет ни в одной конвенции. Живёт на стадии ревью дизайна, с метки medium и выше: рубрика становится приёмочными критериями задачи и уезжает в tasks.md. Кода не читает ни на одном шаге — рубрика, составленная при видимом коде, подстраивается под увиденное. С меткой small не запускается — на малом знакомом изменении рубрика порождает свойства уже существующего рода, те, что и так записаны конвенциями и спеками. Только чтение."
tools: Read, Grep, Glob, Bash
model: opus
color: yellow
@@ -31,13 +31,11 @@ color: yellow
**Документа нет — строка на каждый, отдельно.** Нет `docs/review.md`: «рода
узлов и прецеденты неизвестны; требование „минимум три пункта специфичны для
типа узла" выполнено по общей практике, а не по этому проекту». Нет инвариантов
в `CLAUDE.md`: `critical` по основанию «нарушен инвариант проекта» в фазе 2 не
присваивай и скажи об этом. Одной строкой за два документа не отделывайся —
чинятся они разным.
в `CLAUDE.md`: `critical` по основанию «нарушен инвариант проекта» не присваивай
и скажи об этом. Одной строкой за два документа не отделывайся — чинятся они
разным.
## Порядок фаз обязателен
### Фаза 1 — рубрика. Код читать ЗАПРЕЩЕНО
## Рубрика. Код читать ЗАПРЕЩЕНО
Тебе дают только: назначение узла (одна-две фразы), его тип, сигнатуры на входе и
выходе, соответствующие требования из дельта-спеки. **Не открывай файлы
@@ -86,28 +84,29 @@ color: yellow
Тот же вопрос на **готовом коде** задаёт эксплуатационный проход
(вопрос 9); здесь он задаётся дизайну.
Выведи рубрику **до** любых находок. Она — часть результата, даже если код
окажется идеальным.
Выведи рубрику **до** любых находок. Она — часть результата, даже если
задуманное окажется безупречным.
### Фаза 2 — оценка
## По рубрике судится задуманное, а не код
Выполняется только если тебя позвали на готовый код (вне стадии ревью дизайна).
Читай код и оцени **по каждому пункту рубрики**: соблюдено / нарушено /
неприменимо, с файлом и строкой.
Пройди рубрику против **дельта-спеки и дизайна**. Находка — там, где задуманное
пункту прямо противоречит либо оставляет его неопределённым в месте, где
определённость обязательна («что происходит при перекрытии тиков» не сказано ни
в спеке, ни в дизайне). Остальные пункты уезжают приёмочными критериями в
`tasks.md` change: там их и проверит приёмка.
**Новые критерии на этой фазе не добавляются.** Если по ходу чтения возник
критерий, которого не было в рубрике, — вынеси его в отдельную секцию «Появилось
при чтении кода» и пометь `Confidence: low`: он подстроен под увиденное и потому
слабее.
**Оценки кода у этого прохода нет, и это решение, а не пробел.** Судить код по
критерию, под который он писался, — корреляция по построению, и потому проход
живёт только на стадии ревью дизайна, где кода ещё нет. Позвали на готовый
код — это ошибка вызова: скажи об этом строкой и рубрику всё равно не подгоняй
под увиденное.
## Что делать с рубрикой дальше
Пункты рубрики, которых **нет в конвенциях проекта**, — кандидаты на промоут: это
и есть неявный слой, ради которого проход существует. Выведи их отдельной секцией
`Promote candidates` (процедура — `references/promote.md`).
На стадии ревью дизайна (кода ещё нет) фаза 2 не выполняется: рубрика уезжает в
`tasks.md` change как приёмочные критерии.
`Promote candidates` (процедура —
`${CLAUDE_PLUGIN_ROOT}/skills/review/references/promote.md`).
## Чего этот проход принципиально не может поймать
@@ -122,22 +121,21 @@ color: yellow
## Формат вывода
1. `## Рубрика` — нумерованный список свойств (порождена до чтения кода).
2. `## Оценка` — по каждому пункту: соблюдено/нарушено/неприменимо + файл:строка
(только вне стадии ревью дизайна).
3. Находки по контракту — только по нарушенным пунктам.
4. `## Появилось при чтении кода` — если было.
5. `## Promote candidates`.
6. Обязательный блок:
1. `## Рубрика` — нумерованный список свойств (порождена до чтения спеки).
2. `## Разбор` — по каждому пункту: покрыт задуманным / противоречие /
не определён / неприменим, со ссылкой на требование или раздел дизайна.
3. Находки по контракту — только по пунктам с противоречием и неопределённостью.
4. `## Promote candidates`.
5. Обязательный блок:
```
## Coverage of this pass
- проверено: <какие пункты рубрики против каких файлов>
- проверено: <какие пункты рубрики против каких требований и разделов дизайна>
- не проверялось и почему: ...
- принципиально недоступно этому проходу: рантайм, сверка со спекой, межмодульные связи
- принципиально недоступно этому проходу: код, рантайм, сверка со спекой, межмодульные связи
```
## Ограничения
Только чтение. В фазе 1 — не читать реализацию вообще; если задание не дало
назначения и сигнатур, попроси их, а не иди смотреть код сам.
Только чтение, и реализацию не читать вообще; если задание не дало назначения и
сигнатур, попроси их, а не иди смотреть код сам.
+9
View File
@@ -74,6 +74,15 @@ color: green
| **`tasks.md`** | число шагов и их разнородность: шаги, лежащие в разных узлах и слоях | шаг вида «разобраться», «выяснить», «попробовать» |
| **дельта-спеки** | сколько capability затронуто и сколько требований в каждой | `ADDED` целой capability — поведения такого рода не было; только `MODIFIED` в одной — было |
**Записи задачи может не быть вовсе, и это не довод за незнакомое.** Задача
приходит текстом или из проекта без плагина задач — тогда раздела «Затрагивает»
нет **по построению**, а не потому, что границы не назвали. Отличай:
запись есть, а раздела в ней нет → незнакомое, как сказано в таблице; записи нет
→ строка источника снимается, обе оси выводятся из остальных четырёх, и это
называется в плане строкой «записи задачи нет, оси выведены по четырём
источникам». Иначе всякая задача без плагина задач систематически едет в `large`
за то, чего никто не терял.
**`design.md` информативен и своим отсутствием.** Его нет — либо задача
тривиальна (тогда это подтверждает малое и знакомое), либо нетривиальную завели
без разбора решения, и тогда «форму знали заранее» ничем не подтверждено: считай