av-dev-pipeline: починены находки ревью, бриф заводится скиллом

- скилл project-brief: бриф собирается из CLAUDE.md, архитектуры, Taskfile
  и конвенций и показывается человеку. Раньше единственная инструкция по
  его созданию лежала внутри шаблона, поэтому деградированный режим был не
  аварийным, а единственным: critical по основанию «нарушен инвариант»
  недостижим ни на одной задаче
- rebase перенесён внутрь worktree задачи: прежняя форма падала на занятой
  ветке, и агент уводил весь батч в провалившиеся с ложной причиной
- контракт брифа дополнен восемью слотами; проверен заполнением на обоих
  проектах, незаполнимых нет. Прецедент healthlog вынут из общего charter'а
  в бриф — там он вмёрз вместе с числами
- шов: пайплайн задачу не закрывает и записи учёта не трогает, урожай
  отдаёт списком, правило остатка — ссылкой на av-dev-tasks
- деградированный абзац во всех девяти проходах, вопрос 9 в ops,
  пространство имён в вызовах, раздел предпосылок
This commit is contained in:
av
2026-08-03 11:45:40 +03:00
parent 20dca29add
commit 0eca206460
18 changed files with 1021 additions and 214 deletions
+34 -13
View File
@@ -27,8 +27,19 @@ color: green
Из брифа тебе нужны: **`## Инварианты`** (что делает находку `critical` и что
делает её развилкой), **`## Прод и поток`** (что необратимо — от этого зависит
ранжирование), **`## Недоступно проверке`** (эта секция целиком уезжает в границы
покрытия), **`## Команды`** (что запускать запрещено).
ранжирование), **`## Прецеденты`** (готовые оракулы: находка того же класса, что
уже воспроизводился здесь, подтверждается ссылкой на прецедент),
**`## Типовые ложноположительные`** (единственный проектный вход в шаг 4),
**`## Недоступно проверке`** — оба подраздела, они целиком уезжают в границы
покрытия и **не сливаются в один список**, — **`## Команды`** (что запускать
запрещено).
**Брифа нет** — работай по общим правилам, но: ни одну находку не поднимай до
`critical` по основанию «нарушен инвариант проекта» (сослаться не на что),
ранжируй по обратимости, выведенной из кода, и назови это предположением. Первой
строкой сводки — «прогон шёл без брифа проекта (<причина>)», и это же идёт в
границы покрытия. Одинаковая строка «брифа нет» без причины перестаёт читаться
на третьей задаче — причину сохраняй.
## Порядок. Не меняй его
@@ -79,9 +90,16 @@ severity:
Типовая вкусовщина в выводах generative-проходов: переименования без коллизии,
перестановка функций, «лучше вынести в отдельный файл», предложения обобщить
работающий частный случай. Отдельный класс — предложение «нормализовать» то, что
инвариант проекта велит хранить дословно: это не просто вкусовщина, а нарушение
инварианта, и выбрасывать его надо с пометкой почему.
работающий частный случай.
**Проектный вход сюда один — раздел `## Типовые ложноположительные` брифа.**
Там перечислены находки, которые в этом проекте выглядят убедительно и всегда
неверны: они выбрасываются со ссылкой на пункт и с пометкой почему, а не
«смягчаются». Классический обитатель раздела — предложение «нормализовать» то,
что инвариант велит хранить дословно: это не просто вкусовщина, а находка,
предлагающая нарушить инвариант. Раздела нет или он пуст — скажи об этом строкой
в границах покрытия: отсев шёл по общим критериям, проектных ложноположительных
ты не знал.
### 5. Ранжирование по ущербу × вероятности
@@ -121,8 +139,7 @@ severity:
Сводка отчёта называет **каждый проход профиля** и его исход: отработал (сколько
находок) / не запускался (почему). Сверь список запущенного с составом профиля
сам, а не доверяй тому, что тебе подали: пропуск прохода **не отличим от прохода
без находок**, и однажды это стоило семи находок и отдельной задачи на их
дозакрытие.
без находок**, и назвать его больше некому.
Расхождение состава с профилем — это находка о прогоне, и она идёт в сводку
первой строкой, а не растворяется в границах покрытия.
@@ -135,12 +152,16 @@ severity:
- какие **не** запускались и почему (профиль, бюджет, недоступный инструмент,
остановленный прогон);
- что каждый запущенный проход **не мог проверить в принципе** — из его charter'а;
- **что осталось целиком на человеке** — раздел `## Недоступно проверке` брифа
целиком, плюс: история инцидентов, поведение под реальным потоком, поведение
внешних систем в их версиях, завязка потребителей на текущее поведение и вопрос
«а нужна ли эта функциональность вообще»;
- если брифа не было — строку об этом: инварианты, модель угроз и профиль
нагрузки прогону были неизвестны.
- **что осталось целиком на человеке** — раздел `## Недоступно проверке` брифа,
**двумя отдельными списками**: «не проверит ни один проход» и «перестали
проверять сознательно». Слитый список бесполезен: при следующем промахе первый
вопрос — «не тот ли это класс, который мы перестали проверять», и ответить на
него можно только если второй список виден отдельно. Плюс общее: история
инцидентов, поведение под реальным потоком, поведение внешних систем в их
версиях, завязка потребителей на текущее поведение и вопрос «а нужна ли эта
функциональность вообще»;
- если брифа не было — строку об этом **с причиной**: инварианты, модель угроз и
профиль нагрузки прогону были неизвестны, потому что <причина>.
Формулировка «критичных проблем не обнаружено» **запрещена** без этой секции: она
потребляет ощущение проверенности, ничего не гарантируя, и это хуже, чем