The skeleton hint (`prompts.py`, added in #4427 alongside an unrelated
image fix, Linear AGI-497) uses a pure text-density threshold:
`total_elements > 20 and text_chars < total_elements * 5`. Measured over
~40k eval steps it fires on **75.7% of all prompts**, mostly on fully
rendered element-heavy pages — and models have learned to ignore it
(steps where it fired waited *less* than steps where it didn't), which
also devalues the hint in the one case a page really is loading.
`BrowserStateSummary.pending_network_requests` is computed on every
state build by `dom_watchdog._get_pending_network_requests()`
(readyState + performance API, ad-filtered) and was previously read by
nothing. This PR gates the hint on it, so "still loading?" only appears
while requests are actually in flight. The skeleton fixture test
simulates one pending request; the rich-page test is unchanged (the gate
only tightens the condition). All 4 tests in `test_action_blank_page.py`
pass.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Gate the skeleton-screen hint on actual in‑flight network requests and
reword hints to “consider waiting,” including the request count. This
cuts false positives (~76% before) and gives clearer, data‑driven
guidance.
- **Bug Fixes**
- Gate the low-text-density skeleton hint on
`BrowserStateSummary.pending_network_requests` in
`browser_use/agent/prompts.py`; message shows the in‑flight count and
says “page may still be loading, consider waiting.”
- Update empty‑page hint to “Page appears empty — consider waiting”;
adjust `tests/ci/test_action_blank_page.py` to simulate a pending
request and assert on the new wording.
<sup>Written for commit 6618c97ebd.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5273?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
`_clear_text_field` clears via the instance `this.value = \"\"`. React
patches the instance value setter to track changes, so that assignment
updates React's tracker and the synthetic `input` event gets deduped —
onChange never fires and the controlled component keeps its old state
while the DOM looks empty. The synchronous `finalText` check reads
`\"\"` at that instant, so the keystroke fallbacks (which would work)
are unreachable, and the action reports "Typed ''" success.
**Blast radius is narrow but real**: only `input(index, \"\",
clear=true)` (pure clear). When text follows the clear, the real
per-character key events resync React on the first keystroke, and
#4023's concat retry backstops. The pure-clear path is the silent one —
observed in evals as an agent retrying a search-box clear 11 times while
the React-filtered list never reset.
History (why this is a gap, not a choice): the original
`_clear_text_field` (d80549038, Aug 2025) used real Ctrl+A+Backspace key
events — React-safe. A same-day follow-up (f4a34bc1d "fix-clear-text",
no body) promoted JS value-set to Strategy 1. Later commits added the
correct native-setter technique for date inputs (`_set_value_directly`,
0badc5d4c) and for the type-retry path (#4023) — it just never reached
the clear path. Related user reports: #3415, #2867 (dropdown flavor of
the same tracker mechanism).
Two changes:
1. `_clear_text_field` uses the prototype's native value setter (same
technique as `_set_value_directly`), so React's tracker sees the change
and onChange fires with the cleared value.
2. If a pure clear still fails, raise `BrowserError` instead of logging
a warning and reporting success — the agent gets an honest failure it
can react to.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Fixes clearing React‑controlled text fields so the DOM and component
state stay in sync. Uses the native prototype value setter on real
inputs so React sees the change and `onChange` fires.
- **Bug Fixes**
- Clear now calls the element‑type’s native value setter for
`HTMLInputElement`/`HTMLTextAreaElement` with `instanceof` guards; web
components and other elements keep their own setter to avoid Illegal
invocation.
- Fixed the descriptor lookup in the concat‑retry path to pick the
correct setter per element type, with a safe fallback to `this.value`.
<sup>Written for commit d4abb27612.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5274?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
The low-text-density heuristic fires on ~76% of prompts on fully rendered
element-heavy pages (measured over ~40k eval steps), and models have learned
to ignore it. pending_network_requests is already computed on every browser
state build and was previously unread; using it as a gate keeps the hint for
the one case it is true.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
## What
Removes the auto-bridge (both `Agent` and beta agent) that copied
`output_model_schema` into `extraction_schema`. Per-page `extract` now
uses a schema only when the caller passes `extraction_schema=`
explicitly.
## Why
`output_model_schema` describes the **final task result** — e.g.
`{summary, step_results}`. The auto-bridge (added Feb 2026) fed that
same schema to **every per-page extract**, asking the model to produce
the whole-task shape from one page. That's the wrong shape for a
single-page extraction, and on the **browser-use gateway** it routes the
structured extract sub-call through the agent action protocol, which the
fine-tuned bu-* models answer with `done(data={...})` — the client then
dies with `KeyError: 'action'` (deterministic, every structured-extract
call, all releases since 0.11.8).
Reproduced live against production: a bu-2-0 agent with
`output_model_schema` set failed `extract` 4/4 times ("Error executing
action extract: 'action'") on browser-use.com, then completed the task
by reading state directly — so it was silent wasted steps, not a hard
failure.
## Behavior change (called out deliberately)
- Users who set **only** `output_model_schema` (final structured
output): `extract` returns to free-text (the pre-Feb-2026 default).
Their final `done` result is still structured — unchanged.
- Users who want structured per-page extraction: pass
`Agent(extraction_schema=...)` explicitly — unchanged.
This is complementary to the gateway-side fix (cloud, unwraps
`done.data` for non-agent schemas), which fixes existing installs
without an upgrade; this PR fixes the root coupling for anyone who
upgrades and also stops feeding a semantically wrong schema to
non-gateway models.
## Tests
`tests/ci/test_structured_extraction.py` (28) pass — none depended on
the auto-bridge; they exercise explicit `extraction_schema` via `act()`,
which is unchanged.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Stop auto-inheriting `output_model_schema` into per-page `extract`,
restoring the free-text default and fixing `browser-use` gateway
failures; adds tests to lock in this behavior.
- **Bug Fixes**
- Avoids using the final-result shape for single-page extraction, which
caused `KeyError: 'action'` on the `browser-use` gateway.
- Final `done` output remains structured when `output_model_schema` is
set; only per-page extraction behavior changes.
- **Migration**
- To get structured per-page results, pass `extraction_schema=...` to
the `Agent`.
<sup>Written for commit ba755a735c.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5278?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
output_model_schema describes the final task result (e.g. {summary, step_results}).
Auto-copying it into every extract call (added Feb 2026) asks the model to produce
the whole-task shape from a single page, and on the browser-use gateway routes the
extract sub-call through the agent action protocol, which breaks it (client
KeyError 'action'). Per-page extract now uses a schema only when the caller passes
extraction_schema explicitly; free-text extraction is the default again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Add support for `file://` URLs in start URL extraction and reduce false
positives. Keeps local file paths intact and avoids forcing `https://`.
- **Bug Fixes**
- Add `file://` to URL regex and scheme detection; keep `file://` as-is
and skip extension filtering for them.
- De-duplicate overlapping matches by tracking matched spans across
patterns.
- Safer heuristics: only prepend `https://` when no scheme is present,
and only exclude `.htm` when the match is domain-like; still respects
nearby “never/don’t” context.
<sup>Written for commit 581ab0d901.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5276?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
The flash system prompts (`system_prompt_flash.md`,
`system_prompt_anthropic_flash.md`, `system_prompt_flash_anthropic.md`)
instruct the model to use `replace_file_str`, but the registered tool is
`replace_file` (`tools/service.py:1776`). Models cope by inferring the
right name (0 wrong-name calls observed in 42k eval steps), so impact is
hygiene — but the prompt should name the tool that exists. The two
remaining `replace_file_str` occurrences are the internal `FileSystem`
method, which is not model-facing and unchanged.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Updated flash system prompts to reference the correct tool
`replace_file` instead of `replace_file_str`. Aligns instructions with
the registered tool to avoid confusion when updating files.
<sup>Written for commit daf7a3e112.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5272?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
Gemini 3+ models may throw errors if a default value is set for
parameters like temperature, top-p, etc.
The 3-series models use 1.0 as the default temperature, so this should
be a backwards-compatible change.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Skip setting a default temperature in the Gemini 3-series generation
config to avoid API errors. Keep explicit values, and default to 0.5
only for non–Gemini 3 models.
- **Bug Fixes**
- In `ChatGoogle`, only set `temperature` if provided or if the model is
not `gemini-3*` (then use 0.5).
- Added tests to confirm: non–Gemini 3 defaults to 0.5, `gemini-3*`
leaves `temperature` unset, explicit values are preserved.
<sup>Written for commit a567c6dacf.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5173?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
## Summary
- bump `browser-use` from `0.13.5` to `0.13.6`
- pin `browser-harness==0.1.6`
- sync both Browser Use skill copies from Browser Harness `main`, adding
the recordings and video workflow
## Validation
- `uv run --frozen pre-commit run --files pyproject.toml
skills/browser-use/SKILL.md browser_use/skills/browser-use/SKILL.md`
- `uv run --frozen python scripts/sync_browser_harness_skill.py --check`
- built the wheel and verified its metadata requires
`browser-harness==0.1.6`
- verified the packaged skill contains the recordings/video instructions
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Release `browser-use` 0.13.6 and pin `browser-harness` 0.1.6. Adds
recordings and video workflow guidance to the Browser Use skill so users
can opt into local traces and create videos.
- **Dependencies**
- Bump `browser-use` to `0.13.6`.
- Pin `browser-harness` to `0.1.6`.
- **New Features**
- Synced both Browser Use skill docs from `browser-harness` `main`.
- Added recordings/video workflow: CLI enable/disable, `BH_RECORD`
override, `start_recording`/`stop_recording`, and safe use of
`recordings --latest`.
- Included `make-video.md` in Interaction Skills.
<sup>Written for commit 169ebee82e.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5245?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
## Summary
Adds `bu-qa-1` to the accepted `bu-*` alias list in `ChatBrowserUse`.
The gateway already serves this model (browser-use/cloud#4945 — website
QA agent that tests a site and scores functionality/aesthetics 0-2), but
the client rejected it at construction:
```
ValueError: Invalid model: 'bu-qa-1'. Use a 'bu-*' alias (bu-latest, bu-1-0, bu-2-0) ...
```
Changes:
- `bu_aliases` list: add `'bu-qa-1'`
- docstring: document the alias
- test: extend the existing alias parametrize with `bu-qa-1`
## Usage
```python
agent = Agent(
task='https://example-site.com\nSpec: landing page with working signup form',
llm=ChatBrowserUse(model='bu-qa-1'),
output_model_schema=WebsiteQAResult, # recommended: reasoning + functionality/aesthetics ints, see cloud#4945
)
```
## Testing
- `tests/ci/models/test_llm_browseruse.py`: 20 passed, 1 skipped
- Verified end-to-end against the staging gateway: agent tested
quotes.toscrape.com and returned a validated result (functionality=2,
aesthetics=1)
- Note: `bin/lint.sh` pyright failures (`browser_harness` imports in
cli.py) are pre-existing on main and unrelated
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Enables the `bu-qa-1` Website QA model in `ChatBrowserUse`, removing
construction-time “Invalid model” errors when using this gateway-served
alias.
- **New Features**
- Add `bu-qa-1` to accepted `bu-*` aliases.
- Document the alias in `ChatBrowserUse` docstring.
- Update tests to include `bu-qa-1`.
<sup>Written for commit 4b1cc6375a.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5226?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Adds a stdio MCP server for CLI 3.0 behind `--cli-mcp`, exposing
persistent `browser_harness` execution and screenshots to MCP clients.
Uses a shared, silent stdio runner and validates `max_dim` inputs.
- **New Features**
- New `--cli-mcp` flag starts `browser_use.mcp.cli_mcp` via a shared
stdio runner (`mcp.server.stdio`).
- Tools:
- `browser_exec`: run Python in a persistent namespace with helpers
pre-imported.
- `browser_screenshot`: returns base64 PNG; supports `full`; `max_dim`
must be a positive integer.
- Automatically calls `ensure_daemon` (except for remote admin calls).
Disables logging to keep stdio clean.
- **Migration**
- Run: `browser-use --cli-mcp`. Sets `BH_CLIENT=browser-use-mcp` by
default.
- Connect your MCP client over stdio. Prefer `browser_screenshot` over
in-code captures.
<sup>Written for commit 133761dbbd.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5194?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
Ship browser-harness 0.1.5 (Windows reliability, robust telemetry,
cloud-browser suggestion) with the upcoming browser-use 0.13.4 release.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Pin `browser-harness` to 0.1.5 to ship Windows reliability fixes, more
robust telemetry, and cloud-browser suggestion support alongside
`browser-use` 0.13.4.
- **Dependencies**
- Bump `browser-harness` from 0.1.4 to 0.1.5 in `pyproject.toml`.
<sup>Written for commit e3616da919.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5190?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Restructures the README into a simpler Quickstart for agent setup and a
clear Python library path to speed up onboarding. Moves demos into a
“What can Browser Use do?” section and adds an FAQ on when to use CLI vs
library; updates benchmarks.
- **Refactors**
- Consolidates intros into two paths: Quickstart (CLI skill) and Python
library.
- Quickstart: paste-in prompt uses Python 3.12, says run `browser-use
skill install`, and links to the `browser-harness` install guide;
removes the old CLI section and code example.
- Python library: Python >= 3.11, clarify `.env` API key setup, remove
`BrowserProfile` import, and show `uv add `browser-use``.
- Move demos to the new “What can Browser Use do?” section at the top.
- Add Odysseys leaderboard note to the benchmarks and include a Citation
section.
- Tests: update CI to look for “run `browser-use skill install` to
register the skill”.
<sup>Written for commit 50bf4b222c.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5176?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
Gemini 3+ models may throw errors if a default value is set for
parameters like temperature, top-p, etc.
The 3-series models use 1.0 as the default temperature, so this
should be a backwards-compatible change.
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Show a clear hint when `browser-use` runs piped code that references an
unknown helper, and unify the CLI 3.0 guidance across errors and
migration hints. Tighten detection so only `NameError`s raised by user
code are wrapped.
- **New Features**
- On `NameError` from exec’d stdin, print the traceback, then a friendly
message to stderr (example, core helpers, install steps, docs link,
`browser-use --doctor`) and exit with code 2. Shared `_CLI3_GUIDE` is
used in both the unknown-helper hint and legacy migration message.
- **Bug Fixes**
- Only treat `NameError` from the final frame of piped code (`<string>`)
as an unknown helper; internal/helper `NameError`s propagate.
<sup>Written for commit 36a8525c13.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5171?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
The `browser-use skill sync` check compares the committed SKILL.md
copies against browser-harness main, which recently gained the
cloud-browser-suggestion section. The committed copies were stale, so
the check fails on every PR (it also failed on #5169, unrelated to that
PR's changes).
This re-runs `scripts/sync_browser_harness_skill.py` to bring both
copies current. `--check` passes locally.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Syncs the `browser-use` SKILL.md copies with browser-harness main by
adding the cloud-browser guidance section, fixing the `browser-use skill
sync` check that was failing on every PR. Re-ran
`scripts/sync_browser_harness_skill.py`; `--check` passes locally.
<sup>Written for commit 9fb49e03ee.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/browser-use/browser-use/pull/5170?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->