EpicGames/lore · error

Failed to create notification plugin

Error message

Failed to create notification plugin '{plugin_name}': {e}

What it means

The notification mode in [notification] names a notification plugin that the registry must instantiate. If registry.create_notification fails — plugin not registered, invalid plugin config, or a plugin-internal setup error — the failure is wrapped in this message naming the plugin.

Solutions

  1. Verify the plugin name in notification.mode matches a registered notification plugin (see the startup 'Registered plugins - notification: ...' log)
  2. Enable the plugin's cargo feature or register it before async_main
  3. Fix the [plugins.<plugin_name>] section so the plugin's config deserializes successfully

Example fix

# before
[notification]
mode = "slack"

# after
[notification]
mode = "slack"
[plugins.slack]
webhook_url = "https://hooks.slack.com/services/..."
Defensive patterns

Strategy: validation

Validate before calling

if !registry.list_notification_plugins().contains(&plugin_name.to_string()) {
    return Err(format!("notification plugin '{plugin_name}' is not registered"));
}

Try / catch

match registry.create_notification(plugin_name, &plugin_config, &context).await {
    Ok(output) => output,
    Err(e) => return Err(anyhow::anyhow!("Failed to create notification plugin '{plugin_name}': {e}"))
        .context(format!("verify [plugins.{plugin_name}] config and that the plugin feature is enabled")),
}

Prevention

When it happens

Trigger: notification.mode = "<plugin_name>" set to a plugin that isn't compiled in/registered, or whose [plugins.<plugin_name>] TOML config is missing required fields, so create_notification returns Err during async_main startup.

Common situations: Enabling notification.mode for a plugin whose cargo feature is off; renaming a plugin but not the config key; malformed webhook/slack plugin config (bad URL, missing token).

Related errors


AI-assisted analysis of EpicGames/lore@074eb0b0d1 (2026-09-13). Data as JSON: /api/errors/552cc1ab021b1de4. Report an issue: GitHub.

Appendix: source

Thrown at lore-server/src/server.rs:1488

        plugin_name => {
            info!(plugin_name = plugin_name, "Creating notification plugin");

            // Get the plugin config from the plugins section
            let plugin_config = plugins
                .get(plugin_name)
                .cloned()
                .unwrap_or_else(|| toml::Value::Table(toml::map::Map::new()));

            let context = NotificationPluginContext {
                environment: environment.clone(),
                immutable_store: immutable_store.cloned(),
            };

            let output = registry
                .create_notification(plugin_name, &plugin_config, &context)
                .await
                .map_err(|e| {
                    anyhow::anyhow!("Failed to create notification plugin '{plugin_name}': {e}")
                })?;

            // Spawn background tasks for the receiver tasks from the plugin
            for task in output.receivers {
                lore_spawn!(endpoints, async move {
                    task.await.map_err(|e| {
                        anyhow::anyhow!("Notification plugin receiver background task failed: {e}")
                    })
                });
            }

            Ok((output.sender, None))
        }
    }
}

#[cfg(target_os = "linux")]
async fn log_base_address() {

View on GitHub (pinned to 074eb0b0d1)