{"record":{"id":"3e032c3949bd7039","repo":"Hmbown/CodeWhale","slug":"the-installer-did-not-report-the-destination-path","errorCode":null,"errorMessage":"The installer did not report the destination path.","messagePattern":"The installer did not report the destination path\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/commands/groups/plugins/mod.rs","lineNumber":569,"sourceCode":"            other => CommandResult::error(format!(\"Unexpected install outcome: {other:?}\")),\n        },\n        Err(error) => action_error(app, &format!(\"Plugin install failed: {error:#}\")),\n    }\n}\n\nfn rollback_hash_mismatch(\n    app: &mut App,\n    name: &str,\n    installed_path: Option<&std::path::Path>,\n    expected: &str,\n    actual: Option<&str>,\n) -> CommandResult {\n    let locale = app.ui_locale;\n    let missing_destination =\n        tr(locale, MessageId::PluginKimiRollbackDestinationMissing).into_owned();\n    let rollback = installed_path\n        .and_then(std::path::Path::parent)\n        .ok_or_else(|| anyhow::anyhow!(missing_destination))\n        .and_then(|plugins_dir| crate::plugins::install::uninstall(name, plugins_dir));\n    app.plugin_registry = app.plugin_registry.rediscover_for_workspace(&app.workspace);\n    app.refresh_skill_cache();\n    let actual = actual\n        .map(escape_review_text)\n        .unwrap_or_else(|| tr(locale, MessageId::PluginKimiHashUnavailable).into_owned());\n    let name = escape_review_text(name);\n    let expected = escape_review_text(expected);\n    match rollback {\n        Ok(()) => CommandResult::error(\n            tr(locale, MessageId::PluginKimiMismatchRemoved)\n                .replace(\"{name}\", &name)\n                .replace(\"{expected}\", &expected)\n                .replace(\"{actual}\", &actual),\n        ),\n        Err(error) => CommandResult {\n            message: Some(\n                tr(locale, MessageId::PluginKimiMismatchRollbackFailed)","sourceCodeStart":551,"sourceCodeEnd":587,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/8880682c63083a91624de936797efa3ce9e498fd/crates/tui/src/commands/groups/plugins/mod.rs#L551-L587","documentation":"During plugin install the downloaded artifact's hash mismatched, and the automatic rollback could not even start because the installer reported no destination path (installed_path None or parentless) - crates/tui/src/commands/groups/plugins/mod.rs:569. The registry is still rediscovered and the skill cache refreshed, but the mismatched plugin was not uninstalled.","triggerScenarios":"A plugin source whose installer reports success without recording a path; an interrupted install that lost path bookkeeping; hash mismatch combined with a nonstandard install layout or manifest.","commonSituations":"Third-party plugin registries; corporate artifact mirrors that rewrite archives in transit (causing the mismatch) plus installers with custom layouts.","solutions":["Inspect the workspace plugins directory and remove the partially installed plugin folder by hand, then restart or re-run discovery","Verify the archive checksum yourself and pin a source that is not rewritten in transit","Re-run the install to get a clean destination, then uninstall through the normal command","Report the installer-that-returns-no-path as a bug against that plugin source"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Before install, confirm the source can report a destination and a stable hash\nassert!(source.manifest().install_path.is_some(), \"installer reports no destination\");\nassert!(source.archive_sha256().is_some(), \"source provides no expected hash\");","typeGuard":null,"tryCatchPattern":"// Treat as 'manual cleanup required': locate and remove the residue, then rediscover\nif let Err(e) = install_plugin(source) {\n    if e.to_string().contains(\"did not report the destination path\") {\n        clean_plugins_dir_manually(&workspace).ok();\n        app.refresh_plugin_registry();\n    }\n}","preventionTips":["Pin plugin archives to checksummed, immutable sources","Prefer registries that publish expected hashes","After any failed install, re-run discovery to keep the registry truthful"],"tags":["plugins","install","rollback","hash-mismatch"],"backgroundTag":null,"analyzedSha":"8880682c63083a91624de936797efa3ce9e498fd","analyzedAt":"2026-08-16T11:31:27.956Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}