Delegate
Delegate the next step's execution to Codex live, inside the current Claude session. Produces an approved packet via the shared contract (same helpers /handoff --target=codex uses), then invokes Codex synchronously with codex exec "<target-skill> --execute-approved". Claude stays the orchestrator; Codex executes; Claude resumes once Codex returns.
Unlike /handoff --target=codex (async — user resumes later), /delegate is live cross-CLI transport. The target skill defaults to $exec; other executor skills (e.g. $ship) may be named but $exec is the primary use case.
Mode requirement
/delegate is hybrid-only by design. claude-only has no executor to delegate to; codex-only plans in Codex directly. In either non-hybrid mode, the skill exits non-zero with a mode-mismatch: reason and touches no packet state.
Transport dependency
/delegate requires the codex binary on PATH. If missing (or auth-failed, or the start marker never prints), the skill falls cleanly into the pre-start-failure branch of the fallback matrix — it does not crash, and the packet stays at approved.
Process
Resolve agent mode via ./scripts/agent-mode.sh. If the effective mode is anything other than hybrid, exit non-zero with a mode-mismatch: message naming the resolved mode. Do not touch the packet.
Parse arguments from $ARGUMENTS:
- First positional token (if any) is the target skill; defaults to
$exec.
- Collect repeatable
--allow-dirty <glob> flags (shell-glob semantics, same as scripts/approved-plan.sh check). Note: back-to-back hybrid cycles rewrite the tasks/approved-plan.md mirror on each consume; commit it between cycles, or pass --allow-dirty tasks/approved-plan.md so the next draft tolerates the uncommitted mirror.
--inline-fallback auto-selects inline Claude execution in the pre-start-failure branch without prompting.
Derive phase / step / title from tasks/todo.md, using the same rules as /handoff --target=codex:
- First unchecked
- [ ] under the ### Active Step Plan block.
- Fallback: first unchecked
- [ ] under the current ## Phase N header.
- Parse
Phase N and Step N.X tokens from the surrounding context; the checkbox text (stripped of - [ ] **Step N.X** — ) becomes title.
Produce the approval packet:
./scripts/approved-plan.sh draft --phase "Phase N" --step "Step N.X" --title "<title>" plus any --allow-dirty <glob> flags. Surface the helper's single-line failure reason verbatim if it fails.
- Pretty-print the drafted packet (
jq . .agents/approved-plan.json).
- Ask exactly one concise question: "Approve this packet for Codex execution via /delegate?"
- On yes →
./scripts/approved-plan.sh approve. On no → leave at draft and stop; the user can approve later or discard with ./scripts/approved-plan.sh supersede.
Invoke Codex synchronously:
- Record a start-marker timestamp (ISO-8601 UTC) before the exec call so the fallback matrix can classify outcomes.
- Shell out to
codex exec "<target-skill> --execute-approved". Capture stdout, stderr, and the exit code.
- The Step 4 consumer (
$exec --execute-approved) is what actually runs scripts/approved-plan.sh check && consume inside Codex. /delegate is transport only.
Classify via the safe-fallback matrix — never blind-retry:
Pre-start failure — codex binary not found, auth failure, or the start marker was never printed by Codex before exit:
- Packet stays at
approved (no writer ran).
- Offer two options: (a) run inline in Claude (same session, no CLI boundary), or (b) keep the packet
approved for later manual $exec --execute-approved in Codex.
- If
--inline-fallback was passed, auto-select (a) without prompting.
- Under an
agent-team execution profile, inline fallback is a downgrade requiring explicit interactive confirmation unless --inline-fallback is already on the command line.
Success — Codex exited 0, printed Approved packet consumed: …, and tasks/approved-plan.md reports lifecycle: consumed:
- Step 4's
consume already flipped approved → consumed.
- Read
tasks/approved-plan.md to confirm lifecycle: consumed. If confirmed, report success and hand back to the user.
- If the mirror does not report
consumed, treat as the ambiguous case below.
Ambiguous — non-zero exit, timeout, or crash after the start marker printed (Codex may have started mutating state):
- Call
./scripts/approved-plan.sh mark-uncertain. The packet lifecycle becomes uncertain.
- Prompt the user with three explicit options: inspect repo state manually / discard the packet via
./scripts/approved-plan.sh supersede / continue inline in Claude from the current repo state.
- Never blind-retry
codex exec on the same packet. Re-executing against a packet whose consumer may have partially mutated state risks double-execution.
Report the classified outcome, the final lifecycle, and whatever the user chose from the fallback prompt.
Constraints
- Hybrid-only. Non-hybrid modes exit with
mode-mismatch: before any packet operation.
- Never blind-retry cross-CLI. The invariant. Ambiguous failures always go through
mark-uncertain + explicit user prompt.
- Contract is frozen. Do not edit
docs/operating-modes.md, specs/approved-plan.schema.json, or add new lifecycle states / freshness checks. uncertain is already in the schema enum; Step 6 is just its first writer.
mark-uncertain is only valid from approved. The helper rejects draft, consumed, stale, superseded, and uncertain source states.
codex binary is a transport dependency. Fall cleanly into pre-start-failure if missing; do not crash.
Alignment Page
Follow the shared alignment-page convention via the packaged convention resolver; output path is alignment/delegate-{topic}.html.
Default Shipping Contract
Follow the shared shipping contract convention in CLAUDE.md.
1---2name: delegate3description: Live in-session delegation from Claude to Codex via the approval/delegation packet contract4---56# Delegate78Delegate the next step's execution to Codex **live, inside the current Claude session**. Produces an `approved` packet via the shared contract (same helpers `/handoff --target=codex` uses), then invokes Codex synchronously with `codex exec "<target-skill> --execute-approved"`. Claude stays the orchestrator; Codex executes; Claude resumes once Codex returns.910Unlike `/handoff --target=codex` (async — user resumes later), `/delegate` is live cross-CLI transport. The target skill defaults to `$exec`; other executor skills (e.g. `$ship`) may be named but `$exec` is the primary use case.1112## Mode requirement1314`/delegate` is **`hybrid`-only by design**. `claude-only` has no executor to delegate to; `codex-only` plans in Codex directly. In either non-hybrid mode, the skill exits non-zero with a `mode-mismatch:` reason and touches no packet state.1516## Transport dependency1718`/delegate` requires the `codex` binary on `PATH`. If missing (or auth-failed, or the start marker never prints), the skill falls cleanly into the **pre-start-failure** branch of the fallback matrix — it does not crash, and the packet stays at `approved`.1920## Process21221. **Resolve agent mode** via `./scripts/agent-mode.sh`. If the effective mode is anything other than `hybrid`, exit non-zero with a `mode-mismatch:` message naming the resolved mode. Do not touch the packet.23242. **Parse arguments** from `$ARGUMENTS`:25 - First positional token (if any) is the target skill; defaults to `$exec`.26 - Collect repeatable `--allow-dirty <glob>` flags (shell-glob semantics, same as `scripts/approved-plan.sh check`). Note: back-to-back hybrid cycles rewrite the `tasks/approved-plan.md` mirror on each `consume`; commit it between cycles, or pass `--allow-dirty tasks/approved-plan.md` so the next `draft` tolerates the uncommitted mirror.27 - `--inline-fallback` auto-selects inline Claude execution in the pre-start-failure branch without prompting.28293. **Derive `phase` / `step` / `title` from `tasks/todo.md`**, using the same rules as `/handoff --target=codex`:30 - First unchecked `- [ ]` under the `### Active Step Plan` block.31 - Fallback: first unchecked `- [ ]` under the current `## Phase N` header.32 - Parse `Phase N` and `Step N.X` tokens from the surrounding context; the checkbox text (stripped of `- [ ] **Step N.X** — `) becomes `title`.33344. **Produce the approval packet**:35 1. `./scripts/approved-plan.sh draft --phase "Phase N" --step "Step N.X" --title "<title>"` plus any `--allow-dirty <glob>` flags. Surface the helper's single-line failure reason verbatim if it fails.36 2. Pretty-print the drafted packet (`jq . .agents/approved-plan.json`).37 3. Ask exactly one concise question: *"Approve this packet for Codex execution via /delegate?"*38 4. On yes → `./scripts/approved-plan.sh approve`. On no → leave at `draft` and stop; the user can approve later or discard with `./scripts/approved-plan.sh supersede`.39405. **Invoke Codex synchronously**:41 - Record a start-marker timestamp (ISO-8601 UTC) before the exec call so the fallback matrix can classify outcomes.42 - Shell out to `codex exec "<target-skill> --execute-approved"`. Capture stdout, stderr, and the exit code.43 - The Step 4 consumer (`$exec --execute-approved`) is what actually runs `scripts/approved-plan.sh check && consume` inside Codex. `/delegate` is transport only.44456. **Classify via the safe-fallback matrix — never blind-retry**:4647 - **Pre-start failure** — `codex` binary not found, auth failure, or the start marker was never printed by Codex before exit:48 - Packet stays at `approved` (no writer ran).49 - Offer two options: (a) run inline in Claude (same session, no CLI boundary), or (b) keep the packet `approved` for later manual `$exec --execute-approved` in Codex.50 - If `--inline-fallback` was passed, auto-select (a) without prompting.51 - Under an `agent-team` execution profile, inline fallback is a **downgrade** requiring explicit interactive confirmation unless `--inline-fallback` is already on the command line.5253 - **Success** — Codex exited 0, printed `Approved packet consumed: …`, and `tasks/approved-plan.md` reports `lifecycle: consumed`:54 - Step 4's `consume` already flipped `approved → consumed`.55 - Read `tasks/approved-plan.md` to confirm `lifecycle: consumed`. If confirmed, report success and hand back to the user.56 - If the mirror does not report `consumed`, treat as the ambiguous case below.5758 - **Ambiguous** — non-zero exit, timeout, or crash after the start marker printed (Codex may have started mutating state):59 - Call `./scripts/approved-plan.sh mark-uncertain`. The packet lifecycle becomes `uncertain`.60 - Prompt the user with three explicit options: *inspect repo state manually / discard the packet via `./scripts/approved-plan.sh supersede` / continue inline in Claude from the current repo state*.61 - **Never blind-retry `codex exec` on the same packet.** Re-executing against a packet whose consumer may have partially mutated state risks double-execution.62637. **Report** the classified outcome, the final lifecycle, and whatever the user chose from the fallback prompt.6465## Constraints6667- **Hybrid-only.** Non-hybrid modes exit with `mode-mismatch:` before any packet operation.68- **Never blind-retry cross-CLI.** The invariant. Ambiguous failures always go through `mark-uncertain` + explicit user prompt.69- **Contract is frozen.** Do not edit `docs/operating-modes.md`, `specs/approved-plan.schema.json`, or add new lifecycle states / freshness checks. `uncertain` is already in the schema enum; Step 6 is just its first writer.70- **`mark-uncertain` is only valid from `approved`.** The helper rejects `draft`, `consumed`, `stale`, `superseded`, and `uncertain` source states.71- **`codex` binary is a transport dependency.** Fall cleanly into pre-start-failure if missing; do not crash.7273## Alignment Page7475Follow the shared alignment-page convention via the packaged convention resolver; output path is `alignment/delegate-{topic}.html`.7677## Default Shipping Contract7879Follow the shared shipping contract convention in CLAUDE.md.