Skip to content

Keep pages and channels in a persistent sidebar - #234

Merged
wesbillman merged 7 commits into
mainfrom
brain/pages-in-sidebar
Sep 24, 2026
Merged

wesbillman merged 7 commits into
mainfrom
brain/pages-in-sidebar

Conversation

@wesbillman

@wesbillman wesbillman commented Sep 24, 2026 •

Copy link
Copy Markdown
Collaborator

Opened by Brain on behalf of Wes.

Summary

  • Move page navigation from the header into one persistent sidebar above channels/DMs, including on Projects, Agents, Workflows and Settings.
  • Extract existing sidebar/resize behavior from ChannelsPage; conversation, thread, composer and panels remain page-owned. No hidden reader, new relay/cache, or plugin API expansion.
  • Preserve existing creation, session/DM handoffs, remembered selection, unread activity and focus return. Keep narrow Settings readable through a navigation disclosure.

Wes explicitly approved the FOUNDATION composition/sidebar ownership change. Most of the production diff relocates existing sidebar behavior, rather than adding a new navigation framework.

Latest bounded repair

Head: c341f37fba8a95fd637e966e6be59717ff166d6b; integrates main d6b01e6b5d159bfa16ace71978ea8230544b8dc4.

  • Preserve incoming deep-link recovery and entity destinations while resolving App/ownership-document conflicts.
  • Wait for the closed tooltip to leave the DOM before resizing for thread-activity geometry. The prior failed CI job retained its desktop-positioned closing portal: 978px + 358px = 1336px document width. Exact 390px overflow and subsequent geometry assertions remain; no sleeps, retries, relaxed bounds or production tooltip changes.
  • Supply the existing ResizeObserver stub pattern to the incoming jsdom App fixture so it can mount the real persistent sidebar. Navigation recovery assertions are unchanged.
  • Scope the incoming human-profile identity test to kind-0 metadata reads using its existing helper; the legitimate NIP-38 status read is not agent enrichment. Keep the absent-agent-section assertion and production behavior unchanged.

Validation

  • Mandatory commit/push hooks passed at c341f37f: TypeScript, 100 Vitest files / 1,069 tests, design types/guards, formatting/lint and security checks. No hooks bypassed. Both previously failing unit fixtures passed in this final-head hook run.
  • 76/76 affected browser executions passed, Chromium + WebKit, zero retries (~2 minutes): bin/pnpm test:browser agent-activity.spec.mjs layout.spec.mjs entity-destinations.spec.mjs thread-unread.spec.mjs navigation-sidebar.spec.mjs profiles-appearance.spec.mjs --project chromium --project webkit --no-deps. Substring matching also includes completion-layout. Run against the integrated precommit tree (HEAD 8a3f0fda, MERGE_HEAD d6b01e6b), then committed as c8905a57; the hook only formatted the tooltip assertion. Subsequent commits changed only the two unit fixtures, not production/browser paths.
  • Independent bounded read-only review found no blocker in App/docs conflict resolution, tooltip removal, or incoming layout/thread test integration at c8905a57; reviewed paths remain unchanged at c341f37f. This is not a formal GitHub approval or independent test run.
  • Remote head verified as c341f37f. GitHub reports MERGEABLE against d6b01e6b; DCO Check passed. Full hosted CI run 36060776946 is in progress, not green. Review state is CHANGES_REQUESTED; renewed reviewer/code-owner approval remains required. Windows native validation is skipped in this run.
  • No browser cases added/removed in this bounded repair; exact geometry, absence and recovery assertions remain. Prior hosted failure and mandatory-hook failures provide fail-before evidence.

Earlier CI cycles found and repaired real duplicate-status/narrow-layout defects and fixture ordering assumptions. Earlier local passes are historical evidence, not a full final-head CI claim. Full hosted CI and required reviewer approval remain the merge gates; no merge performed.

Browser coverage changes

Three new cases (six engine executions): remembered selection with keyboard main focus; same-thread activity focus return; local link-panel cleanup across sidebar activity/New message/New session while retaining companion intent. These exercise native focus, layout and actual App/controller wiring rather than a hook-mocked page.

Existing cases now assert persistent sidebar DOM across pages, no off-page conversation reader, off-page session destination/Back, creation cancellation remaining on Projects, short-height channel space and independently reachable page buttons. Fixtures compose the real sidebar/provider/page. No browser cases removed; obsolete disappearing-sidebar/top-tab geometry assertions are replaced with the requested ownership contract. Route validation and handoff state/reset stay in Vitest.

Sensitivity: removing local-panel cleanup failed both engines; restored control passed (isolated pre-main-integration snapshot). The same-thread test passed without the proposed signal dependency, so that redundant dependency was removed; this case proves behavior, not dependency sensitivity. The strengthened short-height check failed with a 29px channel region before the page-slot cap and passed after it.

Remaining validation gaps

  • Successful create-channel → navigation and late create-completion fencing lack a new mounted integration matrix; dialog internals, off-page entry/cancel and provider reset tests are covered.
  • Native desktop/titlebar/packaged acceptance, full native/Rust scan and dedicated cold/warm performance measurements were not run for this frontend extraction.
  • Full hosted CI and required reviewer/code-owner approval remain merge gates. This PR is not a release certification.

Signed-off-by: Brain <1a02c72794dcd0f07058a353bc3a81f4028b8c77c92c87fce6d5c8b85970a20b@buzz.block.builderlab.xyz>
@wesbillman
wesbillman requested review from a team and comp615 as code owners September 24, 2026 19:14
Signed-off-by: Brain <1a02c72794dcd0f07058a353bc3a81f4028b8c77c92c87fce6d5c8b85970a20b@buzz.block.builderlab.xyz>

@wpfleger96 wpfleger96 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

🤖 Automated review of a92069ff against base 842c1d3b. I'm requesting changes. The required browser journeys fail at this head in ways that come from the persistent sidebar itself, not flakes. Main at 842c1d3b has one known webkit failure (agent-activity.spec.mjs:336). This head has 18 failures across three shards, and the main one isn't among them.

Blocking: the sidebar now renders on every page, and several existing journeys break because of it. Grouped by cause, from CI run 36047385227:

  • Duplicate status content. While the relay is connecting, both ChannelSidebar's fallback (ChannelSidebar.tsx:83-85) and the Channels page connect card (ChannelsPage.tsx:118-120) render "Connecting to your relay…", so users see it twice (plugins.spec.mjs:104, both engines). Separately, the sidebar's role="status" preference notice ("Saved groups and stars aren't supported by this host yet.", ChannelSidebar.tsx:610) now appears next to every page's own status. That breaks plugin-import.spec.mjs:348 and shortcuts.spec.mjs:149/205/249 in both engines. Beyond the selectors, it adds a live region to Settings and plugin pages that has nothing to do with them, so screen readers will announce it there too.
  • Settings layout at narrow width and large text. With a 124–260px sidebar now taking width from Settings, notification-settings.spec.mjs:6 reports every Notifications row, label, and button overflowing at 200% text / 390px. plugin-import.spec.mjs:129 also sees "Reset text size" change height. Both fail in both engines. Either Settings should drop the sidebar at these widths, or the sidebar needs a collapse state there.
  • Click targets inside main. settings.spec.mjs:80 (both engines) clicks main at (5,5) to dismiss the account menu, and the portal now intercepts it. The layout change removed main's padding and moved it next to the sidebar.
  • Navigation / new journeys. new-message.spec.mjs:260 (chromium) never shows "Another message" after the flow finishes. The PR's new layout.spec.mjs:801 fails in webkit: the "Open unread thread" row in the Activity dialog detaches mid-click, which points to the sidebar re-rendering the activity list while it's open.

The description's 26/26 and 106/108 were measured at 6ade66bd, before the main integration (842c1d3b brings in the Todos panel and profile agent actions), so they don't cover this head. Please make the full browser matrix pass at the final head. For the duplicated status and notice, I think the fix is to keep connection/preference status on one owner (page or sidebar), not to tighten the test selectors.

I didn't do a full source review of the extraction this pass, since the required-CI regressions decide the verdict. The next head will get the full code-review and E2E lanes.

Signed-off-by: Brain <1a02c72794dcd0f07058a353bc3a81f4028b8c77c92c87fce6d5c8b85970a20b@buzz.block.builderlab.xyz>
@wesbillman

Copy link
Copy Markdown
Collaborator Author

Posted by Brain on behalf of Wes.

Addressed the review in 98661992db368469008d39bd4650957db35fe1ee:

  • Single sidebar owner for connection status/error/retry; static groups/stars notice no longer announces as a live region on every page.
  • Narrow Settings now has a Show navigation disclosure without unmounting sidebar state; 320–390px enlarged-text cases pass. Desktop retains the sidebar.
  • Outside-click test now clicks outside the account popup, not underneath it.
  • The two intermittent cases were fixture-ordering bugs, not production navigation failures: presence could replace the DM message release callback; the Activity target was a visible broadcast that could be marked read mid-click. Gate only message EVENTs and target the thread-only unread mention instead.

Validation at this exact head: all 68 affected Chromium/WebKit cases pass without retries; required hooks pass (954 Vitest tests plus type/design/security checks); DCO passes. PR description now separates this evidence from earlier snapshots. Full hosted matrix and your renewed review are still pending; I have not marked the PR merge-ready or merged it.

Brain added 4 commits September 24, 2026 14:45
Signed-off-by: Brain <1a02c72794dcd0f07058a353bc3a81f4028b8c77c92c87fce6d5c8b85970a20b@buzz.block.builderlab.xyz>
Signed-off-by: Brain <1a02c72794dcd0f07058a353bc3a81f4028b8c77c92c87fce6d5c8b85970a20b@buzz.block.builderlab.xyz>
Signed-off-by: Brain <1a02c72794dcd0f07058a353bc3a81f4028b8c77c92c87fce6d5c8b85970a20b@buzz.block.builderlab.xyz>
Signed-off-by: Brain <1a02c72794dcd0f07058a353bc3a81f4028b8c77c92c87fce6d5c8b85970a20b@buzz.block.builderlab.xyz>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants