Design: one array item per explicit commitment; omit summaries, priority, and sentiment. Unknown owner/date use null because absence is meaningful; an empty string is invalid. “Soon” remains in evidence but cannot populate due_date.
Schema: action string, required, nonblank; owner string|null, required key; due_date string|null, required key, YYYY-MM-DD only; status enum, required; evidence object, required, with speaker nonblank string, timestamp HH:MM:SS, excerpt nonblank string ≤200 characters. Key order: action, owner, due_date, status, evidence. Cross-field rule: completed status requires evidence that completion was stated; due_date must be null unless an exact date is in evidence.
Exact prompt clause: “Return only a UTF-8 JSON array. Each explicit commitment is one object with keys in this order: action, owner, due_date, status, evidence. Use null for an unstated owner or exact due date; never omit keys or convert relative wording to a date. status must be proposed, confirmed, completed, or cancelled. evidence must contain speaker, HH:MM:SS timestamp, and a source excerpt no longer than 200 characters. Return [] when no explicit commitment exists. Add no prose or Markdown.”
Valid: [{"action":"Send the revised budget","owner":"Nora","due_date":null,"status":"confirmed","evidence":{"speaker":"Nora","timestamp":"00:14:22","excerpt":"I’ll send the revised budget soon."}
}]. Valid empty: []. Invalid: due_date "soon" fails ISO rule; omitted owner fails required-key rule. Human review still verifies whether the excerpt is a commitment and whether “Nora” resolves to the correct person.