If you're debugging Antithesis test runs, this skill walks Claude through using the multiverse debugger to inspect container filesystems, run shell commands, and extract evidence from failed test scenarios. It supports both the simplified command interface and the advanced JavaScript notebook mode, with detailed references for switching between them, authorizing actions, and navigating debugging sessions. The skill emphasizes starting with simplified mode for most tasks and only escalating to advanced when you need time travel to inspect crashed containers or complex multi-step workflows. Requires agent-browser to drive the web interface, and includes ready-to-use snippets for common inspection patterns.
npx -y skills add antithesishq/antithesis-skills --skill antithesis-debug --agent claude-codeInstalls into .claude/skills of the current project.
Use the agent-browser skill to interact with the Antithesis multiverse
debugger.
Every debugging session should use:
SESSION value such as antithesis-debug-$(date +%s)-$$Use --session-name antithesis so agent-browser manages shared
authentication state automatically, while --session "$SESSION" keeps each
debugging run isolated from other concurrent agents. Close the unique live
session when debugging is complete.
Use this when:
For auth and report navigation, use the antithesis-agent-browser skill. It
owns the agent-browser session and authentication flow. This skill handles
the debugger itself.
agent-browser is not installed. See https://raw.githubusercontent.com/vercel-labs/agent-browser/refs/heads/main/README.md for installation options.agent-browser is older than version v0.23.4. You can upgrade with agent-browser upgrade.Before starting, collect the following from the user:
https://TENANT.antithesis.com/debugging-session/....The debugger has two modes. Prefer simplified mode — it is sufficient for most tasks.
| Mode | Best for | How it works |
|---|---|---|
| Simplified | Running shell commands, reading files, listing directories, extracting artifacts | Click log lines to set moment/container, type bash commands, press Send |
| Advanced | Programmatic inspection, branching, event sets, custom JavaScript, multi-step notebook workflows | Monaco editor with JavaScript cells, action authorization, runtime API |
Different tenants may open the debugger in either mode by default. After
injecting the runtime (see references/setup-session.md), check which mode is
active:
agent-browser --session "$SESSION" eval \
"window.__antithesisDebug.getMode()"
Returns "simplified" or "advanced". To switch:
agent-browser --session "$SESSION" eval \
'window.__antithesisDebug.switchMode("simplified")'
Switch to advanced mode only when you need:
moment.rewind_to(...) and target it by name via bash...run({container: "<name>"}). This is the one container-targeting case where advanced is strictly required.moment.branch()) and advancing time (branch.wait, branch.wait_until)branch.send_input)environment.events.up_to(moment), .contains({source}))environment.fault_injector.pause/unpause)run_in_background, p.exits)To switch programmatically, call window.__antithesisDebug.switchMode("advanced").
This is what getMode() reports. Note: there is a separate "Simple
mode" / "Advanced mode" tab strip in the right pane (.display_area__tabs)
that switchMode() 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
document.querySelector(".display_area__layout").innerText. See
references/advanced-debugger.md.
Each reference file covers a specific interaction mode or task. Read the relevant file before performing that task.
| Page | When to read |
|---|---|
references/setup-session.md | Always — read first to set up the browser session |
references/simplified-debugger.md | Running commands, extracting files, reading logs in simplified mode |
| Page | When to read |
|---|---|
references/setup-session.md | Always — read first to set up the browser session |
references/advanced-debugger.md | Read this BEFORE other advanced refs — mental model, mode-switching, authorization, branches, time advancement, fault injector, host commands, common errors |
references/notebook.md | Reading or writing notebook source, injecting cells |
references/actions.md | Authorizing shell actions, reading action output |
references/common-inspections.md | Ready-to-use debug cell snippets for common tasks |
references/setup-session.md — open the debugger URLreferences/simplified-debugger.md — click a log line to set the
moment and container, enter a bash command, press Send, read the outputreferences/setup-session.md — open the debugger URLreferences/simplified-debugger.md — click a log line, toggle
"Extract file", enter the file path, press Sendreferences/setup-session.md — open the debugger URL and inject runtimewindow.__antithesisDebug.switchMode("advanced"),
then notebook.waitForReady()references/advanced-debugger.md — internalize moments, branches,
reactive-vs-effectful, action grouping, and common errorsreferences/notebook.md — mechanics of writing cellsreferences/common-inspections.md — ready-to-use snippetsreferences/actions.md — authorizing and reading action resultsreferences/setup-session.md — launch / open the debugger URLreferences/download-log.md — run assets/download-mvd-log.sh
to capture and (for JSON) annotate the events log. The annotation step
uses this skill's own assets/process-logs.py.jq (event shape matches the triage
skill's logs reference)The JS runtime is required for both simplified and advanced modes. It
provides the window.__antithesisDebug API with three namespaces:
simplified, notebook, and actions.
Use the browser-side runtime file:
assets/antithesis-debug.jsInject it into the current page with:
cat assets/antithesis-debug.js \
| agent-browser --session "$SESSION" eval --stdin
Injecting the file registers methods on window.__antithesisDebug. Call those
methods with agent-browser eval.
Method call examples:
# Simplified mode
agent-browser --session "$SESSION" eval \
'window.__antithesisDebug.simplified.runCommand("ls -la /")'
# Advanced mode
agent-browser --session "$SESSION" eval \
"window.__antithesisDebug.notebook.getSource()"
agent-browser eval awaits Promises automatically, so async and sync methods
use the same call pattern.
If window.__antithesisDebug is missing, inject assets/antithesis-debug.js and retry the method call.
Do not run method calls in parallel with agent-browser open, navigation, or
any other command that can replace the page. Wait until the target page is
settled before starting eval calls. Run queries sequentially; mutations will
interfere with each other if launched in parallel.
After every open call or any interaction that may navigate or replace the
page, first confirm the browser has landed on the debugger page, then inject
assets/antithesis-debug.js and call the appropriate waitForReady() before
running other methods.
After navigation, inject the runtime, then call the appropriate waitForReady:
# Simplified mode
agent-browser --session "$SESSION" eval \
"window.__antithesisDebug.simplified.waitForReady()"
# Advanced mode
agent-browser --session "$SESSION" eval \
"window.__antithesisDebug.notebook.waitForReady()"
Both poll for up to 60 seconds and return { ok, ready, attempts, waitedMs }.
On timeout, the result also includes details.
One-shot probes:
agent-browser --session "$SESSION" eval \
"window.__antithesisDebug.simplified.loadingFinished()"
agent-browser --session "$SESSION" eval \
"window.__antithesisDebug.notebook.loadingFinished()"
Diagnostics:
agent-browser --session "$SESSION" eval \
"window.__antithesisDebug.simplified.loadingStatus()"
agent-browser --session "$SESSION" eval \
"window.__antithesisDebug.notebook.loadingStatus()"
antithesis-agent-browser skill's
references/setup-auth.md for the interactive login flow. Use the same
--session-name antithesis so auth state is shared.SESSION for each debugging
run, pair it with the shared --session-name antithesis, and
agent-browser --session "$SESSION" close when you finish or abort.environment.containers.list({moment}) (advanced) to determine valid
container names.open call or page
reload, inject assets/antithesis-debug.js and call
notebook.waitForReady() before the next method call.window.__antithesisDebug is undefined or missing, inject the runtime and
rerun the same method.action() + required_by. Don't authorize cells
one at a time when a single click can fire a chain — see
references/advanced-debugger.md for the tethered_authorization
pattern.CAMPAIGN SAW TERMINAL EVENT. Fork a
fresh branch from the same or an earlier moment.cell.text/innerText over actionCompleted. The runtime's
completion-detection misses real DONE states; read the cell text directly.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.
Review criteria:
JamieMason/syncpack
awslabs/agent-plugins
github/awesome-copilot
addyosmani/agent-skills