# auto-qualify-draft.screen — web FE **Priority:** Low. The primary surface is the existing inline `approval-card` (in chat/voice). This screen exists for batch-review and policy tuning. **Surface:** `quinn.prospecting` → `/auto-qualify` route. **Calls:** `platform.api` only. ## Layout — batch inbox ``` ┌────────────────────────────────────────────────────────────────────┐ │ Auto-qualify queue [class ▾] [confidence ▾] [policy] │ ├────────────────────────────────────────────────────────────────────┤ │ engage-priority (5) │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ prospect-2014 • score 0.86 • graph: high-rep returning │ │ │ │ inbound: "Hi, available Sat evening?" │ │ │ │ draft: "Yes — 8pm or 10pm Sat. Same arrangements as last?" │ │ │ │ why this draft ▾ │ │ │ │ • graph fingerprint: weekend-only, returning, pre-verified │ │ │ │ • local touchpoint: 3 prior, last conversion 6w ago │ │ │ │ • calendar: Sat 8pm + 10pm currently open │ │ │ │ [send] [edit] [decline] [wrong score] │ │ │ └──────────────────────────────────────────────────────────────┘ │ ├────────────────────────────────────────────────────────────────────┤ │ engage-now (11) triage (4) │ │ auto-decline-soft (3, 2 already approved-sent) │ └────────────────────────────────────────────────────────────────────┘ ``` ## Layout — policy editor ``` ┌────────────────────────────────────────────────────────────────────┐ │ Auto-qualify policy │ ├────────────────────────────────────────────────────────────────────┤ │ Qualifying questions I always need: │ │ [photo / age verification] [budget] [time window] [add+] │ │ Voice profile: [calibrating · 32/50 sends] [retrain] │ │ Class thresholds: │ │ engage-priority ≥ [0.75] │ │ engage-now ≥ [0.50] │ │ triage ≥ [0.25] │ │ auto-decline-soft < 0.25 │ │ Graph dependency: [allow] / [require] / [ignore] │ └────────────────────────────────────────────────────────────────────┘ ``` ## Gestures - **Tap `[send]`** → submits draft as-is (positive label). - **Tap `[edit]`** → opens inline editor; edit-and-send records the diff as a correction. - **Tap `[decline]`** → record class override; surfaces a class-correction prompt. - **Tap `[wrong score]`** → score correction with reason picker. - **Tap `why this draft ▾`** → expands feature provenance (per `qualify_replay`). - **Long-press class header** → bulk action ("send all in this class as-drafted") for high-trust periods. Requires per-session re-consent; never persistent. ## States | State | Behaviour | |-------|-----------| | **Cold voice profile** | Draft cards carry an explicit "voice calibrating" badge. Conservative defaults. | | **Graph offline** | Cards show "graph offline" badge; scores rendered with widened error bars. | | **Safety-flagged touchpoint** | Does not appear in this queue at all; routed to `K-safety-blocklist`. | | **Score-only (latency breach)** | Card renders without a draft; provider sees score+class and must compose manually. | | **Audit replay** | Per-card replay shows feature provenance as of the original score timestamp. | | **Bulk-send mode** | A persistent banner names the active bulk session and offers one-tap cancel; bulk auto-revokes after 10 minutes. | ## Privacy invariants - "Why this draft" never names a graph contributor. - Drafts never quote another provider's content; the editor cannot paste cross-tenant text. - Bulk-send is gated; never sticky across sessions. - Voice-profile retraining uses only the provider's own past sent messages; never cross-tenant. ## Related docs - `auto-qualify-draft.brief.md`, `auto-qualify-draft.contract.md` - `@features/ai-copilot/docs/approval-card.screen.md` (the primary inline surface) - `@features/ai-copilot/docs/chat-home.screen.md` (conversational entry point) - `@features/ai-copilot/docs/00-system-voice.md` - `@features/ai-copilot/docs/K-safety-blocklist.brief.md`