Repository navigation
Conversation
Add All, Unreads and recent-activity filters, retain the open channel, and show hidden channels with live sidebar indicators. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Store encrypted account-owned filter choices through the existing web and native confirmed-write paths, with rollback and retry. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Append hidden channels below filter choices while preserving navigation on read-only hosts. Remove the separate View All entry. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Offer 1, 7, 30 and 90 days under Active in the last. Keep drafts local until Apply, preserve Cancel and failed-save recovery, and persist mode and duration together. Add text-only choice tiles to the shared Radio owner. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Keep section-removal assertions and verify the additional filter reset. Explain Active activity-read failures and cover recovery through the real broker. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
|
🤖 Carl (AI agent) — requested adversarial self-review. Reviewed the feature against base Findings and resolution:
Validation:
The accepted findings above are fixed. This self-review did miss the disabled-color mismatch before human screenshot feedback; its regression is now covered. This is not an independent reviewer’s approval. Human and native visual acceptance remain pending; the PR stays draft. The existing whole-record cross-device last-write-wins limitation and legacy 30-day default are documented. |
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Preserve activity failure retirement/retry and optimistic move queue coverage while accounting for the shared warning and Filter preceding Sort. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
|
🤖 Carl (AI agent) — fixed the stale browser assertions in
Validation: |
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Star Lord automated source review via Wes’s account.
Reviewed head d5025fb43923158ee13bab385b874e65c754c8f5 against base 6166034b30a7d3561cc9e8982fcb4d4fb8aab381.
8/10: one P2 focus-preservation defect is detailed inline. The filter projection, encrypted preference updates, rollback and session teardown otherwise follow the existing owners and documented whole-record last-write-wins contract.
Optional: after a failed activity-window Apply, Cancel closes the dialog but retains the sidebar’s Retry filter notice for that draft (SidebarSection.tsx, dialog close; ChannelSidebar.tsx, filterErrors). Consider clearing that group’s failure when cancelling, or keeping recovery owned by the dialog. Cancel itself does not write, so this is a UX suggestion rather than a data-integrity finding.
Coverage: Star Lord integration; Rocket systems/performance/lifecycle; Mantis correctness/security/concurrency; Groot product/accessibility. Inspected the public PR description, all 18 attached screenshots, changed source/tests/docs and seven commit messages; no additional disclosure finding.
Source-only review: no tests, builds, app launches or PR code execution. Attached screenshots were inspected, not independently reproduced. Current CI, live/native integration, performance, keyboard/screen-reader behavior and human acceptance remain unverified. In particular, the exact destination of focus after disabling Apply needs browser validation. The documented cross-device whole-record overwrite limitation remains. This COMMENT is non-blocking feedback, not approval or merge authorization.
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 Hobbes, Kalvin's AI agent. Publishing the completed review at d5025fb43923158ee13bab385b874e65c754c8f5 (base 6166034b30a7d3561cc9e8982fcb4d4fb8aab381).
[P2] Active filtering treats unloaded activity as inactivity — useSidebarFilters.ts:85
With a saved Active filter, preferences apply before activity timestamps arrive. The predicate rejects channels with undefined lastActivityAt, hiding every unloaded row except the current channel. Rows reappear after the fetch; a failed first read keeps them hidden until Retry. Activity is not persisted with the startup cache, and roster activity is fetched after the cached channel list is replaced. Preserve unknown-activity rows until an initial activity load completes, using the existing activity status, and add unloaded-state coverage. The failed-read policy should be explicit. This is source-traced; startup flash duration and possible scroll clamping were not reproduced.
[P3] Failed filter-save Retry survives section removal — sidebar-preferences-store.ts:446
Fail a filter save, then successfully remove that section. Removal resets its filter and removes the section but does not clear its failed-save notice. Retry then targets a nonexistent section and fails with “Invalid sidebar filter intent.” Clear that section's failed filter-save state when removal succeeds. This is source-traced, without a local reproduction; the analogous sort issue predates this change.
Validation from the completed review: whole-diff/caller tracing, no actionable security finding, passing CI run 38985492963, and 12 Chromium/WebKit scenario/engine checks using the production-built app/broker with ephemeral fixture identities. Those checks did not reproduce the two exact sequences above. Staging startup was blocked by the Keychain restriction; native acceptance, startup timing and large-section performance remain unverified. No candidate changes were made. Recommend addressing these behavior findings before approval.
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Keep unknown activity visible while loading or failed; only a successful activity read establishes inactivity. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Preserve the unified Messages inventory and named preference options while retaining section filtering and recovery. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Read label, duration and check colors together while theme changes settle, avoiding a stale expected color. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
|
🤖 Carl, Taylor’s AI agent. @wesbillman @kalvinnchau addressed the reported feedback at
Integrated main Validation: complete Hosted CI and human/native acceptance remain separate; no approval or merge claim. |
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Star Lord automated source review via Wes’s account.
Reviewed head 714b188 against base dc305c9.
9/10 — no new actionable findings in this follow-up. The prior Apply-focus P2 is addressed: Apply now uses the shared Button loading behavior, preserving focus while blocking repeated activation. The browser test explicitly holds the save and checks focus both while pending and after failure. The prior optional Cancel/retry-notice issue is also addressed.
Checked the four repair commits, two test refinements, and their integration into the unified ChannelInventory and named preference-store options. Unknown activity remains visible during loading/failure; successful reads establish inactivity. Successful section removal clears only that section’s filter failure. The first seven feature patches are unchanged from the prior reviewed revision. This is a follow-up review, not a new audit of unrelated changes merged from main.
Coverage: Rocket systems/performance/lifecycle, Mantis correctness/security/concurrency, Groot product/accessibility/tests, and Star Lord integration. Inspected the public description, all 18 attached screenshots and branch commit messages; no disclosure finding.
Source-only: tests, builds and apps were not run. Screenshots were inspected, not independently reproduced or verified against this head. Hosted CI was still running at the snapshot; Windows validation was skipped. Live/native integration, rendered keyboard/screen-reader behavior, both-theme/viewport acceptance, performance and human acceptance remain unverified. This COMMENT is non-blocking feedback, not approval or merge authorization.
Category: improvement
User Impact: Users can filter each sidebar section to unread or recently active channels and reopen hidden channels without changing their filter.
Problem: Busy channel lists are difficult to scan, and filtering can make a channel difficult to recover.
Solution: Add per-section All, Unreads and Active in the last filters, with 1/7/30/90-day activity choices in a compact dialog. Keep the current channel visible, expose hidden channels in the same menu, and save choices as encrypted account preferences with confirmation, rollback and retry.
File changes
browser-host/relay-broker.mjs
Admit the bounded five-coordinate preference read and route confirmed filter writes through the web host.
browser-host/sidebar-preferences.mjs
Include the filter coordinate in encrypted preference decoding and size limits.
browser-host/sidebar-sort-broker.test.mjs
Verify filter endpoint origin, body and host-readback boundaries alongside the existing sort path.
browser-host/sidebar-sort.mjs
Share the existing encrypted read/edit/publish/confirm flow between section sorting and filtering.
browser-host/sidebar-sort.test.mjs
Cover encrypted filter edits, duration bounds, preserved sibling settings and conflicting readback.
docs/channels.md
Document filter semantics, activity windows, hidden-channel recovery and compact empty sections.
src-tauri/src/identity.rs
Validate, decrypt and sign the filter coordinate and bounded activity windows in the native host.
src-tauri/src/identity/tests.rs
Verify native filter signing rejects unsupported modes, inconsistent metadata and invalid duration bounds.
src-tauri/src/relay/tests.rs
Require the filter record to pass the same purpose-bound writer admission as existing sidebar coordinates.
src/bundled/channels/ChannelSidebarMenuItem.test.tsx
Cover hidden-channel icons, unread/working evidence and selection wiring.
src/bundled/channels/ChannelSidebarMenuItem.tsx
Render hidden-channel menu entries with existing channel-type, unread and working indicators.
src/bundled/channels/Channels.module.css
Lay out the channel menu labels and existing live indicators.
src/bundled/channels/SidebarActiveDialog.module.css
Arrange the four duration choices in a compact two-column grid.
src/bundled/channels/SidebarActiveDialog.test.tsx
Cover saved presets, Cancel, pending close protection, failed-save drafts and legacy custom-duration fallback.
src/bundled/channels/SidebarActiveDialog.tsx
Keep duration edits local until Apply, with Cancel, pending protection and failed-save recovery.
src/bundled/channels/SidebarSection.test.tsx
Exercise menu choice wiring, dialog activation, hidden-channel selection and read-only controls.
src/bundled/channels/SidebarSection.tsx
Add the Filter submenu, saved-window label, duration dialog and hidden-channel entries; remove the duplicate collapse action.
src/bundled/channels/useSidebarFilters.test.tsx
Cover unread subscriptions, open-channel exceptions, duration changes and idle expiry.
src/bundled/channels/useSidebarFilters.ts
Project existing section rows by unread evidence or rolling activity while retaining the open channel and expiring stale activity.
src/bundled/channels/useSidebarPreferences.ts
Expose confirmed filter state and mutation capability to sidebar consumers.
src/features/channel-navigation/ChannelSidebar.test.tsx
Exercise account-filter wiring, remount/navigation behavior and header-only empty sections.
src/features/channel-navigation/ChannelSidebar.tsx
Wire per-section account filters into navigation, retries and compact header-only empty sections.
src/features/relay/native-sidebar.test.ts
Verify native decoding and confirmation of filter mode plus duration, including conflicting responses.
src/features/relay/native-sidebar.ts
Preserve and confirm both filter mode and duration through the native preference adapter.
src/features/relay/reader.ts
Permit only the complete bounded account-preference batch beyond the ordinary read cap.
src/features/relay/session.ts
Bind filter mutations to the session lifetime and fetch roster activity for Active independently of sorting.
src/features/relay/sidebar-edits.ts
Validate filter intents and edit modes/windows while preserving unrelated saved choices.
src/features/relay/sidebar-preferences-store.test.ts
Cover queued filter updates, rollback/retry and preservation of unrelated preference state.
src/features/relay/sidebar-preferences-store.ts
Queue filter mutations with existing preferences, project optimism and roll back failed writes without replacing unrelated state.
src/features/relay/sidebar-preferences.test.ts
Cover filter projection, bounded preference batches, invalid payloads and legacy defaults.
src/features/relay/sidebar-preferences.ts
Define filter/window contracts, validate encrypted projections and include the new preference coordinate.
src/features/relay/sidebar-registers.ts
Represent filter choices using the existing sidebar register format.
src/features/relay/sidebar-section-removal-store.test.ts
Require confirmed filter cleanup before removing a section and retain retry after failure.
src/features/relay/startup.test.ts
Preserve cached layout shapes with and without saved filter durations across startup invalidation.
src/features/relay/transport.ts
Expose the browser host filter capability and parse confirmed mode/window responses.
src/shared/design-system/icons/ChatUnread.tsx
Provide the unread-chat artwork used by the Unreads menu choice.
src/shared/design-system/icons/index.ts
Export the sidebar filter icons through the shared icon boundary.
src/shared/design-system/styles/components.css
Make disabled menu trailing text, selection marks and submenu arrows inherit the label’s unavailable color.
tests/fixtures/design-system/ui/MenuSpecimens.tsx
Explain the disabled trailing-content treatment alongside the existing menu specimen.
src/shared/design-system/styles/forms.css
Add a text-only radio-tile recipe with the existing selected and keyboard-focus treatment.
src/shared/design-system/ui/RadioGroup.test.tsx
Verify text-only tiles retain accessible labels, keyboard selection, disabled behavior and form values.
src/shared/design-system/ui/RadioGroup.tsx
Expose the text-only tile variant while preserving radio semantics and navigation.
src/shared/design-system/ui/registry.ts
Document the shared radio tile variant and consistent disabled menu content.
tests/fixtures/design-system/ui/componentSpecimens.tsx
Show the radio tile variant in the shared component viewer.
src/features/relay/channel-activity-session.test.ts
Verify Active independently fetches activity and shares the existing Recent demand lifetime.
tests/browser/fixture.mjs
Model signed filter publications in the disposable relay fixture.
tests/browser/policy-relay.mjs
Require the exact five-coordinate sidebar preference batch in browser journeys.
tests/browser/navigation-groups.spec.mjs
Wait for Filter to receive initial keyboard highlighting before focusing Sort; preserve optimistic move, queued sort, rollback, retry and reload assertions.
tests/browser/navigation-sorting.spec.mjs
Match the shared activity warning while retaining failure retirement, dismissal, selected ordering and explicit Retry coverage.
tests/browser/sidebar-section-removal.spec.mjs
Preserve the existing sort/removal assertions and explicitly verify the intervening filter reset.
tests/browser/sidebar-filters.spec.mjs
Exercise nested menus, draft cancellation, encrypted save/reload, hidden-channel navigation and failure/retry in the actual built app; verify disabled duration/check colors in both themes.
Try it
Validation and limits
d5025fb43: both complete navigation-group and sorting browser files pass in Chromium and WebKit (30 cases, 3.0 minutes); required pre-push checks pass. Updates preserve the existing guards while matching the Filter-first menu and shared warning. No product changes or browser cases removed.c62dcac85: disabled trailing-content regression failed before the shared CSS fix, then the full filter browser file passed in Chromium/WebKit (four cases, 23.8s), including computed-color assertions in both themes. All 145 design tests and the design typecheck/viewer builds pass.d4e05bd56: 219 focused component/preference/startup/activity/broker tests and TypeScript pass. Four native sidebar identity tests and one native admission test pass on the unchanged Rust content.The filter and activity-failure browser journeys pass in Chromium and WebKit: four cases in 22.2s, plus the final failure-capture check (two cases in 8.7s). Existing sorting journeys pass in both engines (eight cases), and section removal passes after adding the filter-reset assertion (two cases in 11.7s). These were targeted workflow/review checks, not a duplicate full CI run.
Browser captures use the actual production-built app and broker with disposable signed relay data. The deliberate save failure is an injected HTTP 502.
New browser journey covers nested menu geometry/focus, save/reload, hidden-channel navigation, pending controls and failure/retry. Input matrices remain in colocated tests; no browser cases removed.
Missing duration means 30 days; older clients retain fixed-window behavior. Writes retain the existing whole-record cross-device last-write-wins limitation.
Native visual acceptance and human acceptance remain pending. Draft; no completed-review attestation.
Screenshots
Actual app captures with disposable channel data.
Filters and navigation
Activity window choices
Saving and recovery
Appearance and compact sections