← Codex ReplayCONTENT HISTORY

Update to Codex Replay

Snapshot Sep 30, 2026 · 23:01 UTC · version 1.0.128

Collection source: not recorded for this historical snapshot.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "name": "codex-replay",
  "description": "Open an independent Codex Replay controller in the Codex in-app browser, or the system browser when no in-app opening path is available. Use whenever this plugin is invoked or the user asks to browse, configure, run, or review a replay. The browser controller owns the entire workflow; do not conduct it in chat.",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 315
    }
  ],
  "skill_md_contents": "---\nname: codex-replay\ndescription: Open an independent Codex Replay controller in the Codex in-app browser, or the system browser when no in-app opening path is available. Use whenever this plugin is invoked or the user asks to browse, configure, run, or review a replay. The browser controller owns the entire workflow; do not conduct it in chat.\n---\n\n# Codex Replay\n\nResolve the installed plugin root from this skill's location (two directories\nabove the directory containing `SKILL.md`). Before the first observer batch,\nrun this once as its own direct unified-exec call and retain its output as\n`controller_session_id`:\n\n```text\npython3 -c 'import secrets; print(secrets.token_hex(16))'\n```\n\nValidate that the output contains exactly 32 lowercase hexadecimal characters.\nUse that same ID for every observer and for MCP; do not let an observer or the\ncontroller allocate a replacement.\n\nDispatch the following in one parallel batch, each as its own direct unified-exec\ncall. Use `yield_time_ms: 250` for script 1 and `yield_time_ms: 1000` for\nscripts 2 through 4. Also run `command -v codex` in its own call and retain an\nabsolute result for MCP. If parallel calls are unavailable, dispatch sequentially\nwithout waiting for long-lived observers to exit.\n\n```text\npython3 <absolute-plugin-root>/scripts/metrics/1_probe_metrics.py\npython3 <absolute-plugin-root>/scripts/metrics/2_start_controller.py --controller-session-id <controller-session-id>\npython3 <absolute-plugin-root>/scripts/metrics/3_report_start_metrics.py --controller-session-id <controller-session-id>\npython3 <absolute-plugin-root>/scripts/metrics/4_report_final_metrics.py --controller-session-id <controller-session-id>\n```\n\nScript 1 exits. Scripts 2 through 4 are observers; do not wait for them to exit.\n\nDo not combine scripts, use shell backgrounding, retry observers, or set\n`CODEX_PLUGIN_METRICS_OUTPUT` yourself. Each script needs its own host-created\nsidecar. Missing analytics or an observer error never blocks controller launch or\nbrowser use; local writes are not delivery acknowledgments.\n\nAfter the executable lookup finishes, call\n`mcp__codex_replay.open_controller` with the shared `controller_session_id`\nand the absolute `codex_cli_path` when one was found. Use the MCP tool, not a\nshell launcher. If launch fails, report the limitation without inventing a new\nID, changing permissions, or stopping an existing process.\n\nOn success, immediately open the exact plain `launch_url`; do not add tokens.\n`opened: false` means the controller is prepared, not that a browser opened.\nChoose the opening path by available in-app browser capabilities:\n\n1. If native `open_in_codex` is available, immediately call it directly with\n   `{ target: { type: \"browser\", url: launch_url } }`.\n   Do not provide `threadId`; the browser belongs in the invoking Codex task.\n   Prefer this host-aware path because it preserves localhost port forwarding\n   for controllers running in remote SSH workspaces.\n2. Otherwise, if `browser:control-in-app-browser` is listed, read and follow that\n   skill to connect to the invoking task's in-app browser. Use its explicit\n   in-app selector, never a default, URL-selected, Chrome, or extension browser.\n   A listed skill alone is not proof of a usable connection: if its required\n   tool or in-app connection is unavailable before navigation, treat this path\n   as unavailable and continue to step 3. Once connected, open `launch_url`,\n   make the browser visible, and mark the controller tab as a deliverable so\n   it stays open after the turn. Verify that the controller page loaded before\n   reporting success. A missing `open_in_codex` tool does not mean the in-app\n   browser is unavailable.\n3. In both Codex Desktop and Codex CLI, when neither in-app path is available and\n   the user has not explicitly requested the in-app browser, open the system\n   browser with `open \"$launch_url\"` on macOS or `xdg-open \"$launch_url\"` on Linux\n   and verify the command exits successfully.\n\nIf the native call exists but fails, or opening through a connected in-app\nBrowser fails, report that the controller could not be opened and provide the\nclickable link described below; do not fall back to an external browser.\nIf the user explicitly requested an unavailable in-app browser, report that\nlimitation and provide the link without opening a system browser.\n\nA native response with `status: \"queued\"` is a successful handoff, not proof that\nthe browser tab appeared. Do not retry or switch browsers after a queued response.\n\nAfter the browser handoff and observer startup checks, give a brief status and\nalways include a clickable Markdown link labeled `Open Codex Replay`, with the\nexact returned `launch_url` as its target, then stop. Include the link even when\nopening reports success, so the user can recover if the browser does not appear.\nFor a queued handoff, say that the controller is ready, not that the browser\nopened. If the chosen browser cannot be opened, report that the controller could\nnot be opened automatically, provide the same link, and leave the observers\nrunning.\nIf controller preparation failed without returning a `launch_url`, report the\nfailure without inventing a link.\n\nDo not perform Replay workflow steps in chat; the browser controller owns them.\n\nIf the installed MCP tool or required metrics scripts are unavailable, ask the\nuser to start a new task after reinstalling or enabling the plugin.\n"
}

SHA-256: 5def045ca60a65492404558682eb9826d1f14c9daeb0e35e6843479bb3f72805