{"record":{"id":"3146c332e1941fea","repo":"tauri-apps/tauri","slug":"failed-to-generate-plugin-documentation-page","errorCode":null,"errorMessage":"failed to generate plugin documentation page","messagePattern":"failed to generate plugin documentation page","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tauri/build.rs","lineNumber":433,"sourceCode":"      .join(\"**\")\n      .join(\"*.toml\")\n      .to_string_lossy(),\n      &format!(\"tauri:{plugin}\"),\n      out_dir,\n      |_| true,\n    )\n    .unwrap_or_else(|e| panic!(\"failed to define permissions for {plugin}: {e}\"));\n\n    let docs_out_dir = Path::new(\"permissions\")\n      .join(plugin_directory_name)\n      .join(\"autogenerated\");\n    fs::create_dir_all(&docs_out_dir).expect(\"failed to create plugin documentation directory\");\n    tauri_utils::acl::build::generate_docs(\n      &permissions,\n      &docs_out_dir,\n      plugin.strip_prefix(\"tauri-plugin-\").unwrap_or(plugin),\n    )\n    .expect(\"failed to generate plugin documentation page\");\n    all_permissions.insert(plugin.to_string(), permissions);\n  }\n\n  let default_permissions = define_default_permission_set(out_dir);\n  all_permissions.insert(\"core\".to_string(), default_permissions);\n\n  all_permissions\n}\n\nfn define_default_permission_set(\n  out_dir: &Path,\n) -> Vec<tauri_utils::acl::manifest::PermissionFile> {\n  let permissions_out_dir = out_dir.join(\"permissions\");\n  fs::create_dir_all(&permissions_out_dir)\n    .expect(\"failed to create core:default permissions directory\");\n\n  let default_toml = permissions_out_dir.join(\"default.toml\");\n  let toml_content = format!(","sourceCodeStart":415,"sourceCodeEnd":451,"githubUrl":"https://github.com/tauri-apps/tauri/blob/460ec35447493200d64290dd7f015d5a91d0fd58/crates/tauri/build.rs#L415-L451","documentation":"Panic when tauri_utils::acl::build::generate_docs fails to render the permission documentation pages for a core plugin into the autogenerated docs directory. generate_docs writes markdown reference files from the parsed ACL permission definitions; an I/O or generation error propagates as this panic and aborts the build.","triggerScenarios":"The permissions data for a plugin is valid enough to parse but generate_docs cannot write its output (unwritable docs directory, disk full), or the ACL schema content is malformed in a way generate_docs rejects after parse.","commonSituations":"A modified or broken permissions .toml file in a local tauri checkout, read-only build environments, or partially written autogenerated docs from a previously interrupted build.","solutions":["Restore the pristine permissions/*.toml files for the affected plugin","Clear the autogenerated docs directory and rebuild","Check disk space and directory write permissions","Pin a working Tauri version if a regression in generate_docs causes it"],"exampleFix":"// before\n# hand-edited, malformed permission toml\ncrates/tauri/permissions/dialog/default.toml  # broken schema\n// after\ngit checkout -- crates/tauri/permissions/dialog/default.toml\ncargo build","handlingStrategy":"validation","validationCode":"for toml_file in glob(\"crates/tauri/permissions/**/*.toml\") {\n    let content = std::fs::read_to_string(toml_file?)?;\n    toml::from_str::<serde_yaml::Value>(&content) // parse-check with the ACL schema in CI\n        .map_err(|e| format!(\"invalid permission toml {}: {}\", toml_file?, e))?;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Don't hand-edit permission .toml files in the tauri crate","Validate ACL schemas in CI before building","Clean autogenerated/ directories after interrupted builds"],"tags":["build-script","acl","permissions","docs"],"backgroundTag":"file-write-failed","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"}