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

  1. Set memory.backend in the config to an enabled backend, e.g. "sqlite" (simplest local option), then re-run reindex
  2. Pick the backend matching where your data lives: sqlite/lucid/postgres for full CRUD, markdown for file-based, qdrant for vector search
  3. Confirm the backend string is exact — backend_kind_from_dotted parses dotted names; a typo can also classify as None
  4. 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

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


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/830f44c459b5222a. Report an issue: GitHub.