Repository navigation
Conversation
|
Codex review: needs maintainer review before merge. Reviewed August 26, 2026, 7:54 AM ET / 11:54 UTC. ClawSweeper reviewWhat this changesThe PR replaces browser route heuristics that could adopt an unrelated tab after an action or navigation with operation-owned target continuity from Playwright or the authenticated extension relay. Regression provenancePossible regression — suspected (reviewed change). No predecessor PR is attributed. Merge readinessThis remains necessary: the base-side resolver selected replacements from tab listings, while this branch carries continuity from the exact page or relay owner instead. No concrete patch defect was found, and the posted production-boundary terminal proof is sufficient; retain the PR until its exact-head checks finish and the unavailable Playwright contract/history checks are independently closed. Priority: P1 Review scores
Verification
How this fits togetherBrowser tool HTTP routes select a tab, invoke either Playwright or the extension relay, and return a target ID that later browser actions may reuse. This change controls how that result remains bound to the operated tab across navigation, renderer replacement, and revocation. flowchart LR
A[Browser tool request] --> B[Browser route]
B --> C[Selected tab]
C --> D{Execution owner}
D --> E[Exact Playwright page]
D --> F[Authenticated relay tab]
E --> G[Action or navigation result]
F --> G
G --> H[Returned target ID]
Before merge
Agent review detailsSecurityNone. PR surfaceSource +59, Tests +428. Total +487 across 14 files. View PR surface stats
Review metrics
Stored data modelPersistent data-model change detected: Merge-risk optionsMaintainer options:
Technical reviewBest possible solution: Keep target identity owned by the operated page or captured relay tab, never by route-level tab enumeration; merge only after exact-head validation and a trusted Playwright contract check confirm that the added page-CDP reads preserve that contract. Do we have a high-confidence way to reproduce the issue? Yes—source evidence is high-confidence: the exact base diff shows the former resolver could select a sole listed tab, and the branch replaces it with an owner-bound outcome. This review did not execute the external contributor branch locally. Is this the best way to solve the issue? Yes, subject to the remaining dependency-contract check. Moving continuity to the exact page or relay owner is safer and more maintainable than preserving route-level URL or cardinality inference. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against e2e5d1bca685. LabelsLabel changes:
Label justifications:
EvidenceWhat I checked:
Likely related people:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (42 earlier review cycles; latest 8 shown)
|
|
@clawsweeper re-review Added redacted live-browser proof under Evidence (real Chrome over CDP): the acted-on tab A is closed while unrelated tab B survives and B is never adopted, and a renderer swap where the page reattaches at the navigated URL is still adopted. PR body sections and headings updated. |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
Proof is done: live Chrome/CDP harness is in the PR Evidence section and ClawSweeper marked Maintainer decision needed before I change scope. Please choose one:
I will not expand scope without that direction. |
7b75f01 to
6a2516c
Compare
|
@clawsweeper re-review Head Awaiting maintainer direction on the A/B scope choice (heuristic continuity vs backend-owned target outcomes) before any further product changes. |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
@clawsweeper re-review Head Please confirm this matches the intended contract. @steipete or browser owner: does Playwright page CDP identity cover your relay continuity needs, or should we prioritize wiring MCP/relay outcomes next? |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
@clawsweeper re-review CI unblock on
Local proof: Remaining steipete/maintainer ask: if Chrome MCP tab-list membership is insufficient as the backend-owned signal (vs explicit MCP page-id continuity), please confirm whether this satisfies the relay/MCP continuity bar or whether a deeper chrome-devtools-mcp contract change is required before merge. |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
dab7edc to
b8151ab
Compare
|
@clawsweeper re-review please Rebased onto current Existing MV3 proof harness included ( |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
Co-authored-by: Piyush Jagadish Bag <[email protected]>
Co-authored-by: Piyush Jagadish Bag <[email protected]>
|
The original ClawSweeper owner-boundary concern is now addressed without changing public relay target IDs: continuity is accepted only from the exact acted-on Playwright Page or a closure bound to the exact live extension connection, granted TabState, and registered relay instance. Revocation/regrant, extension replacement, relay replacement, and unavailable capture fail closed. Chrome-MCP handles remain stable by their existing page-owner contract; six pre-existing route expectations were corrected because they previously required adopting an unrelated same-URL tab. Actual HTTP response precedence and relay lifecycle regressions are covered; the complete browser extension shard passes 2,730 tests across 195 files; and real isolated Chrome/CDP behavior was exercised. A live paired MV3 extension was unavailable and is not claimed. @clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
Co-authored-by: Piyush Jagadish Bag <[email protected]>
|
Addressed the latest actionable renderer-retry P1 at exact head Detached-frame recovery now reconnects Playwright first, allowing relay auto-attach to restore the original granted tab. It then resolves the captured authenticated-extension/tab/relay owner, selects only that exact replacement target, and revalidates the same owner after awaited lookup. The shared navigation guard checks ownership synchronously again immediately before All three previously failing regressions now pass: the real navigation backend, the actual HTTP route, and the real shared guard with revocation during awaited setup. The full browser suite passed 2,728 tests. A real isolated Chromium instance installed and auto-paired the actual MV3 extension, navigated the selected one of two real tabs through the production relay/route, preserved the unrelated tab, and verified real revocation. Chrome does not expose a deterministic same-grant raw-target replacement trigger: explicit debugger detach preserves the raw ID or revokes the grant, so renderer replacement itself is proven by the production owner/backend lifecycle regressions rather than falsely claimed as live. Exact hosted lint, production/test typechecking, safety ratchets, and a fresh independent review are clean. @clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
Co-authored-by: Piyush Jagadish Bag <[email protected]>
…sport Co-authored-by: Piyush Jagadish Bag <[email protected]>
|
The outstanding real-behavior-proof request is now satisfied at exact signed head The isolated real Chromium installed and automatically paired the real MV3 extension through its native host. The test injected one detached-frame error onto the exact actual authenticated-relay-backed Playwright For comparison, observed failing-before evidence was: The full refreshed browser shard passes 2,767 tests. The unrelated failed core lint stripe came from a broken historical main snapshot; the branch now contains the already-landed main repair, and the exact previously failing core stripe passes. All original contributor commits and attribution remain intact; no production code changed for the injected-fault proof. Chrome cannot deterministically force a different raw target for the same grant, so this proof honestly claims an injected real production-boundary detach and real reconnect, not an artificial raw-ID change. @clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
Merged via squash.
|
What Problem This Solves
After a browser action or navigation invalidated its selected raw target, route code inferred a replacement from URL matches, newly listed tabs, or the sole surviving tab. None of those prove that the replacement belongs to the page that executed the operation, so a later action could silently run against an unrelated tab. Renderer detachment could also make a legitimate same-tab navigation retry fail by looking up its stale original raw target.
Why This Change Was Made
The lifecycle owner now supplies target continuity:
Target.getTargetInfofrom the exact acted-onPageafter navigation or interaction.page.goto, after awaited route installation. Revocation during setup fails closed while still removing the exact installed route handler.The public relay target-ID contract, browser profile configuration, and transport protocol remain unchanged.
User Impact
Actions and navigation preserve the selected tab across a legitimate same-owner renderer replacement while unrelated tabs remain untouched. If the tab grant, authenticated extension, relay, or exact operation owner disappears or changes, navigation fails closed rather than silently targeting another tab.
Evidence
original-targetinstead of selecting the proven renderer replacement; the actual HTTP navigation route did not forward relay ownership; and the real shared navigation guard invoked a retained page after access was revoked during awaited route installation. All three now pass.Page.gotoreceived a single injected detached-frame failure, and the unchanged production extension-profile HTTP route recovered through real Playwright disconnect, authenticated relay reconnect/auto-attach, exact owner revalidation, and a genuinely different recoveredPageobject. The selected one of two real browser tabs navigated successfully while the unrelated tab remained untouched; real access revocation also passed.Thanks to @piyushbag for the original contribution.
Closes #103785