Engineering notes · 8 min read · Sources checked October 5, 2026
Monday’s message schedules a review for Thursday at 2 p.m. on the second floor. Wednesday’s update moves it to Bamboo on the third floor and keeps the time. On Thursday, you need to reply: where is the review? Which message should the assistant use?
A note that says ‘second-floor review’ can bring an old arrangement into the next task. HaroCue keeps the original text, links reusable memories to it, and checks whether a memory still applies. We’ll follow this synthetic meeting example through the design; it is not a real user record or an output from our experiment.
We also ran a small experiment: three real MiMo cloud-model requests with synthetic evidence, two extraction batches accepted, one consolidation proposal rejected. This establishes the admission outcomes of those requests, not long-term memory quality. To understand why a model output can be rejected, start with how a memory is written.
Keep the message that changed the plan
We call the original text evidence, and a reusable statement drawn from it a memory entry, or claim. The original meeting notice says ‘Thursday at 2 p.m., second floor.’ The room-update message says ‘Move to Bamboo on the third floor; keep the time.’ Keeping both messages lets a person check the source of both the old room and the updated room. The memory service is the HaroCue code that checks and stores these records. The model submits proposals to it.
Both original text and memory entries live in local SQLite. Evidence retains its source, observation time and citation spans. An entry cites that evidence and records validity times and relationships to other entries. Lexical and graph indexes help find the records, leaving the original available for review when memories are reorganized.
Where do originals, entries and indexes live?
Keep the evidence
- Authorized inputsApp observation / explicit input
- Original evidenceText, source, citation spans
- Local SQLiteEvidence, entries, time, relations
Admit a write
- Model · cloud boundaryAuthorized excerpts → proposal
- Memory service · writeCheck proposals; commit entries
Recheck a read
- Lookup indexesLexical / scoped graph
- Memory service · readRead applicable entries
- Current taskCue / Assistant / source view
Dashed: optional vector search, off by default; shared wiring is unreleased.
Simplified concept map: rechecks query authoritative records in SQLite; indexes only discover candidates.
Read the diagram in text
Authorized inputs form evidence stored in SQLite. Bounded excerpts go to the configured model; the memory service checks proposals and stores entries. Lexical and graph indexes discover records; the service reads applicable entries for Cue and Assistant. Dashed paths show unreleased shared local embedding wiring.
The audited inputs are authorized application observations and explicit user input. If extraction uses a cloud model, original text within the authorized ranges goes to that configured model. Local storage does not make extraction offline.
When can a proposal become a stored entry?
Given the room-update message, the model can propose a new memory: ‘The review moved to Bamboo on the third floor,’ citing the relevant passage. The memory service checks that the passage belongs to evidence authorized for this request. An out-of-bounds citation is rejected. The service assigns scope and record identities; source text is read as data.
A revision check handles another rejection case. If the evidence or expected state changes while the model generates a proposal, a stale snapshot cannot simply become the latest memory. The write commits only while the expected revision still matches. These checks establish a valid source trail; whether the statement interprets that source correctly still needs review.
What happens to one proposal?
Write the change
- 1 · Read the room updatePropose: Bamboo, floor 3
- 2 · Check citation and revisionOut of bounds / stale → reject
- 3 · Commit only if matchedKeep the room update as source
- 4 · Record the write outcomeAdmitted proposal; review its content
Recall the room
- 1 · Where is the review?Thursday’s current reply
- 2 · Find and rank candidatesFind the old plan and room update
- 3 · Check current recordsOld room / no support / conflict → exclude
- 4 · If the new room appliesBamboo, floor 3 + room update
Illustrative path, not a completed automatic-update test on these meeting messages.
Read the diagram in text
Write walkthrough: the model reads the authorized room-update message and proposes ‘The review moved to Bamboo on the third floor.’ The service checks citations and revisions, rejects invalid proposals, commits only if the revision matches and records the outcome. Read walkthrough: a Thursday room query finds meeting arrangements. After the change is confirmed, the old second-floor arrangement, unsupported memories and unresolved conflicts are excluded. If the new room still applies, the reply returns Bamboo on the third floor and the room-update message for the user to check.
The diagram assumes that the proposal is accepted, its transition relation is confirmed and its source remains available. A write receipt records what the service admitted, rather than certifying the meeting arrangement.
On Thursday, exclude the old room before answering
Lexical search matches specific terms such as ‘review’ and ‘Bamboo’; graph search adds entity connections. After the results are fused and ranked, the service checks the current records. Once the room change is confirmed, ‘second-floor review’ is the old arrangement and is excluded from a current reply even if retrieved. ‘Bamboo on the third floor’ needs support from the available room-update message before Cue can use it and show the source.
Time changes that decision. Seeing an update on Wednesday does not make the meeting take place on Wednesday. Observation, recording and validity times are separate; unknown validity stays unknown. If two updates name different rooms and the conflict is unresolved, a higher retrieval score is insufficient to use one as a certain answer.
The current default uses lexical and scoped graph candidates. Optional vector retrieval requires an explicitly configured local embedding service and is off by default. New wiring shared by the product UI, Assistant and Cue remains a development candidate; real retrieval quality and latency are still untested.
A changed room, a misread room and a forgotten room
If the source says third floor but the entry says second, the interpretation needs correction. If Monday really meant second floor and Wednesday moved the meeting to Bamboo, the world changed. The first uses a correction relation; the second preserves a transition and its timing. Users can inspect the source excerpt, application and times before deciding how to correct it.
Forgetting handles withdrawal: once evidence or an entry is removed, dependent memories must stop being used. Installed single-entry forgetting can also clear overlapping entries. A development candidate preserves other independently supported entries from shared evidence and suppresses re-extraction of forgotten content. That change is not publicly released.
How does a memory leave current use?
- Misread sourceSource: floor 3; memory: floor 2
- Correct the wrong roomKeep the correction relation
- Room changed laterRoom update: move to Bamboo
- Use Bamboo nowKeep the old room in history
- Forget the new roomForget the room or delete its source
- 10.7 single-entry forgettingOverlapping entries may also clear
Solid: audited 10.7 paths. Dashed: unreleased precise-forgetting candidate.
Read the diagram in text
The same review can involve correction, a later change or withdrawal. Correct the wrong memory if the source says third floor but the memory says second. After a later room change, use Bamboo on the third floor and retain the old room in history. Forgetting the new-room memory or deleting the room-update message handles dependent memories. Installed 10.7 behavior can also clear overlapping entries. Candidate precise forgetting would preserve the meeting time when it has an independent source, and suppress re-extraction of the forgotten room memory. The candidate is unreleased.
Historical inspection also obeys source deletion and forgetting state. Stopping use and clearing records does not promise immediate erasure of old in-memory copies, database pages or external backups.
What two acceptances and one rejection tell us
What we tried
The small experiment used synthetic evidence for three real MiMo cloud-model requests: two extractions and one consolidation. It checked whether model proposals passed the memory service’s admission process, rather than testing long-term use.
What we observed
Both extraction batches were admitted; consolidation was rejected. The rejected response body was not retained, so we cannot identify its faulty field. Retained extraction output was later replayed offline to validate the mixed Chinese/ASCII UTF-8 lexical repair, without embeddings.
What remains
Revised extraction and consolidation prompts have not had a fresh real-model retest. Tests still need expired, conflicting and forgotten evidence to check both useful returns and required exclusions. Local embedding quality and latency need separate measurement. The 10.8 candidate has built and passed an isolated upgrade/startup check; those checks establish build and startup behavior, not memory quality.
Experiment note: the three requests totaled 10,898 tokens. Vendor benchmarks and differing protocols are not used as a speed or quality ranking here.
What changes when the memory object changes?
Systems can choose different objects to carry information into the next task. Mem0, Graphiti and Letta represent three publicly implemented routes. Here we compare their organization; configuration, migration and deployment details are in the notes below.
Mem0: reusable facts for an application
Mem0 extracts messages into independent facts. Its new 2026 automatic extraction adds records so facts before and after a change can coexist, with retrieval finding what is needed; explicit update and delete remain available. Applications can retrieve these facts in later requests. HaroCue also retains the original spans cited by each entry for the person writing a reply to inspect.
Graphiti: change in a relationship graph
Graphiti builds entities and fact edges from episodes, using bi-temporal modeling to distinguish when a fact holds from when the system learned it. This organization fits changing people, projects and relationships, with graph databases and model pipelines to operate. It preserves provenance and treats history and invalidation as core concerns.
Letta: memory files maintained by an agent
Letta MemFS uses Git-backed Markdown: core notes stay in context, while other directories are read on demand. Agents can read and edit files directly, with inspectable changes. File history records edits; applications needing original support for each statement must also design that support. HaroCue puts citations and state relations into its memory records.
What objects do peer systems organize?
- HaroCue
- Original evidenceEntries and citationsTime and entry relations
- Mem0
- Independent fact recordsFacts before and after changeEntity links
- Graphiti
- Episodes · provenanceEntitiesBi-temporal fact edges
- Letta · MemFS
- Git-backed MarkdownCore notes in contextOn-demand directories
Official sources and configuration notes
Read the diagram in text
HaroCue organizes original evidence, entries and relations. Mem0 organizes independent facts and entity links. Graphiti organizes episodes, entities and bi-temporal fact edges. Letta MemFS organizes Git-backed Markdown, core notes and on-demand directories. Objects are shown alongside one another, not as a write pipeline or quality ranking.
What to record in the next round
First, retain complete model outputs and rerun the revised extraction and consolidation prompts, recording why proposals are admitted or rejected. Then use one synthetic set to test recall after changes, conflicts, expiry and forgetting: Bamboo should return when applicable, and the old second floor should stay out of current replies. Record optional embedding quality and timing separately. Public release of the new backend still requires installation and upgrade acceptance.
Sources and version notes
Versions and input scope
The current user installation is 0.2.18 / 2026.10.7, using the prior backend with evidence/entry separation, time, lexical and graph retrieval, source inspection and correction. 0.2.19 / 2026.10.8 is an unreleased candidate that has built and passed an isolated upgrade/startup check. Users have not thereby installed it, and model quality has not been accepted. Check Downloads for public availability.
New attribution, precise single-entry forgetting, shared optional semantics and the UTF-8 repair are development-candidate work. Attribution distinguishes authors, drafts, sent text, quotations and explicit user submission, retaining unknown identity when support is insufficient. Precise forgetting preserves other independently supported entries from shared evidence and suppresses re-extraction. Vectors require explicit local embedding configuration and are off by default.
The audited inputs are authorized application observations and explicit user input, with service-defined bounds. Document or conversation types in the model do not establish every third-party importer. Cloud extraction sends authorized evidence ranges; forgetting propagation and backup maintenance have their own bounds.
Public downloads and installation requirementsPeer systems: configuration, migration and deployment
Mem0’s April 2026 algorithm uses single-pass ADD-only extraction; older two-pass ADD/UPDATE/DELETE reconciliation belongs to earlier versions. Explicit update/delete remain. Semantic, keyword and entity signals depend on configuration and edition; current OSS keyword/entity boosts operate on semantic candidates, rather than inheriting all Platform retrieval behavior. OSS v3 removes graph-store integration; Graph Memory belongs to managed Platform. The Platform History API exposes inputs, old/new values and events.
Graphiti search combines semantic, full-text and graph routes, with optional central-node distance reranking. The open-source framework is evaluated separately from managed Zep. Current Letta development is in Letta Code; the V1 API server is retired. MemFS has no default semantic/vector index, with an optional search mod. All three support forms of local operation or self-hosting; operations and user controls depend on the deployment. Sources were checked on October 5, 2026.
Engineering references
Related engineering discussions cover exact-term retrieval, selecting material for finite context, positive and negative agent tests, and records for cross-session work. These links support design discussion, rather than transferring vendor evaluation results.
