Skip to content

feat(channels): move diagnostics into Channel Settings - #163

Merged
wesbillman merged 5 commits into
mainfrom
carl/channel-settings
Sep 23, 2026
Merged

wesbillman merged 5 commits into
mainfrom
carl/channel-settings

Conversation

@wesbillman

@wesbillman wesbillman commented Sep 23, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • Make the channel three-dot button open Channel Settings, with channel details first and diagnostics collapsed below. Existing unread, refresh, live-status, outbox and timing controls keep their behavior; actionable connection failures stay visible in the conversation.
  • Reuse the existing responsive side-panel layout and shared controls. Close/Escape restores focus, navigation clears Settings, and temporary Settings access preserves thread/link state. Terminal and Settings openings do not obscure each other.
  • No backend, protocol, channel-editing API or new permission changes.

Screenshot

Approved during the manual feedback round; cropped to the Settings panel to omit surrounding chat/sidebar content.

Channel Settings with diagnostics collapsed beneath channel details

Notification-test synchronization follow-up

  • Head c135ee86122c9f82cbbdc9a4c951e0ec686bcc35 adds the test-only correction for the sole remaining failure in run 35881351396: notification click navigation could still be opening after Appearance rendered. The test now polls for completion, as the neighboring notification journey already does, preserving both visible-heading and opened assertions. No production code, sleeps, retries or timeout changes.
  • Full notifications.spec.mjs passed 14/14 across Chromium and WebKit on this clean commit; required commit/push hooks passed. Earlier channel/measurement repair checks passed hosted CI at 6e8ea383. The new head remains subject to hosted CI; no claim that one local pass eliminates every possible flake.
  • Main remains 56778764 and is included. This fix ships with this PR, not a prerequisite PR.

CI repair and main integration

  • Final repaired head: 6e8ea383e027f9d2d01c55ddef067f18194cebbd, includes main 56778764 (fetched again before push). Clean merges; no rewritten commits.
  • Migrated timing-export setup into Channel Settings; targeted the actual overlay ancestor for layout stacking; replaced deleted diagnostics-popup token probing with real Settings-panel surface checks. Also restored silently missing stream-evidence timing attachments while keeping raw capture before opening diagnostics. No production behavior, hook policy, retries, tolerances or timing budgets changed in the repair.
  • At that clean final head, complete affected files passed on local macOS Chromium + WebKit: 10 measurement checks (channel-opening, scroll) and 58 functional checks (design-system, layout, channel-settings, sidebar-unread, message-navigation). Both stream measurement exports and all ten sidebar exports are valid JSON; no caught evidence errors in the functional report.
  • Independent repair review passed. Mandatory commit/push hooks passed. The initial CI failures provide fail-before evidence for the three migrated test consumers; their complete files now pass locally. Full hosted CI at the new head remains pending; no native or full-suite local rerun claimed.

Original validation (before main integration)

  • Built and exercised the live frontend before writing/running tests; Wes approved the UI.
  • Full frontend Vitest: 2,248 passed / 214 files on the final production diff. Subsequent edit only corrected the drawer-test fixture's revision type from number to string; required push checks reran the affected tests.
  • Affected browser files: 62 passed, Chromium + WebKit. After adding explicit thread/profile DOM-retention and scroll assertions, the complete message-navigation file passed again: 26 passed across both engines.
  • Required pre-commit and pre-push hooks passed at 2fb0ddc: formatting/lint, TypeScript, related Vitest (29 tests), design types and guards. Independent lifecycle review passed.
  • Added one browser journey (two engine executions) for real responsive geometry, focus return and navigation disposal. Added four component/hook tests; removed no cases. Existing unread/live/navigation journeys now enter through Channel Settings. No fail-then-pass mutation run; native packaging and the full browser/native suites were not run locally. Broad CI remains the merge gate.

Originating Buzz channel: ffce3697-facf-4e35-a191-54b0b5ff903a

buzz://message?channel=ffce3697-facf-4e35-a191-54b0b5ff903a&id=81db8cc57e3db46b58b51e5593dc37ae12fe8998b56d817b01187a136eef59e8

Signed-off-by: Carl <32a2e2c9d428ee08902cab75d956da2c1d235a22d4766b0dd4138bf6e2e5db1d@buzz.block.builderlab.xyz>
@wesbillman
wesbillman requested review from a team and comp615 as code owners September 23, 2026 14:54
Carl added 4 commits September 23, 2026 09:11
Signed-off-by: Carl <32a2e2c9d428ee08902cab75d956da2c1d235a22d4766b0dd4138bf6e2e5db1d@buzz.block.builderlab.xyz>
Signed-off-by: Carl <32a2e2c9d428ee08902cab75d956da2c1d235a22d4766b0dd4138bf6e2e5db1d@buzz.block.builderlab.xyz>
Signed-off-by: Carl <32a2e2c9d428ee08902cab75d956da2c1d235a22d4766b0dd4138bf6e2e5db1d@buzz.block.builderlab.xyz>
Signed-off-by: Carl <32a2e2c9d428ee08902cab75d956da2c1d235a22d4766b0dd4138bf6e2e5db1d@buzz.block.builderlab.xyz>
@wesbillman
wesbillman merged commit 78566ab into main Sep 23, 2026
12 checks passed
@wesbillman
wesbillman deleted the carl/channel-settings branch September 23, 2026 16:02
zrmarley added a commit that referenced this pull request Sep 23, 2026
…search-send

* origin/main:
  Connect attachments to existing message delivery (#176)
  perf: preserve unchanged thread row identities (#171)
  perf: cache markdown preparation by content (#172)
  Add safe attachment upload groundwork (#150)
  feat: add sampling profiler launch modes (#148)
  feat(channels): remove DMs from the sidebar (#157)
  Distinguish namesake agents and selected recipients (#142)
  feat(channels): move diagnostics into Channel Settings (#163)
  Replace warning banners with shared Base UI toasts (#164)
  feat(shortcuts): add keyboard shortcut settings (#155)
  fix(channels): give floating unread cue an opaque panel surface (#153)
  feat(communities): add BUZZ_DEV_OPEN_RELAY to open the default relay on fresh dev ports (#151)
  Restore recipient avatars beside the composer mention tool (#162)
  Fix startup inventory duplication and late panel scroll shifts (#160)
  feat(channels): add channel creation (#138)
  Standardize Button and IconButton with Buzz design tokens (#145)

Signed-off-by: Zach Marley <[email protected]>
matt2e added a commit that referenced this pull request Nov 9, 2026
## Why

Clicking an image in a channel timeline cleared Channel settings and
unmounted the whole side pane for the length of the review. When the
viewer closed, Channel settings was gone with no announcement, and any
side panel that clears state on unmount had lost it: the native Huddle
chat panel releases files you had attached but not sent. The side thread
only survived because its text draft is saved per keystroke.

The `setSettings(undefined)` in `openMediaReview` dates from #163, when
settings was a transient panel auto-closed by any other opening. #413
made it a retained tab and added the dock guards but left that clear
behind.

## What

- `openMediaReview` no longer clears Channel settings.
- The side pane stays mounted under the viewer. `PanelDock` already
renders a closed dock as `hidden`, `inert` and `aria-hidden` when
`keepMounted` holds, so `keepMounted` now also holds during a review
(only when there is a panel to keep) and the pane's child guard no
longer unmounts on it. Settings, side plugin panels (Huddle) and the
Solo companion keep their state.
- Side thread tabs still leave during a review, via a new `hostPanes`
option on `useConversationTabs`. This is load-bearing, not a leftover:
the viewer's comment composer reads the thread draft when it mounts and
the thread composer reads the viewer's edits back when it remounts, so
keeping the side thread mounted would hand back a stale draft. Threads
moved to the main pane keep rendering through a review, as they did
before.

## Before / after

Left: `main` (3a1eb56). Right: this branch. Same steps: open ⋯
Channel actions → View channel details, click the image, press Escape.


https://github.com/user-attachments/assets/564548a1-7479-4855-9eb4-4090bfa1a844

![Final frame: on main the timeline stretches to the window edge with no
pane; on the branch Channel settings is still docked beside the timeline
with its tab
selected](https://github.com/user-attachments/assets/e7ecb1a5-ed99-4008-ac5d-655f770b85c4)

## Tests

- New browser journey in `tests/browser/channel-settings.spec.mjs`:
Channel settings stays open with its tab selected and focus returns to
the tile after Escape; the dock is `hidden` and `inert` under the modal;
a side-thread draft reaches the viewer's comment composer and comes back
edited; a thread moved to the main pane keeps the same composer element
connected through the review. Fails on `main` at the first pane
assertion.
- New `useConversationTabs` case: `hostPanes: ["main"]` withholds only
the side host and re-hosts it afterwards, including a tab the visit
showed but no longer selects.
- `channel-settings.spec.mjs` and the existing "media review hands off
the thread draft" journey pass in Chromium and WebKit; `tsc --noEmit`,
Biome and Vitest for `src/bundled/channels` and `src/features/panels`
are clean.

Not verified here: the native-only Huddle case (attached-but-unsent
files surviving a review) needs a manual check in the native app.

## Notes

- Merges with #2942 as a one-line, same-meaning conflict: that PR writes
`open={docked}`; keep that plus this branch's `keepMounted`.
- The other three `setSettings(undefined)` sites (Reply/open thread,
opening a link into a side panel, opening a bottom drawer) are unchanged
and belong in a follow-up once Channel settings is treated as a fully
retained tab.
- A main-pane thread on the same root as the reviewed image still keeps
its pre-viewer draft, as on `main`; the composer's conflict banner
surfaces it on the next keystroke. Unmounting only the reviewed root's
thread is a possible follow-up.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Signed-off-by: mtoohey <[email protected]>
Co-authored-by: Claude Fable 5.1 <[email protected]>
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.

1 participant