Repository navigation
feat(sidebar): expose section creation in menus and drag - #1757
Conversation
|
🤖 Carl, AI agent: Princess Donut completed the requested one-pass adversarial source review of Resolved in
Validation: the Solo wording regression failed before the fix; 54 unit/component cases and 14 Chromium/WebKit creation/reorder cases passed on the tree committed as Placement remains specific to the entry point: menu creation appends, drag creation inserts at the target, and keyboard section-move controls remain available. The existing pending-status pattern and expansion-time collision remeasurement are deferred optional items. Immediate release in the original gap is covered; collision geometry during expansion can still lag the drawn target. The independent review covers |
|
🤖 Carl, AI agent: repaired the drag-test failures in
Both failures belong to fixture/assertion synchronization; this commit changes only the two browser test files. No cases or assertions were removed, and no sleeps, retries or animation overrides were added. Validation: the unchanged CI has started for |
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 One retry-recovery defect found.
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 The changed-name retry defect is repaired. One nonblocking recovery issue remains below.
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Star Lord’s automated source review via Wes’s account: one P2 recovery finding below. Rocket, Mantis and Groot completed independent lanes; I verified and integrated their evidence.
Reviewed head 9cf36dc12c3fb20ffd1f02491827099ea4a97607 against base bfaf0cbf508eaa6eab31c5b254aa696d5492eb7a. Source only; no tests or app execution. Hosted checks were successful with Windows skipped; native acceptance and post-error keyboard focus remain unverified.
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Star Lord’s automated source review via Wes’s account: no further changes requested in this follow-up. The prior recovery finding is addressed: uncertain creation now uses a fresh writer-backed read and preserves that requirement through failed reconciliation, Retry and cache clearing. Rocket, Mantis and Groot completed independent lanes; I verified and integrated their evidence.
Reviewed head 35bc9d384c662936df95564128eee22c03cccdb9 against base bfaf0cbf508eaa6eab31c5b254aa696d5492eb7a, focusing on the repair since 9cf36dc12. Source only: tests were inspected, not run; native behavior, post-error focus and current CI remain unverified.
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Carl, an automated reviewer, commenting via Wes’s GitHub account. Two recommended fixes and one optional item, inline below. Princess Donut, Mongo and Mordecai ran independent UI, persistence and test-quality lanes; I verified and integrated their evidence.
Reviewed head 35bc9d384c662936df95564128eee22c03cccdb9 against base bfaf0cbf508eaa6eab31c5b254aa696d5492eb7a. The new browser journeys go through real menu and pointer entry points with broker persistence, and the first-position order, same-ID retry and host validation contracts look right.
Validation: a store-level deferred-promise probe reproduces the reconciliation race. A throwaway Playwright check reproduces the focus loss in Chromium and WebKit. Neither probe is committed. Hosted checks are green (Windows skipped). The race has not been reproduced through the rendered modal, and native behavior is unverified.
To merge: either fix the two recommended items or decline them explicitly. Each fix needs a regression test that fails before it.
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 Required CI remains red at c2b8467. Update the dependent browser journey for the new disabled-state contract. The existing WebKit Retry-preferences focus failure also remains intermittent in hosted repeats; passing local runs do not resolve it.
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Expand the Channels boundary with Motion when a channel enters it, retain the destination through the drag, and preserve create-and-move confirmation. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Use a centered icon and label, inset surface and a clear active boundary while preserving the existing animated reveal and create-and-move flow. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Use the shared caption type role and reduce the icon-to-label gap to the 4px spacing token. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Use Move to new section for channel moves and remove the repeated description. Verify initial field focus and menu handoff with the existing dialog focus target. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Anchor the drag target before the first custom channel section, falling back to Channels. Create the dropped channel's section at that same position in one assignment write; preserve menu creation order. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Observe the existing initial-focus lifecycle before sending Escape. Retain the search focus and trigger restoration assertions after the faster mainline fixture setup. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Keep workspace creation errors specific to Solo, restrict the create-target preview offset to Messages channel drags, and document canonical insertion order and resize measurement semantics. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Wait for collapse completion and rendered acceptance before the next drag action. Follow the destination geometry after a creation-slot reveal, and scope the large sidebar fixture to its scroll-preservation test. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Keep the submitted ID and trimmed name together and lock the field after submission so an unconfirmed write can be retried without renaming the retained ID. Cover attempted edits, failed encrypted readback and an accepted broker write with a lost response. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Refresh confirmed preferences after a failed empty-section write before the form can discard its creation ID. Supersede older reads, retain the existing error and write gate if reconciliation fails, and cover Cancel/reopen with an accepted broker write and lost response. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Route uncertain empty-section recovery through a fresh writer-backed preference read and retain that requirement across failed reconciliation, explicit Retry and cache clearing. Admit only the supported consistency hint on the bounded preference batch and cover replica lag through the real session/broker and browser flows. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
c2b8467 to
d70db7b
Compare
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 Reviewed cae8747: no actionable findings. Current-head Chromium/WebKit checks passed, including recovery, persistence, and observed socket closure between forwarded saves; hosted checks are green with Windows skipped. Native and real-relay behavior remain unverified.
kazemek21
left a comment
There was a problem hiding this comment.
Kyle reviewed this PR and the Nexus review-tracker notes and approved with no comments.
Posted by Codex (gpt-6.1-sol) on behalf of kylez
Category: improvement
User Impact: Users can create channel sections from the Channels menu or by dragging a channel above their existing sections.
Problem: Section creation is buried in an individual channel’s move submenu, making initial organization hard to discover.
Solution: Add Create section after Filter and Sort, plus an animated drop target above the first custom section. Dropping opens a focused naming form and places the new section at that position; cancellation leaves the channel unchanged. After an attempted save fails, retries retain its ID/name pair in a focused read-only field; an unattempted, gated draft stays editable. An uncertain empty-section write reconciles saved preferences through a fresh writer-backed read before dismissal, so cancelling keeps an accepted creation visible; failed reconciliation gates every creation entry point and offers Retry preferences. Recovery waits for queued preference writes and repeats a writer read invalidated by a concurrent write. Preference Retry hands focus back after React commits the recovery controls.
File changes
browser-host/sidebar-preference-writes.test.mjs
Exercise uncertain creation through the real session/broker with stale replicas, writer readback and failed reconciliation followed by Retry.
browser-host/sidebar-create-section.test.mjs
Cover empty creation, first-position insertion, validation, failed readback after accepted writes and idempotent encrypted retries.
browser-host/sidebar-preferences.mjs
Accept empty creation and the optional first-position hint through the existing validated assignment endpoint.
docs/channels.md
Document both creation entry points, their placement and confirmation behavior.
src/bundled/channels/Channels.module.css
Style the inset target and offset Messages channel previews without changing Solo or section-reorder previews.
src/bundled/channels/ChannelMembersDialog.test.tsx
Wait for the existing initial-focus handoff before asserting Escape and trigger-focus restoration, preserving the faster mainline fixture setup.
src/bundled/channels/CreateSidebarSection.module.css
Remove styles for the redundant description.
src/bundled/channels/CreateSidebarSection.test.tsx
Cover empty and move forms, initial focus, pending saves, attempted edits after failure and unchanged retry payloads.
src/bundled/channels/CreateSidebarSection.tsx
Reuse the compact dialog for empty creation and create-and-move; retain the submitted ID/name pair and lock the field through ambiguous save failures.
src/bundled/channels/SidebarSection.tsx
Add the gated Create section action after Filter and Sort.
src/bundled/channels/SoloWorkspaces.test.tsx
Keep shared-store failure coverage aligned with section creation errors.
src/bundled/channels/useSidebarPreferences.ts
Expose the existing creation operation and availability gate to the inventory.
src/features/channel-navigation/ChannelInventory.test.tsx
Check dialog retirement and target placement when section order changes.
src/features/channel-navigation/ChannelInventory.tsx
Own menu and drag handoffs, select the first custom section boundary, and request first-position creation after a drop.
src/features/channel-navigation/ChannelSidebarDnd.tsx
Reveal and retain the target during a channel drag using the existing Motion dependency, including reduced motion.
src/features/relay/native-sidebar.test.ts
Cover empty and first-position creation through native encrypted readback fixtures.
src/features/relay/native-sidebar.ts
Confirm empty creation without requiring a channel assignment.
src/features/relay/sidebar-edits.test.ts
Cover the supported creation-position policy.
src/features/relay/sidebar-edits.ts
Allow empty creation and atomically insert a new section before existing sections when requested.
src/features/relay/session.ts
Wire uncertain Messages section creation to writer-backed reads through the existing preference reader, preserving session deadlines and cancellation.
src/features/relay/sidebar-moves-store.test.ts
Cover optimistic first placement, failure rollback, retry with the same section ID, uncertain creation reconciliation, stale reads, failed recovery, queued moves and session retirement.
src/features/relay/sidebar-preferences.test.ts
Verify fresh writer-read options and bounded batch admission of strong consistency while rejecting unsupported hints.
src/features/relay/sidebar-preferences-store.test.ts
Keep recovery expectations aligned with the shared operation and preserve Solo-specific creation errors.
src/features/relay/sidebar-preferences-store.ts
Use the existing write queue for empty creation, retain writer-backed reconciliation through failures, Retry and cache clearing, and gate new creation until that read succeeds.
src/features/relay/sidebar-preferences.ts
Represent channel-free creation and the optional first-position hint; admit strong consistency on the bounded five-coordinate preference batch and use a fresh read for reconciliation.
src/features/relay/sidebar-registers.test.ts
Check insertion before negative orders while ignoring deleted sections.
src/features/relay/sidebar-registers.ts
Allocate insertion order from canonical registers rather than their densely numbered display projection.
src/features/relay/solo-preferences.ts
Preserve shared-store compatibility when creation has no channel assignment.
tests/browser/channel-header-menu.spec.mjs
Keep move-dialog selectors aligned with the clearer heading.
tests/browser/navigation-group-icons.spec.mjs
Verify menu-to-dialog focus and narrow dialog geometry after removing repeated copy.
tests/browser/navigation-group-order.spec.mjs
Verify real section-reorder previews retain their original placement.
tests/browser/navigation-groups.spec.mjs
Retain recovery coverage, follow moving drop destinations and scope the large-sidebar fixture to the scroll-preservation case.
tests/browser/sidebar-section-creation.spec.mjs
Exercise menu creation, real pointer activation, accepted release, cancel, first placement, persistence, reduced motion and enlarged text. Synchronize collapse and acceptance before subsequent pointer commands; exercise real accepted writes with lost responses, identical retry, Cancel/reopen and reload.
Reproduction
Validation and limits
Test-only interception hardening at
cae8747b6: a hosted reset on the third forwarded POST followed an approximately six-second idle gap; prior API responses advertised keep-alive. This is consistent with an API forwarding socket racing the local broker's idle expiry. Each forwarded mutation now requestsConnection: close, and the existing journey verifies the real broker honors it. That lifetime assertion fails on the old path in both engines. Twenty repeated creation/recovery executions passed (ten per engine, 1.2m), including 60 forwarded POSTs with closed connections; the full creation file passed all six Chromium/WebKit cases on the committed tree (14.5s). Real acceptance, identical retry payload, three requests/two publications, focus, writer routing, preference recovery, Cancel/reopen and reload assertions remain. No request replay, timeout increase, failure suppression, application change or added/removed browser case. Mandatory push gates and hosted CI passed (43 successful checks, one skipped); the author confirmed the combined app walkthrough.CI repair and current-main integration at
d70db7bad: the dependent pre-submit journey reproduced the disabled-button timeout in both engines before repair. It now asserts disabled Create and preserves draft, failed/successful preference Retry, create-and-move, destination focus and reload coverage. A deterministic React regression fails on the old focus-before-removal timing; the dialog now restores focus in a post-commit layout effect. The two full component/navigation files pass all 48 cases (9.56s). Both reported browser cases pass ten repetitions per engine (40 executions, 2.4m); all 40 cases across the complete navigation, creation, group-order and plugin-contribution files pass (1.5m). One component case added; no browser cases added/removed or failure assertions weakened. Rebased onto0bc0752b6, preserving plugin drag domains and transient finite-read recovery. Mandatory push gates passed. Hosted CI later exposed the forwarding-socket reset addressed above. Repair and validation.Concurrent recovery, focus and explicit recovery at
c2b846771: all 115 cases in four full unit/component files passed (11.88s), and all six Chromium/WebKit creation journeys passed on the committed tree (14.7s). Five new store regressions and one mounted-navigation regression failed before the concurrency/gate fix; both engines reproduced focus loss before the read-only fix; the plain-copy/recovery regression failed before its fix. Eight lower-layer cases added, none removed; no browser cases added or removed. The existing real-broker journey now checks Enter focus, keyboard retry, a failed writer read, read-only preference Retry, focus restoration and Cancel/reopen with no extra publication. Mandatory push gates passed. Hosted CI at that head exposed the dependent-journey and focus failures addressed above. Concurrency/gates · Focus and draft identity · Preference recovery.Writer-backed recovery at
35bc9d384: the lagging-replica store regression failed before the fix; all 118 cases in four complete unit/integration files passed (1.03s), including the real session, signed broker requests, encrypted writer readback, failed reconciliation and explicit Retry. All six Chromium/WebKit creation journeys passed (13.4s); the existing recovery journey serves stale ordinary reads and verifies writer routing for Retry and Cancel/reopen. Five lower-layer cases added; no browser cases added or removed. Mandatory push gates passed. Hosted CI passed at that head; the subsequent repairs are covered above. Fix and validation.Cancel/reopen recovery at
9cf36dc12: the store regression failed before the fix; all 67 component/store cases and six Chromium/WebKit creation journeys passed on the tree committed unchanged. The real broker accepts a creation and loses its response; reconciliation exposes it before Cancel, reopening preserves one section, and reload retains it. Five store cases added; no browser cases added or removed. The existing journey gains the browser-only Cancel/reopen/reload boundary. Mandatory push gates and hosted CI passed at this head (43 checks successful, one skipped); Human testing of the described UX is confirmed; accepted-write/lost-response fault coverage is automated. Fix and validation.Retry repair at
015bafe57: the edit-after-failure regression failed before the fix; all 25 component/host cases and six Chromium/WebKit journeys passed on the tree committed unchanged. The browser saves through the real broker, loses its response, rejects an attempted name edit and confirms the identical retry with one publication after reload. No browser cases were added or removed; one empty-section host variant was added. Mandatory push gates passed. Fix and validation.Test-only CI repair at
99140dca6: the two reported cases passed 40 repeated executions (ten repetitions per case per engine, 3.1m), and both complete changed files passed all 26 cases (1.4m), including the retained large-sidebar scroll case. No cases or assertions were removed. Mandatory push gates passed. Diagnosis and validation.The Solo wording regression failed before the fix; both affected unit/component files pass all 54 cases on the tree committed as
fb40bdd6c.All 14 Chromium/WebKit creation/reorder cases pass on that tree, including checks that channel previews retain their offset while real section-reorder previews do not inherit it.
Mandatory TypeScript, related-unit, design and repository push checks passed at
fb40bdd6c.Princess Donut's source review and fix dispositions for
f281188a8found no blockers. Its two wording/documentation findings are fixed; later fixes and their validation are recorded in the scoped review threads.Added three browser journeys per engine, with none removed: real pointer collision/animation, menu focus handoff and save/reload require the browser and production broker. Error permutations remain in component/store tests. The removed subtitle's truncation check is replaced by absent-description and viewport-fit checks.
CI passed at
cae8747b6(43 successful checks, one skipped), all review threads are resolved, and the author confirmed the combined menu, keyboard, cancel, drag and reload walkthrough. Error-only recovery remains covered by controlled automated checks. Native app execution remains unverified. Focus is asserted on open and after an uncertain keyboard submission; automated typing is checked after the opening transition. At 360px with 2× text, the existing action label can clip. During expansion, collision measurement can lag the drawn target; immediate release in the original gap is covered.Screenshots
Real running product, headless, with isolated signed broker fixtures and a lime accent. Recaptured from the tree committed as
fb40bdd6c; the embedded attachments are byte-identical to those recaptures. The saved result is shown after reload.Recovery state from the real running product at
c2b846771, using neutral signed-broker fixtures. The save response and writer read are deliberately failed. Both themes and wide/narrow layouts were checked in Chromium and WebKit; the narrow capture uses 2× text.buzz-review-completed