Skip to content

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

MethodRoutePurpose
POST/api/correctionsPersist 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.