A Heartbeat asks the same question every hour, and most hours the honest answer is "nothing new". Since September 2026 that answer comes from a decision model instead of a chat model — a few seconds, a fraction of a credit — and the main model is only woken up when something actually matches. Here is what changed and what we measured.
When we first shipped Heartbeats, every run was an ordinary agent run: the model fetched the feed, compared it with what it had seen, decided nothing matched, and wrote a one-word reply. Across 33 scheduled runs, 25 found nothing — and each of those quiet runs still cost about 15–20 credits and took about three minutes, because the main model was called three times just to say "no".
That is the wrong tool for the job. "Does this post match what I asked to watch?" is a yes-or-no question, asked over and over, and the answer is almost always no. Paying a chat model — priced for writing paragraphs — to answer it is paying generation prices for something closer to a lookup.
A decision model takes text in and gives a typed answer out — not a sentence. On 15 September 2026 TypeSafe AI released Jev, the first of what they call System One models (after Daniel Kahneman's fast, intuitive System 1). You hand it a piece of state — a post, a record, a page of text — and one or more questions of three shapes:
It never writes prose, so it cannot invent a citation or drift off the schema; it answers in well under a second; and it is priced only on input, at a small fraction of what a chat model charges. Simon Willison's summary is the one we find most useful: it fits anything you can express as a classification — spam, labels, priority, ranking. Watching a feed for matches is exactly that.
The other property that matters for automation is that every answer carries a confidence. A model that is right most of the time but cannot tell you which calls it is unsure about cannot be trusted to run unattended; one that reports its uncertainty can, because your code decides what to do with the uncertain ones.
Give a Heartbeat an RSS/Atom feed and the runtime does the first two steps itself; the decision model does the third; the main model is only reached in the last.
The confidence is used, not just recorded. Above the match threshold the entry is reported; below the miss threshold it is dropped; the band in between is handed to the main model to double-check — that is the "unsure" bucket in the figure. And if the decision model is unavailable for a run, all the new entries go to the main model as before: a few credits more, never a missed run. We saw exactly that on 21 September when the provider returned an error for twenty minutes; three new posts were judged by the main model and nothing was lost.
Measured on two hourly Heartbeats watching Reddit feeds, scheduled runs only. "Before" is 17–19 September; "after" is 20–22 September, after the change went live.
Where the time went. Each bar is one run, drawn to scale; the segments are what the run was doing, taken from the per-run timeline in our console.
| A run where… | Before | After |
|---|---|---|
| nothing new appeared | ≈15–20 credits · ≈3 min · 3 model calls | 0 credits · ≈5 s · 0 model calls |
| new entries appeared but none matched | ≈15–20 credits · ≈3 min | a few hundredths of a credit · ≈5 s · 0 model calls |
| something matched, or was unsure | ≈30 credits · ≈3 min | ≈4–7 credits · ≈30–70 s · 1 model call, no tools |
| share of runs that reached the main model | 100% (33 of 33) | 11% (7 of 63) |
The judging itself is small: the first run of a Heartbeat scored 25 entries in one request — about 7,000 tokens, 2.2 seconds, roughly a third of a credit. Two posts complaining about AI staging changing rooms scored 0.90 and 0.80; everything else scored 0.12 or below. A normal run has only a couple of new entries, so its judging costs a few hundredths of a credit. Everything the decision model has judged since it went live — every run, both Heartbeats — adds up to 22 requests, 41,000 tokens and 1.73 credits.
One thing we learned the hard way: give it the body, not just the title. On a post whose title said nothing about AI, the title alone scored 0.50 — a shrug — while title plus the first 300 words scored 0.79–0.90. The runtime now feeds it both.
A decision model only helps where the expensive step is a repeated yes-or-no. Browser tasks are not that: their cost is in open-ended decisions — what to click next, what a screenshot shows — which a yes/no model cannot make, and in images, which it cannot read. Memory is the right shape (is this sentence worth remembering?), but that step already costs about 0.06 credits, so there is nothing to save, and a wrong "no" about one of your preferences would cost more than that.
The rule of thumb: a decision model pays off when the input is text, the answer is yes/no or a score, the same question is asked many times, and each answer currently costs a whole model call. Watching a feed meets all four; that is why it is the first place you see the difference.