v1.3.0 — a gist stays a gist, and both channels count
A gist is what recall returns and what a proactive push delivers, but nothing on the write path kept one short. Gists grew into walls of text, and a push — which truncates — delivered them as a headline cut mid-sentence. This release fixes that where memories are written, and teaches the usefulness measurement to see the half of memory use it had been blind to.
Gists stay gists
- A gist over 400 characters is split at the last sentence or paragraph boundary at or before the limit, and the overflow moves into
detail. Nothing is lost. Enforced in the store itself, so every writer — CLI, MCP, hooks, importers — inherits it. - The limit is measured, not chosen: across a corpus of real sessions, the rate at which a memory is referenced downstream peaks in the 301–400 band and falls away above it.
gist-backfillbrings gists written before the ceiling into line with it. Dry-run unless--apply; superseded rows are never touched, so history is not rewritten. Re-embedding the changed rows is part of the operation and most of its value — a memory's first vector chunk is its name and gist together, so an oversized gist embedded as one blurred vector.
Both channels count
A memory reaches the model two ways: FornixDB pushes it, or the agent goes and gets it. Only the first was measured, so the honesty layer answered "did memory help?" from the more expensive and less-referenced of the two.
- The usefulness scan and
valuenow measure the pull channel beside the pushed ones, and report what a downstream reference cost on each channel — the like-for-like comparison between paying up front and paying on demand. - Pulls are detected by the shape of a result rather than by parsing the command that produced it, so a write is never counted as a read.
- Note when comparing with earlier figures: a citation is credited to whichever delivery preceded it, so a pull of an already-pushed memory takes the credit, and the referenced-push rate reads slightly lower than it did when pulls were invisible.
Also
meta-gccollects per-session bookkeeping keys from sessions that ended long ago, and runs when a dream pass opens. A key whose session has no recorded row belongs to a session still running, and is never collected.--since-daysonfield-statsandfloor-stats. Without a window, both average across every configuration a store has ever run under — which is how a closed trial's readings go on being counted after the dial that produced them is switched off.recallandtimelineon the CLI default to a 4,000-character output budget, matching the MCP tools.--max-chars 0restores unlimited output.- Fixed:
doctorno longer reports config keys that are read through a named constant or built per session from a prefix — every warning it raised on a lived-in store was one of these. - Fixed: use-credit and the floor outcome join are restricted to memories that were actually pushed, so a pulled-only memory cannot have credit an earlier push earned written back to zero.
1049 tests + 1 skip.
Install: pip install "git+https://github.com/itdtllc/fornixdb@v1.3.0"