Repository navigation
Releases: aspotton/infinitum
Releases · aspotton/infinitum
Release list
v0.6.3 — Store-quality loop and tuned defaults
- Minimal setup is now just the upstream block: every other setting ships with a working tuned default, with a full key-by-key table in the configuration docs.
- Read-only drill-down memory tools are exposed on memory-enabled requests out of the box; set the toggle to false to restore tool-free behavior on strict upstreams.
- Background learning defers while the upstream is busy, with a short idle grace, so deferred learning no longer competes with foreground traffic.
- Episodic discipline: near-verbatim episodic re-proposes are skipped deterministically, and stale never-reinforced episodic memories retire themselves on a bounded periodic pass (raw events untouched, topic summaries rebuilt).
- Consolidation gating fixed: the churn floor now gates the enqueue itself and checkpoints advance only on executed passes, so sub-floor churn accumulates toward a real pass instead of being discarded.
- New read-only GET /status: health plus store shape, durable-queue state, 7-day consolidation activity, and the episodic skip-guard counter.
- Long-lived databases: free pages left by the earlier event-compression migration can be reclaimed with a one-time manual VACUUM (never invoked by product code).
v0.6.2 — shortlist retrieval, self-healing embeddings, sharper memory
- Memory retrieval shortlists instead of reading the whole store. Above
memory.full_scan_threshold(default 500 active memories) each search scores a provably-complete candidate shortlist; smaller stores keep byte-identical full-scan behavior, a shortlist that cannot narrow retreats to the full scan with a loud warning, and results, gates, weights, and ranking are unchanged. - Active memories missing an embedding vector heal themselves at startup via a model-scoped, bounded, non-blocking backfill, so enabling embeddings or changing models never leaves part of the store invisible to semantic search.
- The offline corpus runner gained a
--candidatesflag so the evaluation gate exercises both retrieval modes. - A retrieval pass that reads its 5,000-row ceiling now logs a warning instead of truncating silently.
- Extraction is more selective about procedures: generic how-to answers are no longer memorized; a procedure is remembered only when it describes the user's own project, environment, or decisions.
v0.6.1 — Topic discipline: repeated facts converge onto one topic
- Topic canonicalization: repeated facts now converge onto one topic instead of sprouting lexical variants; candidates snap to an existing topic at high slug similarity, with a hard veto so slugs carrying different dates are never treated as the same topic.
- The extraction prompt shows the current active-topic list so models reuse canonical topic names instead of inventing near-duplicates.
- Supersede/refine proposals naming a shown, active, type-equal, topic-equivalent memory resolve to a refine of that memory instead of a duplicate-plus-supersede pair.
- A one-time, idempotent startup backfill clusters and renames accumulated topic variants inside a single transaction, keeping the search index, queued jobs, and consolidation checkpoints consistent; no manual migration or configuration needed, and later boots are zero-write no-ops.
- The benchmarks corpus gained a topic-discipline scenario locking the behavior into the evaluation gate. (#54)
v0.6.0 — Periodic deep consolidation
- Periodic deep consolidation ships as an opt-in third memory-maintenance timescale: a background sweep detects duplicated memories within large topics and merges them, off by default and gated on learning being enabled with a configured learning model.
- Each consolidation pass clusters a bounded working set deterministically and makes a single bounded model proposal; deterministic code owns every mutation, applied only through the same guarded reinforce/supersede primitives the per-turn learner already trusts.
- A per-topic checkpoint is stamped after mutations, so consolidation's own writes never count as churn for the next window; oversized topics advance through explicit continuation passes that bypass only the churn floor.
- Every pass records a consolidation.pass audit event; contradictions surface as inert consolidation.conflict events that nothing auto-resolves, and affected topic summaries rebuild through the existing dirty-marking path.
- Consolidation is implemented at topic-level depth; cross-topic and corpus-wide passes remain deferred.
v0.5.3 — transparent event compression + done-jobs retention
- Event content over 2048 characters is now stored lzma-compressed transparently, with byte-for-byte identical reads and roughly a third of the stored audit size; new events compress at write time and existing rows migrate in bounded, idempotent background batches at startup without blocking serving.
- Finished background queue rows older than 7 days are swept at startup; pending, running, and failed jobs are untouched.
- A corrupt stored blob fails loud rather than serving truncated audit data; large stores reclaim file space with one manual VACUUM (no automatic VACUUM).
- Stores that have run compression should not be reopened by a pre-compression build; re-upgrading restores full reads.
v0.5.2 — elaborations refine memory instead of replacing it
- Background learning now refines instead of replaces when a later turn merely elaborates an existing memory: same memory id, growing observation chain, untouched validity window, zero rows superseded (issue #34).
- The extraction prompt proposes an unmarked supersede for non-contradictory elaborations so the deterministic refine route applies the detail in place; explicit corrections keep the existing supersede behavior.
- Declined refine cases fall through to the prior create-plus-supersede path unchanged; the refine primitive is idempotent under replay.
- Dev corpus: new
elaboration-refinegolden scenario locks the route in; thesubtle-supersessionscripted replacement turn now marks itself an explicit correction.
v0.5.1 — delegated outcomes now reach memory
- Learn payloads can carry a capped rendering of the current turn's tool results (1200 characters per message, 4000 total), so outcomes reported by delegated sub-agents are learned once from the parent session.
- The extraction prompt gains a matching TOOL RESULTS section only when tool results are present; tool-less requests keep byte-identical payloads and prompts.
- Sub-agent session traffic itself remains gated off by learning.skip_subsessions; no config or schema changes.
v0.5.0 — sub-session learning gate
- Sub-session learning gate: requests carrying a parent-session marker (
X-Infinitum-Parent-Session-IDor the barex-parent-session-idalias) no longer enqueue learning jobs by default, so delegated sub-agent scaffolding stops diluting the memory store. Controlled bylearning.skip_subsessions(defaulttrue); events and retrieval are unaffected. - Header precedence for the gate: explicit
X-Infinitum-Learning: offbeats expliciton, which beats the sub-session skip, which beats default learning; marker headers are stripped before upstream forwarding like the other runtime control headers. - Docker documentation now defaults to the
latestimage tag and documents how to pin a specific release tag.
v0.4.0 — Docker release images, cursor pagination, temporal memory views
- Docker image for bind-mounted operation: all state (config file, database directory) lives as operator-owned files on the host, nothing in the image; setup guide in
docs/DOCKER.md. - Multi-arch release images (linux/amd64 and linux/arm64) published to GHCR automatically when a GitHub release is published.
- The CLI now exits with a single clear line instead of a traceback when the config file is missing or the database directory is missing or not writable.
GET /memory,GET /events, andGET /topicsnow paginate by cursor via the opaqueX-Next-Cursorresponse header;offsetnow returns HTTP 400 instead of being silently ignored, and listing order is total (updated_at DESCplus an id/topic tiebreaker) so pages stay stable and disjoint.- The
currenttemporal search view now demotes naturally-expired facts (score x0.70, applied after the relevance gates) rather than hiding them, and the injected-context retrieval path compiles with thecurrentview while drill-down memory tools and the learner still search withall. - Graceful shutdown now cancels a wedged background learning job after a 5-second grace, bounding Ctrl-C latency independently of
learning.timeout_seconds.
v0.3.0 — Phase 1 evaluation loop, temporal memory views, evidence ledger
Added:
- A dev-only evaluation harness in
benchmarks/: golden conversation scenarios declared as YAML, a deterministic offline runner with a scripted extractor, extraction/retrieval precision-recall and context-token metrics, a pytest corpus gate that runs every scenario on each check, and a live-replay command that replays the same corpus against a running instance and prints the memories learned per turn. No client-facing behavior changes. - Additive temporal metadata on memories: nullable
valid_from,valid_until, andobserved_atcolumns, migrated in place. Superseding a memory now closes the superseded memory's validity window at that moment instead of rewriting history. - Temporal search views on
POST /memory/search:temporal_view: "current"(default; facts whose validity window has passed are dropped),"all"(no temporal filtering), and"as_of"with an ISO date or datetime (facts whose window covers that moment). Invalid view oras_ofvalues return HTTP 400. The injected-context retrieval path keeps its prior all-rows behavior unchanged. - A first-class evidence ledger: every memory create and reinforcement records an observation row with an idempotency fingerprint, so retried or replayed evidence writes zero duplicates and cannot inflate
observation_count;observation_countis now a cached counter derived from these rows.GET /memory/{id}gained anobservationsarray. Memories that predate the ledger are backfilled once at startup with weight-0.5legacyrows derived from their source events.
Fixed:
- Explicit corrections may now supersede across topic drift: a supersede proposal the extractor marked as an explicit correction was previously dropped in silence whenever its topic string differed from the target memory's. The topic gate now applies to implicit supersede only, which still requires an exact topic match plus similarity at or above the floor; the shown-set and active-status checks gate every supersede.
- The extraction prompt now tells the model to copy the superseded memory's
memory_typeand topic exactly when superseding — reducing the drift that caused dropped corrections — and excludes facts the user marks as temporary or today-only. - Supersede skips are logged at debug level with the failing check, so dropped corrections are traceable without code changes.
Removed:
- The pre-0.2
context_runtimePython namespace and thecontext-runtimecommand alias; theinfinitumpackage and CLI are now the only entry points. - The
CONTEXT_RUNTIME_CONFIGenvironment variable;INFINITUM_CONFIGis the only config-file override. - The pre-0.2
x-context-*request-context, control, and session header aliases; canonicalX-Infinitum-*headers and the OpenCode/Headroom/LiteLLM integration aliases are unchanged, and a leftoverx-context-*header from an old client now passes through to the upstream like any other header. - Automatic reuse of an
./context-runtime.dbfile under a default configuration; such installs now start on a freshinfinitum.db, and an older database must be named explicitly viamemory.database_path, where in-place schema migration still applies. - The migration guide that shipped with the rename.