The loop
Five steps, and only one of them can use a model
A statement arrives in a conversation. It is checked against what is already known, folded in or kept apart, filed in a tier, and then either indexed or written out in full — depending on what the message in front of it actually referred to.
- 01
Capture
Deterministic patterns first: URLs, assignments, stated requirements. No model, no refusal, no silent loss.
What gets learned - 02
Reconcile
Restatements are folded into what is held. A merge that would drop a qualifier is refused and both are kept.
Reconciliation - 03
File
Into one of four tiers. New facts land hot so the next prompt already knows them.
Four tiers - 04
Plan
Build the block: a gist line for everything, a full body only for triggers, contradictions and weak domains.
What goes into the prompt - 05
Inject
Into the system prompt, inside a token budget that reports when it truncated.
The API
Step 04 · plan
When two stored claims disagree, the disagreement is a record
A flat list has nowhere to put “these disagree”. It stores both and one quietly wins, or it drops one and never says so. Here the pair is kept, pinned into every prompt, and the question goes to a person — because picking a winner is a decision the service has no standing to make.
mem_7f2aWe deploy on Fridaysten_44e1We never deploy on Fridays← neither is marked stale
Ask, do not resolve
Which is it?
One of these is wrong and nothing in the store says which. The pair is pinned into every prompt at full body — exempt from the budget, because a budget that can silently drop a contradiction is a budget that can resolve one without anyone deciding to.
Resolving it keeps the resolution, and the reusable pattern it revealed.
The questions
Four decisions that are invisible in the output
Why is capture first, and deterministic?
A model is a good judge and a poor witness. It can refuse, hedge, or return nothing, and a fact the user plainly stated then never gets learned at all. Patterns run first so a plainly-stated fact is captured even with no provider configured — health reports rules-only, so you know which mode you are in.
Why is the block built before the model runs?
Because the alternative is asking the model what it would like to remember, and paying for the answer. Pre-injecting an index means the agent starts the turn knowing what is held, and the block is assembled deterministically from the message being answered rather than from a model's guess about it.
Why does a new fact land hot rather than after a promotion pass?
Waiting for a pass added a turn of latency, which meant a fact you taught on one turn was still missing from the very next prompt. That is the most visible possible way for memory to look broken, so L1 is the default home and demotion is the deliberate act.
What happens to something that does not fit?
It is kept apart rather than forced in. A merge that would drop a distinctive token is refused and both entries survive, because a duplicate costs one row and a lost fact is gone for good.
Read on