| name | codex-claude-debate |
| description | Столкнуть Claude Code и Codex — две модели разных провайдеров — в споре по одной теме, до согласованного решения или эскалации человеку. Use when the user wants a second opinion from a different provider, a cross-model debate, or to stress-test a design decision against an independent model. Not for solo ideation. |
Спор Codex и Claude
Один агент, обсуждающий сам с собой, сходится к своей же первой мысли.
Этот скилл ставит рядом двух агентов разных провайдеров, заставляет их
возражать друг другу и требует на выходе одно согласованное решение —
либо честное признание, что решения нет, и тогда вопрос уходит человеку.
debate.sh "тема" [--rounds N] [--repo DIR] [--board PATH] [--timeout SEC]
[--model-a M] [--model-b M] [--synth a|b|none] [--continue]
Скрипт лежит рядом. Запускай через Bash.
Что нужно знать до запуска
Межпровайдерной сессии не существует. Истории живут врозь и в
несовместимых форматах — ~/.claude/projects/ против ~/.codex/sessions/ —
и ни один CLI не читает историю другого. Никакой «ссылкой на сессию»
обменяться нельзя.
Поэтому общая память здесь ровно одна — доска: markdown-файл, который оба
участника читают целиком каждый ход. Доску ведёт скрипт, а не агенты: они
возвращают текст на stdout, скрипт его подшивает. Ход одного физически не может
затереть ход другого, а прогон переживает падение любого участника.
Оба участника ограничены чтением, но по-разному. codex заперт в
--sandbox read-only — это гарантия ядра. У claude одного --allowedTools
недостаточно: он разрешает, но ничего не запрещает, и Bash без денилиста
доступен и выполняется. Поэтому у A стоит ещё
--disallowedTools "Bash,Edit,Write,NotebookEdit,Task,WebFetch,WebSearch".
Если правишь эту строку — помни, что снятие денилиста возвращает A право
выполнять произвольные команды.
Протокол
| |
|---|
| раунд 1 | вслепую, оба параллельно — не видят друг друга |
| раунд 2+ | по очереди: A, затем B на свежем возражении A |
| конец хода | строка ВЕРДИКТ: СОГЛАСЕН или ВЕРДИКТ: СПОР — <что не решено> |
| оба согласны | секция Решение — что делаем, почему, когда неверно |
| раунды кончились | секция Эскалация — развилка и вопрос человеку |
Первый раунд вслепую — не украшение. Покажи второму участнику ответ первого,
и он заякорится: на выходе получится одна идея в двух формулировках вместо
двух идей. Дальше очередь уже нужна — иначе участники отвечают на прошлый
раунд, а не друг другу.
Каждый ход после первого обязан начинаться с возражения. Обе модели по
умолчанию вежливые и сходятся к согласию за два хода; промпт этому
сопротивляется явно, и СОГЛАСЕН разрешено ставить только если участник
может сформулировать решение одной фразой и оно совпадает с оппонентовым.
Согласие засчитывается только по явной последней строке. Прозаическое
«в целом ты прав» спор не закрывает. Якорь стоит на начале строки намеренно:
пропущенное согласие стоит одного лишнего раунда и видно, а ложное дало бы
поддельное «Решение» молча. Вторая страховка — сам автор решения обязан
написать СОГЛАСИЕ ЛОЖНОЕ, если, перечитав доску, решения там не увидит.
Эскалация
Если за --rounds раундов оба ни разу не сошлись в одном раунде, скрипт
пишет секцию Эскалация и завершается с кодом 2 — чтобы «договорились»
и «не смогли» различались без чтения доски.
Секция эскалации написана не как пересказ спора, а как заготовка решения:
что уже решено и не обсуждается, в чём именно развилка и цена ошибки в каждую
сторону, какой факт или замер закрыл бы вопрос, и один-два вопроса человеку,
на которые можно ответить словом.
Коды возврата: 0 — согласовано (или --synth none), 1 — сбой прогона,
2 — эскалация.
Логи и наблюдение
Ход появляется на доске целиком и только когда завершился, а это минуты.
Следить имеет смысл за доской:
tail -f thoughts/debate-2026-08-04-tema.md
Смотреть, «как модель думает», нельзя — и это свойство инструментов, а не
недоделка. У claude рассуждение приходит зашифрованным: события thinking
несут пустой текст и signature_delta с подписью; за один ход он выдаёт ровно
один текстовый блок — финальный ответ, — а между вызовами инструментов молчит.
У codex настройка model_reasoning_summary принимается, но в вывод exec
ничего не отдаёт; вслух он произносит одну строку преамбулы за ход.
Единственный способ увидеть рассуждение — потребовать его в промпте, чтобы
участники проговаривали ход мысли обычным текстом.
Логи каждого хода лежат в <доска>-log/ и переживают прогон — туда лезть,
когда ход упал или не уложился в таймаут:
Как выбирать параметры
--rounds. По умолчанию 3 — это максимум до эскалации, а не план работ:
сойтись могут и во втором. Доска читается целиком каждым участником каждый ход,
так что стоимость растёт квадратично. Если спор упёрся, но эскалировать рано —
--continue добавит раундов к готовой доске.
--repo. По умолчанию текущий каталог. Оба участника получают его как
рабочий корень и читают из него файлы — тема, привязанная к коду, идёт заметно
лучше абстрактной.
--synth. Кто пишет итог — решение или эскалацию: a (по умолчанию), b
или none. Автор разбирает в том числе собственные ходы, так что перекос
возможен; none не пишет ничего и оставляет доску сырой.
--timeout. Секунд на один ход, по умолчанию 900; 0 снимает лимит.
Зависание — класс отказов, где ненулевого кода не будет никогда: без лимита
wait ждёт повисший CLI вечно. На macOS нет ни timeout, ни gtimeout,
поэтому сторож самодельный; он помечает флаг-файлом, что ход снял именно он,
иначе таймаут был бы неотличим от падения и сообщение врало бы.
Тема решает почти всё
Тема должна быть такой, чтобы по ней можно было разойтись, и такой, чтобы
на неё можно было сойтись. Вопрос без развилки даст формальное согласие в
первом же раунде; вопрос без общего критерия даст гарантированную эскалацию.
Работает — ложная развилка, привязанная к коду: «X или Y, и что остаётся от
каждой схемы, если условие Z не выполнится». Не работает — «как улучшить X»
(оба напишут несопоставимые списки пожеланий) и «хорошая ли идея X»
(сойдутся к «зависит»).
После прогона
Читай доску целиком, а не только итог. Если участники сошлись — самое ценное
обычно в секции «условия, при которых решение неверно». Если эскалировали —
в «что закрыло бы вопрос»: часто там дешёвая проверка, после которой спор
решается сам.
Доска — обычный markdown в репозитории. Если тема того стоит, её место рядом
с остальными заметками; если нет — удали вместе с каталогом логов.