June 21, 2026
Chalie starts researching on its own
A new background step lets Chalie go find things worth knowing about you, plus a run of fixes that close real deadlocks and dropped events.
Today’s goal was to make Chalie proactive in a way that actually earns its keep, not just “checks the news for you.” I shipped Auto Research: a subconscious-worker step that fires at most once every 6 hours, durable across restarts, running a dedicated discovery loop grounded in your synthesis and recent conversation. It searches the web and news, decides what’s genuinely interesting, and saves it as a new memory kind that decays after about two weeks. Findings resurface later through normal recall and the turn-0 flashback, so the next time it’s relevant Chalie already knows it and brings it up naturally instead of you having to ask.
The design choice that mattered most was keeping this channel quarantined. Every run is grounded against a persisted record — a discovery_runs table storing what it ran against and a preview, with the full output read live from the transcript rather than duplicated — and surfaced in the Brain dashboard under Cognition → Auto Research, with both a list and a per-run detail view. The discovery channel is muted in the source-profile allowlist, so its transcript rows never get promoted into episodes or facts — only findings the loop explicitly judges worth keeping become discovery memories, routed strictly by channel. That’s the difference between background research and background research that quietly pollutes your memory with noise.
Three bugs got closed that could each silently break a conversation. The nastiest: a turn parked on an interactive permission prompt held the per-channel turn lock for an unbounded wait. Cancelling only set a cooperative flag and never woke the sleeping gate, so the lock stayed pinned forever and every later message on that channel deadlocked until a restart. The gate now polls the cancel event while parked and resolves as denied, letting dispatch unwind and the lock actually release — proven with a feature test driving the real dispatcher against the real gate, red then green. Second, a calendar bug that erodes trust fast: “what’s on my calendar today” could come back empty because the model’s bare-date upper bound sorted before a stored event’s full timestamp, silently dropping every event on the final day — now widened to an inclusive end-of-day bound. Third, a mid-turn WebSocket drop used to strand the live progress indicator, since the completion frame landed on a now-dead socket and was never resent; both disconnect paths now clear the in-flight turn’s callbacks immediately so the spinner can’t outlive the connection.
The rest of the day hardened last week’s native mobile pairing work: a reliability bug and a batch of code smells in the pairing flow, a boot-time self-heal for a GPU inference runtime that fails to load its native libraries (now falls back to CPU and logs an actionable hint instead of leaving embeddings and voice stuck loading forever), and a sandbox fix so x += 1-style assignments stop throwing inside restricted code execution. A dead-code purge also shipped, though one pass mangled a live identifier in the document pipeline and had to be reverted same-day — a reminder that deleting unused functions needs the same scrutiny as feature work.
Auto Research is the thread to watch. It’s cautious by design — one run every six hours, findings that decay in two weeks, nothing promoted to permanent memory without passing through the discovery kind first. That’s the right way to introduce something that acts on your behalf unwatched: prove it’s useful before trusting it with anything durable.
-
Auto Research ships: a 6-hour subconscious discovery loop that searches the web/news and saves genuinely-interesting findings as a decaying memory kind, visible in the Brain dashboard
-
Fixed a real deadlock: cancelling a turn parked on a permission prompt now actually releases the channel lock instead of freezing every later message
-
Fixed a calendar bug where “what’s on today” could silently return nothing because of a date/time boundary mismatch
-
Fixed a mid-turn WebSocket drop that could leave the “thinking…” indicator spinning forever after the backend had already finished
-
Boot now self-heals a GPU inference runtime that fails to load, falling back to CPU automatically instead of leaving voice and embeddings stuck