Repository navigation
fix(web): preserve Escape focus over closing menus - #578
Conversation
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
|
What The #578 review requests a dependency-specifier repair. PR #578 independent review (Issue #576)Verdict: REQUEST_CHANGES (one required fix; product mechanism itself is sound). Binding
Required findingR1. Release Smoke CI fails because the patch key is exact while the dependency specifier is a range.
Cleared concerns (checked in source)
Optional / unproven
Input ledger
Parent-ownedCurrent CI ("Test", "Test Web", "Test Server 4/8" still in progress at review time), integrated client visual proof, and the separate human merge approval. Nothing here transfers #379 approval. |
|
What R2 requests the fork-owner registration repair on ce1f908. The report below is relayed unchanged. Its explicit low observable effort does not establish the requested MEDIUM review gate; that routing discrepancy remains unresolved and cannot be waived by the useful findings. PR #578 R2 independent whole review (Issue #576)Verdict: REQUEST_CHANGES at head Binding
Required findingF1. The Fork Stack Model check fails on this head.
Cleared (checked myself in source or raw evidence)
Optional / unproven
Input ledger
Commands and hashes I checked
Parent-ownedStatus writes and the review relay, the F1 repair dispatch, the fresh exact-head review after repair, current CI (the rollup still showed Addendum: parent-supplied Fork log and owner inventory (head still
|
|
What Fresh whole R3 Opus5.5 review approves #578 at19ecbbfc20306fdd2f69432968fe83f4aaa91df4. Full report follows unchanged. Independent review is separate from readiness and permission to merge. MEDIUM was explicitly selected; app configuration is verified by the parent's exact read-only child/run metadata, while backend internal effort is not independently attestable. The R2 model self-report alone did not establish a routing failure. PR #578 R3 independent whole review (Issue #576)Verdict: APPROVE at exact head Binding
Required findingsNone. The R2 F1 repair (the only new bytes), checked myself
Whole candidate (unchanged bytes, re-inspected rather than inherited)
Optional / proof limits (carried, not new findings)
Input ledger
Commands and hashes checked
Proof classes:
Current CI at review time (parent-owned disposition)Head
CI is not complete, so this report makes no CI-green claim. Parent-ownedRelaying this report and writing the status, current CI disposition, the integrated real-client before/after images and video (including O1, O3 and O4), and the separate human approval for the #576 main merge. #379 and #575 approvals do not transfer. |
|
What: The real Right Panel now returns keyboard focus after Escape while the pointer remains over its menu. Parent product verification, 20 October 2026, 13:27–13:34 Warsaw:
Steps: focus Add panel surface, press Enter, hover Terminal, press Escape. Real Browser keyboard and pointer events reported Before: menu closes, Additional current control: hover Browser to open its submenu; Escape closes only that submenu, leaving its parent menu open and Browser focused. Clicking the message composer then closes the remaining menu and focuses the composer. No provider was launched and no message sent. Coverage limits: this is the actual web Right Panel, not a desktop-shell/mobile claim or an exhaustive shared-hover-consumer matrix. A separate tooltip attempt did not observe a tooltip opening and establishes no tooltip result. Earlier synthetic browser tests remain separately reported. Native fingerprint's first cancelled run has a newer successful rerun; all current CI jobs, including Test Web, Release Smoke and Fork Stack Model, passed on this head. Local raw observations, artifact SHA256s, exact source/runtime identities and clean status are retained under Requirements and who asked: #576 and the project's UI proof rule require preserving Escape focus and before/after interaction evidence. Before and after screenshots, followed by before and after recordings: Before recording: before.mp4After recording: after.mp4 |
|
What: PR #578 merged into main as User explicitly approved merging PR #578 at reviewed head Merged through the repository-supported squash path with Finalization completed 14:21 Warsaw: verified author task terminal with no pending child runs, closed both task-owned Incognito tabs, stopped the two captured own supervisors, then stopped the four remaining listeners only after confirming exact port-owner cwd. Verified no listeners on 14514/6474/14119/6079 and no processes left in either task worktree. Removed clean candidate Machine record pushed to #379's driver remains at its own frozen de50 checkpoint; #385/#381 implementation and #581 review remain independent. This separate merge is not #379 acceptance or a deployment. Requirements and who asked: The user explicitly approved this exact #578 main merge after review/CI/product proof; repository finalization and machine-record rules require retiring disposable proof resources. |


What: The Escape focus fix merged into main as c3557ef after exact-head review, CI and actual before/after Browser proof.
Why: A late hover-exit event on a closing popup suppressed return focus to its trigger.
So what: This outcome is closed and its isolated proof resources are retired; no deployment or installed-service restart was performed.
Closes #576. Canonical handoff and exact proof bindings. The existing BaseUI native
onFloatingMouseLeaveowner now checks its authoritative open state before publishing another close. This preserves the original focus manager's policies rather than forcing focus from a caller. The pnpm patch covers ESM and CommonJS, binds exactly 1.5.0 in the workspace and lockfile, and changes no dependency version.R2 F1 from the whole review is addressed in
19ecbbfc20306fdd2f69432968fe83f4aaa91df4(treebf300c3aa9f5f1992c9304f2ba82c561e86bfce9), preserving ce1f as its parent. The only correction is the upstream edit allowlist plus a narrowmenu-escape-focusregistry entry owning the manifest, patch and regression test, watching shared lock/workspace refs, and specifying equivalent upstream fix plus dependency-upgrade/unpatched-regression proof before patch retirement. Product, patch, test, manifest and lock bytes are unchanged.Fresh actual
fork-features.mjs check, exact-headfork-check.sh --upstream upstream, scoped format and diff checks pass. Existing upstream/main ise704190e8ce0d15f85e42bc844baad525b2110c1, merge based0918f1659f4c19172796c8d1910ca6e4bc18b51. Prior behavioral, dependency and typecheck evidence is reused only for byte-identical implementation/runtime inputs, verified by hashes. No prior review approval transfers. Parent owns fresh whole review with route-MEDIUM verification, current CI and integrated images/video. O1 submenu-chain and O3 shared hover-consumer effects remain explicit source-inference limits for that real-client pass.R1 from the independent review is addressed in
ce1f908f8fa588c4f8c90b8753e16bda2d7f957f(tree605f2be48cbe6e97859bcba591a682082cef4e70), preservingbc03532f97as its parent. Release Smoke deletes the lockfile before resolution, so the original^1.4.1range could bypass the exact patch and fail withERR_PNPM_UNUSED_PATCH. The correction changes only the manifest specifier to1.5.0and the matching lock importer, with no version upgrade or patch/source/test edit.Fresh frozen offline lock validation, package formatting, web typecheck and exact two-line/runtime-hash invariants pass. An isolated lockless BaseUI/React/patch seam regenerates the correct 1.5.0 patch binding. Full staged offline resolution stopped on uncached
tinypsmetadata through marketing's Astro dependency; complete Release Smoke remains CI-owned. All probes used explicit--ignore-scripts; the earlier patch-commit prepare incident remains in the handoff. Prior 15/15 behavioral red/green and real/fake pointer-over evidence is reused only for unchanged source, test and installed runtime, not presented as a fresh whole-head run or review verdict. Parent owns fresh whole-candidate review, current CI and integrated visual proof.A public Menu fixture opens from an input shortcut, places the real pointer over the popup after opening, closes with Escape, and asserts trigger focus after public close completion. It also covers pointer-away, intentional focus elsewhere during closing, click-open/outside-click, genuine hover dismissal, and keyboard entry plus pointer movement into a focused submenu. Native CSS transition completion drives the oracle; no sleeps, polling, added timeouts, retry loops or assertion weakening. The existing RightPanelTabs keyboard file is untouched, including #575's separate ownership.
Proof on pinned Node 24.13.1/pnpm 11.10.0, BaseUI 1.5.0, React/DOM 19.2.6 and existing task-private Chromium revision1223:
RightPanelTabs.keyboard.browser.test.tsx: 15/15 passed. Command inapps/web:vp test run src/components/ui/menu.focus.browser.test.tsx src/components/RightPanelTabs.keyboard.browser.test.tsx --project browser --reporter verbose.trigger-hover mouseleavenotification disappears.vp fmt --checkandvp lint; webtsc-rs --noEmit; frozen offlinepnpm install --ignore-scripts: passed. Typecheck retains one unrelated pre-existing Effect suggestion, with no errors.Upstream checked independently: T3 main
d36b7da2485bc889b320a285deea181f637d760a, BaseUI masterbf66e3ad88453712acdad9b56f57463e9a2927f4, relevant open/closed Issues and PRs, and complete candidate diffs. BaseUI #3482 previously used this authoritative-open guard in the former hover owner. Merged #4893 and #4906 instead restrict hover-origin behavior and add regression coverage. This patch keeps the installed version's open-menu behavior, with a narrower closed-state guard. T3 #21901 is test isolation, separately owned by #575; #21030/#21118 wait changes are already present.Limits: component/browser proof only, not product acceptance, CI clearance or independent review. Parent owns the later real-client integration pass, before/after images and interaction video, independent different-family review, CI disposition, and merge gate. No full web/repository suite, Browser panel, Device, product server, live userdata, provider, account, deployment or restart was used. React act warnings remain visible in raw runs; the fixture awaits native completion outside act to allow its opening state transition to commit. The exact prior CI pointer sequence remains unknown.
Scope: the shared BaseUI owner applies to web and the desktop renderer, including shortcut and click callers. Mobile's React Native menus, providers, MCP, contracts and transports are unchanged. The current map asserts the T3 client base as live; no tracked part or architecture is added or changed. No version bump. Website/SEO impact: none, an existing focus contract is repaired without changed routes, content or visuals.
Requirements and who asked: User and #576 require existing-menu Escape focus return with actual pointer-over, preserving hover dismissal, submenus, outside focus and separate merge approval.
Deleted: Caller focus override, duplicate wrapper state, dependency upgrade, unrelated hover-origin policy change, pointer parking as repair, longer waits and #379 scope expansion.
Bottleneck: A closed popup publishes late hover-close and overwrites the focus owner's close policy.
Checked myself: Accepted R2 F1, existing registry schema/owner and exact-head fork checks; accepted R1 against release-smoke deletion/resolution, exact version/specifier repair and isolated lockless seam; frozen main/source identities, actual installed ESM/CommonJS owners and versions, public-component red/green plus policy controls, RightPanelTabs real/fake-clock probes, scoped checks and full relevant upstream diffs.
Implemented with GPT-6.1 Sol, MEDIUM effort, through the Codex harness in T3 Code.
Final merge and cleanup record: #578 (comment)