Repository navigation
feat(website_browser): record the browser with computer-recording/v1 (FD-4497) - #360
Merged
Merged
Conversation
…(FD-4497) The website-browser image runs an idle recorder beside Playwright MCP. It serves a card declaring computer-recording/v1, and on start streams the agent's page (DevTools screencast) into the protocol's Recordings, which encodes, uploads and seals it as for a computer env. The gateway reads the browser's card from the recorder's port (MCPServerConfig.card_port); an image without the recorder is omitted from the card as before. start_computer_recording takes an optional environment_name to target a child env of the deployed one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gent images do, not an exact pin (FD-4497) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…shed, as its recorder installs it (FD-4497) A release builds the infra images before it publishes the protocol, and a failed infra image keeps both packages off PyPI, so an infra image that needs the protocol the release ships would block every release. The browser now builds in the after-protocol group with the agents' images, and the build retries while PyPI's index doesn't yet list a protocol floor, as it does for a pin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
sarah-chitty-1
marked this pull request as ready for review
October 27, 2026 23:54
… hands back to the newest page left (FD-4497) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
Author
End-to-end test in devA real browser run recorded the page and a locally run hub played it. Nothing in the path was mocked: the upload, the run's metadata, the hub's artifact listing and its link signing were all real. The run (dev stage)
The hub (the frontend from scaleapi#170559 and the backend run locally against dev)
Found along the way, outside these PRs (follow-ups)
🤖 Generated with Claude Code |
earakely-scale
approved these changes
Oct 28, 2026
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
Website-browser runs can now be recorded with computer-recording/v1 (#346), the same way a computer env's display is. Linear: FD-4497.
Recorder in the browser image (
website_browser/recorder.py):Page.startScreencast) into the protocol'sRecordings, which encodes, uploads and seals it the same way it does for a computer env.--isolatedmode.Gateway:
MCPServerConfig.card_port(optional) lets the browser'sREST_PROXY_URLSentry point at the recorder. MCP traffic and the health check are unchanged. With an image that has no recorder, the browser is left off the card, as it is today.start_computer_recording: a new optionalenvironment_nametargets a child env of the deployed env, for examplewebsite-browserinside a gateway. Steps that don't set it serialize and run exactly as before.Release: the browser image now builds with the agents' images, after the release publishes the protocol, because its recorder installs it. As an infra image it would build before the protocol was published, and a failed infra image keeps the release off PyPI. The build retries while PyPI's index doesn't yet list a protocol floor, the same way it does for a pin.
Nothing records until a task runs
start_computer_recording. The idle cost is an ~85 MB process and an image that's about 38 MB larger.How it was tested
tst/unitpasses (10114 passed, 64 skipped), andruffis clean. New tests cover finding the browser, following pages, re-sending a still frame, a full recording decoded with av, the gateway's rewritten child card, and the port constant matching across files.DeployedEnv.invoke(..., environment_name="website-browser"): the agent's actions over the gateway MCP produced an 8.3 s H.264 mp4. Recording the browser container directly gave 20 s over 2 segments, covering navigation, typing and opening and closing tabs.>=0.1.382resolved to 0.1.383, since 0.1.382 was never published), and the recorder serves its card from it.Known gap
browser_tabs select), the recorder doesn't see it, so the video catches up at that tab's next navigation.display), withcursor: false, since a headless browser has no pointer to draw.The hub player is scaleapi#170559.
🤖 Generated with Claude Code


Confidence Score: 5/5
The PR appears safe to merge; the latest change fixes the reported popup recovery failure.Summary
Adds on-demand browser recording through
computer-recording/v1.The previous unnumbered finding is fixed:
_showremoves the failed target and resumes a remaining page. The added regression test checks this path. No new actionable issues or repository-rule violations were found.Diagram
%%{init: {'theme': 'neutral'}}%% flowchart LR Step[Recording task step] --> Gateway[Environment gateway] Gateway --> Recorder[Browser recorder] Agent[Agent tools] --> Gateway Gateway --> MCP[Playwright MCP] MCP --> Browser[Chromium page] Browser -->|Frames| Recorder Recorder --> Recording[Encode and upload recording]Reviews (2) · Last reviewed commit: "fix(website_browser): a page that closes..." · Reviewed by Greptile