Engineering notes

I measured Apple's on-device model so you don't have to

July 28, 2026 · Kaloyan Lachezarov

Deforget turns diary prose into reminders, calendar events, meeting notes, and an index of people - using Apple's on-device foundation model, with no cloud fallback, because nothing leaves the device. That choice has a consequence people underestimate: you cannot pin the model. It belongs to the user's operating system. Whatever iOS ships, my users get, and every OS update can move the ground under the product.

When you depend on a model you can't version, you need instruments, not vibes. So Deforget carries its own evaluation harness: a fixed corpus of diary scenarios with typed expectations - dates, events, reminders, commitments, meeting notes, people, decisions, deduplication, and restraint (emotional prose must extract nothing). It runs on real iPad hardware against every iOS beta, and every case is scored twice: once on the raw model output, and once on the final result after a deterministic repair layer. The gap between those two numbers is the engineering, measured.

The numbers

Method notes that matter: OS comparisons use the same app binary - build once, run on the old OS, update the OS, run again without rebuilding, so nothing moves but the model. Five runs per case, because single runs lie. The corpus grows as field reports arrive, so totals shift between revisions; compare percentages, and only trust a raw-to-raw comparison within one corpus version.

OS buildraw modelafter repair layerthe story
iPadOS 26.546% (78/170)75% (127/170)Mood prose became junk commitments (restraint passed 3 checks of 25); 9 of 170 model calls died in runaway-generation loops
27.0 beta 361% (104/170)91% (155/170)Same binary as the row above - only the model changed. Restraint 21/25, zero call failures, meetings and dedupe perfect
27.0 beta 459% (106/180)89% (161/180)Larger corpus (two new adversarial cases, one deliberately raw-hostile - the raw dip is composition, not regression). Restraint 25/25, dates 25/25, still zero failures

The number I watch most isn't in any single row: the repair layer's contribution stayed close to thirty points across every build - 29 on iOS 26, 30 on beta 3, 31 on beta 4. Model gains and engineering gains compose instead of cannibalizing each other. When Apple ships a better model, my correctness layer doesn't shrink; it stands on higher ground.

What Apple actually fixed in iOS 27

What's still broken, and what I do about it

Three failure classes survived beta 4, and each gets a different treatment - that's the point of measuring instead of guessing.

The corpus is alive

Every interesting field report becomes a permanent test case. A tester's iPad invented a person named "Writer" for a paragraph that named no one - now there's a sentinel case that fails if any person is attached to text that names nobody. Numbered tasks that a deduplication pass once merged ("finish the Q2 report, start the Q3 plan") are a case. This week the diary learned to index links and photos from rich-text paste, which means bare URLs now reach the model - so the corpus gained three URL cases before any guard was written, including a blog permalink with a date in its path, because a phantom calendar event minted from /2026/03/15/ would land in a real calendar. Measure first; guard only what the measurement says needs guarding.

The lesson, if you're building on this stack

The app's guarantees cannot live in the model, because the model isn't yours. They live in a deterministic layer that repairs dates from the source text, recognizes self-declaring types ("we decided..." is a decision no matter what the label says), titles and links meeting bullets without model involvement, kills anything that can't be grounded in the words the user actually wrote - and knows when to do nothing at all. The model contributes recall. The layer contributes truth. Sixty-ish percent raw becomes ninety-ish percent final, on every build, and the pipeline never asks the model to be something it isn't.

All of this runs on the device - the diary never leaves it. The harness ships inside the app, and every number above comes from reports it saved on an ordinary iPad. When iOS 27 goes public I'll run the same corpus one more time, and that run decides the launch.

What all of this looks like in the app →