Human classification corrections
Duckbill™ treats a user override of intent, attention, or priority as the current Classification. The AI suggestion stays in AIInference history.
Flow
USER CorrectClassification
→ evaluatePolicy(actor: USER, action: classify)
→ insert classifications (source_type = human)
→ designate current_classifications
→ insert human_corrections + single_correction observation
→ insert-only AuditEvent (actor, old/new, reason)
One correction does not create an ACTIVE rule. created_active_rule is always false and the database rejects true.
Current pointer
current_classifications is the user-visible Classification, keyed by mail_message_id + dimension. Reprocessing inserts a new AI row; it does not erase the human pointer. getConversation returns this pointer so the next GetConversation shows the override.
MailMessage is the logical target. MessageInstance is not updated.
HTTP
| Method | Route | Purpose |
|---|---|---|
| POST | /api/corrections | Persist override |
| GET | /api/corrections/conversation?conversationId=&mailMessageId= | Classification slice for GetConversation |
These routes are not the Home / Needs Me list APIs (MAIL-76).
See ADR 0024.
