Antithesis agent-browser
Skill version: 2026-09-08 2e4a837
A helper skill for reading data from authenticated Antithesis web pages
when the snouty API doesn't expose what's needed. Other skills
(antithesis-triage, antithesis-debug, antithesis-query-logs) delegate
here when they need an authenticated browser session.
Purpose
- Handle interactive authentication to the user's Antithesis tenant with minimal disruption.
- Load Antithesis web pages (reports, logs, runs, causality) and extract data from them via an injected runtime.
When to use
- When another skill needs information from an Antithesis page that snouty cannot reliably provide.
- When the user or another skill needs to interact with an Antithesis web page directly.
Prerequisites
- DO NOT PROCEED if
agent-browseris not installed. Seehttps://raw.githubusercontent.com/vercel-labs/agent-browser/refs/heads/main/README.mdfor installation options. - DO NOT PROCEED if
agent-browseris older than versionv0.23.4. You can upgrade withagent-browser upgrade. - DO NOT PROCEED if
jqis not installed. Seehttps://jqlang.org/download/for installation options.
Reference files: This skill's references/ directory contains detailed guides for specific tasks. Do NOT read them all up front — only read a reference file when you are told to. Each reference file is mentioned by name at the point where it is needed.
General guidance
- Always ensure you are authenticated first.
- Use disposable sessions. Generate a unique
SESSIONfor each invocation of this skill. - Inject the runtime after navigation. After every
open, after link clicks that may change pages, and after reopening a report from a finding route, wait untilnetworkidle, injectassets/antithesis-agent-browser.js, then use the matching*.waitForReady()method before continuing. - Never run
agent-browsercalls in parallel. They are stateful with side effects. - Retry missing-runtime errors by reinjecting. If a command fails because
window.__antithesisAgentBrowseris undefined or missing, inject the runtime and rerun the same method. - Keep report evals on the main report view. If you click into another page by accident, reopen the original report URL before using report queries again.
Session management with agent-browser
agent-browser has two session variables:
--session: the name of a unique, isolated browser instance--session-name: auto-save/restore cookies by name
Every invocation MUST use a unique --session value. Generate it once and reuse it whenever you see $SESSION referenced by this skill.
SESSION=antithesis-ab-$(date +%s)-$$
Use --session-name antithesis on the FIRST agent-browser command that references a new $SESSION. This creates the session and restores saved cookies. Subsequent commands for the same $SESSION do not need --session-name — the session already exists.
Close the live session when done.
agent-browser --session $SESSION close
Authentication
Do NOT navigate to the home page just to check auth. Instead, navigate directly to your target URL (report, runs page, etc.) using the session-creation command:
agent-browser --session "$SESSION" --session-name antithesis open "$TARGET_URL"
agent-browser --session "$SESSION" wait --load networkidle
agent-browser --session "$SESSION" get url
If the URL starts with https://$TENANT.antithesis.com then you are authenticated. If it redirected to a login page, you need to authenticate — read references/setup-auth.md, which gates the interactive headed login on user confirmation.
Runtime injection
This skill ships a runtime (assets/antithesis-agent-browser.js) that exposes helper methods on window.__antithesisAgentBrowser for reading data from Antithesis pages. Inject it after navigation completes:
cat assets/antithesis-agent-browser.js \
| agent-browser --session "$SESSION" eval --stdin
Call its methods with agent-browser eval:
agent-browser --session "$SESSION" eval \
"window.__antithesisAgentBrowser.report.getRunMetadata()"
agent-browser eval awaits Promises automatically, so async and sync methods use the same call pattern.
Error handling: Runtime methods throw on error, which causes agent-browser eval to return a non-zero exit code. Check the exit code to detect failures — no output parsing required. The error message describes what went wrong (e.g. wrong page, element not found, timeout).
If window.__antithesisAgentBrowser is missing, reinject assets/antithesis-agent-browser.js and retry.
NEVER run agent-browser calls in parallel. They are stateful calls with side effects; parallel calls can break or return confusing results.
Navigation and loading
Each Antithesis page loads content asynchronously. After navigation to any Antithesis page, follow this pattern:
First, wait for networkidle:
agent-browser --session "$SESSION" wait --load networkidle
Then, check the url to see if you got redirected to an authentication page:
agent-browser --session "$SESSION" get url
If you hit an authentication page, stop and reauthenticate before continuing.
Then, inject the runtime:
cat assets/antithesis-agent-browser.js \
| agent-browser --session "$SESSION" eval --stdin
Finally, eval the page-specific wait function to wait for all asynchronous chunks to finish loading:
- Report page:
window.__antithesisAgentBrowser.report.waitForReady() - Logs page:
window.__antithesisAgentBrowser.logs.waitForReady() - Runs page:
window.__antithesisAgentBrowser.runs.waitForReady()
Each wait method polls for up to 60 seconds by default. On success it returns { attempts, waitedMs }. On timeout, the method throws causing agent-browser eval to return a non-zero exit code.
Use the lower-level boolean checks when you need a one-shot probe:
- Report page:
window.__antithesisAgentBrowser.report.loadingFinished() - Logs page:
window.__antithesisAgentBrowser.logs.loadingFinished() - Runs page:
window.__antithesisAgentBrowser.runs.loadingFinished()
If a page still does not become ready, inspect status:
- Report page:
window.__antithesisAgentBrowser.report.loadingStatus() - Logs page:
window.__antithesisAgentBrowser.logs.loadingStatus() - Runs page:
window.__antithesisAgentBrowser.runs.loadingStatus()
Handling error reports
After every report waitForReady() call, check result.error. If it is present, read references/error-reports.md for the error-report workflow.
What this skill can do
- Authenticate to the tenant. Read
references/setup-auth.mdfor the interactive login flow. - Discover runs from the runs page. Read
references/run-discovery-ui.md. Prefersnouty runs listwhenever possible — only fall back to the UI when the API is unavailable or doesn't expose what you need. - Read properties from a triage report. Read
references/properties-from-ui.md. Prefersnouty runs --json propertieswhenever possible. - Look up a
run_idfrom a triage-report URL that cannot be matched againstsnouty runs list. Therun_idis rendered at the bottom of the main report page (report_id → run_idis not currently exposed by the API). - Download an error log from a failed run's report page. See
references/error-reports.md. - Read a causality report. Ask the user for the causality report URL. The main signal is the bug-probability trajectory in the logs leading up to the bug moment.