June 12, 2026
Tool calls stop lying about what happened
Chalie's tool calls are now recorded durably instead of being purged mid-turn, fixing rich cards and unlocking a new fact-extraction step in memory.
Today’s target was a bug that showed up sometimes, on some tools, on the live feed — never on refresh. That inconsistency is the tell of a race, and I don’t ship around races, I remove them.
The root cause: every tool call got purged the moment a turn finished, on the theory it was ephemeral scratch data. It wasn’t. The purge ran before the chat pipeline finished building the message segments rich cards attach to, so by the time the renderer looked for the tool call it needed, the row was gone and the card fell back to plain text. The live broadcast path had a related bug: it grabbed whatever message landed most recently instead of the one tool calls are keyed to, so live view degraded to plain text while a refresh, using the correct lookup, looked fine. One lesson, two symptoms: don’t guess a row when you can look it up properly, and don’t delete data before every consumer has had a turn.
The fix removes the ephemeral flag entirely. Tool calls are durable now, retained for seven days and swept by a time-based janitor instead of a fragile count-based purge — a foundation, not just a bug fix. The internal mechanism Chalie uses to sanity-check its own recent actions was silently broken by the same purge, windowing over a table emptied every turn; now it has something to review. And the broadcast fix means rich cards — file previews, structured results, the things that make a tool call feel like a real answer — render correctly the instant they happen, not just after a refresh.
The bigger structural move was on memory. Chalie’s background memory worker — which consolidates what it’s learned without blocking a conversation — gained a new step: fact extraction. Every episode gets distilled into structured facts, reconciled against what Chalie already believes. If a new fact contradicts an old one, the old isn’t overwritten — it’s formally superseded, closed out the moment the new one takes effect, so Chalie can always answer “what did I believe, and when did that change.” That’s bi-temporal memory: not just what’s true now, but when it became and stopped being true. It runs on a budget of twenty calls per pass, and if it can’t parse what it extracted, it does nothing rather than write something wrong — a system that guesses is worse than one that’s occasionally behind.
Alongside that, I tightened the trigger for Chalie’s “remembering the last thing we talked about” behavior: the threshold for whether a new message continues the thread or opens a new one was recalibrated against real conversation data, so short topicless messages now ride on existing context instead of a needless re-fetch. I also added an overdue rule: for anything time-sensitive — weather, news, today’s date — Chalie must make a fresh tool call this turn, not lean on stale memory.
Smaller but real: provider setup now has a “Popular Providers” tab, pre-loaded with 100+ presets, so setting up an unfamiliar OpenAI-compatible endpoint takes a dropdown selection instead of hand-typing a host URL.
None of today’s work is glamorous. It’s the kind of day the product gets more honest — about what it remembers, when, and what it shows you while it’s happening. That’s the trajectory I care about. Next up: watching fact-extraction run against real usage and seeing the supersession trail accumulate.
-
Tool calls are now recorded durably (7-day retention, time-based janitor) instead of purged mid-turn — fixes rich cards degrading to plain text on both history and live paths
-
Live broadcast now resolves the correct database row for tool calls instead of grabbing whichever message landed most recently
-
New background memory step extracts structured facts from every episode and formally supersedes outdated ones with a precise before/after boundary
-
Continuation detection recalibrated against real conversation data so short follow-up messages correctly stay in context instead of triggering unnecessary re-fetches
-
Chalie now requires a fresh tool call for time-sensitive facts (weather, news, dates) instead of relying on stale memory
-
Provider setup gains a “Popular Providers” tab with 100+ ready-made presets for OpenAI-compatible endpoints