May 13, 2026

No Autopilot on Your Inbox

Email drafting replaces autonomous sending, capability sync gets a real heartbeat, and a token dashboard makes cognition cost visible.

Today was about trust in three places: what Chalie can do with your email, whether the background systems keeping your data fresh actually run, and whether I can see what all this thinking costs.

Biggest call of the day: Chalie no longer sends email on your behalf. The draft action now composes a message and APPENDs it as a real IMAP draft — \Draft and \Seen flags, dropped into whatever folder your provider actually calls Drafts, discovered at runtime instead of assumed. Every line of SMTP send code is gone from the handler. This is narrower than before, on purpose — an agent that reads your inbox needs a hard boundary before it needs more cleverness, and “hits send” is a mistake you don’t get to undo. Spam-folder detection also stopped being a hardcoded guess (Junk doesn’t exist on Gmail, [Gmail]/Spam does) and now asks the server, and read_email stopped truncating bodies or mangling HTML-only messages — you get full plain text, or an honest empty body if there isn’t one. A new manage action adds real mailbox operations — delete, mark read, mark important, move-to-spam with an RFC 6851 fallback — so Chalie can tidy your inbox without ever speaking for you.

The second thread: making sure background sync actually happens. It didn’t. A hidden system:mail:sync scheduled item was meant to trigger IMAP/CalDAV/CardDAV syncs on a timer, but the scheduler’s own poll query filtered out hidden items, so it silently never fired. I patched the scheduler first, then reverted it — wrong owner. Sync belongs in the subconscious worker, which already runs a 5-minute idle-gated tick. Each connected capability now manages its own cadence off that heartbeat — IMAP every cycle, CalDAV every third, CardDAV every twelfth — and a cycle-count bug that skipped two of three protocols on first unlock is fixed too. Contacts sync stopped discarding everything except email-to-name mapping — full CardDAV profiles (nicknames, typed emails and phones, organization, title) are stored now, which matters the moment Chalie needs to tell three Sarahs apart. Calendar reads were also cut over to the same query engine the scheduler already used, collapsing two SQL paths into one.

Scheduled prompts got a structural fix too: they now run as a real conversational turn — full tool surface, system prompt, and personality — instead of a stripped-down processor that behaved differently from a normal turn. A scheduled reminder should feel like Chalie, not a shell of it.

Because none of this is free, I built a token usage pipeline: five new fields per call (cache read, cache create, thinking tokens, plus a usage-class tag), a bucketing endpoint, and a stacked-bar dashboard so I can see chat, subagent, and background spend as separate lines instead of one opaque number. The task strip — previously a fixed bar eating space under the presence bar — became a slideout drawer you open on demand, with a badge when there’s something to see. Small, but it’s the difference between a product that feels like it’s always working at you and one that tells you when it has something to say.

Last piece was cleanup: a dead slide-out panel with its own backend route had zero live entry points — over a thousand lines deleted, full unit suite still green.

What this sets up: real mailbox authority — draft, triage, manage — with a hard line it won’t cross; sync infrastructure that finally runs on the schedule it claims to; and the observability to know what every category of thinking costs before I optimize it.

  • Email: send removed entirely; draft creates a real IMAP draft, spam folder discovered from the server, body truncation dropped
  • New manage action: delete, mark read, mark important, move-to-spam via IMAP
  • Capability sync moved from a broken scheduler hidden-item hack to the subconscious worker’s idle tick, with per-protocol cadence
  • Contacts store full CardDAV profiles instead of just email-to-name; calendar reads unified onto one query engine
  • Scheduled prompts now run as full conversational turns, not a stripped-down processor
  • Token usage pipeline with per-class bucketing and a Cognition dashboard; task strip became an on-demand slideout drawer