Skip to content

Releases: aspotton/infinitum

v0.6.3 — Store-quality loop and tuned defaults

Choose a tag to compare

@aspotton aspotton released this 25 Oct 13:45
65b5d3e
  • 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

Choose a tag to compare

@aspotton aspotton released this 12 Oct 21:12
cd0e416
  • 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 --candidates flag 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

Choose a tag to compare

@aspotton aspotton released this 11 Oct 19:41
cd2490e
  • 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

Choose a tag to compare

@aspotton aspotton released this 27 Sep 18:59
bb6b782
  • 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

Choose a tag to compare

@aspotton aspotton released this 19 Sep 20:50
51b8173
  • 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

Choose a tag to compare

@aspotton aspotton released this 17 Sep 02:33
134fa32
  • 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-refine golden scenario locks the route in; the subtle-supersession scripted replacement turn now marks itself an explicit correction.

v0.5.1 — delegated outcomes now reach memory

Choose a tag to compare

@aspotton aspotton released this 16 Sep 18:24
a0bbe27
  • 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

Choose a tag to compare

@aspotton aspotton released this 15 Sep 23:50
ef9e023
  • Sub-session learning gate: requests carrying a parent-session marker (X-Infinitum-Parent-Session-ID or the bare x-parent-session-id alias) no longer enqueue learning jobs by default, so delegated sub-agent scaffolding stops diluting the memory store. Controlled by learning.skip_subsessions (default true); events and retrieval are unaffected.
  • Header precedence for the gate: explicit X-Infinitum-Learning: off beats explicit on, 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 latest image tag and documents how to pin a specific release tag.

v0.4.0 — Docker release images, cursor pagination, temporal memory views

Choose a tag to compare

@aspotton aspotton released this 12 Sep 17:33
97f6e5e
  • 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, and GET /topics now paginate by cursor via the opaque X-Next-Cursor response header; offset now returns HTTP 400 instead of being silently ignored, and listing order is total (updated_at DESC plus an id/topic tiebreaker) so pages stay stable and disjoint.
  • The current temporal 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 the current view while drill-down memory tools and the learner still search with all.
  • 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

Choose a tag to compare

@aspotton aspotton released this 10 Sep 22:54
63adb33

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, and observed_at columns, 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 or as_of values 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_count is now a cached counter derived from these rows. GET /memory/{id} gained an observations array. Memories that predate the ledger are backfilled once at startup with weight-0.5 legacy rows 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_type and 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_runtime Python namespace and the context-runtime command alias; the infinitum package and CLI are now the only entry points.
  • The CONTEXT_RUNTIME_CONFIG environment variable; INFINITUM_CONFIG is the only config-file override.
  • The pre-0.2 x-context-* request-context, control, and session header aliases; canonical X-Infinitum-* headers and the OpenCode/Headroom/LiteLLM integration aliases are unchanged, and a leftover x-context-* header from an old client now passes through to the upstream like any other header.
  • Automatic reuse of an ./context-runtime.db file under a default configuration; such installs now start on a fresh infinitum.db, and an older database must be named explicitly via memory.database_path, where in-place schema migration still applies.
  • The migration guide that shipped with the rename.