June 6, 2026

Compact-first rewrite, vision uploads, attachments that survive reload

Compaction gets a zero-divergence rewrite, images become searchable by what's in them, and chat attachments finally survive a page refresh.

Today closed gaps that only show up under real use: a compaction path that could diverge from its own design, uploaded images the model could describe but never see, and attachments that looked persistent but vanished on refresh. None show up in a demo — all three show up the first time someone lives in the product.

The biggest piece: a full rewrite of context compaction to a COMPACT-FIRST design with zero divergence from the canonical spec. Every turn now measures the full request before sending; if it would exceed the context window, compaction fires first, a watermark advances, and the request is rebuilt collapsed — no partial-view turn where the model silently sees truncated history. Sending now returns an explicit “over cap” signal instead of quietly proceeding, with a force-send path for the rare irreducible request: if compaction can’t shrink things further, the provider becomes the source of truth and fails loudly rather than looping forever. A same-day follow-up fixed a subtler risk: progress was being credited even when the trail hadn’t actually collapsed, which could spin the retry indefinitely. Boring to describe, but it’s the difference between a conversation that quietly degrades and one that keeps working.

Image uploads got meaningfully smarter. Attachments dropped into a new conversation now upload in parallel instead of one at a time, and — the real unlock — images are described by a vision model at upload time, OCR as fallback when none is configured. That description feeds into the same search pipeline as every other document, so asking Chalie to find “the photo of the whiteboard from last week” works, matching what’s in the image, not a filename. A textless image with no vision provider now correctly lands as ready rather than failed — a blank result isn’t an error. There was also an ordering bug: the think-before-responding pass fired before an image upload finished, so on a chat’s first turn the model could reason about an attachment it hadn’t seen yet — now sequenced correctly, uploads landing first.

Attachments now also survive a page refresh, which sounds trivial and wasn’t. Previously, whatever you attached rendered fine until reload, then vanished — the preview was a browser-local reference with nothing durable tying it to the conversation. There’s now a proper link between an upload and the turn it belongs to, so history reloads with images and files where you left them, and something you attached stays distinct from what the model produced mid-turn.

The tool framework got a cleanup too. Tools used to declare name, description, and parameters through loosely-enforced attributes, with two easy-to-miss code paths injecting framework-level fields into the schema the model sees. That’s now one sealed assembly point — miss required metadata and the tool won’t load, instead of silently reaching the model broken. Smaller fixes rode along: the composer’s context-size indicator had been flickering between real conversation size and internal sub-requests, now fixed by keying off the user’s own turn; the file-reading tool accepts the natural argument names a model reaches for instead of dropping non-matching keys; and tool discovery is now scoped per conversation type, so internal tools can’t leak where they shouldn’t run.

None of this is flashy alone, but it compounds: a conversation that runs indefinitely without losing context, images that are genuinely searchable, and a tool contract that fails at load time, not runtime — the foundation the next layer of agentic behavior gets built on.

  • Compaction rewritten to COMPACT-FIRST: full request measured every turn, compacted before send, with an explicit over-cap signal and force-send fallback for irreducible requests

  • Turn-0 attachments upload in parallel and are described by a vision model at upload time (OCR fallback), making images searchable by their visual content

  • Fixed an ordering bug where the model’s think-before-responding pass could run before an image upload finished, reasoning about an attachment it hadn’t seen yet

  • Chat attachments now persist across a page refresh via a durable link between uploads and their conversation turn

  • Tool metadata and schema injection collapsed into a single sealed assembly point — missing metadata now fails at load time, not at runtime