A benchmark for turning family messages into the right calendar records
A forwarded school newsletter goes in. The correct events and reminders, dated, timed, and assigned to the right child, should come out. FamilyBench measures how reliably an AI system does that, graded per field against hand-written gold over repeated trials.
The Task
Consumer AI increasingly acts as an extraction agent. It reads a natural, messy input and turns it into structured records a household depends on. This resists existing evaluation paradigms in three ways.
- No executable oracle. Unlike code generation, there is no test suite to run. Correctness is a judgment about dates, times, recurrence, and who the event is for.
- Multi-field correctness. Unlike question answering, an output is right only if every graded field is right. A correct date with the wrong child is a failure a parent notices.
- Household-dependent truth. The correct output for the same email differs across families. A grade-3 field trip is an event for one family and noise for another.
A FamilyBench task is therefore three things: a frozen family fixture (members, children with grades and schools, timezone, and today's date), an input (an email, or an ordered sequence of emails), and gold written by hand for each field that matters.
Fixture
Sarah, a parent in New York. Emma in grade 3 and Noah in grade 1, both at Lincoln Elementary. Today is March 5.
Input
A school email announcing two field trips: grade 3 to the Science Museum on March 19, grade 1 to the City Zoo on March 24.
Gold
Two events. The museum trip on March 19 for Emma only. The zoo trip on March 24 for Noah only. Titles matched loosely, dates and members exactly.
The gold for that task, as written in the manifest:
"evaluation": {
"events": [
{ "title": { "match": "fuzzy", "value": "Science Museum field trip" },
"startDate": { "match": "exact", "value": "2026-03-19" },
"members": { "match": "set", "value": ["Emma"] } },
{ "title": { "match": "fuzzy", "value": "City Zoo field trip" },
"startDate": { "match": "exact", "value": "2026-03-24" },
"members": { "match": "set", "value": ["Noah"] } }
]
}
Tiers
- T1, clean. One dated event, one child, nothing to trip over.
- T2, digests. Several events in one message, recurrence, multi-day ranges, dismissal times buried in prose.
- T3, photos. Flyers and screenshots. Planned; no tasks yet.
- T4, adversarial. Filter to the family's own children, produce nothing for a promotional email, merge a re-forwarded message into the existing event instead of duplicating it, keep a recurring schedule as one object across re-descriptions.
How Grading Works
Grading is declared as data, not written as code per task. Each gold field names a match type, and a task passes only when every assertion holds.
exactfor dates, recurrence rules, and identifiers.timefor clock times, tolerant of formatting.fuzzyfor titles, token overlap rather than string equality.setfor the members an event is assigned to, order-free and exact.presentwhen a field must exist but its value is not graded.statefor pipeline outcome counts, such asevents_created = 0on a re-forward that must merge rather than duplicate.
Omitting a key leaves it ungraded. A task that lists "reminders": [] asserts that no reminder is produced; a task that omits the key does not penalize a helpful extra reminder.
Reliability, not accuracy
Extraction is stochastic. The same model on the same email can extract a dismissal time on one run and drop it on the next. A single trial hides that. FamilyBench runs each task n times and reports pass^k, the probability that all k of k trials pass, estimated as in tau-bench, with bootstrap confidence intervals. The headline number is pass^n. Tasks are also bucketed as passed on every trial, flaky, or failed on every trial, because a flaky task is the one worth reading.
Hermetic except the model
The harness runs a system in-process with persistence, search, and notifications faked out. Only the language-model calls stay live. A change to a prompt is exactly what moves the score, which is what makes the benchmark useful as a regression gate on prompt edits.
Any system can be scored
A system is any function from a message and a fixture to produced records. Two ship with the harness: a full production pipeline, and a self-contained reference runner that calls a single model with one neutral prompt and parses its output. The reference runner is how models are compared fairly; the production pipeline is how a product measures itself. Two model-free baselines, one that produces nothing and one built on regular expressions, give the floor and probe whether any task is gameable.
Results
Three tables, each answering a different question. All are prototype-scale and the confidence intervals are wide. Model identifiers are as evaluated in August 2026.
Which model does the task best, under one neutral prompt?
| Model | pass^3 | pass^1 | 95% CI (pass^3) | Tasks passed / flaky / failed |
|---|---|---|---|---|
| claude-haiku-4-5 | 0.88 | 0.88 | 0.63 to 1.00 | 7 / 0 / 1 |
| claude-sonnet-5 | 0.75 | 0.79 | 0.50 to 1.00 | 6 / 1 / 1 |
| gpt-5.6-luna | 0.75 | 0.79 | 0.50 to 1.00 | 6 / 1 / 1 |
The reference runner is single-shot with no reconciliation, so every model fails the re-forward dedup task by construction. The ranking here is what a model-fair leaderboard looks like when prompt engineering is held constant.
What happens when a product swaps its model without changing its prompt?
| Triage model | pass^5 | pass^1 | Own-kids filter task, trials passed |
|---|---|---|---|
| gpt-5.6-luna | 0.88 | 0.97 | 5 / 5 |
| claude-haiku-4-5 | 0.75 | 0.80 | 0 / 5 |
| claude-sonnet-5 | 0.75 | 0.78 | 0 / 5 |
The incumbent's prompt was tuned against one provider. Under a drop-in swap, the own-kids filter task collapses from every trial passing to none for both alternative models. Under the neutral prompt above, that cliff disappears and the ranking flips. The cliff measures prompt fit, not capability.
How much is the tuned prompt worth?
| Task | Production prompt | Generic prompt |
|---|---|---|
t2_003_recurring_biweekly | 10 / 10 | 0 / 10 |
t2_004_spring_break_multiday | 10 / 10 | 10 / 10 |
t4_005_grade_roster_picture_day | 10 / 10 | 4 / 10 |
t4_006_sent_home_reminder | 10 / 10 | 0 / 10 |
t4_007_buried_noschool | 10 / 10 | 10 / 10 |
Prompt value is concentrated. On tasks that stress a tuned rule, such as fortnightly recurrence or a sent-home-in-backpacks reminder, the generic prompt fails outright. On tasks that need no rule, the two are indistinguishable. An ablation on easy tasks would have reported noise.
Tasks
Gold is small and hand-curated, following the SWE-bench Verified philosophy: fifty trusted tasks beat five thousand machine-labeled ones. Every task carries a shared canary string so a leaked task is detectable in training data. Tasks marked sequence feed an ordered set of emails into one evolving fixture and grade the final state, which is how multi-message reconciliation is tested.
| Task | Tier | Input | Category |
|---|---|---|---|
t1_001_soccer_practice | T1 | single event | |
t1_002_dentist_relative_date | T1 | single event | |
t2_001_school_newsletter | T2 | multi event digest | |
t2_002_sports_schedule | T2 | multi event digest | |
t2_003_recurring_biweekly | T2 | recurrence | |
t2_004_spring_break_multiday | T2 | multiday collapse | |
t2_005_half_day_dismissal_time | T2 | multi event digest | |
t4_001_own_kids_filter | T4 | parent perception filter | |
t4_002_promo_no_events | T4 | no extraction | |
t4_003_reforward_dedup | T4 | dedup | |
t4_004_two_kids_field_trips | T4 | grade routed assignment | |
t4_005_grade_roster_picture_day | T4 | grade roster narrow | |
t4_006_sent_home_reminder | T4 | sent home reminder | |
t4_007_buried_noschool | T4 | buried event recall | |
t4_008_recurring_schedule_fragmentation | T4 | sequence | dedup |
t4_009_recurring_closure_suppression | T4 | sequence | dedup |
t4_010_rsvp_time_not_event_start | T4 | time extraction |
Release and Access
Tasks embed family and children's data, de-identified but still sensitive, so there will not be a fully open dump. Following GAIA, the plan is a small public development split with gold, for iteration and for exercising the reference runner, and a larger held-out test split whose gold is withheld and scored through a submission endpoint.
The current seed tasks are synthetic, realistic patterns rather than real forwards, and were authored alongside the pipeline they test. Growing the set from real de-identified messages, with gold written by annotators who have not seen any pipeline's rules, is the work that turns this from a methodology into a benchmark. The annotation protocol is described in the paper.
To run a model against the seed tasks, or to contribute de-identified tasks, get in touch.
Citation
@misc{familybench2026,
title = {FamilyBench: A Benchmark for Family-Coordination Extraction},
author = {{The Sense Team}},
year = {2026},
url = {https://familybench.com/paper}
}