Fidelis Memory
Memory serverOfficial Hermes Labs project
Created by Hermes Labs
Published in hermes-labs-ai/fidelis. Publisher page
25 GitHub stars
What it is
Zero-LLM agent memory for Claude Code and AI agents: local-first BM25, dense-vector, and reciprocal-rank-fusion retrieval. Returns original passages verbatim by default. Available on PyPI as fidelis-memory. Apache-2.0.
AutoGineer overview, from the brain’s own files
Fidelis is a local-first memory infrastructure designed to provide AI agents with persistent, accurate recall of stored notes. Unlike systems that rely on generative models to summarize or rewrite information, Fidelis focuses on returning original passages verbatim. It operates as a background service on the user's machine, utilizing a vector store and hybrid retrieval techniques—including BM25 and dense-vector search with reciprocal rank fusion—to ensure high-fidelity recall. By integrating via MCP, it allows agents to store, recall, correct, and inspect memory records without requiring external API keys or cloud-based storage, making it suitable for developers and autonomous agents that need to maintain context across sessions.
How it works
Memory model: Vector store
AutoGineer overview, from the brain’s own files
Fidelis runs as a background service on the user's machine, managing a local store of text and Markdown notes. When a user or agent saves a note, it is indexed using local embeddings. The system provides an MCP interface for agents to interact with this memory. Retrieval is performed through a combination of keyword-based BM25 search and dense-vector search, which can be fused to find relevant passages. The system supports versioning through corrections, allowing records to be superseded without deleting historical data.
| Folder | Role | Files |
|---|---|---|
| .github | agent-config | 5 |
| assets | attachments | 1 |
| docs | docs | 19 |
| examples | examples | 18 |
| scripts | scripts | 1 |
| src | source-code | 42 |
| tests | tests | 67 |
| .agents | folder | 1 |
| .hermes | folder | 3 |
| Formula | folder | 1 |
| bench | folder | 144 |
| claude-plugin | folder | 4 |
| experiments | folder | 30 |
| extensions | folder | 1 |
Requirements
Runtimes: Python >=3.10
Databases: Chroma
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)
Set it up
- Not scanned by AutoGineerIts dependencies are installed by pip or uv when you run it and were not scanned by AutoGineer (3 declared). https://pypi.org/project/fidelis-memory/
Created by Hermes Labs. Published in hermes-labs-ai/fidelis. Licence: Apache License 2.0.
Usage
AutoGineer overview, from the brain’s own files
- Install the Fidelis memory server and initialize the background service.
- Connect the agent to the Fidelis MCP server.
- Use the 'fidelis_store' tool to save important facts or decisions.
- Use the 'fidelis_recall' tool to retrieve original text based on natural language queries.
- Use 'fidelis_correct' to update or supersede existing records while maintaining history.
- Inspect memory status and availability using 'fidelis_health'.
- “Use Fidelis to find my Atlas billing migration note. What must happen before we retry? Quote the relevant text.”
- The agent queries the Fidelis memory server and returns the exact sentence: 'Do not retry until the idempotency fix is verified.'
- “Store this note: The API endpoint for the user service has changed to /v2/users.”
- The agent uses the fidelis_store tool to save the fact, which is then indexed and available for future retrieval.
Documentation by Hermes Labs
<!-- mcp-name: io.github.hermes-labs-ai/fidelis-memory -->
<div align="center">
Fidelis Memory
<img src="assets/fidelis-memory-artwork.png" width="420" alt="Fidelis Memory mascot" />
Your agent can forget a summary. Fidelis brings back the note.
Local memory for Codex, Claude Code, and other agents: save text across sessions and retrieve the original passage when it matters.
by Hermes Labs
PyPI · Connect an agent · Technical reference
</div>
A project summary might say “billing migration rolled back.” The original note says why it failed and do not retry until the idempotency fix is verified. When your next session depends on that condition, the missing sentence matters.
Fidelis stores your Markdown and text notes and retrieves their stored wording. Its default retrieval does not ask a generative model to rewrite your memory.
Try it with one note
This path supports Python 3.10+, macOS or Ubuntu, and a local Ollama service. Start Ollama if needed (ollama serve in a separate terminal). No model API key is required. The current release is 0.3.0rc1.
ollama pull nomic-embed-text
python3 -m venv ~/.venvs/fidelis
source ~/.venvs/fidelis/bin/activate
python3 -m pip install "fidelis-memory[hybrid]==0.3.0rc1"
fidelis init
demo_dir=$(mktemp -d)
cat > "$demo_dir/atlas.md" <<'NOTE'
Atlas billing migration:
Duplicate charges appeared in staging. Rolled back.
Do not retry until the idempotency fix is verified.
NOTE
fidelis watch "$demo_dir" --once
fidelis recall-hybrid "Atlas billing migration retry condition" --tier zero_llmfidelis watch and fidelis recall-hybrid use the background service started by fidelis init.
Look for both the rollback and the retry condition in the retrieved text. This is retrieval of a saved note, not a generated answer. For your own files, replace "$demo_dir" with a notes directory. If retrieval fails, run fidelis health and confirm Ollama has nomic-embed-text available. Keep the virtual environment after fidelis init; the background service uses it.
What this changes on your machine: fidelis init installs a per-user background service (launchd on macOS, systemd --user on Linux) that starts fidelis-server automatically at login. fidelis watch sends the note to that server, which saves it in the local store at ~/.cogito/store by default, not in the temporary demo directory. fidelis recall-hybrid also queries that same running server and searches the whole shared store, so its results can include notes you saved earlier, not only the demo note. The watcher also records ingested files in ~/.fidelis/watched.json. To remove the default service on macOS, run fidelis init --uninstall; it stops the service and deletes the launchd plist only. On Linux, find the installed unit with systemctl --user list-unit-files '*fidelis-server*', then run systemctl --user disable --now <unit>, delete that unit file from ~/.config/systemd/user/, and run systemctl --user daemon-reload. Neither path deletes your data. The store is shared by everything you save with Fidelis, so deleting ~/.cogito/store erases all of it, not just the demo note; do that only on a throwaway install. Also delete the temporary demo directory ($demo_dir), and ~/.fidelis/watched.json if you want its record of the file path gone.
Connect an agent
Once the note is retrievable locally, install the MCP connection for your client:
fidelis mcp install --client codex
# Or, for Claude Code:
fidelis mcp installRestart the client and try: “Use Fidelis to find my Atlas billing migration note. What must happen before we retry? Quote the relevant text.”
The client gets tools to recall, store, correct, fetch, and inspect memory. It decides when to call them; installing the connection does not make every turn recall automatically. Other clients and uninstall commands include Cursor, Gemini CLI, Copilot CLI, and OpenClaw. A separate Pi extension provides prompt-time recall.
What Fidelis preserves
Original wording.
watch,store, and other verbatim write paths keep the text you supplied, so retrieval can return the condition that a summary might omit.Local retrieval. Fast vector search is the default MCP recall path. Explicit hybrid search combines keyword and vector results without a generative LLM at its
zero_llmtier; local embeddings still require Ollama.Corrections over time. A correction can supersede a prior record without erasing it. Recall can show validity and historical status instead of silently replacing the old note.
Fidelis also has optional extraction and model-assisted routes. Those can transform or filter inputs; use the verbatim path when the original wording is the point. Retrieved text can still be wrong or out of date, and your agent's model provider may see it when answering.
Current scope
Fidelis 0.3.0rc1 is a single-machine pre-release, not a hosted team memory service. The LongMemEval-S retrieval run measured whether the redesigned default path retrieved material across 470 questions; it did not measure answer accuracy. See the results, user-fit guide, and security policy for deeper detail.
Full reference · Upgrade notes · Contribute · Changelog
Apache-2.0. Hermes Labs builds agentic infrastructure for autonomous systems.
docs/GENERALIZABILITY_SKEPTIC.md
cogito-ergo Generalizability Skeptic Review
Status: Critical gaps found in the workload-aware dispatcher plan. Both retrieval paths are likely overfit to their training distributions.
Executive Summary
Path A (/recall, atomic-fact) scores 75% R@1 on the 31-case eval (the only real production data you have). Path B (/recall_hybrid, LongMemEval-optimized) scores 54% R@1 on those same 31 cases — a 21-point regression.
The plan to reconcile them via a "workload-aware dispatcher" risks building a 2-way overfit: Path A is tuned to atomic keyword recall; Path B is tuned to session-based conversational retrieval. Neither is validated on the OTHER's home turf, and neither is validated on realistic new workloads.
Shipping a 95% claim requires proving the dispatcher generalizes beyond these two benchmark distributions. It doesn't yet.
1. Where the Workload-Aware Dispatcher Still Overfits
Failure Mode A: The "Medium-Length" Memory Gap
Path A expects atomic facts ≤150 chars (judged by the filter snippet truncation at [:150]).
Path B expects session context ≤2000 chars (the flagship snippet limit in recall_hybrid.py:464).
What happens at 500–800 chars?
A 600-char memory (e.g., a design decision with rationale) is too long for Path A's filter to meaningfully evaluate in isolation.
It's too short for Path B's BM25+dense+RRF fusion to benefit from field-level structure.
Neither the regex router nor the dispatcher has a case for "medium-form narrative."
Test case: Store a 750-char decision memo. Query for a detail in paragraph 3. Neither path is validated here.
Failure Mode B: Structured But Atomic Data
Memories that are JSON, code, or YAML blobs (but still logically atomic) break both routers.
Example: {"auth_flow": "JWT→session", "ttl_sec": 3600, "rotation_policy": "on_login"} — 89 chars.
Path A sees it as unstructured text; the filter LLM will struggle to parse it. Path B's BM25 + dense hybrid will tokenize the keys/values separately, hurting both keyword and semantic match.
Evidence: IMPROVEMENT-COMPARISON.md notes 27 LongMemEval sessions silently failed due to JSON/hex truncation bugs. You know structured data breaks the pipeline. The dispatcher has no answer for it.
Failure Mode C: The Dispatcher Decision Tree Itself
The plan mentions "workload-aware dispatcher" but provides no specification:
What query characteristics trigger Path A vs Path B?
The router in
recall_hybrid.py:113–130is regex-only (hardcoded skip/temporal/counting patterns). This is brittle.If a user queries "how many times did we change the auth flow," it routes to "llm" (counting pattern). But if the memory is a short JSON blob, the filter LLM is the wrong tool — Path A's integer-pointer might be better.
No test validates that the dispatcher routing decision correlates with which path actually performs better on the same query.
2. What the 31-Case Eval Doesn't Measure
The 31-case eval is representative of ONLY atomic keyword recall
Reading eval_cases.json:
4 "cross_reference" cases (e.g., "what tools are being built")
4 "semantic_gap" cases (e.g., "why was nothing being found")
4 "adversarial_negative" cases (e.g., "hardware spec of the machine running ollama")
This corpus is from cogito's own memory store — small, technical, fact-dense. It is NOT representative of:
Adversarial workloads
Typo-heavy user input: "authorizatin architecture" (typo in "authorization"). Path A relies on keyword matching; the filter LLM might recover via semantic understanding. Not tested.
Paraphrase variance: User asks "when did we migrate tokens" but memory says "switched from JWT to session on 2026-03-27." Path A's vocab_map helps; Path B's BM25+dense might miss the semantic pivot. Not tested.
High-cardinality distractor: 1000 memories about "auth" but the user asks "which auth timeout did we pick?" Path A's filter is fast but noisy at scale; Path B's BM25 helps but hasn't been validated on >500 memories. Scale test: missing.
Multilingual or code-heavy
Path A assumes the filter LLM speaks the corpus language. Path B's BM25 is language-agnostic. No multilingual test.
Code snippets (Python, YAML, SQL) are not in the 31-case eval. Both paths are unvalidated on code. Code retrieval benchmark: missing.
High-volume / concurrent
100K+ memories: BM25 indexing and dense re-embedding scale linearly. Does the router decision change when you have 100K candidates instead of 50? No load test.
Concurrent writes: The dispatcher makes routing decisions per-query. If memories are being added concurrently, does the routing become unstable? Concurrency test: missing.
Silent failures in the eval
The eval includes 4 adversarial_negative cases expecting empty results ([]). Do both paths correctly return []? The README doesn't break down per-case per-path results.
Missing: per-case breakdown showing both Path A and Path B results.
3. What LongMemEval_S Doesn't Measure
Session-based ≠ production multi-workload
LongMemEval is 470 questions over multi-turn dialogs with session-level chunking. The benchmark assumes:
Memories are long (up to 6000 chars before truncation).
Related facts cluster within a session.
There are explicit session boundaries and temporal metadata (
haystack_dates).
Production cogito:
Memories are atomic, unrelated, injected by agents over time.
No session boundaries.
No
haystack_datesfield (Path B removes this adaptation in production; seerecall_hybrid.py:20–25).
The porting introduces unknown risk:
The 93.4% result relied on turn-level chunking (
bench/longmemeval_combined_pipeline_flagship.pychunks by conversation turn).Production cogito has no turn boundaries.
You have NOT validated that the ported pipeline (without turn chunking) maintains 93% on production data.
Distribution of question types is unknown
METHODOLOGY.md doesn't report the breakdown of qtype within LongMemEval_S:
How many are "preference" (67% of the 16 hardest misses)?
How many are "multi-session aggregation"?
What % require temporal reasoning (Path B has special-cased temporal routing)?
Without this, you don't know if the dispatcher is solving a real workload problem or overfitting to LongMemEval's question distribution.
The "hardset" is a red flag
Path B required a hardset of 37 questions escalated to qwen-max (flagship tier) to reach 93.4%. This is:
A sign that 83.2% zero-LLM wasn't enough for the long tail.
Not validated on cogito's 31-case eval. Did the flagship tier run on those 31 cases? The README says Path B scores 54% on the 31-case eval, but doesn't break down whether that's with or without flagship.
4. Five Concrete Falsifier Tests
These tests would reveal whether the dispatcher is actually generalizable or just a 2-way overfit.
Test 1: Paraphrase Perturbation
Setup: Take the 31-case eval. For each query, generate 3 paraphrases using an LLM (no manual work). Example: "what tools are being built" → "which projects are under development" → "list the software being constructed."
Run: Query each paraphrase against both Path A and Path B. Score: at least one variant recalls the right answer.
Failure threshold: Any query where Path A ≤50% paraphrase-recall or Path B ≤70% → the dispatcher is sensitive to phrasing, not robust.
Why it matters: Real users don't use your exact 31 canned queries. If the paths diverge under paraphrase, the dispatcher's routing is fragile.
Test 2: Typo Injection
Setup: Take 10 queries from the eval. Inject 1–2 character-level typos or Levenshtein edits (e.g., "authorizatin", "what toools").
Run: Query both paths. Score: Path A ≤60% recall, Path B ≤80% recall indicates typo sensitivity.
Failure threshold: Either path loses >3pp on a typo-heavy subset.
Why it matters: Real agent queries come from LLM generation, which hallucinate typos. If the dispatcher can't route typo-heavy queries reliably, it fails in production.
Test 3: Memory Type Shift
Setup: Create 3 synthetic memory stores:
Atomic keywords (existing 31-case store): facts ≤150 chars.
Medium narrative (new): 3–5 sentence design decisions, 200–600 chars each.
Code snippets (new): Python/YAML/SQL fragments, 100–400 chars, unstructured.
Run: Same 10 queries against all 3 stores. Measure Path A vs Path B R@1 per store.
Failure threshold: Any path loses >5pp on a new memory type → the dispatcher is not memory-type-agnostic.
Why it matters: Real agent memory stores are heterogeneous. If the dispatcher assumes homogeneous memories, it fails at the first type change.
Test 4: Cross-Language Query + Bilingual Store
Setup: English queries, but 30% of the store is in Spanish / Mandarin / French (realistic for global agents).
Run: Mixed-language queries (e.g., "how do we handle auth tokens" alongside "como manejamos auth tokens"). Measure recall.
Failure threshold: Either path loses >4pp on cross-language vs. single-language → language sensitivity is unhandled.
Why it matters: Multi-agent systems often span languages. The dispatcher has no language awareness.
Test 5: High-Cardinality Distractor at Scale
Setup: Seed the store with 2000 memories, 80% of which contain the word "auth" (high-cardinality class). Add 10 queries that target specific auth-related memories.
Run: Query both paths. Measure recall@1 and recall@5. Compare to the 31-case baseline.
Failure threshold: Either path loses >4pp on recall@1 vs. the 31-case baseline → the dispatcher doesn't scale.
Why it matters: Real memory stores grow. If the performance cliff happens at scale, the dispatcher is a local-eval artifact.
5. What Competitors Probably Measure (and Don't Publish)
Mastra (94.87% R@1, the published SOTA)
Likely hidden benchmarks:
Multi-turn real chat logs (not curated datasets like LongMemEval). Chat logs are messier, have more typos, and cross-context references.
Latency profiling at 100K+ memories. Vector DB scaling kills retrieval quality; Mastra probably has a special case for it.
Failure modes by memory type: code, metadata, long-form prose. Mastra's 94.87% might be high on textual data, lower on code.
Ablation on their router/dispatcher logic. They almost certainly have a query classifier (like cogito's regex router). That classifier is probably the biggest source of accuracy variance.
Their blind spot: Likely haven't tested on truly adversarial workloads (typos, paraphrases, code, scale).
Letta, MemGPT
Likely hidden limits:
MemGPT's compression stage probably overfits to short-context recall. Long chains of reasoning degrade.
Letta's integration with LLMs probably assumes the user query is semantically close to the memory text. Paraphrase mismatches likely hurt.
Zep
Likely haven't solved:
Recency bias: Recent memories are probably over-weighted in their router. Query an old fact from month 1, you might miss it on a large store.
Multi-type stores: If 50% of the store is metrics/logs and 50% is design docs, their retrieval probably underperforms on the minority type.
6. The One Thing Most Likely to Kill This Generalizability Claim
Answer: The 31-case eval regression (54% R@1) is not being treated as a blocker.
Path B is the new hotness — 96.4% on LongMemEval, published in the README, deployed to /recall_hybrid. But on the only production eval you actually have, it's 21 points worse than Path A.
The plan to ship a "workload-aware dispatcher" glosses over this: "use Path B when you need the hybrid trait" is a shrug, not a solution. You're asking users to decide which path to call, which means users have to benchmark both on their own workload.
Why this kills the 95% claim:
You can't claim 95% if 54% of production queries route to Path B.
You can't measure the dispatcher's routing accuracy without a ground-truth label of "which path should have been called." You don't have that.
The 31-case eval is noisy (only 31 cases), so the 54% might have >10pp confidence interval. You need more production data.
Fix (or admit loss):
Either: Re-validate Path B on production-like data before claiming 93.4% applies to /recall_hybrid in production.
Or: Admit that both paths are research artifacts, publish the numbers honestly ("Path A: 75% on production, Path B: 54% on production; 96.4% on LongMemEval_S with novel chunking scheme not ported to production").
Or: Build a third path that fixes the 21pp regression on production data, then validate both paths on both benchmarks.
Recommendations
Mandatory falsifier tests before launch: Run at least Test 1 (paraphrase perturbation) and Test 5 (high-cardinality scale) before claiming generalizability.
Expand the 31-case eval to 500+ production cases. A 31-case eval has ~5pp noise floor. You need 500+ to trust R@1 differences <2pp.
Break down LongMemEval results by qtype and memory-type. Report Path A vs Path B per qtype. Show the hardset separately.
Audit the dispatcher routing logic. Document: for each query type, which path should win, and measure correlation between the router's choice and the actual per-path performance.
Before shipping
/recall_hybridas a public beta, run it against at least 100 real production queries and publish the results. Hide the names if needed, but publish the distribution of Path A vs Path B recall gains.
Conclusion
The plan is not wrong; it's incomplete. Both paths solve real problems (atomic keyword lookup vs. long-form semantic retrieval). But the dispatcher is underdeveloped, and the generalizability claim is built on a benchmark that doesn't reflect production constraints.
Treat the 95% target as a benchmark milestone, not a product claim. For product, measure on production data first. Once you have 500+ production test cases and pass the five falsifier tests, then the generalizability claim becomes credible.
Until then: publish 96.4% on LongMemEval_S and 75% on the 31-case eval separately, with full honesty about what each benchmark measures.
367 files · 337 not served here
- .agents/skills/fidelis/SKILL.md (not served here)
- .cogito.example.json (not served here)
- .github/FUNDING.yml (not served here)
- .github/workflows/ci.yml (not served here)
- .github/workflows/release.yml (not served here)
- .github/workflows/scorecard.yml (not served here)
- .github/workflows/swh-archive.yml (not served here)
- .gitignore (not served here)
- .hermes/gate.toml (not served here)
- .hermes/hermes_gate_runner.py (not served here)
- .hermes/run_gate_runner.py (not served here)
- .pre-commit-config.yaml (not served here)
- .zenodo.json (not served here)
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CHANGELOG.md
- CITATION.cff (not served here)
- CODE_OF_CONDUCT.md
- COMPLIANCE-DRAFT.md
- CONTRIBUTING.md
- Dockerfile (not served here)
- Formula/fidelis.rb (not served here)
- GEMINI.md
- LICENSE
- PR_BODY.md
- README.md
- ROADMAP.md
- SECURITY.md
- STATUS.md
- WRITEUP-LONGMEMEVAL-20260423.md
- agents.md
- assets/fidelis-memory-artwork.png (not served here)
- bench/BENCHMARK_INTEGRITY_AUDIT.md (not served here)
- bench/DEFAULT-RETRIEVAL-METHODOLOGY.md (not served here)
- bench/IMPROVEMENT-COMPARISON.md (not served here)
- bench/LAUNCH-FRAMING.md (not served here)
- bench/METHODOLOGY.md (not served here)
- bench/MULTIQUERY-ANALYSIS.md (not served here)
- bench/R&D-PLAN-2026-04-15.md (not served here)
- bench/REGRADE_README.md (not served here)
- bench/RESULTS-SUMMARY.md (not served here)
- bench/REVIEW-QUEUE.md (not served here)
- bench/ROADMAP-95-v2.md (not served here)
- bench/ROADMAP-95.md (not served here)
- bench/VALIDATION_PACK.md (not served here)
- bench/analysis-pipeline-2026-04-15.json (not served here)
- bench/analyze_pipeline.py (not served here)
- bench/analyze_thresholds.py (not served here)
- bench/benchmark.py (not served here)
- bench/cases.json (not served here)
- bench/claude_code_session_eval.py (not served here)
- bench/claude_code_user_eval.py (not served here)
- bench/diff_runs.py (not served here)
- bench/eval-cache-provenance-0.3.0rc1.json (not served here)
- bench/eval.py (not served here)
- bench/eval_cases.json (not served here)
- bench/hardset.json (not served here)
- bench/longmemeval_combined.py (not served here)
- bench/longmemeval_combined_pipeline.py (not served here)
- bench/longmemeval_combined_pipeline_dates.py (not served here)
- bench/longmemeval_combined_pipeline_flagship.py (not served here)
- bench/longmemeval_combined_pipeline_guard.py (not served here)
- bench/longmemeval_combined_pipeline_v31.py (not served here)
- bench/longmemeval_combined_pipeline_v32.py (not served here)
- bench/longmemeval_combined_pipeline_v33.py (not served here)
- bench/longmemeval_combined_pipeline_v33_ablate.py (not served here)
- bench/longmemeval_combined_pipeline_v34.py (not served here)
- bench/longmemeval_combined_pipeline_v35.py (not served here)
- bench/longmemeval_combined_verify.py (not served here)
- bench/longmemeval_default.py (not served here)
- bench/longmemeval_full_pipeline.py (not served here)
- bench/longmemeval_hybrid.py (not served here)
- bench/longmemeval_multiquery.py (not served here)
- bench/longmemeval_prefix.py (not served here)
- bench/longmemeval_queryexp.py (not served here)
- bench/longmemeval_rerank.py (not served here)
- bench/longmemeval_retrieval.py (not served here)
- bench/longmemeval_scaffold_pref.py (not served here)
- bench/longmemeval_scaffold_temporal.py (not served here)
- bench/longmemeval_tuned.py (not served here)
- bench/longmemeval_turnlevel.py (not served here)
- bench/phase-0/LEARNINGS.md (not served here)
- bench/phase-2/build_hardset.py (not served here)
- bench/phase-2/learned_router.pkl (not served here)
- bench/phase-2/learned_router.py (not served here)
- bench/phase-2/retriever_contribution.json (not served here)
- bench/phase-2/retriever_contribution.md (not served here)
- bench/phase-2/retriever_contribution.py (not served here)
- bench/phase-2/retriever_contribution_logged.py (not served here)
- bench/phase-2/run_learned_router.sh (not served here)
- bench/phase-4/TEMPORAL_SCAFFOLD_DESIGN.md (not served here)
- bench/phase-4/temporal_scaffold.py (not served here)
- bench/phase-6/FLAGSHIP_DESIGN.md (not served here)
- bench/phase-6/flagship_escalation.py (not served here)
- bench/qa_eval.py (not served here)
- bench/qa_eval_runJ-v33.json (not served here)
- bench/qa_eval_v2_runP-v35_qwen-max_top5_regraded.json (not served here)
- bench/qa_eval_v3_routing.py (not served here)
- bench/qwen_native_arena.py (not served here)
- bench/qwen_native_arena_results.md (not served here)
- bench/r5_ceiling_diagnostic.md (not served here)
- bench/regrade_qa.py (not served here)
- bench/results-2026-04-15.json (not served here)
- bench/results-combined-2026-04-15.json (not served here)
- bench/results-combined-pipeline-2026-04-15.json (not served here)
- bench/results-default-0.3.0rc1.json (not served here)
- bench/results-default-smoke-0.3.0rc1.json (not served here)
- bench/results-fixed-2026-04-15.json (not served here)
- bench/results-flagship-2026-04-15.json (not served here)
- bench/results-guard-2026-04-17.json (not served here)
- bench/results-hybrid-2026-04-15.json (not served here)
- bench/results-multiquery-2026-04-15.json (not served here)
- bench/results-prefix-2026-04-15.json (not served here)
- bench/results-rerank-2026-04-15.json (not served here)
- bench/results-tuned-2026-04-15.json (not served here)
- bench/results-turnlevel-2026-04-15.json (not served here)
- bench/results-v31-2026-04-17.json (not served here)
- bench/results-v32-2026-04-17.json (not served here)
- bench/results-v33-2026-04-18.json (not served here)
- bench/run_ablations.py (not served here)
- bench/run_all.sh (not served here)
- bench/run_all_experiments.sh (not served here)
- bench/run_chunked.py (not served here)
- bench/run_improvements.sh (not served here)
- bench/runs/baseline-seed2/aggregate.json (not served here)
- bench/runs/baseline-seed2/per_question.json (not served here)
- bench/runs/baseline/aggregate.json (not served here)
- bench/runs/baseline/per_question.json (not served here)
- bench/runs/claude_code_user_eval.json (not served here)
- bench/runs/fix-assistant-text/aggregate.json (not served here)
- bench/runs/fix-assistant-text/per_question.json (not served here)
- bench/runs/router-v2/aggregate.json (not served here)
- bench/runs/router-v2/per_question.json (not served here)
- bench/runs/runA-temporal-scaffold/aggregate.json (not served here)
- bench/runs/runA-temporal-scaffold/per_question.json (not served here)
- bench/runs/runB-flagship/aggregate.json (not served here)
- bench/runs/runB-flagship/per_question.json (not served here)
- bench/runs/runC-guard/aggregate.json (not served here)
- bench/runs/runC-guard/per_question.json (not served here)
- bench/runs/runD-temporal/per_question.json (not served here)
- bench/runs/runE-pref/per_question.json (not served here)
- bench/runs/runF-queryexp/per_question.json (not served here)
- bench/runs/runH-v31/per_question.json (not served here)
- bench/runs/runI-v32/per_question.json (not served here)
- bench/runs/runJ-v33/aggregate.json (not served here)
- bench/runs/runJ-v33/per_question.json (not served here)
- bench/runs/runK-ablate-tempboost/per_question.json (not served here)
- bench/runs/runO-runtime-escalate/aggregate.json (not served here)
- bench/runs/runO-runtime-escalate/per_question.json (not served here)
- bench/runs/runP-v35/aggregate.json (not served here)
- bench/runs/runP-v35/per_question.json (not served here)
- bench/runs/smoke-D-temporal/aggregate.json (not served here)
- bench/runs/smoke-D-temporal/per_question.json (not served here)
- bench/runs/smoke-ablate-test/aggregate.json (not served here)
- bench/runs/smoke-ablate-test/per_question.json (not served here)
- bench/runs/smoke-guard/aggregate.json (not served here)
- bench/runs/smoke-guard/per_question.json (not served here)
- bench/runs/smoke-qa/per_question.json (not served here)
- bench/runs/smoke-v31/aggregate.json (not served here)
- bench/runs/smoke-v31/per_question.json (not served here)
- bench/runs/smoke-v32/aggregate.json (not served here)
- bench/runs/smoke-v32/per_question.json (not served here)
- bench/runs/smoke-v33/aggregate.json (not served here)
- bench/runs/smoke-v33/per_question.json (not served here)
- bench/runs/step1-gapfix/aggregate.json (not served here)
- bench/runs/step1-gapfix/per_question.json (not served here)
- bench/runs/step2-dates/aggregate.json (not served here)
- bench/runs/step2-dates/per_question.json (not served here)
- bench/scaffold_arena.py (not served here)
- bench/scaffold_arena_results.md (not served here)
- bench/scaffold_arena_round2.py (not served here)
- bench/scaffold_arena_round2_results.md (not served here)
- bench/scaffold_transfer_validation.md (not served here)
- bench/scaffold_transfer_validation.py (not served here)
- bench/scaffold_transfer_validation_raw.json (not served here)
- bench/sweep_underperformance_diagnosis.md (not served here)
- claude-plugin/.claude-plugin/plugin.json (not served here)
- claude-plugin/.mcp.json (not served here)
- claude-plugin/README.md (not served here)
- claude-plugin/skills/fidelis-memory/SKILL.md (not served here)
- codemeta.json (not served here)
- docker-compose.yml (not served here)
- docs/DISPATCHER_DESIGN.md
- docs/GENERALIZABILITY_SKEPTIC.md
- docs/RELEASE-SCOPE.md
- docs/RELEASING.md
- docs/ROADMAP_CODEX.md
- docs/SCAFFOLD_DISPATCHER_V031.md
- docs/THRESHOLD-AUDIT.md
- docs/claude-code-memory-demo.md
- docs/full-reference.md
- docs/internal/FLAGSHIP-PAPER-DRAFT.md (not served here)
- docs/internal/PUBLISH-PLAN-20260425.md (not served here)
- docs/issue-62-sustained-write-restore-proof-2026-09-23.json (not served here)
- docs/issue-62-sustained-write-restore-proof-2026-09-23.md
- docs/releases/0.1.0.md (not served here)
- docs/releases/0.2.0.md (not served here)
- docs/releases/0.3.0rc1.md (not served here)
- docs/releases/release-readiness-0.1.0.md (not served here)
- docs/scaffold.md
- docs/user-fit.md
- examples/real-world/README.md (not served here)
- examples/real-world/bench-hardset-hit-at-5/README.md (not served here)
- examples/real-world/bench-hardset-hit-at-5/expected.json (not served here)
- examples/real-world/bench-hardset-hit-at-5/input.json (not served here)
- examples/real-world/correction-chain-temporal/README.md (not served here)
- examples/real-world/correction-chain-temporal/expected.json (not served here)
- examples/real-world/correction-chain-temporal/input.json (not served here)
- examples/real-world/mcp-client-config/README.md (not served here)
- examples/real-world/mcp-client-config/expected.json (not served here)
- examples/real-world/mcp-client-config/input-gemini-extension.json (not served here)
- examples/real-world/mcp-client-config/input-mcp.json (not served here)
- examples/real-world/retraction-and-ephemera-read-filter/README.md (not served here)
- examples/real-world/retraction-and-ephemera-read-filter/expected.json (not served here)
- examples/real-world/retraction-and-ephemera-read-filter/input.json (not served here)
- examples/real-world/retraction-and-ephemera-read-filter/pointers.json (not served here)
- examples/real-world/write-gate-screening/README.md (not served here)
- examples/real-world/write-gate-screening/expected.json (not served here)
- examples/real-world/write-gate-screening/input.json (not served here)
- experiments/DECISIONS.md (not served here)
- experiments/E0-baseline/compute_baseline.py (not served here)
- experiments/E0-baseline/receipt.json (not served here)
- experiments/E0-baseline/receipt.md (not served here)
- experiments/E1-decisions.md (not served here)
- experiments/E1-synthesis/adversarial-review.md (not served here)
- experiments/E1-synthesis/qa_eval_v3_E1_runP-v35.json (not served here)
- experiments/E1-synthesis/qa_eval_v3_E1_runP-v35_receipt.json (not served here)
- experiments/E1-synthesis/qa_eval_v3_E1_runP-v35_summary.json (not served here)
- experiments/E1-synthesis/receipt.md (not served here)
- experiments/E2-gpt4o/adversarial-review.md (not served here)
- experiments/E2-gpt4o/qa_eval_v3_E2_runP-v35.json (not served here)
- experiments/E2-gpt4o/qa_eval_v3_E2_runP-v35_receipt.json (not served here)
- experiments/E2-gpt4o/qa_eval_v3_E2_runP-v35_summary.json (not served here)
- experiments/E2-gpt4o/receipt.md (not served here)
- experiments/E2-gpt4o/write_receipt_md.py (not served here)
- experiments/E2a-tr-ablation/qa_eval_v3_E2a_runP-v35.json (not served here)
- experiments/E2a-tr-ablation/qa_eval_v3_E2a_runP-v35_receipt.json (not served here)
- experiments/E2a-tr-ablation/qa_eval_v3_E2a_runP-v35_summary.json (not served here)
- experiments/E2a-tr-ablation/receipt.md (not served here)
- experiments/E3-langstate/PLAN.md (not served here)
- experiments/E3-temporal-fix/PLAN.md (not served here)
- experiments/E4-qtypes/PLAN.md (not served here)
- experiments/E5-final/PLAN.md (not served here)
- experiments/FINAL-REPORT-TEMPLATE.md (not served here)
- experiments/zeroLLM-FLAGSHIP-evidence/F1-smoke-scaffold.json (not served here)
- experiments/zeroLLM-FLAGSHIP-evidence/F1B-smoke-baseline-TR-only.json (not served here)
- experiments/zeroLLM-FLAGSHIP-evidence/F1B-smoke-baseline-partial.json (not served here)
- experiments/zeroLLM-FLAGSHIP-evidence/F2-FULL-scaffold.json (not served here)
- experiments/zeroLLM-FLAGSHIP-evidence/SUMMARY.json (not served here)
- extensions/fidelis-recall.ts (not served here)
- gemini-extension.json
- glama.json (not served here)
- llms.txt (not served here)
- mcp.json
- plugin.json (not served here)
- pyproject.toml (not served here)
- scripts/sustained_write_restore_proof.py (not served here)
- server.json
- src/fidelis/__init__.py (not served here)
- src/fidelis/augment.py (not served here)
- src/fidelis/browse.py (not served here)
- src/fidelis/calibrate.py (not served here)
- src/fidelis/cli.py (not served here)
- src/fidelis/codex_history.py (not served here)
- src/fidelis/cogito_hermeneutics.py (not served here)
- src/fidelis/config.py (not served here)
- src/fidelis/context.py (not served here)
- src/fidelis/degrade.py (not served here)
- src/fidelis/evidence_status.py (not served here)
- src/fidelis/ingest_claude_sessions.py (not served here)
- src/fidelis/ingest_codex_sessions.py (not served here)
- src/fidelis/init_cmd.py (not served here)
- src/fidelis/inquiry.py (not served here)
- src/fidelis/lpci.py (not served here)
- src/fidelis/mcp_cmd.py (not served here)
- src/fidelis/mcp_server.py (not served here)
- src/fidelis/recall.py (not served here)
- src/fidelis/recall_b.py (not served here)
- src/fidelis/recall_hybrid.py (not served here)
- src/fidelis/recall_recent.py (not served here)
- src/fidelis/recall_sessions.py (not served here)
- src/fidelis/relation_envelope.py (not served here)
- src/fidelis/retrieval_telemetry.py (not served here)
- src/fidelis/retrieval_trace.py (not served here)
- src/fidelis/scaffold/__init__.py (not served here)
- src/fidelis/scaffold/_core.py (not served here)
- src/fidelis/scaffold/preflight.py (not served here)
- src/fidelis/scaffold_server.py (not served here)
- src/fidelis/seed.py (not served here)
- src/fidelis/server.py (not served here)
- src/fidelis/session_reference.py (not served here)
- src/fidelis/sessions_cmd.py (not served here)
- src/fidelis/snapshot.py (not served here)
- src/fidelis/supersession.py (not served here)
- src/fidelis/telemetry.py (not served here)
- src/fidelis/temporal.py (not served here)
- src/fidelis/temporal_index.py (not served here)
- src/fidelis/temporal_recall.py (not served here)
- src/fidelis/watch_cmd.py (not served here)
- src/fidelis/write_gate.py (not served here)
- tests/__init__.py (not served here)
- tests/fixtures/relation_envelopes_v1.json (not served here)
- tests/scaffold/test_anthropic_cache_wire.py (not served here)
- tests/scaffold/test_backend_portability.py (not served here)
- tests/scaffold/test_caching_properties.py (not served here)
- tests/scaffold/test_chat_history_compatibility.py (not served here)
- tests/scaffold/test_consumer_surface.py (not served here)
- tests/scaffold/test_e2e_store_query.py (not served here)
- tests/scaffold/test_openai_format_compatibility.py (not served here)
- tests/scaffold/test_real_tokenizer.py (not served here)
- tests/scaffold/test_retrieval_compatibility.py (not served here)
- tests/scaffold/test_runtime_compatibility.py (not served here)
- tests/scaffold/test_scaffold_core.py (not served here)
- tests/scaffold/test_scaffold_graceful_degrade.py (not served here)
- tests/scaffold/test_streaming_marker_integrity.py (not served here)
- tests/scaffold/test_top_score_contract.py (not served here)
- tests/test_broken_pipe_recovery.py (not served here)
- tests/test_browse.py (not served here)
- tests/test_claude_plugin_root.py (not served here)
- tests/test_cli_browse.py (not served here)
- tests/test_codemeta.py (not served here)
- tests/test_context.py (not served here)
- tests/test_dead_letter.py (not served here)
- tests/test_gemini_extension.py (not served here)
- tests/test_graceful_degrade.py (not served here)
- tests/test_graceful_degrade_corruption.py (not served here)
- tests/test_graceful_shutdown.py (not served here)
- tests/test_health_index_lag.py (not served here)
- tests/test_hermes_gate_profile.py (not served here)
- tests/test_init_defects_A_B.py (not served here)
- tests/test_init_plist_contents.py (not served here)
- tests/test_init_uninstall_label.py (not served here)
- tests/test_liveness_endpoint.py (not served here)
- tests/test_mcp_copilot.py (not served here)
- tests/test_mcp_cursor.py (not served here)
- tests/test_mcp_gemini.py (not served here)
- tests/test_mcp_openclaw.py (not served here)
- tests/test_mcp_ping.py (not served here)
- tests/test_mcp_smoke_no_ollama.py (not served here)
- tests/test_mcp_surface_v2.py (not served here)
- tests/test_p0_score_bypass.py (not served here)
- tests/test_pi_recall.mjs (not served here)
- tests/test_port_env_alias.py (not served here)
- tests/test_public_install_truth.py (not served here)
- tests/test_real_world_examples.py (not served here)
- tests/test_recall_b_resilience.py (not served here)
- tests/test_recall_hybrid.py (not served here)
- tests/test_relation_envelope.py (not served here)
- tests/test_relation_envelope_e2e.py (not served here)
- tests/test_server_boots_without_ollama.py (not served here)
- tests/test_session_memory.py (not served here)
- tests/test_smoke.py (not served here)
- tests/test_superseded_not_dropped.py (not served here)
- tests/test_supersession.py (not served here)
- tests/test_telemetry.py (not served here)
- tests/test_telemetry_kill_actually_kills.py (not served here)
- tests/test_temporal.py (not served here)
- tests/test_temporal_index.py (not served here)
- tests/test_temporal_recall.py (not served here)
- tests/test_time_aware_acceptance.py (not served here)
- tests/test_user_id_namespace_isolation.py (not served here)
- tests/test_verify_guard.py (not served here)
- tests/test_watch_backpressure.py (not served here)
- tests/test_write_fallback_contract.py (not served here)
- tests/test_write_gate.py (not served here)
- tests/test_write_truthfulness.py (not served here)
- tests/test_zero_llm_regression.py (not served here)
Advantages
- Retrieves original passages verbatim by default, avoiding potential inaccuracies introduced by generative summarization. evidence: README.md
- Supports hybrid search combining BM25 and dense-vector retrieval for improved accuracy. evidence: README.md
- Maintains historical integrity by allowing corrections to supersede records without erasing the original data. evidence: README.md
Limitations
- Requires a local Ollama service for embedding generation. evidence: README.md
- Currently a single-machine pre-release and not a hosted team memory service. evidence: README.md
- Retrieved text may still be outdated or incorrect depending on the quality of the stored information. evidence: README.md
Security
Risk level: Low risk
This brain runs
Agent instructions that run or fetch something (4)
.agents/skills/fidelis/SKILL.md:Wiring an MCP memory tool into Claude Code, Codex, GitHub Copilot CLI, Gemini CLI, or OpenClaw via `fidelis mcp install`.agents/skills/fidelis/SKILL.md:Executable name is `fidelis`, not `fidelis-memory` — `uvx fidelis-memory` fails;.agents/skills/fidelis/SKILL.md:use `uvx --from fidelis-memory fidelis <cmd>`..agents/skills/fidelis/SKILL.md:install `fidelis-memory`.
Git hooks (1)
.pre-commit-config.yaml:bash -c 'git grep -nE "rbr_lpci" -- ":!.pre-commit-config.yaml" && exit 1 || exit 0'
MCP servers (3)
claude-plugin/.mcp.json(fidelis):uvx --from fidelis-memory==0.3.0rc1 fidelis mcp servegemini-extension.json(fidelis):uvx --from fidelis-memory==0.3.0rc1 fidelis mcp servemcp.json(fidelis):uvx --from fidelis-memory==0.3.0rc1 fidelis mcp serve
- Low risk: network-instructions (.agents/skills/fidelis/SKILL.md:5)
Attribution and licence
- Created by
- Hermes Labs
- Declared authors
- Hermes Labs (declared in pyproject.toml)
- Rolando Bosch Rodriguez (declared in CITATION.cff)
- Publisher
- Hermes Labs (Official Hermes Labs project)
- Source
- hermes-labs-ai/fidelis · commit 9504c4a
- Licence
- Apache License 2.0 (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Hermes Labs.
Install from source
337 of its files are not served here, so there is no ZIP. hermes-labs-ai/fidelis at 9504c4a