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.

  1. 01

    Capture

    Deterministic patterns first: URLs, assignments, stated requirements. No model, no refusal, no silent loss.

    What gets learned
  2. 02

    Reconcile

    Restatements are folded into what is held. A merge that would drop a qualifier is refused and both are kept.

    Reconciliation
  3. 03

    File

    Into one of four tiers. New facts land hot so the next prompt already knows them.

    Four tiers
  4. 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
  5. 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.

Unresolved · pinned into every context buildimpact: critical
  1. mem_7f2aWe deploy on Fridays
  2. ten_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.

How contradictions are detected and resolved →

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.