codex-plugin-cc/plugins/codex/commands/rescue.md
Friende bb38412a67
fix: route /codex:rescue through the Agent tool to stop Skill recursion (#234) (#235)
* fix: route /codex:rescue through the Agent tool to stop Skill recursion (#234)

`/codex:rescue` previously combined two things that together caused a hang:

- `context: fork` in the frontmatter, which spawns a `general-purpose`
  subagent for the command body.
- Body prose "Route this request to the `codex:codex-rescue` subagent."
  without naming the transport.

When the main agent called `Skill(codex:rescue)` programmatically, the
fork resolved the ambiguous prose by trying `Skill(codex:codex-rescue)`
(unknown skill) and then falling back to `Skill(codex:rescue)`, which
re-entered this command and hung the session until the user cancelled.
No Codex job was ever created.

Naming the transport as `Agent(codex:codex-rescue)` alone is not enough:
forked general-purpose subagents do not expose the `Agent` tool, so the
forked runner cannot reach the subagent that way either. The minimal fix
is therefore two coordinated changes:

- Drop `context: fork` so the command body runs inline in the calling
  agent's context, where `Agent` is in scope.
- Say explicitly "use the `Agent` tool with `subagent_type:
  "codex:codex-rescue"`", and call out that `Skill(codex:codex-rescue)`
  and `Skill(codex:rescue)` are not valid routing paths. Add `Agent`
  to `allowed-tools` so the call does not prompt for permission.

Everything else in rescue.md (resume-candidate check, flag handling,
background/foreground semantics, operating rules) is unchanged. The
`codex:codex-rescue` subagent itself is unchanged.

Tests pin the new allow-list, the explicit `subagent_type`, the ban on
`Skill(codex:codex-rescue)`, and the absence of `context: fork`. The
existing "run the `codex:codex-rescue` subagent in the background"
assertion continues to hold since that sentence still reads correctly
with the Agent-tool transport.

Fixes openai/codex-plugin-cc#234

* test: match quoted result and cancel command arguments

---------

Co-authored-by: Dominik Kundel <dkundel@openai.com>
2026-04-18 13:38:45 -07:00

3.6 KiB

description argument-hint allowed-tools
Delegate investigation, an explicit fix request, or follow-up rescue work to the Codex rescue subagent [--background|--wait] [--resume|--fresh] [--model <model|spark>] [--effort <none|minimal|low|medium|high|xhigh>] [what Codex should investigate, solve, or continue] Bash(node:*), AskUserQuestion, Agent

Invoke the codex:codex-rescue subagent via the Agent tool (subagent_type: "codex:codex-rescue"), forwarding the raw user request as the prompt. codex:codex-rescue is a subagent, not a skill — do not call Skill(codex:codex-rescue) (no such skill) or Skill(codex:rescue) (that re-enters this command and hangs the session). The command runs inline so the Agent tool stays in scope; forked general-purpose subagents do not expose it. The final user-visible response must be Codex's output verbatim.

Raw user request: $ARGUMENTS

Execution mode:

  • If the request includes --background, run the codex:codex-rescue subagent in the background.
  • If the request includes --wait, run the codex:codex-rescue subagent in the foreground.
  • If neither flag is present, default to foreground.
  • --background and --wait are execution flags for Claude Code. Do not forward them to task, and do not treat them as part of the natural-language task text.
  • --model and --effort are runtime-selection flags. Preserve them for the forwarded task call, but do not treat them as part of the natural-language task text.
  • If the request includes --resume, do not ask whether to continue. The user already chose.
  • If the request includes --fresh, do not ask whether to continue. The user already chose.
  • Otherwise, before starting Codex, check for a resumable rescue thread from this Claude session by running:
node "${CLAUDE_PLUGIN_ROOT}/scripts/codex-companion.mjs" task-resume-candidate --json
  • If that helper reports available: true, use AskUserQuestion exactly once to ask whether to continue the current Codex thread or start a new one.
  • The two choices must be:
    • Continue current Codex thread
    • Start a new Codex thread
  • If the user is clearly giving a follow-up instruction such as "continue", "keep going", "resume", "apply the top fix", or "dig deeper", put Continue current Codex thread (Recommended) first.
  • Otherwise put Start a new Codex thread (Recommended) first.
  • If the user chooses continue, add --resume before routing to the subagent.
  • If the user chooses a new thread, add --fresh before routing to the subagent.
  • If the helper reports available: false, do not ask. Route normally.

Operating rules:

  • The subagent is a thin forwarder only. It should use one Bash call to invoke node "${CLAUDE_PLUGIN_ROOT}/scripts/codex-companion.mjs" task ... and return that command's stdout as-is.
  • Return the Codex companion stdout verbatim to the user.
  • Do not paraphrase, summarize, rewrite, or add commentary before or after it.
  • Do not ask the subagent to inspect files, monitor progress, poll /codex:status, fetch /codex:result, call /codex:cancel, summarize output, or do follow-up work of its own.
  • Leave --effort unset unless the user explicitly asks for a specific reasoning effort.
  • Leave the model unset unless the user explicitly asks for one. If they ask for spark, map it to gpt-5.3-codex-spark.
  • Leave --resume and --fresh in the forwarded request. The subagent handles that routing when it builds the task command.
  • If the helper reports that Codex is missing or unauthenticated, stop and tell the user to run /codex:setup.
  • If the user did not supply a request, ask what Codex should investigate or fix.