Hmbown/CodeWhale · error
The installer did not report the destination path.
Error message
The installer did not report the destination path.
What it means
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.
Source
Thrown at crates/tui/src/commands/groups/plugins/mod.rs:569
other => CommandResult::error(format!("Unexpected install outcome: {other:?}")),
},
Err(error) => action_error(app, &format!("Plugin install failed: {error:#}")),
}
}
fn rollback_hash_mismatch(
app: &mut App,
name: &str,
installed_path: Option<&std::path::Path>,
expected: &str,
actual: Option<&str>,
) -> CommandResult {
let locale = app.ui_locale;
let missing_destination =
tr(locale, MessageId::PluginKimiRollbackDestinationMissing).into_owned();
let rollback = installed_path
.and_then(std::path::Path::parent)
.ok_or_else(|| anyhow::anyhow!(missing_destination))
.and_then(|plugins_dir| crate::plugins::install::uninstall(name, plugins_dir));
app.plugin_registry = app.plugin_registry.rediscover_for_workspace(&app.workspace);
app.refresh_skill_cache();
let actual = actual
.map(escape_review_text)
.unwrap_or_else(|| tr(locale, MessageId::PluginKimiHashUnavailable).into_owned());
let name = escape_review_text(name);
let expected = escape_review_text(expected);
match rollback {
Ok(()) => CommandResult::error(
tr(locale, MessageId::PluginKimiMismatchRemoved)
.replace("{name}", &name)
.replace("{expected}", &expected)
.replace("{actual}", &actual),
),
Err(error) => CommandResult {
message: Some(
tr(locale, MessageId::PluginKimiMismatchRollbackFailed)View on GitHub (pinned to 8880682c63)
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
Defensive patterns
Strategy: validation
Validate before calling
// Before install, confirm the source can report a destination and a stable hash assert!(source.manifest().install_path.is_some(), "installer reports no destination"); assert!(source.archive_sha256().is_some(), "source provides no expected hash");
Try / catch
// Treat as 'manual cleanup required': locate and remove the residue, then rediscover
if let Err(e) = install_plugin(source) {
if e.to_string().contains("did not report the destination path") {
clean_plugins_dir_manually(&workspace).ok();
app.refresh_plugin_registry();
}
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: Third-party plugin registries; corporate artifact mirrors that rewrite archives in transit (causing the mismatch) plus installers with custom layouts.
Related errors
- parallel(): max ${MAX_ITEMS} items per call
- pipeline(): expected an array of items
- pipeline(): max ${MAX_ITEMS} items per call
- Thread summaries require the runtime bearer token.
- Thread summary returned HTTP ${response.statusCode}.
AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16).
Data as JSON: /api/errors/3e032c3949bd7039.
Report an issue: GitHub.