Complete changelog
Stable release · npm
latest
npm install -g titen-memory@0.6.1
Install guide · Release page · npm package
Fixed
-
Webhooks no longer silently drop events written in their own registration millisecond. Eligibility compared
w.created_at < e.created_at, a strict comparison on a millisecond wall-clock string, so on a fast host the registration and the next write shared a millisecond and those events were never queued, never delivered, and never retried. Delivery now pages on theevent_order.seqwatermark that/v1/eventsand federation already use: migration 22 addswebhooks.created_seq, backfilled to the current head so an upgrade delivers only future events rather than replaying history. Both eligibility sites are converted —processWebhooksand the backgrounddeliverPendingselector — because the second one would otherwise leave an organization unwoken until another event arrived. Measured on a 16-core host: the contract file went from 8 of 12 runs failing to 12 of 12 passing. Closes #265. -
Retrieval ranking is now reproducible in the FTS-only lane. Exactly-tied scores previously fell through to
claim_id, a fresh uuid per ingest, so the same corpus ranked differently on every run. Ties now break on the claim statement — content-derived, and compared by code unit so Bun and Workers agree — before falling back to the id. This makes rank reproducible, not better: it picks an arbitrary-but-stable winner among genuine ties. What causes the ties is untouched and stays open as #227. Closes #226. -
Upgrading a pre-0.2.0 store now refuses instead of succeeding into silence. Migration 10 scopes
teamvisibility to a workspace and nothing backfills the column, so a 0.1.x store migrated cleanly and then answered 404 on every claim.migratenow counts legacy team rows first and fails closed, naming the count and the 0.2.0 data floor. Rebinding is deliberately not attempted: a legacy row’s real workspace is unknowable, and inventing one would invent an authorization boundary. Closes #257. -
The logical export refuses a pre-workspace
teamrow rather than writing a backup its own importer rejects.export_importis advertised as enabled, so an artifact that cannot be restored is worse than an error. Closes #258.
Measured, not built
- The reranking stage recorded as strategic debt was measured before being written, and the measurement says do not write it. The oracle ceiling over Titen’s own top-10 is +10.2 points (recall@1 0.880 to 0.982), but every cheap reranking signal tested captured at most 0.6 of those points at p=0.61, and two were significantly worse than no reranking at all. MemPalace, which ships one, scored lower with it than without it in both embedding configurations. The gain is real and lexical signals cannot reach it. Closes #269.
Added
- In-process mode for Bun hosts.
serve()returns the handler it serves, and atiten-memory/bunsubpath exports it, so a benchmark or embedding host can driveTitenClientthrough an injectedfetchwith no loopback hop. The transport is removed; auth, scopes, and response envelopes are unchanged because it is the same handler. An ephemeral socket is still bound and unused, tracked inPONYTAIL-DEBT.md. Closes #230.
Documentation
-
Measured the memory-agent field on an externally authored corpus (LongMemEval-S, MIT) and recorded where Titen actually stands: landscape note.
docs/testing/EVALS.mdnow marks recall@5/@10 as saturated on that corpus so only recall@1 and MRR@10 are quoted as discriminating, andblueprint.mdno longer plans a LoCoMo run — LoCoMo is CC BY-NC 4.0 and a launch is commercial use, which an SPDX check misses because GitHub reports it asNOASSERTION. Closes #267, #270, #271. -
The single-core throughput ceiling is published as an operator sizing rule in VPS deployment and
deploy/README.md: at and above 10,000 claims one client saturates one process, so shard by subject across processes rather than adding clients. Cloudflare records that this is abun:sqliteproperty that does not transfer to per-request isolates. Closes #259. -
docs/testing/EVALS.mdcarries the FTS-only degradation curve, so no FTS-only quality figure is quoted without the corpus size it was measured at. Closes #260. -
The
cross_language:enzero is explained rather than left open: the stratum rotates document language past query language, so it is three language pairs, and English queries never retrieve a non-English document (2,000 of 2,000 top-10 hits). A provider embedding property, not a fixture defect. The fixture is unchanged because its hashes pin the locked holdout and pre-hoc threshold. Closes #245. -
docs/engineering/release.mdstates why the tarball carries no provenance attestation — it requires a supported CI’s OIDC token and this repository publishes by hand on purpose — and gives consumers the registry checks that do work, with what they do not prove. Closes #242. -
One product sentence across the GitHub description, README, and
package.json. Closes #225.