{"record":{"id":"f988494c12d130f3","repo":"EpicGames/lore","slug":"missing-composite-remote-store-settings","errorCode":null,"errorMessage":"Missing composite remote store settings","messagePattern":"Missing composite remote store settings","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"lore-server/src/server.rs","lineNumber":1418,"sourceCode":"    registry: &PluginRegistry,\n    mode: &str,\n    global_settings: &Settings,\n    settings: &CompositeSubStoreSettings,\n) -> Result<Arc<dyn ImmutableStore>> {\n    match mode {\n        store_mode::LOCAL => {\n            let local_settings = settings\n                .local\n                .as_ref()\n                .ok_or(anyhow!(\"Missing composite local store settings\"))?;\n\n            configure_local_immutable_store(local_settings).await\n        }\n        store_mode::REMOTE => {\n            let remote_settings = settings\n                .remote\n                .as_ref()\n                .ok_or(anyhow!(\"Missing composite remote store settings\"))?;\n\n            configure_remote_immutable_store(remote_settings)\n        }\n        store_mode::COMPOSITE => Err(anyhow!(\n            \"Composite store not supported as a composite substore\"\n        )),\n        store_mode::REPLICATED => {\n            let replicated_settings = settings\n                .replicated\n                .as_ref()\n                .ok_or(anyhow!(\"Missing composite replicated store settings\"))?;\n\n            configure_replicated_immutable_store(replicated_settings).await\n        }\n        _ => {\n            // All other modes use the plugin system\n            let plugin_config = resolve_plugin_config_with_fallback(\n                &global_settings.plugins,","sourceCodeStart":1400,"sourceCodeEnd":1436,"githubUrl":"https://github.com/EpicGames/lore/blob/074eb0b0d1194c997d7cf28b55519e3e197b3e23/lore-server/src/server.rs#L1400-L1436","documentation":"When building a composite immutable store, each substore is configured by mode. If a substore's mode is 'remote', CompositeSubStoreSettings.remote must be populated; otherwise the server refuses to start because there are no remote endpoint/settings to build the remote store from.","triggerScenarios":"The TOML settings define a composite store whose subs tore list includes mode = \"remote\", but the settings table for that substore has no [immutable_store.composite.*.remote] section, so settings.remote is None when configure_composite_substore unwraps it.","commonSituations":"Hand-edited config files where the remote block was deleted or mistyped (e.g. [[...stores]] entry with mode=\"remote\" but the matching remote table missing); copying a local-only composite example and switching a substore mode to remote without adding its settings; env var templating that dropped the remote section.","solutions":["Add the [immutable_store.composite.<name>.remote] settings table for the substore that declares mode = \"remote\"","Change the substore's mode to one whose settings you actually have (e.g. \"local\")","Validate the composite settings struct before starting the server (serde default/required field checks)"],"exampleFix":"# before\n[[immutable_store.composite.main.stores]]\nmode = \"remote\"\n\n# after\n[[immutable_store.composite.main.stores]]\nmode = \"remote\"\n[immutable_store.composite.main.stores.remote]\nendpoints = [\"http://remote-host:7447\"]","handlingStrategy":"validation","validationCode":"if store_mode == \"remote\" && composite_settings.remote.is_none() {\n    return Err(\"substore mode 'remote' requires [immutable_store.composite.<name>.remote] settings\");\n}","typeGuard":"fn has_remote_settings(s: &CompositeSubStoreSettings) -> bool { s.remote.is_some() }","tryCatchPattern":"match configure_composite_substore(&registry, mode, &settings, sub).await {\n    Err(e) if e.to_string().contains(\"Missing composite remote store settings\") => {\n        eprintln!(\"config error: add remote settings for substore '{mode}'\"); std::process::exit(2);\n    }\n    r => r?,\n}","preventionTips":["Use serde deny_unknown_fields + explicit Option checks in a config pre-flight validator","Lint the TOML config in CI: every substore mode must have a matching settings table","Keep composite substore examples complete when copying between environments"],"tags":["configuration","rust","startup"],"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"}