zeroclaw-labs/zeroclaw · error · anyhow::Error
Memory backend is 'none' (disabled). No entries to manage.
Error message
Memory backend is 'none' (disabled). No entries to manage.
What it means
The memory reindex command needs an embedder-backed memory store, but the config sets memory.backend to the disabled 'none' backend (classify_memory_backend returns MemoryBackendKind::None). create_memory_with_embedder bails before ever constructing a store because there is nothing to index.
Source
Thrown at src/memory/cli.rs:61
crate::MemoryCommands::List {
category,
session,
limit,
offset,
} => handle_list(config, category, session, limit, offset).await,
crate::MemoryCommands::Get { key } => handle_get(config, &key).await,
crate::MemoryCommands::Stats => handle_stats(config).await,
crate::MemoryCommands::Clear { key, category, yes } => {
handle_clear(config, key, category, yes).await
}
crate::MemoryCommands::Reindex => handle_reindex(config).await,
}
}
fn create_memory_with_embedder(config: &Config) -> Result<Box<dyn Memory>> {
let backend = backend_kind_from_dotted(&config.memory.backend);
if matches!(classify_memory_backend(&backend), MemoryBackendKind::None) {
bail!("Memory backend is 'none' (disabled). No entries to manage.");
}
create_memory_from_config(config, None)
}
async fn handle_reindex(config: &Config) -> Result<()> {
let mem = create_memory_with_embedder(config)?;
println!(
"{} {}",
style("→").cyan(),
mt("cli-memory-reindexing", "Reindexing memory backend...")
);
let count = mem.reindex().await?;
if count == 0 {
println!(
"{} FTS rebuilt. No embeddings to fill in (either everything is already embedded or the backend has no embedder configured).",
style("✓").green()
);
} else {View on GitHub (pinned to 88bb9c8533)
Solutions
- Set memory.backend in the config to an enabled backend, e.g. "sqlite" (simplest local option), then re-run reindex
- Pick the backend matching where your data lives: sqlite/lucid/postgres for full CRUD, markdown for file-based, qdrant for vector search
- Confirm the backend string is exact — backend_kind_from_dotted parses dotted names; a typo can also classify as None
- Re-run `zeroclaw memory reindex` after the config change
Example fix
# before [memory] backend = "none" # after [memory] backend = "sqlite"
Defensive patterns
Strategy: validation
Validate before calling
// Check the backend kind before invoking reindex (mirrors create_memory_with_embedder):
let backend = backend_kind_from_dotted(&config.memory.backend);
if matches!(classify_memory_backend(&backend), MemoryBackendKind::None) {
eprintln!("enable memory.backend before reindexing");
return Ok(());
} Try / catch
// Downcast-free: match on the message prefix 'Memory backend is' when wrapping the CLI, // and branch to a 'memory disabled' UX path instead of showing a failure.
Prevention
- Set an explicit backend in every profile's config template
- Assert memory.backend != "none" in setup scripts that plan to reindex
- Keep a default like sqlite in base configs so memory is never silently off
When it happens
Trigger: Running `zeroclaw memory reindex` (the handle_reindex path) while config.memory.backend is "none". Any other backend value (sqlite, markdown, qdrant, lucid, postgres) proceeds to create_memory_from_config.
Common situations: Fresh install where memory is disabled by default; deliberately turning memory off earlier and forgetting; copying a minimal config template into a profile you later run reindex against; provisioning scripts that assume memory is enabled.
Related errors
- memory clear is unsupported for append-only backend '{$backe
- memory.embedding_model uses hint "{hint}" but no matching [[
- unsupported room visibility '{other}': expected private or p
- channel '{}' does not support forge API requests
- Destination {} is not in allowed list
AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23).
Data as JSON: /api/errors/830f44c459b5222a.
Report an issue: GitHub.