{"record":{"id":"03583803081efd6a","repo":"NousResearch/hermes-agent","slug":"hermes-update-failed-exit-see-for-detai","errorCode":null,"errorMessage":"hermes update failed (exit {:?}). See {} for details.","messagePattern":"hermes update failed \\(exit (.+?)\\)\\. See (.+?) for details\\.","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"apps/bootstrap-installer/src-tauri/src/update.rs","lineNumber":479,"sourceCode":"                    .join(\"logs\")\n                    .join(\"update.log\")\n                    .display()\n            );\n            emit_stage(\n                &app,\n                \"update\",\n                StageState::Failed,\n                Some(update_ms),\n                Some(msg.clone()),\n            );\n            emit(\n                &app,\n                BootstrapEvent::Failed {\n                    stage: Some(\"update\".into()),\n                    error: msg.clone(),\n                },\n            );\n            return Err(anyhow!(msg));\n        }\n    }\n\n    // ---- stage 3: hermes desktop --build-only ----------------------------\n    // `hermes update` deliberately does NOT build apps/desktop (it installs\n    // repo-root deps with --workspaces=false). This is the rebuild it skips.\n    emit_stage(&app, \"rebuild\", StageState::Running, None, None);\n    let started = Instant::now();\n    let rebuild_args: Vec<String> = vec![\"desktop\".into(), \"--build-only\".into()];\n    let mut rebuild = run_streamed(\n        &app,\n        &hermes,\n        &rebuild_args,\n        &install_root,\n        &child_env,\n        Some(\"rebuild\"),\n    )\n    .await?;","sourceCodeStart":461,"sourceCodeEnd":497,"githubUrl":"https://github.com/NousResearch/hermes-agent/blob/c896c09c42910c584c4c7d2325b58c14713ea42c/apps/bootstrap-installer/src-tauri/src/update.rs#L461-L497","documentation":"Stage-2 failure of the update flow: the `hermes update` child exited with an exit code that is neither success nor the 'still running' sentinel. The real cause is inside the CLI's own log — the message points at ~/.hermes/logs/update.log — so this wrapper just surfaces the exit status and the log path.","triggerScenarios":"`hermes update` failing on git operations (dirty tree, detached pin, network), pip/dependency install failures, venv corruption, or disk-full while updating packages; any non-zero, non-sentinel exit code from the CLI subprocess.","commonSituations":"Offline or flaky network during dependency install; local modifications in the install tree conflicting with git pull; Python version mismatch after an OS upgrade broke the venv; corporate proxy blocking pypi/github.","solutions":["Open ~/.hermes/logs/update.log and read the tail — the actual error is there, not in this message.","Fix the root cause it shows (reconnect network, clean the tree, free disk).","Re-run the update; if the venv is corrupted, re-run the bootstrap installer to repair.","If it keeps failing on the same step, capture the log excerpt and report it rather than retrying blindly."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// Distinguish sentinel exit codes from real failures; always point the user at update.log.\nmatch status.code() {\n    Some(0) => { /* success */ }\n    Some(code) if code == STILL_RUNNING_SENTINEL => { /* see [547]: retry after shutdown */ }\n    Some(code) => {\n        let log = crate::paths::hermes_home().join(\"logs\").join(\"update.log\");\n        emit_stage(&app, \"update\", StageState::Failed, Some(ms),\n            Some(format!(\"hermes update failed (exit {code}). See {} for details.\", log.display())));\n    }\n    None => { /* killed by signal: see [551] */ }\n}","preventionTips":["Read the tail of ~/.hermes/logs/update.log first — the wrapper message carries no root cause.","Keep the install tree clean (no local modifications) so git-based updates don't conflict.","Verify network/proxy access to package sources before updating on locked-down machines."],"tags":["update","logging","child-process","bootstrap-installer"],"backgroundTag":null,"analyzedSha":"c896c09c42910c584c4c7d2325b58c14713ea42c","analyzedAt":"2026-08-14T17:18:01.089Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}