{"record":{"id":"8b3d2639b3e6e15c","repo":"zeroclaw-labs/zeroclaw","slug":"screenshot-path-path-is-missing-a-filename","errorCode":null,"errorMessage":"Screenshot path '{ $path }' is missing a filename component","messagePattern":"Screenshot path '(.+?)' is missing a filename component","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-tools/src/browser.rs","lineNumber":901,"sourceCode":"        if !self.security.is_resolved_path_allowed(&canonical) {\n            let msg = crate::i18n::get_required_tool_string_with_args(\n                \"tool-browser-screenshot-error-path-outside-workspace\",\n                &[\n                    (\"path\", raw_path),\n                    (\"canonical\", &canonical.display().to_string()),\n                ],\n            );\n            anyhow::bail!(\"{msg}\");\n        }\n\n        // Build the final *target* path (parent + file name) so we can apply\n        // the same target-level guards the file_write / file_edit tools use.\n        let Some(file_name) = full.file_name() else {\n            let msg = crate::i18n::get_required_tool_string_with_args(\n                \"tool-browser-screenshot-error-missing-filename\",\n                &[(\"path\", raw_path)],\n            );\n            anyhow::bail!(\"{msg}\");\n        };\n        let resolved_target = canonical.join(file_name);\n\n        if self.security.is_runtime_config_path(&resolved_target) {\n            let msg = crate::i18n::get_required_tool_string_with_args(\n                \"tool-browser-screenshot-error-runtime-config-target\",\n                &[\n                    (\"path\", raw_path),\n                    (\"target\", &resolved_target.display().to_string()),\n                ],\n            );\n            anyhow::bail!(\"{msg}\");\n        }\n\n        // If the target already exists and is a symlink, refuse to follow it.\n        if let Ok(meta) = tokio::fs::symlink_metadata(&resolved_target).await\n            && meta.file_type().is_symlink()\n        {","sourceCodeStart":883,"sourceCodeEnd":919,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-tools/src/browser.rs#L883-L919","documentation":"Error \"Screenshot path '{ $path }' is missing a filename component\" thrown in zeroclaw-labs/zeroclaw.","triggerScenarios":"Thrown at crates/zeroclaw-tools/src/browser.rs:901 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Include a filename in the screenshot path, e.g. shots/page.png."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}