Skip to main content

Persistent memory for AI agents. Set up once. Stays out of your way. Local SQLite, auditable, no GPU, no network.

Project description

A figure of shimmering cloud rising from a dark sea, weaving threads of light into a constellation of beliefs

aelfrice

Persistent memory for AI agents. Set up once. Stays out of your way.

Local SQLite. Auditable. No GPU, no network.

PyPI Python License CI OSSInsight

You correct your agent. "Got it," it says. Next session, same mistake.

aelfrice runs in the background and stops the forgetting. You write a rule once and it gets attached to every prompt thereafter — no cross-references for the agent to skip, no markdown files to maintain, nothing to remember to do.

pipx install aelfrice    # or: uv tool install aelfrice
aelf setup               # wire the hook into your agent
aelf onboard .           # scan the current project and ingest beliefs

Then add your first rule and restart your agent:

aelf lock "never push directly to main; use scripts/publish.sh"

That's it. Your next prompt that mentions "push" already has the rule attached. From here on out aelfrice is invisible — no command to remember to run, no file to keep updated.

The aelf lock line above is an example — substitute your own rule. Skip it entirely if you'd rather start with onboarded beliefs only and add locks as you go.


What it does

When you submit a prompt in Claude Code, aelfrice's UserPromptSubmit hook fires before the model sees your message. It runs a two-layer search:

L0: locked beliefs   -> rules you marked permanent (always returned)
L1: FTS5 keyword     -> SQLite full-text search, BM25-ranked

The matching beliefs come back as an <aelfrice-memory> block prepended to your prompt. The agent reads it as part of the prompt — it doesn't have to remember to check a file.

<aelfrice-memory>
[locked] never push directly to main; use scripts/publish.sh
[locked] commits must be SSH-signed with ~/.ssh/id_rrs
         the publish script runs gitleaks before tagging
</aelfrice-memory>

push the release

Default budget is 2,400 tokens per prompt. Locked beliefs are the always-injected pool — every lock ships on every prompt, in full, regardless of relevance score. Lock count is your baseline-context budget knob: if you've locked 200 things, every session opens with all 200, by your design. The non-locked pool (FTS/L1) is BM25-ranked and truncated to fit.


What it remembers

You run It stores
aelf lock "never commit .env files" Permanent rule. Returned on every retrieval.
aelf onboard . Walks the project — git log, README headings, code structure — and ingests structural facts.
aelf feedback <id> used Bayesian feedback. Strengthens the belief's posterior.
aelf feedback <id> harmful Weakens it. After enough independent harmfuls, locks auto-demote.

Each belief carries a (α, β) Beta-Bernoulli posterior. α / (α+β) is the confidence. Locks short-circuit decay; everything else fades over time so stale beliefs eventually drop out of retrieval.

aelf stats
# beliefs:    142   locked: 8   threads: 67
# feedback:   31    avg_confidence: 0.71

Why files don't solve this

The standard workaround for "agent keeps forgetting" is more files: STATE.md, DECISIONS.md, a CLAUDE.md with cross-references to runbooks. Every cross-reference is a bet that the agent will read the file, find the right section, and follow what it says.

The failure modes are predictable. The agent reads the rule and runs git push anyway. Cross-references break silently after compaction. State files rot the moment you forget to update them. Each new failure mode begets another file.

aelfrice replaces the chain with a mechanism. The hook injects matched beliefs as part of your prompt, before the agent sees it. Nothing voluntary. Nothing the agent can skip.

Manual approach What breaks aelfrice
Rules in CLAUDE.md Agent reads them, doesn't follow them Injected per-prompt, not per-session
Cross-references Agent skips or reads the wrong section Matched beliefs injected directly
Hand-maintained state files One missed update breaks the chain State is the SQLite DB; no manual sync

Determinism

Same store + same query gives the same beliefs. The retrieval path is stdlib + SQLite — no embeddings, no learned re-rankers, no LLM — so every result traces back to a specific belief and the user action that wrote it.

Tradeoff: no fuzzy semantic recall. See PHILOSOPHY.md.


Your data stays yours

  • 100% local. SQLite at <repo>/.git/aelfrice/memory.db. No network calls in the retrieval path.
  • No telemetry. No accounts, no signup, no phone-home.
  • No GPU, no vector DB. Stdlib + SQLite. The optional [mcp] extra adds fastmcp. That's it.
  • Per-project isolation. Beliefs from project A cannot leak into project B (they live in different .git/ directories).
  • Removable. aelf uninstall --archive backup.aenc encrypts the DB to a file, then deletes it. Or --purge for a full wipe.

docs/PRIVACY.md for verifiable specifics.


Day-to-day surface

After aelf setup you should rarely type aelf again. The day-to-day commands are six:

aelf onboard .                      # once per project — scan and ingest
aelf lock "never push to main"      # add a permanent rule
aelf locked                          # see what rules are active
aelf search "push to main"           # check what the agent will see
aelf status                          # quick health summary
aelf setup / aelf doctor            # initial install + verification

Everything else (deeper diagnostics, archive/uninstall, migration tools, hook entry-points called by Claude Code itself) is callable but not something you reach for in normal use. aelf --help shows the everyday surface; aelf --help --advanced lists the rest. Full reference: COMMANDS.

The same operations are also available as MCP tools and /aelf:* slash commands — same library underneath. See MCP and SLASH_COMMANDS.


Roadmap

Version Status Theme
v1.0.x shipped core memory, CLI, MCP, hook wiring, install routing
v1.1.0 shipped per-project DBs (.git/aelfrice/), aelf migrate, edgesthreads rename, aelf health rewrite
v1.2.0 shipped auto-capture pipeline (transcript-ingest, commit-ingest, SessionStart), agent_inferred → user_validated promotion, triple extractor, --batch JSONL ingest, CLI consolidation, INEDIBLE per-file opt-out
v1.2.x planned search-tool PreToolUse hook — memory-first context on Grep/Glob
v1.3 shipped retrieval wave — entity index (L2.5), BFS multi-hop (L3), LLM-Haiku onboard classifier (opt-in), partial Bayesian-weighted ranking
v1.4 shipped context rebuilder — PreCompact retrieval-curated continuation (augment mode); manual + threshold trigger; continuation-fidelity scorer (exact-match)
v1.5 shipped retrieval plumbing — composition plumbing + per-lane telemetry (#232), BM25F anchor text (#148), search-tool Bash matcher (#155), v3 federation version-vector schema (#204), v1.4 dynamic-trigger re-park (#188)
v1.5.x shipped default-on host-driven LLM onboard classifier (#238, in v1.5.1)
v1.6 shipped hardening + observability — hook-hardening framing-tag contract + audit log (#280, #297, #314), aelf tail (#321, #322), belief retention class (#290), rebuild diagnostic log (#288), posterior-ranking eval harness + heat-kernel composition (#151, #306, #310; default-flip still gated), deferred-feedback sweeper (#191, #256), v2.0 corpus public scaffold + bench-gate (#307, #311, #319, #320), replay_full_equality probe (#262, #304), session_id propagation (#192), reachable-install detection (#345)
v1.7 shipped graph signal wave + structural retrieval lane — signed Laplacian + eigenbasis (#149), heat kernel authority (#150), Plate FFT HRR primitives (#216), HRR bind/probe (#152), uri_baki post-rank adjuster retest (#153). BM25F anchor-text retrieval (#148) default-on at v1.7.0 per #154 bench evidence (+0.6650 NDCG@k uplift on the v0.1 retrieve_uplift fixture under Porter stemming). Other v1.7 components remain opt-in via [retrieval] flags in .aelfrice.toml (use_signed_laplacian, use_heat_kernel, use_hrr_structural) — placeholder lanes pending wiring.
v2.0 planned feature parity with the original research line + benchmark reproducibility. v2.0's component issues land incrementally across v1.5–v1.7; final v2.0 tag is the reproducibility cut.

Per-version detail: docs/ROADMAP.md. Open issues: docs/LIMITATIONS.md.


Documentation

Citation

@software{aelfrice2026,
  author = {robotrocketscience},
  title  = {aelfrice: deterministic Bayesian memory for AI coding agents},
  year   = {2026},
  url    = {https://github.com/robotrocketscience/aelfrice},
  license = {MIT}
}

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aelfrice-1.7.0.tar.gz (6.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aelfrice-1.7.0-py3-none-any.whl (385.8 kB view details)

Uploaded Python 3

File details

Details for the file aelfrice-1.7.0.tar.gz.

File metadata

  • Download URL: aelfrice-1.7.0.tar.gz
  • Upload date:
  • Size: 6.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for aelfrice-1.7.0.tar.gz
Algorithm Hash digest
SHA256 509e9395b9db5e864934dbf77848a5e9b07eeb4f62e01e428f5a538b7f8bdeb0
MD5 7fd0dd0f35934fd942642a0a0c2ee8df
BLAKE2b-256 f868307dfeb5e7966958e67e0e30c771f41f261ab56b0d9e2d2292590415bdee

See more details on using hashes here.

Provenance

The following attestation bundles were made for aelfrice-1.7.0.tar.gz:

Publisher: publish.yml on robotrocketscience/aelfrice

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aelfrice-1.7.0-py3-none-any.whl.

File metadata

  • Download URL: aelfrice-1.7.0-py3-none-any.whl
  • Upload date:
  • Size: 385.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for aelfrice-1.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 31800c79f5679c343b36f092e2fe04107a1d2a0fa18636afba7a5645f9ef02cb
MD5 322ebf6367e015a806ac28ab8f89fbda
BLAKE2b-256 0718fd662669ac4220434ec32c57d04be439513ebc8aa27591161181a1056705

See more details on using hashes here.

Provenance

The following attestation bundles were made for aelfrice-1.7.0-py3-none-any.whl:

Publisher: publish.yml on robotrocketscience/aelfrice

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page