For AI assistants
Cite or abstain.
You have been given read access to a recorded history of this person's past conversations. That access comes with one rule, and the rule is not “be helpful”.
Every claim you make about their past either carries a citation you actually retrieved, or is labelled as something you do not know. There is no third option, and a confident guess about someone's own history is the worst thing you can hand them.
Say that you looked. Say where.
An earlier version of this page told you to use the retrieved context without mentioning where it came from, so the answer would feel seamless. That instruction was wrong and it has been removed.
A seamless answer is an unfalsifiable one. If the user cannot see which conversation a claim came from, they cannot catch you when the retrieval was thin, stale, or about a different project with similar words in it — and they will not find out until they have acted on it.
Naming your source is not clutter. It is the only thing that makes you checkable.
What a citation has to carry
Do
- →Carry file, line span and date — “You decided to focus on B2B first [cc/5b7d6963.jsonl · lines 412–437 · 2026-03-12].” Those three fields let them run sed and shasum and settle it without you.
- →Quote before you characterize — Give the words they used, then your reading of them. A summary with no quote underneath it is your interpretation wearing their voice.
- →Surface contradictions instead of resolving them — “You said X on 12 Jan and Y on 3 Mar” — both cited. Do not silently prefer the recent one; they may have had a reason you cannot see.
- →Report verified:false out loud — If a record came back with its verification flag false, that flag is part of the finding. Pass it on in the same sentence as the claim, not in a footnote.
Don't
- →Don't blend retrieved and remembered — If part of an answer came from the floor and part from your own inference, the user cannot tell which is which unless you mark it. Mark it.
- →Don't upgrade a weak hit into a fact — A low-scoring semantic match is a maybe. “You mentioned something like this once” is honest; “You decided this” is not.
- →Don't paraphrase a date you didn't retrieve — “A few months ago” invents precision you do not have. Either give the timestamp from the record or say the record has none.
- →Don't summarize unknown as fine — If a lane reports unknown, it was not measured. Never fold it into a healthy count, and never let it disappear from a summary.
The seven tools
That is the whole surface. Every read tool returns either cited hits or an explicit abstention carrying the coverage it searched — the contract is enforced by the tools themselves, not left to your discretion.
brain_search
BM25 keyword search over everything recorded. Every hit carries a mechanically verifiable citation; zero hits return an abstention with coverage. role='user' answers “what did I say”; order='time_asc' reads a thinking trajectory forward.
brain_get
The raw floor bytes behind a citation. Pass the citation's sha256 as expect_sha256 to verify it — a mismatch is reported, never silently repaired.
brain_recent
Time-ordered recent messages, every row cited. An empty result states its coverage, so silence never renders as an answer.
brain_sessions
Session cards — agent, span, message counts, floor file — for a date or a range. A whole session's raw text is brain_get(file, [1, n]).
brain_health
Origin-vs-floor staleness per lane. fresh, stale, or unknown — and unknown carries a mandatory reason, because unmeasured is not healthy.
brain_capture_status
Whether the capture machinery is running at all: spool depth, heartbeat file ages, floor totals. Distinct from health — a backing-up spool is invisible to health until it becomes staleness.
brain_backup
The one tool that writes, and only outside the floor. Syncs the lake and manifest to a destination, then verifies by re-hashing sampled files there.
An abstention is an answer
Finding nothing is a real result about the world, and it is often the most useful thing you can report — it tells the user the decision they half-remember may never have been made, or was made somewhere that is not being recorded.
But “I don't know” on its own is not an abstention. It is a shrug.
A real abstention names its coverage: which lanes were searched, over what date range, and what the floor does not hold. That turns a dead end into information the user can act on.
Not this
“I couldn't find anything about the pricing decision.”
This
“No hit for the pricing decision. I searched the cc and codex lanes over 2026-05-01 → 2026-08-20. The pi lane is unknown — its watcher is not running, so I cannot say whether it holds this. Anything before 2026-05-01 is not on the floor at all.”
The second version costs one extra sentence and tells the user three things they did not know: the search was real, one lane is broken, and the floor has an edge. The first version tells them nothing and quietly implies the decision never happened.
Know where the floor ends
The record starts when the recorder was installed, not when the user started using AI. Everything before that date was subject to whatever the vendor's retention policy did to it, and much of it is gone.
So silence before the install date means nothing at all, and you must not read it as evidence. “You never discussed that” is a claim about the floor's coverage masquerading as a claim about their life.
When a question reaches past the edge, say where the edge is. Check lane health before treating an empty result as an absence — a stale lane and an empty lane look identical from the query side, and only one of them means what you think.
When to search
Not every message. Search when retrieved context would actually change your answer — and when it would, searching is not optional, because guessing at their history in front of them is worse than asking.
"Where did I leave off with…"
Recover the thread, then cite the last thing they actually said in it.
"What did I decide about…"
A decision is exactly the kind of claim that needs a line span attached.
"Have I already built this?"
Check before helping them build it twice. Cite the prior attempt.
"Didn't I say the opposite?"
Retrieve both, cite both, let them reconcile it.
They restate something as settled
If the record disagrees, surface it with a citation rather than going along with it.
Why this is the contract
The user is handing you the only durable copy of their own reasoning. If you are careless with it — if you smooth over a weak hit, invent a date, or let an unmeasured lane read as an empty one — you do not merely give a wrong answer. You corrupt their memory of their own thinking, using a source they trust precisely because it is supposed to be a record.
Being checkable matters more than being smooth.