Skip to content

fix: post-merge title bar layout fixes and the tests/cli batch hang - #5936

Merged
lidge-jun merged 2 commits into
devfrom
codex/post-merge-fixes
Sep 26, 2026
Merged

lidge-jun merged 2 commits into
devfrom
codex/post-merge-fixes

Conversation

@lidge-jun

@lidge-jun lidge-jun commented Sep 26, 2026 •

Copy link
Copy Markdown
Owner

Summary

A second review of dev after #5910, #5918 and #5924 landed found three layout defects from the integrated title bar (#5910) and a CI hang that now fails test 4/4 on dev and other PRs.

Desktop title bar (#5910 follow-up)

  • Combos overflowed the desktop window by 40px. The rules that size the 100dvh Combos shell below the quota bar only matched a bar that is a direct child of .main. The desktop shell puts the bar inside .main-top, so the shell kept a full viewport height below the 40px strip. The same rules now key on .main-top, including the ≤760px row-filling rule.
  • The narrow header could be covered while scrolling. At ≤760px, .main-top and .mobile-topbar were both sticky at top: 0 at the same stacking level, so the strip painted over the menu. The strip now scrolls with the page (position: static; z-index: auto), as the quota bar already did there. The mobile header gets the window drag and double-click handlers in the desktop shell, so the window can still be dragged after scrolling. Buttons are excluded from dragging, as before.
  • At high zoom the menu was pushed off screen. The titlebar metrics floored the points-to-CSS ratio at 1. At 300% zoom a 360pt window is 120 CSS pixels wide, but it kept an 80px inset for the traffic lights, so the 44px menu started at x=80. When the page is zoomed in, only the lights' share of the clearance shrinks now (27px inset and 71px clearance at 300%). The row keeps its 40px floor, and zoom-out behavior is unchanged.

CI hang (test 4/4, tests/cli batch)

tests/cli/cli-config-show-client.test.ts ran the CLI with spawnSync. On the hosted Linux runner, a child that stopped responding never returned control to the event loop, even with the 40s spawn timeout. The whole 12-file batch then hit the runner's 120s watchdog (exit 124), and each file passed when run alone. This happened on the dev dispatch run at f32f9aabd7, on #5924's first attempt, and on #5928. The test now uses an async spawn with ignored stdin and its own SIGKILL deadline. A stuck child becomes a named test failure instead of a batch timeout. A new assertion checks that the event loop advances during the spawn; it fails with spawnSync. The Linux trigger itself did not reproduce outside the hosted runner, so this PR's exact-head CI is the evidence.

Reviewed and left alone: after a zero-output reset, a failed native Chat replacement surfaces the original stream error as upstream_sse_error. The Responses post-header path (deferProtocolSafeResetRecovery) does the same, so this is a design question for both paths, not a regression from #5918.

Screenshots

Desktop shell user agent in headless Chrome against this branch's GUI build (throwaway HOME, OPENCODEX_HOME, CODEX_HOME).

Combos at 1280×800: the page no longer overflows (scrollHeight - innerHeight = 0).

Desktop Combos fits under the title strip

700px window after a 400px scroll: the strip has scrolled away (top −347px), the header stays on top, and a hit test at the menu's center lands on the menu.

Narrow desktop window scrolled with the header on top

360pt window at 300% zoom (120 CSS px): the inset is 27px and the menu spans x=27–71.

Menu stays on screen at 300% zoom

Verification

  • gui/tests/app-titlebar.test.tsx: 9 pass. The two new cases (zoom-in clearance, strip and header contract) fail on the previous source.
  • bun run lint:gui, root and gui tsc --noEmit, bun run build:gui, bun run structure:check, bun run privacy:scan: pass.
  • tests/cli batch files in one process: 83 pass locally. The fix author also ran the 12-file batch on a Linux host (155 pass).
  • A plan audit and the post-merge reviews were independent read-only Sol reviews. I did not run the full local suite; exact-head hosted CI is the gate, especially for the test 4/4 hang.

Checklist

  • Scope stays focused and avoids unrelated cleanup.
  • Docs or release notes were updated when needed (no user-facing docs change; plan in devlog/_plan/260926_bug_train_6/030_post_merge_fixes.md).
  • Security-sensitive changes were reviewed for secrets, auth, and unsafe defaults (no auth or credential paths).

Summary by CodeRabbit

  • Bug Fixes
    • Improved Combos workspace sizing in the desktop shell so its content fills the available space below the title bar.
    • On mobile in the desktop app, the top bar now supports window-chrome interactions and no longer sticks over page content.
    • Improved title-bar spacing at high page zoom so its controls remain better positioned while preserving the existing behavior at lower zoom levels.

…ow header usable

Three layout defects from the integrated title bar (#5910), found by a post-merge review:

- The Combos sizing rules matched only a quota bar directly under .main; in the desktop shell the bar sits in .main-top, so the 100dvh shell overflowed the page by the 40px strip. The same rules now key on .main-top.

- At <=760px the sticky .main-top painted over the sticky mobile header while scrolling. It now scrolls with the page (static, z-index auto), and the mobile header carries the window drag handlers so the window stays draggable after scrolling.

- The titlebar metrics floored the points-to-CSS ratio at 1, so at 300% zoom a 360pt window kept an 80px inset and pushed the 44px menu off a 120px viewport. Zoomed in, only the lights share of the clearance shrinks (27px inset at 300%); the row keeps its 40px floor.
Two Linux test 4/4 logs stop after the first config-show child returns; the next synchronous child never yields despite its 40s timeout and the 120s batch watchdog fires. Run the CLI child asynchronously with a separate deadline and explicit stdin policy so a blocked child produces a bounded test failure. Assert that the test event loop advances during config get; this was red with spawnSync and green with spawn.
@lidge-jun
lidge-jun requested a review from Ingwannu as a code owner September 26, 2026 12:39
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-26T12:43:47.913412Z c50638e PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions

Copy link
Copy Markdown
Contributor

✅ Deterministic PR hygiene checks passed.

@github-actions github-actions Bot added the bug Something isn't working label Sep 26, 2026
@coderabbitai

coderabbitai Bot commented Sep 26, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: lidge-jun/opencodex/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 66236a7a-8fae-4c8b-a700-a13954ec9a8a

📥 Commits

Reviewing files that changed from the base of the PR and between f32f9aa and c50638e.

📒 Files selected for processing (6)
  • devlog/_plan/260926_bug_train_6/030_post_merge_fixes.md
  • gui/src/App.tsx
  • gui/src/components/app-titlebar.css
  • gui/src/lib/window-chrome.ts
  • gui/tests/app-titlebar.test.tsx
  • tests/cli/cli-config-show-client.test.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.


📝 Walkthrough

Walkthrough

The pull request updates desktop titlebar layout and zoom metrics, applies window-chrome handlers to the mobile header in the desktop shell, and changes CLI configuration tests to run child processes asynchronously.

Changes

Desktop titlebar behavior

Layer / File(s) Summary
Combos shell layout and mobile header
devlog/_plan/260926_bug_train_6/030_post_merge_fixes.md, gui/src/App.tsx, gui/src/components/app-titlebar.css, gui/tests/app-titlebar.test.tsx
The Combos shell uses viewport-height sizing on desktop and fills the grid’s main row on mobile. The mobile .main-top is static. The mobile header receives window-chrome handlers only in the desktop shell. Tests check the relevant CSS, markup, and sizing declarations.
Zoom-dependent titlebar metrics
gui/src/lib/window-chrome.ts, gui/tests/app-titlebar.test.tsx
When the computed scale is below 1, the light inset uses that scale and chrome clearance is the inset plus 44px. The titlebar height remains at least 40px. A test checks the metrics and menu fit.

Asynchronous CLI configuration tests

Layer / File(s) Summary
Asynchronous child-process test execution
tests/cli/cli-config-show-client.test.ts
The test helper uses spawn to capture output and enforce a deadline. The configuration tests await the helper, and the config get test checks that a timer fires while the child process runs.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Bug fix

Merge Risk: ⚪ Minimal · up to c5063

The changes appear mergeable after normal checks. Rendered layout and the hosted-runner hang fix still need the planned validation.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 3 functions across 4 files. (2 skipped: 2… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately identifies both primary changes: post-merge title bar layout fixes and the CLI test batch hang fix. It is concise and specific enough for the change set.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 3 functions across 4 files. (2 skipped: 2 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c50638e290

ℹ️ 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".

Comment thread gui/src/App.tsx
<header className="mobile-topbar" inert={navOpen}>
{/* At narrow widths the sidebar strip is hidden and the main strip scrolls away, so in
the desktop shell the sticky header is the window's drag surface. */}
<header className="mobile-topbar" inert={navOpen} {...(desktopShell ? windowChromeHandlers() : {})}>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Provide a usable drag target in the narrow desktop header

At widths up to 760px, once .main-top scrolls away, this header is intended to become the desktop window's drag surface, but nearly all of it is occupied by buttons: the menu and action controls are buttons, and the brand is also a button whose flex: 1 1 auto fills the remaining width. windowChromeHandlers() deliberately ignores events originating inside any button, leaving only the 2px gaps and narrow outer padding as draggable targets. In a narrow Tauri window users therefore still have no practical way to drag or double-click-maximize the window after scrolling; reserve an explicit non-interactive drag region or otherwise keep a usable part of the header outside the button elements.

Useful? React with 👍 / 👎.

@lidge-jun
lidge-jun merged commit bb3f3c2 into dev Sep 26, 2026
35 checks passed
@lidge-jun
lidge-jun deleted the codex/post-merge-fixes branch September 26, 2026 12:57
@lidge-jun

Copy link
Copy Markdown
Owner Author

리뷰 · 우선순위 62 / 80

dev에 합쳐진 제목 표시줄(#5910) 뒤를 다시 보니, 화면 버그 세 개와 리눅스 CI 멈춤이 남았습니다. 이 PR이 그걸 고칩니다.

데스크톱 앱에서 Combos 화면은 높이를 창 전체로 잡습니다. 사용량 막대가 그 위에 있으면, 막대만큼 높이를 빼야 페이지가 아래로 안 넘칩니다. 그 계산은 막대가 .main 바로 아래에 있을 때만 동작했습니다. 데스크톱에서는 막대가 .main-top 안에 들어 있어서, 40px만큼 페이지가 넘쳤습니다. 이제는 .main-top이 있을 때도 남은 높이만 씁니다. 창이 760px 이하이면 위 막대와 메뉴 헤더가 둘 다 맨 위에 붙어서, 스크롤하면 막대가 메뉴를 가렸습니다. 막대는 스크롤과 함께 올라가고, 헤더만 위에 남습니다. 페이지를 300%로 키우면 신호등 자리를 80px로 고정해서, 44px 메뉴가 120px 창 밖으로 밀렸습니다. 확대할 때는 신호등이 차지하는 자리만 줄입니다. 300%에서 그 자리는 27px이고, 메뉴까지 합쳐 71px이라 창 안에 들어옵니다.

tests/cli를 한 번에 돌리면 리눅스 CI의 test 4/4가 120초에 죽었습니다. cli-config-show-client.test.ts가 spawnSync로 CLI를 켜는데, 자식이 멈추면 40초 제한이 있어도 테스트의 시간 계산이 같이 멈춥니다. 파일만 따로 돌리면 통과했습니다. 이제는 자식을 비동기로 켜고, 시간을 넘기면 그 자식만 죽입니다. 표준 입력은 닫아 두었습니다. config get 테스트는 자식이 도는 동안 타이머가 움직이는지 확인합니다. spawnSync로 되돌리면 그 확인이 실패합니다.

바탕은 dev입니다. types.ts와 config.ts를 나누는 변경은 아닙니다. 댓글을 쓸 때 test 4/4와 desktop shell을 포함한 검사는 통과해 있었습니다.

라인 - gui/src/App.tsx mobile-topbar (399줄). 좁은 창에서 스크롤하면 .main-top이 사라지므로, 창을 끄는 자리를 메뉴 헤더로 옮겼습니다. 그 헤더는 메뉴 버튼, 홈으로 가는 브랜드 버튼, 끄기·새로고침 버튼으로 가득합니다. 브랜드 버튼은 남는 폭을 다 먹습니다 (styles.css의 .mobile-topbar .brand). windowChromeHandlers는 버튼 위에서는 끌기를 시작하지 않습니다. 남는 곳은 헤더 가장자리와 버튼 사이 몇 픽셀입니다. 스크롤 뒤에 창을 끌거나, 빈 곳을 두 번 눌러 키우는 동작이 없습니다.

라인 - devlog/_plan/260926_bug_train_6/030_post_merge_fixes.md 4번. CI 멈춤의 원인을 다른 작업에서 찾는 중이라고 적혀 있습니다. 고침은 이 PR의 tests/cli/cli-config-show-client.test.ts에 이미 있습니다. 계획을 그대로 두면 고침이 빠진 것으로 읽힙니다.

메인테이너의 판단이 필요한 지점

좁은 데스크톱 헤더에서 창을 끄는 빈 칸을 남길지 정해야 합니다. 브랜드 글자까지 끌기로 쓰면, 홈으로 가는 클릭과 창 이동이 겹칩니다.

너의 추천

넘침, 메뉴가 가려지던 것, 확대 시 신호등 자리, CLI 묶음 멈춤은 이대로 두세요. 머지 전에 헤더 한쪽에 빈 칸을 두고, 그 칸에만 지금 핸들러가 닿게 하세요. 계획 4번은 이 브랜치에서 spawn으로 고쳤다고 한 줄 바꾸면 됩니다.

이 댓글은 grok-bot이 작성했습니다

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant