feat(skills): claude-subagent-playbook — исполнитель не берёт ревью на веру

- Зачем:
  - после разворота ролей (реализация Опусом, ревью Кодексом) ревьюер
    продавливает исполнителя формальными решениями: за прогоны #39, #40 и
    #50 около 28 находок и ноль отклонений.
- Что:
  - в triage-header добавлен блок «ревью — свидетельство, а не приказ»:
    отклонение равноправно починке, маршрут ревьюера — предложение.
  - определение NEEDS_DECISION расширено случаем, когда выбор делает сама
    починка, независимо от объёма правки.
  - в recheck-header добавлен суд над лечением: перебор — тоже дефект, а
    NOT_CLOSED требует существующего закрывающего состояния и цены
    альтернативы.
  - в lessons закрыт долг четырёх прогонов и сведена очередь на механизм.
- Проверка:
  - следующий полный прогон плейбука: в триаже должны появиться
    отклонения или закрытия своим маршрутом с доводом.
This commit is contained in:
Dmitry Dementiev committed 2026-08-03 21:38:37 +03:00
1 parent c18472e360
commit 36fc76ff90
3 files changed
+76 -9

No files matched your search

@@ -649,8 +649,7 @@ compose down`); отдельных событий эскалации в `--json`
Штатная конфигурация: реализация — Опус-мастеровой, линия кода — Кодекс (high)
свежим тредом, линия задачи и вкуса — свежий Опус. Долг двух прошлых прогонов
закрыт руками: в шапку триажа и в шапку перепроверки дописаны абзацы про
соразмерность лечения (заготовки прогона; кандидат — перенести в
`prompts/triage-header.md` и `prompts/recheck-header.md`).
соразмерность лечения (заготовки прогона; перенесены в шапки 2026-08-03).
- **Ручка сработала трижды за один прогон.** Перепроверка вкусовой линии
сама оценила правку спеки на перебор (вышла за границу промпта — принята
@@ -722,9 +721,7 @@ compose down`); отдельных событий эскалации в `--json`
ALL_CLOSED + 1 новый NIT (повтор фразы в спеке, внесённый починкой TASK-2) —
поправил сам по месту. Тесты 353 → 383.
- **Долг скилла остаётся тот же**: абзацы про соразмерность лечения третий
прогон подряд пишутся руками. Кандидат прежний — перенести в
`prompts/triage-header.md` и `prompts/recheck-header.md` (тексты этого
прогона годятся как есть).
прогон подряд пишутся руками. Закрыт 2026-08-03.
## 2026-08-02: сломанный прибор доезжает до коммита (clickstream v2, тикет #50)
@@ -778,6 +775,51 @@ compose down`); отдельных событий эскалации в `--json`
~31 мин, саморевью 3/3; слепые ревью — Опус 28 инструментов / 7 находок,
Кодекс 120 команд / 1, пересечение **ноль**; триаж 8 FIXED + второй круг
на 1 новую находку, 0 отклонённых; перепроверки 15 и 18; тесты 383 → 394.
- **Долг четвёртый прогон подряд тот же**: шапки соразмерности в
`prompts/triage-header.md` и `prompts/recheck-header.md` так и не
перенесены.
- **Долг четвёртый прогон подряд тот же**: шапки соразмерности так и не
перенесены. Закрыт 2026-08-03.
## 2026-08-03: долг соразмерности закрыт, и найдена его настоящая причина
Сессия без прогона: разбор `lessons.md` по `/writing-great-skills` и правка
шапок. Долг, висевший с #39, закрыт — правки лежат в
`prompts/triage-header.md` и `prompts/recheck-header.md`, содержание там,
здесь не дублирую.
- **Причина не в размере починки, а в весе слова** (диагноз пользователя).
Пока код писал Кодекс, а ревьюил Опус, послушный исполнитель был прав:
ревьюер сильнее как архитектор. После разворота ролей — вкусовая
реализация Опусом, ревью Кодексом — послушание стало вредным: Кодекс
очень сильный исполнитель, но слабее как мыслитель-архитектор, настойчив,
склонен к формализации без учёта высокоуровневой цели и продавливает
Опуса на свои решения. Перекос усиливает разница ступеней: Опус на medium
против Сола на high уступает ещё и по «званию».
- **Цифра под диагнозом**: #39, #40, #50 — около 28 находок, ноль
отклонений.
- **Два кандидата сняты сверкой с эмпирикой, а не по вкусу.** Требование
объявлять ослабление порога отдельной строкой — против него сам урок #50
(«объявление не заменяет проверку необходимости»), а оба случая (#40,
#50) поймала перепроверка. Пункт «оценивай довод исполнителя, а не факт
несогласия» — дубль строки, уже стоявшей в шапке.
- **Правило об арбитре в споре не писалось намеренно**: спора ни разу не
было (ноль отклонений), правило под несуществующую ситуацию есть
перерегулирование. Ждём первого отклонения — новые шапки как раз должны
его породить.
- **Разбор самого файла**: 783 строки, 22 записи; собственное правило
«поглощён урок — сожми до строки-факта» сработало один раз (07-12) и с
тех пор нет — записи после него по 30–80 строк, часть держит вторую копию
действующих правил SKILL.md. Дистилляция архива вынесена отдельным
заходом.
**Очередь на механизм** (сведена сюда, чтобы не искать по всему файлу):
блок открытых решений в промпте ревью — «какие решения ещё открыты и кем
владеются» (#36); абзац от линии Кодекса «что сделает эту правку
провальной, даже если все критерии зелёные» (#50); приёмы против сломанного
прибора оркестратора (#38 — `PYTHONDONTWRITEBYTECODE=1` и чистое дерево
крайними прогонами; #50 — арифметика чисел, попадающих в спеку, и явное
зерно; #39/#40 — тонкий лог перепроверки как повод проверить MAJOR своим
зондом; #40/#50 — один пример целиком на приёмке); мелочи по месту —
сведение вердиктов по совпадению явления, а не формулировки (этап 5), ревью
постановки не запускает команды тикета (этап 2), оговорка про `< /dev/null`
рядом с приёмом в `codex-exec.md`; старьё — ранжирование правил задачи
(07-07), эхо файла задачи (07-13), A/B на gpt-5.6-terra (07-13), пп. 1–2 и 4
одёргиваний (07-31).
@@ -5,6 +5,16 @@ their resolutions report is appended below. Check ONLY your own findings —
no full second pass. Mandate unchanged: modify nothing; reading and
running tests are allowed.
Judge the repair, not only the closure:
- A fix that reaches further than your finding required is itself a
defect — and the likeliest source of it is your own prescription, so
put that on trial too.
- Before writing NOT_CLOSED, check that a closing state exists at all,
and price the alternative. A demand the platform cannot satisfy, or one
that trades away a real property to guard against deliberate misuse, is
not a valid NOT_CLOSED.
One line per your original ID: `ID | CLOSED | NOT_CLOSED (why) |
REJECTION_VALID | REJECTION_INVALID (why)`. Judge a rejection by its
argument in the resolutions report — contract and test, not taste. If you
@@ -10,11 +10,26 @@ disposition:
"not important" is not accepted;
- OUT_OF_SCOPE — needs a boundary decision; state which one;
- NEEDS_DECISION — a product, architecture, or risk choice a technical
argument cannot settle; state the open question.
argument cannot settle; state the open question. This includes the case
where your own fix would settle such a choice — the size of the edit is
irrelevant.
OUT_OF_SCOPE and NEEDS_DECISION belong to the coordinator — do not
silently decide them yourself.
## The review is evidence, not orders
A review report is a set of claims, not a list of instructions. Verify
every finding yourself. You own the task; the review is there to help.
- **Rejection is a normal outcome, not a conflict.** A REJECTED with an
argument from contract and test is worth exactly as much as a FIXED. A
run with no rejection and no finding closed by your own route says
nothing about the quality of the review — it is a reason to re-read
what you took on trust.
- **The reviewer's route is a proposal.** Closing a finding another way
is fine when the argument is stronger; name the route you took and why.
No commits. Do NOT edit the task file: write detailed resolutions and
rejection arguments to your assigned report file — re-checks and fresh
threads will read that file by path; the task file is updated separately