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:
1 parent
60182ab493
commit
7110a075ea
9 files changed
+357
-410
No files matched your search
@@ -20,35 +20,42 @@ description: >-
|
|||||||
|
|
||||||
**Не разворачивай конвейер на мелочь.** Косметика, пара часов работы, один
|
**Не разворачивай конвейер на мелочь.** Косметика, пара часов работы, один
|
||||||
файл — сделай сам: накладные расходы процесса многократно превысят цену
|
файл — сделай сам: накладные расходы процесса многократно превысят цену
|
||||||
работы (эмпирика: на полировку ноутбука чуть не завели несколько issue —
|
работы. Очередь зависимых issue с автономным прогоном —
|
||||||
пользователь остановил). Очередь зависимых issue с автономным прогоном —
|
|
||||||
это `/coordinator-loop`, не этот плейбук.
|
это `/coordinator-loop`, не этот плейбук.
|
||||||
|
|
||||||
## Роли
|
## Роли
|
||||||
|
|
||||||
- **Оркестратор (ты)** — план, постановка, синтез, коммит. Работай по
|
- **Оркестратор (ты)** — план, постановка, синтез, коммит. Принцип:
|
||||||
**индексу** (правило `/coordinator-loop`): в твой контекст входят вердикты
|
**мастер решает — субагенты выясняют**; твой контекст — самый дорогой
|
||||||
и находки `файл:строка`, а не diff, не полные логи и не нарратив. Шумные
|
ресурс, в него входят решения, вердикты и находки `файл:строка` — не
|
||||||
команды — через файл-лог, в контекст только сводку. **Индекс — у тебя,
|
diff, не полные логи, не нарратив. Работу с неизвестным заранее объёмом
|
||||||
полезная нагрузка — файлами между агентами**: вердикты, отчёты и промпты
|
вывода (диагноз падения, исследование гипотезы, серия экспериментов,
|
||||||
живут в `$SCRATCH` (обменный temp-каталог прогона с полуслучайным
|
чтение логов) отдавай субагенту **до её начала**: изнутри она всегда
|
||||||
префиксом — скретчпад сессии или `mktemp -d`; детали — в
|
выглядит «ещё на один шаг». Стоп-кран: **сам — максимум один заход**
|
||||||
[references/prompt-templates.md](references/prompt-templates.md)), ты
|
(одна команда с коротким выводом по единственной гипотезе); не
|
||||||
читаешь их один раз и дальше передаёшь путями и конкатенацией (`cat`), а
|
подтвердилось — делегируй. Механику (правки файлов по готовым решениям,
|
||||||
не переписываешь Write'ом — каждое переписывание дублирует контент в
|
скрипты, вёрстку) — `fast-worker`'у: твоё в них только короткий список
|
||||||
твоём контексте (ретро 2026-07-10: находки ревью проходили через
|
решений. **Индекс — у тебя, полезная нагрузка — файлами между
|
||||||
оркестратора до шести раз). SendMessage возвращает эхом
|
агентами**: вердикты, отчёты и промпты живут в `$SCRATCH` (обменный
|
||||||
весь текст сообщения — teammate'у шли короткое (вердикт, путь, вопрос),
|
temp-каталог прогона — скретчпад сессии или `mktemp -d`; детали — в
|
||||||
|
[references/prompt-templates.md](references/prompt-templates.md)) и
|
||||||
|
ведутся **на английском** — проект их не хранит, а кириллица в 1,5–2
|
||||||
|
раза дороже по токенам; русский — только тому, что уходит в репозиторий
|
||||||
|
и пользователю. Читай их один раз, дальше передавай путями и
|
||||||
|
конкатенацией (`cat`), не переписывай Write'ом — каждое переписывание
|
||||||
|
дублирует контент в твоём контексте. SendMessage возвращает эхом весь
|
||||||
|
текст сообщения — teammate'у шли короткое (вердикт, путь, вопрос),
|
||||||
длинное — файлом, который он прочтёт сам.
|
длинное — файлом, который он прочтёт сам.
|
||||||
- **Codex** — реализация кода. У пользователя лимиты Codex больше, код он
|
- **Codex** — реализация кода. У пользователя лимиты Codex больше, код он
|
||||||
пишет в целом лучше, но верхнеуровнево планирует хуже — поэтому
|
пишет в целом лучше, но верхнеуровнево планирует хуже — поэтому
|
||||||
декомпозиция и постановка остаются у тебя. Механика вызова —
|
декомпозиция и постановка остаются у тебя. Механика вызова —
|
||||||
[references/codex-exec.md](references/codex-exec.md).
|
[references/codex-exec.md](references/codex-exec.md).
|
||||||
- **Ревьюеры** — два, **разных родословных**, слепые друг к другу:
|
- **Ревьюеры** — два, **разных родословных**, слепые друг к другу:
|
||||||
Claude-субагент (`adversarial-reviewer`; нет в среде — скептический
|
Claude-субагент (`adversarial-reviewer`; нет в среде — `deep-reasoner`
|
||||||
`general-purpose`) и Codex **свежим тредом**, не тем, что писал код.
|
или скептический `general-purpose`) и Codex **свежим тредом**, не тем,
|
||||||
Разные родословные ловят непересекающиеся классы находок (пересечение в
|
что писал код.
|
||||||
прогонах — стабильно ~ноль). Обоим — руки: тесты, гипотезы, поиск,
|
Разные родословные ловят разные классы находок (пересечение в прогонах —
|
||||||
|
от нуля до пары тем). Обоим — руки: тесты, гипотезы, поиск,
|
||||||
документация, первоисточники; запрет менять исходники и окружение —
|
документация, первоисточники; запрет менять исходники и окружение —
|
||||||
**мандатом в промпте, не урезанием песочницы** (рецепт и подстраховка —
|
**мандатом в промпте, не урезанием песочницы** (рецепт и подстраховка —
|
||||||
[references/codex-exec.md](references/codex-exec.md)).
|
[references/codex-exec.md](references/codex-exec.md)).
|
||||||
@@ -71,8 +78,8 @@ description: >-
|
|||||||
контекста; всё нужное — в файле: цель, критерии приёмки чекбоксами,
|
контекста; всё нужное — в файле: цель, критерии приёмки чекбоксами,
|
||||||
границы («что трогать нельзя»), «сначала прочитать» (спека, ADR, README с
|
границы («что трогать нельзя»), «сначала прочитать» (спека, ADR, README с
|
||||||
командами), команды проверки. Формат и место — по конвенции репозитория
|
командами), команды проверки. Формат и место — по конвенции репозитория
|
||||||
(например, `.scratch/<feature>/issues/`; репозиторий настроен под скиллы
|
(например, `.scratch/<feature>/issues/`; если репозиторий настроен под
|
||||||
Мэтта Покока — постановка через `/to-tickets` в сконфигурированный трекер:
|
скиллы Мэтта Покока — постановка через `/to-tickets` в его трекер:
|
||||||
тикеты-срезы с рёбрами блокировок вместо ad-hoc файла, конвенции — в
|
тикеты-срезы с рёбрами блокировок вместо ad-hoc файла, конвенции — в
|
||||||
`docs/agents/`, настройка — `/setup-matt-pocock-skills`). Не хватает
|
`docs/agents/`, настройка — `/setup-matt-pocock-skills`). Не хватает
|
||||||
фактуры по внешним библиотекам/API — сначала `/research` и Context7 MCP,
|
фактуры по внешним библиотекам/API — сначала `/research` и Context7 MCP,
|
||||||
@@ -83,17 +90,16 @@ description: >-
|
|||||||
не задав тебе ни одного вопроса.
|
не задав тебе ни одного вопроса.
|
||||||
2. **Свежий взгляд на постановку — до реализации.** Адверсарный ревьюер без
|
2. **Свежий взгляд на постановку — до реализации.** Адверсарный ревьюер без
|
||||||
твоего контекста проверяет задачу против кода: фактические ошибки, скрытые
|
твоего контекста проверяет задачу против кода: фактические ошибки, скрытые
|
||||||
решения-«однострочники», недостающие критерии. Окупается: ловит блокеры,
|
решения-«однострочники», недостающие критерии. Окупается каждый прогон:
|
||||||
которые исполнитель молча реализовал бы (эмпирика: «русские названия из
|
ловит блокеры, которые исполнитель молча реализовал бы. Постановка
|
||||||
`name_ru`» — а в данных `name_ru` английский). Постановка крупная или
|
крупная или
|
||||||
цена ошибки высока — сделай ревью двойным и слепым, как для кода: вторая
|
цена ошибки высока — сделай ревью двойным и слепым, как для кода: вторая
|
||||||
линия — Codex свежим тредом с явной рамкой «ревьюируй постановку, не
|
линия — Codex свежим тредом с явной рамкой «ревьюируй постановку, не
|
||||||
реализацию; детали реализации — только если постановка молча предрешает
|
реализацию; детали реализации — только если постановка молча предрешает
|
||||||
решение» (без рамки зарывается в детали). Родословные и тут ловят разное:
|
решение» (без рамки зарывается в детали). Родословные и тут ловят разное:
|
||||||
Codex — уровень требований (недостающие критерии, наблюдаемость,
|
Codex — уровень требований (недостающие критерии, наблюдаемость,
|
||||||
«формально отчитаться можно»), Клод — механику кода (нереализуемые
|
«формально отчитаться можно»), Клод — механику кода (нереализуемые
|
||||||
формулировки, мёртвые стабы; эмпирика 2026-07-10: пересечение — 2 темы
|
формулировки, мёртвые стабы). Этап закрыт, когда каждая
|
||||||
из ~15). Этап закрыт, когда каждая
|
|
||||||
находка внесена в задачу **решением** или письменно отклонена — «пусть
|
находка внесена в задачу **решением** или письменно отклонена — «пусть
|
||||||
решит исполнитель» решением не считается.
|
решит исполнитель» решением не считается.
|
||||||
3. **Реализация Кодексом.** Промпт: «задача самодостаточна, следуй буквально,
|
3. **Реализация Кодексом.** Промпт: «задача самодостаточна, следуй буквально,
|
||||||
@@ -103,7 +109,11 @@ description: >-
|
|||||||
[references/codex-exec.md](references/codex-exec.md).
|
[references/codex-exec.md](references/codex-exec.md).
|
||||||
Один писатель в дереве: пока Codex пишет — никто больше (казус с
|
Один писатель в дереве: пока Codex пишет — никто больше (казус с
|
||||||
форвардером — в [references/lessons.md](references/lessons.md)). Готово,
|
форвардером — в [references/lessons.md](references/lessons.md)). Готово,
|
||||||
когда Codex вернул отчёт, а в дереве нет правок, которых он не называл.
|
когда Codex вернул отчёт, в дереве нет правок, которых он не называл,
|
||||||
|
и дешёвая сквозная проверка (если она есть в репо) зелёная: гонял её
|
||||||
|
исполнитель по промпту, а если ему она недоступна (docker, стенд) — ты,
|
||||||
|
**до запуска ревьюеров**: иначе ревью уйдёт на код, который сквозной
|
||||||
|
прогон ещё поменяет.
|
||||||
4. **Два слепых ревью параллельно.** Промпт — **один канонический файл в
|
4. **Два слепых ревью параллельно.** Промпт — **один канонический файл в
|
||||||
`$SCRATCH` на оба ревью** (скелет и обёртки вызова —
|
`$SCRATCH` на оба ревью** (скелет и обёртки вызова —
|
||||||
[references/prompt-templates.md](references/prompt-templates.md)): Codex
|
[references/prompt-templates.md](references/prompt-templates.md)): Codex
|
||||||
@@ -111,15 +121,13 @@ description: >-
|
|||||||
«прочитай файл X и выполни; индекс — в файл Y» (не дублируй текст
|
«прочитай файл X и выполни; индекс — в файл Y» (не дублируй текст
|
||||||
промпта в параметре — это второй полный экземпляр в твоём контексте).
|
промпта в параметре — это второй полный экземпляр в твоём контексте).
|
||||||
Содержание: путь к задаче-файлу + фокус (математика/краевые случаи,
|
Содержание: путь к задаче-файлу + фокус (математика/краевые случаи,
|
||||||
соответствие критериям, честность тестов, артефакты). Друг про друга не
|
соответствие критериям, честность тестов, артефакты); мандат и
|
||||||
знают, твои выводы им не пересказывай. Обоим поощряй безопасные
|
поощрение эмпирических проверок уже в готовом boilerplate. Друг про
|
||||||
эмпирические проверки (воспроизвести краевой случай вне репо, сходить в
|
друга не знают, твои выводы им не пересказывай. Вердикты — файлами с
|
||||||
документацию) — вердикт заметно твёрже; менять исходники и окружение
|
**разными путями**: у Codex это его `-o`-отчёт, Клод-ревьюеру путь и
|
||||||
нельзя. Вердикты — файлами с **разными путями**: у Codex это его
|
финальный акт (SendMessage только со строкой VERDICT, счётчиками и
|
||||||
`-o`-отчёт, Клод-ревьюеру обёртка разрешает запись файла вердикта в
|
путём) задаёт готовая обёртка из шаблонов; его idle-уведомления
|
||||||
`$SCRATCH` (вне репо — мандату не противоречит), финальным актом —
|
результата не содержат, не жди из них ничего. После
|
||||||
SendMessage только со строкой VERDICT, счётчиками и путём: его
|
|
||||||
idle-уведомления не содержат результата, не жди из них ничего. После
|
|
||||||
ревью сверь дерево (`git status`). Клод-ревьюеру можно поручить смотреть
|
ревью сверь дерево (`git status`). Клод-ревьюеру можно поручить смотреть
|
||||||
артефакты (картинки из ноутбука). Этап закрыт, когда оба вердикта у тебя
|
артефакты (картинки из ноутбука). Этап закрыт, когда оба вердикта у тебя
|
||||||
индексами и дерево нетронуто; вердикт без единой находки засчитывай
|
индексами и дерево нетронуто; вердикт без единой находки засчитывай
|
||||||
@@ -131,9 +139,10 @@ description: >-
|
|||||||
кода): перешли Codex индекс находок **дословно**, он чинит или
|
кода): перешли Codex индекс находок **дословно**, он чинит или
|
||||||
**аргументированно отклоняет** — через контракт и тест, не голословно;
|
**аргументированно отклоняет** — через контракт и тест, не голословно;
|
||||||
промпт починки — «закрой перечисленное, больше ничего не меняй».
|
промпт починки — «закрой перечисленное, больше ничего не меняй».
|
||||||
«Дословно» — это конкатенация: `cat шапка.md вердикт-A.md вердикт-B.md >
|
«Дословно» — это конкатенация: `cat triage-header.md вердикт-A.md
|
||||||
fix-prompt.md` Bash'ем; Write'ом ты бы переписал те же находки в контекст
|
вердикт-B.md > fix-prompt.md` Bash'ем (шапка готова в
|
||||||
ещё раз. Свои замечания к триажу — только шапкой. Ты судишь уровнем
|
`references/prompts/`); Write'ом ты бы переписал те же находки в
|
||||||
|
контекст ещё раз. Свои замечания к триажу — только шапкой. Ты судишь уровнем
|
||||||
задачи: принять риск / вне скоупа. Повторная проверка — узкая (см.
|
задачи: принять риск / вне скоупа. Повторная проверка — узкая (см.
|
||||||
«Свежесть»); её промпт не пересказывает резолюции — ссылается на файл
|
«Свежесть»); её промпт не пересказывает резолюции — ссылается на файл
|
||||||
отчёта исполнителя. Этап закрыт, когда по каждой находке обоих ревью есть
|
отчёта исполнителя. Этап закрыт, когда по каждой находке обоих ревью есть
|
||||||
@@ -153,9 +162,10 @@ description: >-
|
|||||||
(механика — [references/codex-exec.md](references/codex-exec.md)).
|
(механика — [references/codex-exec.md](references/codex-exec.md)).
|
||||||
Подстраховка от молчаливой смерти агента — ScheduleWakeup сроком дольше
|
Подстраховка от молчаливой смерти агента — ScheduleWakeup сроком дольше
|
||||||
ожидаемой длительности: по пробуждению смотри логи сам, по приходу
|
ожидаемой длительности: по пробуждению смотри логи сам, по приходу
|
||||||
результата таймер снимай. Idle-уведомления teammate-субагентов — шум, а не
|
результата таймер снимай; промпт будильника — одна короткая строка,
|
||||||
событие: не докладывай о них пользователю и не действуй по ним, если
|
план не пересказывай (он живёт в разговоре). Idle-уведомления
|
||||||
результат уже получен (ретро 2026-07-10: ~7 пустых ходов на idle-пингах).
|
teammate-субагентов — шум, а не событие: не докладывай о них пользователю
|
||||||
|
и не действуй по ним, если результат уже получен.
|
||||||
|
|
||||||
## Соседние скиллы
|
## Соседние скиллы
|
||||||
|
|
||||||
@@ -176,9 +186,10 @@ description: >-
|
|||||||
- [references/codex-exec.md](references/codex-exec.md) — прямой `codex exec`:
|
- [references/codex-exec.md](references/codex-exec.md) — прямой `codex exec`:
|
||||||
сквозные правила (шум в файлы, thread_id, resume по id, проверка отписки),
|
сквозные правила (шум в файлы, thread_id, resume по id, проверка отписки),
|
||||||
ветки исполнитель/ревьюер/триаж, раннер для переваривания шума.
|
ветки исполнитель/ревьюер/триаж, раннер для переваривания шума.
|
||||||
- [references/prompt-templates.md](references/prompt-templates.md) — скелеты
|
- [references/prompt-templates.md](references/prompt-templates.md) — сборка
|
||||||
четырёх промптов конвейера (задача/ревью/триаж/перепроверка): пиши только
|
промптов: готовые boilerplate-файлы в `references/prompts/` подшиваются
|
||||||
параметрический блок на задачу, boilerplate не переписывай.
|
`cat`'ом из каталога скилла, Write'ом пишутся только параметрические
|
||||||
|
блоки.
|
||||||
- [references/lessons.md](references/lessons.md) — датированная эмпирика
|
- [references/lessons.md](references/lessons.md) — датированная эмпирика
|
||||||
прогонов: что поймал каждый этап, казусы, цифры.
|
прогонов: что поймал каждый этап, казусы, цифры.
|
||||||
- [references/claude-agents.md](references/claude-agents.md) — определения
|
- [references/claude-agents.md](references/claude-agents.md) — определения
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
(`.claude/agents/*.md`), не глобальные. В новом репозитории их нет — проверь
|
(`.claude/agents/*.md`), не глобальные. В новом репозитории их нет — проверь
|
||||||
`ls .claude/agents/` и при отсутствии создай файлы ниже как есть.
|
`ls .claude/agents/` и при отсутствии создай файлы ниже как есть.
|
||||||
У ревьюера `adversarial-reviewer` репо-локального определения намеренно
|
У ревьюера `adversarial-reviewer` репо-локального определения намеренно
|
||||||
нет: рабочий фолбэк — `general-purpose` со скептическим промптом
|
нет: рабочие фолбэки — `deep-reasoner` (обкатан ревью 2026-07-12) или
|
||||||
(см. «Роли» в SKILL.md).
|
`general-purpose` со скептическим промптом (см. «Роли» в SKILL.md).
|
||||||
|
|
||||||
## Конструкция оркестрации (фрагмент CLAUDE.md репозитория)
|
## Конструкция оркестрации (фрагмент CLAUDE.md репозитория)
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
# Codex через прямой `codex exec`: рецепты и ловушки
|
# Codex через прямой `codex exec`: рецепты и ловушки
|
||||||
|
|
||||||
Проверено 2026-07-09 (codex-cli 0.142.5, Windows + Git Bash); линукс-эмпирика
|
Проверено 2026-07-09 (codex-cli 0.142.5, Windows + Git Bash) и 2026-07-12
|
||||||
прогонов 07-06/07-07 шла через companion-обёртку и отражена в уроках ниже.
|
(0.144.1, WSL2 Ubuntu: exec/resume/`-o`/фоновый Bash — весь конвейер);
|
||||||
|
линукс-эмпирика 07-06/07-07 шла через companion-обёртку и отражена в уроках
|
||||||
|
ниже.
|
||||||
Прямой CLI надёжнее обёртки: её фоновая машина глючит (молчаливая подмена
|
Прямой CLI надёжнее обёртки: её фоновая машина глючит (молчаливая подмена
|
||||||
анализа Кодекса своим — issue #158, ломает слепое ревью; зависшие статусы),
|
анализа Кодекса своим — issue #158, ломает слепое ревью; зависшие статусы),
|
||||||
и её `--write`-запуски режет классификатор авторежима. Далее `$SCRATCH` =
|
и её `--write`-запуски режет классификатор авторежима. Далее `$D` =
|
||||||
каталог скретчпада сессии из системного промпта (не `/tmp`: под Windows
|
подпапка задачи в обменном каталоге прогона (определение и конвенция —
|
||||||
`/tmp` Git Bash — ловушка).
|
[prompt-templates.md](prompt-templates.md)).
|
||||||
|
|
||||||
## Сквозные правила (любая ветка)
|
## Сквозные правила (любая ветка)
|
||||||
|
|
||||||
@@ -22,17 +24,22 @@
|
|||||||
- **Модель и глубину рассуждения задавай явно** (`-m`,
|
- **Модель и глубину рассуждения задавай явно** (`-m`,
|
||||||
`-c 'model_reasoning_effort="..."'`): дефолты берутся из
|
`-c 'model_reasoning_effort="..."'`): дефолты берутся из
|
||||||
`~/.codex/config.toml` и плавают за последней интерактивной сессией
|
`~/.codex/config.toml` и плавают за последней интерактивной сессией
|
||||||
пользователя. Для реализации и ревью — high; боевая модель —
|
пользователя — из конфига не наследовать, при расхождении с правилом —
|
||||||
**`gpt-5.5`** (решение пользователя 2026-07-10). Модель из конфига НЕ
|
спроси пользователя. Боевая модель — **`gpt-5.6-sol`** (решение
|
||||||
наследовать: «сверить с конфигом» ≠ «взять из конфига» — туда утекают
|
пользователя 2026-07-12), она хороша и для анализа/ревью, не только для
|
||||||
фронтирные модели интерактивных сессий (gpt-5.6-sol — фронтир уровня
|
кода. Эффорт по сложности: `high` — реализация, ревью, диагноз; `medium`
|
||||||
Fable, лимиты дорогие; казус — прогон тикета 02, 2026-07-10). Конфиг
|
— механика и **узкие починки по готовому диагнозу** (resume-триаж, где
|
||||||
разошёлся с правилом — спроси пользователя. Оверрайды проверены под
|
рецепт уже расписан); `xhigh` — не дефолтить: расход удваивается, а
|
||||||
`--strict-config`.
|
выигрыш мал — только по явному запросу пользователя. Оверрайды проверены
|
||||||
|
под `--strict-config`.
|
||||||
- **Запуск — собственным фоновым Bash оркестратора** (`run_in_background`):
|
- **Запуск — собственным фоновым Bash оркестратора** (`run_in_background`):
|
||||||
фоновый процесс детачится, живёт сквозь ходы и будит оркестратора по
|
фоновый процесс детачится, живёт сквозь ходы и будит оркестратора по
|
||||||
выходу. Потолок 10 минут — только у фронтграундного Bash; фоновому таймаут
|
выходу. Потолок 10 минут — только у фронтграундного Bash; фоновому таймаут
|
||||||
не нужен, `timeout NNN` вокруг codex не ставь.
|
не нужен, `timeout NNN` вокруг codex не ставь. **`&` внутрь команды не
|
||||||
|
добавляй** — фон даёт харнесс; с `&` уведомление придёт от обёртки при
|
||||||
|
живом codex (эмпирика 2026-07-12). Спасение осиротевшего процесса:
|
||||||
|
ожидатель `while kill -0 <pid>; do sleep 10; done` под
|
||||||
|
`run_in_background` будит по его реальному выходу.
|
||||||
- **thread_id — в первой строке stdout-JSONL** (`{"type":"thread.started",...}`).
|
- **thread_id — в первой строке stdout-JSONL** (`{"type":"thread.started",...}`).
|
||||||
Забирай сразу после старта: это страховка — если процесс умер или его
|
Забирай сразу после старта: это страховка — если процесс умер или его
|
||||||
прибил хост, тред жив: `codex exec resume <id> «дай финальный отчёт»`.
|
прибил хост, тред жив: `codex exec resume <id> «дай финальный отчёт»`.
|
||||||
@@ -55,11 +62,11 @@
|
|||||||
а `pwd` в sandbox — нет. Обход без sudo `use_legacy_landlock=true` чинит
|
а `pwd` в sandbox — нет. Обход без sudo `use_legacy_landlock=true` чинит
|
||||||
только read-only (write-режим с ним паникует); полный фикс — AppArmor-
|
только read-only (write-режим с ним паникует); полный фикс — AppArmor-
|
||||||
профиль. Диагностика и рецепты —
|
профиль. Диагностика и рецепты —
|
||||||
[codex-sandbox-fix-handover-2026-07-10.md](codex-sandbox-fix-handover-2026-07-10.md).
|
[codex-sandbox-apparmor.md](codex-sandbox-apparmor.md).
|
||||||
Фикс целиком под sudo — сам не применяй: дай пользователю готовые команды
|
Фикс целиком под sudo — сам не применяй: дай пользователю готовые команды
|
||||||
из handover-файла (`!`-префикс в чат), после применения профиля напомни
|
из файла рецептов (`!`-префикс в чат), после применения профиля напомни
|
||||||
убрать `use_legacy_landlock`. Перед первым прогоном конвейера на новой
|
убрать `use_legacy_landlock`. Перед первым прогоном конвейера на новой
|
||||||
Linux-машине прогони диагностику из handover-файла превентивно.
|
Linux-машине прогони диагностику из файла рецептов превентивно.
|
||||||
- **Блок классификатора — решение пользователя.** Если запуск не прошёл
|
- **Блок классификатора — решение пользователя.** Если запуск не прошёл
|
||||||
permission-гейт, дай пользователю готовую команду с префиксом `!` в чат
|
permission-гейт, дай пользователю готовую команду с префиксом `!` в чат
|
||||||
или попроси сменить режим разрешений. Сработавший путь — прямой exec;
|
или попроси сменить режим разрешений. Сработавший путь — прямой exec;
|
||||||
@@ -68,12 +75,12 @@
|
|||||||
## Ветка «исполнитель» (пишет код)
|
## Ветка «исполнитель» (пишет код)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cat "$SCRATCH/task-prompt.md" | codex exec --json --strict-config \
|
cat "$D/task-prompt.md" | codex exec --json --strict-config \
|
||||||
-s workspace-write -m gpt-5.5 \
|
-s workspace-write -m gpt-5.6-sol \
|
||||||
-c 'model_reasoning_effort="high"' \
|
-c 'model_reasoning_effort="high"' \
|
||||||
-c 'approval_policy="on-request"' -c 'approvals_reviewer="auto_review"' \
|
-c 'approval_policy="on-request"' -c 'approvals_reviewer="auto_review"' \
|
||||||
-o "$SCRATCH/task-result.md" - \
|
-o "$D/task-result.md" - \
|
||||||
> "$SCRATCH/task-stdout.jsonl" 2> "$SCRATCH/task-stderr.txt"
|
> "$D/task-stdout.jsonl" 2> "$D/task-stderr.txt"
|
||||||
```
|
```
|
||||||
|
|
||||||
- `--strict-config` — обязателен: опечатка в `-c`-ключе упадёт громко, а не
|
- `--strict-config` — обязателен: опечатка в `-c`-ключе упадёт громко, а не
|
||||||
@@ -92,27 +99,25 @@ cat "$SCRATCH/task-prompt.md" | codex exec --json --strict-config \
|
|||||||
Тот же вызов, что у исполнителя — запись + авто-аппрув, — но **свежим
|
Тот же вызов, что у исполнителя — запись + авто-аппрув, — но **свежим
|
||||||
тредом**, не тем, что писал код. Read-only-песочницей ревьюера не режь: она
|
тредом**, не тем, что писал код. Read-only-песочницей ревьюера не режь: она
|
||||||
отнимает у него руки — тесты, проверку гипотез, поиск, документацию,
|
отнимает у него руки — тесты, проверку гипотез, поиск, документацию,
|
||||||
первоисточники. Защита — мандат в промпте: «исходники и окружение не менять,
|
первоисточники. Защита — мандат в промпте, готовым файлом
|
||||||
правок не вносить — только находки»; Codex держит его надёжно (практика
|
[prompts/review-boilerplate.md](prompts/review-boilerplate.md) (сборка —
|
||||||
пользователя, 2026-07-10). Дешёвая подстраховка: `git status --porcelain`
|
[prompt-templates.md](prompt-templates.md)); Codex держит его надёжно
|
||||||
до ревью и сверка после — дерево должно остаться нетронутым. Кавеат: сеть
|
(практика пользователя, 2026-07-10). Дешёвая подстраховка:
|
||||||
под workspace-write по умолчанию закрыта; что поиск/документация проходят
|
`git status --porcelain` до ревью и сверка после — дерево должно остаться
|
||||||
эскалацией через авто-аппрув — рабочая гипотеза, боем не обкатана
|
нетронутым. Кавеат: сеть под workspace-write по умолчанию закрыта; что
|
||||||
(см. handoff 2026-07-10).
|
поиск/документация проходят эскалацией через авто-аппрув — рабочая
|
||||||
|
гипотеза, боем не обкатана (см.
|
||||||
|
[../handoffs/20260710-codex-revyuer-write-i-sliyanie-handoffov.md](../handoffs/20260710-codex-revyuer-write-i-sliyanie-handoffov.md)).
|
||||||
|
|
||||||
В промпте — формат «только индекс находок» (SEVERITY, файл:строка, суть,
|
|
||||||
как проверить), явная строка VERDICT и поощрение безопасных эмпирических
|
|
||||||
проверок вне репо (воспроизвести краевой случай, свериться с
|
|
||||||
первоисточником) — вердикт заметно твёрже (эмпирика 2026-07-09).
|
|
||||||
`-o`-файл вердикта — и есть обменный артефакт: на триаже он уходит в
|
`-o`-файл вердикта — и есть обменный артефакт: на триаже он уходит в
|
||||||
fix-промпт конкатенацией, читай его один раз для синтеза и не пересказывай.
|
fix-промпт конкатенацией, читай его один раз для синтеза и не пересказывай.
|
||||||
|
|
||||||
## Ветка «триаж/починка» (тем же тредом, что писал код)
|
## Ветка «триаж/починка» (тем же тредом, что писал код)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cat "$SCRATCH/fix-prompt.md" | codex exec resume --json <thread-id> \
|
cat "$D/fix-prompt.md" | codex exec resume --json <thread-id> \
|
||||||
-o "$SCRATCH/fix-result.md" - \
|
-o "$D/fix-result.md" - \
|
||||||
> "$SCRATCH/fix-stdout.jsonl" 2> "$SCRATCH/fix-stderr.txt"
|
> "$D/fix-stdout.jsonl" 2> "$D/fix-stderr.txt"
|
||||||
```
|
```
|
||||||
|
|
||||||
- `resume` не принимает `-s`/`-C` — песочница и CWD наследуются от исходного
|
- `resume` не принимает `-s`/`-C` — песочница и CWD наследуются от исходного
|
||||||
@@ -133,8 +138,9 @@ cat "$SCRATCH/fix-prompt.md" | codex exec resume --json <thread-id> \
|
|||||||
ожиданием: команда запускается его собственным фоновым Bash, а ждёт он
|
ожиданием: команда запускается его собственным фоновым Bash, а ждёт он
|
||||||
процессом-ожидателем (`until grep -q '<маркер>' лог; do sleep 30; done` под
|
процессом-ожидателем (`until grep -q '<маркер>' лог; do sleep 30; done` под
|
||||||
`run_in_background`) — харнесс переинвоцирует его по выходу процесса.
|
`run_in_background`) — харнесс переинвоцирует его по выходу процесса.
|
||||||
«Жду уведомления» без отслеживаемого процесса не будит никогда
|
«Жду уведомления» без отслеживаемого процесса не будит никогда, а голый
|
||||||
(эмпирика 2026-07-07).
|
поллер вне `run_in_background` умирает при смене хода (эмпирика
|
||||||
|
2026-07-07) — живучесть даёт именно фоновый запуск.
|
||||||
|
|
||||||
Companion-плагин (`codex-companion.mjs` в кэше плагинов) — только для
|
Companion-плагин (`codex-companion.mjs` в кэше плагинов) — только для
|
||||||
ручного интерактива (`status`, `result <job-id>`); конвейер ходит прямым
|
ручного интерактива (`status`, `result <job-id>`); конвейер ходит прямым
|
||||||
|
|||||||
+3
-8
@@ -1,6 +1,7 @@
|
|||||||
# Handover: починка sandbox Codex CLI на Ubuntu 24.04 (2026-07-10)
|
# Sandbox Codex на Linux: диагностика и починка (bwrap/AppArmor)
|
||||||
|
|
||||||
Для агента, дорабатывающего скилл работы с Codex. Самодостаточно: диагностика и фикс воспроизводимы без контекста исходной сессии.
|
Справочник: симптомы, корень и рецепты фикса поломки песочницы Codex CLI
|
||||||
|
на Linux с AppArmor (эмпирика Ubuntu 24.04, 2026-07-10). Самодостаточен.
|
||||||
|
|
||||||
## Симптом
|
## Симптом
|
||||||
|
|
||||||
@@ -109,12 +110,6 @@ bwrap --ro-bind / / --unshare-net --dev /dev --proc /proc true && echo BWRAP_OK
|
|||||||
sudo dmesg | grep -iE 'apparmor.*(userns|bwrap)' | tail # AUDIT/DENIED — подтверждение
|
sudo dmesg | grep -iE 'apparmor.*(userns|bwrap)' | tail # AUDIT/DENIED — подтверждение
|
||||||
```
|
```
|
||||||
|
|
||||||
## Что стоит внести в скилл
|
|
||||||
|
|
||||||
1. Ловушка: с включённым `use_legacy_landlock` `--write`-задачи паникуют — либо профиль AppArmor и убрать флаг, либо жить в read-only.
|
|
||||||
2. web_search Codex работает даже при мёртвом shell-sandbox — «гуглит, но не может выполнить `ls`» — характерная сигнатура именно этой поломки.
|
|
||||||
3. Поломка прилетает молча с обновлением npm-пакета codex — при странных отказах первым делом `codex --version` и дата установки.
|
|
||||||
|
|
||||||
## Связанные записи
|
## Связанные записи
|
||||||
|
|
||||||
Принесено 2026-07-10 из ветки `codex-sandbox-fix-20260710` (исходная машина —
|
Принесено 2026-07-10 из ветки `codex-sandbox-fix-20260710` (исходная машина —
|
||||||
@@ -6,228 +6,108 @@
|
|||||||
поглощён SKILL.md или references, сжимай его запись здесь до строки-факта
|
поглощён SKILL.md или references, сжимай его запись здесь до строки-факта
|
||||||
(дата, что случилось, куда поглощено) — иначе файл растёт бесконечно.
|
(дата, что случилось, куда поглощено) — иначе файл растёт бесконечно.
|
||||||
|
|
||||||
## 2026-07-06 — t2-ml-forecast, задача 05 «полировка витрины под демо»
|
## 2026-07-06 — t2-ml-forecast, задача 05 (первый прогон; дистиллировано 2026-07-12)
|
||||||
|
|
||||||
Первый прогон конвейера. Задача: ~200 строк правок в ядре отчёта + ноутбук.
|
- Свежий взгляд на постановку окупился: блокер name_ru (в данных — английский),
|
||||||
|
две «одностроки» с проектными решениями, дыра регенерации `.ipynb`.
|
||||||
|
Поглощено: SKILL.md этап 2.
|
||||||
|
- Казус форвардера: субагент, получив постановку вместо команды, реализовал
|
||||||
|
задачу сам (+1227 строк). Поглощено: SKILL.md этап 3, codex-exec (раннер).
|
||||||
|
- Слепое двойное ревью: пересечение находок — ноль; Клод подтвердил математику
|
||||||
|
и артефакты, Codex нашёл две дыры в тестах. Поглощено: SKILL.md (роли).
|
||||||
|
- Смерть фонового ревьюера без доставленного отчёта; транскрипт не спас.
|
||||||
|
Поглощено: SKILL.md этап 4 (вердикт — файлом, сообщение — указателем).
|
||||||
|
- Цифры: ревью постановки ~60k токенов; конвейер ~3 часа, реализация ~20 мин.
|
||||||
|
|
||||||
**Свежий взгляд на постановку (Клод, adversarial-reviewer) — окупился:**
|
## 2026-07-07 — наглядность витрины (полный конвейер; дистиллировано 2026-07-12)
|
||||||
- блокер: постановка требовала «русские названия из `report.name_ru`», а в
|
|
||||||
данных `name_ru` — английские имена из Excel-книги; исполнитель молча
|
|
||||||
сделал бы английские заголовки. Решение внесено в задачу: словарь
|
|
||||||
«статья → русское имя» как явная поставка;
|
|
||||||
- две «одностроки», прятавшие проектные решения: поворот отрицательного ряда
|
|
||||||
(правило, пересчёт коридора, единый хелпер) и согласованность
|
|
||||||
«график по модулю vs таблица со знаком»;
|
|
||||||
- процессная дыра: без явных двух шагов регенерации `.ipynb` остался бы без
|
|
||||||
выводов, и тест ноутбука его бы завернул.
|
|
||||||
|
|
||||||
**Казус форвардера:** субагент `codex:codex-rescue`, получив постановку
|
- Idle-уведомление ≠ отчёт; голый поллер вне run_in_background умирает при
|
||||||
вместо команды, реализовал задачу сам (+1227 строк). Настоящий Codex стартовал
|
смене хода; статус job — не истина (зомби «running» после смерти воркера:
|
||||||
на уже изменённом дереве — столкновения избежали везением (форвардер успел
|
истина — mtime артефакта + лог + pgrep). Поглощено: SKILL.md
|
||||||
закончить). Урок в SKILL.md и codex-exec.md (раздел про раннера).
|
(«Пользователь в петле»), codex-exec (фоновый запуск, раннер).
|
||||||
|
- Безадресный resume подхватывает чужой тред. Поглощено: codex-exec.
|
||||||
|
- Доводы отклонений — в файл задачи (свежий тред продолжает без контекста
|
||||||
|
предшественника). Поглощено: prompts/triage-header.md.
|
||||||
|
- Не поглощено (держать в уме при постановке): правила задачи ранжировать
|
||||||
|
явно («правило A главнее буквы E») — внутренние противоречия всплывают
|
||||||
|
после починки.
|
||||||
|
- Цифры: реализация 18 мин; триаж ~8 мин; тесты 147 -> 154.
|
||||||
|
|
||||||
**Слепое двойное ревью — родословные поймали разное:**
|
## 2026-07-09 — local-transcriber, SendTo (первый под Windows; дистиллировано 2026-07-12)
|
||||||
- Клод (Опус): APPROVE; подтвердил математику поворота/коридора
|
|
||||||
(алгебраическое тождество), краевые случаи (ряд через ноль, нули),
|
|
||||||
неизменность метрик и таблиц; посмотрел картинки из `.ipynb`; один nit.
|
|
||||||
- Codex (свежий тред): needs-attention; две дыры в тестах — раздел ноутбука
|
|
||||||
не закреплён в required_snippets, нет регрессионного теста «таблица
|
|
||||||
отрицательного ряда остаётся со знаком». Оба — про то, что зелёный прогон
|
|
||||||
не докажет готовность; Клод этих дыр не нашёл.
|
|
||||||
- Пересечения находок — ноль. Слепота и разность родословных работают.
|
|
||||||
|
|
||||||
**Точечная починка:** Codex `--fresh` с промптом «добавь только два теста,
|
- Git Bash-стек работает целиком; классификатор режет companion `--write`,
|
||||||
продуктовый код не трогай» — чисто, 148 → 150 passed.
|
прямой `codex exec` проходит. Поглощено: codex-exec.
|
||||||
|
- Свежий взгляд: 2 major (OEM-кодировка `.cmd` на кириллическом профиле,
|
||||||
|
протухание пути venv) + load-bearing порядок проверок. Поглощено: этап 2.
|
||||||
|
- Отписка: вердикт одной строкой, проверка по JSONL подтвердила работу.
|
||||||
|
Поглощено: SKILL.md этап 4, codex-exec.
|
||||||
|
- Эмпирический ревьюер (воспроизведение краевых случаев вне репо) — вердикт
|
||||||
|
твёрже. Поглощено: SKILL.md этап 4, boilerplate шаблонов.
|
||||||
|
- Цифры: ревью постановки ~57k, кода ~48k, перепроверка ~45k токенов.
|
||||||
|
|
||||||
**Цифры для калибровки:** ревью Клода на Фабуле (этап постановки) — ~60k
|
## 2026-07-10 — четыре записи (дистиллировано 2026-07-12)
|
||||||
токенов; конвейер целиком — ~3 часа настенного времени, из них реализация
|
|
||||||
~20 минут; остальное — ревью и оркестрация. На мелочь такое не разворачивать.
|
|
||||||
|
|
||||||
**Смерть ревьюера (тот же день, ревью самого скилла по /claude-team-review):**
|
- Ревьюер Codex без read-only: мандат промптом надёжен, песочница не режется.
|
||||||
Опус-ревьюер дважды ушёл в idle без доставленного отчёта (одно напоминание
|
Поглощено: codex-exec (ветка ревьюера).
|
||||||
по idle-гарду — снова тишина), пользователь подтвердил: субагент исчез из
|
- Sandbox-инцидент CLI 0.144.1 (bwrap+userns vs AppArmor) и ловушка memfd
|
||||||
интерфейса. Спасти отчёт из транскрипта не удалось — jsonl тиммейтов не
|
(профиль на путь bwrap не цепляется — вешать на бинарь codex). Поглощено:
|
||||||
нашлись в каталоге проекта. Урок: отчёт фонового ревьюера — скоропортящийся;
|
codex-exec + codex-sandbox-apparmor.md.
|
||||||
если он критичен, проси ревьюера сначала писать результат в файл
|
- Постановка через `/to-tickets` ложится в конвейер без трения; двойное
|
||||||
(двухканальный протокол раннера из /adversarial-review), а сообщение слать
|
слепое ревью постановки окупилось (Клод — механика кода, Codex — уровень
|
||||||
как указатель. Ревью скилла не состоялось — отложено до боевого прогона.
|
требований; пересечение 2 из ~15). Поглощено: SKILL.md этапы 1–2.
|
||||||
|
- Ретро расхода контекста (3 цикла): находки проходили через оркестратора
|
||||||
|
до шести раз; review-промпт дублировался; ~7 пустых ходов на idle-пингах.
|
||||||
|
Поглощено: SKILL.md (роль оркестратора: индекс, cat, файлы), шаблоны.
|
||||||
|
|
||||||
## Прогон 2026-07-07: наглядность витрины (боевой, полный конвейер)
|
## Прогон 2026-07-12: clickstream-demo, задача 20 — флаки runtime-гейта
|
||||||
|
|
||||||
Задача: витрина понятна финансисту без голоса (5 блоков, 5 файлов). Конвейер
|
Полный конвейер + три захода стендовой приёмки. Главный урок прогона:
|
||||||
отработал целиком: исследование двумя головами → постановка → свежий взгляд
|
**ревью по чтению кода не заменяет сквозный прогон** — два класса дефектов
|
||||||
(1 блокер + 9 находок, в т.ч. повторно поймана ловушка name_ru) → Codex 18 мин
|
вскрылись только на стенде.
|
||||||
→ два слепых ревью → триаж у исполнителя → две точечные правки → приёмка.
|
|
||||||
Пересечение находок ревьюеров — снова ~ноль (Клод смотрел артефакты глазами и
|
|
||||||
принял; Codex дал 4 «поправить» по букве задачи). Их прямое противоречие
|
|
||||||
(ослаблен ли тест) рассудил исполнитель по контракту — механизм работает.
|
|
||||||
|
|
||||||
**Ожидание фоновых job:**
|
**Что поймал каждый этап:**
|
||||||
- Idle-уведомление субагента ≠ отчёт: почти каждый субагент уходил в idle ДО
|
- Ревью постановки (Opus): настоящий корень — отсутствие SIGTERM-хендлера
|
||||||
доставки отчёта. Лечится немедленным явным «пришли отчёт на main».
|
(python PID 1, SIGKILL после grace); один из двух вариантов фикса в
|
||||||
- Фоновый bash-поллер (`until…sleep`) у раннера умирает при смене хода.
|
постановке гонку не закрывал. Плюс критерий «красный сценарий всё ещё
|
||||||
Надёжно: persistent Monitor без таймаута.
|
ловится» и запрет вероятностных смягчений.
|
||||||
- Статус job — не истина: воркер финальной правки умер после успешных проверок,
|
- Слепые ревью: Codex — grace-период 10с и обходимость precheck (пара из
|
||||||
статус завис «running» навсегда (зомби). Диагностика оркестратором: mtime
|
старой backfill-строки); Клод — подтвердил структурный довод, на узкой
|
||||||
артефакта (showcase-check.ipynb дописан) + лог job (все проверки зелёные) +
|
перепроверке принёс НОВУЮ находку (тест биндил порт 9109 — флаки 1/13).
|
||||||
pgrep (воркера нет) → забрать финал себе, раннера распустить.
|
Пересечение — 2 темы из ~8 (grace, слабый контракт-тест): не «стабильно
|
||||||
|
ноль», но малое; обе родословные оправдались.
|
||||||
|
- Стендовая приёмка (3 захода): (1) гейт годами жил на побочном эффекте
|
||||||
|
бага — пересекающие визиты давала «нелегальная переработка» генератора
|
||||||
|
после игнорируемого SIGTERM; честный фикс оставил проверку без сырья;
|
||||||
|
(2) таймзона: наивные метки STG (UTC) против границы с `+00:00` на
|
||||||
|
сервере Europe/Moscow — precheck был зелёным вакуумно; та же ошибка — в
|
||||||
|
приёмочном скрипте координатора (наивная конвенция DDS). Урок: сравнение
|
||||||
|
времени в SQL — только с явным поясом с обеих сторон.
|
||||||
|
|
||||||
**Codex companion:**
|
**Ретро контекста оркестратора** (главный пожиратель — внеплановые циклы):
|
||||||
- Безадресный `--resume`/resumeLast резолвится в «последний тред сессии» — при
|
диагнозы падений приёмки велись мастером инлайн (~15 вызовов); boilerplate
|
||||||
параллельных тредах подхватывает чужой read-only ревью-тред. С ЯВНЫМ id тред
|
промптов переписывался трижды; обменные файлы шли кириллицей (×1,5–2);
|
||||||
подхватывается свой (сэндбокс привязан к треду: у write-треда останется write) —
|
правки задачи-файла — тремя крупными Edit (old+new = двойной текст);
|
||||||
это же проходили в /adversarial-review. Правило: resume — только по id; если id
|
промпты будильников пересказывали план. Поглощено 2026-07-12: SKILL.md
|
||||||
не сохранился, свежий write-тред дочитает контекст из файла задачи (решения
|
(принцип «мастер решает — субагенты выясняют», стоп-кран «сам — максимум
|
||||||
вписаны туда).
|
один заход», механика — fast-worker'у, обменные файлы на английском,
|
||||||
|
будильник одной строкой, сквозная проверка до ревью, фолбэк ревьюера
|
||||||
|
deep-reasoner — обкатан этим прогоном), prompt-templates + prompts/
|
||||||
|
(готовые boilerplate-файлы, английские скелеты), codex-exec (модель
|
||||||
|
gpt-5.6-sol, medium для узких починок, ловушка `&`). Слепое Fable-ревью
|
||||||
|
самого скилла (по глоссарию writing-great-skills): восстановление после
|
||||||
|
rm -rf подтверждено без потерь, 9 MINOR + 5 NIT согласованности — все
|
||||||
|
закрыты тем же днём.
|
||||||
|
|
||||||
**Постановка:**
|
**Прочее:** казус двойного фона (`&` при run_in_background) — спасён
|
||||||
- Правила задачи стоит ранжировать явно («правило A главнее буквы E»):
|
ожидателем `kill -0`; принятие остаточного риска (публикация не ограничена
|
||||||
внутреннее противоречие (де-жаргон vs «заголовки не трогать») всплыло только
|
по времени) зафиксировано доводом в задаче — паттерн «риск принят + после
|
||||||
после починки по ревью и потребовало отдельной правки решением оркестратора.
|
фикса такой отказ падает громко и честно» работает как аргумент приёмки.
|
||||||
- Требовать от исполнителя вписывать доводы отклонений в файл задачи — окупилось:
|
Отдельный казус координатора: `rm -rf` «зеркала» скилла прошёл сквозь
|
||||||
свежий write-тред продолжил работу без контекста предшественника.
|
симлинк `~/.claude/skills -> dotfiles` и снёс оригинал; восстановлено из
|
||||||
|
git (`git show HEAD:path`) + повторным наложением правок из контекста.
|
||||||
|
Урок: перед rm — `ls -la` цели и родителя, симлинк-родитель = чужая
|
||||||
|
территория.
|
||||||
|
|
||||||
**Цифры:** реализация 18 мин; триаж-починка ~8 мин; финальная правка ~3 мин
|
**Цифры:** реализация ~25 мин; ревью постановки 75k токенов субагента,
|
||||||
работы + ~20 мин зомби-ожидания. Тесты 147 → 154. Панель конвенций дала демо
|
ревью кода 65k, перепроверка 80k (с новой находкой); приёмка — 4 прогона
|
||||||
аргумент: 10 из 13 против 6 из 13 в зависимости от прочтения порога.
|
гейта по ~1,5 мин + красный сценарий; тесты 190 -> 192 + 21.
|
||||||
|
|
||||||
## Прогон 2026-07-09: local-transcriber, SendTo-меню (первый по тексту скилла; первый под Windows)
|
|
||||||
|
|
||||||
Задача: контекстное меню проводника через SendTo + флаги
|
|
||||||
`--install-menu`/`--uninstall-menu`; 5 файлов, +345 строк, тесты в финале
|
|
||||||
191 passed / 1 skipped. Конвейер целиком, вместе с фичей — один вечер.
|
|
||||||
|
|
||||||
**Первый прогон под Windows:** Git Bash-стек работает целиком — `codex exec`,
|
|
||||||
`jq`, редиректы, heredoc, фоновый Bash с побудкой, SendMessage-rerun.
|
|
||||||
Скретчпад сессии вместо `/tmp`.
|
|
||||||
|
|
||||||
**Классификатор авторежима — новый класс препятствия:** companion с
|
|
||||||
`--write` заблокирован и через раннера-субагента, и напрямую из Bash
|
|
||||||
(«Create Unsafe Agents»); повторная попытка с другим флагом расценена как
|
|
||||||
обход. Прямой `codex exec` фоновым Bash оркестратора прошёл гейт и отработал
|
|
||||||
все три ветки (write-исполнитель, read-only ревьюер, resume-триаж). Правила —
|
|
||||||
в codex-exec.md; companion-обёртка поглощена им же.
|
|
||||||
|
|
||||||
**Свежий взгляд на постановку — снова окупился:** 2 major, которые
|
|
||||||
исполнитель молча реализовал бы: `.cmd` с путём, писанный «как ASCII», ломался
|
|
||||||
бы на кириллическом профиле (cmd.exe читает батники в OEM-кодировке) — при
|
|
||||||
том что фича делалась именно «для коллег»; плюс протухание зашитого пути к
|
|
||||||
venv. Третья находка — load-bearing порядок проверок (exit 2 требует
|
|
||||||
валидации до `expand_globs`, иначе чужой except даст exit 1). Одна находка
|
|
||||||
отклонена письменно (проброс `%errorlevel%` — нет потребителя).
|
|
||||||
|
|
||||||
**Слепое двойное ревью:** Codex — APPROVED, 0 находок; Опус — APPROVED,
|
|
||||||
3 minor (0-байтный leftover при `UnicodeEncodeError` — воспроизвёл на
|
|
||||||
машине; OEM-запись ни разу не исполняется в тестах; LF vs CRLF). Пересечение
|
|
||||||
снова ~ноль, но с нюансом: Codex в промежуточных сообщениях *колебался*
|
|
||||||
ровно над местом находки №2 Опуса и не оформил её — колебания в логе стоят
|
|
||||||
чтения при синтезе.
|
|
||||||
|
|
||||||
**Отписка:** вердикт Codex пришёл одной строкой без находок. Проверка по
|
|
||||||
JSONL (19 command_execution: полный pytest, узкий прогон, usage) подтвердила
|
|
||||||
работу. Приём «вердикт без находок — проверь лог» вписан в SKILL.md
|
|
||||||
(этап 4) и codex-exec.md.
|
|
||||||
|
|
||||||
**Закрыты давние пункты «не проверено боем» (записка 2026-07-06, ныне
|
|
||||||
поглощена):** фолбэк-ревьюер
|
|
||||||
general-purpose на Опусе — обкатан дважды (постановка и код), работает;
|
|
||||||
триаж исполнителем — `codex exec resume` по явному id закрыл 3/3 находки,
|
|
||||||
лишнего не тронул; узкий rerun ревьюера — SendMessage поднял того же
|
|
||||||
Опус-агента из транскрипта, RECHECK OK за ~38 сек.
|
|
||||||
|
|
||||||
**Эмпирический ревьюер:** Опус сам воспроизводил краевые случаи вне репо
|
|
||||||
(UnicodeEncodeError с обрезкой файла, LF-`.cmd` через `cmd /c`) — вердикт
|
|
||||||
заметно твёрже. Приём поощрять в промпте ревьюера («безопасные
|
|
||||||
эмпирические проверки вне репо разрешены»).
|
|
||||||
|
|
||||||
**Цифры:** ревью постановки ~57k токенов, ревью кода ~48k, перепроверка
|
|
||||||
~45k (тот же агент из транскрипта); триаж-раунд Codex — одна resume-команда.
|
|
||||||
|
|
||||||
## 2026-07-10 — правка по практике пользователя: Codex-ревьюер без read-only
|
|
||||||
|
|
||||||
Ветка «ревьюер» в codex-exec.md была записана как `-s read-only` — по
|
|
||||||
осторожности, не по эмпирике. Пользователь поправил: read-only-конфайн
|
|
||||||
обедняет ревью — с записью и авто-аппрувом ревьюер гоняет тесты, проверяет
|
|
||||||
гипотезы, гуглит, читает документацию и первоисточники. Инструкцию
|
|
||||||
«исходники/окружение не менять» Codex держит надёжно (многократная практика
|
|
||||||
пользователя). Итог: обе ветки (исполнитель и ревьюер) ходят одним вызовом,
|
|
||||||
различие — мандат промптом; подстраховка — сверка `git status --porcelain`
|
|
||||||
до/после ревью. Непроверенное — в handoff 2026-07-10 (сеть под
|
|
||||||
workspace-write-песочницей для поиска).
|
|
||||||
|
|
||||||
## 2026-07-10 — Linux: sandbox-инцидент Codex CLI 0.144.1 (другая сессия, Ubuntu 24.04)
|
|
||||||
|
|
||||||
Обновление npm-пакета codex молча сломало песочницу: backend сменился на
|
|
||||||
bwrap+userns, AppArmor Ubuntu 24.04 блокирует его до запуска команд.
|
|
||||||
Характерная сигнатура: «гуглит, но не может выполнить `ls`» (web_search
|
|
||||||
исполняется вне sandbox). Обход без sudo — `use_legacy_landlock=true`
|
|
||||||
(только read-only, write паникует); полный фикс — AppArmor-профиль
|
|
||||||
`codex-bwrap` (на той машине не применён, write ждёт sudo). При странных
|
|
||||||
отказах Codex первым делом — `codex --version` и дата обновления.
|
|
||||||
Подробности — references/codex-sandbox-fix-handover-2026-07-10.md
|
|
||||||
(принесено из ветки `codex-sandbox-fix-20260710`).
|
|
||||||
|
|
||||||
## Прогон 2026-07-10: mws-data-test-t2-presale, постановка FTP/CSV DQ (этапы 1–2 без реализации)
|
|
||||||
|
|
||||||
Постановка велась не файлом-задачей, а `/to-tickets` (репозиторий настроен
|
|
||||||
`/setup-matt-pocock-skills`): 5 тикетов-срезов с рёбрами блокировок; связка
|
|
||||||
с конвейером легла без трения — тикет и есть файл-задача этапа 1. Урок
|
|
||||||
поглощён SKILL.md (этап 1).
|
|
||||||
|
|
||||||
**Двойное слепое ревью постановки — впервые, окупилось:** Клод (Опус,
|
|
||||||
9 находок) поймал механику кода — нереализуемый контракт «таблица под именем
|
|
||||||
из `table`» (поле недоступно коннектору в момент создания соединения),
|
|
||||||
мёртвый стаб-ловушку `dataframe`, `load_config` = API-эндпоинт, а не CLI.
|
|
||||||
Codex (8 находок) поймал уровень требований: параметр из спеки, пропавший в
|
|
||||||
тикетах; критерий, который можно закрыть формально; поведение при
|
|
||||||
неподдерживаемом FTP `SIZE`; ненаблюдаемость «понятных ошибок» за общим
|
|
||||||
`SourceQueryException`. Пересечение — 2 темы из ~15 (Django-противоречие в
|
|
||||||
тестах, несамодостаточность smoke). Рамка мандата Codex обязательна:
|
|
||||||
«ревьюируй постановку, не реализацию» — наблюдение пользователя: без неё
|
|
||||||
зарывается в детали. Урок поглощён SKILL.md (этап 2).
|
|
||||||
|
|
||||||
**Ретро-оговорка:** Codex-ревью этого прогона шло ещё через companion-канал
|
|
||||||
(обновление скилла с прямым exec приехало позже) — с учётом issue #158
|
|
||||||
чистота родословной второй линии не гарантирована; находки от этого не
|
|
||||||
обесценились, но эмпирику «2 из 15» читать с этой поправкой.
|
|
||||||
|
|
||||||
**Наблюдение пользователя (в память проекта тоже записано):** Codex хорошо
|
|
||||||
ревьюит планы/постановки, не только код — при явной рамке уровня.
|
|
||||||
|
|
||||||
## Прогон 2026-07-10 (позже): AppArmor-фикс — ловушка memfd
|
|
||||||
|
|
||||||
Рецепт «профиль на путь vendored bwrap» из handover-файла оказался
|
|
||||||
недостаточным: Codex ≥0.144 исполняет встроенный bwrap **из memfd**
|
|
||||||
(`bundled_bwrap.rs`, `memfd_create` в бинаре) — путевой attachment не
|
|
||||||
цепляется никогда. Коварство: прямой запуск vendored bwrap с диска под
|
|
||||||
профилем проходит (BWRAP_OK) — ложное подтверждение фикса; истина — в audit:
|
|
||||||
`profile="unconfined" comm="bwrap"` → transition. Рабочий фикс — профиль на
|
|
||||||
**сам бинарь codex**: метка наследуется через memfd-exec, `userns,`
|
|
||||||
срабатывает у ребёнка (стандартный приём Ubuntu для браузеров). Применён и
|
|
||||||
проверен: оба режима работают, изоляция цела. Обновлённый рецепт — в
|
|
||||||
handover-файле.
|
|
||||||
|
|
||||||
## Ретро 2026-07-10: расход контекста оркестратора за 3 цикла (тикеты 01–03)
|
|
||||||
|
|
||||||
Конвейер отработал (3 цикла: реализация → двойное слепое ревью → триаж →
|
|
||||||
узкие перепроверки → коммит; пересечение находок ревьюеров — ноль во всех
|
|
||||||
трёх, подтверждая ценность двух родословных). Главные пожиратели контекста
|
|
||||||
оркестратора, по убыванию:
|
|
||||||
|
|
||||||
1. **Находки ревью проходили через оркестратора до шести раз**: вердикт →
|
|
||||||
Write fix-промпта с находками «дословно» → пересказ резолюций в двух
|
|
||||||
recheck-промптах → SendMessage-эхо (tool result возвращает весь текст
|
|
||||||
сообщения). Лечение — «индекс у оркестратора, нагрузка файлами»:
|
|
||||||
вердикты в файлы, fix-промпт cat'ом, recheck ссылкой на файл отчёта.
|
|
||||||
Внесено в SKILL.md (роль оркестратора, этапы 4–5) и codex-exec.md.
|
|
||||||
2. **Review-промпт уходил полным текстом дважды** (файл для Codex +
|
|
||||||
параметр prompt Клод-субагента, ~80 строк × 2 × 3 тикета). Лечение —
|
|
||||||
один канонический файл, оба читают сами; скелеты — prompt-templates.md.
|
|
||||||
3. **Idle-пинги teammate-ревьюера**: ~7 пустых ходов; вердикт не приходит
|
|
||||||
сам — нужен запрос. Лечение — мандат «финальный акт — SendMessage с
|
|
||||||
коротким вердиктом», idle-пинги игнорировать.
|
|
||||||
4. Сага починки санбокса — разовая, задокументирована отдельно.
|
|
||||||
|
|
||||||
Обменный каталог прогона — временный, с полуслучайным префиксом (скретчпад
|
|
||||||
сессии или mktemp -d): не мусорит в репо и не переживает ребут (решение
|
|
||||||
пользователя).
|
|
||||||
@@ -1,136 +1,143 @@
|
|||||||
# Скелеты промптов конвейера
|
# Сборка промптов конвейера
|
||||||
|
|
||||||
Отработали боевой прогон 2026-07-10 (3 цикла, тикеты FTP/CSV DQ). Правило
|
Постоянные блоки лежат готовыми файлами в
|
||||||
использования: заполни скелет в `$SCRATCH` **один раз за прогон** и дальше
|
[prompts/](prompts/) — их не переписывают, а подшивают `cat`'ом прямо из
|
||||||
не переписывай — на каждую следующую задачу пиши только параметрический
|
каталога скилла, через контекст оркестратора они не проходят вовсе:
|
||||||
блок и собирай финальный промпт конкатенацией. Плейсхолдеры `{{...}}`
|
|
||||||
заполняются значениями задачи; секции, помеченные «адаптируй», меняются
|
|
||||||
по смыслу задачи, остальное — стабильный boilerplate.
|
|
||||||
|
|
||||||
`$SCRATCH` здесь — общий обменный каталог прогона во **временном каталоге
|
- [prompts/review-boilerplate.md](prompts/review-boilerplate.md) — мандат
|
||||||
ОС с полуслучайным префиксом**: скретчпад сессии из системного промпта
|
ревьюера + формат индекса находок (этапы 2 и 4).
|
||||||
(он уже такой) или `mktemp -d` на прогон. Это безопасный вариант
|
- [prompts/triage-header.md](prompts/triage-header.md) — правила триажа
|
||||||
(решение пользователя 2026-07-10): не мусорит в репо, не сталкивается с
|
для исполнителя (этап 5).
|
||||||
параллельными прогонами и не переживает ребут машины — устаревшие обменные
|
- [prompts/recheck-header.md](prompts/recheck-header.md) — узкая
|
||||||
файлы не накапливаются. Windows-кавеат из codex-exec.md в силе: путь —
|
перепроверка (этап 5); может принести новую находку — это не нарушение
|
||||||
forward-slash, не голый `/tmp` Git Bash.
|
узости, отправь её исполнителю тем же порядком.
|
||||||
|
|
||||||
|
Правила:
|
||||||
|
|
||||||
|
- **Обменные файлы — на английском** (правило 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)
|
## 1. Задача исполнителю (`codex exec`, workspace-write)
|
||||||
|
|
||||||
```markdown
|
Сохрани как `$D/task-prompt.md` — под этим именем его ждут примеры
|
||||||
# Задача: {{тикет/цель одной строкой}}
|
codex-exec.md.
|
||||||
|
|
||||||
Рабочий каталог — корень репозитория {{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 и путь
|
|
||||||
к файлу».
|
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
# Ревью кода: {{тикет NN — суть}}
|
# Task: {{ticket/goal in one line}}
|
||||||
|
|
||||||
Ты — независимый адверсарный ревьюер. Рабочий каталог — корень
|
Working directory: repo root {{repo}}. Branch {{branch}} — stay on it.
|
||||||
репозитория {{repo}}, ветка {{branch}}.
|
|
||||||
|
|
||||||
## Мандат (жёсткий)
|
## 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.
|
||||||
- Никаких `git add`/`git commit`/`git checkout`.
|
|
||||||
- Итог — только индекс находок и строка VERDICT, без пересказа кода и
|
|
||||||
нарратива; куда его положить — сказано в вызове.
|
|
||||||
|
|
||||||
## Что ревьюишь
|
## Read first (mandatory, before any code)
|
||||||
{{задача-файл + спека; что уже закоммичено и не ревьюится}}
|
{{numbered list: task file, spec, code samples, conventions}}
|
||||||
Изменения (незакоммичены, смотри рабочее дерево): {{список файлов}}
|
|
||||||
Команда тестов (ожидается {{N}} passed): {{команда}}
|
|
||||||
|
|
||||||
## Фокус
|
## Order and discipline
|
||||||
{{адаптируй: 3–4 пункта под задачу — математика/краевые, соответствие
|
{{adapt: TDD, layer order, test command}}
|
||||||
критериям, честность тестов, общий код/регрессии}}
|
|
||||||
|
|
||||||
## Формат файла находок — только индекс
|
## End-to-end check <-- опционально: только если в репо есть дешёвый сквозной прогон
|
||||||
SEVERITY(BLOCKER|MAJOR|MINOR|NIT) | файл:строка | суть одной фразой | как проверить/воспроизвести
|
Run {{command}} before finishing. If it is unavailable in your sandbox
|
||||||
В конце — отдельная строка: VERDICT: APPROVED | APPROVED_WITH_MINORS | CHANGES_REQUIRED
|
(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
|
```markdown
|
||||||
# Триаж находок двух независимых ревью твоей реализации
|
# Code review: {{ticket NN — essence}}
|
||||||
|
|
||||||
Ниже — находки двух слепых ревью **дословно**. Закрой перечисленное,
|
You are an independent adversarial reviewer. Working directory: repo root
|
||||||
больше ничего не меняй. По каждой — починка по TDD (сначала тест,
|
{{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}}
|
||||||
```
|
```
|
||||||
|
|
||||||
Замечания оркестратора (опционально, коротко): фактура, которой нет у
|
Вариант для **этапа 2** (ревью постановки, кода изменений ещё нет) — тот же
|
||||||
исполнителя (проверенные тобой данные), решения уровня задачи
|
boilerplate, другой параметрический блок:
|
||||||
(вне скоупа / принять риск), приоритеты.
|
|
||||||
|
|
||||||
## 4. Узкая перепроверка (тем же ревьюером)
|
|
||||||
|
|
||||||
```markdown
|
```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}}.
|
## What you review
|
||||||
Команда тестов (ожидается {{N}} passed): {{команда}}
|
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
|
## Focus
|
||||||
(почему) / REJECTION_VALID / REJECTION_INVALID (почему). Финальная
|
{{adapt: facts vs code, hidden one-liner decisions/forks, acceptance
|
||||||
строка: RECHECK: ALL_CLOSED | ISSUES_REMAIN
|
criteria checkable and gameable?, observability}}
|
||||||
```
|
```
|
||||||
|
|
||||||
Кавеат: проверь, что Codex-ревьюер может читать `$SCRATCH` из своей
|
## 3. Параметрические хвосты триажа и перепроверки
|
||||||
песочницы (temp-каталоги обычно читаемы в workspace-write; в этом прогоне
|
|
||||||
`-o`-файлы под `/tmp` работали). Если нет — резолюции по его находкам
|
`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). Если нет — резолюции по
|
||||||
|
его находкам передай текстом (только его находки, не весь отчёт).
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# Narrow re-check: do the fixes close your findings?
|
||||||
|
|
||||||
|
The implementer has processed the findings of your review. Check ONLY your
|
||||||
|
own findings — no full second pass. Mandate unchanged: modify nothing;
|
||||||
|
reading and running tests are allowed.
|
||||||
|
|
||||||
|
Answer one line per your finding: CLOSED / NOT_CLOSED (why) /
|
||||||
|
REJECTION_VALID / REJECTION_INVALID (why). If you spot a NEW defect while
|
||||||
|
re-checking, report it in the same index format — narrowness limits scope,
|
||||||
|
not honesty. Final line: RECHECK: ALL_CLOSED | ISSUES_REMAIN
|
||||||
|
|
||||||
|
The implementer's report path, test command and expected counters are
|
||||||
|
appended below.
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
## Mandate (strict)
|
||||||
|
|
||||||
|
- Do NOT modify sources or environment. No edits — findings only.
|
||||||
|
- Running tests, verifying hypotheses, reading docs and primary sources —
|
||||||
|
allowed and encouraged; safe empirical checks in temp dirs outside the
|
||||||
|
repo make a verdict much firmer than reading alone.
|
||||||
|
- No `git add` / `git commit` / `git checkout`.
|
||||||
|
- Output only the findings index and the VERDICT line — no code retelling,
|
||||||
|
no narrative. Where to put it: your call wrapper says, or it is your
|
||||||
|
`-o` report if you were invoked via stdin.
|
||||||
|
|
||||||
|
## Findings file format — index only
|
||||||
|
|
||||||
|
SEVERITY(BLOCKER|MAJOR|MINOR|NIT) | file:line (or spec/task-file section) | one-phrase essence | how to verify/reproduce
|
||||||
|
|
||||||
|
Confirmations of correctness — one line per item, no elaboration.
|
||||||
|
Final line: VERDICT: APPROVED | APPROVED_WITH_MINORS | CHANGES_REQUIRED
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Triage of findings from independent blind reviews of your implementation
|
||||||
|
|
||||||
|
Below are the findings of the blind reviews, **verbatim**. Close what is
|
||||||
|
listed, change nothing else. For each finding, either:
|
||||||
|
|
||||||
|
- a TDD fix — first a test reproducing the finding, then the fix; or
|
||||||
|
- a reasoned rejection via contract/spec and test — a bare "not important"
|
||||||
|
is not accepted.
|
||||||
|
|
||||||
|
No commits. Record rejection arguments in the task file so a fresh thread
|
||||||
|
can continue without this thread's context.
|
||||||
|
|
||||||
|
Final report: one line per finding — fixed (how) / rejected (argument +
|
||||||
|
where recorded); test command, run counters, list of changed files.
|
||||||
|
|
||||||
|
Orchestrator notes, if present below, carry task-level decisions (out of
|
||||||
|
scope / risk accepted) and verified facts you don't have — they are not
|
||||||
|
findings to fix.
|
||||||
Reference in new issue
Block a user