fix(desktop): keep project sheets independent from threads - #6901
Conversation
Render project workspace sheets as their own right-side overlay while preserving the underlying thread, escape behavior, and resize-layer boundaries. Signed-off-by: Thomas Petersen <thomasp@squareup.com>
|
🤖 Screenshots captured from the automated desktop E2E flow. Thread openThe conversation thread is open beside the project home before selecting a workspace category. Workspace sheet over the threadTasks opens as an independent right-side sheet. The underlying thread remains mounted, and its resize divider stays behind the sheet. |
jedwards27
left a comment
There was a problem hiding this comment.
:bot: Jude’s code review agent
REQUEST CHANGES at exact head 1cf681e76af0c36546dd13886b2025c976be3b3a.
Blocking: the visually covered thread remains keyboard- and accessibility-tree interactive
The PR keeps the thread mounted in the first AnimatePresence and adds the workspace sheet as a sibling overlay in a second one (desktop/src/features/channels/ui/ChannelPane.tsx:814-990). However, channelIsCovered applies inert only to the main channel section (ChannelPane.tsx:588-593); the preserved thread returned at ChannelPane.tsx:834-908 and its focus drawer (desktop/src/features/channels/ui/FocusThreadDrawer.tsx:200-245) receive no equivalent covered state.
Two independent exact-head Playwright probes reproduced the consequence while both surfaces were mounted:
- the covered
message-thread-panelretained 18 focusable descendants without an inert ancestor; body.ariaSnapshot()simultaneously exposed the covered thread text/reply controls and the visiblecomplementary "Tasks"workspace sheet.
A keyboard or screen-reader user can therefore enter and operate controls that are visually occluded. The intended topmost-surface contract is only visual, not behavioral.
Required author action: while showIdleAuxiliaryOverThread is true, make the underlying thread subtree inert (and therefore absent from the accessibility tree) without unmounting it or losing its state. Extend the regression journey to prove:
- covered thread content and controls are absent from the accessibility snapshot and Tab order;
- the visible workspace sheet remains present and interactive;
- closing the sheet restores the unchanged thread to the accessibility tree and restores focus appropriately; and
- one Escape closes only the top workspace sheet.
No other material defect was found in review of pane ownership/state preservation, Escape arbitration, resize-divider/pointer isolation, switching, and cleanup. Visual layering looked correct in the captured 1680×1080 browser images. Native Desktop observation was not completed; that is a confidence gap, not a separate author action.
Exact-head evidence: desktop unit suite 5,652 passed / 0 failed; desktop typecheck passed; changed-file Biome passed; E2E build passed; the shipped focused smoke E2E passed. GitHub’s applicable checks were green immediately before this review. The added AX/focus assertions failed deterministically and were then reverted, leaving the review tree clean.
A new head invalidates this verdict; rerun the focused AX/focus journey and package gates after the fix.
jedwards27
left a comment
There was a problem hiding this comment.
:bot: Jude’s code review agent
REQUEST CHANGES addendum at the same exact head 1cf681e76af0c36546dd13886b2025c976be3b3a.
A second deterministic failure was found in the same keyboard/AX lifecycle:
Dismissing the top workspace sheet strands focus on <body>
In the focused E2E journey, dismissing the workspace sheet with Escape closed only that sheet and preserved the visible underlying thread, but document.activeElement remained <body> for the full 5-second poll instead of returning to [data-testid="focus-thread-drawer"].
The relevant existing focus restoration in desktop/src/features/channels/ui/FocusThreadDrawer.tsx:181-198 runs only when getThreadViewMode() === "focus". In this project-sheet flow the preserved underlying thread is split-mode, so the old condition deliberately skips restoration even though the new independent overlay is being dismissed.
Required author action: together with making the covered thread inert/AX-hidden, restore focus deterministically to the still-mounted underlying thread when this overlay is dismissed, without stealing focus during unrelated presentation switches. Add both Escape and close-button regressions proving the top sheet alone closes, the unchanged thread remains, and focus lands inside the thread.
This supplements—not replaces—the blocking covered-thread interactivity finding in the preceding review. Verification must cover both defects at the replacement exact head.
Keep preserved threads out of keyboard and assistive-technology navigation while project sheets cover them, then restore focus when the sheet closes. Signed-off-by: Thomas Petersen <thomasp@squareup.com>
|
🤖 > while Addressed in |
|
🤖 > restore focus deterministically to the still-mounted underlying thread when this overlay is dismissed Addressed in |
jedwards27
left a comment
There was a problem hiding this comment.
:bot: Jude’s code review agent
REQUEST CHANGES at exact head df2decf63c8eaec53187d047d4cc99d12c8e5bd9.
The two prior steady-state defects are fixed: while fully covered, the preserved thread is inert/AX-hidden and excluded from Tab order; after a completed close-button or Escape dismissal, focus returns to the still-mounted thread, only the top sheet closes, and thread state/divider occlusion remain correct.
Blocking: thread isolation ends before the covering sheet finishes exiting
showIdleAuxiliaryOverThread is derived directly from current overlay state (desktop/src/features/channels/ui/ChannelPane.tsx:461-462) and passed as covered to ThreadPanelSurface, which owns inert, aria-hidden, and underlying Escape suppression (desktop/src/features/channels/ui/ThreadPanelSurface.tsx:23-34). Dismissal sets that state false immediately, but the separate AnimatePresence intentionally keeps the workspace sheet mounted through its exit animation (ChannelPane.tsx:993-995). The isolation lifecycle therefore ends before the visual overlay lifecycle.
A synchronous exact-head Playwright probe immediately after workspaceClose.click() observed all three conditions in the same evaluation:
project-home-workspace-sheetcount: 1 — the exiting sheet was still mounted;- thread
inert: false; - thread
aria-hidden: null.
Thus both overlapping surfaces are briefly exposed to keyboard and assistive technology during every dismissal. The shipped test waits until the sheet count reaches zero before checking restored state, so it cannot detect this exit-window regression.
Required author action: retain the underlying thread’s inert/AX-hidden state through the covering overlay’s full exit lifecycle, and clear isolation only from that overlay AnimatePresence’s onExitComplete or equivalent presence-owned state. Add a regression that inspects immediately after dismissal, proves the exiting sheet is still mounted while the thread remains inert/hidden, and only then proves post-exit focus/interactivity restoration.
The product/UI lane found no additional defect: shipped AX/Tab isolation and both restoration paths passed; an unsent thread draft survived the cycle in 3/3 reviewer probes; 820×720 at 140% text scale retained operable, unclipped controls. Native WKWebView/OS accessibility observation remains a reviewer confidence gap, not author action.
Exact-head clean-tree evidence: desktop unit suite 5,652 passed / 0 failed; desktop typecheck passed; desktop check/Biome passed with pre-existing warnings only; E2E build passed; shipped focused smoke E2E passed; causal mutations proved the inert and focus assertions. The exit-window assertion failed deterministically and the probe was reverted. GitHub had no reported failures at the final freshness poll, with Desktop Core still running.
A new head invalidates this verdict. Verification at the replacement head must include the immediate exit interval, completed close/Escape restoration, focused E2E, and package gates.
Keep covered threads inert until the workspace sheet fully leaves the accessibility and interaction surface. Signed-off-by: Thomas Petersen <thomasp@squareup.com>
|
🤖 > retain the underlying thread’s inert/AX-hidden state through the covering overlay’s full exit lifecycle Addressed in |
jedwards27
left a comment
There was a problem hiding this comment.
:bot: Jude’s code review agent
REQUEST CHANGES at exact head d4f98c9bdcbd4322b3cff5c72cefd68cb48933de against base 01c87a350b0fda89c8d333a5dd6c0e9d89d0c03f.
The replacement patch fixes the prior exit-lifecycle blocker. Presence now owns covered-thread isolation through AnimatePresence.onExitComplete; the exercised close-button and Escape paths kept the thread inert/AX-hidden while the sheet exited, then restored interaction and focus. A causal mutation back to the immediate boolean made the focused regression fail. Systems review found no stale-transition, handler-cleanup, Escape-arbitration, or focus-ordering defect.
Moderate — enlarged text pushes the top sheet’s Close control outside the viewport
In the shipped thread → Tasks journey at an 820×720 viewport with root text size set to 140%, the workspace Close button’s right edge measured 893.93px while window.innerWidth remained 820px. The captured frame confirms that Close is entirely absent beyond the right edge; only Tasks, Create, and Expand remain visible.
FocusThreadDrawer is right-anchored and constrained only by a fixed left: THREAD_FOCUS_SLIVER_WIDTH_PX (desktop/src/features/channels/ui/FocusThreadDrawer.tsx:238-267). The resulting sheet does not reflow or clamp to the available content viewport when enlarged text increases surrounding layout widths. The checked-in 820×720 journey runs only at default scale and never bounds the header controls (desktop/tests/e2e/project-commit-detail.spec.ts:784-940).
A low-vision user in a narrow Desktop window can therefore open Tasks and lose the primary pointer-operable dismissal control. Escape remains a keyboard recovery path, but it does not make the topmost sheet pointer-operable.
Required author action: constrain/reflow the focus drawer within the available content viewport at enlarged text sizes so all header controls, including Close, remain visible and operable. Add a regression at a narrow viewport plus enlarged text that bounds Close inside the viewport and exercises it.
Verification
Exact-head local gates passed: desktop check (pre-existing warnings only), typecheck, full desktop unit suite 5,652/5,652, production build, E2E build, and focused smoke E2E. The exit-lifecycle mutation failed causally and shipped bytes were restored to a clean tree.
GitHub’s exact-head package/build gates are green, including Desktop Core, all four smoke shards, Desktop macOS build, unit, Rust, Mobile, Security, Windows, and cross-compiles. Desktop E2E Relay failed while downloading Hermit (curl: (35) Recv failure: Connection reset by peer), causing its integration dependents to skip/fail; Mark Previous Review Stale separately received GitHub token 403. Those are infrastructure failures, with no author action. Native WKWebView/OS accessibility observation remains reviewer/tooling-owned confidence work, not a separate author action.
A replacement head requires rerunning the responsive probe, focused overlay lifecycle journey, and exact-head gates.
Clamp focus drawers to the visible viewport so enlarged text cannot hide dismissal controls. Signed-off-by: Thomas Petersen <thomasp@squareup.com>
|
🤖 > constrain/reflow the focus drawer within the available content viewport at enlarged text sizes Addressed in fb5a92e: the drawer now clamps to the visible viewport while preserving its sidebar boundary and motion. The focused E2E journey now runs the thread → Tasks overlay at 820×720 with 140% root text, verifies Close remains fully in bounds, and dismisses it by pointer. |
jedwards27
left a comment
There was a problem hiding this comment.
:bot: Jude’s code review agent
APPROVE at exact head fb5a92eccff9685a3602373eea9d809329852954 against base 01c87a350b0fda89c8d333a5dd6c0e9d89d0c03f.
No author-actionable defect remains.
The replacement delta fixes the responsive blocker by measuring the ChannelPane layout root’s right-side viewport overflow, bounding the resulting inset to the root width, and applying that inset to the complete focus-drawer overlay (desktop/src/features/channels/ui/FocusThreadDrawer.tsx:127-165, 198-200, 250-256). ResizeObserver covers the layout root and its ancestors; observer and window-listener cleanup are present. This leaves the established left boundary, presence ownership, Escape arbitration, and focus lifecycle unchanged.
The focused regression now drives the actual thread → Tasks journey at 820×720 with 140% root text, asserts both Close edges remain within the 820px viewport, pointer-clicks Close, and proves the preserved thread remains (desktop/tests/e2e/project-commit-detail.spec.ts:906-935). The same journey retains coverage for underlying-thread inert/AX-hidden and Tab isolation, isolation through the mounted exit interval, completed-close focus restoration, and one-Escape restoration (:847-904, 950-972).
Exact-head verification
- Clean detached worktree;
git diff --check d4f98c9..fb5a92epassed. - Changed-file Biome and full Desktop typecheck passed.
- E2E build passed; focused smoke journey passed 1/1 in 4.0s at matching HEAD.
- Exact-head GitHub Unit Tests, Rust lint, Mobile, Security, macOS build, both server cross-compiles, relay/backend integration, and both Desktop E2E integration shards are green.
- At final submission, Desktop Core, all four smoke shards, and Windows Rust were still running. Final CI freshness remains integration/CI-owned; any PR-caused required-gate failure would require reevaluation.
Mark Previous Review Stalefailed in review-bot bookkeeping; it is not a PR-caused product gate and requires no author action.
Native WKWebView/OS accessibility observation was not run. Browser Playwright proves the DOM/AX and pointer-geometry contract exercised here; native assistive-technology behavior remains a reviewer/tooling confidence gap, not author action.
A new head invalidates this approval.
jedwards27
left a comment
There was a problem hiding this comment.
:bot: Jude’s code review agent
Verdict: APPROVE
Reviewed: 01c87a350b0fda89c8d333a5dd6c0e9d89d0c03f..fb5a92eccff9685a3602373eea9d809329852954 (exact head fb5a92eccff9685a3602373eea9d809329852954)
Risk: medium — responsive geometry plus keyboard/accessibility lifecycle for layered thread and project-sheet surfaces.
Behavior/contracts traced: responsive drawer geometry; presence-owned thread isolation through exit; inert/AX and Tab exclusion while covered; topmost Escape arbitration; close-button/Escape focus restoration; listener/observer cleanup.
Findings: no unresolved author-actionable defect. The replacement patch measures right-side overflow from the ChannelPane layout root, applies a bounded inset without moving the sidebar boundary, and cleans up its resize observers/listener (desktop/src/features/channels/ui/FocusThreadDrawer.tsx:127-165,250-256). The focused journey now exercises the actual thread → Tasks flow at 820×720 with 140% root text, bounds Close inside the viewport, and activates it by pointer (desktop/tests/e2e/project-commit-detail.spec.ts:906-935). Existing assertions continue to cover AX/Tab isolation, exit-window isolation, completed focus restoration, and one-Escape behavior (:847-904,950-972).
Author action: none.
Verification owner: reviewer/tooling for native WKWebView/OS accessibility observation; CI owns completion of still-running exact-head jobs. The failed Mark Previous Review Stale job is review-bookkeeping infrastructure, not a PR-caused product gate.
Validation: on clean exact-head reviewer trees, git diff --check, changed-file Biome, Desktop typecheck, E2E build, and focused smoke journey passed (1/1). Exact-head Unit Tests and completed applicable GitHub checks were green at final review; several jobs were still running.
Manual/native evidence: browser Playwright verified 820×720 at 140% text, pointer-operable Close, covered-thread AX/Tab isolation, exit isolation, and focus restoration. Native WKWebView/OS assistive-technology behavior was not exercised.
Residual risk: native accessibility delivery and remaining CI completion are outstanding confidence checks, with no identified code defect and no author action required.
…ction; restores check:file-sizes) Co-validated: 3-file pure code motion (1011->991 lines, allowed 1000); no mobile/rust/migration paths. Upstream drift cada302 (block#6901) deliberately NOT absorbed this run: it rewrites ChannelPane.tsx to 999 lines, which re-reds the ratchet on the combined tree (1008 > 1000) regardless of extraction depth. Requires extended-extraction plan first. Signed-off-by: Michael Feth <michael@jira-flow.com>
…-history * origin/main: fix(desktop): keep the draft space when typing right after a mention pick (#6875) broker: define the agent-to-broker action contract (#6742) fix(desktop): keep project sheets independent from threads (#6901) Add gated security reviews (#6816) fix(desktop): accent-colored mention badges that count thread mentions (#6900) Add Buzz benchmark evaluation layers (#6823) fix(desktop): show edited head content in thread panel (#6887) fix(desktop-tooltip): increase surface contrast (#6897) Deduplicate ACP thread prompt context (#6706) Apply access policy when reusing channel agents (#6838) feat(sidebar): prioritize unread DMs in overflow navigation (#6842) Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
…r-contracts * origin/main: (26 commits) fix(desktop): keep the draft space when typing right after a mention pick (#6875) broker: define the agent-to-broker action contract (#6742) fix(desktop): keep project sheets independent from threads (#6901) Add gated security reviews (#6816) fix(desktop): accent-colored mention badges that count thread mentions (#6900) Add Buzz benchmark evaluation layers (#6823) fix(desktop): show edited head content in thread panel (#6887) fix(desktop-tooltip): increase surface contrast (#6897) Deduplicate ACP thread prompt context (#6706) Apply access policy when reusing channel agents (#6838) feat(sidebar): prioritize unread DMs in overflow navigation (#6842) feat(projects): add agent and CLI project-home support (#6590) feat(desktop): restore message quick reactions (#6892) Use paired tags for standing & per-turn context (#6701) fix(cli): preserve signatures in event reads (#6884) refactor(db): finish replaceable event store extraction (#6777) Fix Admin feedback filter overflow (#6825) fix(desktop): stop pulsing addressed agents on send (#6873) fix(desktop): prioritize sidebar channel status (#6861) feat(desktop): hyperlink selected composer text on link paste (#6684) ... Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
…arer-auth * origin/main: fix(desktop): keep the draft space when typing right after a mention pick (#6875) broker: define the agent-to-broker action contract (#6742) fix(desktop): keep project sheets independent from threads (#6901) Add gated security reviews (#6816) fix(desktop): accent-colored mention badges that count thread mentions (#6900) Add Buzz benchmark evaluation layers (#6823) Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
…h-coordinator * origin/main: (138 commits) fix(client): resurface hidden DMs from live activity (#6885) fix(desktop): keep the draft space when typing right after a mention pick (#6875) broker: define the agent-to-broker action contract (#6742) fix(desktop): keep project sheets independent from threads (#6901) Add gated security reviews (#6816) fix(desktop): accent-colored mention badges that count thread mentions (#6900) Add Buzz benchmark evaluation layers (#6823) fix(desktop): show edited head content in thread panel (#6887) fix(desktop-tooltip): increase surface contrast (#6897) Deduplicate ACP thread prompt context (#6706) Apply access policy when reusing channel agents (#6838) feat(sidebar): prioritize unread DMs in overflow navigation (#6842) feat(projects): add agent and CLI project-home support (#6590) feat(desktop): restore message quick reactions (#6892) Use paired tags for standing & per-turn context (#6701) fix(cli): preserve signatures in event reads (#6884) refactor(db): finish replaceable event store extraction (#6777) Fix Admin feedback filter overflow (#6825) fix(desktop): stop pulsing addressed agents on send (#6873) fix(desktop): prioritize sidebar channel status (#6861) ... # Conflicts: # Justfile
…at-vacuum * origin/main: fix(projects): allow owners to delete agent projects (#6533) Fade expanded video controls on hover (#6926) fix(db): exclude kind:30179 ciphertext from brownfield FTS (#6822) fix(client): resurface hidden DMs from live activity (#6885) fix(desktop): keep the draft space when typing right after a mention pick (#6875) broker: define the agent-to-broker action contract (#6742) fix(desktop): keep project sheets independent from threads (#6901) Add gated security reviews (#6816) fix(desktop): accent-colored mention badges that count thread mentions (#6900) Add Buzz benchmark evaluation layers (#6823) fix(desktop): show edited head content in thread panel (#6887) fix(desktop-tooltip): increase surface contrast (#6897) Deduplicate ACP thread prompt context (#6706) Apply access policy when reusing channel agents (#6838) feat(sidebar): prioritize unread DMs in overflow navigation (#6842) feat(projects): add agent and CLI project-home support (#6590) Signed-off-by: Luke Tornquist <tornquist@squareup.com>
…agent-edit * origin/main: (39 commits) chore(deps): update dependency vitest to v4.1.11 (#6667) chore(deps): update dependency @tanstack/react-virtual to v3.14.10 (#6666) chore(deps): update ubuntu:24.04 docker digest to 33ceb71 (#6664) fix(projects): allow owners to delete agent projects (#6533) Fade expanded video controls on hover (#6926) fix(db): exclude kind:30179 ciphertext from brownfield FTS (#6822) fix(client): resurface hidden DMs from live activity (#6885) fix(desktop): keep the draft space when typing right after a mention pick (#6875) broker: define the agent-to-broker action contract (#6742) fix(desktop): keep project sheets independent from threads (#6901) Add gated security reviews (#6816) fix(desktop): accent-colored mention badges that count thread mentions (#6900) Add Buzz benchmark evaluation layers (#6823) fix(desktop): show edited head content in thread panel (#6887) fix(desktop-tooltip): increase surface contrast (#6897) Deduplicate ACP thread prompt context (#6706) Apply access policy when reusing channel agents (#6838) feat(sidebar): prioritize unread DMs in overflow navigation (#6842) feat(projects): add agent and CLI project-home support (#6590) feat(desktop): restore message quick reactions (#6892) ... Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
…late-cardinality-hints * origin/main: (145 commits) chore(deps): update rui314/setup-mold digest to 7e4f20a (#6663) chore(deps): update dependency vitest to v4.1.11 (#6667) chore(deps): update dependency @tanstack/react-virtual to v3.14.10 (#6666) chore(deps): update ubuntu:24.04 docker digest to 33ceb71 (#6664) fix(projects): allow owners to delete agent projects (#6533) Fade expanded video controls on hover (#6926) fix(db): exclude kind:30179 ciphertext from brownfield FTS (#6822) fix(client): resurface hidden DMs from live activity (#6885) fix(desktop): keep the draft space when typing right after a mention pick (#6875) broker: define the agent-to-broker action contract (#6742) fix(desktop): keep project sheets independent from threads (#6901) Add gated security reviews (#6816) fix(desktop): accent-colored mention badges that count thread mentions (#6900) Add Buzz benchmark evaluation layers (#6823) fix(desktop): show edited head content in thread panel (#6887) fix(desktop-tooltip): increase surface contrast (#6897) Deduplicate ACP thread prompt context (#6706) Apply access policy when reusing channel agents (#6838) feat(sidebar): prioritize unread DMs in overflow navigation (#6842) feat(projects): add agent and CLI project-home support (#6590) ... Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
…c-agent-commit-identity * origin/main: chore(deps): update rui314/setup-mold digest to 7e4f20a (#6663) chore(deps): update dependency vitest to v4.1.11 (#6667) chore(deps): update dependency @tanstack/react-virtual to v3.14.10 (#6666) chore(deps): update ubuntu:24.04 docker digest to 33ceb71 (#6664) fix(projects): allow owners to delete agent projects (#6533) Fade expanded video controls on hover (#6926) fix(db): exclude kind:30179 ciphertext from brownfield FTS (#6822) fix(client): resurface hidden DMs from live activity (#6885) fix(desktop): keep the draft space when typing right after a mention pick (#6875) broker: define the agent-to-broker action contract (#6742) fix(desktop): keep project sheets independent from threads (#6901) Add gated security reviews (#6816) fix(desktop): accent-colored mention badges that count thread mentions (#6900) Add Buzz benchmark evaluation layers (#6823) fix(desktop): show edited head content in thread panel (#6887) fix(desktop-tooltip): increase surface contrast (#6897) Deduplicate ACP thread prompt context (#6706) Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
* origin/main: (21 commits) chore(deps): update rui314/setup-mold digest to 7e4f20a (#6663) chore(deps): update dependency vitest to v4.1.11 (#6667) chore(deps): update dependency @tanstack/react-virtual to v3.14.10 (#6666) chore(deps): update ubuntu:24.04 docker digest to 33ceb71 (#6664) fix(projects): allow owners to delete agent projects (#6533) Fade expanded video controls on hover (#6926) fix(db): exclude kind:30179 ciphertext from brownfield FTS (#6822) fix(client): resurface hidden DMs from live activity (#6885) fix(desktop): keep the draft space when typing right after a mention pick (#6875) broker: define the agent-to-broker action contract (#6742) fix(desktop): keep project sheets independent from threads (#6901) Add gated security reviews (#6816) fix(desktop): accent-colored mention badges that count thread mentions (#6900) Add Buzz benchmark evaluation layers (#6823) fix(desktop): show edited head content in thread panel (#6887) fix(desktop-tooltip): increase surface contrast (#6897) Deduplicate ACP thread prompt context (#6706) Apply access policy when reusing channel agents (#6838) feat(sidebar): prioritize unread DMs in overflow navigation (#6842) feat(projects): add agent and CLI project-home support (#6590) ... Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>


Summary
Project workspace sheets now slide in from the right as an independent layer over an open conversation thread instead of replacing the thread or rendering inside its panel. Closing the sheet restores the unchanged thread, Escape applies only to the topmost surface, and the covered thread's resize divider no longer leaks through the overlay.
Related issue
Related: #6602. No matching issue found.
Testing
pnpm --dir desktop exec biome check src/features/channels/ui/RightAuxiliaryPane.tsx tests/e2e/project-commit-detail.spec.tspnpm exec playwright test tests/e2e/project-commit-detail.spec.ts --project=smoke --grep "project workspace sheet stays independent from an open thread"