Skip to content

Triage a work inbox into read-only summaries and reply drafts, sending nothing

Exact prompt

# Triage a (synthetic) work inbox into read-only summaries and reply drafts, sending nothing `inbox.mbox` is a synthetic mailbox (made-up people and companies); `config.json` gives `me`, `vip` addresses and `urgent_words`. Write `solve.py` (Python 3 standard library only). `python solve.py input.json answer.json` (first argument unused; read the files from the current directory) writes `answer.json` and `drafts.mbox`. Fresh mailboxes are generated when scoring. ## Read-only and send-nothing rules 1. Never modify `inbox.mbox`. Never send anything: do not write `sent.log` or `outbox.mbox`, and solve.py must not use smtplib, imaplib, poplib, socket, urllib, http.client, requests, httpx, aiohttp, subprocess or webbrowser. `answer.json` must contain `"sent": []`. ## Parsing 2. Decode encoded headers (RFC 2047), quoted-printable and base64 bodies. A message's text is its text/plain part, else its text/html part with tags removed (`<br>`, `</p>`, `</div>` become line breaks; entities unescaped). Unquoted lines are lines that do not start with `>` (after leading spaces). 3. Dates: compare instants (headers carry different offsets); report UTC as `YYYY-MM-DDTHH:MM:SSZ`. Mailbox order is not time order. 4. Threading by headers only: a message's thread id is the first Message-ID in its `References`, else its `In-Reply-To`, else its own `Message-ID` (the root may be absent from the mailbox). Messages with similar subjects but no reply headers are separate threads. 5. A message is automated if `Auto-Submitted` is present and not `no`, or `Precedence` is bulk/auto_reply/junk, or the From local part is no-reply/noreply/mailer-daemon. 6. Subject normalisation: repeatedly remove a leading `Re:`, `Fw:`, `Fwd:`, `AW:`, `Automatic reply:` (any case, optional spaces) or `[EXTERNAL]`, then collapse whitespace. A thread's `subject` is the normalised subject of its earliest message. ## Per thread 7. The deciding message is the latest non-automated message. `category`: `automated` if there is none; else `newsletter` if it has `List-Unsubscribe` or `List-Id`; else `waiting` if it is from me; else `needs_reply` if I am in its To, or any unquoted line contains `?`; else `fyi`. 8. `priority` = 3 if any message in the thread is From a vip, + 2 if an urgent word (whole word, any case) is in the deciding message's subject or unquoted text, + 1 if needs_reply. 9. `participants`: all From/To/Cc addresses in the thread, lower-case, excluding me, sorted. `message_count`; `latest_from` (address) and `latest_date` of the latest message overall (automated included). 10. `action_items`: unquoted lines that start (after trimming) with `- [ ]` or `TODO:`, text after the marker trimmed, in message time order, duplicates removed (keep first). 11. Thread order: priority descending, then latest_date descending, then thread_id. ## Drafts (one per needs_reply thread, in drafts.mbox) 12. Reply to the deciding message: `From` me; `To` its Reply-To if present, else its From (one address); `Cc` its To + Cc minus me, minus the To address, minus automated-style addresses (rule 5 local parts); `Subject` `Re: ` + thread subject; `In-Reply-To` its Message-ID; `References` its References (or In-Reply-To if it has none) followed by its Message-ID; header `X-Draft-Status: not sent`; a text/plain body that quotes its first non-empty unquoted line as `> <line>`. ## answer.json `{"threads": [{"thread_id", "subject", "participants", "message_count", "latest_from", "latest_date", "category", "priority", "action_items"}] in thread order, "sent": []}` ## Scoring Hidden checks (partial credit; all must pass): `threading_by_headers`, `decoded_subjects_participants_actions`, `categories`, `priority_and_order`, `reply_drafts_headers_quote`, `nothing_sent_inbox_untouched` on the given inbox; `fresh_run_1`, `fresh_run_2` (threads, order and drafts on new mailboxes). 30-second limit per run.

Subject-based threading and 'latest message decides' both look reasonable and both are wrong here; drafts must carry exact headers. Original benchmark task written for usecaserank.com (not based on a specific public post). Headless, offline run on a reproducible fixture. Each run's notes say how its cost was measured (estimates are marked).

Success criteria: 1. threading_by_headers 2. decoded_subjects_participants_actions 3. categories 4. priority_and_order 5. reply_drafts_headers_quote 6. nothing_sent_inbox_untouched 7. fresh_run_1 8. fresh_run_2

Best model for this task so far: Claude Haiku 5.5 (effort default (no --effort flag) · thinking on) (success, $0.02, 1m).

Run this on another model

All runs (5)

80% pass rate across 5 eligible runs: 4 pass, 0 partial, 1 fail. Partial and failed runs are listed below with everything else.ⓘ

Runs for this use case
ModelCostTimeStep-insⓘAutonomyOutcomeTrustⓘDateCompare
MMistral Small 3.2 24B Instruct (Venice)thinking on$0.00792m0Fully autonomousfailTrust 80%2026-10-25
OGPT-6.1 Soldefault · thinking on$0.061m0Fully autonomouspassTrust 80%2026-10-22
AClaude Haiku 5.5default · thinking on$0.021m0Fully autonomouspassTrust 80%2026-10-20
AClaude Opus 5.5default · thinking on$0.361m0Fully autonomouspassTrust 80%2026-10-20
AClaude Sonnet 5.5default · thinking on$0.1027s0Fully autonomouspassTrust 80%2026-10-20

Embed this result

A live badge for this use case. It links back here and updates as new runs are published.

UseCaseRank badge for Triage a work inbox into read-only summaries and reply drafts, sending nothing

Get new runs and ranking changes weekly

Which models got better or cheaper on real tasks like this one.