Skip to content

Filter and restore archived sidebar threads - #3933

Merged
brsbl merged 60 commits into
mainfrom
bb/sidebar-thread-lifecycle-filters-thr_cevdspix6j
Sep 21, 2026
Merged

brsbl merged 60 commits into
mainfrom
bb/sidebar-thread-lifecycle-filters-thr_cevdspix6j

Conversation

@brsbl

@brsbl brsbl commented Sep 19, 2026

Copy link
Copy Markdown
Collaborator

Human comments

What was wrong

Archived threads were absent from the sidebar hierarchy and could not be restored directly from their rows.

What changed

  • Filter Active and Archived in the combined sidebar menu, preserving sections, projects, machines, pins, and nesting.
  • Restore desktop rows with a persistent Unarchive action; mobile hides the action.
  • Remember filtering in this browser only. No SDK, plugin API, server contract, or CLI changes remain.

Keyboard focus uses the shared thin ring. Menu contents and customization remain lazy-loaded within the existing startup budget.

How you verified

  • Candidate: 73b10b3b38ab769ccc505daa110f22f0d76772d0, based on e06c73571506052b5543472a494def311f3724a3.
  • Exact-head CI: all 13 jobs passed.
  • PR CI: all scheduled checks passed.
  • Chrome for Testing 153.0.8010.52 verified the exact source web app with a fresh isolated server and 20 synthetic threads.
  • Desktop and compact filtering, local persistence, nonempty selection, nested menu navigation, and accessible app-root checks passed.
  • Desktop restoration preserved sidebar row order and the current route with Active and Archived selected.

Whole-build verification is complete at 73b10b3b38. Historical comparisons retain their actual SHAs below; the final slimming commit changes tests only.

Review and follow-ups

The explicitly requested #3933 Slop Cop source review at c2f3cbd1b found zero P0/P1 and three P2 follow-ups. Security and performance found none; architecture and correctness findings were deduplicated.

  • Archived-only restoration removes its row while pending and recreates it on failure.
  • Mixed archived pins can enter active-only reorder requests, which the server rejects.
  • Visible archived metadata can remain stale after remote edits.

These P2s were recorded, not implemented. The known compact-menu owner-removal focus issue and native iOS verification gap remain.

Slim PR removes 130 net test lines across three files by consolidating menu/filter transitions and duplicate rollback coverage. Restore, hierarchy metadata, paging, local persistence, cold keyboard loading, and compact navigation remain covered. Production code and public APIs are unchanged by this pass.

Earlier sidebar user QA was approved at 3fc3fdbc4. The user explicitly authorized merging #3933 after final validation.

Historical keyboard-focus evidence

Before: main baseline 699f2f1a8bfb0f22337ec30a0d5d53548baf56b9 · After: 706650ed60db0de8710a512fbd13cd3d31095907. Same fixture, route, focus target, scroll, theme, viewport and 2× density; full viewport, no cropped upper context. Mobile is compact web with hardware-keyboard focus, not native iOS.

State Viewport Before After
Keyboard focus · light Desktop · 1440×900 Before light focus Open before After light focus Open after
Keyboard focus · dark Desktop · 1440×900 Before dark focus Open before After dark focus Open after
Keyboard focus · light Mobile · 390×844 Before mobile focus Open before After mobile focus Open after

Historical sidebar filter and hierarchy evidence

Before: main baseline 699f2f1a8bfb0f22337ec30a0d5d53548baf56b9 · After: 706650ed60db0de8710a512fbd13cd3d31095907. Same synthetic fixture, route, light theme, viewport and 2× density. Main has no Filter submenu, so those before images show its preceding combined menu. Archived comparisons show main’s active hierarchy with the same stored archived threads.

State Viewport Before After
Combined menu Desktop · 1440×900 Before Combined menu Open before After Combined menu Open after
Filter · Active selected Desktop · 1440×900 Before Filter · Active selected Open before After Filter · Active selected Open after
Active and Archived · existing hierarchy Desktop · 1440×900 Before Active and Archived · existing hierarchy Open before After Active and Archived · existing hierarchy Open after
Archived only Desktop · 1440×900 Before Archived only Open before After Archived only Open after
Combined menu Mobile · 390×844 Before Combined menu Open before After Combined menu Open after
Filter · Active selected Mobile · 390×844 Before Filter · Active selected Open before After Filter · Active selected Open after
Active and Archived · existing hierarchy Mobile · 390×844 Before Active and Archived · existing hierarchy Open before After Active and Archived · existing hierarchy Open after
Archived only Mobile · 390×844 Before Archived only Open before After Archived only Open after

BB-Thread-ID: thr_cevdspix6j

AGENT GENERATED

@brsbl
brsbl removed this pull request from stack #3934 September 21, 2026 04:59
@brsbl
brsbl changed the base branch from bb/draft-lifecycle-thr_82jtfaq8eq to main September 21, 2026 04:59
@brsbl
brsbl added this pull request to stack #3980 September 21, 2026 04:59
@brsbl
brsbl merged commit 46f0c8e into main Sep 21, 2026
29 checks passed
@brsbl
brsbl deleted the bb/sidebar-thread-lifecycle-filters-thr_cevdspix6j branch September 21, 2026 23:00
brsbl added a commit that referenced this pull request Sep 22, 2026
## Human comments

## What was wrong

Thread search could not narrow active and archived results or include
archived threads before typing.

## What changed

- Filter Active and Archived through the shared dropdown; selecting both
shows All.
- Fetch up to 20 recently archived threads before typing, only when
Archived is selected.
- Remember the palette filter locally, independently of the sidebar,
without a new filtering API.

Archived recents use existing most-recently-archived ordering. Typed
search, expansion, split opening, and message anchors retain their
existing contracts. Palette queries remain lazy-loaded. No SDK, plugin
API, server contract, CLI, or database changes.

## How you verified

- Candidate `bb2024ca6cd9808d55715e13d2554132237b0ec3` on merged main
`46f0c8eb7168e05a087a62a1100c8f35cce9afa9`.
- [Exact-source
CI](https://github.com/get-bb/bb/actions/runs/35665673844): all 13 jobs
passed. [PR CI](https://github.com/get-bb/bb/actions/runs/35665677434):
passed.
- Chrome for Testing 153.0.8010.52 passed desktop/compact filtering, 6/3
cutoffs, expansion, no matches, and keyboard result navigation.
- Reload retained the palette selection independently of the sidebar.
Compact hides split shortcuts and keeps the palette open after Filter
Escape.

### Review and user QA

The earlier cumulative source review found no P0/P1 findings; no repeat
review ran. Slim PR keeps shared filter items and the lazy query
boundary. Only documentation conflicts needed resolution after #3933
merged.

User QA is pending. The inherited compact filter can return focus to
BODY while keeping the palette open. Native iOS Safari is unverified.
Saved-message indexing and draft-save guards remain excluded.

## Screenshot evidence

Before: main `46f0c8eb7168e05a087a62a1100c8f35cce9afa9` · After:
`bb2024ca6cd9808d55715e13d2554132237b0ec3` · 2× capture density.

Same isolated fixture, route, light theme, viewport, and scroll. Before
has no filter or archived recents, so those rows show the preceding
search view. Two synthetic titles retain an “archived” suffix after the
restoration check; they are active in both revisions. Relative
timestamps advance naturally between captures.

| Screen / state | Viewport | Before | After |
| --- | --- | --- | --- |
| Before typing · Active | Desktop · 1440×900 | [![Before Before typing
·
Active](https://github.com/user-attachments/assets/53f423fe-b698-496a-ae2d-eef0e5e35330)](https://github.com/user-attachments/assets/53f423fe-b698-496a-ae2d-eef0e5e35330)
[Open
before](https://github.com/user-attachments/assets/53f423fe-b698-496a-ae2d-eef0e5e35330)
| [![After Before typing ·
Active](https://github.com/user-attachments/assets/a0e5bc99-8047-4d43-9d84-d390894f861e)](https://github.com/user-attachments/assets/a0e5bc99-8047-4d43-9d84-d390894f861e)
[Open
after](https://github.com/user-attachments/assets/a0e5bc99-8047-4d43-9d84-d390894f861e)
|
| Filter dropdown | Desktop · 1440×900 | [![Before Filter
dropdown](https://github.com/user-attachments/assets/53f423fe-b698-496a-ae2d-eef0e5e35330)](https://github.com/user-attachments/assets/53f423fe-b698-496a-ae2d-eef0e5e35330)
[Open
before](https://github.com/user-attachments/assets/53f423fe-b698-496a-ae2d-eef0e5e35330)
| [![After Filter
dropdown](https://github.com/user-attachments/assets/8eb33479-a23e-4800-9f91-7a691ed9e14e)](https://github.com/user-attachments/assets/8eb33479-a23e-4800-9f91-7a691ed9e14e)
[Open
after](https://github.com/user-attachments/assets/8eb33479-a23e-4800-9f91-7a691ed9e14e)
|
| Before typing · All | Desktop · 1440×900 | [![Before Before typing ·
All](https://github.com/user-attachments/assets/53f423fe-b698-496a-ae2d-eef0e5e35330)](https://github.com/user-attachments/assets/53f423fe-b698-496a-ae2d-eef0e5e35330)
[Open
before](https://github.com/user-attachments/assets/53f423fe-b698-496a-ae2d-eef0e5e35330)
| [![After Before typing ·
All](https://github.com/user-attachments/assets/827f65d4-3849-4c75-bea4-35b618294d9c)](https://github.com/user-attachments/assets/827f65d4-3849-4c75-bea4-35b618294d9c)
[Open
after](https://github.com/user-attachments/assets/827f65d4-3849-4c75-bea4-35b618294d9c)
|
| Before typing · Archived | Desktop · 1440×900 | [![Before Before
typing ·
Archived](https://github.com/user-attachments/assets/53f423fe-b698-496a-ae2d-eef0e5e35330)](https://github.com/user-attachments/assets/53f423fe-b698-496a-ae2d-eef0e5e35330)
[Open
before](https://github.com/user-attachments/assets/53f423fe-b698-496a-ae2d-eef0e5e35330)
| [![After Before typing ·
Archived](https://github.com/user-attachments/assets/21f62372-5954-42b0-83c8-5d011561ebf5)](https://github.com/user-attachments/assets/21f62372-5954-42b0-83c8-5d011561ebf5)
[Open
after](https://github.com/user-attachments/assets/21f62372-5954-42b0-83c8-5d011561ebf5)
|
| Matching results · All | Desktop · 1440×900 | [![Before Matching
results ·
All](https://github.com/user-attachments/assets/49781f08-1ee4-454f-b1cb-4c4fedce9076)](https://github.com/user-attachments/assets/49781f08-1ee4-454f-b1cb-4c4fedce9076)
[Open
before](https://github.com/user-attachments/assets/49781f08-1ee4-454f-b1cb-4c4fedce9076)
| [![After Matching results ·
All](https://github.com/user-attachments/assets/94857651-3f40-4e3a-894c-7e68c8ae406c)](https://github.com/user-attachments/assets/94857651-3f40-4e3a-894c-7e68c8ae406c)
[Open
after](https://github.com/user-attachments/assets/94857651-3f40-4e3a-894c-7e68c8ae406c)
|
| No matches | Desktop · 1440×900 | [![Before No
matches](https://github.com/user-attachments/assets/d3b6c680-6ba5-4548-900e-b37c61b33ca1)](https://github.com/user-attachments/assets/d3b6c680-6ba5-4548-900e-b37c61b33ca1)
[Open
before](https://github.com/user-attachments/assets/d3b6c680-6ba5-4548-900e-b37c61b33ca1)
| [![After No
matches](https://github.com/user-attachments/assets/b1b3bdff-8d8f-421b-9d84-df9bee33baea)](https://github.com/user-attachments/assets/b1b3bdff-8d8f-421b-9d84-df9bee33baea)
[Open
after](https://github.com/user-attachments/assets/b1b3bdff-8d8f-421b-9d84-df9bee33baea)
|
| Before typing · Active | Mobile · 390×844 | [![Before Before typing ·
Active](https://github.com/user-attachments/assets/dadb7538-9c52-4e89-92a4-1de544ab28ae)](https://github.com/user-attachments/assets/dadb7538-9c52-4e89-92a4-1de544ab28ae)
[Open
before](https://github.com/user-attachments/assets/dadb7538-9c52-4e89-92a4-1de544ab28ae)
| [![After Before typing ·
Active](https://github.com/user-attachments/assets/32941ca6-ca11-4140-a45c-9406925edfaf)](https://github.com/user-attachments/assets/32941ca6-ca11-4140-a45c-9406925edfaf)
[Open
after](https://github.com/user-attachments/assets/32941ca6-ca11-4140-a45c-9406925edfaf)
|
| Filter dropdown | Mobile · 390×844 | [![Before Filter
dropdown](https://github.com/user-attachments/assets/dadb7538-9c52-4e89-92a4-1de544ab28ae)](https://github.com/user-attachments/assets/dadb7538-9c52-4e89-92a4-1de544ab28ae)
[Open
before](https://github.com/user-attachments/assets/dadb7538-9c52-4e89-92a4-1de544ab28ae)
| [![After Filter
dropdown](https://github.com/user-attachments/assets/1d586ba8-5f34-46ba-9147-c99145e6e3ed)](https://github.com/user-attachments/assets/1d586ba8-5f34-46ba-9147-c99145e6e3ed)
[Open
after](https://github.com/user-attachments/assets/1d586ba8-5f34-46ba-9147-c99145e6e3ed)
|
| Before typing · All | Mobile · 390×844 | [![Before Before typing ·
All](https://github.com/user-attachments/assets/dadb7538-9c52-4e89-92a4-1de544ab28ae)](https://github.com/user-attachments/assets/dadb7538-9c52-4e89-92a4-1de544ab28ae)
[Open
before](https://github.com/user-attachments/assets/dadb7538-9c52-4e89-92a4-1de544ab28ae)
| [![After Before typing ·
All](https://github.com/user-attachments/assets/126cabfe-b028-4844-ac5a-57ffaf4a8523)](https://github.com/user-attachments/assets/126cabfe-b028-4844-ac5a-57ffaf4a8523)
[Open
after](https://github.com/user-attachments/assets/126cabfe-b028-4844-ac5a-57ffaf4a8523)
|
| Before typing · Archived | Mobile · 390×844 | [![Before Before typing
·
Archived](https://github.com/user-attachments/assets/dadb7538-9c52-4e89-92a4-1de544ab28ae)](https://github.com/user-attachments/assets/dadb7538-9c52-4e89-92a4-1de544ab28ae)
[Open
before](https://github.com/user-attachments/assets/dadb7538-9c52-4e89-92a4-1de544ab28ae)
| [![After Before typing ·
Archived](https://github.com/user-attachments/assets/589eb063-ca3f-4024-ad56-7173f71f72ad)](https://github.com/user-attachments/assets/589eb063-ca3f-4024-ad56-7173f71f72ad)
[Open
after](https://github.com/user-attachments/assets/589eb063-ca3f-4024-ad56-7173f71f72ad)
|
| Matching results · All | Mobile · 390×844 | [![Before Matching results
·
All](https://github.com/user-attachments/assets/43f3b665-be2c-4d2a-a16a-e60828f7ebe3)](https://github.com/user-attachments/assets/43f3b665-be2c-4d2a-a16a-e60828f7ebe3)
[Open
before](https://github.com/user-attachments/assets/43f3b665-be2c-4d2a-a16a-e60828f7ebe3)
| [![After Matching results ·
All](https://github.com/user-attachments/assets/2e6d19a4-4acc-4f7c-9510-f094598063f0)](https://github.com/user-attachments/assets/2e6d19a4-4acc-4f7c-9510-f094598063f0)
[Open
after](https://github.com/user-attachments/assets/2e6d19a4-4acc-4f7c-9510-f094598063f0)
|
| No matches | Mobile · 390×844 | [![Before No
matches](https://github.com/user-attachments/assets/f114111c-a460-4f08-be8e-974f9171e03e)](https://github.com/user-attachments/assets/f114111c-a460-4f08-be8e-974f9171e03e)
[Open
before](https://github.com/user-attachments/assets/f114111c-a460-4f08-be8e-974f9171e03e)
| [![After No
matches](https://github.com/user-attachments/assets/234d6406-a438-4d8f-bf01-7cd3ef268820)](https://github.com/user-attachments/assets/234d6406-a438-4d8f-bf01-7cd3ef268820)
[Open
after](https://github.com/user-attachments/assets/234d6406-a438-4d8f-bf01-7cd3ef268820)
|

BB-Thread-ID: thr_igw6sh3963

> AGENT GENERATED
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