docs: complete Phase 396 and plan Phase 397 guild inbox (v0.8.359)

Document forum inbox verification, channel PageUp/Down, threads filter focus
restore, and boot chain. Open Phase 397 with twenty progressive guild/voice items.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Raven Scott
2026-05-23 14:11:13 -04:00
co-authored by Cursor
parent 489687709d
commit 1d60022671
6 changed files with 62 additions and 22 deletions
+2
View File
@@ -32,6 +32,8 @@ While the message box is focused, worker `state` polls defer full `render()` to
## Focus (Discord parity)
**v0.8.359:** Phase 396 re-verified slowmode `aria-describedby` on channel switch, dynamic `aria-label` on `#message-input`, and `@everyone` thread toasts citing the parent channel name. Smokes: `npm run test:composer-slowmode-describedby-channel`, `npm run test:composer-aria-label`, `npm run test:composer-mention-everyone-thread-parent-toast`.
**v0.8.356:** Slowmode `aria-describedby` re-syncs on channel switch via `syncComposerSlowmodeAriaDescribedby` (called from `syncSlowmodeComposer` and `updateComposerState`). Smokes: `npm run test:composer-slowmode-describedby-channel`, `npm run test:composer-aria-label`.
**v0.8.349:** `#message-input` `aria-label` tracks channel/DM context via `syncComposerAccessibleLabel` (matches placeholder). Active slowmode links the input to `#slowmode-composer-pill` with `aria-describedby`. Trace focus with `localStorage pearcord.traceComposer=1`. Smoke: `npm run test:composer-aria-label`.
+2
View File
@@ -100,6 +100,8 @@ Inbox rows include `messageId` for jump navigation. See [MESSAGE_DEEP_LINKS.md](
**v0.8.358:** **Open notification** on text channels dismisses thread-family desktop for all threads under the parent channel (`open-notification` IPC, Phase 395 re-verified). Smokes: `npm run test:open-notification-channel-thread-family-desktop`, `npm run test:agentctl-thread-inbox-mark-channel-read`.
**v0.8.359:** **Mark notification read** on forum channels dismisses thread-family desktop for all forum post threads (`mark-notification-read-cleared` IPC, Phase 396 re-verified). Smokes: `npm run test:mark-notification-read-forum-thread-family-desktop`, `npm run test:agentctl-thread-inbox-mark-notification-read`.
**v0.8.357:** **Navigate to message** on forum channels dismisses thread-family desktop for all forum post threads under the channel (`navigateToMessage`, Phase 394 re-verified). Smokes: `npm run test:navigate-forum-thread-family-desktop`, `npm run test:navigate-guild-thread-family-desktop`.
**v0.8.356:** **Mark notification read** on forum channels dismisses thread-family desktop for all forum post threads (`mark-notification-read-cleared` IPC, Phase 393 re-verified). Smokes: `npm run test:mark-notification-read-forum-thread-family-desktop`, `npm run test:navigate-forum-thread-family-desktop`, `npm run test:agentctl-thread-inbox-mark-notification-read`.
+51 -21
View File
@@ -5623,28 +5623,57 @@ Fix guild switching, session boot gating, and theme/prefs application before mic
| ID | Item | Status |
|----|------|--------|
| P396-1 | Search: forum sidecar stale age when guild scope cached (verify) | [ ] |
| P396-2 | Search mesh refresh: remove `aria-pressed` from refresh button while idle (verify) | [ ] |
| P396-3 | Platform: `setSearch` mesh-on logs scope on cache miss at debug (verify) | [ ] |
| P396-4 | Composer: slowmode `aria-describedby` sync on channel switch (verify) | [ ] |
| P396-5 | Notifications: mark-notification-read clears forum thread family (verify) | [ ] |
| P396-6 | Composer: mention-everyone thread toast cites parent (verify) | [ ] |
| P396-7 | UI: channel list PageUp/Down jumps 5 channels (Discord parity) | [ ] |
| P396-8 | Voice: remote mute pill name aria bundle smoke (verify) | [ ] |
| P396-9 | Logging: Clipboard JSONL `sessionError` smoke (verify) | [ ] |
| P396-10 | Diagnostics filter: **Voice errors** bundle smoke (verify) | [ ] |
| P396-11 | Agentctl: forum search mesh-off then mesh-on refresh (reuse) | [ ] |
| P396-12 | Agentctl: thread inbox mark-notification-read roundtrip (reuse) | [ ] |
| P396-13 | Companion: channels panel verify disabled while guild loading | [ ] |
| P396-14 | UI: threads panel reopen restores last filter chip focus | [ ] |
| P396-15 | Smoke: `test:navigate-forum-thread-family-desktop` | [ ] |
| P396-16 | Smoke: `test:platform-setsearch-mesh-on-cache-miss` | [ ] |
| P396-17 | Docs: `SEARCH.md` + `COMPOSER.md` forum inbox refresh | [ ] |
| P396-18 | Docs: `NOTIFICATIONS.md` mark-notification-read forum family | [ ] |
| P396-19 | Boot: chain Phase 396 progressive smokes | [ ] |
| P396-20 | Phase 397 guild inbox & voice depth (v0.8.359) | [ ] |
| P396-1 | Search: forum sidecar stale age when guild scope cached (verify) | [x] |
| P396-2 | Search mesh refresh: remove `aria-pressed` from refresh button while idle (verify) | [x] |
| P396-3 | Platform: `setSearch` mesh-on logs scope on cache miss at debug (verify) | [x] |
| P396-4 | Composer: slowmode `aria-describedby` sync on channel switch (verify) | [x] |
| P396-5 | Notifications: mark-notification-read clears forum thread family (verify) | [x] |
| P396-6 | Composer: mention-everyone thread toast cites parent (verify) | [x] |
| P396-7 | UI: channel list PageUp/Down jumps 5 channels (Discord parity) | [x] |
| P396-8 | Voice: remote mute pill name aria bundle smoke (verify) | [x] |
| P396-9 | Logging: Clipboard JSONL `sessionError` smoke (verify) | [x] |
| P396-10 | Diagnostics filter: **Voice errors** bundle smoke (verify) | [x] |
| P396-11 | Agentctl: forum search mesh-off then mesh-on refresh (reuse) | [x] |
| P396-12 | Agentctl: thread inbox mark-notification-read roundtrip (reuse) | [x] |
| P396-13 | Companion: channels panel verify disabled while guild loading | [x] |
| P396-14 | UI: threads panel reopen restores last filter chip focus | [x] |
| P396-15 | Smoke: `test:navigate-forum-thread-family-desktop` | [x] |
| P396-16 | Smoke: `test:platform-setsearch-mesh-on-cache-miss` | [x] |
| P396-17 | Docs: `SEARCH.md` + `COMPOSER.md` forum inbox refresh | [x] |
| P396-18 | Docs: `NOTIFICATIONS.md` mark-notification-read forum family | [x] |
| P396-19 | Boot: chain Phase 396 progressive smokes | [x] |
| P396-20 | Phase 397 guild inbox & voice depth (v0.8.359) | [x] |
**Next:** P396-1P396-19.
**Next:** ~~Phase 396~~ (complete).
---
### Phase 397 — Guild inbox & voice depth (v0.8.359)
| ID | Item | Status |
|----|------|--------|
| P397-1 | Search: guild sidecar stale age when forum scope cached (verify) | [ ] |
| P397-2 | Search mesh refresh: remove `aria-busy` from refresh button while idle (verify) | [ ] |
| P397-3 | Platform: `setSearch` mesh-off logs scope on cache hit at debug (verify) | [ ] |
| P397-4 | Voice: stage speaker row `aria-current` when active (verify) | [ ] |
| P397-5 | Notifications: mark-channel-read clears guild thread family (verify) | [ ] |
| P397-6 | Composer: mention-channel thread toast cites parent (verify) | [ ] |
| P397-7 | UI: server rail Home/End roving between guild icons (Discord parity) | [ ] |
| P397-8 | Voice: remote deafen pill name aria bundle smoke (verify) | [ ] |
| P397-9 | Logging: Clipboard JSONL `guildLoading` bool smoke (verify) | [ ] |
| P397-10 | Diagnostics filter: **IPC errors** bundle smoke (verify) | [ ] |
| P397-11 | Agentctl: guild search mesh-off then mesh-on refresh (reuse) | [ ] |
| P397-12 | Agentctl: thread inbox mark-channel-read roundtrip (reuse) | [ ] |
| P397-13 | Companion: compose panel verify disabled while guild loading | [ ] |
| P397-14 | UI: voice panel Escape returns focus to channel list | [ ] |
| P397-15 | Smoke: `test:navigate-guild-thread-family-desktop` | [ ] |
| P397-16 | Smoke: `test:platform-setsearch-mesh-off-cache-hit` | [ ] |
| P397-17 | Docs: `SEARCH.md` + `VOICE.md` guild inbox refresh | [ ] |
| P397-18 | Docs: `NOTIFICATIONS.md` mark-channel-read guild family | [ ] |
| P397-19 | Boot: chain Phase 397 progressive smokes | [ ] |
| P397-20 | Phase 398 channel inbox & threads depth (v0.8.360) | [ ] |
**Next:** P397-1P397-19.
---
@@ -7090,6 +7119,7 @@ Absorbed into Phase 273 (P273-5P273-8, P273-11P273-12). See Phase 274 for
### Changelog
- **2026-05-23** — v0.8.359: Phase 396 — forum sidecar stale guild meta; channel PageUp/Down ±5; threads reopen filter focus; mark-notification-read forum family; composer slowmode/aria/everyone toast; agentctl forum search + thread inbox; boot chain. Phase 397 planned.
- **2026-05-23** — v0.8.358: Phase 395 — channel sidecar stale forum meta; typeahead wrap; threads Escape close; open-notification channel family; agentctl guild search + thread inbox; boot chain. Phase 396 planned.
- **2026-05-23** — v0.8.357: Phase 394 — guild sidecar stale channel meta; channel list Home/End; members Space profile; navigate forum/guild thread family; agentctl guild search + thread inbox; boot chain. Phase 395 planned.
- **2026-05-23** — v0.8.356: Phase 393 — forum sidecar stale channel meta; filter chip Enter/Space; members Enter profile; slowmode describedby on channel switch; mark-notification-read forum family; agentctl forum search + thread inbox; boot chain. Phase 394 planned.
+2
View File
@@ -152,6 +152,8 @@ See also [FORUM_ARCHIVE_SEARCH.md](./FORUM_ARCHIVE_SEARCH.md).
**v0.8.263:** `loadGuild` / `openHome` bust search cache before light `view`. Cache hits require matching `_searchCacheGuildId`. Mesh chip shows **cached** when `view.searchResultsCached`. Forum archived toggle calls `refresh-search`. Debug logs `guild.search cache miss` with reason. Smokes: `npm run test:guild-switch-search-cache-bust`, `npm run test:search-cached-chip`, `npm run test:forum-archived-search-refresh`.
**v0.8.359:** Forum sidecar stale age falls back to `guildMetaStale.fetchedAt` when guild scope uses cached forum meta (Phase 396 re-verified). Mesh **↻** clears `aria-pressed` when idle (fresh). `setSearch` logs `guild.search setSearch mesh-on cache miss` with `scope` when mesh is on and cache misses. Smokes: `npm run test:forum-sidecar-stale-guild-meta`, `npm run test:search-mesh-refresh-btn-no-pressed-idle`, `npm run test:platform-setsearch-mesh-on-cache-miss`.
**v0.8.358:** Channel sidecar stale age falls back to `forumMetaStale.fetchedAt` when forum scope uses cached channel meta (Phase 395 re-verified). Mesh **↻** clears `aria-disabled` when idle (fresh). `refreshSearch` logs `guild.search refresh mesh-on cache hit` with `scope` when mesh is on and cache hits. Smokes: `npm run test:channel-sidecar-stale-forum-meta`, `npm run test:search-mesh-refresh-btn-no-disabled-idle`, `npm run test:platform-refresh-mesh-on-cache-hit`.
**v0.8.357:** Guild sidecar stale age falls back to `channelMetaStale.fetchedAt` when channel scope uses cached guild meta (Phase 394 re-verified). Mesh **↻** clears `aria-controls` when idle (fresh), restores `search-mesh-chip` when stale. `refreshSearch` logs `guild.search refresh mesh-off cache miss` with `scope` when mesh is off and cache misses. Smokes: `npm run test:guild-sidecar-stale-channel-meta`, `npm run test:search-mesh-refresh-btn-no-controls-idle`, `npm run test:platform-refresh-mesh-off-cache-miss`.
+2
View File
@@ -56,6 +56,8 @@ Unread uses existing `READ_STATE` per thread channel (same as text channels).
**v0.8.259:** Archived rows with `hasMention` show an **@** pill; `mentionAlerts` drives `enrichThreadRow.hasMention`.
**v0.8.359:** Reopening the panel (collapse toggle or filter change) restores keyboard focus on the last active filter chip via `focusThreadsFilterChip(lastThreadsPanelFilter)`. Smoke: `npm run test:threads-panel-reopen-filter-focus`.
**v0.8.358:** **Escape** collapses the threads panel when focus is inside `#threads-panel` (toolbar, filter chips, or thread rows). Smoke: `npm run test:threads-panel-escape-close`.
**v0.8.356:** **Enter** / **Space** on a focused filter chip applies that filter (same as click). Smoke: `npm run test:threads-filter-enter-space`.
+3 -1
View File
@@ -50,6 +50,7 @@ All other UI IPC types are implemented in `dispatchUiMessage` (voice, forum, sti
| Composer | **Ctrl+Shift+M** (⌘⇧M) | Focus message input when guild/DM is active |
| Threads panel | **Home** / **End** | Roving focus to first/last thread row (active + archived lists) |
| Channel list | **az**, **09** | Typeahead: next match after focused row, then wrap from top (v0.8.358) |
| Channel list | **PageUp** / **PageDown** | Roving focus ±5 visible channel rows (v0.8.359) |
| Channel list | **↑** / **↓** | Roving focus between visible channel rows (v0.8.351) |
| Channel list | **Home** / **End** | Roving focus to first/last channel row (v0.8.357) |
| Channel list | **Enter** / **Space** | Select the focused channel row (join voice / open text) (v0.8.354) |
@@ -59,6 +60,7 @@ All other UI IPC types are implemented in `dispatchUiMessage` (voice, forum, sti
| Threads panel | **Space** | Open focused archived mention row (same as Enter) (v0.8.355) |
| Threads filters | **←** / **→** | Roving focus between filter chips in the toolbar (v0.8.355) |
| Threads panel | **Escape** | Collapse the threads panel when focus is inside it (v0.8.358) |
| Threads panel | Reopen | Restores keyboard focus on the last active filter chip (`lastThreadsPanelFilter`, v0.8.359) |
| Threads filters | **Enter** / **Space** | Activate the focused filter chip (v0.8.356) |
| Members list | **Enter** / **Space** | Open profile popover for focused member row (v0.8.357) |
| User panel | **Enter** / **Space** on custom status | Open status editor when custom status is visible (v0.8.353) |
@@ -66,7 +68,7 @@ All other UI IPC types are implemented in `dispatchUiMessage` (voice, forum, sti
| Threads panel | **↑** / **↓** | Roving focus between all thread rows (active + archived) (v0.8.351) |
| Threads filters | **16** | Switch thread filter chips when the threads panel is open |
Smokes: `npm run test:composer-focus-shortcut`, `npm run test:threads-panel-home-end`, `npm run test:threads-panel-space-mention-row`, `npm run test:threads-panel-escape-close`, `npm run test:threads-filter-arrow-roving`, `npm run test:threads-filter-enter-space`, `npm run test:channel-list-typeahead-wrap`, `npm run test:members-list-enter-profile`, `npm run test:members-list-space-profile`, `npm run test:composer-slowmode-describedby-channel`, `npm run test:channel-list-home-end`, `npm run test:channel-list-typeahead`, `npm run test:channel-list-arrow-roving`, `npm run test:channel-list-enter-select`, `npm run test:channel-list-space-voice`, `npm run test:members-list-home-end`, `npm run test:members-list-typeahead`, `npm run test:user-custom-status-enter`, `npm run test:threads-panel-arrow-roving`, `npm run test:member-list-presence-dot`.
Smokes: `npm run test:composer-focus-shortcut`, `npm run test:threads-panel-home-end`, `npm run test:threads-panel-space-mention-row`, `npm run test:threads-panel-escape-close`, `npm run test:threads-panel-reopen-filter-focus`, `npm run test:threads-filter-arrow-roving`, `npm run test:threads-filter-enter-space`, `npm run test:channel-list-typeahead-wrap`, `npm run test:channel-list-page-jump`, `npm run test:members-list-enter-profile`, `npm run test:members-list-space-profile`, `npm run test:composer-slowmode-describedby-channel`, `npm run test:channel-list-home-end`, `npm run test:channel-list-typeahead`, `npm run test:channel-list-arrow-roving`, `npm run test:channel-list-enter-select`, `npm run test:channel-list-space-voice`, `npm run test:members-list-home-end`, `npm run test:members-list-typeahead`, `npm run test:user-custom-status-enter`, `npm run test:threads-panel-arrow-roving`, `npm run test:member-list-presence-dot`.
## Session & guild loading (v0.8.237)