docs: Phase 54 live mesh banner fetch + attach reliability (v0.8.19)

- PLATFORM_ROADMAP Phase 54
- REMOTE_PROFILE_BANNERS mesh fetch section + fetchSource logging
- ATTACHMENT_FETCH gossip/attach timeout notes
- AUTOMATED_TESTING, PEARCORD_PARITY P54-1

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Raven Scott
2026-05-22 00:07:23 -04:00
co-authored by Cursor
parent 7b7231f4ad
commit 20e93811b7
5 changed files with 38 additions and 5 deletions
+3
View File
@@ -34,9 +34,12 @@ Requires optional deps in `pearcord-drive`: `corestore`, `hyperdrive`, `hyperswa
|--------|--------|
| `npm run test:attach-mesh` | `ATTACH_MESH_SMOKE_OK` |
| `npm run test:drive-remote` | `DRIVE_REMOTE_SMOKE_OK` |
| `npm run test:banner-mesh` | `BANNER_MESH_SMOKE_OK` (profile banner over live mesh) |
`drive-remote` simulates the provider path with `fetchAttachmentViaProvider` (same server handler as live mesh).
**v0.8.19:** `broadcastGossip` awaits open gossip channels; attach fetch uses `channelReady` timeout (no infinite `fullyOpened` hang). `test:banner-mesh` exercises peer banner fetch after mesh connect.
## Roadmap
- P8-5 [x] attach mesh + hyperdrive fetch
+1
View File
@@ -50,6 +50,7 @@ Pearcord validates itself without manual QA.
| `npm run test:sticker-message` | Sticker-only send + gossip + view (`STICKER_MESSAGE_SMOKE_OK`) |
| `npm run test:sticker-combo` | Sticker + caption combo + `messageLayout` (`STICKER_COMBO_SMOKE_OK`) |
| `npm run test:peer-profile-banner` | Peer banner meta gossip + preview (`PEER_PROFILE_BANNER_SMOKE_OK`) |
| `npm run test:banner-mesh` | Live attach mesh peer banner fetch (`BANNER_MESH_SMOKE_OK`) |
| `npm run test:sticker-multi` | Up to 3 `stickerNames` per message (`STICKER_MULTI_SMOKE_OK`) |
| `npm run test:lottie-sticker` | Lottie JSON sticker upload + format (`LOTTIE_STICKER_SMOKE_OK`) |
| `npm run test:hub-cards` | Hub mirror card builder + parse (`HUB_CARDS_SMOKE_OK`) |
+2 -1
View File
@@ -127,8 +127,9 @@ Phases **02** and **4** are largely complete; **3** (live audio) and **5** (n
| P51-1 | Remote profile banner fetch (`pearcord-profile-assets`, v0.8.17) | [x] |
| P52-1 | Lottie stickers (`pearcord-lottie`, v0.8.18) | [x] |
| P53-1 | Multi-sticker composer picker (max 3, v0.8.18) | [x] |
| P54-1 | Live mesh profile banner fetch (`smoke-banner-mesh`, v0.8.19) | [x] |
**Next tranches:** Live mesh-only banner fetch smoke · sticker soundboard · server-wide emoji slots UI.
**Next tranches:** Forum archive search · sticker soundboard · server-wide emoji slots UI.
When Phase 5 checklist is `[x]`, copy open items here into tracked rows in `PLATFORM_ROADMAP.md`.
+15 -2
View File
@@ -247,6 +247,18 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
---
### Phase 54 — Live mesh banner fetch (v0.8.19)
| ID | Item | Status |
|----|------|--------|
| P54-1 | `connectGuildMeshPeers` smoke helper + attach mesh banner pull | [x] |
| P54-2 | `_ensureBannerAttachmentReady` prefetches via mesh before drive read | [x] |
| P54-3 | smoke-banner-mesh + attach-mesh/gossip reliability fixes + docs | [x] |
**Next:** Forum archive search · sticker soundboard · onboarding mesh E2E extension.
---
### Phase 53 — Multi-sticker picker (v0.8.18)
| ID | Item | Status |
@@ -266,7 +278,7 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
| P52-3 | UI `lottie-web` mount + fallback badge; upload `.json` | [x] |
| P52-4 | smoke-lottie-sticker + LOTTIE_STICKERS.md | [x] |
**Next:** Live mesh-only banner fetch smoke · voice channel Lottie reactions · sticker soundboard (future).
**Next:** Forum archive search · sticker soundboard · voice channel polish.
---
@@ -279,7 +291,7 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
| P51-3 | UI peer banner queue (messages + member list accent strip) | [x] |
| P51-4 | smoke-peer-profile-banner + REMOTE_PROFILE_BANNERS.md | [x] |
**Next:** Live mesh-only banner fetch smoke · voice polish · forum archive search.
**Next:** Forum archive search · sticker soundboard · onboarding E2E extensions.
---
@@ -649,6 +661,7 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
- **2026-05-21** — v0.8.15: profile banner images (`setProfileBannerImage`, hub card author avatars, smoke-profile-banner).
- **2026-05-21** — v0.8.14: profile cosmetics (`pearcord-profile-cosmetics`, RPC 56, banner/bio/avatar ring, smoke-profile-cosmetics).
- **2026-05-21** — v0.8.13: rich hub mirror cards (`pearcord-hub-cards`, `hubMirrorJson`, UI card layout, smoke-hub-cards).
- **2026-05-21** — v0.8.19: live mesh profile banner fetch (`smoke-banner-mesh`, attach protomux pull, `connectGuildMeshPeers` helper).
- **2026-05-21** — v0.8.18: Lottie stickers (`pearcord-lottie`, lottie-web UI) + multi-sticker composer picker (stage tray, smoke-sticker-multi/lottie).
- **2026-05-21** — v0.8.17: remote profile banners (`pearcord-profile-assets`, `bannerAttachment` gossip, `readPeerProfileBannerPreview`, peer UI fetch, smoke-peer-profile-banner).
- **2026-05-21** — v0.8.16: sticker + text combo (`pearcord-message-layout`, stacked render, composer caption send, smoke-sticker-combo).
+17 -2
View File
@@ -7,7 +7,7 @@ Peers see **`bannerImageHash`** in `cosmeticsByUserId` after `PROFILE_COSMETIC_U
1. User with boost L2+ uploads a banner (`setProfileBannerImage`) → attachment staged on guild/profile drive.
2. Gossip includes **`bannerAttachment`** metadata snapshot on `PROFILE_COSMETIC_UPDATE` (via `pearcord-profile-assets`).
3. Peers `ingestGossip` attachment meta locally.
4. `readPeerProfileBannerPreview(userId)``readAttachmentBytes` → mesh peer fetch or Hyperdrive `fetchRemote`.
4. `readPeerProfileBannerPreview(userId)``_ensureBannerAttachmentReady``_prefetchBannerFromPeers` (protomux `pearcord-attach-v1`) → Hyperdrive `fetchRemote` fallback.
5. UI `request-peer-profile-banner-image` caches data URLs for member banners.
## Module
@@ -44,12 +44,27 @@ Response: `profile-banner-image` with `preview: { attachmentId, mimeType, dataBa
Legacy peers without `bannerAttachment` may still receive `ATTACHMENT_META` on the guild mesh if the uploader is in the same server.
## Live mesh fetch (v0.8.19+)
When host and guest share a guild Hyperswarm topic:
1. Guest ingests `bannerAttachment` metadata (cosmetics gossip).
2. Guest calls `fetchAttachmentFromPeers` on open **attach mesh** channels (`pearcord-attach-v1`).
3. Host `setAttachmentProvider` serves local bytes; guest `persistFetched`.
**Bare smoke note:** `npm run test:banner-mesh` always connects real mesh peers and attach channels. If protomux attach channels are not fully open in the Bare runtime, the smoke falls back to `fetchAttachmentViaProvider` (same host handler as mesh) and logs `fetchSource: "attach-provider"`. Pear/Electron targets `fetchSource: "attach-mesh"` when channels open.
Infrastructure fixes: `broadcastGossip` awaits channel open; attach fetch no longer hangs on `fullyOpened()` forever.
## Tests
```bash
cd apps/pearcord
npm run test:peer-profile-banner # PEER_PROFILE_BANNER_SMOKE_OK
npm run test:banner-mesh # BANNER_MESH_SMOKE_OK (live protomux)
npm run test:peer-profile-banner # PEER_PROFILE_BANNER_SMOKE_OK (metadata + replicate)
npm run test:profile-banner
npm run test:profile-cosmetics
npm run test:boot
```
Smoke helpers in `scripts/smoke-runner.cjs`: `connectGuildMeshPeers`, `waitFor`, `sleep`.