{"record":{"id":"6c73a7ef5ab1fad8","repo":"Hmbown/CodeWhale","slug":"plugin-identity-probe-found-a-reparse-point-hard","errorCode":null,"errorMessage":"plugin identity probe found a reparse point, hard link, or unexpected object","messagePattern":"plugin identity probe found a reparse point, hard link, or unexpected object","errorType":"validation","errorClass":"std::io::Error","httpStatus":null,"severity":"error","filePath":"crates/tui/src/plugins/manifest.rs","lineNumber":1614,"sourceCode":"        | if expect_directory {\n            FILE_FLAG_BACKUP_SEMANTICS\n        } else {\n            0\n        };\n    let file = fs::OpenOptions::new()\n        .access_mode(0)\n        .share_mode(FILE_SHARE_READ_WRITE_DELETE)\n        .custom_flags(flags)\n        .open(path)?;\n    let metadata = file.metadata()?;\n    let identity = windows_file_identity(&file)?;\n    let expected_kind = if expect_directory {\n        metadata.is_dir()\n    } else {\n        metadata.is_file() && identity.links == 1\n    };\n    if !expected_kind || identity.attributes & FILE_ATTRIBUTE_REPARSE_POINT != 0 {\n        return Err(std::io::Error::new(\n            std::io::ErrorKind::InvalidData,\n            \"plugin identity probe found a reparse point, hard link, or unexpected object\",\n        ));\n    }\n    Ok(file)\n}\n\n#[cfg(windows)]\nfn ensure_windows_path_still_opened(path: &Path, opened: &fs::File) -> Result<(), String> {\n    let after = fs::symlink_metadata(path)\n        .map_err(|e| format!(\"failed to re-inspect plugin path after handle open: {e}\"))?;\n    if metadata_is_link_or_reparse(&after) {\n        return Err(\"plugin path changed into a reparse point during validation\".to_string());\n    }\n    let expect_directory = if after.is_dir() {\n        true\n    } else if after.is_file() {\n        false","sourceCodeStart":1596,"sourceCodeEnd":1632,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/plugins/manifest.rs#L1596-L1632","documentation":"Identity probe guard in the Windows plugin path: the opened handle's metadata did not match the expected kind — for files it requires a regular file with exactly one hard link; for directories a real directory — or the reparse-point attribute is set. Any mismatch rejects the plugin component.","triggerScenarios":"Thrown at crates/tui/src/plugins/manifest.rs:1614 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Install the plugin as plain regular files/directories without links or reparse points.","Re-install the plugin from its source so components are materialized normally.","Audit the plugin directory for hard links created by copy tools (e.g. clone-link installs)."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"0c42157ee52f9d55af2b506d71b46249910f77d3","analyzedAt":"2026-08-20T21:50:45.477Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}