AutoMem
Memory framework
First committed by jack-arturo
Published in verygoodplugins/automem. Publisher page
827 GitHub stars
What it is
Long-term memory for AI assistants. Graph + vector store that recalls decisions, relationships, and context across sessions.
AutoGineer overview, from the brain’s own files
AutoMem is a memory service designed to provide AI assistants with persistent, long-term recall. By combining a graph database (FalkorDB) for structured relationships and a vector database (Qdrant) for semantic search, it enables agents to retrieve not just similar snippets, but the context and reasoning behind past decisions. It supports a wide range of AI tools via the Model Context Protocol (MCP) and a REST API, allowing a single memory store to be shared across multiple platforms like Claude, Cursor, and GitHub Copilot. The system includes automated consolidation cycles to manage memory relevance and importance over time, ensuring that the agent's knowledge base remains efficient as history grows.
How it works
Memory model: Hybrid
AutoGineer overview, from the brain’s own files
AutoMem operates as a service with two primary storage layers: FalkorDB for storing memories as nodes with typed relationships, and Qdrant for storing vector embeddings. When an AI client requests a recall, the system performs a hybrid query that combines semantic similarity, graph traversal, and temporal alignment to rank results. A background enrichment pipeline and consolidation engine process memories to maintain relevance, while the MCP bridge allows various AI agents to interact with the memory service locally or remotely.
| Folder | Role | Files |
|---|---|---|
| .github | agent-config | 9 |
| docs | docs | 18 |
| scripts | scripts | 39 |
| tests | tests | 78 |
| .railway | folder | 2 |
| automem | folder | 70 |
| benchmarks | folder | 9 |
| mcp-sse-server | folder | 14 |
The agent reads
- docs/COMPARISON.md evidence: README.md
The agent writes
- benchmarks/EXPERIMENT_LOG.md evidence: AGENTS.md
- docs/ evidence: AGENTS.md
Requirements
Runtimes: Python
Databases: FalkorDB, MongoDB, PostgreSQL, Qdrant, Redis, SQLite
API keys (by name): ADMIN_API_TOKEN, AUTOMEM_API_TOKEN, AUTOMEM_TEST_ADMIN_TOKEN, AUTOMEM_TEST_API_TOKEN, CLASSIFICATION_API_KEY, OPENAI_API_KEY, OPENROUTER_API_KEY, QDRANT_API_KEY, VOYAGE_API_KEY
Works with: Claude Code, OpenAI Codex, GitHub Copilot, Cursor, Kiro, OpenCode, Amp, Cline, JetBrains Junie, Devin (ex-Windsurf)
Set it up
This brain runs code automatically: 1 script. Review Makefile before opening the folder in Claude Code. No step below turns a hook on for you.
Makefile:echo "🔧 Setting up development environment..."; bash scripts/bootstrap_dev.sh; echo "✅ Virtual environment ready!"; echo "💡 Run 'source .venv/bin/activate' to activate"
- Not scanned by AutoGineerThe author’s README also describes installing it from a clone of its repository. Read its install section: AutoGineer did not scan that path. https://github.com/verygoodplugins/automem/blob/1a7ba1a6afe69835f62ad7f6013e33301d1ab83e/README.md#run-it
First committed by jack-arturo. Published in verygoodplugins/automem. Licence: MIT License.
Usage
AutoGineer overview, from the brain’s own files
- Connect local AI tools like Claude Desktop or Cursor to the AutoMem service via the MCP bridge.
- Use the REST API to programmatically store decisions, preferences, and project context.
- Query the memory service to retrieve the reasoning behind past technical choices or project milestones.
- Deploy the memory service on local infrastructure or cloud platforms like Railway for persistent agent access.
- “Why did we choose PostgreSQL?”
- The agent retrieves the decision node, the rationale, and the considered alternatives, providing the context behind the architectural choice.
- “What are our current preferences for message queues?”
- The agent traverses the graph to identify the relationship between Kafka and RabbitMQ, surfacing the team's preference for 'boring technology'.
Documentation by jack-arturo
<p align="center"> <img src="https://automem.ai/img/G_Vd7EYWYAM_3SF.jpeg" alt="AutoMem" width="600" /> </p>
<p align="center"> <a href="https://www.npmjs.com/package/@verygoodplugins/mcp-automem"><img src="https://img.shields.io/npm/v/@verygoodplugins/mcp-automem?label=mcp-automem" alt="npm version" /></a> <a href="LICENSE"><img src="https://img.shields.io/github/license/verygoodplugins/automem" alt="License" /></a> <a href="https://automem.ai/discord"><img src="https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white" alt="Discord" /></a> <a href="https://x.com/automem_ai"><img src="https://img.shields.io/badge/X-@automem__ai-000000?logo=x&logoColor=white" alt="X" /></a> <a href="https://automem.ai/benchmarks"><img src="https://img.shields.io/badge/LoCoMo%20(AMB)-85.1%25-success" alt="LoCoMo on the neutral Agent Memory Benchmark" /></a> <a href="benchmarks/EXPERIMENT_LOG.md#results"><img src="https://img.shields.io/badge/LongMemEval%20full-87.0%25-blueviolet" alt="LongMemEval full on AutoMem's internal harness: 87.0%" /></a> <a href="https://automem.ai/benchmarks"><img src="https://img.shields.io/badge/BEAM%2010M%20(AMB)-57.4%25-success" alt="BEAM 10M on the neutral Agent Memory Benchmark" /></a> <a href="https://railway.com/deploy/automem-ai-memory-service?referralCode=VuFE6g&utm_medium=integration&utm_source=github&utm_campaign=generic"><img src="https://img.shields.io/badge/Deploy%20on-Railway-0B0D0E?logo=railway&logoColor=white" alt="Deploy on Railway" /></a> </p>
<p align="center"> <strong>Long-term memory for AI assistants — fast, private, and yours.</strong> </p>
AutoMem
AutoMem gives your AI a memory that survives the chat.
Save the decisions, preferences, notes, and context that matter. The next time you open Claude, Cursor, Codex, ChatGPT, or another connected assistant, it can bring back the right details instead of making you repeat yourself.
Ask, “Why did we choose PostgreSQL?” and AutoMem can return the decision, the alternatives you considered, the principle behind it, and the work that followed — not just a pile of similarly worded snippets.
Why AutoMem feels different
No LLM call in the middle of recall. AutoMem looks up memories directly through its graph and vector index. That keeps normal retrieval fast and avoids an extra generative-LLM charge every time your assistant needs context. It still uses embeddings — from Voyage, OpenAI, or a local provider — and optional enrichment can add more structure over time.
More than vector search. A vector match finds something similar; AutoMem also records typed relationships between memories. It can follow the connections between a decision, its rationale, and its consequences, so your assistant has a better chance of returning the why, not only the words it recognizes.
One memory across your tools. Use the local MCP bridge with Claude Desktop, Cursor, Claude Code, Codex, Copilot, and more. For cloud agents, Remote MCP connects the same service to ChatGPT Developer Mode, Claude.ai, and ElevenLabs over HTTPS. Your memory is not locked to one chat app.
Own the data and the setup. Run AutoMem locally with Docker, on your own infrastructure, or as a small Railway service group. It exposes both MCP and a REST API, so it fits into the tools and workflows you already use.
Proven where long context gets hard
On the independent Agent Memory Benchmark's BEAM long-context tests, AutoMem scored 57.4% at 10 million source tokens while giving the answerer an average of only ~2.6–4.8k retrieved tokens. That is the kind of efficiency that lets memory stay useful as an agent's history grows.
The full picture — test setup, raw outputs, methodology, historical runs, and reproduction commands — is in automem.ai/benchmarks and benchmarks/EXPERIMENT_LOG.md.
How it works
AutoMem combines two storage layers behind a single API:
FalkorDB stores memories as nodes with 11 typed relationships between them. The graph is the canonical record.
Qdrant stores an embedding for every memory. Recall is a hybrid query — semantic similarity, graph traversal, temporal alignment, tag overlap, and importance — ranked by a 9-component score.
flowchart TB
subgraph service [AutoMem Service Flask]
API[REST API<br/>Memory Lifecycle]
Enrichment[Background Enrichment<br/>Pipeline]
Consolidation[Consolidation<br/>Engine]
Backups[Automated Backups<br/>Optional]
end
subgraph storage [Dual Storage Layer]
FalkorDB[(FalkorDB<br/>Graph Database)]
Qdrant[(Qdrant<br/>Vector Database)]
end
Client[AI Client] -->|Store/Recall/Associate| API
API --> FalkorDB
API --> Qdrant
Enrichment -->|11 edge types<br/>Pattern nodes| FalkorDB
Enrichment -->|Semantic search<br/>1024-d vectors| Qdrant
Consolidation --> FalkorDB
Consolidation --> Qdrant
Backups -.->|Optional| FalkorDB
Backups -.->|Optional| QdrantIf Qdrant is unavailable, the graph still serves recall in a degraded mode. If FalkorDB is down, the API returns 503 — the graph is the source of truth.
Multi-hop bridge discovery
Ask "why boring tech for Kafka?" and AutoMem doesn't just match the word "Kafka". It traverses the graph from the seed memories to find the bridge that connects them:
Seed 1: "Migrated to PostgreSQL for operational simplicity"
Seed 2: "Evaluating Kafka vs RabbitMQ for message queue"
Bridge: "Team prefers boring technology — proven, debuggable systems"
Both seeds carry an EXEMPLIFIES edge to the bridge memory. AutoMem ranks the bridge above the seeds and surfaces it in the recall response, so the assistant answers with your reasoning, not isolated facts. Tune via expand_relations, relation_limit, and expansion_limit on GET /recall.
11 authorable relationship types
| Type | Use case | Example |
|---|---|---|
RELATES_TO | General connection | Bug report → Related issue |
LEADS_TO | Causal relationship | Problem → Solution |
OCCURRED_BEFORE | Temporal sequence | Planning → Execution |
PREFERS_OVER | User preferences | PostgreSQL → MongoDB |
EXEMPLIFIES | Pattern examples | Code review → Best practice |
CONTRADICTS | Conflicting info | Old approach → New approach |
REINFORCES | Supporting evidence | Decision → Validation |
INVALIDATED_BY | Outdated info | Legacy docs → Current docs |
EVOLVED_INTO | Knowledge evolution | Initial design → Final design |
DERIVED_FROM | Source tracking | Implementation → Spec |
PART_OF | Hierarchical structure | Feature → Epic |
Three more edge types are added automatically by the enrichment pipeline and consolidation engine: SIMILAR_TO, PRECEDED_BY, and DISCOVERED.
Memory consolidation, neuroscience-inspired
AutoMem implements biological memory consolidation cycles. Wrong rabbit holes fade naturally. Important memories with strong connections strengthen over time.
| Cycle | Frequency | Purpose |
|---|---|---|
| Decay | Daily | Exponential relevance scoring (age, access, connections, importance) |
| Creative | Weekly | REM-like processing that discovers non-obvious connections |
| Cluster | Monthly | Groups similar memories, generates meta-patterns |
| Forget | Off by default | Archives low-relevance memories (<0.2), deletes very old (<0.05) |
Tune intervals via CONSOLIDATION_*_INTERVAL_SECONDS. See docs/ENVIRONMENT_VARIABLES.md.
For more on the recall scoring formula, enrichment internals, and how AutoMem differs from RAG and pure vector databases, see docs/COMPARISON.md.
Research foundation
AutoMem implements techniques from peer-reviewed memory research:
HippoRAG 2 (Ohio State, 2025) — graph + vector hybrid for associative memory
A-MEM (2025) — Zettelkasten-inspired dynamic memory organization
MELODI (DeepMind, 2024) — gist-based memory compression
ReadAgent (DeepMind, 2024) — episodic memory for context extension
Full writeups, findings, and how AutoMem implements each → docs/RESEARCH.md.
Run it
Railway (60 seconds)
Recommended Railway projects run AutoMem as a small service group: automem (the API), automem-graph-viewer (the standalone UI), falkordb (graph), qdrant (vectors), and mcp-automem (the MCP bridge for ChatGPT, Claude.ai, and ElevenLabs). Services use pre-built Docker images and auto-redeploy on :stable, so Railway does not spend compute rebuilding source.
→ Full setup: INSTALLATION.md
Docker Compose (local)
git clone https://github.com/verygoodplugins/automem.git
cd automem
make dev| Service | URL | Purpose |
|---|---|---|
| AutoMem API | http://localhost:8001 | Memory REST API |
| FalkorDB | localhost:6379 | Graph database |
| Qdrant | localhost:6333 | Vector database |
| FalkorDB Browser | http://localhost:3000 | Local graph inspection UI |
Database and browser ports bind to localhost by default; the API binding is unchanged.
→ Full setup: INSTALLATION.md
Python (development)
make install
source .venv/bin/activate
PORT=8001 python app.pyRequires Python 3.10+ (3.12 recommended). → INSTALLATION.md
Contributing: feature PRs target the develop branch. main only moves via validated release merges, so users deploying from main (e.g. Railway auto-deploys) see one deploy per release instead of one per PR.
Connect your AI
| Client | Mode | Setup |
|---|---|---|
| Claude Desktop, Cursor, Claude Code, Codex, Copilot, Antigravity | Local MCP bridge | npx @verygoodplugins/mcp-automem setup |
| ChatGPT (developer mode), Claude.ai web/mobile, ElevenLabs Agents | Remote MCP (HTTPS) | docs/MCP_SSE.md |
| Anything else | Direct REST API | docs/API.md |
The MCP bridge is published as @verygoodplugins/mcp-automem. It handles client-specific config (rules files, hooks, templates) and proxies to your AutoMem service — local or Railway.
Direct API call:
import requests
token = "your-automem-api-token"
requests.post(
"https://your-automem.railway.app/memory",
headers={"Authorization": f"Bearer {token}"},
json={
"content": "Chose PostgreSQL over MongoDB for ACID compliance",
"type": "Decision",
"tags": ["database", "architecture"],
"importance": 0.9,
},
)Screenshots
<!-- CAPTURE CHECKLIST — replace each placeholder image once captured: 1. docs/img/graph-recall.png — FalkorDB browser at http://localhost:3000 showing a memory node with multiple typed edges visible (PREFERS_OVER, EXEMPLIFIES, RELATES_TO). Proves the graph is real. 2. docs/img/claude-recall.png — Claude Desktop conversation where the assistant cites a recalled memory inline, with the AutoMem MCP tool call visible in the trace. 3. docs/img/railway-services.png — Railway dashboard showing the production service group (automem, automem-graph-viewer, mcp-automem, qdrant, falkordb). A version exists as a GitHub user-attachment in INSTALLATION.md; capture a clean version and host it in-repo. Until each PNG exists, the table cells will render as broken-image icons on GitHub. -->
Screenshots will be added once the referenced in-repo image assets are available.
Known limitations
AutoMem is pre-1.0 and honest about its rough edges. The active ones for recall quality:
Tags are a hard gate, not a soft boost. Tags filter before scoring, so a memory missing the queried tag won't surface even on a perfect semantic match. Within a tag scope, high-importance off-topic memories can still over-rank — mitigated by the opt-in
RECALL_RELEVANCE_GATE, not yet on by default (#130).Temporal and preference updates. Recall doesn't yet reliably prefer the newest version of a conflicting fact, or fully resolve multi-session preference updates. The
RECALL_RECENCY_BIAS=autore-rank helps temporal-intent queries but stays opt-in pending broader validation (#158, #159).The MCP SSE bridge doesn't forward
state_mode. The HTTP recall API supports it; the SSE proxy doesn't pass it through yet (#172).Entity-node synthesis is experimental and off by default. First-class
Entitynodes (IDENTITY_SYNTHESIS_ENABLED) are gated off while people-entity word-pair noise is addressed (#181).
Docs, community, and license
Setup
Installation guide — Railway, Docker, development
Qdrant setup — vector database configuration
Environment variables — full reference
API and integration
API reference — endpoints, scoring, enrichment
Remote MCP — ChatGPT, Claude.ai, ElevenLabs
Migrations — embedding dimensions, 0.16.0 data migrations, MCP SQLite import
Research and comparison
Research foundation — papers and how AutoMem implements them
Comparison — vs. RAG, vector DBs, building your own
Benchmark history — internal LoCoMo / LongMemEval harness runs + the neutral AMB (BEAM + Core-3) summary
AMB head-to-head + reproducibility — neutral Agent Memory Benchmark results and the
AUTOMEM_REPRODUCE.md"run it yourself" recipe
Operations
Scripts — maintenance, migration, recovery, and eval tooling, by lifecycle
Testing guide — unit, integration, benchmarks
Community
automem.ai — official site
Discord — community chat
X / @automem_ai — updates
YouTube / @AutoJackBot — tutorials
GitHub issues — bugs and feature requests
Sibling repos
mcp-automem— universal MCP bridge / install funnelautomem-evals— exploratory recall-quality labautomem-graph-viewer— standalone graph visualization
MIT licensed. Deploy anywhere. No vendor lock-in.
docs/API.md
AutoMem API Reference
This document lists the primary API endpoints and examples. JSON responses include status and primary payload fields for LLM-friendliness unless an endpoint explicitly returns a binary payload.
Authentication
All endpoints except
/healthrequire authentication via one of:Authorization: Bearer <AUTOMEM_API_TOKEN>header (recommended)X-API-Key: <AUTOMEM_API_TOKEN>header?api_key=<AUTOMEM_API_TOKEN>query parameter
Admin endpoints additionally require
X-Admin-Token: <ADMIN_API_TOKEN>orX-Admin-Api-Key: <ADMIN_API_TOKEN>. Both headers are allowed by browser CORS preflight; configuredVIEWER_ALLOWED_ORIGINSrestrictions and admin authorization still apply.GET /backupis admin-only and does not accept the regular API token by itself.
Health
GET
/healthReturns overall status and service connectivity.
Memory
Explicit type values on POST, PATCH and batch writes must be non-empty strings.
Known aliases normalize to canonical types (for example, insight → Insight,
decision → Decision, analysis → Insight). Unknown custom strings remain
unchanged for compatibility and produce a warning. Omit type to classify a new
memory automatically or preserve an existing type on PATCH. Existing stored types
are not migrated by this change.
POST
/memoryBody:
{ "content": "...", "tags": ["tag"], "importance": 0.7, "metadata": {} }Response:
{ "status": "success", "memory_id": "...", ... }
GET
/memory/{id}Response:
{ "status": "success", "memory": { ... } }Errors:
404if memory is missing,500on query failure,503if graph database is unavailable.
PATCH
/memory/{id}Body: any subset of fields (
content,tags,importance,type,confidence,timestamp,metadata)Response:
{ "status": "success", "memory_id": "..." }
DELETE
/memory/{id}Response:
{ "status": "success", "memory_id": "..." }
GET
/memory/by-tag?tags=foo&tags=bar&limit=20&offset=0Response:
{ "status": "success", "tags": ["foo","bar"], "count": N, "limit": 20, "offset": 0, "has_more": false, "memories": [...] }
DELETE
/memory/by-tag?tags=foo&tags=barResponse:
{ "status": "success", "tags": ["foo","bar"], "deleted_count": N }
POST
/associateBody:
{ "memory1_id": "...", "memory2_id": "...", "type": "RELATES_TO", "strength": 0.9 }Batch body:
{ "associations": [{ "memory1_id": "...", "memory2_id": "...", "type": "RELATES_TO", "strength": 0.9 }] }(max 500)Single response:
{ "status": "success", ... }Batch response:
{ "status": "success"|"partial_success", "created_count": C, "failed_count": F, "succeeded": [...], "failed": [...], "summary": "C/M associations created successfully" }Batch requests return
201when every item succeeds and207when one or more items fail validation or reference missing memories.typeaccepts only the 11 authorable semantic relationship types. System-generated labels such asSIMILAR_TO,PRECEDED_BY, andDISCOVEREDare readable/filterable but cannot be created via this endpoint.
Recall
GET
/recallBasic parameters:
query,limit,tags,exclude_tags,tag_mode(any|all),tag_match(prefix|exact, default prefix),time_query(e.g. "last week"),start,end,embeddingexclude_tags- Comma-separated list or multiple params to exclude memories containing ANY of these tags. Supports both exact and prefix matching (independent oftag_match). Example:exclude_tags=conversation_5orexclude_tags=temp,draft
Tag semantics (per retrieval path):
tagsis a hard scope filter on the vector, keyword, metadata-sidecar, and tag-only fallback paths: memories without a matching tag are excluded before scoring.Graph/entity expansion bypasses the tag scope by default; pass
expand_respect_tags=trueto keep expanded results inside the scope.context_tagsis the soft-boost channel: it raises matching results' scores without excluding anything.Within the tag-scoped pool, query-independent score components (importance, confidence, recency, tag overlap) can be ramped down for results with little topical evidence via the
RECALL_RELEVANCE_GATEenv var (default0.0= off; see ENVIRONMENT_VARIABLES.md).scope_fallback(boolean, defaultfalse) - When tag-scoped results come up short oflimitand a text/semantic query is present, fill the remaining slots from an unscoped vector search. Fills are appended after all scoped results (never interleaved with or displacing them) and each carries"outside_tag_scope": true. Fills get filter parity with the scoped path:exclude_tags, time filters,min_score, and current-state filtering (payload-level reasons plus graph-edge supersession) all still apply — only the tags scope is lifted. Candidates whose tags match the request'stagsare never returned as fills: they are in-scope by definition (already returned, or dropped by a score filter) and are not resurrected.
Ordering:
sort(ororder_by) supports:score(default) - hybrid relevance/importance ranking; exact score ties order newest-firsttime_desc/time_asc- chronological ordering byupdated_at/timestampwithin the filter window (use for "what happened since X")updated_desc/updated_asc- explicit alias (same ordering key as time_*)
Recency bias:
recency_bias=auto|on|off(default fromRECALL_RECENCY_BIASenv, shipsoff) - relative-recency re-rank for score ordering: candidate timestamps are min-max normalized across the result set andSEARCH_WEIGHT_TEMPORAL × relative_recencyis added to each final score, so the newest version of a conflicting fact can outrank an older, heavier one.autoactivates only when the query expresses temporal intent ("latest", "current", "what changed", ...). The response echoes"recency_bias": "on"whenever the mode activated for the request (on, orautowith temporal intent on a score-sorted, non-empty result set) — even if the re-rank was a no-op; results carry atemporalscore component only when the re-rank actually adjusted scores (zero timestamp spread or zeroSEARCH_WEIGHT_TEMPORALechoes the flag without adding the component).State filtering:
state_mode=current|historycontrols whether recall returns only currently valid state or full state history. Default:current.currentis equivalent tocurrent_only=true: suppresses memories that are expired, not yet valid, archived, or invalidated/evolved by active replacements. Supersession chains (INVALIDATED_BY/EVOLVED_INTO) are resolved to their head — A→B→C surfaces C — bounded at 5 hops and cycle-safe; the surfaced head'sstate_replaces/relations[].fromprovenance still points at the originally suppressed memory.historyis equivalent tocurrent_only=false: returns stale and future state when it matches the query/filter.In
currentmode, inlinerelations[].memorypayloads follow the same lifecycle rules. Obsolete or unverifiable targets retain only theirid; edge type, strength, and provenance remain available. Usehistorymode to retrieve historical inline content.current_onlyremains supported for backward compatibility and wins overstate_modewhen both resolve to a value. A malformedstate_modeis still rejected with400even whencurrent_onlyis supplied — the value is validated before precedence is applied.state_debug=trueincludes suppression/replacement details instate_filter.
Context hints:
context,language,active_path,context_tags,context_types,priority_idsMetadata sidecar search: Text queries can admit bounded metadata candidates when the query strongly matches whitelisted metadata values. This is enabled by default and controlled by
RECALL_METADATA_SEARCH_ENABLED; no extra request parameter is required.Graph expansion:
expand_relations- Follow graph edges from seed results to related memoriesexpand_entities- Multi-hop reasoning via entity tags (finds "Amanda → Rachel" then "Rachel's job")relation_limit- Max relations per seed (default: 5)expansion_limit- Total max expanded memories (default: 25)
Expansion filtering (reduce noise in expanded results):
expand_min_importance- Minimum importance (0-1) for expanded memories. Seed results are never filtered, only expanded ones. Recommended: 0.3-0.5 for broad context, 0.6+ for focused results.expand_min_strength- Minimum relation strength (0-1) to traverse during graph expansion. Only edges above this threshold are followed. Recommended: 0.3 for exploratory, 0.6+ for high-confidence connections.
Response:
{ "status": "success", "results": [...], "count": M, "state_mode": "current", "context_priority": {...} }Echoed filters (for debugging):
tags,exclude_tags,tag_mode,tag_matchWhen
tagswere passed, the response includes scope diagnostics:tag_scope: { "filtered": true, "pool_size_hint": <int|null>, "gated_low_evidence": <int> }—pool_size_hintis the post-tag-filter, pre-limit vector candidate count (null when no semantic query ran, e.g. tag-only recall), andgated_low_evidencecounts returned results whose score components were ramped down byRECALL_RELEVANCE_GATE. Note the hint is capped by the vector fetch limit and sums per-query counts when the request decomposes into multiple queries (queries[]/auto_decompose), so the same memory can be counted more than once — treat it as a rough pool-size signal, not an exact count.scope_fallback: trueis echoed when the fallback ran.Echoed state:
state_modealways reflects the resolved mode aftercurrent_onlyprecedence. When current-state filtering runs,state_filtermay include suppressed and replacement IDs, includingINVALIDATED_BY,EVOLVED_INTO, andCONTRADICTShandling details whenstate_debug=true.When
expand_entities=true: includesentity_expansion: { enabled, expanded_count, entities_found }When
expand_relations=true: includesexpansion: { enabled, seed_count, expanded_count, relation_limit }
Expansion Filtering Example:
# Get architecture decisions with related context, but filter out low-importance noise
GET /recall?query=database%20architecture&expand_relations=true&expand_min_importance=0.5&expand_min_strength=0.3Exclude Tags Example:
# Get long-term memories from all conversations EXCEPT the current one
GET /recall?tags=user_1&exclude_tags=conversation_5&limit=3
# Exclude multiple conversations
GET /recall?tags=user_1&exclude_tags=conversation_5,conversation_6&limit=5
# Exclude temporary/draft memories
GET /recall?query=project%20plan&exclude_tags=temp,draft&limit=10Current-State Recall Examples:
# Default: return active/current state only
GET /recall?query=current%20project%20plan
# Historical audit: include expired, future, invalidated, and evolved facts
GET /recall?query=project%20plan&state_mode=historyGET
/memories/{id}/relatedQuery:
relationship_types,max_depth(1..3),limit(<=200)Default traversal uses the 11 authorable semantic relationship types.
Explicit opt-ins may include
SIMILAR_TO,PRECEDED_BY, andDISCOVERED.Response:
{ "status": "success", "related_memories": [...] }
GET
/startup-recallReturns critical lessons and system rules.
GET
/analyzeReturns analytics (type counts, preferences, temporal insights, entities, confidence distribution).
Enrichment
Background and JIT enrichment merge derived tags and metadata into the latest stored memory using an atomic graph comparison, so a concurrent PATCH does not lose caller fields. A content edit during extraction cancels the stale result; background enrichment reports a retryable conflict and JIT skips that write. Qdrant updates touch only derived metadata keys and guard tag replacement against the source tags. Background relationship mutations are planned before the content/timestamp comparison. The source guard, relationship mutations, derived graph fields and completion flag then commit in one graph query, so a PATCH cannot interleave between them. A planned neighbor disappearing before commit is skipped without dropping the source row. Temporal counts and pattern observation/confidence increments represent unique per-memory evidence, so retries and forced reprocessing do not inflate them. A content or timestamp edit before commit rejects the obsolete plan. Graph and vector writes remain separate: a content edit after the graph commit can leave derived entity/enrichment metadata stale in Qdrant until payload repair or re-embedding, but does not replace the caller's content, tags or unrelated metadata keys. The remaining cross-store consistency work is tracked in #270.
GET
/enrichment/statusResponse: queue size, inflight/pending, stats, plus a
classificationblock with type-classification counters (llm_attempts,llm_successes,fallbacks,pattern_classifications,last_error,last_error_at) for monitoring LLM-classification fallback rate, and acircuitblock withopen,circuit_open_skips, andrecoveriesfor monitoring quota-circuit state.
POST
/enrichment/reprocessBody:
{ "ids": ["..."] }or query?ids=a,b,cResponse:
{ "status": "queued", "count": N }
Admin
GET
/backupHeaders: requires
X-Admin-Token: <ADMIN_API_TOKEN>orX-Admin-Api-Key: <ADMIN_API_TOKEN>.Query: optional
include=falkordb,qdrant; defaults to both. Useinclude=falkordborinclude=qdrantfor a partial export.Response: binary
application/gzipattachment namedautomem-backup-<timestamp>.tar.gz.Archive contents are restore-compatible:
falkordb/falkordb_<timestamp>.json.gzand/orqdrant/qdrant_<timestamp>.json.gz.Example:
curl -H "X-Admin-Token: $ADMIN_API_TOKEN" "$AUTOMEM_API_URL/backup" -o snapshot.tar.gz
POST
/admin/reembedHeaders: requires both API and Admin tokens.
Body:
{ "batch_size": 32, "limit": 100, "force": false }Response:
{ "status": "complete", "processed": N, "failed": K }
Consolidation
POST
/consolidateBody:
{ "mode": "full"|"decay"|"creative"|"cluster"|"forget", "dry_run": true }Response:
{ "status": "success", "consolidation": {...} }
GET
/consolidate/statusResponse:
{ "status": "success", "next_runs": {...}, "history": [...] }
Stream
GET
/streamAuthenticated SSE feed of in-process memory operations. Each event is
data: {json}with{ "type", "timestamp", "data" }. Keepalive comments (: keepalive) are sent every 30 seconds.Event types:
memory.store— single store (id,content_preview,type,importance,tags,size_bytes,elapsed_ms,count: 1) or batch store (count,ids,content_preview,elapsed_ms)memory.recall— ranked recall (query,limit,result_count,elapsed_ms,tags)memory.update— patch (id,content_preview,type,importance,tags,fields)memory.delete— single delete (id,count: 1) or bulk-by-tag (count,tags)memory.associate— single edge (memory1_id,memory2_id,relation_type,strength,count: 1) or batch (count,failed_count,relation_types)enrichment.start/enrichment.complete/enrichment.failedconsolidation.run
Failed validation (
4xx) does not emit. Watch withpython scripts/automem_watch.py --url … --token …; see the scripts catalog for its usage and safety notes.
GET
/stream/statusResponse:
{ "subscribers": N }
Notes
Inclusion tag matching (
tags) supports exact and prefix semantics; vector searches are filtered by tag conditions when provided. Inclusion prefix matching follows hierarchy segments separated by:or/:auth/loginmatchesauth:login:password, whileauthdoes not matchauth-login. Exact matching retains delimiter spelling (auth/loginandauth:loginare distinct exact tags).Legacy graph nodes without
tag_prefixesretain a hierarchy-aware fallback. Legacy Qdrant points require their prefix payload to be backfilled for vector prefix filtering: runpython scripts/backfill_tag_prefixes.py --dry-run, review the changes, then run without--dry-runagainst the intended graph and Qdrant collection. Use--force-qdrantif graph prefixes already exist but vector payloads need repair. No backfill runs automatically.Exclusion filtering (
exclude_tags) removes any memory containing ANY of the excluded tags. Exclusions retain raw string-prefix matching regardless oftag_match:exclude_tags=authremoves bothauth:loginandauth-login, and slash/colon spelling is not normalized for exclusions.Time filtering accepts ISO timestamps (
start,end) or a natural expression viatime_query.Context hints boost matching preferences (e.g., Python coding style) and guarantee at least one anchor memory when applicable; responses echo what was applied via
context_priority.
Operational logging
Application events such as
memory_stored,batch_storedandrecall_completeappend JSON fields to the existing timestamp/level/logger/message format. Fields include counts, latency and storage status; recall query text is omitted.Werkzeug access logs redact URL query strings while retaining request methods, paths, protocols and response statuses. Vector-search debug logs omit query text.
Records without extra fields keep the plain format. Unsupported extra values use placeholders, and exception logs retain their tracebacks.
273 files · 249 not served here
- .cursorignore (not served here)
- .dockerignore (not served here)
- .env.example (not served here)
- .flake8 (not served here)
- .gitattributes (not served here)
- .github/workflows/backup.yml (not served here)
- .github/workflows/benchmarks-dispatch.yml (not served here)
- .github/workflows/ci.yml (not served here)
- .github/workflows/docker-build-mcp-automem.yml (not served here)
- .github/workflows/docker-build.yml (not served here)
- .github/workflows/docs-dispatch.yml (not served here)
- .github/workflows/mcp-parity.yml (not served here)
- .github/workflows/release-please.yml (not served here)
- .github/workflows/semantic-pr-title.yml (not served here)
- .gitignore (not served here)
- .nixpacksignore (not served here)
- .pre-commit-config.yaml (not served here)
- .python-version (not served here)
- .railway/backup-falkordb.sh (not served here)
- .railway/falkordb.Dockerfile (not served here)
- .secrets.baseline (not served here)
- AGENTS.md
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CHANGELOG.md
- CLAUDE.md
- Dockerfile (not served here)
- INSTALLATION.md
- LICENSE
- Makefile (not served here)
- README.md
- app.py (not served here)
- automem/__init__.py (not served here)
- automem/analytics/__init__.py (not served here)
- automem/analytics/runtime_helpers.py (not served here)
- automem/api/admin.py (not served here)
- automem/api/auth_helpers.py (not served here)
- automem/api/backup.py (not served here)
- automem/api/consolidation.py (not served here)
- automem/api/enrichment.py (not served here)
- automem/api/entity.py (not served here)
- automem/api/graph.py (not served here)
- automem/api/health.py (not served here)
- automem/api/memory.py (not served here)
- automem/api/recall.py (not served here)
- automem/api/runtime_bootstrap.py (not served here)
- automem/api/runtime_memory_routes.py (not served here)
- automem/api/runtime_recall_routes.py (not served here)
- automem/api/stream.py (not served here)
- automem/api/viewer.py (not served here)
- automem/app_helper_bindings.py (not served here)
- automem/backup.py (not served here)
- automem/classification/__init__.py (not served here)
- automem/classification/memory_classifier.py (not served here)
- automem/config.py (not served here)
- automem/consolidation/entity_dedup.py (not served here)
- automem/consolidation/identity_synthesis.py (not served here)
- automem/consolidation/runtime_bindings.py (not served here)
- automem/consolidation/runtime_helpers.py (not served here)
- automem/consolidation/runtime_routes.py (not served here)
- automem/consolidation/runtime_scheduler.py (not served here)
- automem/embedding/__init__.py (not served here)
- automem/embedding/fastembed.py (not served here)
- automem/embedding/ollama.py (not served here)
- automem/embedding/openai.py (not served here)
- automem/embedding/placeholder.py (not served here)
- automem/embedding/provider.py (not served here)
- automem/embedding/provider_init.py (not served here)
- automem/embedding/runtime_bindings.py (not served here)
- automem/embedding/runtime_helpers.py (not served here)
- automem/embedding/runtime_pipeline.py (not served here)
- automem/embedding/voyage.py (not served here)
- automem/enrichment/__init__.py (not served here)
- automem/enrichment/runtime_bindings.py (not served here)
- automem/enrichment/runtime_helpers.py (not served here)
- automem/enrichment/runtime_orchestration.py (not served here)
- automem/enrichment/runtime_queue_bindings.py (not served here)
- automem/enrichment/runtime_worker.py (not served here)
- automem/runtime_environment.py (not served here)
- automem/runtime_wiring.py (not served here)
- automem/search/runtime_keywords.py (not served here)
- automem/search/runtime_recall_helpers.py (not served here)
- automem/search/runtime_relations.py (not served here)
- automem/service_runtime.py (not served here)
- automem/service_runtime_bindings.py (not served here)
- automem/service_state.py (not served here)
- automem/stores/graph_store.py (not served here)
- automem/stores/runtime_clients.py (not served here)
- automem/stores/vector_payload.py (not served here)
- automem/stores/vector_store.py (not served here)
- automem/sync/accounting.py (not served here)
- automem/sync/runtime_bindings.py (not served here)
- automem/sync/runtime_worker.py (not served here)
- automem/utils/__init__.py (not served here)
- automem/utils/entity_extraction.py (not served here)
- automem/utils/entity_quality.py (not served here)
- automem/utils/graph.py (not served here)
- automem/utils/scoring.py (not served here)
- automem/utils/tags.py (not served here)
- automem/utils/text.py (not served here)
- automem/utils/time.py (not served here)
- automem/utils/validation.py (not served here)
- benchmarks/EXPERIMENT_LOG.md (not served here)
- benchmarks/baselines/health_baseline.json (not served here)
- benchmarks/baselines/locomo-mini_baseline.json (not served here)
- benchmarks/baselines/postmerge-20261022.json (not served here)
- benchmarks/baselines/pr266-tag-prefix-20261021.json (not served here)
- benchmarks/postmortems/.gitkeep (not served here)
- benchmarks/postmortems/2026-03-11_issue74_entity_expansion_precision.md (not served here)
- benchmarks/postmortems/2026-03-11_pr80_enhanced_recall.md (not served here)
- benchmarks/postmortems/2026-03-12_issue79_priority_ids_fetch.md (not served here)
- consolidation.py (not served here)
- docker-compose.yml (not served here)
- docs/AGENT_TEMPLATE.md
- docs/API.md
- docs/BENCHMARK_JUDGE_POLICY.md
- docs/COMPARISON.md
- docs/ENVIRONMENT_VARIABLES.md (not served here)
- docs/EVALS_CONTRACT.md
- docs/HEALTH_MONITORING.md
- docs/MCP_SSE.md
- docs/MCP_TRANSPORT_PARITY.md
- docs/METADATA_BEHAVIOR.md
- docs/MIGRATIONS.md
- docs/MONITORING_AND_BACKUPS.md
- docs/QDRANT_SETUP.md
- docs/RAILWAY_DEPLOYMENT.md
- docs/RECALL_QUALITY_LAB.md
- docs/RESEARCH.md
- docs/TESTING.md
- docs/img/qdrant-configuration.jpg (not served here)
- mcp-sse-server/Dockerfile (not served here)
- mcp-sse-server/README.md (not served here)
- mcp-sse-server/package-lock.json (not served here)
- mcp-sse-server/package.json (not served here)
- mcp-sse-server/parity/clients.js (not served here)
- mcp-sse-server/parity/fake-automem.js (not served here)
- mcp-sse-server/parity/normalize.js (not served here)
- mcp-sse-server/parity/scenarios.js (not served here)
- mcp-sse-server/railway.json (not served here)
- mcp-sse-server/server.js (not served here)
- mcp-sse-server/test/parity.test.js (not served here)
- mcp-sse-server/test/recall-parity.test.js (not served here)
- mcp-sse-server/test/server.test.js (not served here)
- mcp-sse-server/test/sse-sessions.test.js (not served here)
- pyproject.toml (not served here)
- pytest.ini (not served here)
- railway.json (not served here)
- railway.toml (not served here)
- requirements-dev.txt (not served here)
- requirements.txt (not served here)
- run-integration-tests.sh (not served here)
- scripts/Dockerfile.health-monitor (not served here)
- scripts/README.md (not served here)
- scripts/audit_relevance.py (not served here)
- scripts/automem_watch.py (not served here)
- scripts/backfill_tag_prefixes.py (not served here)
- scripts/backup_automem.py (not served here)
- scripts/bench/analyze_locomo_results.py (not served here)
- scripts/bench/compare_branch.sh (not served here)
- scripts/bench/compare_configs.sh (not served here)
- scripts/bench/compare_results.py (not served here)
- scripts/bench/health_check.py (not served here)
- scripts/bench/ingest_and_snapshot.sh (not served here)
- scripts/bench/restore_and_eval.sh (not served here)
- scripts/bootstrap_dev.sh (not served here)
- scripts/browse_memories.py (not served here)
- scripts/cleanup_memory_types.py (not served here)
- scripts/deduplicate_qdrant.py (not served here)
- scripts/deploy_check.sh (not served here)
- scripts/health_monitor.py (not served here)
- scripts/lab/clone_production.sh (not served here)
- scripts/lab/configs/baseline.json (not served here)
- scripts/lab/configs/issue78_archive_filter.json (not served here)
- scripts/lab/configs/issue78_combined.json (not served here)
- scripts/lab/configs/issue78_relevance_weight.json (not served here)
- scripts/lab/create_test_queries.py (not served here)
- scripts/lab/lab_corpus.py (not served here)
- scripts/lab/lab_metrics.py (not served here)
- scripts/lab/repair_entity_tags.py (not served here)
- scripts/lab/run_recall_test.py (not served here)
- scripts/lib/common.sh (not served here)
- scripts/migrate_entity_nodes.py (not served here)
- scripts/migrate_mcp_sqlite.py (not served here)
- scripts/reclassify_with_llm.py (not served here)
- scripts/recover_from_qdrant.py (not served here)
- scripts/reembed_embeddings.py (not served here)
- scripts/reenrich_batch.py (not served here)
- scripts/rescore_relevance.py (not served here)
- scripts/restore_from_backup.py (not served here)
- scripts/run_longmemeval_watch.sh (not served here)
- test-live-server-auto.sh (not served here)
- test-live-server.sh (not served here)
- test-locomo-benchmark.sh (not served here)
- test-longmemeval-benchmark.sh (not served here)
- tests/benchmarks/backends.py (not served here)
- tests/benchmarks/core_adapter/evaluate.js (not served here)
- tests/benchmarks/judge_policy.py (not served here)
- tests/benchmarks/judge_preflight.py (not served here)
- tests/benchmarks/longmemeval/__init__.py (not served here)
- tests/benchmarks/longmemeval/analyze_results.py (not served here)
- tests/benchmarks/longmemeval/configs.py (not served here)
- tests/benchmarks/longmemeval/diagnose_failures.py (not served here)
- tests/benchmarks/longmemeval/evaluator.py (not served here)
- tests/benchmarks/longmemeval/test_analysis.py (not served here)
- tests/benchmarks/longmemeval/test_answer_prompt.py (not served here)
- tests/benchmarks/longmemeval/test_diagnose_failures.py (not served here)
- tests/benchmarks/longmemeval/test_evaluator.py (not served here)
- tests/benchmarks/longmemeval/test_longmemeval.py (not served here)
- tests/benchmarks/results/compare_issue74_entity_precision_20260311.json (not served here)
- tests/benchmarks/results/compare_issue79_priority_ids_20260311.json (not served here)
- tests/benchmarks/results/compare_pr80_bm25_only_f10_judge_off.json (not served here)
- tests/benchmarks/results/compare_pr80_judge_off_20260311.json (not served here)
- tests/benchmarks/results/compare_pr80_judge_on_20260311.json (not served here)
- tests/benchmarks/results/longmemeval_baseline_5_4mini_20260425_223943.json (not served here)
- tests/benchmarks/results/longmemeval_baseline_5_4mini_20260425_223943.jsonl (not served here)
- tests/benchmarks/test_locomo.py (not served here)
- tests/benchmarks/test_multihop_quick.py (not served here)
- tests/conftest.py (not served here)
- tests/contracts/test_error_contract.py (not served here)
- tests/contracts/test_routes_contract.py (not served here)
- tests/lab/conftest.py (not served here)
- tests/lab/test_lab_corpus.py (not served here)
- tests/lab/test_lab_metrics.py (not served here)
- tests/lab/test_run_recall_test.py (not served here)
- tests/support/__init__.py (not served here)
- tests/support/fake_graph.py (not served here)
- tests/test_admin_http_regressions.py (not served here)
- tests/test_api_endpoints.py (not served here)
- tests/test_app.py (not served here)
- tests/test_backup_endpoint.py (not served here)
- tests/test_benchmark_backends.py (not served here)
- tests/test_benchmark_env_loading.py (not served here)
- tests/test_benchmark_result_analyzer.py (not served here)
- tests/test_classification_stats.py (not served here)
- tests/test_consolidation_collection.py (not served here)
- tests/test_consolidation_engine.py (not served here)
- tests/test_content_size.py (not served here)
- tests/test_context_tag_separator.py (not served here)
- tests/test_docker_compose_port_security.py (not served here)
- tests/test_embedding_integrity.py (not served here)
- tests/test_embedding_providers.py (not served here)
- tests/test_embedding_runtime_helpers.py (not served here)
- tests/test_enrichment.py (not served here)
- tests/test_enrichment_circuit.py (not served here)
- tests/test_enrichment_concurrent_updates.py (not served here)
- tests/test_enrichment_worker.py (not served here)
- tests/test_entity_identities.py (not served here)
- tests/test_entity_quality.py (not served here)
- tests/test_falkordb_backup_export.py (not served here)
- tests/test_health_monitor.py (not served here)
- tests/test_identity_config.py (not served here)
- tests/test_integration.py (not served here)
- tests/test_keyword_score_normalization.py (not served here)
- tests/test_locomo_benchmark_script.py (not served here)
- tests/test_locomo_cat5_judge.py (not served here)
- tests/test_locomo_speaker_extraction.py (not served here)
- tests/test_longmemeval_benchmark_script.py (not served here)
- tests/test_makefile_targets.py (not served here)
- tests/test_memory_type_validation.py (not served here)
- tests/test_memory_vector_payloads.py (not served here)
- tests/test_metadata_recall_search.py (not served here)
- tests/test_prefix_tag_filters.py (not served here)
- tests/test_recall_artifact_exclusion.py (not served here)
- tests/test_recall_entity_extraction.py (not served here)
- tests/test_recall_overfetch.py (not served here)
- tests/test_recover_from_qdrant.py (not served here)
- tests/test_repair_entity_tags.py (not served here)
- tests/test_runtime_qdrant_init.py (not served here)
- tests/test_service_runtime.py (not served here)
- tests/test_stream_events.py (not served here)
- tests/test_structured_logging.py (not served here)
- tests/test_vector_size_safety.py (not served here)
Advantages
- Avoids redundant LLM calls during recall by using direct graph and vector index lookups. evidence: README.md
- Records typed relationships between memories to surface the 'why' behind decisions rather than just isolated facts. evidence: README.md
- Provides a unified memory store accessible across multiple different AI tools and chat applications. evidence: README.md
Limitations
- Tags act as a hard filter, meaning memories without the queried tag are excluded even if they are semantically relevant. evidence: README.md
- The system does not yet reliably resolve conflicting facts or prioritize the newest version of information automatically. evidence: README.md
- The MCP SSE bridge currently lacks support for passing through state_mode configurations. evidence: README.md
Security
Risk level: Medium risk
This brain runs
Git hooks (8)
.pre-commit-config.yaml:pre-commit hooks from https://github.com/psf/black at 24.4.2 (contributor tooling: runs only after pre-commit install)· uses the network.pre-commit-config.yaml:pre-commit hooks from https://github.com/pycqa/isort at 5.13.2 (contributor tooling: runs only after pre-commit install)· uses the network.pre-commit-config.yaml:pre-commit hooks from https://github.com/pycqa/flake8 at 7.1.1 (contributor tooling: runs only after pre-commit install)· uses the network.pre-commit-config.yaml:pre-commit hooks from https://github.com/compilerla/conventional-pre-commit at v3.2.0 (contributor tooling: runs only after pre-commit install)· uses the network.pre-commit-config.yaml:pre-commit hooks from https://github.com/pre-commit/pre-commit-hooks at v4.6.0 (contributor tooling: runs only after pre-commit install)· uses the network.pre-commit-config.yaml:pre-commit hooks from https://github.com/Yelp/detect-secrets at v1.5.0 (contributor tooling: runs only after pre-commit install)· uses the network.pre-commit-config.yaml:bash -c 'PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 ./venv/bin/pytest tests/ --ignore=tests/benchmarks --ignore=tests/test_integration.py -x -q'.pre-commit-config.yaml:bash -c 'command -v coderabbit >/dev/null 2>&1 || { echo "coderabbit CLI not installed, skipping"; exit 0; }; coderabbit review --type committed --plain'
Agent instructions that run or fetch something (39)
AGENTS.md:`make install`: Create `.venv` (and symlink `venv -> .venv`) and install dev deps.AGENTS.md:`make dev`: Start local stack via Docker (FalkorDB, Qdrant, API).AGENTS.md:`make test`: Run unit tests (fast, no services).AGENTS.md:`make test-integration`: Start Docker and run full integration tests.AGENTS.md:`make fmt` / `make lint`: Format with Black/Isort and lint with Flake8.AGENTS.md:`make bench-eval BENCH=locomo-mini`: Run snapshot-based benchmark (~2 min).AGENTS.md:`make deploy` / `make status`: Deploy/check Railway.AGENTS.md:Quick health: `curl :8001/health`.· uses the networkAGENTS.md:Run `pre-commit install` and `make fmt && make lint` before committing.AGENTS.md:Unit tests: `make test`.AGENTS.md:Integration: `make test-integration` (requires Docker).AGENTS.md:| Tier | Benchmark | Command | Runtime | Cost | When to use | |------|-----------|---------|---------|------|-------------| | 0 | Unit tests | `make test` | 30s | free | Every change | | 1 | LoCoMo-mini (2 convos, 304 Qs) | `make bench-eval BENCH=locomo-mini` | 2-3 min | free / ~$0.20 …[+355 chars]AGENTS.md:`make bench-eval BENCH=locomo-mini CONFIG=baseline` — eval from snapshot (~2 min).AGENTS.md:`make bench-compare BENCH=locomo CONFIG=<name> BASELINE=baseline` — A/B compare two configs.AGENTS.md:`make bench-compare-branch BRANCH=<branch>` — compare a branch against baseline.AGENTS.md:`make bench-ingest BENCH=locomo` — ingest + snapshot (run once per embedding change).AGENTS.md:`make bench-health` — recall health check (score distribution, entity quality, latency).AGENTS.md:Run `make bench-eval BENCH=locomo-mini` on `main` to confirm the current baseline.AGENTS.md:Run the same eval on the branch.AGENTS.md:Promote to `make bench-eval BENCH=locomo` (full) before merge.AGENTS.md:`benchmarks/snapshots/` — Qdrant/FalkorDB snapshot data (gitignored, regenerate with `make bench-ingest`).AGENTS.md:`benchmarks/results/` — per-run result JSONs (gitignored).AGENTS.md:release-please and GHCR `:stable` then run on `main`.CLAUDE.md:`GET /consolidate/status` - Check consolidation scheduler status and last run timesCLAUDE.md:Adds short summaries, timestamps (`enriched_at`), and per-run metrics under `metadata.enrichment`.CLAUDE.md:# Run testsCLAUDE.md:make test-integration # Starts services and runs integration testsCLAUDE.md:make test-live # Same as above via MakefileCLAUDE.md:JIT_ENRICHMENT_ENABLED=true # Run entity/summary extraction inline on recall for unenriched memoriesCLAUDE.md:Install spaCy locally to improve entity extraction:CLAUDE.md:pip install spacyCLAUDE.md:python -m spacy download en_core_web_smCLAUDE.md:**Local Development** - Make changes and test with `make dev`CLAUDE.md:**Unit Tests** - Verify with `make test`CLAUDE.md:**Integration Tests** - Validate with `make test-integration`CLAUDE.md:**Deploy to Railway** - Push changes with `make deploy`CLAUDE.md:**Live Validation** - Test deployed instance with `make test-live`CLAUDE.md:**Benchmarking** - Validate performance with `make test-locomo-live`CLAUDE.md:# Run integration tests against Railway
Install scripts (1)
Makefile(make install):echo "🔧 Setting up development environment..."; bash scripts/bootstrap_dev.sh; echo "✅ Virtual environment ready!"; echo "💡 Run 'source .venv/bin/activate' to activate"
- Medium risk: runs-git-hook-remote-exec (.pre-commit-config.yaml:9)
- Medium risk: runs-git-hook-remote-exec (.pre-commit-config.yaml:16)
- Medium risk: runs-git-hook-remote-exec (.pre-commit-config.yaml:23)
- Medium risk: runs-git-hook-remote-exec (.pre-commit-config.yaml:30)
- Medium risk: runs-git-hook-remote-exec (.pre-commit-config.yaml:38)
- Medium risk: runs-git-hook-remote-exec (.pre-commit-config.yaml:50)
- Medium risk: runs-instruction-instruction-network (AGENTS.md:23)
- Low risk: network-instructions (.pre-commit-config.yaml:2)
- Low risk: network-instructions (CLAUDE.md:299)
- Low risk: network-instructions (Makefile:91)
- Low risk: scripts-present (scripts/bootstrap_dev.sh)
Attribution and licence
- First committed by
jack-arturo
- Publisher
- Very Good Plugins (Community)
- Source
- verygoodplugins/automem · commit 1a7ba1a
- Licence
- MIT License (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Contributors
- jack-arturo, mikemikimike, zackkatz, dexhunter
AutoGineer is not affiliated with or endorsed by jack-arturo or Very Good Plugins.
Install from source
249 of its files are not served here, so there is no ZIP. verygoodplugins/automem at 1a7ba1a