docs: Phase 189 complete — v0.8.154 roadmap and parity updates
Mark Phase 189 done, plan Phase 190, and sync SEARCH, channels, notifications, IPC, testing, and parity docs with new smokes. Co-authored-by: Cursor <[email protected]>
This commit is contained in:
+1
-1
@@ -1,6 +1,6 @@
|
||||
# Pearcord architecture
|
||||
|
||||
**Current release:** v0.8.153 (desktop app `apps/pearcord`). Phase history and checklists live in [PLATFORM_ROADMAP.md](./PLATFORM_ROADMAP.md). Gap vs a centralized chat product is tracked in [PEARCORD_PARITY.md](./PEARCORD_PARITY.md).
|
||||
**Current release:** v0.8.154 (desktop app `apps/pearcord`). Phase history and checklists live in [PLATFORM_ROADMAP.md](./PLATFORM_ROADMAP.md). Gap vs a centralized chat product is tracked in [PEARCORD_PARITY.md](./PEARCORD_PARITY.md).
|
||||
|
||||
Pearcord is a **100% peer-to-peer** community chat client on [Pear](https://pear.holepunch.to) / Bare. There is no Pearcord-operated message server: guilds, DMs, discovery listings, and bot events replicate over **Hyperswarm** topics with **protomux** framing.
|
||||
|
||||
|
||||
@@ -478,7 +478,11 @@ Pearcord validates itself without manual QA.
|
||||
| `npm run test:channel-category-thread-announcement-label` | Thread+announcement label (`CHANNEL_CATEGORY_THREAD_ANNOUNCEMENT_LABEL_SMOKE_OK`) |
|
||||
| `npm run test:notif-mark-all-disabled-keeps-describedby` | Disabled describedby (`NOTIF_MARK_ALL_DISABLED_KEEPS_DESCRIBEDBY_SMOKE_OK`) |
|
||||
| `npm run test:guild-plain-combo-minpos-tie` | Plain combo minPos tie (`GUILD_PLAIN_COMBO_MINPOS_TIE_SMOKE_OK`) |
|
||||
| `npm run test:boot` | `pear run` pre-run (`BOOT_OK`) then Phase 124–188 smokes + `test:companion-boot` |
|
||||
| `npm run test:search-recent-chip-field-enter-apply` | Field Enter apply chip (`SEARCH_RECENT_CHIP_FIELD_ENTER_APPLY_SMOKE_OK`) |
|
||||
| `npm run test:channel-category-forum-announcement-label` | Forum+announcement label (`CHANNEL_CATEGORY_FORUM_ANNOUNCEMENT_LABEL_SMOKE_OK`) |
|
||||
| `npm run test:notif-mark-all-restore-describedby` | Restore describedby (`NOTIF_MARK_ALL_RESTORE_DESCRIBEDBY_SMOKE_OK`) |
|
||||
| `npm run test:guild-combo-beats-plain-bucket` | Combo beats plain (`GUILD_COMBO_BEATS_PLAIN_BUCKET_SMOKE_OK`) |
|
||||
| `npm run test:boot` | `pear run` pre-run (`BOOT_OK`) then Phase 124–189 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`) |
|
||||
|
||||
@@ -23,6 +23,7 @@ Gossip: existing `RPC.CHANNEL_CREATE` carries full channel row including `parent
|
||||
|
||||
## UI
|
||||
|
||||
- Mixed forum+announcement categories include separate forum and announcement counts in `aria-label` (v0.8.154). Smoke: `npm run test:channel-category-forum-announcement-label`.
|
||||
- Mixed thread+announcement categories include separate thread and announcement counts in `aria-label` (v0.8.153). Smoke: `npm run test:channel-category-thread-announcement-label`.
|
||||
- Mixed thread+forum categories include separate thread and forum counts in `aria-label` (v0.8.152). Smoke: `npm run test:channel-category-thread-forum-label`.
|
||||
- Mixed text+announcement categories include separate text and announcement counts in `aria-label` (v0.8.151). Smoke: `npm run test:channel-category-text-announcement-label`.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Pearcord documentation index
|
||||
|
||||
All project documentation lives in **`pearcord-docs`** (`/Users/raven/dev/pearcord/docs/`). **Release:** v0.8.153.
|
||||
All project documentation lives in **`pearcord-docs`** (`/Users/raven/dev/pearcord/docs/`). **Release:** v0.8.154.
|
||||
|
||||
| Start here | Document |
|
||||
|------------|----------|
|
||||
|
||||
@@ -31,7 +31,7 @@ JSON lines over `pear-pipe` between `ui/app.js` and `apps/pearcord/index.js`. Ha
|
||||
|
||||
### Channel pick order (`select-guild` / `loadGuild`)
|
||||
|
||||
When a guild opens, `pearcord-platform` `_selectGuildChannelWithUnread` chooses the active text/forum/thread/announcement channel in this order (v0.8.153):
|
||||
When a guild opens, `pearcord-platform` `_selectGuildChannelWithUnread` chooses the active text/forum/thread/announcement channel in this order (v0.8.154):
|
||||
|
||||
1. **Unread + mentions** — score `mentions × 1000 + unread` per channel. Pool selection:
|
||||
- If every unread channel shares one category (`parentId`), only channels in that category compete (mention-weighted score, then lower `position` on ties). Smokes: `test:guild-single-category-pool`, `test:guild-mention-single-category-pick`, `test:guild-dual-category-isolation-pick`.
|
||||
@@ -39,7 +39,7 @@ When a guild opens, `pearcord-platform` `_selectGuildChannelWithUnread` chooses
|
||||
2. **`lastChannelByGuild`** — USER_PREFS last viewed channel for this guild when valid and viewable.
|
||||
3. **First text channel** — lowest-position `text` channel, else first candidate.
|
||||
|
||||
Smokes: `test:guild-channel-pick-order` (IPC + platform source), `test:guild-unread-position-tie`, `test:guild-in-bucket-position-tie`, `test:guild-mention-in-bucket-pick`, `test:guild-mention-single-category-pick`, `test:guild-dual-category-isolation-pick`, `test:guild-mixed-bucket-pick`, `test:guild-mention-root-bucket-pick`, `test:guild-root-mention-bucket-pick`, `test:guild-mention-triple-bucket-pick`, `test:guild-root-plain-triple-mention-pick`, `test:guild-mention-plain-bucket-pick`, `test:guild-dual-combo-bucket-pick`, `test:guild-triple-combo-bucket-pick`, `test:guild-plain-beats-combo-bucket`, `test:guild-plain-combo-minpos-tie`, `test:guild-dual-plain-bucket-pick`, `test:guild-combo-beats-plain-equal`, `test:guild-combo-bucket-minpos-tie`, `test:guild-bucket-minpos-root-pick`, `test:guild-bucket-minpos-order-pick`, `test:guild-bucket-minpos-triple-pick`, `test:guild-bucket-total-over-minpos`, `test:guild-uncategorized-bucket-pick`, `test:guild-single-category-pool`, `test:guild-category-unread-pick`, `test:guild-category-bucket-pick`, `test:guild-mention-bucket-pick`, `test:guild-bucket-minpos-tie`, `test:guild-mention-channel-pick`, `test:guild-unread-over-last-channel`, `test:guild-last-channel-only-load`, `test:guild-no-unread-last-channel`, `test:guild-first-text-fallback`.
|
||||
Smokes: `test:guild-channel-pick-order` (IPC + platform source), `test:guild-unread-position-tie`, `test:guild-in-bucket-position-tie`, `test:guild-mention-in-bucket-pick`, `test:guild-mention-single-category-pick`, `test:guild-dual-category-isolation-pick`, `test:guild-mixed-bucket-pick`, `test:guild-mention-root-bucket-pick`, `test:guild-root-mention-bucket-pick`, `test:guild-mention-triple-bucket-pick`, `test:guild-root-plain-triple-mention-pick`, `test:guild-mention-plain-bucket-pick`, `test:guild-dual-combo-bucket-pick`, `test:guild-triple-combo-bucket-pick`, `test:guild-plain-beats-combo-bucket`, `test:guild-combo-beats-plain-bucket`, `test:guild-plain-combo-minpos-tie`, `test:guild-dual-plain-bucket-pick`, `test:guild-combo-beats-plain-equal`, `test:guild-combo-bucket-minpos-tie`, `test:guild-bucket-minpos-root-pick`, `test:guild-bucket-minpos-order-pick`, `test:guild-bucket-minpos-triple-pick`, `test:guild-bucket-total-over-minpos`, `test:guild-uncategorized-bucket-pick`, `test:guild-single-category-pool`, `test:guild-category-unread-pick`, `test:guild-category-bucket-pick`, `test:guild-mention-bucket-pick`, `test:guild-bucket-minpos-tie`, `test:guild-mention-channel-pick`, `test:guild-unread-over-last-channel`, `test:guild-last-channel-only-load`, `test:guild-no-unread-last-channel`, `test:guild-first-text-fallback`.
|
||||
|
||||
| `select-channel` | `channelId` | Set active text channel (voice IDs join voice) |
|
||||
| `join-voice` | `channelId` | Join voice channel + gossip |
|
||||
|
||||
@@ -23,6 +23,7 @@ Skipped when:
|
||||
- **Channel list** — existing unread + `@` pills
|
||||
- **🔔 header** — inbox panel, prefs, mark all read; **click row jumps to message** (v0.8.35+)
|
||||
- **Mark all read** — dedicated header button when unread rows exist (v0.8.115); smoke: `npm run test:notif-mark-all-header`
|
||||
- **Restore keeps describedby (v0.8.154)** — dedicated smoke asserts `ensureNotifMarkAllHeader` re-links `aria-describedby` when unread returns and status banner remains. Smoke: `npm run test:notif-mark-all-restore-describedby`
|
||||
- **Disabled keeps describedby (v0.8.153)** — dedicated smoke asserts disabled mark-all button retains `aria-describedby` after click when status banner exists. Smoke: `npm run test:notif-mark-all-disabled-keeps-describedby`
|
||||
- **Status describedby create (v0.8.152)** — dedicated smoke asserts mark-all button `aria-describedby="notif-mark-all-status"` on create; banner does not self-reference. Smoke: `npm run test:notif-mark-all-status-describedby-create`
|
||||
- **Status labelledby create (v0.8.151)** — dedicated smoke asserts `banner.setAttribute('aria-labelledby', …)` references the mark-all button id on create. Smoke: `npm run test:notif-mark-all-status-labelledby-create`
|
||||
|
||||
+13
-4
@@ -4,14 +4,23 @@ 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.154)
|
||||
|
||||
| Area | Reference product | Pearcord | Gap |
|
||||
|------|-------------------|----------|-----|
|
||||
| Search | Recent queries | Tab/Shift+Tab/Enter apply field chips | Space apply chip (P190); no cloud |
|
||||
| Channels | Categories | Full mixed-type category labels | Voice+forum only label (P190) |
|
||||
| Notifications | Inbox | Restore keeps describedby | Dismiss describedby smoke (P190) |
|
||||
| Guild open | Channel pick | Combo beats heavy plain bucket | Triple plain buckets (P190) |
|
||||
|
||||
## Summary (v0.8.153)
|
||||
|
||||
| Area | Reference product | Pearcord | Gap |
|
||||
|------|-------------------|----------|-----|
|
||||
| Search | Recent queries | Tab/Shift+Tab apply field chips | Enter apply chip (P189); no cloud |
|
||||
| Channels | Categories | Thread/forum/announcement mixed labels | Forum+announcement label (P189) |
|
||||
| Notifications | Inbox | Disabled keeps describedby | Restore describedby smoke (P189) |
|
||||
| Guild open | Channel pick | Plain wins equal combo on minPos | Combo over plain when higher (P189) |
|
||||
| Search | Recent queries | Tab/Shift+Tab apply field chips | Enter apply chip (done P189); no cloud |
|
||||
| Channels | Categories | Thread/forum/announcement mixed labels | Forum+announcement label (done P189) |
|
||||
| Notifications | Inbox | Disabled keeps describedby | Restore describedby smoke (done P189) |
|
||||
| Guild open | Channel pick | Plain wins equal combo on minPos | Combo over plain when higher (done P189) |
|
||||
|
||||
## Summary (v0.8.152)
|
||||
|
||||
|
||||
+20
-6
@@ -998,16 +998,29 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
|
||||
|
||||
---
|
||||
|
||||
### Phase 189 — Search & guild polish (planned)
|
||||
### Phase 189 — Search & guild polish (v0.8.154)
|
||||
|
||||
| ID | Item | Status |
|
||||
|----|------|--------|
|
||||
| P189-1 | Search: Enter from field activedescendant applies focused chip query | [ ] |
|
||||
| P189-2 | Channels: mixed forum+announcement category label counts | [ ] |
|
||||
| P189-3 | Notifications: mark-all restore keeps `aria-describedby` smoke | [ ] |
|
||||
| P189-4 | Guild: smoke combo bucket beats plain when combo total higher | [ ] |
|
||||
| P189-1 | Search: Enter from field activedescendant applies focused chip query | [x] |
|
||||
| P189-2 | Channels: mixed forum+announcement category label counts | [x] |
|
||||
| P189-3 | Notifications: mark-all restore keeps `aria-describedby` smoke | [x] |
|
||||
| P189-4 | Guild: smoke combo bucket beats plain when combo total higher | [x] |
|
||||
|
||||
**Next:** Enter apply chip · forum+announcement label · restore describedby · combo over plain.
|
||||
**Next:** ~~Enter apply chip · forum+announcement label · restore describedby · combo over plain~~ (Phase 189).
|
||||
|
||||
---
|
||||
|
||||
### Phase 190 — Inbox & guild depth (planned)
|
||||
|
||||
| ID | Item | Status |
|
||||
|----|------|--------|
|
||||
| P190-1 | Search: Space from field activedescendant applies focused chip query | [ ] |
|
||||
| P190-2 | Channels: mixed voice+forum category label counts (no stage) | [ ] |
|
||||
| P190-3 | Notifications: mark-all dismiss clears `aria-describedby` dedicated smoke | [ ] |
|
||||
| P190-4 | Guild: smoke triple plain buckets — highest total wins | [ ] |
|
||||
|
||||
**Next:** Space apply chip · voice+forum label · dismiss describedby · triple plain buckets.
|
||||
|
||||
---
|
||||
|
||||
@@ -2440,6 +2453,7 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
|
||||
|
||||
### Changelog
|
||||
|
||||
- **2026-05-22** — v0.8.154: Phase 189 — Enter apply chip, forum+announcement label, restore describedby, combo beats plain (`test:search-recent-chip-field-enter-apply`, `test:channel-category-forum-announcement-label`, `test:notif-mark-all-restore-describedby`, `test:guild-combo-beats-plain-bucket`). Phase 190 planned.
|
||||
- **2026-05-22** — v0.8.153: Phase 188 — Shift+Tab apply, thread+announcement label, disabled describedby, plain combo minPos tie (`test:search-recent-chip-field-shift-tab-apply`, `test:channel-category-thread-announcement-label`, `test:notif-mark-all-disabled-keeps-describedby`, `test:guild-plain-combo-minpos-tie`). Phase 189 planned.
|
||||
- **2026-05-22** — v0.8.152: Phase 187 — Tab apply chip, thread+forum label, status describedby create, dual plain buckets (`test:search-recent-chip-field-tab-apply`, `test:channel-category-thread-forum-label`, `test:notif-mark-all-status-describedby-create`, `test:guild-dual-plain-bucket-pick`). Phase 188 planned.
|
||||
- **2026-05-22** — v0.8.151: Phase 186 — Escape roving restore, text+announcement label, status labelledby create, plain beats combo (`test:search-recent-chip-escape-roving`, `test:channel-category-text-announcement-label`, `test:notif-mark-all-status-labelledby-create`, `test:guild-plain-beats-combo-bucket`). Phase 187 planned.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
Documentation for **[Pearcord](https://git.ssh.surf/pearcord)** — a 100% peer-to-peer community chat app on [Pear](https://pear.holepunch.to). No central message servers.
|
||||
|
||||
**Current release:** v0.8.153 (desktop app `apps/pearcord`).
|
||||
**Current release:** v0.8.154 (desktop app `apps/pearcord`).
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -56,6 +56,8 @@ See also [FORUM_ARCHIVE_SEARCH.md](./FORUM_ARCHIVE_SEARCH.md).
|
||||
|
||||
**v0.8.115:** Guild-scoped recent queries persist in `userPrefs.searchRecentByGuild[guildId]` (max 8, deduped). `setSearch` records queries ≥2 chars. Desktop shows **recent chips** under the search input when scope is `guild` and the field is empty. Smokes: `npm run test:search-recent-prefs`, `npm run test:members-online-sort` (UI wiring).
|
||||
|
||||
**v0.8.154:** **Enter** from `#channel-search` while field `aria-activedescendant` is set applies that recent-query chip. Smoke: `npm run test:search-recent-chip-field-enter-apply`.
|
||||
|
||||
**v0.8.153:** **Shift+Tab** from `#channel-search` while field `aria-activedescendant` is set applies the **last** visible recent-query chip. Smoke: `npm run test:search-recent-chip-field-shift-tab-apply`.
|
||||
|
||||
**v0.8.152:** **Tab** from `#channel-search` while field `aria-activedescendant` is set applies that recent-query chip (does not move focus into the listbox). Smoke: `npm run test:search-recent-chip-field-tab-apply`.
|
||||
|
||||
Reference in New Issue
Block a user