# warm-intros.screen — web FE **Priority:** Low. Warm intros are a conversational primitive; the card appears inline in chat/voice surfaces. This screen exists for the *back-office* — managing intro policy, replaying negotiations, reviewing declined proposals. **Surface:** `quinn.prospecting` → `/warm-intros` route. **Calls:** `platform.api` only. ## Layout — inbox view ``` ┌────────────────────────────────────────────────────────────────────┐ │ Warm intros [policy] [received] [sent] │ ├────────────────────────────────────────────────────────────────────┤ │ Surfaced (3 awaiting your tap) │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ from: provider-447 • net rep: high • category: weekend │ │ │ │ "Vouching for a returning client who's a fit for your │ │ │ │ weekend-only policy and pre-verified photo." │ │ │ │ [accept] [decline] [defer 24h] [why my copilot showed] │ │ │ └──────────────────────────────────────────────────────────────┘ │ ├────────────────────────────────────────────────────────────────────┤ │ Silently declined (12 in last 7d) [show reasons] │ │ ─ over-capacity (4) ─ low-reputation (5) ─ out-of-scope (3) │ ├────────────────────────────────────────────────────────────────────┤ │ Sent (you proposed 7 in last 30d) │ │ ─ accepted 2 ─ declined-not-now 3 ─ declined-flagged 0 ─ ... │ └────────────────────────────────────────────────────────────────────┘ ``` ## Layout — policy editor ``` ┌────────────────────────────────────────────────────────────────────┐ │ Intro policy │ ├────────────────────────────────────────────────────────────────────┤ │ Surface threshold: [conservative ──●─── permissive ] │ │ Categories I accept: [weekend] [first-time] [returning] [add+] │ │ Calendar pressure cutoff: surface only when load ≤ [60%] ▾ │ │ Sender minimum reputation: [medium ▾] from cross-provider graph │ │ Hard blocks: any coop-flagged sender (cannot be disabled) │ └────────────────────────────────────────────────────────────────────┘ ``` ## Gestures - **Tap surfaced card → `[accept]`** → triggers `warm_intro_accept`; opens the resulting thread in the primary messenger surface; warm-intro packet pinned. - **Tap `[decline]`** → records explicit decline (sender sees `declined-by-human`). - **Tap `[defer 24h]`** → re-surface in 24h unless capacity changes. - **Tap `[why my copilot showed]`** → opens replay of recipient-side evaluation (per `I-audit-trust-replay.brief.md`). - **Long-press silently-declined reason chip** → opens correction prompt: "I would have wanted to see one of these" → feeds correction lens. ## States | State | Behaviour | |-------|-----------| | **No copilot adoption among peers** | Screen surfaces a banner explaining warm intros activate when peers in your category bring their copilots online. | | **First-time use** | Policy editor opens first; thresholds default conservative; no intros surface until policy is confirmed. | | **Hard-blocked sender attempted intro** | Never surfaces; appears in audit only, never in the "silently declined" reason chips (no inference of block status). | | **Audit replay** | Renders the negotiation transcript step-by-step, both sides' reasoning, with timestamps. | ## Privacy invariants - The "silently declined" reasons aggregate is *recipient-only*. Senders never see the recipient's policy or capacity state. - The "why my copilot showed" replay never shows the *sender's internal copilot state* — only the packet they sent and the recipient-side evaluation. - Accept-tap is the only path to opening a thread. No background auto-accept under any circumstance. - Coop-flagged senders are never represented in this screen's UI (no chip, no count, no replay entry visible to the recipient human; audit only). ## Related docs - `warm-intros.brief.md`, `warm-intros.contract.md` - `cross-provider-graph.screen.md` (reputation source UI) - `@features/ai-copilot/docs/chat-home.screen.md` (where the inline card appears in primary flow) - `@features/ai-copilot/docs/audit-drawer.screen.md` - `@features/ai-copilot/docs/I-audit-trust-replay.brief.md`