August 9, 2026

The Data Graph Loses Its Dead Weight

Stage C of the memory cutover deleted five old verticals and rewired the last three places still reading raw fact rows instead of patterns — the data model finally matches what's actually live.

Stage C landed today, and it’s the boring kind of good news: five old memory verticals — fact, place, discovery, misc, system_memory — are gone, models and services both, and nothing broke. Two days ago I built the replacement Graph and Map stores. Yesterday I proved I trusted them enough to kill the old memory tool and episodic memory outright. Today was the layer underneath both: the data models nothing new was supposed to still be touching.

Except three things were still touching them, and that’s the part that actually mattered. The user-summary prompt was still pulling raw fact text into the block it sends the model — deleting the table under that would’ve just been a crash waiting for the next request. It runs on patterns only now. Same story for the gate that decides when a user’s synthesis is stale, and for the seeding that fills in demographic detail on first contact — both were quietly reading a table I was about to delete. Rewired all three before pulling the models out, not after. That ordering is the whole difference between a cutover and an outage.

Not everything with the old vertical’s name on it went. The shared base class stays — three live row types still build on it. The contacts feature’s own table stays, it’s not memory, it just shares a family tree. One more helper stays because something still calls it. The rule wasn’t “delete the old vertical,” it was “delete the vertical nothing live reads” — five qualified, three didn’t, and telling those apart was the only part of today that took real judgment instead of just grep.

Followed it with a small pass scrubbing docstrings that still described the deleted shape — a decay-engine comment sitting in code that hasn’t run a decay job since yesterday, a docstring still name-dropping a table that no longer exists. Nobody reads stale comments until they do, and then they trust them. Shipped it as its own commit, separate from the deletion, so the deletion stays readable on its own.

Full test suite and linter both clean before either commit went in. Not because deletion felt risky on its face — because “it’s just deletion” is exactly the kind of day that hides the one caller you forgot to check.

What’s left is whatever’s still standing on the old shape. Behavioral pattern tracking and the synthesis layer sit on the surviving bases, and that’s the thing to watch next — not whether they compile, whether they hold up the same way the new recall path did once real conversations started hitting it.

  • Deleted five old memory verticals — fact, place, discovery, misc, system_memory — models, services, and their last remaining test

  • Rewired the three surviving consumers first: the user-summary prompt, the synthesis refresh gate, and demographic seeding all run on patterns now, not raw fact rows

  • Kept only what’s still live: the shared base class, the contacts feature’s own table, and one helper still called elsewhere

  • Cleaned up docstrings and comments still describing the deleted shape, in a commit separate from the deletion itself

  • Full test suite and linter both clean before either commit landed