* 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>
3.6 KiB
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 thecodex:codex-rescuesubagent in the background. - If the request includes
--wait, run thecodex:codex-rescuesubagent in the foreground. - If neither flag is present, default to foreground.
--backgroundand--waitare execution flags for Claude Code. Do not forward them totask, and do not treat them as part of the natural-language task text.--modeland--effortare runtime-selection flags. Preserve them for the forwardedtaskcall, 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, useAskUserQuestionexactly once to ask whether to continue the current Codex thread or start a new one. - The two choices must be:
Continue current Codex threadStart 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
--resumebefore routing to the subagent. - If the user chooses a new thread, add
--freshbefore 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
Bashcall to invokenode "${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
--effortunset 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 togpt-5.3-codex-spark. - Leave
--resumeand--freshin the forwarded request. The subagent handles that routing when it builds thetaskcommand. - 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.