opção
LarLar Skill DevOps e CI/CD autobrowse

Desenvolve habilidades confiáveis em automação de navegadores por meio de experimentação iterativa, executando um agente interno para navegar em sites e aprimorando as instruções de navegação até que as tarefas sejam concluídas de forma consistente.

...Expandir tudo
0
Tempo atualizado 30 de Setembro de 2026

AutoBrowse — Habilidade de automação de navegador com aprimoramento automático

Desenvolva habilidades confiáveis de automação de navegadores por meio de experimentação iterativa. Um agente interno navega pelo site (evaluate.ts). Você — o agente externo — analisa o que aconteceu e aprimora as instruções (strategy.md). Repita até que o teste seja aprovado de forma consistente.

Pontos de entrada

A invocação é flexível — tanto sinalizadores explícitos quanto linguagem natural de formato livre funcionam:

/autobrowse --task google-flights
/autobrowse --task google-flights --iterations 10 --env remote
/autobrowse --task google-flights --browser-trace
/autobrowse --tasks google-flights,amazon-add-to-cart
/autobrowse --all

# Also fine — parse freely:
/autobrowse https://flights.google.com/
/autobrowse book a flight on delta.com
/autobrowse fix the existing google-flights skill

--browser-trace (padrão desativado, somente remoto): associa cada iteração à habilidade irmã browser-trace — envolve o agente interno em uma captura CDP para evidências por página da rede/console/ciclo de vida da página. Implica --env remote; gera erros se combinado com --env local. Requer que a browser-trace skill irmã presente em ${CLAUDE_SKILL_DIR}/../browser-trace/, e a BROWSERBASE_API_KEY variável de ambiente.

Quando o usuário insere uma URL ou uma instrução livre em vez de --task :

  • Se uma tarefa existente em ${WORKSPACE}/tasks/ corresponder claramente ao site/intenção, use-a.
  • Caso contrário, escolha um nome curto em kebab-case, crie ${WORKSPACE}/tasks//task.md a partir de ${CLAUDE_SKILL_DIR}/references/example-task.md, preencha a URL/meta com base no que o usuário disse e prossiga. Informe ao usuário o nome escolhido em uma linha.

Como executar

Passo 1 — Analise os argumentos e identifique a intenção

Verifique o que foi passado:

  • --task → modo de tarefa única
  • --tasks a,b,c ou --all → modo multitarefa (gerar subagentes)
  • --iterations N → quantos ciclos de avaliação → aprimoramento (padrão: 5)
  • --env local|remote → ambiente do navegador (padrão: local; use “remoto” para sites protegidos contra bots)
  • --browser-trace → ativar a integração com o rastreamento do navegador (padrão: desativado). Isso implica --env remote. Se --env local --browser-trace ambos forem passados explicitamente, ocorrerá um erro com: browser-trace requires Browserbase; drop --env local or drop --browser-trace.

Se o usuário tiver passado um texto livre, mapeie-o para uma das opções acima antes de continuar.

Etapa 2 — Configurar o espaço de trabalho

Todos os artefatos de treinamento (definições de tarefas, iterações de estratégia, rastreamentos, relatórios) ficam em um diretório de espaço de trabalho no diretório de trabalho atual — NÃO dentro de ~/.claude/skills/. Isso mantém as gravações de arquivos do agente interno fora do diretório raiz do Claude e evita conflitos de permissão.

Espaço de trabalho padrão: ${CWD}/autobrowse/

mkdir -p ./autobrowse/tasks ./autobrowse/traces ./autobrowse/reports

Se o diretório de tarefas (./autobrowse/tasks//task.md) ainda não existir, crie-o:

mkdir -p ./autobrowse/tasks/
cp ${CLAUDE_SKILL_DIR}/references/example-task.md ./autobrowse/tasks//task.md
# Then edit task.md to describe the URL, inputs, steps, and expected JSON output

A fonte da habilidade em ${CLAUDE_SKILL_DIR} permanece somente para leitura — apenas ./autobrowse/ no CWD é gravado durante o treinamento. A graduação (etapa final) grava um único arquivo em ~/.claude/skills//SKILL.md.

Lista de tarefas disponíveis:

ls ./autobrowse/tasks/

Etapa 3 — Multitarefa: gerar subagentes paralelos

Se estiver executando várias tarefas, use a ferramenta Agente para gerar um subagente por tarefa simultaneamente. Cada subagente recebe um prompt independente para executar o ciclo completo de autobrowse para sua tarefa:

“Você está executando a habilidade autobrowse para a tarefa . Espaço de trabalho: (por exemplo, /path/to/project/autobrowse). Execute iterações de: avaliar → ler rastreamento → melhorar strategy.md → repetir. Use --env . Passe --workspace a cada chamada do evaluate.mjs. Se a chamada pai utilizou --browser-trace, você DEVE usar o bloco “traced-path” do loop do SKILL.md em cada iteração (pré-criar sessão, anexar bb-capture, passar --connect-url para o evaluate.mjs, parar + bisecar, liberar) — não recorra ao caminho padrão de comando único. Siga exatamente as instruções do loop autobrowse.

Ao concluir, instale a skill em ~/.claude/skills//SKILL.md com o frontmatter adequado do agentskills (nome + descrição). Não basta copiar o strategy.md — escreva uma skill autônoma.

No final, gere um resumo estruturado com: nome da tarefa, aprovação/reprovação na execução final, custo acumulado total, iterações concluídas, tabela por iteração (número da iteração, turnos, custo, status, hipótese testada) e 2 a 3 pontos-chave com os principais aprendizados.”

Inicie todos os subagentes em paralelo, aguarde a conclusão de todos, depois colete seus resumos e redija o relatório da sessão.

Para uma única tarefa, pule esta etapa e execute o loop diretamente abaixo.

O loop (execute-o para cada tarefa)

Início da iteração

Verifique se ./autobrowse/tasks//task.md existe (crie-o a partir do modelo, caso não exista — veja a Etapa 2). strategy.md seja criado automaticamente vazio pelo harness na primeira execução.

Requisitos

  • ANTHROPIC_API_KEY devem estar no ambiente (ou em um .env arquivo na pasta de trabalho atual — evaluate.mjs ele é carregado automaticamente). Se estiver faltando, o harness exibe um erro claro e encerra; não procure por chaves em outros caminhos.

Execute o agente interno

Caminho padrão (sem --browser-trace) — comando único, sem orquestração:

node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs --task  --workspace ./autobrowse
# or for bot-protected sites:
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs --task  --workspace ./autobrowse --env remote

Isso executa a sessão do navegador e grava um rastreamento completo em ./autobrowse/traces//latest/.

Caminho rastreado (--browser-trace, somente remoto) — o harness externo pré-cria uma sessão do Browserbase, se conecta bb-capture como um observador passivo e passa o connectUrl para evaluate.mjs para que cada chamada interna browse chamada utilize --cdp $connectUrl --session autobrowse-main (o padrão canônico de rastreamento do navegador que fornece aos observadores todos os eventos de Rede/Console). Execute este bloco uma vez por iteração com $N definido como o número da iteração indexado a partir de 1:

# Preflight — fail fast if browser-trace isn't installed alongside autobrowse.
BT_DIR="${CLAUDE_SKILL_DIR}/../browser-trace"
if [ ! -f "$BT_DIR/scripts/bb-capture.mjs" ]; then
  echo "ERROR: --browser-trace requires the browser-trace skill at $BT_DIR." >&2
  echo "Install it by cloning github.com/browserbase/skills and copying skills/browser-trace/" >&2
  echo "into the same parent directory as autobrowse (e.g. ~/.claude/skills/browser-trace/)." >&2
  exit 1
fi

# a. SESSION SETUP — pre-create the keep-alive session and derive its connectUrl
sid=$(browse cloud sessions create --keep-alive --verified --proxies \
  | node -e "let s='';process.stdin.on('data',c=>s+=c).on('end',()=>process.stdout.write(JSON.parse(s).id))")
connect_url=$(browse cloud sessions get "$sid" \
  | node -e "let s='';process.stdin.on('data',c=>s+=c).on('end',()=>process.stdout.write(JSON.parse(s).connectUrl))")

RUN_ID="run-$(printf '%03d' "$N")"
TRACE_ROOT="./autobrowse/traces//$RUN_ID"
mkdir -p "$TRACE_ROOT"
export O11Y_ROOT="$TRACE_ROOT/.o11y"   # park browser-trace output inside the autobrowse run dir
export O11Y_RUN_ID="$RUN_ID"           # tells the browse CLI which run dir to write descriptors.ndjson into

# b. ATTACH BROWSER-TRACE — passive observer; runs in background
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/bb-capture.mjs "$sid" "$RUN_ID" &
sleep 2

# c. RUN AUTOBROWSE — connectUrl flag tells evaluate.mjs to inject --cdp/--session
#    into every inner browse call. The inner agent never sees --remote.
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs \
  --task  --workspace ./autobrowse --env remote \
  --connect-url "$connect_url" --run-number "$N"

# d. STOP + BISECT + UNIFY — order matters; bisect needs the session to still
#    exist, and unify-trace joins the bisect output with autobrowse's trace.json
#    into a single time-ordered NDJSON the outer agent reads first each iter.
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/stop-capture.mjs "$RUN_ID"
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/bisect-cdp.mjs "$RUN_ID"
node ${CLAUDE_SKILL_DIR}/scripts/unify-trace.mjs \
  --trace-dir "$TRACE_ROOT" \
  --o11y-dir "$O11Y_ROOT/$RUN_ID"

# e. RELEASE
browse cloud sessions update "$sid" --status REQUEST_RELEASE

Isso grava o rastreamento do agente interno em ./autobrowse/traces//latest/ e a bissecção do CDP em ./autobrowse/traces//latest/.o11y//. O browse emite descritores de nós detalhados por comando para .o11y//cdp/descriptors.ndjson (um objeto JSON por chamada que aciona uma página: tag de destino/id/função/nome acessível/atributos/xpath/retângulo delimitador). O arquivo de descritores alimenta a geração de código a jusante; ele não é necessário para a formulação de hipóteses — pule-o ao ler o rastreamento.

Leia o rastreamento

cat ./autobrowse/traces//latest/summary.md

O resumo contém duração, custo, turnos, o log de decisão e a saída JSON final.

Se o agente falhou ou travou, analise mais a fundo:

  • Leia ./autobrowse/traces//latest/trace.json — procure a rodada em que ocorreu a falha
  • Leia as capturas de tela próximas ao ponto da falha com a ferramenta “Ler”

Quando o `--browser-trace` foi usado — comece com `unified-events.jsonl`. O `harness` une o log de turnos do agente e o fluxo contínuo (firehose) do CDP do navegador em um único fluxo NDJSON ordenado cronologicamente na raiz da execução. Um único arquivo, marcado por fonte (source: "agent" | "browser"), intercalado por carimbos de data e hora do relógio. Dê uma olhada rápida de cima a baixo; a causa da falha geralmente está em uma ou duas linhas adjacentes (o agente emitiu o comando X, o navegador respondeu com Y).

cat ./autobrowse/traces//latest/unified-events.jsonl

Os arquivos estruturados (trace.json, .o11y//cdp/*) também podem ser analisados pelo agente como detalhes adicionais quando o fluxo unificado aponta para algo que você precisa explorar mais a fundo:

Necessidade Arquivo ou comando de detalhamento
Totais por página + tempo (eventos, contagens de rede, erros por página) .o11y//cdp/summary.json
Todas as solicitações de rede com falha em um único local .o11y//cdp/network/failed.jsonl
Cargas completas de exceções do console (rastreamentos de pilha, etc.) .o11y//cdp/console/exceptions.jsonl
Segmentação por página (apenas eventos na página N) .o11y//cdp/pages//
Texto completo do raciocínio / saídas não truncadas da ferramenta para uma rodada específica trace.json (filtrar por turn === N)
consulta agrupada ad hoc (por exemplo, principais hosts, erros por página) O11Y_ROOT=./autobrowse/traces//latest/.o11y node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/query.mjs

O fluxo unificado é o padrão; explore arquivos estruturados apenas quando precisar de uma consulta agrupada, uma carga de texto completo ou uma filtragem que o fluxo não possa fornecer.

Formule uma hipótese

Identifique a etapa exata em que ocorreu o problema. Que heurística específica teria evitado isso?

De acordo com --browser-trace, a hipótese deve citar um evento específico do `unified-events.jsonl` (número de linha ou carimbo de data/hora) — ou indicar o nome do arquivo de detalhamento, caso tenha sido necessário acessá-lo. Isso garante que as atualizações sejam baseadas em evidências, e não em suposições. Uma hipótese baseada apenas nos comandos do agente poderia dizer “o clique não funcionou”; fundamentada no fluxo unificado, ela pode dizer “linha 47 do unified-events.jsonl: browse open foi seguida por Network.responseReceived status 403 em /api/checkout — mude para --verified --proxies."

Exemplos:

  • “Depois de clicar no menu suspenso, aguarde 1 s — as opções aparecem com animação antes de ficarem clicáveis”
  • “Navegue diretamente para /pay-invoice/ — pule a página de destino completamente”
  • “Use browse fill #field_3 value não browse type — esse campo é apagado ao receber o foco"
  • "A página exibe um indicador de carregamento na etapa 8 — adicione browse wait timeout 2000 antes do instantâneo"
  • (com --browser-trace) “Na linha 47 do arquivo unified-events.jsonl, 3 eventos consecutivos Network.responseReceived eventos em /api/availability retornaram 403 logo após browse open — o site está fazendo identificação de impressão digital; a próxima iteração precisa de --verified --proxies."

Atualizar strategy.md

Editar ./autobrowse/tasks//strategy.md. Mantenha tudo o que funcionou. Corrija a falha específica. Adicione uma heurística concreta.

Boas estratégias têm:

  • Caminho rápido: URL direto ou atalhos para pular a exploração
  • Fluxo de trabalho passo a passo: sequência exata com notas de tempo
  • Conhecimento específico do site: IDs de seletores, nomes de campos de formulário, indicadores de sucesso
  • Recuperação de falhas: o que fazer quando X der errado

Avalie o resultado

Leia o novo resumo. Foi aprovado? Houve progresso claro?

  • Aprovado ou houve progresso → manter, próxima iteração
  • Sem progresso ou regressão → reverta o arquivo strategy.md para a versão anterior e tente uma hipótese diferente

Gere um script executável (opcional)

Assim que a tarefa tiver convergido, você pode produzir um script determinístico e executável em uma ou mais estruturas por meio de scripts/codegen.mjs. Trata-se de uma única chamada de LLM por framework, armazenada em cache por hash de conteúdo, com as opções de verificação em relação a uma sessão nova e reescrita em caso de falha.

node ${CLAUDE_SKILL_DIR}/scripts/codegen.mjs \
  --task  \
  --workspace ./autobrowse \
  --frameworks playwright,stagehand \
  --verify

Cada framework recebe seu próprio subdiretório em tasks/// com o script gerado e uma estrutura autônoma (package.json, tsconfig.json). O diretório pode ser executado de forma autônoma com cd tasks//playwright && npm install && npx tsx .ts — o único requisito de tempo de execução é BROWSERBASE_API_KEY (mais ANTHROPIC_API_KEY para o destino Stagehand).

Frameworks integrados: playwright, stagehand. Adicione uma estrutura personalizada com --prompt-template --frameworks custom (e forneça seu próprio executador ou passe --no-verify).

Sinalizadores comuns:

Sinalizador Finalidade
--frameworks a,b,... Separado por vírgulas; padrão playwright
--verify / --no-verify Executar o script gerado em uma nova sessão do BB; padrão --verify
--max-retries N Limite de reescrita em caso de falha na verificação; padrão 2
--cache-only Erro se houver falha no cache (compatível com CI)
--force Esvaziar o cache
--dry-run Estimar tamanho do prompt + custo; não chamar o LLM
--run Forçar um específico run-NNN (padrão: a última aprovada)

A saída é uma linha JSON por framework no stdout. Saída diferente de zero se o estado final de qualquer framework selecionado for passed: false.

Veja references/playwright-cdp-bridge.md os padrões canônicos connectOverCDP que os scripts emitidos seguem.

Após todas as iterações — publique se estiver pronto

Se a tarefa for aprovada em 2 ou mais das últimas 3 iterações ou tiver atingido o limite máximo de iterações, instale-a como uma skill do Claude Code. Não basta copiar o arquivo strategy.md — a skill deve ser autônoma e útil para alguém que nunca tenha visto essa base de código. Se chegar ao limite máximo de iterações sem ser aprovada, anote o ponto de falha conhecido, mas documente tudo o que foi aprendido.

Instale escrevendo em ~/.claude/skills//SKILL.md:

mkdir -p ~/.claude/skills/

Use esta estrutura para o arquivo SKILL.md:

---
name: 
description: <1-2 sentences describing what this skill does and when to use it. Include trigger keywords.>
---

#  — Browser Skill

## Purpose
<1-2 sentences: what this automates and why it exists.>

## When to Use


## Browse CLI Reference
The inner agent uses the `browse` CLI. Key commands for this task:
- `browse stop` — kill existing session (always run before switching to remote)
- `browse open  --remote` — start a fresh Browserbase cloud session and navigate
- `browse open  --local` — start a clean local browser and navigate
- `browse tab new ` — open URL in a new tab
- `browse wait load` — wait for page to finish loading
- `browse wait timeout ` — wait a fixed amount of time for spinners or animations
- `browse wait selector ""` — wait for an element to become visible
- `browse get title` — verify you're on the right page
- `browse get text body` — extract all visible text (preferred for content extraction)
- `browse snapshot` — get accessibility tree; each node has a ref in `[X-Y]` format (e.g. `[0-5]`, `[2-147]`)
- `browse click [X-Y]` — click element by ref from the latest snapshot (include the brackets)

**Never use `--session ` flags in SKILL.md.** Named sessions are a parallel-run workaround — they contaminate skills with infrastructure concerns. Skills must work in isolation with the default session.

## Workflow

### Step 1 — Start session


### Step 2 — Navigate


### Step 3 — Extract


### Step 4 — Output


## Site-Specific Gotchas


## Failure Recovery


## Expected Output
```json


After writing the SKILL.md, confirm it's installed:
```bash
ls ~/.claude/skills//SKILL.md

A skill agora está disponível como / no Claude Code.

Relatório final (modo multitarefa)

Depois que todos os subagentes concluírem, imprima uma tabela em Markdown:

Tarefa Iterações Status final Concluída Custo
google-flights 5 ✅ aprovado sim US$ 0,42
amazon-adicionar-ao-carrinho 5 ❌ reprovado não $1,20

Em seguida, grave um relatório de sessão persistente em ./autobrowse/reports/ para que haja um registro duradouro da execução dentro do espaço de trabalho:

mkdir -p ./autobrowse/reports

Grave o arquivo ./autobrowse/reports/YYYY-MM-DD-HH-MM-.md com:

# AutoBrowse Session Report
**Date:** 
**Tasks:** 
**Environment:** remote|local
**Total cost:** $X.XX

## Results

| Task | Iterations | Pass Rate | Final Status | Graduated | Cost |
|------|-----------|-----------|--------------|-----------|------|
| ... | ... | X/5 | ✅/❌ | yes/no | $X.XX |

## Per-Task Learnings

### 
- **Key insight 1:** 
- **Key insight 2:** 
- **Failure mode fixed:** 

## Iteration Log

### 
| Iter | Turns | Cost | Status | Hypothesis tested |
|------|-------|------|--------|-------------------|
| 1 | 79 | $18.75 | ❌ fail | baseline |
| 2 | 9 | $0.26 | ✅ pass | session contamination fix |
| ... | ... | ... | ... | ... |

Regras

  • Edite apenas strategy.md — nunca altere task.md (a menos que esteja criando-o a partir do modelo) nem evaluate.mjs
  • Permaneça na área de trabalho — todas as gravações de treinamento vão para ./autobrowse/, nunca para ~/.claude/skills/autobrowse/. A fonte da habilidade é somente para leitura.
  • Uma hipótese por iteração — teste uma mudança por vez
  • Aproveite os acertos — mantenha o que funcionou e amplie isso
  • Confie no rastreamento — o agente interno mostra exatamente o que viu e fez
  • Passe para o `~/.claude/skills/` — o único arquivo que você escreve lá é a versão final aprovada SKILL.md
  • Não lance antes da bissecção — sob --browser-trace, a ordem no final de cada iteração é inalterável: stop-capture → bisect-cdp → browse cloud sessions update REQUEST_RELEASE. A bissecção depende de a sessão ainda existir quando o rastreamento for interrompido.
Ver no GitHub
---
name: autobrowse
description: Builds reliable browser automation skills through iterative experimentation, running an inner agent to browse sites and improving navigation instructions until tasks pass consistently.
license: MIT
---

# AutoBrowse — Self-Improving Browser Skill

Build reliable browser automation skills through iterative experimentation. An inner agent browses the site (`evaluate.ts`). You — the outer agent — read what happened and improve the instructions (`strategy.md`). Repeat until it passes consistently.

## Entry Points

Invocation is flexible — both explicit flags and free-form natural language work:

```
/autobrowse --task google-flights
/autobrowse --task google-flights --iterations 10 --env remote
/autobrowse --task google-flights --browser-trace
/autobrowse --tasks google-flights,amazon-add-to-cart
/autobrowse --all

# Also fine — parse freely:
/autobrowse https://flights.google.com/
/autobrowse book a flight on delta.com
/autobrowse fix the existing google-flights skill
```

`--browser-trace` (default off, remote-only): pairs each iteration with the sibling `browser-trace` skill — wraps the inner agent in a CDP capture for per-page network/console/page-lifecycle evidence. Implies `--env remote`; errors if combined with `--env local`. Requires the sibling `browser-trace` skill present at `${CLAUDE_SKILL_DIR}/../browser-trace/`, and the `BROWSERBASE_API_KEY` env var.

When the user drops a URL or free-form instruction instead of `--task <name>`:
- If an existing task in `${WORKSPACE}/tasks/` clearly matches the site/intent, use it.
- Otherwise, pick a short kebab-case name, create `${WORKSPACE}/tasks/<name>/task.md` from `${CLAUDE_SKILL_DIR}/references/example-task.md`, fill in the URL/goal based on what the user said, and proceed. Tell the user the chosen name in one line.

---

## How to run

### Step 1 — Parse arguments and orient

Check what was passed:
- `--task <name>` → single task mode
- `--tasks a,b,c` or `--all` → multi-task mode (spawn sub-agents)
- `--iterations N` → how many evaluate → improve cycles (default: 5)
- `--env local|remote` → browser environment (default: local; use remote for bot-protected sites)
- `--browser-trace` → opt in to the browser-trace integration (default off). Implies `--env remote`. If `--env local --browser-trace` are both passed explicitly, error with: `browser-trace requires Browserbase; drop --env local or drop --browser-trace.`

If the user passed free-form text instead, map it to one of the above before continuing.

### Step 2 — Set up the workspace

All training artifacts (task definitions, strategy iterations, traces, reports) live in a workspace directory in the **current working directory** — NOT inside `~/.claude/skills/`. This keeps the inner agent's file writes out of Claude's home dir and away from permission friction.

Default workspace: `${CWD}/autobrowse/`

```bash
mkdir -p ./autobrowse/tasks ./autobrowse/traces ./autobrowse/reports
```

If the task directory (`./autobrowse/tasks/<task>/task.md`) doesn't exist yet, scaffold it:

```bash
mkdir -p ./autobrowse/tasks/<task>
cp ${CLAUDE_SKILL_DIR}/references/example-task.md ./autobrowse/tasks/<task>/task.md
# Then edit task.md to describe the URL, inputs, steps, and expected JSON output
```

The skill source at `${CLAUDE_SKILL_DIR}` stays read-only — only `./autobrowse/` in CWD gets written to during training. Graduation (final step) writes a single file to `~/.claude/skills/<task>/SKILL.md`.

List available tasks:
```bash
ls ./autobrowse/tasks/
```

### Step 3 — Multi-task: spawn parallel sub-agents

If running multiple tasks, use the Agent tool to spawn one sub-agent per task simultaneously. Each sub-agent receives a self-contained prompt to run the full autobrowse loop for its task:

> "You are running the autobrowse skill for task `<name>`. Workspace: `<absolute-path-to-workspace>` (e.g. `/path/to/project/autobrowse`). Run `<N>` iterations of: evaluate → read trace → improve strategy.md → repeat. Use `--env <env>`. Pass `--workspace <workspace>` to every evaluate.mjs invocation. If the parent invocation used `--browser-trace`, you MUST use the traced-path block of the SKILL.md loop for every iteration (pre-create session, attach bb-capture, pass `--connect-url` to evaluate.mjs, stop+bisect, release) — do not fall back to the default single-command path. Follow the autobrowse loop instructions exactly.
>
> When graduating, install the skill to `~/.claude/skills/<task-name>/SKILL.md` with proper agentskills frontmatter (name + description). Do not just copy strategy.md — write a self-contained skill.
>
> At the end, output a structured summary with: task name, pass/fail on final run, total cumulative cost, iterations completed, per-iteration table (iter number, turns, cost, status, hypothesis tested), and 2-3 bullet key learnings."

Spawn all sub-agents in parallel, wait for all to complete, then collect their summaries and write the session report.

**For single task**, skip this step and run the loop directly below.

---

## The Loop (run this for each task)

### Iteration start

Check that `./autobrowse/tasks/<task>/task.md` exists (scaffold it from the template if not — see Step 2). `strategy.md` is auto-created empty by the harness on first run.

### Requirements

- `ANTHROPIC_API_KEY` must be in the environment (or in a `.env` file in CWD — `evaluate.mjs` auto-loads it). If missing, the harness prints a clear error and exits; don't hunt for keys in other paths.

### Run the inner agent

**Default path (no `--browser-trace`)** — single command, no orchestration:

```bash
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs --task <task-name> --workspace ./autobrowse
# or for bot-protected sites:
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs --task <task-name> --workspace ./autobrowse --env remote
```

This runs the browser session and writes a full trace to `./autobrowse/traces/<task>/latest/`.

**Traced path (`--browser-trace`, remote only)** — the outer harness pre-creates a Browserbase session, attaches `bb-capture` as a passive observer, and passes the session's `connectUrl` to `evaluate.mjs` so every inner `browse` call uses `--cdp $connectUrl --session autobrowse-main` (the canonical browser-trace pattern that gives observers full Network/Console events). Run this block once per iteration with `$N` set to the 1-indexed iteration number:

```bash
# Preflight — fail fast if browser-trace isn't installed alongside autobrowse.
BT_DIR="${CLAUDE_SKILL_DIR}/../browser-trace"
if [ ! -f "$BT_DIR/scripts/bb-capture.mjs" ]; then
  echo "ERROR: --browser-trace requires the browser-trace skill at $BT_DIR." >&2
  echo "Install it by cloning github.com/browserbase/skills and copying skills/browser-trace/" >&2
  echo "into the same parent directory as autobrowse (e.g. ~/.claude/skills/browser-trace/)." >&2
  exit 1
fi

# a. SESSION SETUP — pre-create the keep-alive session and derive its connectUrl
sid=$(browse cloud sessions create --keep-alive --verified --proxies \
  | node -e "let s='';process.stdin.on('data',c=>s+=c).on('end',()=>process.stdout.write(JSON.parse(s).id))")
connect_url=$(browse cloud sessions get "$sid" \
  | node -e "let s='';process.stdin.on('data',c=>s+=c).on('end',()=>process.stdout.write(JSON.parse(s).connectUrl))")

RUN_ID="run-$(printf '%03d' "$N")"
TRACE_ROOT="./autobrowse/traces/<task-name>/$RUN_ID"
mkdir -p "$TRACE_ROOT"
export O11Y_ROOT="$TRACE_ROOT/.o11y"   # park browser-trace output inside the autobrowse run dir
export O11Y_RUN_ID="$RUN_ID"           # tells the browse CLI which run dir to write descriptors.ndjson into

# b. ATTACH BROWSER-TRACE — passive observer; runs in background
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/bb-capture.mjs "$sid" "$RUN_ID" &
sleep 2

# c. RUN AUTOBROWSE — connectUrl flag tells evaluate.mjs to inject --cdp/--session
#    into every inner browse call. The inner agent never sees --remote.
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs \
  --task <task-name> --workspace ./autobrowse --env remote \
  --connect-url "$connect_url" --run-number "$N"

# d. STOP + BISECT + UNIFY — order matters; bisect needs the session to still
#    exist, and unify-trace joins the bisect output with autobrowse's trace.json
#    into a single time-ordered NDJSON the outer agent reads first each iter.
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/stop-capture.mjs "$RUN_ID"
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/bisect-cdp.mjs "$RUN_ID"
node ${CLAUDE_SKILL_DIR}/scripts/unify-trace.mjs \
  --trace-dir "$TRACE_ROOT" \
  --o11y-dir "$O11Y_ROOT/$RUN_ID"

# e. RELEASE
browse cloud sessions update "$sid" --status REQUEST_RELEASE
```

This writes the inner-agent trace to `./autobrowse/traces/<task-name>/latest/` and the CDP bisect to `./autobrowse/traces/<task-name>/latest/.o11y/<run-id>/`. The traced `browse` CLI also emits per-command rich node descriptors to `.o11y/<run-id>/cdp/descriptors.ndjson` (one JSON object per page-driving call: target tag/id/role/accessibleName/attributes/xpath/bounding-rect). The descriptors file feeds downstream codegen; it is **not** required for hypothesis formation — skip it when reading the trace.

### Read the trace

```bash
cat ./autobrowse/traces/<task-name>/latest/summary.md
```

The summary has duration, cost, turns, the decision log, and the final JSON output.

If the agent failed or got stuck, look deeper:
- Read `./autobrowse/traces/<task-name>/latest/trace.json` — search for the failure turn
- Read screenshots around the failure point with the Read tool

**When `--browser-trace` was used — start with `unified-events.jsonl`.** The harness joins the agent's turn log and the browser's CDP firehose into one time-ordered NDJSON stream at the run root. One file, source-tagged (`source: "agent" | "browser"`), interleaved by wall-clock timestamp. Skim it top-to-bottom; the failure cause is usually one or two adjacent lines (the agent issued command X, the browser responded with Y).

```bash
cat ./autobrowse/traces/<task-name>/latest/unified-events.jsonl
```

The structured files (`trace.json`, `.o11y/<run-id>/cdp/*`) are **also agent-consumable as drill-downs** when the unified stream points at something you need more of:

| Need | Drill-down file or command |
|---|---|
| Per-page totals + timing (events, network counts, errors by page) | `.o11y/<run-id>/cdp/summary.json` |
| All failed network requests in one place | `.o11y/<run-id>/cdp/network/failed.jsonl` |
| Full console exception payloads (stacktraces, etc.) | `.o11y/<run-id>/cdp/console/exceptions.jsonl` |
| Per-page slice (only events on page N) | `.o11y/<run-id>/cdp/pages/<pid>/` |
| Full reasoning text / untruncated tool outputs for a specific turn | `trace.json` (filter by `turn === N`) |
| Ad-hoc grouped query (e.g. top hosts, errors-by-page) | `O11Y_ROOT=./autobrowse/traces/<task-name>/latest/.o11y node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/query.mjs <run-id> <cmd>` |

The unified stream is the default; drill into structured files only when you need a grouped query, a full-text payload, or filtering the stream can't give you.

### Form one hypothesis

Find the exact turn where things went wrong. What single heuristic would have prevented it?

Under `--browser-trace`, the hypothesis must cite a **specific event from `unified-events.jsonl`** (line number or timestamp) — or name the drill-down file if you had to descend into one. This keeps updates evidence-grounded rather than vibes-driven. A hypothesis based only on the agent's commands might say "the click didn't work"; grounded in the unified stream, it can say "line 47 of unified-events.jsonl: `browse open` was followed by `Network.responseReceived` status 403 on `/api/checkout` — switch to `--verified --proxies`."

Examples:
- "After clicking the dropdown, wait 1s — options animate in before they're clickable"
- "Navigate directly to `/pay-invoice/` — skip the landing page entirely"
- "Use `browse fill #field_3 value` not `browse type` — this field clears on focus"
- "The page shows a spinner at turn 8 — add `browse wait timeout 2000` before snapshot"
- (with `--browser-trace`) "At line 47 of unified-events.jsonl, 3 consecutive `Network.responseReceived` events on `/api/availability` returned 403 right after `browse open` — the site is fingerprinting; the next iter needs `--verified --proxies`."

### Update strategy.md

Edit `./autobrowse/tasks/<task-name>/strategy.md`. Keep everything that worked. Fix the specific failure. Add a concrete heuristic.

Good strategies have:
- **Fast path**: direct URL or shortcuts to skip exploration
- **Step-by-step workflow**: exact sequence with timing notes
- **Site-specific knowledge**: selector IDs, form field names, success indicators
- **Failure recovery**: what to do when X goes wrong

### Judge the result

Read the new summary. Did it pass? Make clear progress?
- **Pass or progress** → keep, next iteration
- **No progress or regression** → revert strategy.md to the previous version and try a different hypothesis

### Generate a runnable script (optional)

Once the task has converged, you can produce a deterministic, runnable script
in one or more frameworks via `scripts/codegen.mjs`. This is one shot of an
LLM call per framework, cached by content hash, with optional verify-against-
fresh-session and rewrite-on-failure.

```bash
node ${CLAUDE_SKILL_DIR}/scripts/codegen.mjs \
  --task <name> \
  --workspace ./autobrowse \
  --frameworks playwright,stagehand \
  --verify
```

Each framework gets its own subdirectory under `tasks/<name>/<framework>/`
with the emitted script and a self-contained scaffold (`package.json`,
`tsconfig.json`). The directory is runnable standalone with
`cd tasks/<name>/playwright && npm install && npx tsx <name>.ts` — the only
runtime requirement is `BROWSERBASE_API_KEY` (plus `ANTHROPIC_API_KEY` for
the Stagehand target).

Builtin frameworks: `playwright`, `stagehand`. Add a custom framework with
`--prompt-template <path> --frameworks custom` (and provide your own runner
or pass `--no-verify`).

Common flags:

| Flag | Purpose |
|---|---|
| `--frameworks a,b,...` | Comma-separated; default `playwright` |
| `--verify` / `--no-verify` | Run the produced script against a fresh BB session; default `--verify` |
| `--max-retries N` | Rewrite-on-verify-failure cap; default 2 |
| `--cache-only` | Error if cache miss (CI-friendly) |
| `--force` | Bust the cache |
| `--dry-run` | Estimate prompt size + cost; don't call the LLM |
| `--run <id>` | Force a specific `run-NNN` (default: latest passing) |

Output is one JSON line per framework on stdout. Non-zero exit if any
selected framework's final state is `passed: false`.

See `references/playwright-cdp-bridge.md` for the canonical
`connectOverCDP` patterns the emitted scripts follow.

### After all iterations — publish if ready

If the task passed on 2+ of the last 3 iterations **or has reached the max iteration limit**, install it as a Claude Code skill. **Do not just copy strategy.md** — the skill must be self-contained and useful to someone who has never seen this codebase. If graduating at max iterations without a clean pass, note the known failure point but still document everything learned.

Install by writing to `~/.claude/skills/<task-name>/SKILL.md`:

```bash
mkdir -p ~/.claude/skills/<task-name>
```

Use this structure for the SKILL.md:

```markdown
---
name: <task-name>
description: <1-2 sentences describing what this skill does and when to use it. Include trigger keywords.>
---

# <Task Title> — Browser Skill

## Purpose
<1-2 sentences: what this automates and why it exists.>

## When to Use
<When should someone reach for this skill.>

## Browse CLI Reference
The inner agent uses the `browse` CLI. Key commands for this task:
- `browse stop` — kill existing session (always run before switching to remote)
- `browse open <url> --remote` — start a fresh Browserbase cloud session and navigate
- `browse open <url> --local` — start a clean local browser and navigate
- `browse tab new <url>` — open URL in a new tab
- `browse wait load` — wait for page to finish loading
- `browse wait timeout <ms>` — wait a fixed amount of time for spinners or animations
- `browse wait selector "<selector>"` — wait for an element to become visible
- `browse get title` — verify you're on the right page
- `browse get text body` — extract all visible text (preferred for content extraction)
- `browse snapshot` — get accessibility tree; each node has a ref in `[X-Y]` format (e.g. `[0-5]`, `[2-147]`)
- `browse click [X-Y]` — click element by ref from the latest snapshot (include the brackets)

**Never use `--session <name>` flags in SKILL.md.** Named sessions are a parallel-run workaround — they contaminate skills with infrastructure concerns. Skills must work in isolation with the default session.

## Workflow

### Step 1 — Start session
<exact browse commands in order>

### Step 2 — Navigate
<exact URL and verification steps>

### Step 3 — Extract
<exact extraction commands>

### Step 4 — Output
<what JSON to emit, referencing the schema below>

## Site-Specific Gotchas
<Bullet list of every hard-won heuristic from the iterations. This is the core value of the skill.>

## Failure Recovery
<What to do when navigation fails, session is contaminated, or extraction returns garbage>

## Expected Output
```json
<paste the exact expected output schema from task.md>
```
```

After writing the SKILL.md, confirm it's installed:
```bash
ls ~/.claude/skills/<task-name>/SKILL.md
```

The skill is now available as `/<task-name>` in Claude Code.

---

## Final report (multi-task mode)

After all sub-agents complete, print a markdown table:

| Task | Iterations | Final Status | Graduated | Cost |
|------|-----------|--------------|-----------|------|
| google-flights | 5 | ✅ pass | yes | $0.42 |
| amazon-add-to-cart | 5 | ❌ fail | no | $1.20 |

Then write a persistent session report to `./autobrowse/reports/` so there's a durable record of the run inside the workspace:

```bash
mkdir -p ./autobrowse/reports
```

Write the file `./autobrowse/reports/YYYY-MM-DD-HH-MM-<tasks>.md` with:

```markdown
# AutoBrowse Session Report
**Date:** <ISO date>
**Tasks:** <comma-separated list>
**Environment:** remote|local
**Total cost:** $X.XX

## Results

| Task | Iterations | Pass Rate | Final Status | Graduated | Cost |
|------|-----------|-----------|--------------|-----------|------|
| ... | ... | X/5 | ✅/❌ | yes/no | $X.XX |

## Per-Task Learnings

### <task-name>
- **Key insight 1:** <what the agent learned>
- **Key insight 2:** <another heuristic>
- **Failure mode fixed:** <what was failing and how it was resolved>

## Iteration Log

### <task-name>
| Iter | Turns | Cost | Status | Hypothesis tested |
|------|-------|------|--------|-------------------|
| 1 | 79 | $18.75 | ❌ fail | baseline |
| 2 | 9 | $0.26 | ✅ pass | session contamination fix |
| ... | ... | ... | ... | ... |
```

---

## Rules

- **Only edit `strategy.md`** — never touch `task.md` (unless creating it from the template) or `evaluate.mjs`
- **Stay in the workspace** — all training writes go to `./autobrowse/`, never to `~/.claude/skills/autobrowse/`. The skill source is read-only.
- **One hypothesis per iteration** — test one change at a time
- **Build on wins** — keep what worked, add to it
- **Trust the trace** — the inner agent shows exactly what it saw and did
- **Graduate to `~/.claude/skills/`** — the only file you write there is the final graduated `SKILL.md`
- **Don't release before bisecting** — under `--browser-trace`, the order at the end of each iteration is non-negotiable: `stop-capture` → `bisect-cdp` → `browse cloud sessions update REQUEST_RELEASE`. Bisect depends on the session still existing when the trace stops.

Instalar autobrowse

Baixe e descompacte os arquivos de habilidades no diretório .claude/skills/.

Baixar ZIP

Clone o repositório e copie os arquivos da habilidade para o seu projeto.

git clone https://github.com/browserbase/skills/tree/main/skills/autobrowse # Copy SKILL.md to your .claude/skills/ directory

Copiar Copiar
Configuração rápida: Copie a pasta da habilidade para .claude/skills/ O Claude detectará e utilizará automaticamente a habilidade
Repositório browserbase/skills

Habilidades relacionadas

klingai-upgrade-migration
Tempo atualizado 3 de Julho de 2026
Verification &amp; Quality Assurance
Tempo atualizado 29 de Junho de 2026
base44-cli
Tempo atualizado 29 de Junho de 2026
Railway CLI Management
Tempo atualizado 2 de Julho de 2026
OR