починены находки второго ревью: цикл закрытия задачи и три отсутствовавших слота

- task-pipeline и task-batch запрещали шаг, который сами же добавили: раздел
  границ и финальный доклад переписаны под снятую границу приёмки
- «триаж сводит строки в одну» противоречило «не сливает» — деградация снова
  поразрядная во всех трёх местах
- канон не требовал в CLAUDE.md имени основной ветки, testdata и запретов, а
  скелета CLAUDE.md не было вовсе — заведён
- обратимость жила в двух домах, читатели ходили в пустой; единственный дом
  теперь CLAUDE.md
- заведены слоты «Единые точки проекта» и «Триггеры профиля», куда charter'ы
  слали, а канон их не создавал
- блок «Вопросы к проходам» стал частью задания прохода: за ним ходили двое
  из девяти
- чек-лист синка и правило «замер + настройка» сведены к одному дому;
  plugin.json больше не про бриф
This commit is contained in:
av
2026-08-03 14:38:57 +03:00
parent fd0aaeaeaf
commit 0eab075f84
12 changed files with 175 additions and 65 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "av-dev-pipeline",
"description": "Проведение задачи через полный цикл Spec Driven Development и конвейер ревью: детерминированный гейт, сверка со спеками, враждебные постановки, эксплуатационный постмортем, независимая реализация, архитектура и обязательный триаж. Плюс прогон нескольких задач разом. Проектная специфика — инварианты, команда гейта, прецеденты, доменные факты — приходит из файла-брифа проекта, который заводится отдельным скиллом, а не пишется руками.",
"description": "Проведение задачи через полный цикл Spec Driven Development и конвейер ревью с детерминированным гейтом, сверкой со спеками, враждебными постановками, эксплуатационным постмортемом, независимой реализацией и обязательным триажем; плюс прогон нескольких задач разом по одной в изолированном worktree. Требует OpenSpec. Проектную конкретику проходы читают в документах канона плагина av-dev-pm напрямую.",
"author": {
"name": "Anton Vakhrushev",
"email": "anwinged@gmail.com"
+4 -4
View File
@@ -38,10 +38,10 @@ color: red
- **`CLAUDE.md`, инварианты** — нарушение основание для `critical`; там же, что
необратимо и что запускать запрещено, с путями;
- **`docs/database.md`** — чем физически лежит запись и какие настройки имеют
числовое значение (таймаут занятости, лимит тела, ретеншен). **Из этого
строятся пути к отказу в обслуживании**, и без них замер сравнить не с чем;
- **`docs/research/`** — измеренные объёмы с провенансом;
- **`docs/database.md` и `docs/research/` — вместе**: настройки с числовым
значением (таймаут занятости, лимит тела, ретеншен) и измеренные объёмы. **Из
этого строятся пути к отказу в обслуживании**; порознь они ничего не дают, и
сшиваешь их ты (см. project-facts, «Сшивать обязаны проходы»);
- **`docs/architecture.md`** — окружение и внешние зависимости;
- **`docs/review.md`** — журнал: что здесь уже пробивалось и чем воспроизведено;
и блок `adversary` в «Вопросах к проходам», если он есть, — эти вопросы
+5 -10
View File
@@ -22,16 +22,11 @@ color: yellow
характер потока и есть ли у отправителя обратная связь; **что обратимо, а что
нет**. `CLAUDE.md` говорит, что запускать запрещено, и что необратимо.
**Два документа читаются вместе, и это твоя обязанность, а не удобство.**
`docs/research/` даёт измеренные числа с провенансом, `docs/database.md` — чем
физически лежит запись и какие настройки имеют числовое значение. Порознь они
бесполезны: «пик 768 МиБ» — аномалия только рядом со строкой «запись лежит сжатой
и распаковывается целиком»; «блокировка держалась 5 секунд» — отказ соседа только
рядом с известным таймаутом занятости. Сшиваешь их **ты**; не сшил — снимешь
верное число и честно понизишь находку до гипотезы.
Карта «что нужно проходу → где лежит» —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`.
**`docs/research/` и `docs/database.md` читаются вместе, и это твоя обязанность,
а не удобство:** число без настройки сравнить не с чем, и находка честно упадёт
до гипотезы. Почему именно так и какие ещё есть стыки —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`, раздел
«Сшивать обязаны проходы». Там же карта «что нужно проходу → где лежит».
Два обстоятельства почти всегда меняют цену отказов, и если документы их
подтверждают — держи перед глазами:
+2 -2
View File
@@ -23,8 +23,8 @@ color: purple
- **`CLAUDE.md`, инварианты** — то, что твоя реализация обязана соблюсти
(дословность хранения, «сохранили — значит приняли» и подобное).
- **`docs/research/` и `docs/database.md` вместе** — измеренные объёмы и
представление данных. Решение, разумное на сотне записей, неразумно на
миллионе; и то и другое читается вместе, порознь они ничего не решают.
представление данных: решение, разумное на сотне записей, неразумно на
миллионе (почему именно вместе — project-facts, «Сшивать обязаны проходы»).
- **`docs/conventions/`** — твоя версия должна быть сравнимой по форме.
Карта «что нужно проходу → где лежит» —
+6 -5
View File
@@ -28,11 +28,12 @@ color: purple
Карта «что нужно проходу → где лежит» —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`.
**Этих документов нет** — порождай рубрику по общей практике, но `critical` по
основанию «нарушен инвариант проекта» (в фазе 2) не присваивай и дай строку:
«`docs/review.md` и инвариантов нет: рода узлов и прецеденты неизвестны;
требование «минимум три пункта специфичны для типа узла» выполнено по общей
практике, а не по этому проекту».
**Документа нет — строка на каждый, отдельно.** Нет `docs/review.md`: «рода
узлов и прецеденты неизвестны; требование „минимум три пункта специфичны для
типа узла" выполнено по общей практике, а не по этому проекту». Нет инвариантов
в `CLAUDE.md`: `critical` по основанию «нарушен инвариант проекта» в фазе 2 не
присваивай и скажи об этом. Одной строкой за два документа не отделывайся —
чинятся они разным.
## Порядок фаз обязателен
+2 -1
View File
@@ -40,7 +40,8 @@ color: green
Карта «что нужно проходу → где лежит» —
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`.
**Деградация поразрядная, и ты — тот, кто сводит её строки в одну.** Свою часть
**Деградация поразрядная, и ты — тот, кто собирает её строки в один список,
сохраняя каждую.** Свою часть
тоже называй: нет инвариантов в `CLAUDE.md` — ни одну находку не поднимай до
`critical` по этому основанию (сослаться не на что), ранжируй по обратимости,
выведенной из кода, и назови это предположением. Нет `docs/review.md` — отсев
@@ -79,8 +79,13 @@ description: Конвейер ревью изменения — детермин
## Что получает каждый проход
Задание любому проходу состоит из пяти вещей:
Задание любому проходу состоит из шести вещей:
- **его блок вопросов** из «Вопросы к проходам» в `docs/review.md`, если он там
есть, — **дословно**. Блок адресован проходу поимённо и выведен из промаха
этого проекта; заставлять девять charter'ов самим ходить за ним значит
получить, что за ним ходят двое. Проход отвечает на такие вопросы явно,
дополнительно к обязательным;
- **контракт находок** — путь к
[references/finding-contract.md](references/finding-contract.md) (в
установленном плагине — `${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/`);
@@ -306,9 +311,10 @@ Recall обоих равен длине их источника — это и е
никто другой.
Материал берётся из документов: `docs/security.md` — враждебному,
`docs/architecture.md` плюс **`docs/research/` и `docs/database.md` вместе**
эксплуатационному. Последние два сшивает сам проход: число без настройки не с чем
сравнить. Без этих документов стадия вырождается в общие места.
`docs/architecture.md`, `docs/research/` и `docs/database.md`
эксплуатационному. Что с чем сшивать и почему — [project-facts.md](references/project-facts.md),
раздел «Сшивать обязаны проходы». Без этих документов стадия вырождается в общие
места.
## Стадия 3 — Independent reimplementation (`deep`, по триггеру)
@@ -50,7 +50,9 @@
## Деградация — поразрядная
Документа нет — деградирует то, что из него читалось, и **только оно**. Каждый
проход пишет свою строку в границы покрытия; триаж сводит их в одну.
проход пишет **свою** строку в границы покрытия; триаж собирает их в один
список и **не сливает в одну строку**: разные пробелы чинятся разным — периметр
пишется руками за десять минут, а числа требуют замера.
| Нет документа | Что деградирует |
| --- | --- |
+7 -5
View File
@@ -46,8 +46,9 @@ description: Проводит несколько задач разом — пл
- **Батч не владеет спринтом и целями.** Он сообщает исход по каждой задаче в тех
же трёх словах, что и `task-pipeline`: сделана / не доведена / оказалась крупнее
задачи.
- **Записей учёта батч не трогает и задач не закрывает** — как и одиночный
пайплайн. Закрытие — акт владельца спринта после приёмки. Урожай ревью батч
- **Задачи закрывает пайплайн внутри каждого сабагента**, шагом 9а, вызовом
Skill `av-dev-pm:tasks`. Батч сам записей учёта не трогает: он не знает, чем
кончилась приёмка, и дублировать закрытие ему незачем. Урожай ревью батч
отдаёт списком, а задачи из него заводит тот, кто ведёт задачи проекта.
## Ключевое отличие от одиночного пайплайна
@@ -305,9 +306,10 @@ rebase в файле X», а не «нераспознанное пересеч
- Убери worktree и ветки **только успешно влитых** задач, в конце
`git worktree prune`. Worktree и ветки **провалившихся** не трогай — они нужны
для ручного дожатия.
- **Задачи батч не закрывает** — ни одну, ни свои, ни чужие записи учёта не
трогает. Он сообщает исход по каждой; закрытие происходит после приёмки и
делается владельцем спринта.
- **Записей учёта батч не трогает** — их правит пайплайн внутри сабагента на
шаге 9а. Батч сообщает исход по каждой задаче; если какой-то сабагент дошёл до
коммита, но закрытия не сделал (плагина нет, вызов не разрешился), скажи это
строкой — иначе задача останется открытой молча.
- Доложи кратко:
- **исход по каждой задаче** одним из трёх слов, с хешем коммита;
- план волн и порядок интеграции, с пометкой, какие задачи шли по одной как
+16 -15
View File
@@ -43,11 +43,14 @@ description: Автономно проводит одну задачу чере
- **Беклогом, спринтом, целями и приоритетами.** Задача приходит извне. Пайплайн
её не выбирает, не приоритизирует, не заводит и не переоценивает; если в
проекте есть свой процесс управления задачами — он и решает, что брать.
- **Записями учёта.** Пайплайн **не закрывает задачу**, не двигает её по
статусам, не правит индекс и не зовёт скриптов учёта. Он сообщает исход;
закрытие — акт владельца спринта **после приёмки**, и оно происходит снаружи.
Закрыть задачу самому — значит закрыть её до коммита и до всякой приёмки, то
есть заверить собственную работу.
- **Форматом задач.** Пайплайн **не правит индексы руками и не выдумывает путь
к скрипту учёта**: он зовёт Skill `av-dev-pm:tasks`, который этим владеет
(шаг 9а). Закрытие как таковое — его работа, и это осознанное решение с
названной ценой: **приёмщик и исполнитель совпали**. Закрытие поэтому **не
окончательно** — человек на сессии возвращает задачу `reopen` с причиной, а
доклад по критериям приёмки становится единственным, по чему приёмка вообще
возможна. Плагина `av-dev-pm` в проекте нет — вызов не разрешится, и тогда
учёт остаётся владельцу, о чём говорится в докладе.
- **Заведением задач из урожая ревью.** Отложенные находки отдаются **списком**
(см. шаг 7); превращать их в задачи — работа того, кто ведёт задачи проекта.
- **Определением ценности.** «Нужна ли эта функциональность» — не вопрос
@@ -279,14 +282,11 @@ description: Автономно проводит одну задачу чере
прозой уже проверен на живом проекте и дал 6 записей ADR на 43 изменения;
работает только обязательное отрицание.
Документы и их триггеры: `openspec/specs/` (поведение — вливает `opsx:archive`),
`database.md` (тронуты миграции), `architecture.md` (новый компонент, граница,
внешняя зависимость), `adr/` (дорогой откат, намеренный отказ, пересмотр
прежнего), `research/` (узнали новое о внешних данных), `security.md` (новый
недоверенный вход, токен, путь наружу), `conventions/` (промоут, включая
**удаление** формулировки, ставшей правилом линтера), `review.md`
(воспроизведённый дефект — с пометкой «проскочил» или «пойман ревью»),
`passport.md`, `CLAUDE.md`.
**Список документов и их триггеров здесь не дублируется** — он в чек-листе
скилла `av-dev-pm:docs`, и копия уже однажды разошлась с оригиналом, потеряв два
триггера. Плагина нет — открой канон (`av-dev-pm/skills/canon/references/canon.md`)
и пройди по разделам его раскладки: каждый документ канона получает строку.
Канона в проекте тоже нет — назови это исходом и предложи `av-dev-pm:canon`.
### 9а. Закрыть задачу
@@ -313,8 +313,9 @@ description: Автономно проводит одну задачу чере
сделано», тело списком 1–3 пункта, без трейлеров). Одна задача — один осмысленный
коммит.
Готово — доложи кратко. Доклад и есть выход пайплайна: **задача остаётся
открытой**, её закрывает владелец спринта после приёмки.
Готово — доложи кратко. Задача к этому моменту **закрыта шагом 9а** (или учёт
явно оставлен владельцу, если плагина нет). Доклад — то, по чему человек проводит
приёмку и решает, не вернуть ли задачу `reopen`.
- **исход** задачи одним из трёх слов и, если не «сделана», чем ограничен
результат;