Same agent, same code, same interface. MEMORY_BACKEND=elastic or MEMORY_BACKEND=engram. Elastic Cloud (ELSER semantic search, ES|QL, Kibana) ↔ Engram-rs (local SQLite+FTS5). Zero code changes.
Both backends implement the same abstract MemoryBackend interface. The agent doesn't know which one is running — and it shouldn't have to. This is the genuinely good idea the judges should see.
Semantic search via ELSER NLP model. Finds paraphrased memories that keyword search misses. ES|QL for structured reflect queries. Kibana dashboard for memory analytics.
Self-hosted SQLite + FTS5. Sub-millisecond keyword recall. Zero cloud dependencies. Same agent code, same MemoryEntry format, same 15 tests passing.
# Elastic Cloud (partner track)
export MEMORY_BACKEND=elastic
export ELASTIC_CLOUD_ID=...
python -m agent.main
# Engram-rs (self-hosted fallback)
export MEMORY_BACKEND=engram
python -m agent.main
# Same agent. Same code. One env var.