{"record":{"id":"419c4c0a7beb7491","repo":"openai/codex","slug":"failed-to-read-app-config-for-selected-plugin-pl","errorCode":null,"errorMessage":"failed to read app config for selected plugin `{plugin_id}` at `{path}`: {source}","messagePattern":"failed to read app config for selected plugin `(.+?)` at `(.+?)`: (.+?)","errorType":"exception","errorClass":"ExecutorPluginConnectorProviderError","httpStatus":null,"severity":"error","filePath":"codex-rs/ext/connectors/src/executor_plugin.rs","lineNumber":17,"sourceCode":"use codex_connectors::parse_plugin_app_config;\nuse codex_core_plugins::ResolvedExecutorPlugin;\nuse codex_file_system::ReadFileOptions;\nuse codex_plugin::AppDeclaration;\nuse codex_plugin::PluginResourceLocator;\nuse codex_utils_path_uri::PathUri;\nuse std::io;\nuse thiserror::Error;\n\n/// Loads connector declarations from a resolved plugin through its owning executor.\n#[derive(Clone, Copy, Debug, Default)]\npub struct ExecutorPluginConnectorProvider;\n\n/// Failure to load connector declarations from an executor plugin.\n#[derive(Debug, Error)]\npub enum ExecutorPluginConnectorProviderError {\n    #[error(\"failed to read app config for selected plugin `{plugin_id}` at `{path}`: {source}\")]\n    ReadConfig {\n        plugin_id: String,\n        path: PathUri,\n        #[source]\n        source: io::Error,\n    },\n    #[error(\"failed to parse app config for selected plugin `{plugin_id}` at `{path}`: {source}\")]\n    ParseConfig {\n        plugin_id: String,\n        path: PathUri,\n        #[source]\n        source: serde_json::Error,\n    },\n}\n\nimpl ExecutorPluginConnectorProvider {\n    /// Returns the connector declarations contributed by `plugin`.\n    #[tracing::instrument(name = \"connectors.executor_plugin.declarations.load\", skip_all)]","sourceCodeStart":1,"sourceCodeEnd":35,"githubUrl":"https://github.com/openai/codex/blob/339751715c64496cb86246bfb3935f40e309dd3d/codex-rs/ext/connectors/src/executor_plugin.rs#L1-L35","documentation":"ExecutorPluginConnectorProvider::load reads the apps/connector config file declared by a plugin manifest (paths.apps Environment locator) through the plugin's executor file system. ReadConfig wraps the io::Error from that read (NotFound, permission denied, sandbox denial, or executor transport failure). The message names the plugin id and the exact path that failed.","triggerScenarios":"Calling ExecutorPluginConnectorProvider::load(&ResolvedExecutorPlugin) when the manifest points paths.apps at a file missing from the plugin environment, a file the executor cannot read, or when the executor file system cannot reach the environment.","commonSituations":"Plugin partially installed or its apps config deleted after registration; typo or stale path in the manifest's paths.apps; executor sandbox denies the read; plugin package reorganized its config layout between versions.","solutions":["Verify the file printed in the error exists at that path inside the plugin environment (it is the manifest's paths.apps value).","Fix file permissions or sandbox rules so the executor can read it.","Correct the paths.apps entry in the plugin manifest to match the installed layout.","Reinstall or upgrade the plugin so manifest and files agree.","If the plugin's connectors are optional, degrade to an empty declaration list instead of failing startup."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match provider.load(&plugin).await {\n    Ok(declarations) => declarations,\n    Err(ExecutorPluginConnectorProviderError::ReadConfig { plugin_id, path, source }) => {\n        tracing::warn!(%plugin_id, %path, %source, \"plugin connectors unavailable\");\n        Vec::new()\n    }\n    Err(e) => return Err(e.into()),\n}","preventionTips":["Verify manifest paths.apps points at a shipped file during plugin packaging CI.","Treat per-plugin connector load failures as skippable rather than fatal at host startup.","Log plugin_id and path from the variant fields before dropping the error."],"tags":["rust","plugin","config","io","codex"],"backgroundTag":"config-file-unreadable","analyzedSha":"339751715c64496cb86246bfb3935f40e309dd3d","analyzedAt":"2026-08-25T05:35:09.876Z","schemaVersion":2},"datasetVersion":"2026-08-25T06:17:31.827Z"}