Summarize an email thread into a brief with a closed status enum (resolved / waiting_reply / action_needed / informational), who the ball is with, and stated next steps.
Thread in, triage-ready brief out: a 2–3 sentence summary, a closed status enum (resolved / waiting_reply / action_needed / informational), waiting_on (who the ball is with — or null), and next_steps[] as stated in the thread. Built for inbox triage, CRM timelines, and support handoffs where a wrong "resolved" hides a waiting customer.
| Entrypoint | Renders | Inputs |
|---|---|---|
system | Status definitions + grounding rules + embedded output schema | — |
user | The delimited thread | thread |
Render system as the system message and user as the user message.
thread (string, required) — the thread, oldest message first; From: headers help but aren't required. May be empty.{
"reasoning": "The last message asks Marta for the revised quote; no reply yet.",
"summary": "Acme requested a volume discount on the Q3 renewal. Legal approved the terms, and a revised quote is now owed to the customer.",
"status": "waiting_reply",
"waiting_on": "Marta",
"next_steps": ["Marta sends the revised quote", "Customer signs by end of month"]
}
status is a closed enum, judged on the whole thread — a question answered two messages later is not waiting_reply; latest state wins. The published eval asserts the status deterministically per case.waiting_on is never inferred — named in the thread or null (always null for resolved/informational).next_steps come from the thread, not from what "would make sense"."Nothing to summarize." / informational / null / [].["string","null"] for waiting_on.summary-grader.Part of the Summarization Essentials collection.