Skip to content

Limitations

What this library does not do. Stated up front, because a project about auditability that overstates itself has failed on its own terms.

Deletion does not erase

Deletion is a tombstone. Content is excluded from every read path but stays in the append-only log and remains retrievable with get(). If you need bytes gone from disk, see the strategies in retention and deletion.

retain_until does nothing yet

The field is recorded on messages and documents; no component reads it. Expired events remain visible and searchable. Sweep it yourself, or do not rely on it.

The log is not tamper-evident

Events are totally ordered by seq, but the log is not hash-chained and not signed. Anyone who can write to the database file can rewrite history without leaving evidence. The guarantees are against accidental mutation and application-level overwrites, not against a motivated operator. Hash chaining is a plausible extension and is not implemented.

No encryption at rest

The database is plain content in a local directory. Protect it with file permissions and disk encryption at the deployment level.

Retrieval is keyword overlap

search() scores lowercase word-overlap between the query and each item. It has no notion of synonyms, morphology, or meaning: a query for "pumps" will not match "pump". This is a deliberate choice. It is deterministic and explainable, which suits an audit trail, and embeddings can be layered on later. It is not a competitive retrieval system.

Replay covers the memory, not the model

The same log always produces the same state and therefore the same context. What a language model does with that context is not reproducible, and nothing here makes it so.

Single process, single writer

The store assigns seq from an in-process counter initialized at open. Two Memory objects writing to one database concurrently will collide. Treat it as one writer at a time.

Reads scale linearly

replay() folds the entire log on every call, and search() scans all visible content. Both are O(n) in log length. This is fine at the scale the demo targets and will not stay fine at millions of events; there is no incremental snapshot or index yet.

The demo is a demo

demo/app.py simulates group members with no authentication, so anyone using it can act as anyone and delete anything. Document parsing is deliberately shallow: text and markdown are read raw, CSV and XLSX go through pandas' string rendering, PDFs through pypdf text extraction, with no table structure or layout understanding. And the model call goes to OpenRouter, so recalled text leaves the machine.

Out of scope for now

Document understanding, vector search, multi-user synchronization and authorization, learned retrieval policies, and a graph-structured episodic model. These belong to the wider HumemAI roadmap rather than to this component.