How HeLa Bots Remember Now: Digests, Instant Recall, and a Real Forget Command
The gap this closes
A HelaSyn bot already had durable memory: an hourly digest job reads the conversation audit trail and turns it into structured knowledge-base rows the bot can draw on later. That works well for anything said more than an hour ago. It has one obvious blind spot — a fact told five minutes ago, before the next digest cycle runs, was invisible to recall. Ask "what did I just tell you?" in that window and the bot genuinely didn't know yet.
The fix shipped this month closes that window, and adds something bots didn't have before at all: a command a bot owner can type to make it forget something, on demand, with a confirmation step first.
What shipped
All of this lives in one new engine module, memory_ops.py, deliberately kept deterministic and zero-LLM — it runs on the hot path before or after the model call, not as something the model decides to do:
- Undigested-tail recall. Between digest cycles, recall now also scans the raw, not-yet-digested conversation tail (bounded to the last hour, keyword-ranked, no LLM or embedding call involved) and injects the top few matches as a clearly-marked lowest-priority block. A fact told at 9:00 is recallable at 9:05, before the 10:00 digest would have caught it.
- In-chat "remember me" / "forget X." A bot owner can ask what the bot remembers about them, or ask it to forget a specific topic. Forgetting is never immediate — the bot lists what it found and asks for an explicit "yes" before deleting anything. Say "no," or just don't reply, and nothing is removed.
- Semantic supersede. When a newer fact replaces an older one under the same category and subject, the older row is now removed instead of quietly coexisting alongside it, so recall doesn't surface a stale answer next to a current one.
Why it's gated to the owner
Every one of these commands is owner-gated. A stranger in a group chat, or an unauthenticated visitor on a public bot widget, gets a normal conversational reply — never a memory summary, never the ability to trigger a delete. The gate is checked against the resolved audience signal for that turn, not against anything the model itself decides, so a persuasive message can't talk a weaker model into treating a stranger as the owner.
Groups needed one more rule on top of that. A bot owner can type a memory command from inside a shared group chat, and the engine still has to answer — but it can't post the bot's private memory contents into a chat with other people in it. So a memory command issued in a group is executed, and the actual content (the recall summary, or the forget candidate list) is delivered privately to the owner's DM; the group only sees a short pointer like "I've sent that to your DM." If the DM send itself fails, the bot does not fall back to answering in the group — it asks the owner to come to DM instead. Fail closed, not fail open.
The delete-confirmation state lives in memory on the running bot process, not in the database. That's a deliberate trade-off: a bot restart mid-confirmation drops the pending delete instead of carrying it forward, so a restart can never turn a stale "yes" into an unintended deletion.
What this doesn't do
This is a same-key overwrite mechanism, not a knowledge-graph reconciliation project — if you tell a bot two different facts under two different topics, both are kept; supersede only fires when a newer fact shares the same category and subject as an older one. It also doesn't change what a bot remembers automatically; it changes how quickly a just-told fact becomes recallable, and gives the owner a direct lever to remove something.
Q&A
What is "digest to KB" in this context? The existing hourly (or nightly, depending on the bot) job that reads a bot's raw conversation audit trail and writes structured, retrievable knowledge-base rows from it. It's HelaSyn's baseline memory-formation path; this update fills the gap between digest cycles, it doesn't replace the digest.
Can anyone make a bot forget something about someone else? No. Recall and forget are both owner-gated against the resolved audience for that turn. A non-owner turn — group stranger, unauthenticated DM, public widget visitor — is a no-op here and falls through to a normal conversational reply.
Does "forget" delete immediately? No. The bot always lists what it found first and requires an explicit "yes" before deleting. "No," an unrelated reply, or a short timeout on the confirmation (90 seconds) all result in nothing being deleted.
Where does this run technically?
Engine-side, in memory_ops.py, merged into the HelaSyn engine's main branch on 2026-07-07 and live on the fleet's bot hosts as of the same day.
What's next
The undigested-tail window and the digest cadence are both configurable per deployment; the next iteration is tuning those defaults against real usage rather than adding new memory surfaces.