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
- Change the named agent's override to sqlite, or delete the override so the agent inherits the global sqlite backend.
- Disable the typed flags if the per-agent backend choice must stand.
- 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
- Run the per-agent sqlite check in the same config lint as the global check, reporting all conflicting agents at once.
- Avoid per-agent memory.backend overrides unless they differ from the global backend intentionally; fewer overrides means fewer conflicts.
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
- {flag} = true requires memory.backend = "sqlite" (typed memo
- matrix: `homeserver` is required
- Cannot persist empty Telegram identity
- transcription.max_audio_bytes must be greater than zero
- Edge TTS binary_path must be a bare command name without pat
AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23).
Data as JSON: /api/errors/25cc60b31d2a05fc.
Report an issue: GitHub.