docs: v0.6.2 Phase 16 group DMs

GROUP_DM.md, roadmap Phase 16, parity, IPC, automated testing.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Raven Scott
2026-05-21 20:59:57 -04:00
co-authored by Cursor
parent 885c570b5a
commit 89b0277860
6 changed files with 80 additions and 4 deletions
+1
View File
@@ -54,6 +54,7 @@ Pearcord validates itself without manual QA.
| `npm run test:discovery` | Local guild directory (`DISCOVERY_SMOKE_OK`) |
| `npm run test:discovery-gossip` | Public listing gossip + join (`DISCOVERY_GOSSIP_SMOKE_OK`) |
| `npm run test:dm` | DM channel id + message sync (`DM_SMOKE_OK`) |
| `npm run test:group-dm` | Group DM 3-party topic (`GROUP_DM_SMOKE_OK`) |
| `npm run test:reply` | Message replyToId chain (`REPLY_SMOKE_OK`) |
| `npm run test:hyperdb` | Rocks engine when spec built (`HYPERDB_SMOKE_OK` or skip) |
| `npm run test:invite` | Two temp dirs: host invite → guest join (`INVITE_SMOKE_OK`) |
+6 -1
View File
@@ -2,7 +2,7 @@
Pearcord DMs use a **deterministic 1:1 Hyperswarm topic** derived from both user ids (sorted). No central relay.
## Topic formula
## 1:1 topic formula
```
pearcord:dm:<userIdA>:<userIdB> // ids sorted lexicographically
@@ -10,6 +10,10 @@ pearcord:dm:<userIdA>:<userIdB> // ids sorted lexicographically
Channel id is `hash(topic)` (32 hex chars). Stored under `guildId: "dm"` in `@pearcord/channels`.
## Group DMs (310 people)
See [GROUP_DM.md](./GROUP_DM.md) — topic `pearcord:dm-group:…`, `GROUP_DM_UPSERT` gossip, **◎** UI.
## Flow
1. Click **P** (home) in the server rail → `select-home` → DM list.
@@ -27,6 +31,7 @@ Channel id is `hash(topic)` (32 hex chars). Stored under `guildId: "dm"` in `@pe
```bash
npm run test:dm # DM_SMOKE_OK
npm run test:dm-preview # DM_PREVIEW_SMOKE_OK
npm run test:group-dm # GROUP_DM_SMOKE_OK
```
## Future (P2-3)
+56
View File
@@ -0,0 +1,56 @@
# Group direct messages (P2P)
Multi-party DMs (310 participants) use a **deterministic Hyperswarm topic** from sorted user ids. No central relay.
## Topic
```
pearcord:dm-group:<id1>:<id2>:<id3> // all participant ids sorted lexicographically
```
Channel id is `hash(topic)` (32 hex). Stored under `guildId: "dm"` with `type: "group_dm"`.
Participant lists live in `dm-meta` JsonStore (`@pearcord/dm-channel-meta`) because HyperDB channel rows omit extra fields.
## Flow
1. Home → **◎** next to **+** → enter group name + comma-separated peer user ids (minimum 2 others).
2. `create-group-dm` → join mesh + `GROUP_DM_UPSERT` gossip so peers learn the channel row.
3. Open existing groups from the sidebar (**◎** prefix, member count).
4. Messages use the same gossip codec as 1:1 DMs (`MESSAGE_CREATE`, typing, etc.).
## Limits
| Rule | Value |
|------|-------|
| Min participants | 3 (you + 2 others) |
| Max participants | 10 |
## RPC
| Method | Value | Payload |
|--------|-------|---------|
| `GROUP_DM_UPSERT` | 40 | Channel row + `participantIds[]` |
## Platform API
- `createGroupDM({ peerUserIds, name })`
- `openGroupDM({ channelId })`
## IPC
| type | fields |
|------|--------|
| `create-group-dm` | `peerUserIds[]`, `name?` |
| `open-group-dm` | `channelId` |
## View fields
- `dmIsGroup`, `dmParticipantIds`
- `dmConversations[].isGroup`, `memberCount`
## Test
```bash
npm run test:group-dm # GROUP_DM_SMOKE_OK
```
+2
View File
@@ -40,6 +40,8 @@ JSON lines over `pear-pipe` between `ui/app.js` and `apps/pearcord/index.js`.
| `request-emoji-image` | `name` or `attachmentId` | Sidecar → `emoji-image` with base64 bytes |
| `update-search` | `query`, `scope?` | `channel` \| `guild` search state |
| `open-dm` | `peerUserId`, `peerDisplayName?` | Open 1:1 DM channel + mesh |
| `create-group-dm` | `peerUserIds[]`, `name?` | Open 310 participant group DM + gossip |
| `open-group-dm` | `channelId` | Re-open existing group DM |
| `typing-start` | — | Gossip typing indicator (DM) |
| `update-profile` | `displayName` | Update local user profile |
| `pin-message` | `messageId` | Pin message (requires `manageMessages`) |
+3 -2
View File
@@ -4,14 +4,14 @@ 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.6.1)
## Summary (v0.6.2)
| Area | Reference product | Pearcord | Gap |
|------|-------------------|----------|-----|
| Account | Email/OAuth, cloud profile | Local username + HyperDB + **`pcdv_` device link** | No cloud identity recovery |
| Servers | Hosted guilds | P2P guild topic + local DB + **public discovery mesh** | No curated global index (fully P2P topic) |
| Text chat | Full | … rich link embeds, categories, **thread channels**, **guild emoji** (unicode + **image/Hyperdrive**) | Forum channels, automod, animated stickers |
| DMs | E2E optional | … **sidebar previews**, read-on-open | Group DMs |
| DMs | E2E optional | … **sidebar previews**, **group DM (310)**, read-on-open | Full E2E group vault |
| Voice/video | WebRTC SFU | Voice join/leave + **P2P protomux media plane** (ping/RTT, mute) | Opus/udx live audio (P3-3 follow-up) |
| Moderation | Roles, bans, automod | Kick, ban, timeout, roles UI, slowmode, audit+gossip | automod |
| Friends | Friend list + requests | **P2P contacts** + block/unblock gossip | Online friends |
@@ -85,6 +85,7 @@ Phases **02** and **4** are largely complete; **3** (live audio) and **5** (n
| P14-1 | Appearance prefs — P5-5 | [~] v0.6.0 userprefs topic |
| P14-3 | DM sidebar polish — P1-8 | [~] v0.6.0 previews + read |
| P15-1 | Image emoji — P5-4 | [~] v0.6.1 Hyperdrive image emoji |
| P16-1 | Group DMs — P1-8 | [~] v0.6.2 310 participant topics |
| P10-3 | Multi-device identity (autopass) — P8-3 | [x] v0.5.6 `pcdv_` session pairing |
| P10-4 | HyperDB schema v2 — P8-4 | [x] v0.5.7 schema v9 |
| P11-1 | Guild-wide search — P5-3 | [x] v0.5.7 |
+12 -1
View File
@@ -34,7 +34,7 @@ Track implementation status here. Update checkboxes as phases land.
| P1-5 | `pearcord-presence` — online/idle/dnd | [~] |
| P1-6 | Hyperswarm mesh per guild topic | [x] |
| P1-7 | Message sync P2P (gossip + HyperDB flush) | [x] |
| P1-8 | DM channels (1:1 topic) | [~] previews + read-on-open |
| P1-8 | DM channels (1:1 + group topic) | [~] group 310 + 1:1 previews |
| P1-9 | Reactions + threads | [x] thread channels + archive |
| P1-10 | File attachments (hyperdrive) | [~] local staging + metadata gossip |
@@ -221,8 +221,19 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
---
### Phase 16 — Group DMs (v0.6.2)
| ID | Item | Status |
|----|------|--------|
| P16-1 | `pearcord:dm-group:` topic + `GROUP_DM_UPSERT` gossip | [x] |
| P16-2 | Create/open group UI (310 participants) | [x] |
| P16-3 | smoke-group-dm + GROUP_DM.md | [x] |
---
### Changelog
- **2026-05-21** — v0.6.2: P2P group DMs (310 users), `GROUP_DM_UPSERT`, create/open UI, smoke-group-dm, GROUP_DM.md.
- **2026-05-21** — v0.6.1: image guild emoji (Hyperdrive staging, `kind: image` EMOJI_UPSERT, inline render, upload UI, smoke-emoji-image).
- **2026-05-21** — v0.6.0: `pearcord-settings` appearance prefs P2P sync, theme/density UI, DM previews + mark-read-on-open, smoke-user-prefs/dm-preview, USER_SETTINGS.md.
- **2026-05-21** — v0.5.9: `pearcord-emoji` module, guild unicode emoji + `EMOJI_UPSERT` gossip, composer picker, `:name:` message rendering, extended reactions, smoke-emoji, EMOJI.md.