docs(skill): принцип «мастер решает», готовые boilerplate-промпты, ревизия

- Зачем:
  - ретро прогона 2026-07-12 (задача 20, clickstream-demo): контекст
    оркестратора съедали инлайн-диагнозы, переписывание boilerplate и
    кириллица в обменных файлах.
- Что:
  - SKILL.md: принцип «мастер решает — субагенты выясняют» со стоп-краном
    «сам — максимум один заход», обменные файлы на английском, сквозная
    проверка до ревьюеров, будильник одной строкой.
  - references/prompts/: готовые английские boilerplate-файлы (мандат
    ревью, триаж, перепроверка) — подшиваются cat'ом, контекст мастера
    не проходят; prompt-templates перестроен под сборку.
  - codex-exec: модель gpt-5.6-sol, лестница эффорта, ловушка «&»;
    sandbox-справочник переименован в codex-sandbox-apparmor.md;
    lessons дистиллирован, добавлена запись прогона 2026-07-12.
  - закрыты 14 находок слепого Fable-ревью скилла (согласованность,
    единый источник $SCRATCH, скелет ревью постановки).
- Проверка:
  - все внутренние ссылки резолвятся; слепое ревью: APPROVED_WITH_MINORS,
    восстановление структуры подтверждено без потерь.
This commit is contained in:
ddadmin committed 2026-07-12 22:17:59 +03:00
1 parent 60182ab493
commit 7110a075ea
9 files changed
+357 -410

No files matched your search

@@ -1,136 +1,143 @@
# Скелеты промптов конвейера
# Сборка промптов конвейера
Отработали боевой прогон 2026-07-10 (3 цикла, тикеты FTP/CSV DQ). Правило
использования: заполни скелет в `$SCRATCH` **один раз за прогон** и дальше
не переписывай — на каждую следующую задачу пиши только параметрический
блок и собирай финальный промпт конкатенацией. Плейсхолдеры `{{...}}`
заполняются значениями задачи; секции, помеченные «адаптируй», меняются
по смыслу задачи, остальное — стабильный boilerplate.
Постоянные блоки лежат готовыми файлами в
[prompts/](prompts/) — их не переписывают, а подшивают `cat`'ом прямо из
каталога скилла, через контекст оркестратора они не проходят вовсе:
`$SCRATCH` здесь — общий обменный каталог прогона во **временном каталоге
ОС с полуслучайным префиксом**: скретчпад сессии из системного промпта
(он уже такой) или `mktemp -d` на прогон. Это безопасный вариант
(решение пользователя 2026-07-10): не мусорит в репо, не сталкивается с
параллельными прогонами и не переживает ребут машины — устаревшие обменные
файлы не накапливаются. Windows-кавеат из codex-exec.md в силе: путь —
forward-slash, не голый `/tmp` Git Bash.
- [prompts/review-boilerplate.md](prompts/review-boilerplate.md) — мандат
ревьюера + формат индекса находок (этапы 2 и 4).
- [prompts/triage-header.md](prompts/triage-header.md) — правила триажа
для исполнителя (этап 5).
- [prompts/recheck-header.md](prompts/recheck-header.md) — узкая
перепроверка (этап 5); может принести новую находку — это не нарушение
узости, отправь её исполнителю тем же порядком.
Правила:
- **Обменные файлы — на английском** (правило SKILL.md): скелеты ниже уже
английские. Русский — только формулировкам, попадающим в задачу-файл,
коммиты и доклады пользователю.
- **Каталог прогона** — `$SCRATCH/<NN-slug>/` на задачу: `$SCRATCH` —
временный каталог ОС (скретчпад сессии или `mktemp -d`), подпапка — чтобы
обмен нескольких задач не сваливался в кучу. В репо не мусорит, ребут не
переживает. Windows-кавеат из codex-exec.md в силе: путь —
forward-slash, не голый `/tmp` Git Bash.
- Через Write оркестратор пишет **только параметрические блоки** ниже;
плейсхолдеры `{{...}}` — значения задачи, секции «adapt» — по смыслу.
Сборка на прогон: `D="$SCRATCH/<NN-slug>"` — подпапка задачи; `P` —
`references/prompts` в базовом каталоге скилла (путь даётся в шапке
вызова скилла):
```bash
cat "$D/review-params.md" "$P/review-boilerplate.md" > "$D/review-prompt.md"
cat "$P/triage-header.md" "$D/review-codex.md" "$D/review-claude.md" \
"$D/notes.md" > "$D/fix-prompt.md" # notes.md опционален — нет, так не включай
cat "$P/recheck-header.md" "$D/recheck-params.md" > "$D/recheck-prompt.md"
```
## 1. Задача исполнителю (`codex exec`, workspace-write)
```markdown
# Задача: {{тикет/цель одной строкой}}
Рабочий каталог — корень репозитория {{repo}}. Ветка {{branch}} — работай
в ней, ветку не менять.
## Что делать
Реализуй {{тикет NN}} из {{путь к задаче-файлу}}. Задача самодостаточна:
постановка — в тикете, следуй ей буквально; чекбоксы — критерии приёмки.
Кажется неправильным — реализуй как написано и отметь сомнение в отчёте.
## Сначала прочитать (обязательно, до кода)
{{нумерованный список: задача-файл, спека, образцы кода, конвенции}}
## Порядок и дисциплина
{{адаптируй: TDD, порядок слоёв, команда тестов}}
## Границы (что трогать нельзя)
- **Коммитов не делать.** Никаких `git commit`/`git add`.
{{адаптируй: стабы, чужой код, существующие тесты, файлы вне репо}}
## Финальный отчёт (что вернуть)
1. Файлы с одной строкой «зачем» на каждый.
2. Команда тестов и итог прогона (счётчик, все зелёные).
3. Чекбоксы: какие закрыты, какие нет и почему.
4. Сомнения, если были.
```
## 2. Слепое ревью (один файл на ОБОИХ ревьюеров)
Канонический файл не знает, кто его читает — куда класть вердикт, задаёт
обёртка вызова, и пути у ревьюеров разные (иначе коллизия):
- **Codex**: файл через stdin; отдельный файл вердикта не нужен — вердикт
и есть его `-o`-отчёт (`$SCRATCH/NN-review-codex.md`).
- **Клод-субагент**: в prompt — только обёртка: «прочитай {{путь к
каноническому файлу}} и выполни, рабочий каталог {{корень репо}};
полный индекс запиши в {{$SCRATCH/NN-review-claude.md}} — это вне репо,
мандату не противоречит (Write у тебя нет — Bash heredoc'ом); финальным
сообщением пришли только строку VERDICT, счётчики по severity и путь
к файлу».
Сохрани как `$D/task-prompt.md` — под этим именем его ждут примеры
codex-exec.md.
```markdown
# Ревью кода: {{тикет NN — суть}}
# Task: {{ticket/goal in one line}}
Ты — независимый адверсарный ревьюер. Рабочий каталог — корень
репозитория {{repo}}, ветка {{branch}}.
Working directory: repo root {{repo}}. Branch {{branch}} — stay on it.
## Мандат (жёсткий)
- Исходники и окружение НЕ менять. Правок не вносить — только находки.
- Запускать тесты, проверять гипотезы, читать документацию — можно и
нужно; безопасные эмпирические проверки во временных каталогах вне
репо поощряются: вердикт с проверкой твёрже вердикта по прочтению.
- Никаких `git add`/`git commit`/`git checkout`.
- Итог — только индекс находок и строка VERDICT, без пересказа кода и
нарратива; куда его положить — сказано в вызове.
## What to do
Implement {{ticket NN}} from {{path to task file}}. The task is
self-contained: follow it literally; checkboxes are the acceptance
criteria. If something seems wrong — implement as written and flag the
doubt in your report.
## Что ревьюишь
{{задача-файл + спека; что уже закоммичено и не ревьюится}}
Изменения (незакоммичены, смотри рабочее дерево): {{список файлов}}
Команда тестов (ожидается {{N}} passed): {{команда}}
## Read first (mandatory, before any code)
{{numbered list: task file, spec, code samples, conventions}}
## Фокус
{{адаптируй: 3–4 пункта под задачу — математика/краевые, соответствие
критериям, честность тестов, общий код/регрессии}}
## Order and discipline
{{adapt: TDD, layer order, test command}}
## Формат файла находок — только индекс
SEVERITY(BLOCKER|MAJOR|MINOR|NIT) | файл:строка | суть одной фразой | как проверить/воспроизвести
В конце — отдельная строка: VERDICT: APPROVED | APPROVED_WITH_MINORS | CHANGES_REQUIRED
## End-to-end check <-- опционально: только если в репо есть дешёвый сквозной прогон
Run {{command}} before finishing. If it is unavailable in your sandbox
(docker, live stand) — say so explicitly in the report: the orchestrator
will run it before the reviews start.
## Boundaries (do not touch)
- **No commits.** No `git commit` / `git add`.
{{adapt: stubs, foreign code, existing tests, files outside the repo}}
## Final report (return this)
1. Files changed, one-line "why" each.
2. Test command and result (counters, all green).
3. Checkboxes: which are closed, which are not and why.
4. Doubts, if any.
```
## 3. Триаж исполнителю (`codex exec resume <thread-id>`)
## 2. Ревью: параметрический блок (один на ОБОИХ ревьюеров)
Собирается конкатенацией — находки НЕ переписывать:
`cat шапка.md review-A.md review-B.md замечания.md > fix-prompt.md`
Блок не знает, кто его читает; куда класть вердикт, задаёт обёртка вызова,
и пути у ревьюеров разные (иначе коллизия). Codex получает собранный файл
через stdin (вердикт = его `-o`-отчёт); Клод-субагенту в prompt — короткая
английская обёртка:
Шапка (стабильная):
```text
Read {{path to review-prompt.md}} and execute it. Working directory:
{{repo root}}. Write the full 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). Final message:
ONLY the VERDICT line, severity counters and the file path.
```
```markdown
# Триаж находок двух независимых ревью твоей реализации
# Code review: {{ticket NN — essence}}
Ниже — находки двух слепых ревью **дословно**. Закрой перечисленное,
больше ничего не меняй. По каждой — починка по TDD (сначала тест,
воспроизводящий находку) или аргументированное отклонение через
контракт/спеку и тест — голословное «не важно» не принимается.
Коммитов не делать.
You are an independent adversarial reviewer. Working directory: repo root
{{repo}}, branch {{branch}}.
Финальный отчёт: по каждой находке одной строкой — починено (чем) /
отклонено (довод + где зафиксировано); команда тестов, счётчик прогона,
список изменённых файлов.
## What you review
{{task file + spec; what is already committed and NOT under review}}
Changes (uncommitted, see the working tree): {{file list}}
Test command (expect {{N}} passed): {{command}}
## Focus
{{adapt: 3–4 points — math/edge cases, criteria compliance, test honesty,
shared code/regressions, artifacts}}
```
Замечания оркестратора (опционально, коротко): фактура, которой нет у
исполнителя (проверенные тобой данные), решения уровня задачи
(вне скоупа / принять риск), приоритеты.
## 4. Узкая перепроверка (тем же ревьюером)
Вариант для **этапа 2** (ревью постановки, кода изменений ещё нет) — тот же
boilerplate, другой параметрический блок:
```markdown
# Узкая повторная проверка: закрывают ли правки твои находки
# Spec review: {{ticket NN — essence}}
Исполнитель обработал находки. Проверь ТОЛЬКО свои — полный повторный
обход не нужен. Мандат прежний: ничего не менять, только чтение и прогон
тестов.
You review a TASK STATEMENT, not an implementation. Go into implementation
details only where the statement silently pre-decides a solution. The task
goes to an implementer with no session context — they will do literally
what is written. Working directory: repo root {{repo}}, branch {{branch}}.
Отчёт исполнителя с резолюциями: прочитай {{$SCRATCH/NN-fix-result.md}}.
Команда тестов (ожидается {{N}} passed): {{команда}}
## What you review
Statement: {{path to task file}}. Related context (not under review):
{{parent PRD, sibling tickets}}.
Code to check the statement's facts against: {{file list with why}}
Ответ — по каждой твоей находке одной строкой: CLOSED / NOT_CLOSED
(почему) / REJECTION_VALID / REJECTION_INVALID (почему). Финальная
строка: RECHECK: ALL_CLOSED | ISSUES_REMAIN
## Focus
{{adapt: facts vs code, hidden one-liner decisions/forks, acceptance
criteria checkable and gameable?, observability}}
```
Кавеат: проверь, что Codex-ревьюер может читать `$SCRATCH` из своей
песочницы (temp-каталоги обычно читаемы в workspace-write; в этом прогоне
`-o`-файлы под `/tmp` работали). Если нет — резолюции по его находкам
передай текстом (только его находки, не весь отчёт).
## 3. Параметрические хвосты триажа и перепроверки
`notes.md` (опционально, коротко, по-английски): фактура, которой нет у
исполнителя, решения уровня задачи (вне скоупа / принять риск), приоритеты.
`recheck-params.md` — три строки:
```markdown
Implementer's report with resolutions: read {{$D/fix-result.md}}.
Test command (expect {{N}} passed): {{command}}
```
Кавеат: проверь, что Codex-ревьюер может читать `$SCRATCH` из песочницы
(temp-каталоги обычно читаемы в workspace-write). Если нет — резолюции по
его находкам передай текстом (только его находки, не весь отчёт).