May 21, 2026

Ripping Dead Weight, Shipping Geo-Memory

A day of cutting inert introspection code and centralizing tool routing, capped by a full geo-tagging feature that gives Chalie a sense of place.

Today had two modes: subtraction, then addition. First, code costing cycles without earning its keep. Then a feature giving Chalie something it never had before — a sense of where you actually are.

The subtraction started with SelfModelService, an introspection system that had been quietly dying for weeks. It was the last survivor of an earlier generation of self-awareness machinery — ambient inference, situation modeling, domain confidence, curiosity — already ripped out in prior passes. What was left was a background thread, a database connection, and a prompt-assembly call that returned an empty string on every healthy turn, because the working-memory table it read from was never written by anything in production. Dead code that still runs is worse than dead code that doesn’t — it costs cycles for zero output. Cutting it removed a background worker, two unused observability endpoints, and 756 lines. Right behind it, personality and heartbeat management became proper singleton services, and a leftover subagent-transcript field in WorldState came out too, since subagent results already reach the user through the return envelope. Between the two cleanups, nearly 700 more lines gone.

The bigger structural move was centralizing how Chalie decides which tools are visible and when. Tool tier configuration — which abilities are always on, discoverable, or blocked for a given processor — used to be redeclared per-subclass; it now inherits from the base message processor, so a change in one place propagates everywhere instead of drifting. Every ability also picked up a short search tooltip describing what it’s for, enforced at import time. find_tools builds its query description from a live index of those tooltips, so the model discovers capabilities by what they do rather than by name-matching. This mattered immediately: an earlier test run had shown the model repeatedly calling find_tools then invoking the wrong device-control tool, because the intended one had too weak a description to stand out against a more generic neighbor. Broadening that tooltip with concrete domain vocabulary — the kind of language a user would actually type — fixed the routing collision outright.

Then came the feature work: full geo-tagging. Every transcript and episode now carries a location, captured automatically at write time and aggregated across an episode’s window so a whole memory carries a dominant place rather than a raw coordinate. That location surfaces everywhere memory gets read back — direct lookups, full-text search, vector search — so a recalled memory can tell you not just what happened but where. On top sits a new named-places capability: save a location under a label, list them, update them, with a supersede policy so a corrected address quietly replaces the old one instead of leaving a stale duplicate behind. The scheduler picked up departure-time reminders on the same geo layer — Chalie estimates travel time using your own historical patterns first, falling back to recent movement data, and only reaching for a flat default speed when neither exists. A background worker takes a single pass over recent location history to learn behavioral patterns tied to place, on its own cursor so it never competes with the rest of the memory pipeline.

None of this would matter if the tool-call path underneath it was noisy, which is why cleanup came before features today. A leaner base and a tool index that actually helps the model choose correctly are what make it safe to keep stacking capability without the system getting harder to reason about.

What’s next: proving this out under load. Today’s routing collision is exactly the class of bug that reappears the moment a new capability’s vocabulary overlaps an old one, so the discovery index has to keep getting sharper as the tool surface grows.

  • Removed SelfModelService, an inert introspection system that had returned empty output on every turn for weeks (-756 lines)

  • Converted personality and heartbeat tracking to proper singleton services, cutting redundant per-render database queries

  • Centralized tool-tier configuration on the base message processor, with a live find_tools index built from per-ability search tooltips

  • Fixed a tool-routing collision where weak ability descriptions caused the model to call the wrong device-control tool

  • Shipped full geo-tagging: location-aware memory, named places with supersede logic, and travel-based departure reminders