Antithesis Multiverse Debugger Use the skill to interact with the Antithesis multiverse debugger. Every debugging session should use: - a fresh, unique value such as Use so manages shared authentication state automatically, while keeps each debugging run isolated from other concurrent agents. Close the unique live session when debugging is complete. When to use this skill Use this when: - the user gives an Antithesis debugging-session URL - the user makes a request to inspect container filesystem, runtime state, or events inside Antithesis - the triage skill has launched an MVD session when i…

\\t' # real Tab — React hears focusout\n}\n\nSCRIPT='cat /path/to/file 2>&1; stat -c \"%y\" /path/to/file 2>&1'\nfor VT in 125.0 125.7 126.5 127.5 128.0 128.5 129.0 129.5; do\n setMomentReal \"$VT\"\n sleep 2 # let React state settle BEFORE reading count\n COUNT=$(agent-browser --session \"$SESSION\" eval 'window.__antithesisDebug.simplified.getOutputCount()' \\\n | python3 -c 'import sys,json; print(json.load(sys.stdin)[\"count\"])')\n agent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.runCommand($(printf '%s' \"$SCRIPT\" | jq -R -s .))\"\n agent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.waitForNewOutput($COUNT, { timeoutMs: 25000 })\"\n sleep 2 # let the post-output state settle before the next iteration\ndone\n```\n\n**Settle times matter.** Without the `sleep 2` before AND after each\niteration, the loop alternates success/failure on a 2-cycle (every other\niteration fails with `CDP command timed out: Runtime.evaluate` or returns\na null `header`). The fresh-vtime backend compute typically takes 9–10s\ninside the 25s `waitForNewOutput` window; previously-computed vtimes\nreturn in ~2s.\n\nSet the container once via `clickLogRow(N)` on a row from the desired\ncontainer before starting the loop (driving the vtime input does not\nchange the container selector). The first command after a fresh\n`clickLogRow` runs in that container; the `fill`+`Tab`-driven iterations\nthat follow keep the same container.\n\n### Advanced-mode sweep (preferred when you need event sets, branching, or `wait_until`)\n\nFor an absolute vtime, branch from a moment built with `rewind_to`:\n\n```javascript\nsweep_action = new action({\n description: \"sweep\",\n tethered_authorization: true,\n});\n\nfor (vt of [15, 18, 21, 24, 27, 30]) {\n b = moment.rewind_to(vt).branch();\n print(\n bash`date && ps -elf`.run({\n branch: b,\n container: \"CONTAINER\",\n required_by: [sweep_action],\n }),\n );\n}\n```\n\n`tethered_authorization: true` on the parent makes all `required_by`\nchildren run from a single click on the parent's authorize button.\nWithout grouping, only the first child's action_auth cell would render up\nfront.\n\n**`DUPLICATE_ID` from too many sibling branches.** If a tightly-clustered\nsweep produces `CAMPAIGN SAW TERMINAL EVENT: 'FUZZER REJECTED CAMPAIGN ADD\nWITH CODE: DUPLICATE_ID, STATUS: 400'`, the campaign fuzzer is rejecting\nmultiple branches off the same moment. Workarounds: space the rewinds so\neach child uses a slightly different moment, or fold the sweep onto a\nsingle branch with `wait` between commands.\n\nSee `references/advanced-debugger.md` for the full mental model, including\nhow `wait`/`wait_until` advance branches and the rules around terminated\nbranches.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":9113,"content_sha256":"3b3f19e02f4f55e63118fc67c20f686fdb74b2e0aba737f769bc7b0d099b768a"},{"filename":"references/download-log.md","content":"# Downloading the MVD events log\n\nWhen you need the full event log from a Multiverse Debugger session for\nlocal analysis (jq filtering, fault-window inspection, cross-referencing\nwith code), download it via the `assets/download-mvd-log.sh` script. It\ndrives `agent-browser`, captures the page's \"Download as JSON\" / \"Download\nas TXT\" / \"Download as CSV\" output, and (for JSON) post-processes the\nresult through `assets/process-logs.py` to add `vtime_seconds` and\n`active_faults` annotations.\n\n## When to use\n\n- Triaging an MVD session offline — pull the log once, query it\n repeatedly with `jq` rather than re-clicking through the browser.\n- Cross-referencing the MVD log with logs from other tools or with the\n system-under-test source code.\n- Sharing a snapshot of the debugger session's events with a teammate.\n\nFor interactive debugging (running shell commands inside containers,\ninspecting filesystem state, time-traveling), use the simplified or\nnotebook workflows in this skill instead — those don't need the log\ndownload.\n\n## Prerequisites\n\n- `agent-browser` installed and authenticated to the tenant. If you are\n not authenticated, run the interactive login flow first (see the\n `antithesis-agent-browser` skill's auth setup reference).\n- A debugging-session URL (`https://TENANT.antithesis.com/debugging-session/...`).\n\n## Usage\n\n```bash\nassets/download-mvd-log.sh \\\n --url \"$DEBUG_URL\" \\\n -o /tmp/mvd/${SESSION_ID}.json\n```\n\nOptional flags:\n\n- `--format json|txt|csv` (default `json`). Use `txt` for quick eyeballing\n in a pager; `json` for any analysis.\n- `--raw` — write the unmodified JSON array; skip the `process-logs.py`\n annotation. Use this if you want the file in its on-the-wire form\n (no `vtime_seconds`, no `active_faults`). Only meaningful with\n `--format json`.\n\nAlways write to a unique path. Other agents may be running concurrently.\n\n## What the script does\n\n1. Opens the URL with shared `--session-name antithesis` auth.\n2. Verifies the URL is on a `/debugging-session/...` path; bails (exit 2)\n if redirected to a login page.\n3. Injects `assets/antithesis-debug.js`.\n4. Waits for `simplified.waitForReady()` (the top interaction area), then\n polls `simplified.eventsLogReady(format)` until the events log panel\n has rendered. The events panel renders later than the simplified\n view's interaction area, and after page settle two `events.*` download\n anchors exist (one hidden in a notebook overlay, one in the visible\n Debug Timeline panel). The helper picks the visible one.\n5. Calls `simplified.prepareLogDownload(format)` to force the\n `\u003ca-menu>`'s shadow-root menu visible and tag the link.\n6. Captures the click via `agent-browser download`.\n7. For `json` (and not `--raw`): pipes through `assets/process-logs.py`\n → JSON array annotated with `vtime_seconds` and `active_faults`.\n8. For `txt` / `csv` / `--raw`: writes the captured file verbatim.\n\n## Output format\n\n`json` output is a JSON array of events. Each event has at minimum:\n\n```json\n{\n \"moment\": {\n \"_vtime_ticks\": \u003cnumber>,\n \"input_hash\": \u003cstring>,\n \"session_id\": \u003cstring>\n },\n \"source\": {\"name\": \u003cstring>, ...},\n ...\n}\n```\n\nNote the legacy `moment._vtime_ticks` field (integer ticks, 2³² per\nsecond). `process-logs.py` accepts both this and the newer\n`moment.vtime` (string seconds) format. After annotation each event also\ncarries `vtime_seconds` (rounded float, for human-readable jq filters)\nand `active_faults` (snapshot of currently-open fault windows).\n\nFor jq query examples, see the `antithesis-triage` skill's logs reference\n(the same event shape applies).\n\n## Known limitations\n\n- The MVD page lazy-renders the events panel after the simplified view's\n interaction area becomes interactive. The script waits up to 30s for\n the panel; in slow environments it may need more.\n- The downloaded log uses `_vtime_ticks` (legacy SPA format), not the\n API's `vtime` string. To address a moment when calling\n `snouty runs logs` against this log, convert ticks to seconds:\n `vtime_seconds = _vtime_ticks / 4294967296`.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":4070,"content_sha256":"81f588ea23392650452689143485e2c69907ec143cda2f00220b50aa90bf1a82"},{"filename":"references/notebook.md","content":"# Notebook Interaction\n\nThe debugger page is a notebook backed by a live Monaco editor, not a static\nreport. Code changes trigger notebook recalculation.\n\n## Reading the notebook\n\nGet the full editor source:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.notebook.getSource()\"\n```\n\nReturns `{ ok, source, length }`.\n\nGet all rendered cells with their outputs:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.notebook.getCells()\"\n```\n\nEach cell includes `index`, `text`, `hasAction`, `output`, `code`, and\n`visible`.\n\n> **Cell `text` is truncated at 500 chars** by the runtime's `clean()`\n> helper. If a cell's rendered output is long (help text, an event listing,\n> a long file dump), `getCells()` will silently cut it. To read the full\n> content of a specific cell, query the DOM directly:\n>\n> ```bash\n> agent-browser --session \"$SESSION\" eval '(() => {\n> const cells = document.querySelectorAll(\".cell\");\n> return (cells[INDEX].innerText || \"\").trim();\n> })()'\n> ```\n\n## Writing to the notebook\n\nReplace the entire editor source:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.notebook.setSource('print(\\\"hello\\\")')\"\n```\n\nAppend code to the end of the editor:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.notebook.appendSource('\\\\n// new cell\\\\nprint(42)')\"\n```\n\nUnder the hood both `setSource` and `appendSource` call\n`window.editor.setValue(...)`. Monaco recompiles on value change and the\ndebugger's notebook re-evaluates affected cells. **Allow 5–10 seconds for\nnew cells to render** after a large source replacement; small appends\ntypically settle within ~2s.\n\nFor complex multi-line code, use `eval --stdin` or construct the string with a\nhelper to avoid shell quoting issues:\n\n```bash\nagent-browser --session \"$SESSION\" eval '(() => {\n const e = window.editor;\n const src = e.getValue();\n const bt = String.fromCharCode(96);\n const tail =\n \"\\n// inspect\\n\" +\n \"inspect_branch = moment.branch()\\n\" +\n \"print(bash\" + bt + \"pwd && ls -la /\" + bt + \".run({branch: inspect_branch, container: container}))\\n\";\n e.setValue(src + tail);\n return true;\n})()'\n```\n\n## Default notebook model\n\nThe seeded notebook typically contains:\n\n```javascript\n[environment, moment] = prepare_multiverse_debugging()\nprint(environment.events.up_to(moment))\nprint(containers = environment.containers.list({moment}))\nprint(environment.fault_injector.get_settings({moment})?.faults_paused)\ncontainer = containers[0]?.name ?? \"foo\"\nbranch = moment.branch()\nprint(bash`echo \"hello\" > /tmp/world && echo done`.run({branch, container}))\n```\n\nImportant:\n- `containers` may be empty at the exact bug `moment` — try `moment.rewind(Time.seconds(1))`\n- The seeded notebook assigns `container = containers[0]?.name` — use that variable in your injected cells\n- Actions (shell commands via `bash\\`...\\``) do not run until explicitly authorized\n- Bare assignments (no `var`/`let`/`const`) create notebook globals accessible across cells\n- Variables declared with `var`/`let`/`const` remain local to their cell\n\n## Checking editor status\n\nOne-shot readiness probe:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.notebook.loadingFinished()\"\n```\n\nDiagnostic status if things look wrong:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.notebook.loadingStatus()\"\n```\n\nLow-level window probes for debugging:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n 'Object.keys(window).filter(k => /editor|notebook/i.test(k))'\n```\n\n## `action()` for batched authorization\n\nWhen you write multiple `bash\\`...\\`.run(...)` calls in the notebook source,\n**only the first action_auth cell appears** until that action completes.\nAdding 5 sequential `print(bash...run(...))` lines does not produce 5\nauth-able cells up front.\n\nTo probe N moments with a single authorization click, create a parent\n`action()` and link each effect to it via `required_by` (the parent runs\nits children when authorized, thanks to `tethered_authorization: true`):\n\n```javascript\nparent = new action({ description: \"sweep\", tethered_authorization: true })\n\nfor (m of [moment, moment.rewind(1.0), moment.rewind(2.0)]) {\n print(bash`cat /path/to/file`.run({\n branch: m.branch(),\n container,\n required_by: [parent],\n }))\n}\n```\n\n> **Do not pass a function to `action()`** — the legacy form\n> `action(() => { ... })` is no longer accepted and prints\n> `⚠ action(...) expects: ✘ props : ✘ Optionally : ...`. The current\n> `action()` takes only an opts object. Do the work in regular cells linked\n> by `required_by`.\n\nAction props you'll use:\n\n- `description: string` — button label.\n- `required_by?: Action[]` — declare this as a child of another action.\n- `tethered_authorization?: boolean` — set on a parent so children fire\n when the parent is authorized.\n\nThe on-page schema lists more props (`display_ui`, `ready`, `when`) used for\nnon-interactive notebook automation; agentic sessions don't need them. Pass\na garbage opts object if you ever need to see the full schema — the\nnotebook will print a `⚠ action(...) expects: ...` warning listing every\nprop.\n\nSee `references/advanced-debugger.md` for the full grouping pattern and\ncommon errors (e.g., `DUPLICATE_ID` from too many sibling branches).\n\n## Troubleshooting: stuck eval after `setSource`\n\nSymptom: after overwriting the seeded notebook source with `setSource(...)`,\nevery cell reports `⚠ReferenceError \u003cname> is not defined!!!` and the error\npersists across page reloads.\n\nEven though `prepare_multiverse_debugging()` directly returned a valid\n`[Environment, Moment]` tuple when assigned to a single variable in the\nsame source, the destructured names (`environment`, `moment`) failed to\nbind.\n\n**Workaround that cleared the stuck state**: replace the destructuring with\nseparate assignments:\n\n```javascript\nnotebook_version(2, true)\n_t = prepare_multiverse_debugging()\nenv = _t[0]\nmom = _t[1]\ncontainer = \"CONTAINER\"\nprint(bash`...`.run({ branch: mom.branch(), container }))\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":6116,"content_sha256":"7ff990bdb2ed104f52380711579cef66140e11e64d38ff9e27b25a0cdb27e36c"},{"filename":"references/setup-session.md","content":"# Setup & Session\n\n## Prerequisites\n\nIf `agent-browser` is not installed you can install it like so:\n\n```\nnpm install -g agent-browser\nagent-browser install\n```\n\nYou should also make sure the `agent-browser` skill is available. If it is not available, install it like so:\n\n```\nnpx skills add vercel-labs/agent-browser\n```\n\n## Launching an MVD session\n\nBefore opening a debugger URL, you may need to launch the session first.\n`snouty debug` is the launch command. The interface is in flux: feature-detect\nby inspecting `snouty debug --help` before deciding which flow to run.\n\n### Step 1: detect the supported parameter\n\n```bash\nsnouty debug --help\n```\n\nLook for `run_id` or `session_id` in the parameter list.\n\n### Step 2a — if `run_id` is supported (preferred path)\n\nLaunch the session directly given the run + moment:\n\n```bash\nsnouty debug \\\n --antithesis.debugging.run_id \"$RUN_ID\" \\\n --antithesis.debugging.input_hash \"$INPUT_HASH\" \\\n --antithesis.debugging.vtime \"$VTIME\" \\\n --antithesis.debugging.description \"$DESCRIPTION\" \\\n --antithesis.report.recipients \"$EMAIL\"\n```\n\nAlways pass a `description`, and make it **unique and findable later**\n(e.g., include the property name, a date stamp, or a ticket id). You'll\nuse this string to locate the session in the list of debugging sessions\nwhen you (or a teammate) want to come back to it.\n\nSnouty returns the debugging-session URL on success; proceed to \"Opening a\ndebugger URL\" below.\n\n### Step 2b — if only `session_id` is supported (current state)\n\n`session_id` and `run_id` are not interchangeable. Until `snouty debug` gains\n`run_id` support, ask the user to:\n\n1. Start the MVD session manually from the triage report (or however they\n normally launch).\n2. Paste the resulting debugging-session URL back to you.\n\nThen proceed with \"Opening a debugger URL\" using that URL. This is a temporary\nfallback; once snouty supports `run_id`, this step goes away.\n\n## Session naming\n\nUse a fresh, unique browser session for each debugging run so concurrent agents\ndo not collide:\n\n```\nSESSION=\"antithesis-debug-$(date +%s)-$\"\n```\n\nAlways pair with `--session-name antithesis` so `agent-browser` manages shared\nauthentication state automatically.\n\nReplace `$SESSION` in all commands below.\n\n## Opening a debugger URL\n\nOpen the provided URL:\n\n```bash\nagent-browser --session \"$SESSION\" --session-name antithesis open \"$URL\"\nagent-browser --session \"$SESSION\" wait --load networkidle\n```\n\nThen verify auth deterministically by checking the URL the browser landed on:\n\n```bash\nagent-browser --session \"$SESSION\" get url\n```\n\nIf the URL still starts with `https://$TENANT.antithesis.com/...` you are\nauthenticated and can proceed. If it redirected to `accounts.google.com`\n(or any other login domain), authentication is needed — defer to the\n`antithesis-agent-browser` skill's `references/setup-auth.md` for the\ninteractive login flow. Use the same `--session-name antithesis` so auth\nstate is shared.\n\n> **The `?auth=v2.public...` token in a debugger URL is NOT a session\n> token.** It scopes access to a specific report; a session cookie from a\n> full login is still required. Even a fresh PASETO token in the URL\n> won't bypass the SSO redirect on first contact. Plan to run the\n> interactive login flow once per `--session-name`.\n\n> **Auth domain note:** the `antithesis-agent-browser` `setup-auth.md`\n> directs the user to `https://antithesis.com/login/?redirect=home`. That\n> establishes auth at the central domain; for tenant subdomains\n> (`$TENANT.antithesis.com`) the cookies propagate in the same browser\n> session-name, so after login you can re-open the tenant URL headless.\n\n## Injecting the runtime\n\nAfter the page loads, inject the debugger runtime. This is required for **both**\nsimplified and advanced modes:\n\n```bash\ncat assets/antithesis-debug.js \\\n | agent-browser --session \"$SESSION\" eval --stdin\n```\n\nThis registers methods on `window.__antithesisDebug` with three namespaces:\n`simplified`, `notebook`, and `actions`.\n\nIf `window.__antithesisDebug` is missing after a navigation or page reload,\nreinject `assets/antithesis-debug.js` and retry.\n\n## Detecting and switching modes\n\nThe debugger usually opens in simplified mode, but some tenants may default to\nadvanced mode. After injecting the runtime, check which mode is active:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.getMode()\"\n```\n\nReturns `\"simplified\"` or `\"advanced\"`. To switch:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n 'window.__antithesisDebug.switchMode(\"simplified\")'\n```\n\n## Waiting for readiness\n\nFor simplified mode:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.waitForReady()\"\n```\n\nFor advanced mode (notebook):\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.notebook.waitForReady()\"\n```\n\nBoth wait methods poll for up to 60 seconds and return a result object with\n`ok`, `ready`, `attempts`, and `waitedMs`. On timeout, the result also includes\n`details`.\n\n## Snapshot for orientation\n\nAfter the page is ready, take a snapshot for visual context:\n\n```bash\nagent-browser --session \"$SESSION\" snapshot -i -C\n```\n\n## Cleanup\n\nWhen debugging is complete, or if you abort after opening a browser session,\nclose it explicitly:\n\n```bash\nagent-browser --session \"$SESSION\" close\n```\n\nClosing the live session is safe because the shared Antithesis authentication\nstate is managed separately by `--session-name antithesis`.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":5490,"content_sha256":"f86e1a9332db1364757da004e0c3a9fc2870559a69b44e9d6ebb99876d06d0e4"},{"filename":"references/simplified-debugger.md","content":"# Simplified Debugger\n\nThe simplified debugger provides a direct UI for browsing logs, running bash\ncommands, and extracting files from containers — without the Monaco notebook\neditor.\n\nPrefer this mode for straightforward tasks: running shell commands, reading\nfiles, listing directories, and extracting artifacts. Switch to advanced mode\nonly when you need the full notebook API (branching, event sets, programmatic\ninspection).\n\n**Note:** Different tenants may open the debugger in either simplified or\nadvanced mode by default. After injecting the runtime, check with\n`window.__antithesisDebug.getMode()`. If it returns `\"advanced\"` and you want\nsimplified mode, call `window.__antithesisDebug.switchMode(\"simplified\")`.\n\n## Runtime injection\n\nThe simplified debugger uses the same runtime as advanced mode. Inject it after\nthe page loads:\n\n```bash\ncat assets/antithesis-debug.js \\\n | agent-browser --session \"$SESSION\" eval --stdin\n```\n\nThen check which mode is active and wait for readiness:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.getMode()\"\n```\n\nIf the result is `\"advanced\"`, switch to simplified:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n 'window.__antithesisDebug.switchMode(\"simplified\")'\n```\n\nThen wait for the simplified view to be ready:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.waitForReady()\"\n```\n\n## Layout\n\nThe page has three sections:\n\n1. **Log view** (top) — virtual-scrolling timeline of events from the test run.\n Each row shows a vtime, source process, container name, and log output.\n2. **Command input** (bottom) — moment display, container selector, bash text\n area, and Send button.\n3. **Output area** (middle, appears after sending) — results of commands and\n file extractions stack up between the log view and the input area.\n\n## Selecting a moment\n\nClick any row in the log view to set the debugger's moment and container.\n\nThe moment is a point in virtual time during the Antithesis test run. When you\nclick a log line:\n\n- The vtime input updates to that row's virtual time.\n- The container selector updates to the container that emitted that log line.\n\n### Setting vtime programmatically\n\nTo anchor the debugger at an arbitrary vtime (e.g. for a time-travel sweep\nbetween two moments), you have two options:\n\n1. **`clickLogRow(N)` on a row from the desired moment.** Simple when the\n target moment has a visible log row — clicking it sets both the\n moment and the container. The committed moment used by `runCommand`\n updates immediately. (Note the displayed input value lags by one\n click; trust `waitForNewOutput`'s `header` instead of `getMoment`.)\n2. **Real keyboard input on the vtime input field.** Required when the\n target vtime has no visible log row. The runtime does NOT expose a\n `setMoment(vt)` helper for this — the page's vtime input commits via\n React's `focusout` handler, which only fires on *trusted* (real)\n events. Synthetic blur from in-page JS doesn't trigger the commit, so\n any in-page setter would update the display without changing the\n committed moment. Drive real key events from agent-browser:\n\n ```bash\n # One-time: find the vtime input ref\n agent-browser --session \"$SESSION\" snapshot -i -s \"#ceres-time-input\"\n # => textbox [ref=e19]: ...\n\n agent-browser --session \"$SESSION\" click @e19\n agent-browser --session \"$SESSION\" fill @e19 \"$VT\"\n agent-browser --session \"$SESSION\" keyboard type

Antithesis Multiverse Debugger Use the skill to interact with the Antithesis multiverse debugger. Every debugging session should use: - a fresh, unique value such as Use so manages shared authentication state automatically, while keeps each debugging run isolated from other concurrent agents. Close the unique live session when debugging is complete. When to use this skill Use this when: - the user gives an Antithesis debugging-session URL - the user makes a request to inspect container filesystem, runtime state, or events inside Antithesis - the triage skill has launched an MVD session when i…

\\t' # real Tab fires the focusout that commits the value\n sleep 2 # let React state settle before runCommand\n ```\n\n **Pitfall: vtime input briefly `[disabled]` after page load.** Even after\n `simplified.waitForReady()` returns `ready: true`, the input can render as\n `textbox [disabled, ref=eNN]` for a second or two. `fill` against a\n disabled input silently fails (`getMoment()` then returns `vtime: \"\"`).\n Re-snapshot after a short sleep; once the snapshot shows the textbox\n without the `[disabled]` marker, the `fill`+Tab sequence will commit.\n\n In a sweep, also add a `sleep 2` *after* each `waitForNewOutput`.\n Without this inter-iteration spacing, the loop alternates\n success/failure on a 2-cycle (every other iteration times out with\n `CDP command timed out: Runtime.evaluate` or returns a null `header`).\n\nWhichever path you use, the authoritative record of what vtime a command\nactually ran at is the `header` field of `waitForNewOutput`'s result —\nthat text is generated by the page from the executed-at vtime, not from\nthe displayed input.\n\n### Reading the current moment and container\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.getMoment()\"\n```\n\nReturns `{ ok, vtime }`. **`getMoment` is unreliable** — it reads\n`input.value` (displayed value), and after a `clickLogRow(...)` it can lag\nthe actually-committed moment by one cycle. Prefer reading the vtime out\nof `waitForNewOutput`'s `header` field once a command has run; that is\nauthoritative.\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.getContainer()\"\n```\n\nReturns `{ ok, container }`. On a fresh page load this can return\n`(host)` even when the anchored log row was emitted by a different\ncontainer. Run a `clickLogRow(...)` on a row from your target container\nbefore issuing the first `runCommand` to set both moment and container\ndeterministically.\n\n### Listing available containers\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.getContainers()\"\n```\n\nReturns `{ ok, containers }` with deduplicated container names from the\ndropdown.\n\n### Browsing log rows\n\nGet visible log rows with their text and position:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.getVisibleLogRows()\"\n```\n\nReturns `{ ok, rows, totalCount }`. Each row has `index`, `text`, and\n`isAnchor` (whether it's the currently selected moment).\n\n> **Important:** `index` is into the currently-rendered DOM items, NOT a\n> stable position in the full log. The virtual scroller mounts only the\n> rows in the visible window. `totalCount` is also the rendered count —\n> the actual total number of log events in the run can be much higher.\n> A row's index can shift when the scroller materializes new items or\n> when new output appends to the bottom (each `runCommand` adds rows).\n> Always pair `getVisibleLogRows` with `clickLogRow` in the same step;\n> don't cache an index for later use.\n\nClick a specific row to set the moment:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.clickLogRow(5)\"\n```\n\n> **`clickLogRow` updates the moment AND the container** based on the\n> row's emitter. Clicking a `[host]`-emitted row (e.g. a `fault_injector`\n> event) pulls the container away from whatever you previously had. If a\n> sweep through rows hops emitters, your commands will execute in\n> different containers across iterations.\n\nThe simplified runtime does NOT expose a `setContainer(name)` helper, but\nyou have two ways to pin one without re-anchoring on a log row:\n\n1. **Click the container dropdown directly via `agent-browser`.** The\n dropdown is a `[role=\"listbox\"]` whose options become snapshotable refs\n after the listbox is opened. This is reliable even when no visible log\n row matches the desired container:\n\n ```bash\n # 1. Find the closed listbox (its current selection is clickable):\n agent-browser --session \"$SESSION\" snapshot -i 2>&1 | grep -A1 '\\[ref='\n # => listbox [ref=e13]\n # generic \"(host)\" [ref=e20] clickable [cursor:pointer, tabindex]\n\n # 2. Click the current-selection chip to open the list:\n agent-browser --session \"$SESSION\" click @e20\n sleep 1\n\n # 3. Re-snapshot the listbox — options now have refs:\n agent-browser --session \"$SESSION\" snapshot -i -s '[role=\"listbox\"]'\n # => option \"(host)\" [ref=e27]\n # option \"fdb-server-1\" [ref=e28]\n # option \"workload-1\" [ref=e30]\n # ...\n\n # 4. Click the option you want:\n agent-browser --session \"$SESSION\" click @e28\n agent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.getContainer()\"\n # => { container: \"fdb-server-1\", ok: true }\n ```\n\n The dropdown lists only containers running at the MVD recreate moment.\n To inspect a container that had already crashed, you must use advanced\n mode (see the main SKILL.md \"when to escalate\" list).\n\n2. **Click a log row from that container** with `clickLogRow(N)`. Simpler\n when a visible row matches, but `clickLogRow` also resets the moment\n to that row's vtime — so do the row click first, then set vtime via\n `fill`+`Tab` (which doesn't touch the container).\n\n## Running a bash command\n\n1. Send a command:\n\n ```bash\n agent-browser --session \"$SESSION\" eval \\\n 'window.__antithesisDebug.simplified.runCommand(\"ls -la /opt/antithesis/\")'\n ```\n\n Returns `{ ok, sent, script, outputCountBefore }`. Save `outputCountBefore`\n for polling.\n\n2. Wait for the result (commands typically take 3–10 seconds):\n\n ```bash\n agent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.waitForNewOutput(COUNT_BEFORE)\"\n ```\n\n Replace `COUNT_BEFORE` with the value from step 1. Returns the output with\n `{ ok, header, lines, lineCount, downloadLink, attempts, waitedMs }`.\n\n Pass options for a different timeout:\n\n ```bash\n agent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.waitForNewOutput(COUNT_BEFORE, { timeoutMs: 60000 })\"\n ```\n\n3. Or read the latest output directly (non-polling):\n ```bash\n agent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.getLastOutput()\"\n ```\n\n### Command isolation\n\nEach `runCommand` runs in its **own observation branch** — an alternative\nfork of time, independent of every other `runCommand`. Two practical\nconsequences:\n\n1. **No `/tmp` persistence across commands.** If command A writes\n `/tmp/foo` and command B tries to read it, B sees nothing — they ran\n on different branches. **Pack each probe into a single command**:\n write the file, grep it, summarize it, all in one script. If the\n script is large or has nasty quoting, base64-encode it locally and\n send `echo $B64 | base64 -d | bash` (see\n `references/common-inspections.md` → \"Probe with a base64-packaged\n script\").\n2. **No side effects on the main timeline.** Mutations from one\n `runCommand` are not visible to a later `runCommand` or to the\n subsequent timeline you'd see by advancing the recreate moment.\n\n### Pitfall: passing the wrong `countBefore` to `waitForNewOutput`\n\n`runCommand` returns `outputCountBefore` — the count BEFORE the new\ncommand. Pass that exact integer to `waitForNewOutput(countBefore, ...)`.\nPassing a stale value (e.g. always `0`) makes `waitForNewOutput` return\nthe FIRST output it finds past that index, which is almost certainly the\nprevious probe's stale output — `attempts: 1, waitedMs: 0` is the\nfingerprint. Always thread the count through:\n\n```bash\nRESP=$(agent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.runCommand($SCRIPT_JSON)\")\nCOUNT=$(printf '%s' \"$RESP\" | jq -r '.outputCountBefore')\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.waitForNewOutput($COUNT, { timeoutMs: 60000 })\"\n```\n\n## Extracting and downloading a file\n\n1. Send an extraction request:\n\n ```bash\n agent-browser --session \"$SESSION\" eval \\\n 'window.__antithesisDebug.simplified.extractFile(\"/path/to/file\")'\n ```\n\n Returns `{ ok, sent, path, outputCountBefore }`.\n\n2. Wait for the result:\n\n ```bash\n agent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.waitForNewOutput(COUNT_BEFORE)\"\n ```\n\n The output for a file extraction includes a `downloadLink` field with\n `{ text, href }` — the text shows the filename and size, the href is a\n blob URL.\n\n3. Snapshot the output to get a clickable ref for the download link:\n\n ```bash\n agent-browser --session \"$SESSION\" snapshot -i -s \".ceres_output:last-child\"\n ```\n\n This returns a ref like `@e13` for the download link.\n\n4. Download the file using the ref. The path argument to `agent-browser\n download` is a **file path** (not a directory). Pass the full target\n filename:\n\n ```bash\n mkdir -p /tmp/extracted\n agent-browser --session \"$SESSION\" download @REF /tmp/extracted/workload-entrypoint.sh\n ```\n\n Passing a directory path with a trailing slash fails with\n `Failed to rename downloaded file: Is a directory (os error 21)`.\n\n5. Read the downloaded file:\n ```bash\n cat /tmp/extracted/workload-entrypoint.sh\n ```\n\n### Complete example\n\n```bash\n# Extract\nagent-browser --session \"$SESSION\" eval \\\n 'window.__antithesisDebug.simplified.extractFile(\"/opt/antithesis/workload-entrypoint.sh\")'\n# => { ok: true, outputCountBefore: 0, ... }\n\n# Wait for output\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.waitForNewOutput(0)\"\n# => { ok: true, downloadLink: { text: \"Download workload-entrypoint.sh (1278 bytes)\", ... }, ... }\n\n# Get the download link ref\nagent-browser --session \"$SESSION\" snapshot -i -s \".ceres_output:last-child\"\n# => link \"Download workload-entrypoint.sh (1278 bytes)\" [ref=e5]\n\n# Download to a local file path (NOT a directory)\nmkdir -p /tmp/extracted\nagent-browser --session \"$SESSION\" download @e5 /tmp/extracted/workload-entrypoint.sh\n\n# Read the file\ncat /tmp/extracted/workload-entrypoint.sh\n```\n\n## Reading previous outputs\n\nAll command and extraction results stack in the output area.\n\n```bash\n# Count of output sections\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.getOutputCount()\"\n\n# All output headers\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.getOutputHeaders()\"\n\n# Read a specific output by index\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.getOutput(0)\"\n```\n\n## Filtering and searching logs\n\n```bash\n# Filter logs to show only matching rows\nagent-browser --session \"$SESSION\" eval \\\n 'window.__antithesisDebug.simplified.filterLogs(\"error\")'\n\n# Clear the filter\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.clearFilter()\"\n```\n\n> Observed: `filterLogs(...)` does NOT always narrow `getVisibleLogRows()`'s\n> output. The implementation writes via `setNativeValue(...)` only and\n> doesn't dispatch the `input` event React listens for, so the filter\n> sometimes doesn't apply. Treat this method as best-effort; if filtering\n> matters for what you're trying to find, switch to advanced mode and use\n> `environment.events.contains({...}).up_to(branch)` instead.\n\n## Switching to advanced mode\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n 'window.__antithesisDebug.switchMode(\"advanced\")'\n```\n\nAfter switching, follow the `references/notebook.md` and\n`references/actions.md` guides. The notebook API is available at\n`window.__antithesisDebug.notebook` and `window.__antithesisDebug.actions`.\n\nTo return to simplified mode:\n\n```bash\nagent-browser --session \"$SESSION\" eval \\\n 'window.__antithesisDebug.switchMode(\"simplified\")'\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":15367,"content_sha256":"cea723b7f3444a3d21c53378cdcd1097add3612f8a8267f12396f46f47a1e27e"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Antithesis Multiverse Debugger","type":"text"}]},{"type":"paragraph","content":[{"text":"Use the ","type":"text"},{"text":"agent-browser","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill to interact with the Antithesis multiverse debugger.","type":"text"}]},{"type":"paragraph","content":[{"text":"Every debugging session should use:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"a fresh, unique ","type":"text"},{"text":"SESSION","type":"text","marks":[{"type":"code_inline"}]},{"text":" value such as ","type":"text"},{"text":"antithesis-debug-$(date +%s)-$","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"--session-name antithesis","type":"text","marks":[{"type":"code_inline"}]},{"text":" so ","type":"text"},{"text":"agent-browser","type":"text","marks":[{"type":"code_inline"}]},{"text":" manages shared authentication state automatically, while ","type":"text"},{"text":"--session \"$SESSION\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" keeps each debugging run isolated from other concurrent agents. Close the unique live session when debugging is complete.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to use this skill","type":"text"}]},{"type":"paragraph","content":[{"text":"Use this when:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"the user gives an Antithesis debugging-session URL","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"the user makes a request to inspect container filesystem, runtime state, or events inside Antithesis","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"the triage skill has launched an MVD session when investigating the results of a run","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"For auth and report navigation, use the ","type":"text"},{"text":"antithesis-agent-browser","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill. It owns the ","type":"text"},{"text":"agent-browser","type":"text","marks":[{"type":"code_inline"}]},{"text":" session and authentication flow. This skill handles the debugger itself.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Gathering user input","type":"text"}]},{"type":"paragraph","content":[{"text":"Before starting, collect the following from the user:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Debugger URL","type":"text","marks":[{"type":"strong"}]},{"text":" (required) — A debugging-session URL like ","type":"text"},{"text":"https://TENANT.antithesis.com/debugging-session/...","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What to investigate","type":"text","marks":[{"type":"strong"}]},{"text":" — Are we checking filesystem contents? Runtime state? Specific artifacts?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Container name","type":"text","marks":[{"type":"strong"}]},{"text":" (if known) — The name of the container to target. If not provided, the log view or container dropdown will show available containers.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Simplified vs. advanced mode","type":"text"}]},{"type":"paragraph","content":[{"text":"The debugger has two modes. ","type":"text"},{"text":"Prefer simplified mode","type":"text","marks":[{"type":"strong"}]},{"text":" — it is sufficient for most tasks.","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Mode","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Best for","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"How it works","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Simplified","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Running shell commands, reading files, listing directories, extracting artifacts","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Click log lines to set moment/container, type bash commands, press Send","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Advanced","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Programmatic inspection, branching, event sets, custom JavaScript, multi-step notebook workflows","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Monaco editor with JavaScript cells, action authorization, runtime API","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Detecting which mode is active","type":"text"}]},{"type":"paragraph","content":[{"text":"Different tenants may open the debugger in either mode by default. After injecting the runtime (see ","type":"text"},{"text":"references/setup-session.md","type":"text","marks":[{"type":"code_inline"}]},{"text":"), check which mode is active:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"agent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.getMode()\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Returns ","type":"text"},{"text":"\"simplified\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"\"advanced\"","type":"text","marks":[{"type":"code_inline"}]},{"text":". To switch:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"agent-browser --session \"$SESSION\" eval \\\n 'window.__antithesisDebug.switchMode(\"simplified\")'","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"When to escalate to advanced mode","type":"text"}]},{"type":"paragraph","content":[{"text":"Switch to advanced mode only when you need:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A target container that had crashed (or otherwise wasn't running) at the MVD recreate moment.","type":"text","marks":[{"type":"strong"}]},{"text":" The simplified container dropdown only lists containers running at that point. To inspect a container while it was alive, you must time-travel back via ","type":"text"},{"text":"moment.rewind_to(...)","type":"text","marks":[{"type":"code_inline"}]},{"text":" and target it by name via ","type":"text"},{"text":"bash...run({container: \"\u003cname>\"})","type":"text","marks":[{"type":"code_inline"}]},{"text":". This is the one container-targeting case where advanced is strictly required.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Branching (","type":"text"},{"text":"moment.branch()","type":"text","marks":[{"type":"code_inline"}]},{"text":") and advancing time (","type":"text"},{"text":"branch.wait","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"branch.wait_until","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Exploring multiple random histories from the same moment (","type":"text"},{"text":"branch.send_input","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Event set queries (","type":"text"},{"text":"environment.events.up_to(moment)","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":".contains({source})","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Fault injector state inspection or control (","type":"text"},{"text":"environment.fault_injector.pause/unpause","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Background processes and process-exit awaiting (","type":"text"},{"text":"run_in_background","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"p.exits","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Complex multi-cell notebook workflows with grouped authorization","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The full JavaScript notebook API","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"As an escape hatch when something in simplified mode isn't working","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"To switch programmatically, call ","type":"text"},{"text":"window.__antithesisDebug.switchMode(\"advanced\")","type":"text","marks":[{"type":"code_inline"}]},{"text":". This is what ","type":"text"},{"text":"getMode()","type":"text","marks":[{"type":"code_inline"}]},{"text":" reports. ","type":"text"},{"text":"Note:","type":"text","marks":[{"type":"strong"}]},{"text":" there is a separate \"Simple mode\" / \"Advanced mode\" tab strip in the right pane (","type":"text"},{"text":".display_area__tabs","type":"text","marks":[{"type":"code_inline"}]},{"text":") that ","type":"text"},{"text":"switchMode()","type":"text","marks":[{"type":"code_inline"}]},{"text":" does NOT click; the two can disagree. The right-pane tab strip controls the help / pop-out panel content. To read the on-page advanced-mode help (a canonical ~5KB reference for the notebook API), click the \"Advanced mode\" tab in that strip and read ","type":"text"},{"text":"document.querySelector(\".display_area__layout\").innerText","type":"text","marks":[{"type":"code_inline"}]},{"text":". See ","type":"text"},{"text":"references/advanced-debugger.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Reference files","type":"text"}]},{"type":"paragraph","content":[{"text":"Each reference file covers a specific interaction mode or task. Read the relevant file before performing that task.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Simplified mode (default — start here)","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Page","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"When to read","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/setup-session.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Always — read first to set up the browser session","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/simplified-debugger.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Running commands, extracting files, reading logs in simplified mode","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Advanced mode (using a notebook)","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Page","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"When to read","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/setup-session.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Always — read first to set up the browser session","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/advanced-debugger.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Read this BEFORE other advanced refs","type":"text","marks":[{"type":"strong"}]},{"text":" — mental model, mode-switching, authorization, branches, time advancement, fault injector, host commands, common errors","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/notebook.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reading or writing notebook source, injecting cells","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/actions.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Authorizing shell actions, reading action output","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/common-inspections.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Ready-to-use debug cell snippets for common tasks","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Recommended workflows","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Simplified: Run a command in a container","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/setup-session.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — open the debugger URL","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/simplified-debugger.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — click a log line to set the moment and container, enter a bash command, press Send, read the output","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report findings with concrete evidence","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Simplified: Extract a file","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/setup-session.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — open the debugger URL","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/simplified-debugger.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — click a log line, toggle \"Extract file\", enter the file path, press Send","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read the download link from the output","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Advanced: Programmatic investigation","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/setup-session.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — open the debugger URL and inject runtime","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Switch to advanced mode: ","type":"text"},{"text":"window.__antithesisDebug.switchMode(\"advanced\")","type":"text","marks":[{"type":"code_inline"}]},{"text":", then ","type":"text"},{"text":"notebook.waitForReady()","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/advanced-debugger.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — internalize moments, branches, reactive-vs-effectful, action grouping, and common errors","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/notebook.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — mechanics of writing cells","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/common-inspections.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — ready-to-use snippets","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/actions.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — authorizing and reading action results","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report findings with evidence chain","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Download the events log for offline analysis","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/setup-session.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — launch / open the debugger URL","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"references/download-log.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" — run ","type":"text"},{"text":"assets/download-mvd-log.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" to capture and (for JSON) annotate the events log. The annotation step delegates to the triage skill's ","type":"text"},{"text":"process-logs.py","type":"text","marks":[{"type":"code_inline"}]},{"text":"; no debug-skill-local copy.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Analyze the local file with ","type":"text"},{"text":"jq","type":"text","marks":[{"type":"code_inline"}]},{"text":" (event shape matches the triage skill's logs reference)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Runtime injection","type":"text"}]},{"type":"paragraph","content":[{"text":"The JS runtime is required for ","type":"text"},{"text":"both","type":"text","marks":[{"type":"strong"}]},{"text":" simplified and advanced modes. It provides the ","type":"text"},{"text":"window.__antithesisDebug","type":"text","marks":[{"type":"code_inline"}]},{"text":" API with three namespaces: ","type":"text"},{"text":"simplified","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"notebook","type":"text","marks":[{"type":"code_inline"}]},{"text":", and ","type":"text"},{"text":"actions","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"Use the browser-side runtime file:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"assets/antithesis-debug.js","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"Inject it into the current page with:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"cat assets/antithesis-debug.js \\\n | agent-browser --session \"$SESSION\" eval --stdin","type":"text"}]},{"type":"paragraph","content":[{"text":"Injecting the file registers methods on ","type":"text"},{"text":"window.__antithesisDebug","type":"text","marks":[{"type":"code_inline"}]},{"text":". Call those methods with ","type":"text"},{"text":"agent-browser eval","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"Method call examples:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Simplified mode\nagent-browser --session \"$SESSION\" eval \\\n 'window.__antithesisDebug.simplified.runCommand(\"ls -la /\")'\n\n# Advanced mode\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.notebook.getSource()\"","type":"text"}]},{"type":"paragraph","content":[{"text":"agent-browser eval","type":"text","marks":[{"type":"code_inline"}]},{"text":" awaits Promises automatically, so async and sync methods use the same call pattern.","type":"text"}]},{"type":"paragraph","content":[{"text":"If ","type":"text"},{"text":"window.__antithesisDebug","type":"text","marks":[{"type":"code_inline"}]},{"text":" is missing, inject ","type":"text"},{"text":"assets/antithesis-debug.js","type":"text","marks":[{"type":"code_inline"}]},{"text":" and retry the method call.","type":"text"}]},{"type":"paragraph","content":[{"text":"Do not run method calls in parallel with ","type":"text"},{"text":"agent-browser open","type":"text","marks":[{"type":"code_inline"}]},{"text":", navigation, or any other command that can replace the page. Wait until the target page is settled before starting ","type":"text"},{"text":"eval","type":"text","marks":[{"type":"code_inline"}]},{"text":" calls. Run queries sequentially; mutations will interfere with each other if launched in parallel.","type":"text"}]},{"type":"paragraph","content":[{"text":"After every ","type":"text"},{"text":"open","type":"text","marks":[{"type":"code_inline"}]},{"text":" call or any interaction that may navigate or replace the page, first confirm the browser has landed on the debugger page, then inject ","type":"text"},{"text":"assets/antithesis-debug.js","type":"text","marks":[{"type":"code_inline"}]},{"text":" and call the appropriate ","type":"text"},{"text":"waitForReady()","type":"text","marks":[{"type":"code_inline"}]},{"text":" before running other methods.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Page loading checks","type":"text"}]},{"type":"paragraph","content":[{"text":"After navigation, inject the runtime, then call the appropriate ","type":"text"},{"text":"waitForReady","type":"text","marks":[{"type":"code_inline"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Simplified mode\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.waitForReady()\"\n\n# Advanced mode\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.notebook.waitForReady()\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Both poll for up to 60 seconds and return ","type":"text"},{"text":"{ ok, ready, attempts, waitedMs }","type":"text","marks":[{"type":"code_inline"}]},{"text":". On timeout, the result also includes ","type":"text"},{"text":"details","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"One-shot probes:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"agent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.loadingFinished()\"\n\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.notebook.loadingFinished()\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Diagnostics:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"agent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.simplified.loadingStatus()\"\n\nagent-browser --session \"$SESSION\" eval \\\n \"window.__antithesisDebug.notebook.loadingStatus()\"","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"General guidance","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Start in simplified mode.","type":"text","marks":[{"type":"strong"}]},{"text":" The simplified debugger handles most debugging tasks. Only switch to advanced mode when you specifically need the notebook API.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Defer to antithesis-agent-browser for auth.","type":"text","marks":[{"type":"strong"}]},{"text":" If the debugger URL requires authentication, use the ","type":"text"},{"text":"antithesis-agent-browser","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill's ","type":"text"},{"text":"references/setup-auth.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for the interactive login flow. Use the same ","type":"text"},{"text":"--session-name antithesis","type":"text","marks":[{"type":"code_inline"}]},{"text":" so auth state is shared.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use disposable sessions.","type":"text","marks":[{"type":"strong"}]},{"text":" Generate a unique ","type":"text"},{"text":"SESSION","type":"text","marks":[{"type":"code_inline"}]},{"text":" for each debugging run, pair it with the shared ","type":"text"},{"text":"--session-name antithesis","type":"text","marks":[{"type":"code_inline"}]},{"text":", and ","type":"text"},{"text":"agent-browser --session \"$SESSION\" close","type":"text","marks":[{"type":"code_inline"}]},{"text":" when you finish or abort.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run commands sequentially.","type":"text","marks":[{"type":"strong"}]},{"text":" In both modes, wait for each command to complete before sending the next one.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Do not fabricate container names.","type":"text","marks":[{"type":"strong"}]},{"text":" Use the container dropdown (simplified) or ","type":"text"},{"text":"environment.containers.list({moment})","type":"text","marks":[{"type":"code_inline"}]},{"text":" (advanced) to determine valid container names.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Present results clearly.","type":"text","marks":[{"type":"strong"}]},{"text":" When reporting filesystem contents, include the full path and listing. When reporting artifact searches, include what was found and what was not.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Advanced mode only","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Inject the runtime after navigation.","type":"text","marks":[{"type":"strong"}]},{"text":" After every ","type":"text"},{"text":"open","type":"text","marks":[{"type":"code_inline"}]},{"text":" call or page reload, inject ","type":"text"},{"text":"assets/antithesis-debug.js","type":"text","marks":[{"type":"code_inline"}]},{"text":" and call ","type":"text"},{"text":"notebook.waitForReady()","type":"text","marks":[{"type":"code_inline"}]},{"text":" before the next method call.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Retry missing-runtime errors by reinjecting.","type":"text","marks":[{"type":"strong"}]},{"text":" If a command fails because ","type":"text"},{"text":"window.__antithesisDebug","type":"text","marks":[{"type":"code_inline"}]},{"text":" is undefined or missing, inject the runtime and rerun the same method.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Group effects with ","type":"text","marks":[{"type":"strong"}]},{"text":"action()","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" + ","type":"text","marks":[{"type":"strong"}]},{"text":"required_by","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":".","type":"text","marks":[{"type":"strong"}]},{"text":" Don't authorize cells one at a time when a single click can fire a chain — see ","type":"text"},{"text":"references/advanced-debugger.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for the ","type":"text"},{"text":"tethered_authorization","type":"text","marks":[{"type":"code_inline"}]},{"text":" pattern.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Don't edit a command that has already been authorized.","type":"text","marks":[{"type":"strong"}]},{"text":" Make a new branch (and new action) for the new attempt. Editing an authorized cell re-runs it without re-authorization (a known bug).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A nonzero exit code terminates the branch.","type":"text","marks":[{"type":"strong"}]},{"text":" Subsequent commands on the same branch will fail with ","type":"text"},{"text":"CAMPAIGN SAW TERMINAL EVENT","type":"text","marks":[{"type":"code_inline"}]},{"text":". Fork a fresh branch from the same or an earlier moment.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Trust ","type":"text","marks":[{"type":"strong"}]},{"text":"cell.text","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":"/","type":"text","marks":[{"type":"strong"}]},{"text":"innerText","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" over ","type":"text","marks":[{"type":"strong"}]},{"text":"actionCompleted","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":".","type":"text","marks":[{"type":"strong"}]},{"text":" The runtime's completion-detection misses real DONE states; read the cell text directly.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Self-Review","type":"text"}]},{"type":"paragraph","content":[{"text":"Before declaring this skill complete, review your work against the criteria below. This skill's output is conversational (summaries, evidence, analysis), so the review should happen in your current context. Re-read the guidance in this file, then systematically check each item below against the answers and analysis you produced.","type":"text"}]},{"type":"paragraph","content":[{"text":"Review criteria:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Every filesystem listing or artifact search was extracted from actual debugger output, not inferred or assumed","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The evidence chain is clear: which commands were run, what they returned, and what conclusions follow","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The summary distinguishes between what the debugger shows and what you interpret or recommend","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The browser session was closed at the end of the debugging run","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"antithesis-debug","author":"@skillopedia","source":{"stars":63,"repo_name":"antithesis-skills","origin_url":"https://github.com/antithesishq/antithesis-skills/blob/HEAD/antithesis-debug/SKILL.md","repo_owner":"antithesishq","body_sha256":"bda97aa348a64fdd88581998034e640b94511de8957f64b202e9f346403e990c","cluster_key":"0e4090797945c57cd78fe8810953d6e8a0627fc04fa01faffc2174944d6fd4eb","clean_bundle":{"format":"clean-skill-bundle-v1","source":"antithesishq/antithesis-skills/antithesis-debug/SKILL.md","attachments":[{"id":"c783def9-5a79-5bff-bf98-160507f3c4d8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c783def9-5a79-5bff-bf98-160507f3c4d8/attachment.js","path":"assets/antithesis-debug.js","size":30201,"sha256":"09750e2cb12e37a9ca2f3a9b45bee693e752fc35b6540b0356e25edb1ac4f738","contentType":"application/javascript; charset=utf-8"},{"id":"695f3387-74eb-5a69-af14-0fa4f9e1fa42","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/695f3387-74eb-5a69-af14-0fa4f9e1fa42/attachment.sh","path":"assets/download-mvd-log.sh","size":5172,"sha256":"8857e38393484a80e9f740ea9dbb49a156d404247bdf31b1d06129aa86dfcd47","contentType":"application/x-sh; charset=utf-8"},{"id":"30fc82de-d814-5fcd-bef4-851cb6e22204","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/30fc82de-d814-5fcd-bef4-851cb6e22204/attachment.py","path":"assets/process-logs.py","size":47103,"sha256":"44d7676e4caba4f5357b9192b3ade3180d9e43cfc1e1deaccf1e3ce9e41fec2f","contentType":"text/x-python; charset=utf-8"},{"id":"eede415e-f692-5fe1-8b59-15364b89bc0c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/eede415e-f692-5fe1-8b59-15364b89bc0c/attachment.md","path":"references/actions.md","size":5435,"sha256":"ed090ccb10fd94fb6b76c9bfcaae084fd13f5aff3e5ebdf259c05a566f1acea1","contentType":"text/markdown; charset=utf-8"},{"id":"dcd01688-70ee-55ed-8dc8-f7fed5d94125","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/dcd01688-70ee-55ed-8dc8-f7fed5d94125/attachment.md","path":"references/advanced-debugger.md","size":19707,"sha256":"1eec45be42ca11930b0f915e93da514dbd53e912316a6b076f40ae68da574841","contentType":"text/markdown; charset=utf-8"},{"id":"15629b57-5b81-514e-8f0d-8e421cd232ff","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/15629b57-5b81-514e-8f0d-8e421cd232ff/attachment.md","path":"references/common-inspections.md","size":9113,"sha256":"3b3f19e02f4f55e63118fc67c20f686fdb74b2e0aba737f769bc7b0d099b768a","contentType":"text/markdown; charset=utf-8"},{"id":"4b357419-2a52-555a-b629-b93d4241893c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4b357419-2a52-555a-b629-b93d4241893c/attachment.md","path":"references/download-log.md","size":4070,"sha256":"81f588ea23392650452689143485e2c69907ec143cda2f00220b50aa90bf1a82","contentType":"text/markdown; charset=utf-8"},{"id":"2d0d2c80-eafc-5a5b-a841-7b1480650bec","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2d0d2c80-eafc-5a5b-a841-7b1480650bec/attachment.md","path":"references/notebook.md","size":6116,"sha256":"7ff990bdb2ed104f52380711579cef66140e11e64d38ff9e27b25a0cdb27e36c","contentType":"text/markdown; charset=utf-8"},{"id":"0481f6ef-8f97-5343-bc21-9baaaa136389","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0481f6ef-8f97-5343-bc21-9baaaa136389/attachment.md","path":"references/setup-session.md","size":5490,"sha256":"f86e1a9332db1364757da004e0c3a9fc2870559a69b44e9d6ebb99876d06d0e4","contentType":"text/markdown; charset=utf-8"},{"id":"d745fb80-6daa-5bbd-a1e5-874e5fbac6da","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d745fb80-6daa-5bbd-a1e5-874e5fbac6da/attachment.md","path":"references/simplified-debugger.md","size":15367,"sha256":"cea723b7f3444a3d21c53378cdcd1097add3612f8a8267f12396f46f47a1e27e","contentType":"text/markdown; charset=utf-8"}],"bundle_sha256":"e127677b1031805496be7ea5dcb844a25df5ee74ab1a5517f653f4b039fa444c","attachment_count":10,"text_attachments":10,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"antithesis-debug/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"testing-qa","category_label":"Testing"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"testing-qa","metadata":{"version":"2026-05-28 d758c5d"},"import_tag":"clean-skills-v1","description":"Use this skill to interactively debug Antithesis test runs using the multiverse debugger (MVD session). Open a debugging-session URL, inspect container filesystems and runtime state, run shell commands, and extract evidence from inside the Antithesis environment. Supports both the simplified debugger (default) and the advanced notebook mode.\n","compatibility":"Requires agent-browser v0.23.4+ (https://github.com/vercel-labs/agent-browser)."}},"renderedAt":1782979479238}

Antithesis Multiverse Debugger Use the skill to interact with the Antithesis multiverse debugger. Every debugging session should use: - a fresh, unique value such as Use so manages shared authentication state automatically, while keeps each debugging run isolated from other concurrent agents. Close the unique live session when debugging is complete. When to use this skill Use this when: - the user gives an Antithesis debugging-session URL - the user makes a request to inspect container filesystem, runtime state, or events inside Antithesis - the triage skill has launched an MVD session when i…