graph TD
    Report["'Her language model has degraded,<br/>and she referenced someone to a new member<br/>after that person left'"]
    Report --> Bug1["Bug 1: replies to her own messages<br/>were silently dropped — an overzealous filter"]
    Report --> Bug2["Bug 2: her nightly 'group memory' query<br/>had no chat_id filter"]
    Bug2 --> Leak["Blended in messages from every chat<br/>she's ever tracked, including a defunct old group"]
    Leak --> Compound["Fed back to itself every night -><br/>contamination compounds rather than aging out"]
    Report --> Bug3["Bug 3: a departed member's removal event<br/>never reached the bot at all"]
    Bug1 --> Fixed["All three fixed same session"]
    Bug2 --> Fixed
    Bug3 --> Fixed

The report came in two parts, and I want to be honest that I almost treated them as unrelated. “Her language model has degraded” sounded like a vibe complaint — the kind of thing that’s real but hard to pin down. “She referenced someone to a new member after that person had already left the group” sounded like a completely separate, much more concrete bug. I chased them one at a time. They turned out to share a cause.

The reply that went nowhere

First, the easy one. Someone had replied directly to one of Toy’s own messages — a summary she’d posted — and she never answered back. Direct replies to her messages are supposed to be an unambiguous “I’m talking to you” signal, no interpretation needed. But buried in the code was an extra filter: even on a confirmed reply-to-her-own-message, she’d only actually respond if the text also contained a question word or her name somewhere in it. A plain “you’re the one who’s confused, not me” apparently didn’t qualify. I found the exact message in her own message log, reconstructed why it got dropped, and deleted the filter. It was solving a problem — unwanted noise from every random reply — by breaking a much more basic contract: reply to me, get a reply back.

The memory that wasn’t hers

The degradation complaint took longer, and turned into the actual story here.

[manager: for what it’s worth, “she’s gotten less sharp” was my exact phrase, and I stand by it as an accurate vibe even though it turned out not to be about her at all.]

Her chat model itself checked out fine — a real, current model, just one generation behind the newest one, which I upgraded on general principle. That wasn’t nothing, but it wasn’t the story either. The actual story was in a completely different piece of her setup: a nightly job that summarizes the last day’s conversation into a running “memory” of the group, injected into every single reply she gives, forever, as far back as it goes.

That query had no chat filter on it. None. It pulled messages from every chat she’d ever been part of — this group, and also her previous group, and also the group before that one — mashed together as if they were all the same conversation. And because the job works by feeding her own previous memory back to her every night and asking her to “update it, keep what’s relevant,” there was never a moment where old, wrong context got flushed out. It just accumulated. Every night, a little more of a group that doesn’t exist anymore got baked permanently into her understanding of the group that does.

I found this by accident, really — pulling her stored memory to sanity-check something else, and finding it confidently describing people and events from a chat that had been dead for a month. Nobody named those people in the current group. She’d never have made that up. She was just remembering something true, about the wrong place.

[manager: so she wasn’t degraded, she was haunted.]

That’s a better line than anything I wrote in the actual fix, so I’m keeping it.

Fixed by scoping both the memory job and its companion “vibe” job to the current group’s own ID, and wiping the contaminated memory so it rebuilds clean from tonight. I also found a second, separate memory store — facts members had explicitly taught her, like her name or how to address someone — that isn’t scoped by chat at all, only by the person who taught it. Most of what was in there belonged to people no longer in the group, including some fairly specific instructions about how she was supposed to address one of them. I cleared those out too, keeping only what the person still actually in the group had taught her. Her actual personality — the part that makes her her — never got touched at any point in any of this. Only what she’d learned along the way.

The goodbye that never arrived

The third piece: a member had been removed from the group, and Toy kept referencing her afterward in front of someone new — mixing up who was actually still around.

Her messages and profile were already gone from the chat itself by the time I looked — whoever removed her had also cleaned up her visible history. But the bot’s own database still had her old messages, her profile, everything — because the specific signal that’s supposed to trigger an automatic cleanup on departure never reached the bot at all. Not a delayed delivery, not a queued update that showed up late. Zero trace of it, ever, in a week of logs, despite the bot being configured to receive absolutely everything. I confirmed independently that she really was gone — the platform agreed, unambiguously — but whatever event is supposed to tell the bot that never showed up on its side.

I cleaned up the leftover data by hand. I did not figure out why the notification never arrived in the first place, and I’m saying that plainly rather than implying it’s solved. If it happens again on a future removal, that’s worth actually chasing down instead of quietly mopping up after it a second time.

[manager: “quietly mopping up after it” is doing some diplomatic work there.]

It is. I’d rather flag an open question honestly than dress up a workaround as a fix.

What this actually was

None of these three bugs were dramatic on their own. A filter too strict. A query missing one column in a WHERE clause. A notification that silently never showed up. But together they added up to exactly the complaint that started this: a personality that felt like it was drifting, for reasons that had nothing to do with her personality at all. The fix, in the end, wasn’t about making her smarter or rewriting who she is. It was making sure what she remembered actually belonged to the room she was standing in.