docs(skills): плейбук — структурный рефакторинг: ось вкуса, брифы, два Опус-агента
Зачем. Отдельный осознанный заход, закрывающий открытые вопросы 2026-07-26 и 2026-07-31: две ручки выбора (модель, эффорт) были про силу, вкус ими не выражался; константы линий дрейфовали через перепечатку; правила координации прогона #18 жили только в журнале; у Agent-тула нет ручки effort — карта была нереализуема разовым вызовом. Что. - Третья ось выбора — вкус: references/model-matrix.md (матрица Тео с поправкой пользователя под gpt-5.6-sol/Opus 5); разрез по подзадачам на этапе 1, сначала вкусовая часть. - «Родословная» разведена на семейство (классы находок) и свежесть (независимость); линия дефектов — по различию, уместности — по умению. - Ступень эффорта выбирается выбором агента: определений столько, сколько пар (модель, ступень) — deep-reasoner (high), craftsman (medium, исполнение брифов: реализация/ревью/перепроверки; поглотил adversarial-reviewer), fast-worker; карта с обоснованиями — SSOT в claude-agents.md. - Константы — файлами в prompts/: line-task/code/rev, self-review; line-taste — вкусовая линза с 12 запахами Фаулера из /code-review. - Правила #18 — в механизм: инкрементальная запись индекса, глубина один и проверка среды в мандате, признак жизни / другой путь вердикта замене / среда своими глазами в «Сбоях», стенд одной линии, stdin фона. - lessons дистиллирован (586→533), handoff захода — в handoffs/. Проверка. Слепое ревью Опусом по writing-great-skills: CHANGES_REQUIRED (7 MAJOR, 17 MINOR, 3 NIT) — все закрыты или отклонены с доводом в lessons; ссылки пакета проверены скриптом, битых нет. Боевой прогон новой структуры — следующим заходом (чек-лист в handoff). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6070810c2d
commit
3e0498e242
12 files changed
+466
-259
No files matched your search
@@ -6,6 +6,14 @@
|
||||
|
||||
- [prompts/review-boilerplate.md](prompts/review-boilerplate.md) — мандат
|
||||
ревьюера + формат индекса находок (этапы 2 и 4).
|
||||
- [prompts/line-task.md](prompts/line-task.md) /
|
||||
[prompts/line-code.md](prompts/line-code.md) /
|
||||
[prompts/line-rev.md](prompts/line-rev.md) — файлы линий ревью: линза и
|
||||
префикс ID (две слепые линии / одиночный ревьюер).
|
||||
- [prompts/line-taste.md](prompts/line-taste.md) — вкусовая линза с базой
|
||||
запахов Фаулера; подшивается к линии уместности (этап 4 SKILL.md).
|
||||
- [prompts/self-review.md](prompts/self-review.md) — саморевью
|
||||
исполнителя (этап 3, resume тем же тредом).
|
||||
- [prompts/triage-header.md](prompts/triage-header.md) — правила триажа
|
||||
для исполнителя (этап 5).
|
||||
- [prompts/recheck-header.md](prompts/recheck-header.md) — узкая
|
||||
@@ -29,7 +37,7 @@
|
||||
переживает. Windows-кавеат из codex-exec.md в силе: путь —
|
||||
forward-slash, не голый `/tmp` Git Bash.
|
||||
- Через Write оркестратор пишет **только параметрические блоки** ниже;
|
||||
плейсхолдеры `{{...}}` — значения задачи, секции «adapt» — по смыслу.
|
||||
секции «adapt» — по смыслу.
|
||||
|
||||
Сборка на прогон: `D="$SCRATCH/<NN-slug>"` — подпапка задачи; `P` —
|
||||
`references/prompts` в базовом каталоге скилла (путь даётся в шапке
|
||||
@@ -37,10 +45,15 @@
|
||||
|
||||
```bash
|
||||
cat "$D/task-body.md" "$P/runtime-language.md" > "$D/task-prompt.md"
|
||||
cat "$D/review-params.md" "$D/line-task.md" "$P/review-boilerplate.md" \
|
||||
"$P/runtime-language.md" > "$D/review-prompt-task.md"
|
||||
# вторая линия: line-code.md -> review-prompt-code.md;
|
||||
# одиночный ревьюер: line-rev.md -> review-prompt.md
|
||||
cat "$D/review-params.md" "$P/line-task.md" "$P/line-taste.md" \
|
||||
"$P/review-boilerplate.md" "$P/runtime-language.md" \
|
||||
> "$D/review-prompt-task.md"
|
||||
cat "$D/review-params.md" "$P/line-code.md" \
|
||||
"$P/review-boilerplate.md" "$P/runtime-language.md" \
|
||||
> "$D/review-prompt-code.md"
|
||||
# одиночный ревьюер: line-rev.md (+ line-taste.md) -> review-prompt.md
|
||||
# line-taste.md едет с линией уместности — переставь, если её ведёт
|
||||
# другая линия (назначение линий — этап 4 SKILL.md)
|
||||
cat "$P/triage-header.md" "$D/review-codex.md" "$D/review-claude.md" \
|
||||
"$D/notes.md" "$P/runtime-language.md" > "$D/fix-prompt.md"
|
||||
# notes.md опционален — нет, так не включай
|
||||
@@ -91,15 +104,16 @@ will run it before the reviews start.
|
||||
|
||||
Отдельным ходом после отчёта о реализации, до внешних ревью — смена рамки
|
||||
«автор → критик» отдельным ходом ловит больше, чем финальный пункт
|
||||
чек-листа в промпте задачи:
|
||||
чек-листа в промпте задачи. Текст готов файлом:
|
||||
|
||||
```text
|
||||
Now switch roles: you are a reviewer of your own diff. Walk it against the
|
||||
task's acceptance criteria and boundaries. Fix what you find, stay inside
|
||||
the task scope. Return one line: SELF-REVIEW: found N, fixed N — plus one
|
||||
phrase per unfixed item, if any.
|
||||
```bash
|
||||
cat "$P/self-review.md" | codex exec resume <thread-id> ...
|
||||
```
|
||||
|
||||
Опус-исполнителю (`craftsman`) — тот же файл продолжением его треда:
|
||||
запускай его с `name` и шли SendMessage
|
||||
«read and execute $P/self-review.md».
|
||||
|
||||
## 2. Ревью: общий блок + файл линии
|
||||
|
||||
Общий параметрический блок (`review-params.md`) один на обе линии и не
|
||||
@@ -111,17 +125,20 @@ phrase per unfixed item, if any.
|
||||
|
||||
```text
|
||||
Read {{path to this line's review prompt}} and execute it. Working directory:
|
||||
{{repo root}}. Write the full findings index to
|
||||
{{repo root}}. Write the findings index to
|
||||
{{$D/review-claude.md}} — it is outside the repo, so the mandate allows
|
||||
it (via Write or a Bash heredoc, whichever you have). Keep the index
|
||||
strict: ONE line per finding and per confirmation, as the boilerplate
|
||||
demands — no multi-line entries. Final message: ONLY the VERDICT line,
|
||||
severity counters and the file path.
|
||||
it (via Write or a Bash heredoc, whichever you have). Append each finding
|
||||
to that file as you go — incremental writing keeps a partial index alive
|
||||
if the session dies. Keep the index strict: ONE line per finding and per
|
||||
confirmation, as the boilerplate demands — no multi-line entries. Final
|
||||
message: ONLY the VERDICT line, severity counters and the file path.
|
||||
```
|
||||
|
||||
(Однострочность продублирована в обёртке не случайно: boilerplate это уже
|
||||
требует, но Клод-родословная держит формат хуже Codex — эмпирика
|
||||
требует, но Клод-семейство держит формат хуже Codex — эмпирика
|
||||
2026-07-12/13, многострочные находки и развёрнутые confirmations.)
|
||||
Замене молчащего ревьюера давай **другой** путь вердикта — правило в
|
||||
«Сбоях координации» SKILL.md.
|
||||
|
||||
```markdown
|
||||
# Code review: {{ticket NN — essence}}
|
||||
@@ -140,36 +157,16 @@ Test command (expect {{N}} passed): {{command}}
|
||||
shared code}}
|
||||
```
|
||||
|
||||
Файлы линий (`line-task.md` / `line-code.md`), по одному на слепую линию:
|
||||
|
||||
```markdown
|
||||
## Your line
|
||||
FINDING PREFIX: TASK
|
||||
Lens: compliance with the statement, acceptance criteria, boundaries,
|
||||
intended observable result.
|
||||
Taste: formally correct but substantively wrong is a finding — work out of
|
||||
proportion to the task, an added artifact that does not earn its
|
||||
existence, a check that passes without proving its own claim. Grade a
|
||||
taste finding by the cost of living with the code, not by whether it
|
||||
breaks a test.
|
||||
```
|
||||
|
||||
```markdown
|
||||
## Your line
|
||||
FINDING PREFIX: CODE
|
||||
Lens: correctness, invariants, regressions, security, test honesty.
|
||||
```
|
||||
|
||||
Одиночному ревьюеру (простая ступень шкалы этапа 4) — один `line-rev.md`
|
||||
с обеими линзами и префиксом `REV`. По эмпирике прогонов естественное
|
||||
распределение: Codex — CODE (дефекты нового кода), Клод — TASK (уровень
|
||||
задачи и архитектуры).
|
||||
|
||||
Блок `Taste:` едет с **родословной**, а не с буквой линии: он адресован
|
||||
Клоду (решение пользователя 2026-07-23, запись в
|
||||
[lessons.md](lessons.md)). При обычном распределении и у одиночного
|
||||
ревьюера он уже на месте — обоих ведёт Клод. Поменялись родословными —
|
||||
переставь блок целиком туда, где Клод.
|
||||
Файлы линий — готовые константы в `prompts/`, оркестратор их не
|
||||
перепечатывает: `line-task.md` (уместность: постановка, критерии,
|
||||
границы), `line-code.md` (дефекты: корректность, инварианты, регрессии),
|
||||
одиночному ревьюеру — `line-rev.md` (обе линзы, префикс `REV`).
|
||||
Вкусовая линза с базой запахов — `line-taste.md`; она едет с **линией
|
||||
уместности** (её ведёт модель со вкусом — назначение линий в этапе 4
|
||||
SKILL.md), поэтому разрез — выбором файла в `cat`, не пересказом
|
||||
границы. Стенд делится между линиями? Явный запрет ломающих команд
|
||||
второй линии — отдельным параметрическим файлом `$D/access-<line>.md`,
|
||||
подшитым после файла линии (правило — этап 4 SKILL.md).
|
||||
|
||||
Вариант для **этапа 2** (ревью постановки, кода изменений ещё нет) — тот же
|
||||
boilerplate, другой параметрический блок:
|
||||
@@ -192,8 +189,9 @@ Code to check the statement's facts against: {{file list with why}}
|
||||
criteria checkable and gameable?, observability}}
|
||||
```
|
||||
|
||||
Файл линии — тем же механизмом: только префикс (`SPEC-A` / `SPEC-B`,
|
||||
одиночному обзору — `SPEC`); линза уже задана рамкой блока.
|
||||
Файл линии здесь — двухстрочный Write (`## Your line` +
|
||||
`FINDING PREFIX: SPEC-A|SPEC-B|SPEC`): константного файла нет
|
||||
намеренно — префикс варьируется, а линза уже задана рамкой блока.
|
||||
|
||||
## 3. Параметрические хвосты триажа и перепроверки
|
||||
|
||||
|
||||
Reference in new issue
Block a user