---
name: duo
description: Обсуди задачу с Codex. По умолчанию — итеративное ревью плана (до 3 раундов). Аргумент `pair` — параллельный запуск Claude+Codex с синтезом ответов.
user-invocable: true
metadata:
  version: "1.0"
  author: "anton"
  category: "judge"
---

# duo — второе мнение от Codex (для Claude)

## When to use

Независимое второе мнение от Codex CLI — в двух режимах:

- **review** (по умолчанию, без аргумента): итеративная рецензия готового плана/решения. Цикл «ревью → Claude чинит → ре-ревью» до устранения Critical/Important findings или лимита 3 раунда.
- **pair** (с аргументом `pair` первым словом): параллельный запуск Claude+Codex с ОДНОЙ задачей, синтез двух ответов в единый план. Применяется в начале беседы (технический аудит, поиск решения, выбор направления).

При ошибке партнёра в режиме review — fallback на Claude CLI (закрепляется до конца вызова).

**Триггеры:** "duo", "codex", "кодекс", "обсуди с кодекс", "с кодекс", "с кодексом", "обсуди с", "обсуди с клодом", "pair", "параллельно с кодекс", "параллельно запусти", "два мнения".

## Роль

Здесь ты — хост-LLM. `$HOST_LLM = claude`, `$PARTNER_LLM = codex`.

## Детекция режима (точный operational rule)

Применяй к `$ARGUMENTS` (строка после `/duo`):

1. Нормализуй: `trim`, `lowercase`.
2. Regex `^pair([^a-z0-9_]|$)` (whole-word match).
3. Совпало → режим **pair**, тема = всё после первого слова `pair`.
4. Не совпало → режим **review**, тема = весь `$ARGUMENTS`.

Контрпримеры: `pairing design`, `repair flow` — НЕ активируют pair. Если тема начинается со слова «pair» на review — используй явный префикс `/duo review pair programming`.

## Что делать

### 0. Определи `$SKILL_ROOT`

Найди расположение этого SKILL.md → поднимись на 3 уровня (`../../..`) → это `$SKILL_ROOT`. Все пути ниже — относительно `$SKILL_ROOT`.

**Следуй алгоритму** в `$SKILL_ROOT/.agents/skills/duo/REFERENCE.md`:

- режим review — разделы 3 (цикл итераций), 4 (детекция), 5 (статусы), 6 (запись `## Статус ревью` в plan-файл)
- режим pair — разделы 4 (весь раздел включая probe, per-output validation, синтез) и 8 (шаблоны промптов)

Шаблоны промптов в `.agents/skills/duo/prompts/review-round.md`, `.agents/skills/duo/prompts/pair-task.md`, `.agents/skills/duo/prompts/synthesis.md` — читай Read tool'ом и подставляй плейсхолдеры.

## Host-specific — Claude Code

**Запись файлов:** используй Write tool (для новых) или Edit tool (для обновлений). Абсолютные пути из REFERENCE.md (`$SKILL_ROOT/.temp/duo-*`).

**Чтение файлов:** Read tool.

**Определи `$WORKDIR`:**
- В worktree — корень worktree.
- Конкретный проект (eastglass, checker и т.д.) — его директория.
- Инфраструктура, скиллы, агенты, `.claude/` — `$SKILL_ROOT`.
- Неясно — спроси пользователя.

**`$TEMP_ID`** — генерируй через `date +%s` (allowed). НЕ используй `python3 -c 'import time; ...'` — заблокировано хуком `fs-guard.sh`.

**Параллельный запуск в режиме pair** — ДВА Bash tool calls в ОДНОМ assistant message (multiple tool calls). Claude Code runtime параллелит их сам (parallel tool use, см. Anthropic docs). НЕ используй `&` внутри одной Bash-строки — заблокировано bash-rules. НЕ пиши orchestration helper — нарушение плана.

**Capability probe** — см. REFERENCE.md § 4.2. Результат в `.temp/duo-probe-claude-{fingerprint}.json`, TTL 24ч. При `parallel:false` — fallback sequential (два tool calls в разных message подряд).

## Пример команд (абсолютные пути)

Режим review, раунд N:

```
bash $SKILL_ROOT/.agents/scripts/codex-exec.sh $WORKDIR \
     $SKILL_ROOT/.temp/duo-prompt-{TEMP_ID}-r{N}.md \
     $SKILL_ROOT/.temp/duo-output-{TEMP_ID}-r{N}.txt \
     --model gpt-5.5 --timeout 600
```

Режим pair (ДВА вызова в одном message):

```
bash $SKILL_ROOT/.agents/scripts/claude-exec.sh $WORKDIR \
     $SKILL_ROOT/.temp/duo-pair-{TEMP_ID}-task.md \
     $SKILL_ROOT/.temp/duo-pair-{TEMP_ID}-claude.txt --timeout 600
```
```
bash $SKILL_ROOT/.agents/scripts/codex-exec.sh $WORKDIR \
     $SKILL_ROOT/.temp/duo-pair-{TEMP_ID}-task.md \
     $SKILL_ROOT/.temp/duo-pair-{TEMP_ID}-codex.txt --timeout 600
```

## Plan mode compatibility (Claude Code)

Скилл полностью совместим с plan mode — все раунды цикла review и все шаги pair выполняются без ограничений. Механизм:

- Оба wrapper'а (`codex-exec.sh`, `claude-exec.sh`) пишут исключительно в `$SKILL_ROOT/.temp/duo-*` — scratch-зона.
- Wrappers НЕ модифицируют исходный код проекта. Единственный write вне `.temp/` — финальная секция `## Статус ревью` в plan-файл, который явно writable в plan mode.

**Plan mode НЕ блокирует выполнение duo.** Не отказывайся от запуска цикла, не прерывай его между раундами, не подменяй scratch-записи на отказ. Цикл всегда доводится до штатного завершения (APPROVED / LIMIT_REACHED / REVIEW_INTERRUPTED). Аналогично для pair — все шаги выполняются как предписано в REFERENCE.md.

## Discipline в pair-режиме (обязательные правила)

### 1. Scope — только минимальный сбор контекста

В pair-режиме выполняй ТОЛЬКО:
1. Собрать `$USER_REQUEST` (из аргументов или последнего сообщения пользователя).
2. Опционально — `$CONTEXT_ARTIFACTS` (1-3 .md-файла, явно указанных пользователем).
3. Подставить плейсхолдеры в шаблон задачи (пункт 2).
4. Запустить два Bash tool calls в одном assistant message.
5. Прочитать оба output, выполнить per-output валидацию (ОДИН раз после exit code), синтезировать.

**НЕ делай pre-research в host-сессии перед pair:** не читай исходники, не сканируй директории, не выполняй Grep/Glob по коду. Каждый партнёр делает research сам в своей sandbox — дублирование в host'е только создаёт шум.

### 2. Task-файл — строго из canon-шаблона

Шаблон: `$SKILL_ROOT/.agents/skills/duo/prompts/pair-task.md`. Процедура:
1. Read шаблона.
2. Подставь плейсхолдеры (`{USER_REQUEST}`, опц. `{CONTEXT_ARTIFACTS}`).
3. Write подставленной версии в `.temp/duo-pair-{TEMP_ID}-task.md`.

**НЕ пиши свою формулировку задачи inline.** Шаблон содержит обязательные секции (`## Подход`, `## Риски`, `## Краткий план`), без которых per-output валидация даст `MALFORMED` и агрегат скатится в `PAIR_DEGRADED` вместо `PAIR_COMPLETE`.

### 3. Probe — cache-first

См. REFERENCE § 4.2. Сначала Read `.temp/duo-probe-claude-{fingerprint}.json`; если hit и не stale — используй. Иначе — запусти каноничный probe и запиши результат в cache.

Каноничная команда:
```
date +%s
```
(секундная точность; `python3 -c` запрещён хуком `fs-guard.sh`).

### 4. Правила ожидания

- После запуска двух tool calls НЕ интерпретируй промежуточный stdout как результат.
- Per-output валидация выполняется ОДИН раз, ТОЛЬКО после того как оба tool calls вернули exit code.
- Claude Code runtime сам возвращает control когда processes завершились.
- Для точной диагностики падения — читай `${OUTPUT_FILE}.stderr` sidecar.

### 5. Никаких fabrication'ов вне canon

Canon duo НЕ содержит escalate-out-of-sandbox, retry с изменённым sandbox mode, особых обработок для nested codex sessions. Если pair вернул PAIR_FAILED/PAIR_PARTIAL/PAIR_DEGRADED — зафиксируй по REFERENCE § 4.5-4.6 и сообщи пользователю. Workaround'ы не изобретай.

## Канон

Полное описание — в `.agents/skills/duo/REFERENCE.md`. Здесь — только Claude-специфика.
