I am building a memory for AI assistants and I would rather collect real cases than assumptions before I go further.
For me it is three kinds that keep coming back. Decisions first: why we took a detour two months ago that every newcomer immediately wants to straighten out again. Then preferences: how I want things written, explained from scratch every time. And the expensive ones, hard-won fixes where I know I have had this problem before but no longer how I solved it.
What I am actually curious about: have you built a habit against it? I mostly see three approaches. Some keep a rules file in the project and stop maintaining it after a while. Some paste a block of context at the start of every session. Some have made their peace with it and just explain again.
And the question behind it: where would you want that memory to live? On your machine, in files you can read, or with a service that takes the work off your hands and keeps the data? I went with the first, but I am genuinely curious how many of you see it differently.
@n0mad
Neat launch.
Building a similar memory layer on an agent harness. Recall quality isn't the hard part — the trigger is. Fire every turn, it's noise. Fire only on explicit "remember", you miss facts dropped mid-sentence without a flag. How does Bastra decide that boundary: similarity threshold, or checking the fact is actually missing from context first?
Second: how are notes typed internally? I split soft reminders from hard constraints ('"never X, because Y") from recommendations a model can override when circumstances differ from the one that produced the rule.
Does that hold across domains, or does code — which has a live source of truth — need different trigger logic than something
without one?
@ivan_bush Thanks, Ivan! You hit the sore spot.
On the trigger: there isn't one trigger, there are several points, each with its own rules.
- Before a file edit, a hook builds a query from the path, the file extension and the content, and surfaces matching memories.
- On the prompt, Recall does not search every turn. It only fires when the prompt asks for memory, or asks for outbound text or a statement about the project's state.
- Individual memories can be marked as reflex. Those fire deterministically when every word of one of their triggers appears in the prompt, at most two per turn.
Against noise: score floors, every memory shows up only once per session, and a source whose hints the agent keeps ignoring backs off. Whether a fact is already in context by content, I honestly don't check. I only check whether Recall has already shown it in this session. That's the open half.
Saving works the same way: not only "remember this" counts, but also rules, corrections, decisions and frustration. At the end of a turn, a hook reads the last messages and suggests saves, but it never saves on its own. Facts dropped in passing without any signal still slip through today.
On types: lesson, decision, preference, workflow, project-fact and a few more. There's no explicit hard/soft split like yours. Instead, every memory carries a "why" and a "how to apply" in its body, so the model can see whether the circumstances still match. New versions explicitly replace old ones, and contradictions are flagged as a visible conflict instead of being silently overwritten.
And yes, code works differently. There the trigger sits right on the edit tool, and a project fact can carry a verification command that checks the claim against the current code. It never runs automatically; the agent decides. Without such a source of truth, all that's left is age, usage and explicit replacement.
I am curious how you check whether a fact is really missing from context. That's the piece I'm still missing.