{"record":{"id":"12ec41c1dab69cdd","repo":"EpicGames/lore","slug":"missing-remote-mutable-store-settings","errorCode":null,"errorMessage":"Missing remote mutable store settings","messagePattern":"Missing remote mutable store settings","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"lore-server/src/server.rs","lineNumber":955,"sourceCode":") -> Result<Arc<dyn MutableStore>> {\n    let mode = &settings.mutable_store.mode;\n\n    match mode.as_str() {\n        store_mode::LOCAL => {\n            let local_settings = settings\n                .mutable_store\n                .local\n                .as_ref()\n                .ok_or(anyhow!(\"Missing local mutable store settings\"))?;\n\n            configure_local_mutable_store(local_settings, immutable_store).await\n        }\n        store_mode::REMOTE => {\n            let remote_settings = settings\n                .mutable_store\n                .remote\n                .as_ref()\n                .ok_or(anyhow!(\"Missing remote mutable store settings\"))?;\n\n            configure_remote_mutable_store(remote_settings)\n        }\n        store_mode::REPLICATED => Err(anyhow!(\"replicated mutable store is not implemented\")),\n        store_mode::COMPOSITE => Err(anyhow!(\n            \"Invalid settings, cannot have composite store as mutable store\"\n        )),\n        _ => {\n            // All other modes use the plugin system\n            let plugin_config =\n                resolve_plugin_config_with_fallback(&settings.plugins, mode, \"mutable_store\")\n                    .unwrap_or_else(|| toml::Value::Table(toml::map::Map::new()));\n\n            info!(mode, \"Creating mutable store via plugin system\");\n\n            registry\n                .create_mutable_store(mode, &plugin_config, immutable_store)\n                .map_err(|e| anyhow!(\"Failed to create mutable store plugin '{mode}': {e}\"))","sourceCodeStart":937,"sourceCodeEnd":973,"githubUrl":"https://github.com/EpicGames/lore/blob/074eb0b0d1194c997d7cf28b55519e3e197b3e23/lore-server/src/server.rs#L937-L973","documentation":"When settings.mutable_store.mode is \"remote\", the server requires the optional `mutable_store.remote` settings table describing the remote backend. The remote arm unwraps the Option with `.ok_or(anyhow!(...))` and fails startup with this message when it is None. It mirrors the local-mode check but for the remote store configuration.","triggerScenarios":"Settings contain `[mutable_store] mode = \"remote\"` with no `[mutable_store.remote]` table, so `settings.mutable_store.remote.as_ref()` is None in configure_mutable_store_via_plugin.","commonSituations":"Switching a deployment from local to remote storage without adding the remote backend settings (endpoint, bucket, credentials block); configuration template left partially filled; a merge/diff tool dropped the remote table.","solutions":["Add the `[mutable_store.remote]` table with the connection details your remote backend requires.","Double-check the mode string is intentional; if you meant local storage, set mode = \"local\" and supply `[mutable_store.local]`.","Validate the full settings struct deserializes before launch (a config lint/check step or a unit test loading the TOML)."],"exampleFix":"// before (settings.toml)\n[mutable_store]\nmode = \"remote\"\n\n// after (settings.toml)\n[mutable_store]\nmode = \"remote\"\n\n[mutable_store.remote]\nurl = \"https://storage.example.com\"\nbucket = \"lore-data\"","handlingStrategy":"validation","validationCode":"// Rust\nfn validate_mutable_remote(settings: &Settings) -> Result<(), String> {\n    if settings.mutable_store.mode == \"remote\" && settings.mutable_store.remote.is_none() {\n        return Err(\"mutable_store.mode = \\\"remote\\\" requires a [mutable_store.remote] table\".into());\n    }\n    Ok(())\n}","typeGuard":"fn has_remote_mutable_settings(s: &Settings) -> bool {\n    s.mutable_store.mode != \"remote\" || s.mutable_store.remote.is_some()\n}","tryCatchPattern":null,"preventionTips":["Validate the full Settings struct deserializes from the merged config before launch.","When migrating local→remote, migrate the settings block in the same change as the mode switch.","Use config templating that couples mode and its sub-table so they can't diverge."],"tags":["configuration","rust","startup","remote-store"],"backgroundTag":"missing-required-config-field","analyzedSha":"074eb0b0d1194c997d7cf28b55519e3e197b3e23","analyzedAt":"2026-09-13T09:00:57.509Z","contentChangedAt":"2026-09-13T09:00:57.509Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}