---
name: agent-browser-isolation
description: HARD SAFETY RULE. Read before ANY browser-driving call (nbrowser_* native bridge or browser_* pup). Never navigate, reload, or close a tab/window you did not create. The native bridge controls the user's REAL Chrome/Edge, full of their live work and other running AI threads; redirecting an existing tab destroys it with no undo. Open your own isolated window and act only on tab IDs you captured. Triggers: nbrowser, browser_navigate, drive the browser, native browser, control my chrome/edge, open a tab, scrape vendor, chip-fetcher, automate a login.
---

# Agent Browser Isolation — never hijack the user's tabs

**Read this before any browser-driving call** (`nbrowser_*` native bridge, or
`browser_*` pup). It is a hard safety rule, not a style preference.

## The rule (non-negotiable)

> **Never navigate, reload, go back/forward, close, or otherwise act on a
> browser tab or window you did not yourself create in this session. Operate
> ONLY inside a window you opened, targeting tab IDs you captured. When unsure
> whether a tab is yours, do nothing to it.**

## Why this is critical

The native-browser bridge (`nbrowser_*`, the `adom-browser-extension`) controls
the user's **real, signed-in Chrome or Edge** — the same browser they work in
all day. Those tabs hold live, often unsaved, irreplaceable state:

- **other AI / agent threads running right now** (including other Claude Code
  sessions — navigating one mid-run destroys its state, and yes, that can be the
  very thread you are running in),
- half-filled forms, checkout flows, authenticated dashboards,
- drafts, research, logins mid-handshake.

Redirecting even **one** existing tab can wipe work the user cannot get back.
There is no undo. Treat every pre-existing tab as sacred.

## The safe pattern (do this, every time)

1. **Open your own window** and capture the IDs it returns:
   ```
   nbrowser_open_window { url }   ->  { sessionId, tabId, windowId }
   ```
   Record `sessionId`, `tabId`, `windowId` as *yours*. (Pup equivalent:
   `browser_open_window { sessionId, profile, url }` — pup is a separate Chrome
   you own.)
2. **Always pass an explicit `tabId` you created** on every `navigate` / `eval`
   / `reload` / `screenshot` / `close`. Never operate on "the active tab" — the
   active tab is usually the user's, not yours.
3. **Keep a set of the IDs you created.** Before any mutating call, assert the
   target is in that set. If it is not, stop.
4. **Close only what you opened** (`nbrowser_close_window { sessionId }` for your
   own session). Never close the user's last window in a profile (the extension
   dies) and never close their tabs.

## Prefer pup when you do not need their login

If the task does **not** require the user's real cookies/session (rendering a
public page, a dashboard you host, a vendor page that is not bot-walled), use
**pup** (`browser_open_window` — a separate, disposable Chrome) instead of the
native bridge. Then you never touch their real browser at all. Reach for the
native bridge only when you genuinely need their real login or human-trust
(e.g. a Cloudflare-walled vendor site), and even then stay strictly inside your
own freshly opened window.

## Never do any of these

- `nbrowser_navigate` / `browser_navigate` on a tab you did not open.
- Navigate or reload the user's **active** tab, or any pre-existing tab.
- Reuse one of the user's existing tabs as your workspace.
- `close_tab` / `close_window` on anything you did not create.
- Assume a `navigate` "lands somewhere safe" — with no owned `tabId` it hits the
  active tab, which is the user's.

## If you already have a window open from earlier in the session

Re-confirm it is still **yours** (its `windowId` / `tabId` match what you
recorded) before driving it. Sessions can drift; the bridge's "active session"
is not a guarantee that the tab in front is the one you opened. When in doubt,
open a fresh window.

## One-line summary

Your browser workspace is the window **you** opened. Everything else on the
user's screen is their live work: read nothing into it, write nothing to it,
navigate none of it.
