Glossary

July 9, 2026 · View on GitHub

Helixir's working vocabulary — the terms used across the README, the engineering docs (helixir/doc/), commit messages, and the memories the system keeps about itself. Each entry says what the term means here, and where the concept lives in the code. Alphabetical within sections.


Core ideas

Elder brain. The design metaphor for the whole system: a memory that never forgets, accumulates the experience of many agents, and sees connections none of them saw individually. Practical consequences: no delete tool (supersede + history instead), chains valued over single facts, and a generative layer (the Moirai) that proposes new connections.

Atomization. add_memory never stores your paragraph as-is. The LLM extractor splits input into atomic facts — one claim per memory — each classified by ontology type and linked to entities. Chains and dedup only work on atoms; a blob memory is a dead end. (src/llm/extractor.rs)

The writer pays, the reader flies. The cost asymmetry principle. All LLM work (extraction, dedup decisions, relation inference) happens at write time; the read path is pure math over precomputed structure — zero LLM calls, ~15–30 ms warm. This is why a fully local setup is practical.

Dogfooding. The maintainers (human and agents) use Helixir as their own long-term memory while building it. The project's decisions, gotchas and vision are stored in the project, under user_id=claude (the working agent) and user_id=helixir (the system's manual about itself). If it doesn't work for us, it doesn't ship.

Self-documentation. The extension of dogfooding to docs: the operating manual, integration recipes and this glossary are seeded into Helixir's own graph (user_id=helixir), so any connected agent can ask the memory how to use the memory. (src/toolkit/tooling_manager/seeds.rs)

Memory charter. A human-editable constitution (helixir/memory-charter.md) of rules the write path may never override — chiefly: destructive or conflicting writes are never resolved silently. Violations come back as needs_clarification questions for the human.

Anti-gaslight. Shorthand for the charter's core promise: the memory does not silently rewrite what its owner knows. A reversed preference, a contradicting fact, a paraphrase with different numbers — all escalate instead of overwriting. (The NLI judge blocking divergent-number merges is the anti-gaslight backstop on the merge path.)

Modes & the hive

Solo / Collective / Insights. The three privilege tiers (HELIXIR_MODE). Solo: private, no cross-user visibility. Collective: shared graph — cross-user dedup, consensus counting, list_users, swarm_status. Insights: collective + the generative Moirai layer. Higher tiers strictly add capabilities.

Hive memory. The collective-tier behaviour: one fact, many knowers. When N agents state the same fact, it stays ONE memory node whose user_count grows — consensus is a property of the node, not N copies. Contradictions across agents are scored and surfaced, never merged away.

Consensus / user_count. The per-memory counter of independent knowers, derived from HAS_MEMORY edges (idempotent per user — re-adding doesn't inflate it). Ranking treats it as a consensus signal.

Rendezvous. Agents discovering each other through the database itself, with no side channel: add_memory(agent_id=...) auto-heartbeats the agent's presence (host, status, last-seen), and swarm_status returns the live roster. (#39; heartbeatAgent in schema/queries.hx)

Heartbeat. The presence stamp behind rendezvous: register_or_heartbeat upserts an Agent node with last_seen, host and status. Fired implicitly by writes that carry agent_id.

Confirm-or-promise. The add_memory ack contract (#63). With the ingest buffer on, the call waits briefly for the pipeline: if done in time it returns the finished result (ok:true + memory_ids); if still processing it returns {ok:true, status:"accepted", pending_id} — a promise you can poll with get_add_status. Only ok:false is a failure; deduped non-empty with memories_added=0 means "already known", which is success.

Предбанник / ingest buffer. ("Antechamber.") The bounded queue in front of the write pipeline: add_memory enqueues and the pipeline drains in the background, so a slow LLM never blocks the agent's turn. Confirm-or-promise (above) is its ack contract. (ingest.* in config)

Retrieval

Read path. The entire search machinery — dense vectors + BM25 + graph expansion + PPR ranking — with zero LLM calls. search_memory, search_reasoning_chain, connect_memories and get_memory_graph all run on it; they work identically with no LLM configured at all.

BM25. The classic keyword-ranking function (term frequency × inverse document frequency, length-normalized). Helixir uses HelixDB's native BM25 index as the sparse arm of hybrid search — it catches exact tokens (names, ids, error codes) that embeddings blur.

HNSW. Hierarchical Navigable Small World — the approximate nearest-neighbour index HelixDB uses for vectors. The dense arm of hybrid search: it catches paraphrases and semantic neighbours that share no keywords.

RRF — Reciprocal Rank Fusion. How the dense and sparse arms are combined: each result contributes 1/(k + rank) from each list it appears in. Rank-based, so the two arms' incomparable scores never need calibrating.

Ego-network. The subgraph around the fused seed results — expanded one batched HQL call per depth level across the edge families (relations, entities, history, chunks...), keeping parent provenance. This is the neighbourhood PPR runs over.

PPR — Personalized PageRank. PageRank with teleport biased to the seed memories: a random walker keeps jumping back to what matched your query, so centrality is measured relative to the query, not globally. Final rank = 0.3·cosine + 0.5·PPR + 0.2·freshness.

Freshness. The time component of ranking. Deliberately weak (0.2) and attention-only: age affects what surfaces first, never what is reachable — old facts stay in the graph and in chains forever.

Provenance. Every search result says where it came from: origin=seed|graph, which edge pulled it in, from which parent, with what PPR mass. Insights carry provenance too (witness memories per link). The rule: a claim you can't trace is a claim you can't trust.

Thin recall. The hint search_memory appends when a personal-scope search returns almost nothing: it suggests retrying with scope="collective" before concluding the memory is empty — the store is shared, and your identity may simply be new.

Time window. An explicit event-time bound on search_memory (time_from/time_to, RFC3339 or YYYY-MM-DD; either side may be open). It hard-filters the seeds — the direct answers — on event time (valid_from, else created_at). temporal_days is the one-sided shorthand for the same thing.

Superseded flag. A search result with superseded: true has been replaced by a newer memory (superseded_by names it). It ranks below its successor (score × retrieval.superseded_penalty, default 0.6) but stays fully reachable — history, honestly labelled, never hidden.

Flashback. A memory from outside the requested time window that graph expansion pulled back in through an edge to an in-window result. Never hidden, never disguised: flagged flashback: true with its event_date, and capped by a separate allowance (retrieval.flashback_max, default 3) so associations never crowd the period's own rows. The recall analogue of a human flashback — thinking about last week surfaces last year, and you know it's old.

Charter precedent. One settled contradiction review, remembered: an episode memory under user_id=helixir tagged with the dispute's shape (new-type / old-type / verdict), SUPPORTS-linked to both disputed memories. "Why does this rule exist" walks to the evidence.

Learned rule. After write.rule_propose_after identical precedents (default 3), resolve_contradiction returns a ready-to-adopt rule_proposal. Adoption is an explicit verbatim add_memory ("Charter rule [shape]: …", stored without LLM rephrasing). Adopted rules render in memory://rules BESIDE the constitution — which itself never self-learns — and silence further proposals of their shape.

NLI edge router. A local cross-encoder (deberta) that types confident SUPPORTS (bidirectional entailment) and CONTRADICTS (same-subject contradiction) edges before the LLM is consulted — part of making the write path cheap (#96). Neutral or unconfident pairs still go to the model; lean builds without the nli feature route everything to the LLM.

Polysemy guard. Lachesis' defence against apophenia hubs (#91): a routed thread truncates at a pivot category whose neighbours sit in different communities (label propagation over the PMI adjacency) with no direct link between them — one word bridging two unrelated senses ("benchmarking": finance vs software). Genuine cross-domain links pass. (lachesis.polysemy_guard)

Verification duty. Atropos' answer to insight debt (#91): aging hypotheses get an adversarial review against their witness memories — promote (relabelled VERIFIED), retire (superseded by a retirement note, auto-demoted in search), or keep. Witness-less hypotheses retire as unverifiable past atropos.verify_unverifiable_age_hours.

Write path

Content key / content-addressed dedup. A normalized hash of (content, type) stamped on every memory. The exact-duplicate gate: the same fact re-added hits the same key group atomically (HelixDB BatchCondition) and increments consensus instead of creating a copy. (add_pipeline/store.rs::content_key)

Decision engine. The write-time judge: for each extracted atom against its semantic neighbours it decides ADD / UPDATE / SUPERSEDE / NOOP (plus cross-user LinkExisting / Contradict in collective), constrained by the charter and the same-subject gate. (src/llm/decision/)

Same-subject gate. The rule (#46) that destructive verdicts (UPDATE / SUPERSEDE / CONTRADICT / DELETE) are only legal when both memories are about the same specific subject. Mere keyword overlap → ADD plus a RELATES_TO edge. Prevents "my cat is black" from superseding "my dog is black".

Edge arsenal. The seven typed memory→memory relations: causal/logical IMPLIES, BECAUSE, CONTRADICTS, SUPPORTS (what search_reasoning_chain walks) and associative/structural RELATES_TO, PART_OF, IS_A (relatedness without a causal claim). All persist as one MEMORY_RELATION edge whose relation_type property names the type — new types need no schema change. (src/toolkit/mind_toolbox/reasoning/)

NLI — Natural Language Inference. The local ONNX judge (entail / contradict / neutral) used as the paraphrase-merge backstop: two memories merge only if each entails the other — and divergent numbers fail entailment, which is exactly the anti-gaslight property. Runs offline; helixir model download fetches the weights.

Supersede (never delete). There is no delete tool by design. An outdated fact gets a SUPERSEDES edge from its replacement and a valid_until stamp; history stays reachable through HAS_HISTORY forever. Time affects attention, not reachability.

Ontology. The 20-concept tree (Thing → Attribute/Event/Entity/ Relation/State → ...) seeded into the graph at boot. Every memory gets an INSTANCE_OF edge to its type's concept node; the 8 user-facing types (fact, preference, skill, goal, opinion, experience, achievement, action) are the leaves search_by_concept filters on.

Generative memory — the Moirai

Moirai. The three Fates: background agents that generate connections instead of waiting for them to be written. Clotho spins the category layer, Lachesis measures threads through it, Atropos cuts the survivors into insights. One orchestrated pass, on demand (helixir pipeline) or on a schedule (the daemon). (src/agents/)

Clotho — the Spinner. Tags every memory from a controlled, self-growing category vocabulary: embedding-match against the dictionary; on a miss it mints a fitting category via the LLM. Shared tags weave distant memories into subsets — the substrate the other two work on.

Category layer / third axis. What Clotho's tags add over the flat graph: besides explicit edges (axis 1) and vector similarity (axis 2), two memories can now be close because they share a category — which is how a weather report and a battery stock end up in the same thread.

Lachesis — the Measurer. Routes multi-hop threads within the category subsets and gates them against apophenia (below): a coherence gate plus PMI subset-overlap per hop, drilling every link down to the anchor memories that witness it.

PMI — Pointwise Mutual Information. ln(|A∩B|·N / (|A|·|B|)) over category member sets: how much more often two categories co-occur on the same memories than chance predicts. The weakest link's PMI is a thread's coherence floor; Atropos ranks by hops × min_PMI.

Apophenia gate. The defence against seeing patterns in noise (the human failure mode of conspiracy boards). A thick, everything-touching category has huge member sets, so its PMI with everything collapses toward zero — it gates itself out by arithmetic, not by a blocklist.

Atropos — the Cutter. Curates routed threads into ranked, deduplicated insights: enforces the quality bar, drops threads subsumed by longer ones, journals the survivors, and persists each as a first-class hypothesis-memory under user_id=helixir with SUPPORTS edges from its witnesses — closing the loop: generated knowledge flows back into the memory it came from.

Insight. The Moirai's unit of output: a cross-domain hypothesis with provenance (category path + witness memories per link) and a lifecycle (proposed → verified → refuted). Always framed as requiring verification — the charter, extended to generated knowledge.

Witness. An anchor memory that evidences one link of an insight's chain. Witnesses are what make an insight checkable — and what the SUPPORTS provenance edges point from.

Cadence. Per-Moira pass frequency in the daemon (--clotho-every / --insight-every / --merge-every / --reconcile-every, or moira.daemon.*_every_passes in config): tagging can run every pass while expensive insight routing runs every Nth. 0 disables a stage.

The guar chain. The canonical example of why chains beat facts: Rajasthan weather → guar harvest → guar gum price → fracking costs → shale stocks. No single edge stores it; the Moirai exist to reconstruct chains like it. Used as the end-to-end validation fixture.

Hygieia. The built-in health watchdog (the 2026-07-02 OOM incident, made an organ). Detectors — DB liveness, container memory, insight flood, orphaned daemons, non-persistent storage — feed a reaction ladder: self-heal silently (pause a flooding insights stage, restart a dead DB container when allowed), alert THROUGH the memory itself (ops_alert notices in agents' outboxes + a recallable ops-alert memory), push to a human via the on_alert_cmd shell hook, journal everything (helixir health). Runs inside the Moirai daemon, standalone (helixir watch), or as a login service (helixir watch install).

Cache valve. Hygieia's lie detector for container memory: docker stats charges reclaimable page cache to the container, so the memory detector first opens cgroup memory.reclaim and only pressure that SURVIVES the shed counts as live heap (watchdog.allow_cache_reclaim). Observed live: 2.58GiB "used" collapsing to ~400MiB of real heap.

Supervised memory restart. HelixDB's in-process retention tracks write churn and can reach the container cap within a day of heavy agent traffic. When the post-reclaim (live) number crosses watchdog.mem_restart_pct and restarts are allowed, Hygieia restarts the container itself — volume preserved, ~10s, journaled as heal/mem_restarted — instead of letting the OOM killer strike mid-write. Judge the container with tools/memprobe.py, never docker stats.

Config hot-reload. kubectl-apply for the memory: edit ~/.helixir/helixir.toml, run helixir config apply, running MCP servers and gateways rebuild their client from the re-read config and swap it atomically (SIGHUP; in-flight requests finish on the old client, a failed rebuild changes nothing). config get/set/edit complete the surface; set edits by dotted path with comments preserved. Active FastThink sessions keep their pre-reload handle; daemon/watch restart to apply.

Working memory

FastThink. The isolated reasoning scratchpad (think_start → think_add → think_recall → think_conclude → think_commit): an in-process thought graph (petgraph) that pollutes nothing until an explicit commit persists ONE coherent conclusion. think_discard throws the session away; timed-out sessions auto-save as [INCOMPLETE] and are recoverable via search_incomplete_thoughts.

Infrastructure

HelixDB. The single storage engine — graph and vector index in one database (LMDB-backed), queried in HQL. There is no relational DB, no Redis, no filesystem state; everything Helixir persists lives here.

HQL. HelixDB's query language. Schema (schema.hx) and named queries (queries.hx) are compiled into the server — deploying a query change means helix check + helix push (an image rebuild on the same data volume), not a hot reload.

Snapshot lag. The HelixDB read-visibility quirk: a write can be durable but not yet visible to the next read (index snapshot not refreshed). Correct handling is re-probe with backoff — treating first-read-empty as "lost" is the classic false alarm. (Also the reason some e2e are flaky by design.)

Error-in-HTTP-200. The HelixDB failure mode where a query aborts but the HTTP layer still answers 200 with the error inside the body. Helixir's client surfaces these as real errors (#53); any raw probe script must check the body, not the status code.

MCP — Model Context Protocol. The interface agents speak to Helixir: a stdio (or streamable-HTTP via the gateway) server exposing the 21 tools. Any MCP client — Claude Code, Claude Desktop, Cursor, zeroclaw — connects with a few lines of config; helixir setup writes them for you.

Layered config. Effective settings = built-in defaults ← ~/.helixir/helixir.toml ← environment variables, later layers winning. Gotcha: one invalid field rejects the whole TOML layer, and enum values are capitalized (mode = "Insights").

Fallback chain. The LLM resilience strategy: on any primary-provider error (outage, exhausted quota) the same prompt cascades down an ordered chain — by default deepseek → ollama, i.e. smart remote → cheap remote → local selfhost — and the primary is readopted on its first successful call. Tiers missing credentials are skipped at boot with a warning, never a boot failure; the write result's metadata carries the full error trail that led to the answering tier. Configured by llm_fallback_chain (or HELIX_LLM_FALLBACK_CHAIN); an empty chain disables fallback.

Causal stitching (lachesis-stitch). Lachesis's second duty: a bounded background pass over one user's recent memories that proposes candidate pairs by entity overlap, asks an LLM judge whether an EXPLICIT causal relation holds (conservative by prompt: co-occurrence is not causation), and persists survivors as BECAUSE edges tagged lachesis-stitch — hypothesis-grade provenance per the apophenia guardrail. Capped per pass (window / judged / persisted) and convergent: already-linked pairs are skipped, so re-running adds nothing.

Family collapse. Search-time compaction: a raw source and its extracted atoms (linked by atom→raw PART_OF edges at write time) never coexist in one result window. The best-ranked family member is kept; the folded ids ride its metadata.collapsed and stay reachable. Either direction is legal and content-lossless: atoms fold into a kept raw (their text is inside it), or the raw folds under a kept atom (sibling atoms — distinct facts — stay).

Presence TTL. Roster hygiene for the swarm: agents silent past swarm.presence_ttl_secs (default 30 min — above the daemon pass interval, so healthy daemons don't flap) are presumed gone and hidden from swarm_status, reported as hidden_stale. The Agent node itself is never deleted: it anchors AGENT_CREATED authorship provenance on every memory the agent wrote.