83 lines
5.8 KiB
Markdown
83 lines
5.8 KiB
Markdown
|
|
# 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`
|