docs: Phase 138 complete (v0.8.103), Phase 139 planned, parity and testing sync

Mark Phase 138 done (thread filter chips, self-deafen roster, inline folder
rename, discoveryExploreBaseline USER_PREFS). Add Phase 139 roadmap. Update
THREADS_PANEL, VOICE, DISCOVERY, SERVER_FOLDERS, IPC, AUTOMATED_TESTING,
PEARCORD_PARITY, and PLATFORM_ROADMAP changelog.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Raven Scott
2026-05-22 13:11:20 -04:00
co-authored by Cursor
parent c1342f9f5f
commit f1ed1b8e9e
8 changed files with 42 additions and 8 deletions
+5 -1
View File
@@ -276,7 +276,11 @@ Pearcord validates itself without manual QA.
| `npm run test:voice-deafened-mesh` | Deafened roster via mesh (`VOICE_DEAFENED_MESH_SMOKE_OK`) |
| `npm run test:server-folder-rail-rename` | Folder rename IPC (`SERVER_FOLDER_RAIL_RENAME_SMOKE_OK`) |
| `npm run test:explore-new-since-badge` | Explore +N since open (`EXPLORE_NEW_SINCE_BADGE_SMOKE_OK`) |
| `npm run test:boot` | `pear run` pre-run (`BOOT_OK`) then Phase 124137 smokes + `test:companion-boot` |
| `npm run test:threads-filter-chips` | Thread filter chip modes (`THREADS_FILTER_CHIPS_SMOKE_OK`) |
| `npm run test:voice-self-deafen-roster` | Self deafen on roster (`VOICE_SELF_DEAFEN_ROSTER_SMOKE_OK`) |
| `npm run test:server-folder-inline-rename` | Folder rename IPC (`SERVER_FOLDER_INLINE_RENAME_SMOKE_OK`) |
| `npm run test:discovery-baseline-prefs-sync` | Explore baseline USER_PREFS mesh (`DISCOVERY_BASELINE_PREFS_SYNC_SMOKE_OK`) |
| `npm run test:boot` | `pear run` pre-run (`BOOT_OK`) then Phase 124138 smokes + `test:companion-boot` |
| `npm run test:server-folder-prefs-mesh` | Live folder prefs mesh (optional; run manually — can exceed 150s on DHT) |
| `npm run test:profile` | Profile update + persist (`PROFILE_SMOKE_OK`) |
| `npm run test:e2e` | Full journey host+guest (`E2E_SMOKE_OK`) |
+2
View File
@@ -59,6 +59,8 @@ While the Explore modal is open, each `state` push with new `publicListings` or
**New since Explore (v0.8.102):** Opening Explore calls `discovery-explore-opened` IPC → `markDiscoveryExploreOpened()` snapshots `discoveryPublicCount` as baseline. While Explore is closed, `view.discoveryNewSinceExplore` shows how many listings arrived since that baseline; UI renders a green `+N` pill beside the count badge. Re-opening Explore resets the baseline. Smoke: `npm run test:explore-new-since-badge`.
**Prefs mesh (v0.8.103):** Baseline is stored as `discoveryExploreBaseline` in user prefs and synced on `USER_PREFS_UPDATE` (multi-device). Smoke: `npm run test:discovery-baseline-prefs-sync`.
## Explore filters (v0.6.5)
`filterPublicListings(listings, { query, sort, minMembers })` — local filter (no network):
+1 -1
View File
@@ -98,7 +98,7 @@ Returned by `PearcordPlatform.view()`:
- `onboarded`, `user`, `mode` (`home` \| `guild` \| `dm`), `guilds`, `guild`, `channels`, `members`
- `dmConversations`, `dmPeer`, `dmTitle`, `dmPeerReadAt`, `dmReadByUser`, `typingUsers` (DM: peer id; guild: member display names)
- `publicListings`, `filteredPublicListings`, `discoveryFilter`, `discoveryAllTags`, `discoveryStats`, `discoveryMeshRefreshAt` (v0.8.98), `discoveryDiffHint`, `discoveryDiffUntil` (v0.8.99), `discoveryPublicCount` (v0.8.101), `discoveryNewSinceExplore` (v0.8.102)
- `publicListings`, `filteredPublicListings`, `discoveryFilter`, `discoveryAllTags`, `discoveryStats`, `discoveryMeshRefreshAt` (v0.8.98), `discoveryDiffHint`, `discoveryDiffUntil` (v0.8.99), `discoveryPublicCount` (v0.8.101), `discoveryNewSinceExplore` (v0.8.102); user prefs `discoveryExploreBaseline` (v0.8.103)
- `threadTypingByParent` (parent text channel id → active typers per thread)
- `contacts` (`accepted`, `pendingIn`, `pendingOut`, `blocked`, `stats.peers`)
- `searchQuery`, `searchScope`, `searchResults` (guild-wide hits)
+9
View File
@@ -4,6 +4,15 @@ Gap analysis between **Pearcord** (P2P Pear app) and a typical **centralized cha
> This is the only doc that compares against an external reference product. All other docs use Pearcord naming only.
## Summary (v0.8.103)
| Area | Reference product | Pearcord | Gap |
|------|-------------------|----------|-----|
| Threads | Forum + thread channels | Filter chip row (Active/Pinned/Muted/…) | Chip shortcuts (P139); no cloud |
| Voice | Voice activity | Self + mesh mute/deafen roster | Muted-only roster filter (P139) |
| Server folders | Folder management | Inline rename on folder head | Collapsed stack rename (P139) |
| Discovery | Server discovery | +N pill + prefs baseline mesh | Baseline timestamp in Explore (P139) |
## Summary (v0.8.102)
| Area | Reference product | Pearcord | Gap |
+20 -6
View File
@@ -322,16 +322,29 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
---
### Phase 138 — Parity polish (planned)
### Phase 138 — Parity polish (v0.8.103)
| ID | Item | Status |
|----|------|--------|
| P138-1 | Thread panel: filter chips (pin/mute) instead of status dropdown | [ ] |
| P138-2 | Voice: self-deafen reflected on sidebar before mesh roundtrip | [ ] |
| P138-3 | Server folder: inline rename on rail head (no modal) | [ ] |
| P138-4 | Discovery: persist explore baseline in USER_PREFS mesh | [ ] |
| P138-1 | Thread panel: filter chips (pin/mute) instead of status dropdown | [x] |
| P138-2 | Voice: self-deafen reflected on sidebar before mesh roundtrip | [x] |
| P138-3 | Server folder: inline rename on rail head (no modal) | [x] |
| P138-4 | Discovery: persist explore baseline in USER_PREFS mesh | [x] |
**Next:** Thread filter chips · instant self-deafen roster · inline folder rename · prefs-backed explore baseline.
**Next:** ~~Thread filter chips · instant self-deafen roster · inline folder rename · prefs-backed explore baseline~~ (Phase 138).
---
### Phase 139 — UX depth (planned)
| ID | Item | Status |
|----|------|--------|
| P139-1 | Thread panel: chip keyboard shortcuts (16) | [ ] |
| P139-2 | Voice: muted-only roster filter toggle in sidebar | [ ] |
| P139-3 | Server folder: inline rename on collapsed stack icon | [ ] |
| P139-4 | Discovery: show baseline timestamp in Explore modal | [ ] |
**Next:** Thread chip shortcuts · voice roster mute filter · collapsed folder rename · explore baseline hint.
---
@@ -1764,6 +1777,7 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
### Changelog
- **2026-05-22** — v0.8.103: Phase 138 — thread filter chips UI, self-deafen roster before mesh, inline folder rename on rail head, `discoveryExploreBaseline` USER_PREFS sync (`test:threads-filter-chips`, `test:voice-self-deafen-roster`, `test:server-folder-inline-rename`, `test:discovery-baseline-prefs-sync`). Phase 139 planned.
- **2026-05-22** — v0.8.102: Phase 137 — threads pinned+muted filter, voice deafened mesh roster pills, folder rail rename IPC smoke, Explore +N new-since pill (`test:threads-pinned-muted-filter`, `test:voice-deafened-mesh`, `test:server-folder-rail-rename`, `test:explore-new-since-badge`). Phase 138 planned.
- **2026-05-22** — v0.8.101: Phase 136 — threads muted filter, VOICE_SPEAKING mesh roster, cross-folder guild move, Explore listing badge (`test:threads-muted-filter`, `test:voice-speaking-mesh`, `test:guild-folder-cross-move`, `test:explore-listing-badge`). Phase 137 planned.
- **2026-05-22** — v0.8.100: Phase 135 — threads pinned filter, voice speaking dots, folder color picker, Explore auto-refresh on mesh ingest (`test:threads-pinned-filter`, `test:voice-speaking-roster`, `test:server-folder-color`, `test:explore-listing-refresh`). Phase 136 planned.
+1
View File
@@ -41,6 +41,7 @@ Client-side **server folder** grouping for the left server rail (Discord-style).
- **Right-click** a server icon → create folder / move to folder / remove from folder.
- **Right-click** folder head/stack → rename / delete / move up / move down (v0.8.90). Rename uses `rename-server-folder` IPC (smoke: `npm run test:server-folder-rail-rename`).
- **Inline rename (v0.8.103):** Double-click folder head or choose Rename — edits in place on the rail (no modal). Smoke: `npm run test:server-folder-inline-rename`.
- **Drag-and-drop** folder head/stack on the rail to reorder (`reorder-server-folders` IPC, v0.8.91).
- **Drop folder onto guild icon** while dragging a folder to assign that server to the folder (`assign-guild-to-folder`, v0.8.92). Smoke: `test:server-folder-guild-drop`.
- **📁** button on rail → create empty folder.
+2
View File
@@ -40,6 +40,7 @@ Unread uses existing `READ_STATE` per thread channel (same as text channels).
- **Pin / mute (v0.8.99):** Per-row 📍 pin and 🔕 mute; pinned threads sort first
- **Pinned only (v0.8.100):** Status filter option lists pinned threads only
- **Pinned & muted (v0.8.102):** Combined filter shows threads that are both pinned and notification-muted
- **Filter chips (v0.8.103):** Active / Pinned / Muted / Both / Archived / All chip row replaces status dropdown
## Module
@@ -57,6 +58,7 @@ Unread uses existing `READ_STATE` per thread channel (same as text channels).
| `npm run test:threads-pinned-filter` | `THREADS_PINNED_FILTER_SMOKE_OK` |
| `npm run test:threads-muted-filter` | `THREADS_MUTED_FILTER_SMOKE_OK` |
| `npm run test:threads-pinned-muted-filter` | `THREADS_PINNED_MUTED_FILTER_SMOKE_OK` |
| `npm run test:threads-filter-chips` | `THREADS_FILTER_CHIPS_SMOKE_OK` |
| `npm run test:threads` | Create/archive threads |
| `npm run test:boot` | `BOOT_OK` |
+2
View File
@@ -56,6 +56,8 @@ Per-channel overwrites apply via `pearcord-channel-permissions` (see [CHANNEL_PE
**v0.8.102:** **Mesh mute/deafen**`VOICE_MEDIA_MUTE` gossip sets `muted` / `deafened` on sidebar roster rows (🔕/🔇 pills). Smoke: `npm run test:voice-deafened-mesh`.
**v0.8.103:** **Self roster** — local `voiceMedia` mute/deafen applies to your row in `voiceStatesByChannel` before protomux mesh roundtrip. Smoke: `npm run test:voice-self-deafen-roster`.
## Tests
- `npm run test:voice`