hermes-labs-ai/fidelis-memory
Recall locally stored agent memories through the Fidelis MCP server.
Changelog
0.3.0rc1 — 2026-09-21
Time-aware verbatim records, explicit corrections, truthful write outcomes, and a six-tool MCP surface with fast zero-LLM recall. Public install/startup safeguards are retained. MCP names change; see upgrade notes. Historical benchmark scores are not evidence for the redesigned default path.
Unreleased
- Pin supersession fail-open, cache reload, annotation, and ephemera filtering contracts with server-free unit tests.
- Clarify the benchmark case-file roles, disposable-server requirement, and quickstart service use in contributor documentation.
- Add read-only
fidelis recentandfidelis getCLI commands with bounded options, correction metadata, raw JSON output, and explicit failures. - Add five server-free worked examples under examples/real-world/ (correction chain, retraction/ephemera read filter, write-gate screening, MCP client config, benchmark hardset hit@5), re-verified by tests/test_real_world_examples.py.
v0.2.0
- Start the local HTTP service and MCP stdio surface without a reachable Ollama instance. Health and protocol-discovery requests remain available; memory-backed operations report a degraded/unavailable store until the local embedding service is reachable.
- Make
fidelis initrefuse existing service-label and port collisions by default, preserve existing service environment settings during re-init, and offer explicit port and label overrides for intentional coexistence. - Honor
FIDELIS_PORTon both the HTTP server and MCP client, preventing a configured non-default port from splitting the client and server. - Add a portable Claude plugin root that pins the released package and exposes the existing read-only MCP tool surface.
- Coordinate package, runtime, MCP/plugin manifests, citation, current install
instructions, container metadata, and release tests at
0.2.0. The version-specific Zenodo identifier is intentionally omitted until an archive for this release exists.
v0.1.0 — 2026-09-13
- Promote Fidelis Memory from the
0.0.xsequence to its first minor release. The supported product contract is local-first, verbatim memory retrieval for Codex, Claude Code, GitHub Copilot CLI, Gemini CLI, and OpenClaw on the currently gate-tested macOS and Ubuntu paths. - Coordinate package, Python, citation, CodeMeta, MCP Registry, Gemini
extension, installation-documentation, and public-install-test versions at
0.1.0. - Add a public user-fit matrix, a release-readiness record with explicit acceptance criteria, and an outcome-gated 0.2.0 roadmap.
- Replace the manually maintained passing-test-count badge with the live GitHub Actions status badge so release documentation cannot advertise an obsolete count.
- Preserve the historical
v0.1.0andv0.2.0changelog entries under the clearly labeledcogito-ergopredecessor-package section so they cannot be mistaken for current Fidelis package releases.
v0.0.97 — 2026-09-12
-
Release the Gemini CLI extension: v0.0.96 was tagged before
gemini-extension.jsonlanded, so the bare-URL install resolved the latest GitHub release and failed with "Configuration file not found". v0.0.97 is the first tag and release archive that carry the manifest. -
Pin the
user_idnamespace boundary in tests and document that it is not an identity; addglama.jsonfor the Glama registry ownership claim. -
Package Fidelis as a native Gemini CLI extension:
gemini-extension.jsonat the repository root launches the MCP Registry package (uvx --from fidelis-memory==0.0.97 fidelis mcp serve) andGEMINI.mdtells the model when to callfidelis_orientandfidelis_recall.gemini extensions install https://github.com/hermes-labs-ai/fidelisregisters the server without a manualpip install.tests/test_gemini_extension.pybinds the manifest toserver.jsonandpyproject.tomlso a release bump cannot leave it on an older wheel.
v0.0.96 — 2026-09-10
-
The bundled MCP server now answers the base-protocol
pingrequest with an empty result instead of-32601 method not found. Gemini CLI'sgemini mcp listpings after connecting, so a healthy Fidelis server — tools listed, tools working — was reported asDisconnected. No tool, lifecycle, or transport behaviour changed; unknown methods are still refused. -
Add
fidelis mcp install --client geminiandfidelis mcp uninstall --client gemini, which register the bundled stdio MCP server through Gemini CLI's nativegemini mcp add/gemini mcp remove(v0.1.19+).--scope user(default) targets~/.gemini/settings.json,--scope projecttargets./.gemini/settings.json. Gemini owns the write because it reads that file as JSON-with-comments and round-trips a user's comments; Fidelis only reads it back, to check ownership before replacing or removing an entry and to prove what the run changed.gemini mcp addoverwrites a same-named entry unasked andgemini mcp removeexits 0 for an absent name, so a silent no-op or an unexpected entry is reported as a failure rather than as success. -
Add
fidelis mcp install --client openclawandfidelis mcp uninstall --client openclaw. OpenClaw keeps outbound MCP servers undermcp.serversin a JSON5 config (~/.openclaw/openclaw.json, or$OPENCLAW_CONFIG_PATH), so Fidelis neither rewrites that file nor parses it — a strict-JSON rewrite would drop the user's comments and trailing commas, and a strict-JSON read of the same file cannot say what is in it at all. Both directions are delegated to OpenClaw's own CLI with$OPENCLAW_CONFIG_PATHpinned: writes to the documentedopenclaw mcp add/openclaw mcp unset, and every ownership check and read-back toopenclaw mcp show fidelis --json, falling back toopenclaw mcp list --jsonto tell "no such server" apart from "could not be read". Install and uninstall refuse to touch anmcp.servers.fidelisentry that does not name the bundled server unless--forceis passed, and never shell out to write before refusing. Success is never inferred from an exit code: a change the CLI reports as successful but that the read-back does not prove exits non-zero, and a state OpenClaw cannot report is treated as unknown — never as "no entry there", and never as a success, even under--force. Theopenclawbinary is required, because it owns the write and is the only reader that can be trusted with a JSON5 config. -
The Gemini CLI and GitHub Copilot CLI ownership check no longer crashes on a hostile string in a hand-edited config: an embedded NUL (
\u0000is valid JSON) or an unresolvable~userin the entry's arguments used to escape install and uninstall as a traceback instead of the ownership refusal. Such an entry is now treated as foreign, and left alone unless--forceis passed, the way OpenClaw entries already were. -
OpenClaw ownership no longer matches on any string anywhere in an entry — only on
commandnaming a Python interpreter (this process's own, by exact path, or a plausible name likepypy3elsewhere) paired with exactly one argument naming the bundled script, the one shapeopenclaw mcp addactually writes. A foreign server that merely references the script path inenv, a header, a URL, or an unrelated argument is no longer recognized as Fidelis's own and installed over or removed without--force. Install also verifies the read-back entry's command, argument, and enabled state match what was requested, not just that it belongs to Fidelis — a stale entry from a prior install (wrong interpreter, left disabled) could otherwise read back as "ours" even whenopenclaw mcp addsilently left it untouched. Diagnostics for a refused or unexpected entry now show only its launch-shaped fields (never argument values,env, or headers), so a credential on the entry is never echoed to stderr. -
Add
fidelis mcp install --client copilotandfidelis mcp uninstall --client copilot, which register the bundled stdio MCP server in GitHub Copilot CLI's documentedmcp-config.json(~/.copilotor$COPILOT_HOME) with atomic writes, backups, and ownership checks that preserve unrelated entries. Thecopilotbinary is not required at configuration time.fidelis mcp uninstall --forceremoves an entry that does not look like ours, for the case where the ownership check is wrong. -
Atomic config rewrites now keep the destination file's permission bits, and a config Fidelis creates is
0600. Previously every rewrite reset anmcp-config.jsonorsettings.local.jsonto the umask default, widening a file that can hold MCPenvsecrets. -
Config backups no longer overwrite each other when two mutations land in the same second, so an install immediately followed by an uninstall keeps both restore points.
v0.0.95 — 2026-09-02
- Add a portable
fidelis mcp serveentry point and official MCP Registry metadata foruvx-based installation. - Add the PyPI README ownership marker required for the
io.github.hermes-labs-ai/fidelis-memoryregistry namespace.
v0.0.94 — 2026-09-02
- Add supported Codex MCP installation and removal through the shared
codex mcpconfiguration, with exact ownership checks that preserve unrelated entries. - Add
fidelis_orient, a deterministic MCP tool that selects a bounded evidence lane, returns retrieved records without rephrasing them, and abstains when a turn lacks a known referent or historical-context cue. - Add citation and CodeMeta metadata and align the agent-facing
llms.txtretrieval headline with the shipped zero-LLM benchmark evidence.
v0.0.93 — 2026-08-05
- Publish the Hermes Labs distribution to PyPI as
fidelis-memory. - Make Fidelis Memory the user-facing product name across package metadata
and primary documentation, while preserving the
fidelisrepository, import, and CLI names for compatibility. - Replace the GitHub-source install path in primary documentation with the version-pinned PyPI installation command.
v0.0.92 — 2026-08-04
- Preserve
/addinput verbatim when the extraction model returns no facts, expose the degraded fallback through HTTP and CLI, and apply the same no-silent-loss rule during queued-write replay. - Correct every current install surface to use tagged GitHub source; the PyPI
project named
fidelisis unrelated to Hermes Labs Fidelis. - Align public package status with v0.0.91 and remove a dead benchmark link.
- Narrow local-data and compliance wording to the demonstrated boundary.
- Default mem0 telemetry off for direct server launches so SIGTERM completes cleanly, while preserving explicit opt-in; document the remaining Chroma settings and extend CI coverage through Python 3.14.
- Remove cross-project proof language from current Fidelis presentation.
- Add a regression test for the public installation contract.
fidelis era
v0.0.91 — 2026-06-18 (public release)
- Public open-source release on GitHub + Zenodo DOI.
- Repo hygiene only: relativized benchmark paths, removed run-log artifacts, refreshed module naming, added Zenodo metadata. No API changes vs v0.0.9.
v0.0.5 — 2026-04-24 (first release as fidelis, renamed from cogito-ergo)
Package rename: cogito-ergo → fidelis. Version reset for the new
PyPI package. The old cogito-ergo PyPI entries (0.0.8 and 0.3.0) remain
published but are now deprecated pointers to this package. Note: a prior
cogito-ergo v0.0.5 also exists in the changelog below — these are
different packages; the version numbers do not collide on PyPI.
Headline: zero-LLM is the default retrieval tier. The repositioning reflects what the benchmark numbers actually show — the zero-LLM path is the production moat (83.2% R@1 at $0, fully local); the LLM tiers are benchmark-tuned and held as experimental until calibration is fixed.
Rename details
- PyPI package:
cogito-ergo→fidelis - Import name:
from cogito→from fidelis - CLI:
cogito ...→fidelis ...,cogito-server→fidelis-server - Data paths kept as
~/.cogito/for backward-compat with existing deployments - Env vars kept as
COGITO_*for backward-compat - ChromaDB collection names kept as
cogito_memoryto avoid data loss
Default change (breaking for callers relying on default tier)
recall_hybrid()default tier flipped fromfiltertozero_llm. Callers that relied on the filter default must passtier="filter"explicitly. Affects:fidelis recall-hybridCLI,POST /recall_hybrid,recall_hybrid(...)Python API.
Features
- New
sinceparameter on/recallandfidelis recall --since— ISO-8601 timestamp filter applied after Stage 2.
Observability & reliability
- New
fidelis.telemetrymodule: escalation-rate log +rate()summariser. Makes the 80%-vs-10% calibration miss measurable at runtime. Crash-safe. degrade.replay_queuecorrupt-file branch now covered by tests.
Tests
tests/test_zero_llm_regression.py— 4 tests pin zero-LLM default: no filter/flagship invocation, works without LLM config, matches explicit-tier output, handles empty corpus.tests/test_telemetry.py— 5 tests for the new observability module.tests/test_verify_guard.py— regression pin for the documented verify-guard-inactive bug; xfail until fixed.tests/test_graceful_degrade_corruption.py— replay_queue corruption.- Test baseline: 61 → 72 passing + 2 defensive skips.
Benchmarks (for reference, not default-path claims)
recall_hybridattier="flagship"hits 96.4% R@1 on LongMemEval_S (470 questions, runP-v35, 2026-04-18). Escalates on ~80% of queries under current calibration vs 10% intended — known limitation documented in STATUS.md anddocs/RELEASE-SCOPE.md. Do not use the 96.4% number as a cost-model baseline.- Zero-LLM per-category R@1 (now the default): single-session-assistant 100%, knowledge-update 96%, single-session-user 95%, multi-session 83%, single-session-preference 67%, temporal-reasoning 66%.
Docs
- README repositioned: zero-LLM leads, LLM tiers labeled experimental, per-category table published.
docs/THRESHOLD-AUDIT.md— pins prod vs bench escalation constants.docs/RELEASE-SCOPE.md— in-scope / held-for-later with unlock criteria.
cogito-ergo era (predecessor package, retained for history)
v0.3.0 — 2026-04-16
- New
recall_hybridpath: BM25 + dense + RRF with tiered LLM escalation. Port of the architecture that reached 93.4% R@1 on LongMemEval_S (up from the 56% mem0 baseline). Superseded by v0.3.1 (96.4%). - New
POST /recall_hybridHTTP endpoint andfidelis recall-hybridCLI. - New tiers:
zero_llm(no LLM, fastest),filter(cheap rerank, default),flagship(stronger model, 4x larger snippets). - New env vars:
COGITO_FLAGSHIP_ENDPOINT,COGITO_FLAGSHIP_TOKEN,COGITO_FLAGSHIP_MODEL,COGITO_FLAGSHIP_TIMEOUT_MS,COGITO_HYBRID_COSINE_WEIGHT. Optional[hybrid]extra forbm25s. - Existing
/recalland/recall_bbehavior is unchanged. The hybrid path is strictly opt-in.
v0.2.0 — 2026-03-28
- Dual-pipeline recall: zero-LLM
recall_b(RRF multi-query) feedsrecall(integer-pointer LLM filter) - Snapshot layer for high-fidelity context injection
- Combined eval harness (
bench/) - Technical extraction prompt baked into default config (no external prompt file needed)
- Qwen3/qwen3.5 support via native Ollama
/api/chatwiththink:false
v0.0.5 — 2026-03-28
- Fixed benchmark attribution: qwen3.5:2b filter model (not claude-haiku-4-5)
- Added Hermes Labs PyPI metadata (author, homepage, keywords)
- Added agents.md for AI agent discoverability
- Updated llms.txt with full API shapes and integration notes
- Added "Built by Hermes Labs" ecosystem section to README
v0.1.0 — 2026-03
- Initial two-stage integer-pointer recall pipeline
- mem0 + ChromaDB vector store backend
- HTTP server with
/recall,/add,/snapshotendpoints fidelis calibratefor vocab map generation