Somewhere in a client’s record, in the middle of an ordinary note about an ordinary call, is a sentence like this: “Budget’s tight right now, agreed we’ll check back in with them in two months to revisit.”
Written once. Never looked at again. Not because anyone forgot it mattered, but because nothing about it looked like a task. It wasn’t a calendar entry. It wasn’t a reminder. It was just a sentence, doing what sentences in notes do: sitting there, technically true, functionally invisible.
We wanted to know if the system could catch that kind of thing on its own, without anyone having to remember to go back and turn a sentence into a task by hand.
What we actually built, and deliberately didn’t
The instinct with a feature like this is to let the AI just handle the whole thing, read the note, figure out the date, decide it’s overdue, maybe even draft the follow-up. We split it instead, on purpose.
The model’s only job is language understanding: read a client’s recent notes and recognise a forward-looking commitment, something like “we’ll revisit in two months” or “check back after their board meeting.” It estimates the implied delay in plain terms. That’s it. Every actual date calculation, the due date, whether today is past it, happens afterward in ordinary, deterministic code. The model never does the math and never makes the final call on what’s overdue. It reads. The code decides.
That split matters more than it sounds like it should. Language understanding is exactly the kind of fuzzy, context-dependent task a model is good at. Date arithmetic is exactly the kind of task where you don’t want a model improvising, even a little.
The actual test
We didn’t just check that the endpoint returned something reasonable-looking. We wrote a real note on a real client record: “…agreed we will check back in with them in 2 months to revisit budget.” Called the endpoint. It correctly extracted the commitment, computed an implied delay of 60 days, and landed on a due date exactly 60 days from the note’s real timestamp, correctly flagged as not yet overdue.
Small, and exactly the point. The system didn’t need to be told there was a commitment to find. It read a sentence a person wrote for themselves, not for a form, and pulled a real deadline out of it.
The part that’s easy to miss
Notes in Craft11 are append-only. Nobody edits them, nobody deletes them, not even Stark. It’s the same principle that keeps the raw side of every record honest: what you actually wrote stays exactly as you wrote it. When we needed to remove the test note afterward, there was no delete button to reach for, because there isn’t supposed to be one. It took a direct database operation, confirmed first, torn down immediately after.
That’s a small inconvenience for us during testing. It’s the same reason the commitment-detection feature is trustworthy in the first place: it’s reading real, unaltered, un-cleaned-up human writing, not a sanitised version of it.
Why this is worth doing at all
None of this replaces a task manager. It replaces the specific, quiet failure mode where the only record of a promise is a sentence nobody’s going to reread. The system doesn’t need you to write differently, structure your notes, or remember to flag anything. It just needs you to write down what actually happened, the way you’d write it to yourself, and it does the noticing.