zeroclaw-labs/zeroclaw · error

{flag} = true requires every agent on the sqlite memory back

Error message

{flag} = true requires every agent on the sqlite memory backend (typed memory storage is SQLite-only), but agents.{agent_alias}.memory.backend = {backend_kind:?}

What it means

The second half of the typed-memory guard: even when the global backend is sqlite, a per-agent override `agents.<alias>.memory.backend` with a non-sqlite kind still conflicts, because typed rows land in each agent's sqlite store. The check walks every agent and the message names the offending agent alias and its backend kind, so the config stanza to fix is unambiguous.

Source

Thrown at crates/zeroclaw-memory/src/lib.rs:1013

    // enforce again here: failing agent-memory construction is an
    // operator-visible startup error and keeps background consolidation
    // from ever running typed writes into a backend that would reject
    // them deep inside spawned work.
    if config.memory.types.enabled || config.memory.consolidation_extract_facts {
        let flag = if config.memory.types.enabled {
            "memory.types.enabled"
        } else {
            "memory.consolidation_extract_facts"
        };
        let global_kind = backend_kind_from_dotted(&config.memory.backend);
        if global_kind != "sqlite" {
            anyhow::bail!(
                "{flag} = true requires memory.backend = \"sqlite\" (typed memory storage is SQLite-only), but memory.backend = {:?}",
                config.memory.backend
            );
        }
        if !matches!(backend_kind, ConfigBackend::Sqlite) {
            anyhow::bail!(
                "{flag} = true requires every agent on the sqlite memory backend (typed memory storage is SQLite-only), but agents.{agent_alias}.memory.backend = {backend_kind:?}"
            );
        }
    }

    // Markdown branch: the wrapper composes per-agent dirs, not a
    // shared backend. Skip the inner-backend factory entirely, but still
    // apply the install-wide policy decorator to own and peer Markdown
    // stores before composition.
    if matches!(backend_kind, ConfigBackend::Markdown) {
        let own_workspace = config.agent_workspace_dir(agent_alias);
        let own: Arc<dyn Memory> = Arc::new(ScannedMemory::new(
            MarkdownMemory::new("markdown", &own_workspace),
            &config.memory.policy,
        ));
        let mut peers: Vec<agent_scoped_markdown::MarkdownPeer> = Vec::new();
        for peer in &agent_cfg.workspace.read_memory_from {
            let peer_alias = peer.as_str();

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Change the named agent's override to sqlite, or delete the override so the agent inherits the global sqlite backend.
  2. Disable the typed flags if the per-agent backend choice must stand.
  3. Repeat for every agent the error names — it fires per conflicting agent.

Example fix

# before
[memory]
backend = "sqlite"
types.enabled = true

[agents.writer.memory]
backend = "markdown"

# after
[memory]
backend = "sqlite"
types.enabled = true

[agents.writer.memory]
backend = "sqlite"
Defensive patterns

Strategy: validation

Validate before calling

// Every agent override must also be sqlite when typed flags are on
if config.memory.types_enabled || config.memory.consolidation_extract_facts {
    for (alias, agent) in &config.agents {
        if let Some(backend) = &agent.memory.backend
            && !matches!(classify_memory_backend(backend), ConfigBackend::Sqlite)
        {
            anyhow::bail!(
                "agents.{alias}.memory.backend must be sqlite while typed memory is enabled"
            );
        }
    }
}

Prevention

When it happens

Trigger: `memory.types.enabled = true` (or consolidation_extract_facts) globally, plus `agents.<alias>.memory.backend = "markdown"` (or any non-sqlite ConfigBackend) on at least one agent, when create_memory_for_agent runs for that agent.

Common situations: Per-agent markdown memory policies combined with globally enabled consolidation; copying an agent stanza from a non-typed deployment into a typed one; per-agent backend overrides forgotten after enabling typed features.

Related errors


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