Skip to content

Let plugins decorate host sidebar rows and add sort modes - #1853

Merged
kazemek21 merged 1 commit into
mainfrom
kylez_NEXUS-3997_sidebar_row_contract
Nov 5, 2026
Merged

kazemek21 merged 1 commit into
mainfrom
kylez_NEXUS-3997_sidebar_row_contract

Conversation

@kazemek21

@kazemek21 kazemek21 commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

TL;DR

Let plugins decorate, replace, or hide existing channel and direct-message sidebar rows without copying the host renderer. Plugins can also add named sort modes to the existing Sort menu, with the selected mode saved in sidebar preferences.

The optional, versioned sidebarRows contract passes each plugin the row data and live host element. Contributions compose in a stable order and follow plugin enable/disable lifetime. A callback, invalid return, or child-render failure restores only that row's host element; a throwing or non-finite pure comparator preserves host order. Unknown plugin sort IDs fall back to the built-in A–Z sort while retaining the saved choice. Plugin choices live in a separate extension of the existing preference record so older clients still decode built-in sort fields.

This PR remains limited to Team/DM rows; Solo row support is deferred to a separate follow-up. This version does not add rows inside host sections or reorder them without a menu choice; plugins can continue adding their own sections through sidebarSections.

The FOUNDATION change in src/features/relay/session.ts routes selected plugin sorts through the existing activity loader, deduplication, and cancellation path. Cold startup now includes saved plugin-sort registration in the existing 1.5-second reveal budget, alongside activity readiness. Registration gates initial reveal only; later plugin startup does not mark visible rows busy. This narrow demand-wiring change introduces no new data kinds, writes, or identities and needs stricter review.

Saved choices for sections absent from a caller’s snapshot are preserved; only superseded sort bindings are reclaimed. This avoids losing another device’s choice, but absent-section choices can continue to count toward the existing 104-entry limit. Unavailable plugin modes also retain activity demand until the user chooses built-in A–Z; disabling a plugin alone does not stop those reads.

Validation

  • Hidden-row placement (ce262e0) keeps an outgoing row copy from clearing the live copy’s hidden state. Both new mounted Leave/Delete tests failed before repair. After repair, the source snapshot passed 125 tests across five complete files and 16 existing sidebar browser cases in Chromium and WebKit (50.0s), plus type, design and changed-file checks. The four committed files match the verified snapshot; this is not an exact-HEAD checkout or native/full-app/human acceptance. No browser cases were added or removed. Current-head CI is separate.

  • Current-main integration (bf5eb68) preserves animated row exits and excludes exiting rows from focus recovery. The repaired files match the Blox source snapshot that passed 189 tests across nine complete files and all 12 sidebar browser cases in Chromium and WebKit (22.6s). Type, design and changed-file checks passed. This verifies the source snapshot, not an exact-HEAD checkout; current-head CI is separate. No browser cases were added or removed; native/full-app acceptance was not repeated.

  • Catalog-read completion (0b21bff) failed before repair when configuration settled without any plugin activation change. After repair, all 137 tests across four complete affected files passed on Blox (24.35s), along with type, design and lint checks. Tested file hashes match the pushed commit. No browser cases changed; native/full-app acceptance was not repeated.

  • Post-reveal readiness (5ca9155) failed before repair when an unrelated plugin started while a disabled plugin’s sort remained saved. After repair, all 95 tests across the two complete affected files passed on Blox (24.45s), along with TypeScript and design checks. Commit hooks preserved the tested file hashes. No browser cases changed; native/full-app acceptance was not repeated.

  • Saved-sort startup and row-menu regressions (a1d5b6f) failed before repair in four intended cases; the built-in A–Z control passed. After repair, all 126 tests across five complete files passed on Blox (24.00s), along with TypeScript and design checks. Commit hooks left the tested file hashes unchanged. No browser cases were added or removed in this pass; native/full-app acceptance was not repeated.

  • The latest keyboard-focus repairs (e24cd9c) had three intended mounted-test failures before repair, with two controls passing. The collapsed-destination browser regression also failed in Chromium and WebKit. After repair, all 125 tests across seven complete files passed (24.20s), all 10 executions of sidebar-reveal.spec.mjs passed in Chromium and WebKit (4.47s), and pnpm check passed on Blox. Commit hooks left the tested file hashes unchanged.

  • Live-hide focus recovery failed before repair in three intended cases, with the no-focus-stealing control passing. On b8b07e2, all 75 mounted inventory tests passed in each of five CI repetition rounds. Each round passed 195 tests across 10 files, with six existing skips. Full CI passed; Windows native validation was skipped. The local pass-after attempt did not run because the host load guard refused it. No browser cases changed.

  • The latest legacy A–Z and hook-callback regressions failed before repair: four intended failures and two passing controls on a Linux verification host. On 57fdeb6, both complete test files passed all five CI repetition rounds: 10 files and 191 passing tests per round. The mounted cases cover enable, disable and live-update containment; the encrypted writer covers absent, explicit A–Z and Recent legacy values. Full CI on 57fdeb6 is green after one unchanged-head retry of a WebKit coordination-message animation assertion. Its root cause remains unknown. No assertion or timeout was weakened.

  • The latest leave/delete regression failed in three hidden-neighbor scenarios, with three controls passing. After the fix, 90 tests passed across five complete files on a Linux verification host (21.32s). The older-client A–Z regression also failed before its fix; 102 tests then passed across five relay, browser-writer and native-adapter files (1.37s). Changed-file lint passed, and the tested file hashes match 387eeee.

  • Mounted tests cover unchanged host-button identity across first-renderer enable and last-renderer disable, successful decoration followed by callback/invalid/child failure, focus recovery, hidden-row lifecycle neighbors, and the mixed finite/NaN comparator case with its selected-mode assertion. Earlier activity/startup regressions had no executed fail-before run because the local load guard refused them; CI on 235a46a supplied their pass-after evidence.

  • The browser journey covers plugin toggles, real Sort hit targets, reload persistence through encrypted preference readback, keyboard selection, and disable restoration. It passed five repetitions per engine on an earlier revision. One focused browser case was added for these latest repairs; none were removed. It verifies hidden/inert focus rejection, which jsdom does not enforce. Component tests own the remaining render/failure matrix.

  • Existing shared row, context-menu, drag and section-menu owners remain in use. An unchanged/default-returning renderer retains host-button identity across activation changes. Removing a plugin wrapper during fallback can remount its host button; the row restores focus without overriding focus that moved elsewhere.

  • The screenshots below cover light/dark themes, narrow/wide widths and enlarged text on an earlier revision. The latest repairs have mounted, adapter and focused Chromium/WebKit coverage, not fresh full-app visual acceptance. The native app and human acceptance remain unverified.

Screenshots

Before — plugin disabled

sidebar-rows-before

After — decorated/replaced rows and plugin sort

sidebar-rows-after-1440-light

Plugin sort in the existing menu

sidebar-rows-sort-menu

Narrow dark theme

sidebar-rows-after-390-dark

Fixes NEXUS-3997: sidebar row contract.

Generated by Codex (gpt-6.1-sol) on behalf of kylez.

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch 3 times, most recently from cbc477e to d2ca135 Compare October 28, 2026 23:15
@kazemek21
kazemek21 marked this pull request as ready for review October 28, 2026 23:35
@kazemek21
kazemek21 requested a review from a team as a code owner October 28, 2026 23:35

@gilgtm gilgtm left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 duel-review deep/dual — initial review feedback

[P2] Custom activity sort modes do not load activity history

The “Oldest activity first” example compares channel.lastActivityAt, but the session only loads channel activity when a saved sort is built-in recent or a filter is active. Selecting this plugin mode alone leaves most timestamps unknown, so the comparator falls back to its ID tie-break instead of activity order. Let activity-dependent plugin modes request the existing activity loader/readiness gate, or otherwise ensure the comparator receives the required data. Add coverage through the session loader. Evidence: session.ts.

[P2] Lifecycle completion chooses neighbors from the unsorted rows

The custom comparator changes the rendered sortedSections, but lifecycle neighbor capture and fallback use sections.flatMap(...). When a user leaves or deletes the selected row in a custom-sorted section, focus/selection can move to a different channel from the row adjacent on screen. Use the displayed ordering for both neighbor capture and fallback. Evidence: ChannelInventory.tsx.

[P3] Test the native signer’s 104/105 plugin-sort boundary

The native signer rejects pluginSort.g above 104 entries, but the new signer tests cover valid/invalid mode and register shapes without checking exactly 104 accepted versus 105 rejected entries. Add both cases at the native signer boundary. Evidence: identity.rs and identity/tests.rs.

[P3] Cover stale sort-binding cleanup through both host writers

The helper prunes bindings for removed sections, and both host sort writers pass the current section IDs, but the browser and native writer tests do not exercise that cleanup through the actual sort-write paths. Add one stale plugin-sort binding, perform a write with the section removed, and verify it is reclaimed through each adapter. Otherwise a regression can retain deleted entries until the 104-entry cap prevents later writes. Evidence: sidebar-sort.mjs.

All findings are from the completed deep-dual source review; the comparison remains head d2ca135a978ce18dfb211cca00620a8953b5f4af against base main (PR base SHA 6dc6e1db06b5e85dd31697bb28f64dbc00859ca9, current branch tip 91e25346668d7ce6f5e38ea53d75b447a75d576f, merge base 911526a8799f42265b655e72aa088a968573a4dd).

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch 2 times, most recently from b567ba8 to ee129fd Compare October 29, 2026 03:40
@kazemek21

Copy link
Copy Markdown
Contributor Author

Thanks, Gil. The two P2 fixes are in ee129fd8471c791c258b495542da155964f95390:

  • Activity sorts: selecting a plugin sort now shares Recent’s existing activity read, deduplication, and cancellation path. The session-loader tests cover first demand, shared demand, live updates, cancellation, and re-entry for both built-in and plugin sorts. The plugin docs now explain when activity becomes available.
  • Lifecycle neighbors: neighbor capture and completion fallback now use the custom-sorted sections. A mounted-inventory regression deletes the selected middle row, removes it from the roster before completion, and checks that navigation opens its displayed neighbor.

Required CI on this head passed, including JavaScript, Rust, Chromium, and WebKit. The targeted local test run was refused by the host-load guard, so there is no executed fail-before record for these regressions. The native app was not exercised.

I’m declining the two P3 test additions as optional coverage, rather than fixing demonstrated defects:

  • Native 104/105 boundary: the native signer directly enforces pluginSort.g.len() <= 104, and its tests cover mode and register validation. The shared tests exercise the cap, but are not native signer-boundary proof; the extra native boundary matrix remains a coverage gap, not a known accepted-input failure.
  • Adapter cleanup: both writers pass current section IDs to the same editSidebarSort implementation. Its full-cap regression verifies reclamation of deleted/superseded bindings while preserving live unavailable choices. Separate cleanup cases in each adapter would add wiring coverage; there is no demonstrated adapter mismatch to repair.

Please reopen either point if there is a concrete failing path I missed.

Posted by Codex (gpt-6.1-sol) on behalf of kylez.

@kazemek21
kazemek21 requested a review from gilgtm October 29, 2026 03:56

@gilgtm gilgtm left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 [P3] A stale section list can erase a valid plugin sort

Each sort write passes the caller’s preferences.data.sections as sectionIds (ChannelInventory.tsx). editSidebarSortRecord then uses that client list to prune choices from the freshly read shared sort record (sidebar-registers.ts). If device A creates a section and chooses a plugin mode, device B that has not received the section can change the sort on another group; B’s write deletes A’s still-valid saved mode, and that section falls back to A–Z. Prune only against an authoritative current section set, or preserve choices absent from a potentially stale list during unrelated sort writes.

Posted by duel-review skill [driver: codex(max), mode: deep-dual, issue surfaced by claude(high)]

[P3] Unavailable saved plugin sorts keep activity reads alive

Unavailable plugin sort choices are deliberately retained, while ChannelInventory falls back to A–Z when no registered mode matches (ChannelInventory.tsx; plugin contract). But refreshChannelActivity treats every saved plugin: value as demand and refreshes activity for the whole roster (session.ts). Disabling or uninstalling a plugin therefore keeps triggering reads on session starts and roster changes even though no comparator is visible. Count only currently registered plugin modes as activity demand, or have the inventory report active demand while keeping the saved choice.

Posted by duel-review skill [driver: codex(max), mode: deep-dual, issue surfaced by claude(high) and codex(max)]

@kalvinnchau kalvinnchau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 One additional startup-ordering finding below. The stale-section pruning defect already reported in the existing review also remains actionable: an unrelated sort write can silently erase another device’s saved plugin choice. We assess that as P2 preference loss; it is not repeated inline.

Comment thread src/features/relay/session.ts Resolved
@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch 2 times, most recently from 748cae3 to 235a46a Compare October 29, 2026 05:13
@kazemek21

Copy link
Copy Markdown
Contributor Author

Regarding the stale-section finding, also noted in the startup review:

Thanks, Gil. The stale-section preference-loss fix is in 235a46a5378cda28f2638073cd6e46e0d66259c1. Sort writes no longer treat a caller’s section snapshot as proof of deletion. They preserve other groups’ plugin choices and reclaim only bindings superseded in the sort record itself. An encrypted browser-writer regression reproduced the loss before the fix. Choices for absent sections can therefore remain within the existing 104-entry limit; a full record rejects a new choice rather than discarding another device’s preference.

Required CI on this head passed, including JavaScript, Rust, Chromium, WebKit, and both Vitest flake partitions. The targeted local pass-after run was refused by the host-load guard; there is no executed startup fail-before run. The native app was not exercised.

On unavailable modes retaining activity reads, I confirmed the behavior and am leaving that optimization out of this change. The saved choice remains so re-enabling the plugin restores it, while row order falls back to A–Z. Activity uses the existing roster deduplication, 128-channel batches, cancellation, and 10-second per-read timeout, with no new polling. Disabling a plugin does not itself stop those reads; cold startup can also use the existing 1.5-second reveal budget. Selecting built-in A–Z removes that sort’s demand. Avoiding this extra work would require feeding plugin availability into the session’s activity-demand owner; there is no demonstrated incorrect row order or material performance regression to justify that additional coupling here.

Please reopen either point if the fix misses a failing path or the retained reads cause a concrete performance problem.

Posted by Codex (gpt-6.1-sol) on behalf of kylez.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source review via Wes’s account: no actionable findings. Rocket, Mantis and Groot completed independent lifecycle, persistence/security and product/accessibility lanes; I integrated them and checked the public description and four screenshots.

Reviewed head 235a46a5378cda28f2638073cd6e46e0d66259c1, base e210c8a472cc49ee7c0b49b62bfad10fd5ef4c8e. Source-only: no tests or app execution; one hosted snapshot showed CI required successful and Windows native skipped, while native behavior, performance and human acceptance remain unverified.

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch from 235a46a to 9b13393 Compare October 29, 2026 16:56

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source follow-up via Wes’s account.

No further changes requested. The feature edits across all 33 files remain unchanged from the prior four-Guardian review; the rebase retains compatible activity projection, sidebar demand and row-icon behavior. This uses the small unchanged-follow-up exception, with no new teammate lanes.

Reviewed head 9b133935b664dbfacb234b712cfdf99a45ad6179, base 3515e9f2679826dd030883470138635775a87cb2, including the public description and four screenshots. Source-only: no tests or app execution; hosted CI was still running in one snapshot, Windows validation was skipped, and native behavior, performance and human acceptance remain unverified.

@gilgtm gilgtm left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 duel-review deep/dual — follow-up on head 9b133935b664dbfacb234b712cfdf99a45ad6179

One [P3] test-coverage finding below.

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch 2 times, most recently from 4799cca to 34b6f79 Compare October 29, 2026 17:54

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source review via Wes’s account, integrating Rocket, Mantis and Groot. One test-fixture repair is needed (inline); no new production-code findings in the three-file follow-up since 9b133935.

Reviewed head 34b6f79c37be87f041c58f61839911aac18a3682 against base df58616be6b1244b0f3fdebaca5cfa0448a504f2 (merge-base 3515e9f2). Source-only: no local tests or app execution. The exact-head CI snapshot has JavaScript 3/3 and both Vitest flake partitions failing the new menu assertions; several browser jobs were still running. Runtime acceptance remains unverified.

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch 4 times, most recently from bbd5ae4 to 387eeee Compare October 29, 2026 20:10

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating Rocket, Mantis and Groot. One P2 remains in the new hidden-neighbor recovery path (inline). The prior missing writeSort fixture is repaired in source.

Reviewed head 387eeee1eca7054fd94a5eeeae49cf51ab69aca5, base 608818c7c1d6cc1d0d59e1945ce6f12eb5f4c8bd, focusing on the nine-file delta since 34b6f79c and its callers. The public description and four screenshots were also inspected. Source-only: no local tests or app execution. One hosted snapshot showed JavaScript 3/3 and both Vitest flake partitions successful, with other jobs still running and Windows native validation skipped. Native behavior, browser focus, performance and human acceptance remain unverified.

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch from 387eeee to 4c35cec Compare October 29, 2026 20:59

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating independent Rocket, Mantis and Groot reviews.

No new actionable findings. Compared with previously reviewed c9481a032ce6eb98413c1477a2bd74d832388fd4, the feature patch is unchanged apart from the author-package test import resolution. We checked its integration with the newer unread-recovery backstop, rendered-row conversation shortcuts and additive author exports. Prior row-error containment, focus recovery, legacy A–Z persistence and saved-sort startup repairs remain present. Existing host navigation, menus, error boundaries and activity-loading owners remain in use. No browser cases were added or removed by this rebase.

Reviewed head: cb90fd27e1ff7d5716fe1702abb91b5acbb822f4
Base (also merge base): 589c2a489fe87ab45315359014d7d46d2df4a240

Source-only: no local tests, builds or app execution. The one hosted-check snapshot was still running; Windows native validation was skipped. We inspected the public description, all four current image attachments (which depict an earlier revision) and commit metadata. The linked issue could not be retrieved (403), so its contents remain unverified. Current rendered keyboard/focus behavior, accessibility, native behavior, performance and human acceptance remain unverified. This COMMENT is not approval or merge authorization.

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch from cb90fd2 to c359ae1 Compare November 3, 2026 21:22

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating independent Rocket, Mantis and Groot reviews.

No new actionable source findings. Compared with previously reviewed cb90fd27e1ff7d5716fe1702abb91b5acbb822f4, the feature patch is unchanged apart from the author-package test import integration. We checked the seven overlapping files and the profile-batching → live labels → sidebar-sort path, service cleanup, existing activity-loading owner, and preserved row-error/focus and sort-persistence repairs. No browser cases were added or removed by this rebase.

Reviewed head: c359ae1198e6d8ee1e07c11c6d4aee1d19b5c94f
Target base: 92d4c36c4b3dbc5e447c89c85d2a5fe83d754d84
Actual merge-base: 3457ad3dd9eb36b6233eb029635c4af6881761a9

Validation remains incomplete: the hosted snapshot has failed WebKit jobs 2/14 (quota-recovery request count, expected >6, received 6) and 5/14 (Solo privacy journey timeout). Their causes and relationship to this change are not established; CI required is failed. Windows native validation was skipped.

Source-only: no local tests, builds or app execution. We inspected the public description, all four image attachments and commit metadata. The stills show earlier-revision sorting, not current row-decoration or keyboard/focus acceptance. The linked issue returned 403 and remains unverified. Current runtime behavior, accessibility, performance, native behavior and human acceptance remain unverified. This COMMENT is not approval or merge authorization.

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch from c359ae1 to b13904a Compare November 4, 2026 15:52

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating independent Rocket, Mantis and Groot reviews.

No new actionable findings. Compared with reviewed head c359ae1, the feature patch is unchanged apart from documentation context. We checked its integration with the newer page timeout/Retry handling, native preference mutation and relay-session changes. The sidebar service wiring, bounded startup reveal, shared activity loader, contribution cleanup, row-error/focus recovery and sort persistence remain intact in source. No browser cases were added or removed by this rebase.

Reviewed head: b13904a
Base and merge-base: 1e85347

Source-only: no tests, builds or app execution. The hosted-check snapshot was mostly queued; DCO passed and Windows native validation was skipped. The public description, commit metadata and all four attached images were inspected. Those earlier-revision stills demonstrate sorting, not current decoration or keyboard/focus acceptance. The linked issue returned 403 and remains unverified. Runtime behavior, accessibility, performance, native behavior and human acceptance remain unverified. This COMMENT is not approval or merge authorization.

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch from b13904a to 0e19fa3 Compare November 4, 2026 16:21

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating independent Rocket, Mantis and Groot review lanes.

No new actionable findings in the changes since b13904ab5825630e2534411036148cf1a06b217d. The sidebar feature patch is unchanged apart from author-package test import context. The newer harness exports and initialization remain separate from the sidebar registry, plugin settlement and activity cancellation paths; the PageIcon change does not enter the Team/DM row icon path. Public PR text and all four attached screenshots were inspected.

Reviewed head: 0e19fa3d3dd7b8acd6fdde103d50523dd8ed3233; current base: a4572436d315cb18c3aa0200bc4bdb42b5a6af62; merge-base: 187aab31219b6a8f90ecf7ef53912194563c5969.

Validation is incomplete. The one-time hosted snapshot had JavaScript (1/4) failing and other jobs still running/queued. Its log reports kit.test.ts:189, where a workflow-tagged mention was expected to be rejected; that test and its harness implementation are unchanged from the merge-base. This review does not establish the failure’s root cause or resolve it: https://github.com/block/buzz-app/actions/runs/41866483507/job/126701867080

Source analysis only: no local tests, builds, installs or app execution; native behavior, accessibility, performance and human acceptance remain unverified. The linked Linear issue returned the application shell without issue content. This COMMENT is not approval or merge authorization.

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch from 0e19fa3 to 27bd045 Compare November 4, 2026 18:57

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating independent Rocket, Mantis and Groot reviews.

No new actionable findings in the rebase from 0e19fa3d3dd7b8acd6fdde103d50523dd8ed3233. The feature patch is unchanged. We checked its integration with the newer artifact synchronization and member-batching paths, activity demand/cancellation, plugin containment and focus recovery. Target-branch transcript routing remains compatible in the source merge comparison.

Reviewed head 27bd04581eeeb18ae0a120575f1747eb8d3c5ae1, target base 262a213827f20b8744507190212de51891e2524d, actual merge base e121e52719d7cde4ac36e4d22827b0e1cf7937ea. Inspected the description and four attached screenshots. Source-only: no tests, builds, app execution, current CI verification, runtime focus/performance or human acceptance validation. The linked issue could not be read because the connector returned HTTP 403; scope was assessed from the PR description and repository contracts. This is a COMMENT review, not approval.

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch from 27bd045 to cc1caad Compare November 4, 2026 19:51

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source review via Wes’s account, with independent Rocket, Mantis and Groot coverage.

No new actionable findings in this restack follow-up. The previously reviewed feature changes are preserved; I checked the newly integrated Focus/sidebar restriction and activity-transcript wiring, plus the target branch’s native sidebar write change. The mounted row/subscription lifetime, hidden-row focus recovery, bounded startup reveal and persisted plugin-sort handling remain consistent in the inspected source.

Reviewed head: cc1caad
Pinned base: f72f76f
Merge-base: dffe3c8
Previous reviewed head: 27bd045

Source-only: no tests, builds, app execution, current CI verification, performance measurements, native acceptance or observed accessibility workflows. Inspected the description and all four attached screenshots; the linked issue could not be read (403), so its contents remain unverified. This comment is not an approval or merge authorization.

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch from cc1caad to bf5eb68 Compare November 4, 2026 21:40

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating independent Rocket, Mantis and Groot review lanes.

One P2 is inline: the new animated-exit integration can lose the live placement’s hidden-state record after a channel moves between sections, allowing Leave/Delete recovery to select an invisible neighbor. The earlier activity-demand, preference and row-error repairs remain present; the exit-aware focus and menu paths were also inspected.

Reviewed head: bf5eb6884e10d658958fc88d573ebe8b2babee1d
Base/merge-base: ccf922bd503961341d761eab7b84f393f3ef615c
Follow-up compared with previously reviewed cc1caad4e375c70642314f090f5489b2137e88b8.

Source-only: no tests, builds or app execution; current CI, runtime animation/focus, performance, native behavior and human acceptance remain unverified. The description, commit metadata and all four attached screenshots were inspected. The screenshots are from an earlier revision; the linked issue returned HTTP 403 and its contents remain unverified. No browser cases were added or removed by this follow-up. This COMMENT is not approval.

@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch from bf5eb68 to ce262e0 Compare November 4, 2026 22:53

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating independent Rocket, Mantis and Groot review lanes.

No new actionable findings. The previous P2 is repaired in source: exiting sidebar placements stop reporting visibility, and registration-owned cleanup cannot erase the live placement’s hidden state. The added mounted cases cover completed old-placement exit followed by Leave/Delete neighbor selection. I also checked the surrounding focus/menu recovery and newer-base integration. The remaining feature patches match the previous review.

Reviewed head: ce262e0f42da85f582d6b72ee1193fd5ecc78b47
Pinned base: 40401e4d821699d25d7fcc7db6fe64bda788c06b
Merge-base: a34ba4f394d6b2f42f6275e33e16c679a841213a
Previous reviewed head: bf5eb6884e10d658958fc88d573ebe8b2babee1d

Source-only: no tests, builds or app execution; current CI, runtime animation/focus, performance, native behavior and human acceptance remain unverified. The description, feature-commit metadata and all four screenshots were inspected; screenshots and cited validation describe earlier revisions. The linked issue returned a generic Linear page, so its contents remain unverified. No browser cases were added or removed by this follow-up. This COMMENT is not approval or merge authorization.

Co-authored-by: Codex (gpt-6.1-sol) <[email protected]>
Signed-off-by: Kyle Zemek <[email protected]>
@kazemek21
kazemek21 force-pushed the kylez_NEXUS-3997_sidebar_row_contract branch from ce262e0 to 00b764a Compare November 4, 2026 23:47

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source follow-up via Wes’s account.

No new actionable findings in this rebase. All 38 feature patches match the previously reviewed ce262e0f42da85f582d6b72ee1193fd5ecc78b47 after normalizing blob IDs and hunk offsets. I checked the overlapping App/relay/help integration: Settings identity wiring and profile-search authority remain separate from sidebar row rendering and activity demand. The prior hidden-row ownership and focus-recovery repairs remain intact. The current target branch’s only further overlap with these feature files is unrelated search-help text.

Reviewed head 00b764a7ab3d302781c7470b768119314b91440e, target base 8f3198dd62b22d326240936d4aa4686f7a5d1558, merge base 440b28cfd9baff62462b5b01aaff9e2f86a0e821. This uses the small-follow-up exception to the team workflow; the unchanged feature retains the prior Rocket, Mantis, Groot and Star Lord coverage in review 5777147699, with integration checked by Star Lord this cycle.

Source-only: inspected the description, commit message and all four attached screenshots. The linked Linear issue returned only a generic application page, so its contents were unavailable. No tests, builds, app launches, CI verification, runtime performance or native/accessibility acceptance were performed; screenshots do not establish current-head behavior. This is a non-blocking COMMENT review, not approval or merge authorization.

@kazemek21
kazemek21 merged commit 6d54e26 into main Nov 5, 2026
44 checks passed
@kazemek21
kazemek21 deleted the kylez_NEXUS-3997_sidebar_row_contract branch November 5, 2026 01:14
gilgtm added a commit that referenced this pull request Nov 5, 2026
…lled-read

* origin/main: (28 commits)
  Run native Codex through plugin execution targets (#2150)
  test: split Solo access browser scenarios (#2499)
  feat(agents): let any agent change Buzz settings through the MCP (#2248)
  Let plugins decorate host sidebar rows and add sort modes (#1853)
  NEXUS-4082: Keep the new-message boundary stable during a visit (#2083)
  feat(agents): move version history into settings (#2374)
  fix(agents): read goose Activity by saved session ids and render memory bodies on open (#2466)
  feat(channels): starter channels: admin switch and relay auto_join flag (#1624)
  fix(plugins): read Square HTTPS sources with the Block SSH agent (#2465)
  feat(plugins): let agents request plugin changes for owner review (#2280)
  fix(messages): keep the hover toolbar while its menu is open (#2439)
  feat(workflows): suggest channel members for @ in Send Message text (#2309)
  AIDA-2344: Exclude muted channels from Dock (#2313)
  feat(search): add slack-style message search operators on desktop (#2463)
  test: fix invitation and coordination checks on main (#2517)
  perf(search): name searched people from the profile search response (#2353)
  Use the merge queue for pull requests that require it (#2452)
  fix(browser): load scheme-less address input over https, falling back to http (#2467)
  fix(identity): stop one-click key unlinks and show the linked backed-up key (#2486)
  fix(test): observe coordination transition events (#2297)
  ...

Signed-off-by: Gil Birman <[email protected]>
Co-authored-by: Claude <[email protected]>

# Conflicts:
#	docs/buzz-help.md
cheng-block added a commit to cheng-block/buzz-app that referenced this pull request Nov 5, 2026
…ettings-shift-esc

* upstream/main: (91 commits)
  test(browser): click timeline rows only after the timeline settles (block#2560)
  ci: split Vitest across six shards so 3/4 stops hitting the job cap (block#2571)
  feat(github): unfurl PR and issue links inline with their title (block#1693)
  fix(auth): style federated sign-in callback pages (block#2549)
  fix(agents): align creation model controls with identity (block#2480)
  Run native Codex through plugin execution targets (block#2150)
  test: split Solo access browser scenarios (block#2499)
  feat(agents): let any agent change Buzz settings through the MCP (block#2248)
  Let plugins decorate host sidebar rows and add sort modes (block#1853)
  NEXUS-4082: Keep the new-message boundary stable during a visit (block#2083)
  feat(agents): move version history into settings (block#2374)
  fix(agents): read goose Activity by saved session ids and render memory bodies on open (block#2466)
  feat(channels): starter channels: admin switch and relay auto_join flag (block#1624)
  fix(plugins): read Square HTTPS sources with the Block SSH agent (block#2465)
  feat(plugins): let agents request plugin changes for owner review (block#2280)
  fix(messages): keep the hover toolbar while its menu is open (block#2439)
  feat(workflows): suggest channel members for @ in Send Message text (block#2309)
  AIDA-2344: Exclude muted channels from Dock (block#2313)
  feat(search): add slack-style message search operators on desktop (block#2463)
  test: fix invitation and coordination checks on main (block#2517)
  ...

Signed-off-by: Cheng Peng <[email protected]>
Co-authored-by: Cursor <[email protected]>
cheng-block added a commit to cheng-block/buzz-app that referenced this pull request Nov 5, 2026
* upstream/main: (22 commits)
  test(browser): click timeline rows only after the timeline settles (block#2560)
  ci: split Vitest across six shards so 3/4 stops hitting the job cap (block#2571)
  feat(github): unfurl PR and issue links inline with their title (block#1693)
  fix(auth): style federated sign-in callback pages (block#2549)
  fix(agents): align creation model controls with identity (block#2480)
  Run native Codex through plugin execution targets (block#2150)
  test: split Solo access browser scenarios (block#2499)
  feat(agents): let any agent change Buzz settings through the MCP (block#2248)
  Let plugins decorate host sidebar rows and add sort modes (block#1853)
  NEXUS-4082: Keep the new-message boundary stable during a visit (block#2083)
  feat(agents): move version history into settings (block#2374)
  fix(agents): read goose Activity by saved session ids and render memory bodies on open (block#2466)
  feat(channels): starter channels: admin switch and relay auto_join flag (block#1624)
  fix(plugins): read Square HTTPS sources with the Block SSH agent (block#2465)
  feat(plugins): let agents request plugin changes for owner review (block#2280)
  fix(messages): keep the hover toolbar while its menu is open (block#2439)
  feat(workflows): suggest channel members for @ in Send Message text (block#2309)
  AIDA-2344: Exclude muted channels from Dock (block#2313)
  feat(search): add slack-style message search operators on desktop (block#2463)
  test: fix invitation and coordination checks on main (block#2517)
  ...

Signed-off-by: Cheng Peng <[email protected]>
Co-authored-by: Cursor <[email protected]>
cheng-block added a commit to cheng-block/buzz-app that referenced this pull request Nov 5, 2026
* upstream/main: (91 commits)
  test(browser): click timeline rows only after the timeline settles (block#2560)
  ci: split Vitest across six shards so 3/4 stops hitting the job cap (block#2571)
  feat(github): unfurl PR and issue links inline with their title (block#1693)
  fix(auth): style federated sign-in callback pages (block#2549)
  fix(agents): align creation model controls with identity (block#2480)
  Run native Codex through plugin execution targets (block#2150)
  test: split Solo access browser scenarios (block#2499)
  feat(agents): let any agent change Buzz settings through the MCP (block#2248)
  Let plugins decorate host sidebar rows and add sort modes (block#1853)
  NEXUS-4082: Keep the new-message boundary stable during a visit (block#2083)
  feat(agents): move version history into settings (block#2374)
  fix(agents): read goose Activity by saved session ids and render memory bodies on open (block#2466)
  feat(channels): starter channels: admin switch and relay auto_join flag (block#1624)
  fix(plugins): read Square HTTPS sources with the Block SSH agent (block#2465)
  feat(plugins): let agents request plugin changes for owner review (block#2280)
  fix(messages): keep the hover toolbar while its menu is open (block#2439)
  feat(workflows): suggest channel members for @ in Send Message text (block#2309)
  AIDA-2344: Exclude muted channels from Dock (block#2313)
  feat(search): add slack-style message search operators on desktop (block#2463)
  test: fix invitation and coordination checks on main (block#2517)
  ...

Signed-off-by: Cheng Peng <[email protected]>
Co-authored-by: Cursor <[email protected]>
ljknight added a commit to ljknight/buzz-app that referenced this pull request Nov 5, 2026
…nks-in-browser

* origin/main: (138 commits)
  feat(composer): optional ⌘/Ctrl+Enter to send (block#2331)
  test: use keyboard activation for reply caret setup (block#2557)
  test: settle member search before invitation expansion (block#2532)
  test(agent-command): isolate the copied executable writer (block#2537)
  test(sidebar): wait for the rolled-back row to leave Starred before collapsing Work (block#2574)
  test(browser): click timeline rows only after the timeline settles (block#2560)
  ci: split Vitest across six shards so 3/4 stops hitting the job cap (block#2571)
  feat(github): unfurl PR and issue links inline with their title (block#1693)
  fix(auth): style federated sign-in callback pages (block#2549)
  fix(agents): align creation model controls with identity (block#2480)
  Run native Codex through plugin execution targets (block#2150)
  test: split Solo access browser scenarios (block#2499)
  feat(agents): let any agent change Buzz settings through the MCP (block#2248)
  Let plugins decorate host sidebar rows and add sort modes (block#1853)
  NEXUS-4082: Keep the new-message boundary stable during a visit (block#2083)
  feat(agents): move version history into settings (block#2374)
  fix(agents): read goose Activity by saved session ids and render memory bodies on open (block#2466)
  feat(channels): starter channels: admin switch and relay auto_join flag (block#1624)
  fix(plugins): read Square HTTPS sources with the Block SSH agent (block#2465)
  feat(plugins): let agents request plugin changes for owner review (block#2280)
  ...

# Conflicts:
#	src/bundled/github/README.md
damienrj added a commit to damienrj/buzz-app that referenced this pull request Nov 5, 2026
* commit 'a39dba132^':
  feat(github): unfurl PR and issue links inline with their title (block#1693)
  fix(auth): style federated sign-in callback pages (block#2549)
  fix(agents): align creation model controls with identity (block#2480)
  Run native Codex through plugin execution targets (block#2150)
  test: split Solo access browser scenarios (block#2499)
  feat(agents): let any agent change Buzz settings through the MCP (block#2248)
  Let plugins decorate host sidebar rows and add sort modes (block#1853)
  NEXUS-4082: Keep the new-message boundary stable during a visit (block#2083)
  feat(agents): move version history into settings (block#2374)
  fix(agents): read goose Activity by saved session ids and render memory bodies on open (block#2466)
  feat(channels): starter channels: admin switch and relay auto_join flag (block#1624)
  fix(plugins): read Square HTTPS sources with the Block SSH agent (block#2465)
  feat(plugins): let agents request plugin changes for owner review (block#2280)
  fix(messages): keep the hover toolbar while its menu is open (block#2439)

Signed-off-by: damienrj <[email protected]>
ljknight added a commit to ljknight/buzz-app that referenced this pull request Nov 5, 2026
* origin/main: (121 commits)
  feat(composer): optional ⌘/Ctrl+Enter to send (block#2331)
  test: use keyboard activation for reply caret setup (block#2557)
  test: settle member search before invitation expansion (block#2532)
  test(agent-command): isolate the copied executable writer (block#2537)
  test(sidebar): wait for the rolled-back row to leave Starred before collapsing Work (block#2574)
  test(browser): click timeline rows only after the timeline settles (block#2560)
  ci: split Vitest across six shards so 3/4 stops hitting the job cap (block#2571)
  feat(github): unfurl PR and issue links inline with their title (block#1693)
  fix(auth): style federated sign-in callback pages (block#2549)
  fix(agents): align creation model controls with identity (block#2480)
  Run native Codex through plugin execution targets (block#2150)
  test: split Solo access browser scenarios (block#2499)
  feat(agents): let any agent change Buzz settings through the MCP (block#2248)
  Let plugins decorate host sidebar rows and add sort modes (block#1853)
  NEXUS-4082: Keep the new-message boundary stable during a visit (block#2083)
  feat(agents): move version history into settings (block#2374)
  fix(agents): read goose Activity by saved session ids and render memory bodies on open (block#2466)
  feat(channels): starter channels: admin switch and relay auto_join flag (block#1624)
  fix(plugins): read Square HTTPS sources with the Block SSH agent (block#2465)
  feat(plugins): let agents request plugin changes for owner review (block#2280)
  ...

# Conflicts:
#	docs/buzz-help.md
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.

4 participants