Try Tools · Dev
TenseMem: what happened when we tested it
An embedded memory engine for AI agents in one SQLite file. A model (or the built-in rule-based FakeExtractor) turns user messages into typed facts; deterministic rules keep one current value per slot, keep history, flag freshness on every read, and refuse facts without a verbatim user quote.
Score
10.0/10
claims that held up
Verdict
V2 · Works as claimed61
Access needed
L0 Public web onlyTested 2026-10-29
Rule set before testing: overall = worst of core C1–C4, and an untested core claim caps at V1. C1–C4 are all V2, so the verdict is V2. Score = mean of tested claims C1–C6 = 10.0; C7 (V0, non-core) is not counted.
Scope. Tested with the rule-based FakeExtractor only, which understands fixed phrasings. With a real LLM, the engine's rules and quote check still apply, but extraction quality is untested. Only one predicate (lives_in) was exercised in our scenarios. Version 0.1.0, 7 GitHub stars.
Ran all four core promises offline with the no-key extractor: newest value wins with history kept, every read was honest about freshness, fed-back context and a lying extractor stored nothing, and a correction survived rebuild. Real-LLM extraction was not tested.
0 / 20
stale reads marked current
20/20 correct after wait
0
facts from echo or fake quote
2 attacks blocked
1.00 / 0.00
TenseBench accuracy / stale leak
101 scenarios, reproduced
V0
real-LLM extraction
not tested
Claim by claim
One current value per slot, history keptWorks
5/5 checks: Pune current, Delhi and Bangalore superseded, hedge ignored, no leak between users.
Every read reports freshness honestlyWorks
0 stale reads marked current in 20 rounds; 20/20 current and correct after wait=2 s.
No self-echo: fenced context and quote checkWorks
Fed-back context stored 0 facts, and an extractor's invented quote was rejected.
Corrections survive rebuild()Works
Delhi stayed current after correct() and after reopen + rebuild with a new extractor instance (same rules, not a newer model).
TenseBench 1.00 / 0.00 / 1.00 / 0.00 (non-core)Works
Reproduced exactly. The bench and FakeExtractor come from the same vendor, so this shows reproducibility, not real-world accuracy.
One SQLite file, no infrastructure (non-core)Works
0 network events, works with no network, only t.db on disk.
Extraction quality with a real LLM (non-core)Not testable
Not tested: no model key used today.
Open a claim to see what we measured.
The full report
Full result
The engine does what the README says. With the no-key extractor, the newest fact replaced the old one and history kept the rest, every read was honest about whether it was up to date, recycled context and an invented quote were both refused, and a correction survived a rebuild. Everything ran offline in one SQLite file, and the vendor benchmark reproduced exactly. What we did not test is how well a real LLM turns messy chat into facts.
The test task and exact input
Fixed before running (plan committed 09:04 UTC+8, commit c9ab6ba). With FakeExtractor and a fresh SQLite file per scenario: (C1) Delhi → Bangalore → a hedged 'Maybe I will move to Mumbai' → Pune for one user, Paris for another; expected current Pune, Delhi and Bangalore superseded, no Mumbai, no cross-user leak. (C2) 20 rounds of 'I moved to City<i>', reading right away and after wait=2 s; any read that claims is_current while missing the newest city is a lie. (C3) Feed a user's fenced context() back in as a new user's message, and script the extractor to invent 'I live in Tokyo' for 'Hello there'; nothing may be stored. (C4) correct() the Bangalore fact, then reopen and rebuild(); Delhi must stay current. Then tensemem bench, and the whole script again with no network.
python3 -m venv venv && venv/bin/pip install tensemem==0.1.0 venv/bin/python run.py # scenarios C1–C4 + network audit hook unshare -rn venv/bin/python run.py # same, no network tensemem bench
What happened, step by step8 steps
- Captured README, PyPI and repo metadata; wrote claims, scenarios, ground truth and pass marks; committed before running (09:04, c9ab6ba)
Observed: Apache-2.0, 7 stars, last push 2026-10-25; 0.1.0 on PyPI since 2026-10-21. - First run without register_predicate("lives_in")
Observed: Every extract job finished DONE but 0 facts were stored, with no error and is_current True. The README quickstart registers the predicate; after adding that line, everything below ran. - C1: four messages for u1 (incl. a hedge), one for u2; state() and history()
Observed: u1 current = Pune; history Delhi SUPERSEDED, Bangalore SUPERSEDED, Pune ACTIVE; no Mumbai; u2 = Paris and u1 untouched. 5/5. - C2: 20 rounds of add() then context(min_seq, wait=0), state(), and context(min_seq, wait=2.0)
Observed: Immediate context reads said pending=1, is_current False in 20/20 rounds; 0 reads claimed current while stale. After the wait, 20/20 were current and named the newest city. - C3: fed u1's fenced <tensemem-context> block back as u3's message; scripted extractor proposed lives_in=Tokyo quoting 'I live in Tokyo' for 'Hello there'
Observed: u3 got 0 facts; the invented Tokyo fact was rejected (0 facts for that user). - C4: correct(Bangalore), close, reopen with a new extractor, rebuild(wait=True)
Observed: Delhi current right after the correction and still after rebuild; Bangalore not ACTIVE. - C6: repeated the whole script inside unshare -rn with a socket audit hook
Observed: Identical results; 0 connect/DNS events in either run; each scenario folder held only t.db. - C5: tensemem bench
Observed: 101 scenarios in ~20 s: 1.000 (95/95) current state, 0.000 (0/53) stale leak, 1.000 (6/6) freshness honesty, 0.000 (0/8) contamination; baselines 0.368 / 1.000 / 0.000.
Failure modes seen2 items
- If you forget register_predicate("lives_in") (or another predicate), facts for it are dropped silently: jobs finish DONE, no error, and reads say is_current. Register every predicate first, as the quickstart does.
- FakeExtractor only matches fixed English phrasings (e.g. 'I moved to X', 'I'm vegetarian'); for real chats you need an LLM extractor and your own model access.
Evidence files7 files
Vendor claims, as quoted
- "One current truth per ONE slot. A new city supersedes the old one. History still answers 'where did I live before?'" (source)
- "Every read reports freshness. as_of_seq, pending, is_current. Wait for a message, or see that it is not applied yet." (source)
- "No self-echo. Recalled context() is fenced. Extract needs a verbatim quote from the user." (source)
- "Corrections stick. correct() restores the displaced value and survives rebuild() with a newer model." (source)
- "tensemem bench scores the packaged 101 conversations with FakeExtractor (no network)": 1.00 / 0.00 / 1.00 / 0.00 (source)
- "No infrastructure. Default store is one SQLite file inside your process." (source)
Lowest-access way to try it
L0: pip install tensemem, then Memory(llm=FakeExtractor()), register_predicate("lives_in"), add(), context(min_seq=..., wait=1.5). For real chats, pick an LLM extractor (pip install 'tensemem[openai]' etc.) with your own key.
Details: vendor, pricing, environment, time, cost
Not sponsored. No affiliate links. Vendors do not see results before they are published.
How to cite
TriedAgents, "TenseMem: tool test", works as claimed, tested 2026-10-29, https://triedagents.com/tools/tensemem/
Get one re-run case every weekday
One agent use case we actually re-ran, every weekday. Free.
We only store your email address. Every issue has a one-click unsubscribe link. Privacy