{"record":{"id":"26591bb17a5ce447","repo":"tauri-apps/tauri","slug":"failed-to-resolve-acl","errorCode":null,"errorMessage":"failed to resolve ACL","messagePattern":"failed to resolve ACL","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tauri-codegen/src/context.rs","lineNumber":419,"sourceCode":"    Default::default()\n  };\n\n  let capabilities_file_path = out_dir.join(CAPABILITIES_FILE_NAME);\n  let capabilities_from_files = if capabilities_file_path.exists() {\n    let capabilities_json =\n      std::fs::read_to_string(&capabilities_file_path).expect(\"failed to read capabilities\");\n    serde_json::from_str(&capabilities_json).expect(\"failed to parse capabilities\")\n  } else {\n    Default::default()\n  };\n  let capabilities = get_capabilities(\n    &config,\n    capabilities_from_files,\n    additional_capabilities.as_deref(),\n  )\n  .unwrap();\n\n  let resolved = Resolved::resolve(&acl, capabilities, target).expect(\"failed to resolve ACL\");\n\n  let acl_tokens = map_lit(\n    quote! { ::std::collections::BTreeMap },\n    &acl,\n    str_lit,\n    identity,\n  );\n\n  let runtime_authority = quote!(#root::runtime_authority!(#acl_tokens, #resolved));\n\n  let plugin_global_api_scripts = if config.app.with_global_tauri {\n    if let Some(scripts) = tauri_utils::plugin::read_global_api_scripts(&out_dir) {\n      let scripts = scripts.into_iter().map(|s| quote!(#s));\n      quote!(::std::option::Option::Some(&[#(#scripts),*]))\n    } else {\n      quote!(::std::option::Option::None)\n    }\n  } else {","sourceCodeStart":401,"sourceCodeEnd":437,"githubUrl":"https://github.com/tauri-apps/tauri/blob/460ec35447493200d64290dd7f015d5a91d0fd58/crates/tauri-codegen/src/context.rs#L401-L437","documentation":"Thrown at build time when `Resolved::resolve` fails to combine the plugin ACL manifests and parsed capabilities into a resolved ACL for the build target. The `.expect` fires when capabilities reference unknown plugins/permissions, or the manifests and capabilities are mutually inconsistent (e.g. a permission listed in a capability does not exist in any manifest).","triggerScenarios":"`tauri build`/`tauri dev` where a capability references a plugin permission that is not present in the resolved manifest map, plugins were removed/renamed but capabilities still reference them, or the additional capabilities files are invalid for the target.","commonSituations":"Upgrading Tauri or removing a plugin without updating capabilities files; typos in permission names; plugin renamed permissions between versions; referencing app-defined permissions not yet registered.","solutions":["Check the compiler output above the panic for the specific unresolved permission/identifier and fix the capabilities/*.toml|json entry.","Remove or update capabilities referencing plugins you no longer include.","Update permission names to match the installed plugin versions (see plugin docs for renames).","Clean the build dir (`cargo clean`) so stale manifests from removed plugins are regenerated.","Verify custom permissions/permissions files are properly registered in build.rs / tauri.conf.json."],"exampleFix":"// capabilities/default.json before\n{\"permissions\": [\"fs:allow-read-file\", \"old-plugin:do-thing\"]}\n// after (plugin removed)\n{\"permissions\": [\"fs:allow-read-file\"]}","handlingStrategy":"validation","validationCode":"// before building, verify every permission in capabilities exists in installed plugin manifests\nconst caps = JSON.parse(require('fs').readFileSync('src-tauri/capabilities/default.json', 'utf8'));\nconst pkg = JSON.parse(require('fs').readFileSync('src-tauri/Cargo.toml', 'utf8')); // or parse properly\nfor (const perm of caps.permissions) {\n  const plugin = perm.split(':')[0];\n  if (plugin !== 'core' && !permImplementedByInstalledPlugin(plugin, perm)) {\n    console.error(`capability references unknown permission: ${perm}`);\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Update capabilities whenever you add/remove/upgrade a plugin","Check plugin changelogs for permission renames before upgrading","Run `cargo tauri dev` early after dependency changes to catch ACL issues","Keep capabilities files minimal — only permissions you actually use"],"tags":["build-time","acl","permissions","tauri","capabilities"],"backgroundTag":"resource-not-found","analyzedSha":"460ec35447493200d64290dd7f015d5a91d0fd58","analyzedAt":"2026-09-18T23:55:51.277Z","contentChangedAt":"2026-09-18T23:55:51.277Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}