cocottetech/@platform/codebase/@features/ai-copilot/docs/tryst-inbox.screen.md
natalie 1b719e1fd7 chore(bootstrap): initial V4 commit
Clean successor to V3 (forge: lilith/atlilith). Seeded from local Mac
working tree at ~/Code/@projects/@cocottetech/. node_modules and build
artifacts excluded via .gitignore.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 08:11:41 -07:00

110 lines
6.9 KiB
Markdown

# tryst-inbox.screen
Tryst-native thread list + thread-detail view. Implements [surface-tryst.brief.md §5](./surface-tryst.brief.md). Sibling to [unified-inbox.screen.md](./unified-inbox.screen.md); Tryst-specific because of metadata (verified-only filter, listing-rank of sender, city). Voice: working.
## Layout (split: thread list + thread detail; iPad/web side-by-side, iPhone stack)
### Thread list (iPhone primary)
```
┌─────────────────────────────────────────────────┐
│ ◄ Inboxes 🔍 ⚙ filters │ 56pt
├─────────────────────────────────────────────────┤
│ Tryst · 12 unread · 47 threads total │ header
│ [ All ] [ Unread ] [ Verified-only ] │ state filters
│ [ City: any ▾ ] [ Rank: any ▾ ] │ Tryst-specific filters
├─────────────────────────────────────────────────┤
│ │
│ ✓ @felix · SF · rank #18 · 14:02 │ thread row
│ "thinking about Berlin..." │
│ ✓ @marko · Berlin · ✓ verified · 11:08 │
│ "Hi! Are you available next week?" │
│ • @anon · LA · 06:55 │ not-verified
│ "rates?" │
│ … │
│ │
└─────────────────────────────────────────────────┘
```
### Thread detail (iPhone push view)
```
┌─────────────────────────────────────────────────┐
│ ◄ Tryst ⋯ menu │ 56pt
├─────────────────────────────────────────────────┤
│ @felix · San Francisco · rank #18 │ prospect header
│ [ ✓ verified · since 2024 ] │
│ │
│ ─── thread ─── │
│ felix: thinking about Berlin │ inbound
│ cocotte (draft): "Berlin Oct 3-7 — let me…" │ drafted reply
│ [ Edit ] [ Send ] [ Set aside ] │ approval row
│ │
│ felix: about the rates │ earlier in thread
│ you: thanks for asking, rates are on profile │
│ │
└─────────────────────────────────────────────────┘
```
## Components
| Component | Notes |
|---|---|
| List header | Tryst inbox name + counts. |
| State filters | All / Unread / Verified-only (Tryst-specific: filter by Tryst-side verified clients). |
| Tryst-specific filters | City (sender's listed city) + Rank (sender's listing rank — gives Quinn signal that this client is also a Tryst-active member of the audience). |
| Thread row | Read state · handle · city · rank · time · 1-line excerpt. |
| Thread detail header | Prospect handle, city, Tryst-listing rank, verified-since chip. |
| Thread | Native iOS message bubbles (inbound left, outbound right). Drafted replies appear inline with the approval row. |
## States
1. **Default** — list of threads, newest first.
2. **Unread filter** — only unread threads visible.
3. **Verified-only filter** — only Tryst-side verified clients shown.
4. **Empty (after filter)** — "Nothing in this slice."
5. **Empty (truly)** — "No Tryst threads yet. They'll appear here when clients reach out."
6. **Thread with drafted reply** — approval row inline; tap Edit / Send / Set aside.
7. **Thread blocked sender** — banner: "You blocked this sender. Their messages don't trigger Cocotte." Re-enable affordance.
8. **Coop intel on sender** (per [brief N](./N-provider-coop.brief.md)) — chip: "🛡 Berlin coop flagged this handle." Tap → coop-intel-detail.
9. **Tryst session expired** (per surface-tryst §12) — top banner: "Lost connection to Tryst. Inbox may be stale."
10. **Reduced motion / Dynamic Type XXL** — list wraps; filters stack.
## Interactions
- **Tap thread row** → thread detail (push).
- **Long-press thread row** → "Mark read / Block sender / Mute thread / Counter-action."
- **Tap "Edit"** on a drafted reply → compose sheet with the draft pre-filled.
- **Tap "Send"** → high-stakes confirmation (per brief M §M3) since outbound to Tryst is hard to retract.
- **Tap "Set aside"** → moves to pending-approvals; thread stays in inbox.
- **Pull-to-refresh** → re-pull from tryst.link.
- **Tap city / rank filter** → cycle.
## Edge cases
- **Multi-thread prospect** (same Tryst handle, multiple threads opened over time) — collapses into a single row with chip "+N threads"; tap expands.
- **Tryst attachment in thread** (photo from client) — inline thumbnail; tap → full-screen viewer with download.
- **Read receipt synced (Tryst marks thread read on Quinn's open)** — chip "marked read on Tryst at {time}."
- **Tryst-side block** — when Quinn enables Tryst-side block (per surface-tryst §10), thread becomes hidden from this inbox; chip in audit.
- **Reply drafted by triage but sender on K1 blocklist** — shouldn't happen (triage prevents this); if surfaced, error banner: "This sender is blocklisted — draft suppressed."
## *Generalization callout*
Per-surface inbox screens (`ts4rent-inbox.screen.md`, `slixa-inbox.screen.md`, `onlyfans-inbox.screen.md`) follow this layout pattern but with surface-specific filters + metadata. unified-inbox.screen.md is the parent feed; per-surface inboxes are the deep-dive views.
## Related
- [surface-tryst.brief.md §5](./surface-tryst.brief.md) — parent.
- [unified-inbox.screen.md](./unified-inbox.screen.md) — sibling (cross-surface feed).
- [Brief P](./P-inboxes.brief.md) — parent for unified inbox.
- [Brief K §K1](./K-safety-blocklist.brief.md) — block-sender entry.
- [Brief N](./N-provider-coop.brief.md) — coop-intel chip.
- [Brief I](./I-audit-trust-replay.brief.md) — every send + every draft = audit row.
- [specialist-triage.contract.md](./specialist-triage.contract.md) — drafts source.
- [prospect-detail.screen.md](./prospect-detail.screen.md) — long-press route.
## Out of scope
- Composing a new outbound thread (Tryst doesn't support unsolicited outbound).
- Per-thread analytics (defer).
- Multi-attachment compose (single-photo at P0).