Every phase of the work, one paragraph each, with its status. This file changes when a
phase opens or closes, and not in between. The detail of the open phase lives in
plan.md. The design and its reasons live in brief.md.
Rules. One phase is open at a time. A phase closes when every issue it opened is closed, or is listed under Deferred below with a reason. The next phase opens only then. Each phase is one pull request in each repository that it touches, and ends with the verification layer that proves it.
| Phase | Delivers | Status |
|---|---|---|
| 0. Documents and measurements | The public contracts and guarantees files, CONTRIBUTING, the Makefile with the first documentation check, the local container setup, and measurements M1 to M6. | closed 2026-10-05, PR #2 |
| 1. The storage contract, offline | The record, the Store protocol, the in-memory driver, the conformance suite, the frozen surfaces, the ledger test, and CI. |
closed 2026-10-06, PR #5 |
| 2. The Hotdata driver | HotdataStore with four tables, the serialized writer, the three-stage retrieval query, the sweeper, the integration leg against the local stack in CI, and the oracle test. |
closed 2026-10-08, PR #7 |
| 3. The memory contract | Memory with remember, recall, candidates, supersede, forget, profile, and capture, the rendered blocks pinned by tests, and the skill file with its command check. |
closed 2026-10-08, PR #9 |
| 4. The first consumer | A document loader in hotmemory. A post-mortem loader and a recall at investigation start in the consumer's own repository, proven by a replay case. Two pull requests, one in each repository. | open |
| 5. A public benchmark | A LongMemEval-S runner measuring retrieval recall at k first and end-to-end accuracy second, with the numbers in docs/benchmarks.md. |
planned |
| 6. Adapters | A LangGraph BaseStore adapter in hotdata-langchain, then an MCP server. |
planned, out of scope for version 1 |
Nothing yet. An entry here names the issue, the phase it came from, and the reason it is not being taken up now.
A closed phase keeps its row above with the date it closed and the pull request.
- Phase 0 closed on 2026-10-05 with PR #2, which closed issue #1. Its measurements are in
docs/guarantees.md. It changed the plan for later phases in three ways. The local development target is a three-container stack (Postgres, RustFS, and the engine), not a bare container. Fused retrieval needs plain vector indexes and an embedder from the caller, because a provider-backed index excludes every other index. The integration leg can run against the local stack in CI. - Phase 1 closed on 2026-10-06 with PR #5, which closed issue #4. It changed the plan for
later phases in three ways. The record refuses more than the brief said: an empty label,
a label with
/, a key with/or@, and empty content. Deduplication skips a current revision pastforget_after, so a forgotten fact can come back. Two questions moved to phase 3: howsupersedesets fields of the old record, and how a fact gains a source when its content does not change. - Phase 2 closed on 2026-10-08 with PR #7, which closed issue #6. It changed the plan for
later phases in four ways. The engine allows one vector index per table, so the cue
vectors have their own table. The engine refuses an index on an empty table, so
provisionbuilds over a seed row. A filtered search through a vector index misses rows loaded after the build, so the vector rankings filter after their fetch. The defect is reported to the engine team, and it reproduces in production. One process writes to a database until the engine has a conditional write. - Phase 3 closed on 2026-10-08 with PR #9, which closed issue #8. It changed the plan for
later phases in four ways. The vector rankings of
HotdataStorefilter first and rank by a scan, so the vector indexes serve no query until the engine fixes the filtered index search. At 100,000 rows of 64 dimensions, a search in a 1 percent scope took 97 ms locally.putgainedclose_previous, and a put of the same content with a new source writes a merged revision.recallreads current revisions only, so a search over history is still open. A count in the block ofprofileis a lower bound when a sub-namespace fills the window oflist.