Repository navigation
fix: keep live terminal chooser inside viewport and clear of tabs - #1917
Conversation
Reproduce right-edge overflow and wrapped-tab occlusion in Chromium. Cover the already-correct no-insertion disarm through the public provider; a scratch fault clears the newer worker hash and is detected by the test. Plan-ID: FU-KR08C-LIVE-PLACEMENT Test-First: src/screens/terminal/TerminalPlacement.browser.mjs::live chooser stays inside viewport and clear of wrapped tabs Co-authored-by: OpenAI gpt-6-astra <noreply@openai.com>
Place the live overlay relative to the full action strip and available viewport space. Keep the empty launcher and shared Popover unchanged. Record real pointer, resize, error-row and public provider evidence. Plan-ID: FU-KR08C-LIVE-PLACEMENT Test-First: src/screens/terminal/TerminalPlacement.browser.mjs::live chooser stays inside viewport and clear of wrapped tabs Co-authored-by: OpenAI gpt-6-astra <noreply@openai.com>
Keep ESLint enabled for the mixed Node and browser fixture. Plan-ID: FU-KR08C-LIVE-PLACEMENT Test-First: src/screens/terminal/TerminalPlacement.browser.mjs::live chooser stays inside viewport and clear of wrapped tabs Co-authored-by: OpenAI gpt-6-astra <noreply@openai.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 384eb4edb9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| | FU-KR08C-LAUNCH-ERROR | Wahrheitsgemäße Startfehler nach Auswahlwechsel und Rückkehr zur leeren Glass-Ansicht | srv-fu-kr08c-launch-error; Stabs disponiert, Root prüft und nimmt ab | KR-08c-2a/#1908 gemergt `0583073a`; Vorgänger 5a2a38f9 | Server | A | Erledigt nach Merge: begrenzte Fehlerzustellung und bewusste Quittierung aus R1908-C2/K1/D2; laufende Startsperre bleibt getrennt | A1–A8: öffentliche App-/Tauri-Mock-Regressionen und inspizierte Browserbelege; unabhängige Reviews/Root-Abnahme ausstehend. D1, C3/D3/D4, weitere Kontexte/Split, native V2-ACC1b, installiert/wirksam, Glass/UAT und Elternabnahme offen | 725df5d4-5cd3-4adb-8217-33fb320eee60; Elternziel 366c57e2-488c-48c1-9405-90b0cf28fab6 bleibt offen | | ||
| | FU-KR08C-LAUNCH-TESTS | Öffentliche Launch-Regressionen: überholte Profilantworten, Fehlerquittierung und Testisolation | srv-fu-kr08c-launch-tests; Stabs disponiert, Root nimmt ab | FU-KR08C-LAUNCH-ERROR/#1911 gemergt `64664930`; Vorgänger 725df5d4 | Server | C | Erledigt nach Merge: ausschließlich Testnachweise T1–T7 und diese Planzeile, kein Laufzeitwechsel | Öffentliche App-/Tauri-Mock-Belege und begrenzte Fehlerproben; Root-Inhaltsprüfung und Abnahme bleiben getrennt. Native, installiert/wirksam, Glass/UAT und Elternabnahme offen | b91adf60-7fa0-4e1f-bfc7-4535726caff9; Elternziel 366c57e2-488c-48c1-9405-90b0cf28fab6 bleibt offen | | ||
| | KR-08c-2b-LIVE | Expliziter Profilstart neben einem laufenden Glass-Terminaltab | srv-kr-08c-2b-live; Stabs disponiert, Root prüft und nimmt ab | FU-KR08C-LAUNCH-TESTS/#1913 gemergt `f0603143`; Vorgänger b91adf60 | Server | A | Nachbesserung R1915-NB1: LIVE-Menü als Overlay, laufender Neustart erhalten; letzter Delta-Review/Root-Abnahme offen | L1–L8: öffentliche App-/Tauri-Mock-Tests, begrenzte Browserbilder und Fokusbelege; unabhängige Reviews und Root-Abnahme getrennt. RESTORE, KR-08d/Split, D1, native/installiert/wirksam, Glass/UAT und Elternabnahme offen | 251d1fa7-961a-421a-b7ae-ffaacb425f6b; Elternziel 366c57e2-488c-48c1-9405-90b0cf28fab6 bleibt offen | | ||
| | FU-KR08C-LIVE-PLACEMENT | Live-Profilwahl im Sichtbereich und außerhalb umgebrochener Tab-Steuerung halten | srv-fu-kr08c-live-placement; Root prüft und nimmt ab | KR-08c-2b-LIVE/#1915 gemergt `5c15cdde`; Vorgänger 251d1fa7 | Server | B | Erledigt nach Merge: terminal-lokale Overlay-Platzierung und öffentlicher Nachweis zum entschärften Launch-Snapshot ohne Einfügung | P1–P6: echte Chromium-Rechtecke/Bilder und Route-/Provider-Regression; zwei unabhängige Reviews und Root-Abnahme ausstehend. RESTORE, Split, D1, beendete Tabs, native/installiert/wirksam, Glass/UAT und Elternabnahme offen | a476a3ad-787a-4b4f-a66f-9b71bf694c25; Elternziel 366c57e2-488c-48c1-9405-90b0cf28fab6 bleibt offen | |
There was a problem hiding this comment.
Aktualisiere die eigene Planzeile auf den abgenommenen Stand
Die neue Paketzeile bezeichnet zwei unabhängige Reviews und die Root-Abnahme weiterhin als „ausstehend“, obwohl der Bericht dieses Commits unter „Root review disposition and acceptance“ drei abgeschlossene Fremdfamilien-Reviews und die Annahme von P1–P6 am Kopf 384eb4ed dokumentiert. Damit hinterlässt der Merge im einzigen verbindlichen Plan bereits erledigte Prüfschritte als offene Restpflichten. Bitte übernimm die belegten Review- und Abnahmeergebnisse in diese eigene Paketzeile; die ausdrücklich offenen Eltern-, Native- und UAT-Abnahmen bleiben davon unberührt. Der vorgeschriebene Plan-ID-Abgleich gilt auch für diese Zeile.
AGENTS.md reference: AGENTS.md:L74-L76
Useful? React with 👍 / 👎.
|
Root acceptance (INTEGRIEREN), head |
|
@Mergifyio queue |
Merge Queue Status
This pull request spent 27 minutes 38 seconds in the queue, including 26 minutes 59 seconds running CI. Required conditions to merge
|
Merge origin/main (be8b703, #1917) to resolve the real PLAN.md conflict at the KR-08c-2b-LIVE / FU-KR08C-LIVE-PLACEMENT rows; both rows are kept. Correct the V2-REST rows: own status after merge, #1917 merged with its actual SHA, RESTORE next on a fresh base, exited-tab eligibility as a separate residual, KR-07a parking kept in the 07a-11c-11d chain, GI05 runs independently of RESTORE. Record the bounded Root acceptance of #1915 and #1917 and the GI05 answer versus the accepted conservative cut. Plan-ID: V2-REST-PLAN-PFLEGEN No-Test: docs-only plan correction, no runtime or test change Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Die Live-Profilwahl bleibt in den geprüften Fenstergrößen sichtbar und verdeckt keine Tabs oder Schließen-Schaltflächen. Die Bedienung des Menüs verändert die laufende Terminalgröße nicht, und ein neuer Test schützt ausstehende Worker-Aufrufe nach einem fehlgeschlagenen Start. Die Lieferung steht als Entwurf für zwei unabhängige Reviews und die Abnahme durch Root bereit.
Report
PR: #1917 — OPEN, DRAFT, exact HEAD verified with
gh pr view 1917 --json url,isDraft,state,headRefOid,baseRefName,headRefName,labels(exit 0); no labels.gh pr create --draftexited 0.Package / Plan-ID: FU-KR08C-LIVE-PLACEMENT. Operator: UMSETZEN. Owner:
srv-fu-kr08c-live-placement. Ticket:a476a3ad-787a-4b4f-a66f-9b71bf694c25. Parent366c57e2-488c-48c1-9405-90b0cf28fab6remains open.5c15cddeccf6e0ab8333f2c72326cc94223c263e.384eb4edb94a0705c67729680b1073cee7430830.codex/fu-kr08c-live-placement.gpt-6-astra, efforthigh, observed in this worker's native header andturn_contextat2026-10-26T00:44:59.776Z.git diff --numstat 5c15cdde...HEAD. Initial forecast was approximately 280; no size exception.lage-jetztmirror was unavailable; live GitHub, git, job and process evidence was used. Only this identified author CLI was observed during the heavy-phase guards, with an exclusive existing build target, load below 8 and available memory above 3500 MiB.Change and boundaries.
TerminalLauncher.tsx:35measures the complete action strip when the live chooser opens, chooses available space below or above that strip, clamps horizontal placement and height, and tracks strip/viewport movement until closing. Four scoped CSS lines apply the fixed overlay only inside live actions. The empty launcher retains its existing placement.TerminalPlacement.browser.mjs:10is a committed Node test using installed Vite and Chromium, real public UI actions, and the existing rich Tauri boundary fixture; its finite server and browser close infinally.TerminalRoute.test.tsx:962adds C1 through the real provider and a visible publicopenAdHocconsumer.docs/PLAN.md:260is the only documentation change. Shared Popover/useFlip, provider, reducer, App, mock, IPC and native sources are unchanged. No dependency or license additions.RED versus fault probe. Before production edits, the new geometry test executed successfully as a browser fixture against exact BASE production and failed on actual assertions: right edge
1123.28125 > 1100, and, in the separately ordered short case, panel/tab intersection. These were assertion failures, not imports, browser setup or missing-test failures. The final test was also replayed with the two changed production files restored temporarily from BASE, then restored byte-for-byte to the candidate: it failed again at the right edge. BASE images below bind to those BASE production files; HEAD images were captured by the canonical test runs on final HEAD. The canonicalred-first.shseparately reports the new file as missing on merge-base and green on HEAD; that missing-file result is not presented as the observed geometry RED.C1 is an already-correct BASE behavior, not a newly discovered runtime bug. Its normal run exited 0. An uncommitted, backed-up scratch fault removed only
if (!launchPending) launchSessions.current = null;; the same test exited 1 because#/leitstand/terminal?worker=twobecame#/leitstand/terminal. The source was restored unconditionally and matches its backup SHA2567fbfa28434ead8a0f650729720462f6eee16f2c2902783fc7536996e9c2534c0. Deferred rejection and lookup requests settle in unconditional cleanup, retained error acknowledgement is public, and original/cleanup diagnostics use the existing aggregate-error helper. No Test-First claim is made for C1; commit trailers name only the geometry test.Commands and observed raw exits. All commands ran in the assigned worktree. Full prepush and the normal push hook identify final HEAD
384eb4ed; the tree is clean.bash scripts/sync.sh startnpm run dev:start-checknode --test src/screens/terminal/TerminalPlacement.browser.mjswith BASE productionnpx vitest run src/screens/terminal/TerminalRoute.test.tsx -t 'disarms a settled launch'npx vitest run src/screens/terminal/TerminalRoute.test.tsx src/sessions/SessionProvider.test.tsx src/sessions/sessionReducer.test.tsnode --test src/screens/terminal/TerminalPlacement.browser.mjswith candidatenpm run lintbash scripts/ci/secret-scan.shand normal commit hooks, each commitbash scripts/ci/gates.sh lane prepush, initial candidate.mjsexecution globals; corrected in384eb4ed, without changing lint configuration or assertionsbash scripts/ci/gates.sh lane prepush, final HEADPLACEMENT_CAPTURE=.pa/placement-head bash scripts/ci/red-first.sh, final HEADgit push -u origin codex/fu-kr08c-live-placementgit ls-remote origin codex/fu-kr08c-live-placement384eb4edb94a0705c67729680b1073cee7430830Browser observations. Actual viewports are 1100×720, 760×520 and 760×260. Each capture has six tabs, all labelled
Claude, selected sessionses-adhoc-6, route#/leitstand/terminal, themesystem/light, variantglas, reduced motion enabled. Setup uses six real public launches and waits for the selected xterm viewer/fonts and scheduled fits before taking baselines. The boundary observer records allresize_ptycalls and arguments and forwards the original invocation/result unchanged. The visible terminal error transcript is existing fixture content, not a failing test run.Coordinates below are
(x, y, width, height)in CSS pixels. Full rects, labels and invocation arrays are retained in.pa/placement-base-final.logand.pa/placement-red-first-final.log; the initial 760×260 BASE collision is also recorded in the worker tool transcript and inspected image.(803.28125,157.796875,320,280); right 1123.28125(600.28125,160.796875,320,280); right 920.28125(248.28125,110.796875,839.71875,42)(248.28125,164.796875,839.71875,543.203125)(348.859375,208.796875,320,280)(145.859375,208.796875,320,280)(231.859375,110.796875,516.140625,90)(231.859375,212.796875,516.140625,295.203125)(348.859375,0.796875,320,156); genuinely flipped above trigger into tabs(145.859375,8,320,94.796875); above whole strip, bottom 102.796875(231.859375,110.796875,516.140625,90)(231.859375,212.796875,516.140625,35.203125)At 1100 width, tab rectangles start at x=
253.28125 + 70*ifor i=0…5, y=115.796875, size 66×32; close is(686.28125,115.796875,105,32). At 760 width, tabs start at x=236.859375 + 70*i, same y/size; close wraps to(231.859375,166.796875,105,32). Every measured HEAD panel is disjoint from every tab/close rectangle. The 760×260 panel scrolls internally because only 94.796875 pixels fit above the strip; actual cancel and Escape interactions still pass. No claim extends to all possible heights, zoom factors or browser engines.Observed total resize counts at HEAD: 760×260 13→13, 760×520 14→14, 1100×720 15→15 for opening, and unchanged after each cancel, Escape and outside dismissal. The first 12 calls belong to the six setup viewer mounts; viewport changes are outside chooser-only baselines. Strip/viewer rects are deeply equal before/open/after each dismissal. Cancel and Escape return focus to the public trigger. Actual pointer clicks with the chooser open select the second tab and close it; the sole kill is exactly
{sessionId:"ses-adhoc-2"}. Attaching then closing workerw1while the chooser is open leaves that kill list unchanged. Deliberate selection/remount is measured separately: 16→18 calls. A freshlaunchFailure=1document attaches a worker before its first spawn; error opening leaves count 0→0 and the viewer unchanged, while closing exposes the accepted alert row and produces exactly 0→1, strip height 42→73.5 and viewer height 543.203125→511.703125. Reopening publicly acknowledges the error.Inspected images. All six images were inspected after final capture; full panels and controls were checked. Artifacts are untracked evidence, not substitutes for the committed browser regression. SHA256:
.pa/placement-base/1100x720.png0e35543efa4ff8fa10d43c1d382a0e036f82046250252e6965837fc181c08b8c.pa/placement-base/760x520.png932f8706dc611dffa861dc166ab28c436e6e6cad3ea8f07ad8968ff81ed4dc5e.pa/placement-base/760x260.png696882cfcf96d27a55286a728a99246c10708955b357bbc65b3f8520edcfea3e.pa/placement-head/1100x720.pnga39f67014c0da399be4a2ec778c7974c607ec14b5fd983dd897d0f3d4e97bdc7.pa/placement-head/760x520.pngddde2782c6492b0eb717f258d794a4d746262012ad2b69fc883d86708bafd5c5.pa/placement-head/760x260.png03f01c6602600a66c219b1b7eaed8edf528eb9370313799d4b87d6f25322844fP1 — viewport fit
Disposition: evidenced in the table, inspected captures, real browser test and preserved route suite. BASE right-edge overflow is red; HEAD is inside. Enabled-profile filtering remains covered by the literal-payload public route tests; the fresh browser failure remains truthful.
P2 — wrapped controls and flip
Disposition: evidenced at 760×520 and 760×260. The latter reaches upward placement through real geometry on both BASE and HEAD; no side flag or geometry is faked. HEAD positions above the entire strip. Shared code is unchanged. Other viewport/zoom/engine combinations remain unproven; the extremely short case uses internal panel scrolling.
P3 — zero chooser resize and usable clicks
Disposition: evidenced by all-call snapshots, deep rect equality, real Playwright pointer actions and literal kill arguments. Separate remount and alert-row counts are above. Focus measurements cover the public cancel/Escape trigger behavior only.
P4 — public no-insertion disarm regression
Disposition: evidenced by
TerminalRoute.test.tsx:962, the normal green test and scratch-fault red result. The mounted route preservesworker=twothrough unrelated insertion and displays its eventual explicit result. No route implementation change remains.P5 — real RED and preserved lifecycle
Disposition: evidenced by the manual actual-geometry RED, canonical final-head green, 68 targeted scenarios and full frontend suite. C4 explicit restart, shared pending and retained error scenarios remain unchanged. The 350 ms browser quiescence wait allows scheduled fits before measurements; no test timeout/retry/skip setting was changed. The initial lint failure was corrected by declarations/imports only.
P6 — bounded reviewed delivery
Disposition: implementation and evidence delivered at 245 RAW; normal push verified; this PR is a DRAFT. Root owns reviews, acceptance and Mergify. No reviewer/team/QA worker was started here. Parent and the listed broader acceptance duties remain open; predecessor #1915 is not reopened.
Architecture drift: gate passes; no allowlist changes or new native/API method.
Review: abgeschlossen (Stufe B), drei Fremdfamilien-Reviews am Kopf
384eb4ed; Disposition und Root-Abnahme unten.NICHT ABGEDECKT
#[cfg(windows)]tests, including run_in_pty, npm_shim, ConPTY and DPAPI, or Windows clippy arms. The Windows lane runs in the merge queue.Next owner: Root, through the existing checked Stabs handover chain, for two family reviews and acceptance. Local report and evidence are retained; no history rewrite, new installation, release or service change was performed.
Root review disposition and acceptance (2026-10-26, head
384eb4edb94a0705c67729680b1073cee7430830)Tier B (TS/CSS, tests, own PLAN row; no seam). Author family OpenAI (Codex gpt-6-astra). Reviews bound to head 384eb4e:
claude-opus-5-5[1m](PC subagent, read-only)kimi-code/k3(PC, wire.jsonl of sessionsession_8dc2545a-24d2-495f-9101-a1c19e8066bc)claude-sonnet-5-5(server jobsrv-review-pr1917-claude-0216, report~/pa-orch/reports/review-pr1917-claude.md)No high finding. Disposition (acceptance lines quoted from the brief before any follow-up):
TerminalPlacement.browser.mjsruns in no gate lane after merge (gates.sh,vitest.config.ts:26,playwright.config.ts:4)linux_2next tohq-visual(scripts/ci/gates.sh:197,package.json).KR-08c-2b-LIVE) still says "Delta-Review/Root-Abnahme offen", #1915 merged5c15cddeTerminalLauncher.tsx:49), add header/sidebar rects to the test. Acceptance P1 "inside the viewport at the right edge" and P2 "clear of wrapped tabs and close" hold; Root inspected the captures (below).window.innerWidth, which includes a classic scrollbardocumentElement.clientWidthposition: fixeddepends on no ancestor containing block (transform/filter/backdrop-filter)NICHT ABGEDECKT (added by Root after review):
src/screens/terminal/TerminalPlacement.browser.mjsafter merge; it ran only in this PR's red-first job and in the reviewers' runs (R1917-A1). Follow-up FU-1917-GATE-ALIGN.glasand reduced motion and settles with a fixed 350 ms wait; animated closing, dark mode and the variantsklar/abend/nebelare not exercised (R1917-T1).Root checks: the six capture hashes in the table above match
sha256sumoffu182-browser-evidence.tgzon the server and locally (2026-10-26 01:25Z). Root inspected the three HEAD captures: 1100×720 panel below the strip, right edge inside the viewport; 760×520 panel below the wrapped strip, clear of tabs and close, overlapping the sidebar edge; 760×260 panel flipped above the strip at 95 px height, scrolling internally. Codex connector comments on this head: none. PLAN row 260 present. Acceptance: P1–P6 met at head 384eb4e; integration continues with ready, CI on head,review-okbound to 384eb4e and@Mergifyio queue.