Stable release · npm
latest
npm install -g titen-memory@0.6.1Install guide · Release page · npm package
Fixed
-
Webhooks no longer silently drop events written in their own registration
millisecond. Eligibility comparedw.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 the
event_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 background
deliverPendingselector — 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 toclaim_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 scopesteamvisibility 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 a
titen-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 anddeploy/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 a
bun: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.