{"slug":"codex-qa","title":"codex-qa","summary":"QA the omo Codex Light edition (lazycodex / packages/omo-codex) itself, in strict isolation so ONLY our plugin is exercised, never the user's real ~/.codex. The first-party method drives the real `codex app-server` against an isolated CODEX_HOME plus a LOCAL mock model (no real A","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-08-23T08:58:11.909386Z","repo":{"url":"https://github.com/code-yeongyu/oh-my-openagent","stars":69391,"forks":5715,"license":null,"updatedAt":"2026-09-24T23:30:44Z"},"bodyHtml":"<hr>\n<h2>name: codex-qa\ndescription: \"QA the omo Codex Light edition (lazycodex / packages/omo-codex) itself, in strict isolation so ONLY our plugin is exercised, never the user's real ~/.codex. The first-party method drives the real <code>codex app-server</code> against an isolated CODEX_HOME plus a LOCAL mock model (no real API call), and proves a plugin hook fired by asserting hook/started + hook/completed notifications. Also: isolated install verification, per-component hook probes, a tmux TUI smoke, and runtime log observation (RUST_LOG / logs SQLite / /debug-config). Ships tested helper scripts each with a --self-test. Use whenever someone changes anything under packages/omo-codex or wants to QA, smoke-test, verify, or debug the Codex plugin, its hooks/components, the installer/config.toml, the app-server flow, or the Codex TUI. Triggers: codex qa, qa codex, codex-qa, test codex plugin, verify codex hook, codex app-server, lazycodex qa, isolated CODEX_HOME, prove codex hook fired, codex tui test.\"</h2>\n<h1>Codex QA</h1>\n<p>QA the omo Codex Light edition (<code>packages/omo-codex/</code>, shipped as lazycodex). We\nexercise OUR plugin in a REAL Codex while touching nothing of the user's setup:\nan isolated <code>CODEX_HOME</code> + a local mock model means no real API call and the real\n<code>~/.codex</code> is never read or written. Each helper script ships a <code>--self-test</code>\nthat asserts its scenario against the live machine, so the scripts are both the\nQA tools and their own regression checks.</p>\n<p>Verified against <code>codex-cli 0.140.0</code> (node, jq, tmux, bun on macOS). Confirm with\n<code>codex --version</code>; check a flag with <code>codex &lt;cmd&gt; --help</code>.</p>\n<h2>Golden rules (read before running anything)</h2>\n<ul>\n<li><strong>QA ONLY our plugin.</strong> Everything that spawns codex uses an isolated\n<code>CODEX_HOME</code> (created by <code>cqa_mk_isolated_home</code>) and a LOCAL mock model\nprovider (<code>cqa_start_mock</code>). Never QA against the real <code>~/.codex</code>, never hit a\nreal model API. The bundled scripts enforce this; if you run codex by hand,\n<code>export CODEX_HOME=\"$(mktemp -d)/codex\"; mkdir -p \"$CODEX_HOME\"</code> FIRST (a set\n<code>CODEX_HOME</code> must already exist or codex hard-errors).</li>\n<li><strong>Prove the real home stayed clean.</strong> Every script shasums\n<code>~/.codex/config.toml</code> before and after and asserts it is unchanged. If you\nscript by hand, do the same.</li>\n<li><strong>The interactive <code>codex</code> is a shell function</strong> that injects <code>--profile quotio</code>.\nBash scripts bypass it and get the real binary; never rely on the interactive\nalias. See <a href=\"references/isolation.md\">references/isolation.md</a>.</li>\n<li><strong>The first-party way to prove a hook fired is the app-server</strong> notification\nstream (<code>hook/started</code> / <code>hook/completed</code>), not log scraping. See\n<a href=\"references/app-server.md\">references/app-server.md</a>.</li>\n<li><strong>The captured JSON / pane IS the evidence</strong> — write it under\n<code>.omo/evidence/&lt;YYYYMMDD&gt;-&lt;slug&gt;/</code> (no evidence file == the QA did not happen).</li>\n</ul>\n<h2>Setup</h2>\n<pre><code>cd &lt;this-skill-dir&gt;                        # .agents/skills/codex-qa\nbash scripts/lib/common.sh --self-check    # confirm deps + isolation harness\n</code></pre>\n<p><strong>Docker is the default QA surface.</strong> Run this QA inside a disposable container\nthat has the latest codex and a copy of your config, with the host <code>~/.codex</code>\nuntouched: <code>script/agent/qa-docker.sh</code> (see <a href=\"references/docker-qa.md\">references/docker-qa.md</a>).\nThe local scripts below are the fallback for when Docker is unavailable or on\nWindows.</p>\n<h2>Router: pick your case</h2>\n<table>\n<thead>\n<tr>\n<th>You need to…</th>\n<th>Run</th>\n<th>Deep dive</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Prove a plugin hook fires in a LIVE Codex turn (first-party)</td>\n<td><code>scripts/app-server-drive.sh --plugin</code></td>\n<td><a href=\"references/app-server.md\">app-server.md</a></td>\n</tr>\n<tr>\n<td>Prove the app-server driver itself works (no plugin, fast)</td>\n<td><code>scripts/app-server-drive.sh --self-test</code></td>\n<td><a href=\"references/app-server.md\">app-server.md</a></td>\n</tr>\n<tr>\n<td>Install the LOCAL build into an isolated home + assert it landed</td>\n<td><code>scripts/install-verify.sh --self-test</code></td>\n<td><a href=\"references/install-verify.md\">install-verify.md</a></td>\n</tr>\n<tr>\n<td>Pin ONE component's hook logic deterministically (no codex)</td>\n<td><code>scripts/hook-unit-probe.sh --self-test</code></td>\n<td><a href=\"references/components-hooks.md\">components-hooks.md</a></td>\n</tr>\n<tr>\n<td>Smoke the real TUI under tmux (boots, renders, survives)</td>\n<td><code>scripts/tui-smoke.sh --self-test</code></td>\n<td><a href=\"references/logging-debug.md\">logging-debug.md</a></td>\n</tr>\n<tr>\n<td>Watch runtime logs while QAing</td>\n<td>(see reference; RUST_LOG / logs DB / <code>/debug-config</code>)</td>\n<td><a href=\"references/logging-debug.md\">logging-debug.md</a></td>\n</tr>\n</tbody>\n</table>\n<h2>Scripts index (each is its own regression test)</h2>\n<table>\n<thead>\n<tr>\n<th>Script</th>\n<th><code>--self-test</code> asserts</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>scripts/lib/common.sh --self-check</code></td>\n<td>deps present; isolated <code>CODEX_HOME</code> is created inside a sandbox and auto-removed on exit; mock model serves the Responses SSE; real <code>~/.codex</code> unchanged</td>\n</tr>\n<tr>\n<td><code>scripts/app-server-drive.sh</code></td>\n<td><code>--self-test</code>: a bare turn completes and the mock assistant text comes back. <code>--plugin</code>: installs local omo, drives a turn, and asserts <code>hook/completed</code> for <code>sessionStart,userPromptSubmit</code></td>\n</tr>\n<tr>\n<td><code>scripts/install-verify.sh</code></td>\n<td>local omo installs into the isolated home; <code>config.toml</code> enables <code>omo@sisyphuslabs</code>; component bins + agent TOMLs linked in the sandbox; real <code>~/.codex</code> unchanged</td>\n</tr>\n<tr>\n<td><code>scripts/hook-unit-probe.sh</code></td>\n<td>the <code>ultrawork</code> component injects <code>&lt;ultrawork-mode&gt;</code> on an <code>ulw</code> UserPromptSubmit (also a manual <code>--component/--event</code> mode)</td>\n</tr>\n<tr>\n<td><code>scripts/tui-smoke.sh</code></td>\n<td>the real codex TUI boots in the isolated home, renders, and survives (no early exit); captures the pane</td>\n</tr>\n</tbody>\n</table>\n<p>To tell a dev dogfood build apart from a published one on a REAL <code>~/.codex</code> (NOT the isolated QA home), the repo ships <code>bun run install:codex-dev</code>, which stamps the plugin version as <code>dev</code> — visible as the <code>(OmO dev)</code> hook-status prefix every turn and as a <code>[DEV]</code> badge in <code>omo get-local-version</code>. Use it to confirm which build is loaded during manual dogfooding; it writes to the real home, so it is NEVER part of the isolated QA flow above.</p>\n<p>When TUI visual QA evidence is needed, follow\n<code>docs/reference/web-terminal-visual-qa.md</code>: render the TUI through the real\nxterm.js web terminal - NEVER the <code>tmux capture-pane</code> frame, which degrades\ncolor and CJK width:</p>\n<pre><code>node script/qa/web-terminal-visual-qa.mjs --title \"Codex TUI QA\" \\\n  --command \"codex\" --input \"{Enter}\" \\\n  --evidence-dir .omo/evidence/&lt;slug&gt;/codex-web-terminal\n</code></pre>\n<p>The helper runs a real pty, renders it in xterm.js under Chrome, and writes\n<code>terminal.txt</code>, <code>terminal-ansi.txt</code>, <code>terminal.png</code> (true color), and\n<code>metadata.json</code> (<code>--from-file &lt;capture.ansi&gt;</code> replays a saved raw stream). Use\nthat artifact set for TUI visual QA; use <code>app-server-drive.sh --plugin</code> for\nassertion-grade hook behavior.</p>\n<h2>Match QA to your change scope</h2>\n<ul>\n<li><strong>Component / hook logic</strong> (<code>packages/omo-codex/plugin/components/*</code>):\n<code>hook-unit-probe.sh</code> for the exact stdout, THEN <code>app-server-drive.sh --plugin</code>\nto prove the live wiring. See <a href=\"references/components-hooks.md\">components-hooks.md</a>.</li>\n<li><strong>Installer / config.toml</strong> (<code>packages/omo-codex/src/install/*</code>):\n<code>install-verify.sh</code>.</li>\n<li><strong>Anything that affects a live session</strong> (hooks, agents, MCP wiring):\n<code>app-server-drive.sh --plugin</code>, and <code>tui-smoke.sh --plugin</code> if the TUI path\nmatters.</li>\n</ul>\n<h2>Capturing evidence</h2>\n<pre><code>ev=\".omo/evidence/$(date +%Y%m%d)-codex-qa-&lt;slug&gt;\"; mkdir -p \"$ev\"\nbash scripts/app-server-drive.sh --plugin &gt; \"$ev/app-server-drive.json\" 2&gt;&amp;1\nbash scripts/install-verify.sh --self-test &gt; \"$ev/install-verify.txt\" 2&gt;&amp;1\n</code></pre>\n<h2>On <code>/debugging</code></h2>\n<p>There is no <code>/debugging</code> command in Codex. To observe a run: the app-server\nnotification stream (above), <code>RUST_LOG=debug</code> on the app-server's stderr, the\nlogs SQLite under <code>$CODEX_HOME</code>, the TUI's <code>/debug-config</code>, and the\n<code>codex debug …</code> subcommands. See <a href=\"references/logging-debug.md\">logging-debug.md</a>.</p>\n","files":[{"path":"references/app-server.md","sizeBytes":3096,"isText":true},{"path":"references/components-hooks.md","sizeBytes":2753,"isText":true},{"path":"references/docker-qa.md","sizeBytes":2612,"isText":true},{"path":"references/install-verify.md","sizeBytes":2660,"isText":true},{"path":"references/isolation.md","sizeBytes":2597,"isText":true},{"path":"references/logging-debug.md","sizeBytes":2710,"isText":true},{"path":"scripts/app-server-drive.sh","sizeBytes":3188,"isText":true},{"path":"scripts/hook-unit-probe.sh","sizeBytes":3044,"isText":true},{"path":"scripts/install-verify.sh","sizeBytes":2535,"isText":true},{"path":"scripts/lib/app-server-client.mjs","sizeBytes":6472,"isText":false},{"path":"scripts/lib/app-server-client.test.js","sizeBytes":1967,"isText":true},{"path":"scripts/lib/common.sh","sizeBytes":7256,"isText":true},{"path":"scripts/lib/mock-model.mjs","sizeBytes":2136,"isText":false},{"path":"scripts/lsp-e2e.sh","sizeBytes":154538,"isText":true},{"path":"scripts/tui-smoke.sh","sizeBytes":2945,"isText":true},{"path":"SKILL.md","sizeBytes":7800,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"notes-only","suspicious":0,"notes":2,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-25T07:37:59.562735Z","sha256":"008A39586BC40E360DD21A814626F0069590A04B23668CBC3A8F3DCF6B3A830D","sizeBytes":59462},"review":null,"source":{"repositoryUrl":"https://github.com/code-yeongyu/oh-my-openagent","path":".agents/skills/codex-qa","license":null,"commit":"05dcba64b749e7666dcd0296c079d31cf3c298f1","subtreeSha":"ED5FFD24AC7DAE656E6902DA1A97EF3B9826720E114EDD38C5AAF64688A551B3","lastSyncedAt":"2026-09-25T07:37:33.26442Z"},"reviewedAt":"2026-09-25T07:38:03.733689Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/code-yeongyu/oh-my-openagent/tree/dev/.agents/skills/codex-qa"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install code-yeongyu-oh-my-openagent@llmmart"},{"target":"git","command":"git clone https://github.com/code-yeongyu/oh-my-openagent.git"}]}