Repository navigation
feat(browser): start tabs load in order and settle before agents get an address (FD-4941) - #530
Merged
earakely-scale merged 6 commits intoNov 8, 2026
Conversation
…an address Every start tab now opens over the browser's pipe, in a computer and alone: the first in the blank tab Chromium starts with, the rest in blank tabs after it, each held to the window's size before it goes to its URL, the first brought to the front. They load at once; each settles once it loads, fails (an error status on one of the env's own sites settling it at once) or has waited its time (the ready timeout on an own site, 30 s on a live one), and a start_tabs_loaded ready check passes once all have. Outcomes are kept in browser/v1 record per launch, in data/get and in a computer deploy's record. A deploy routing sites asks each routed website's ready, hands each browser the sites through a new browser/v1 sites/set before launching it, and fails naming any start tab on an own site that didn't load; data/reset (through a new relaunch hook) and a load that reopens the start tabs fail the same way. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…here it lands, and failed start tabs are named and kept A start tab now follows its main frame to the last document committed from its own navigation on, so a page that replaces itself by script before it loads settles on that page's load and status rather than timing out. After a relaunch, data/reset and a profile load wait on the start tabs themselves, their ready timeout and a setup margin, so a failed one is named rather than reported as the browser not being ready. A boot keeps its start tabs' outcomes in its record before it fails on one. Also renames a test loop variable that shadowed an import. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolves the one conflict, test_computer_env.py's imports, keeping main's conformance import and this branch's browser one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ey're ready, and test a routed start page that redirects A computer routing the run's websites waited on every deployed env's readiness, so an env serving none that couldn't be reached failed the deploy after 60 s; it now asks only the envs whose websites it routes. The routed-site e2e's home page now replaces itself by script before it loads, held from loading by a slow image, so the start tab is judged by the page it lands on in a real Chromium. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… before the first comes to the front Bringing the first start tab to the front over a pipe the browser closed raised, so the outcomes the tabs had settled on, "the browser ended", were never kept for the launch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…out, its setup counted A start tab on one of the env's sites waited the whole ready timeout from its own navigation, after the launch's setup, while a deploy and data/reset wait that timeout and a margin from the launch, so a slow setup could let them give up first with no outcome. Every start tab now settles within the ready timeout of its launch, an own-site one on what's left of it and a live one on 30 s at most, so one constant decides it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
earakely-scale
deleted the
edgararakelyan/fd-4941-m512-start-tabs-when-they-count-as
branch
November 8, 2026 02:06
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why
M5.12 (FD-4941): no agent gets an address until a browser's start tabs have loaded. They open in
start_urlsorder with the first active, each page sees the window's size from its first script, and every start tab's outcome is kept. Tasks with two or three start URLs (WebArena-Verified, M8.13) need the agent to land on the first start page, signed in, never on an error or boot page. Graders and run debugging need to know what each start tab actually loaded.The outcome and six decisions are on FD-4941. Decision 4 moved refusing an unclaimed start-tab host at save to M5.16, which adds
live = true/allow_hosts.about:blankon its command line. The first start URL loads in that tab and each further one in a tab opened blank after it, each held to the window's size (headless) before it goes to its URL. The first is then brought to the front. Before, a computer put every start URL on the command line, and alone the first went there and the rest opened over the pipe at their URLs, loading before the window size was fixed (the bug feat(computer): gate 3 checks a browser computer's input and page tools on an HTML Fixture Desk #475 fixed for agent tabs).data/reset, which wait that timeout and a margin, always get its outcome. A newstart_tabs_loadedready check passes once all have settled, so a deploy andcdpwait for them. A navigation's answer is awaited apart, since CDP answersPage.navigateonly once it commits, which a page that never answers never does.browser/v1 sites/set {sites: [{name, domains}]}. A computer deploy routing sites calls it on each held browser before launching it, and the app server keeps the sites in.agentenv/sites.jsonfor every launch after. A browser built before it is told nothing, with a warning, and its start tabs get the live wait.site_routingasks each routed website env'swebsite/v1 ready(up to 60 s, as each already passed its own deploy's wait), failing with each one's problems. Only the envs whose websites it routes are asked, so an env of the run that serves none can't hold the deploy up.record'sstart_tabs, oneStartTabsLaunchper launch (at,tabs);data/get'sbrowser-state.jsonstart_tabs, the latest launch's; and the deploy record'smetadata["computer"]["start_tabs"], by browser name. EachStartTabhastab,url,final_url,status,error,load_ms,site(null for live) andoutcome(loaded,failed,timed_out).data/reset(through a new hook the data plane awaits after a relaunch, waiting on the start tabs for the ready timeout and a 30 s setup margin) and a load that opens the start tabs again fail the same way; a server's restart only records it.How it was tested
ruff check: clean.test_website_browser.py: start tabs load in order in the first tab then blank ones, each held then sent, the first active, a hanging live page not holding up the others; own-site strict (error status settles at once, refused, never loads, a stale load event before its commit) against live (waited 30 s, an error status recorded but not fatal); a browser that ends mid-load; a fake browser over a real pipe launching headless with three start tabs to ready.test_browser_data.py: a load that reopens the start tabs fails naming an own-site tab that failed, not a live one; the after-relaunch check;sites/setand host matching (exact,*.one label more, case and trailing dot).test_computer_app_data.py: a reset that relaunched the app awaits the relaunch check, whose error fails it.test_computer_env.py(held browsers handed the routed sites before launch, one withoutsites/setlaunched with a warning; start tabs read per browser, an older browser left out; the boot failing naming each own-site tab),test_computer_sites.py(the readiness wait). The full unit tier on my Mac: 13742 passed; the 6 that failed are in tests this change doesn't touch (cua_driver_test,test_disk_recipe, which fails on macOS only, andtest_docker_image_github_clone), and CI's Linux shards run them.Page.navigateonly once it commits, and the pipe's 30 s call timeout then failed the whole load, so the browser never became ready. Navigations are now awaited apart, as above. New:timed_outafter 30 s while the deploy goes on;site: shop), and the same site answering 503 fails the deploy naming it. The site's home page replaces itself by script before it loads (a slow image keeps it from loading first), so the tab is judged by the page it lands on,/landed, in a real Chromium. This is the first e2e of site routing into a computer;🤖 Generated with Claude Code


Confidence Score: 5/5
The reviewed changes appear safe to merge.Summary
The latest changes count browser launch setup against the time allowed for start tabs to settle.
No new actionable issues were found. The earlier threads are addressed: replacement pages are followed, reset waits include a margin, failed boot outcomes are saved before refusal, and losing the browser’s pipe no longer discards outcomes when activating the first tab.
Diagram
%%{init: {'theme': 'neutral'}}%% flowchart TD A[Browser launch starts] --> B[Attach browser control] B --> C[Calculate remaining ready time] C --> D[Open and prepare start tabs] D --> E[Wait for each tab within its budget] E --> F[Save all tab outcomes] F --> G[Allow readiness checks to pass]Reviews (11) · Last reviewed commit: "refactor(browser): a launch's start tabs..." · Reviewed by Greptile