{"record":{"id":"ef954a1a07052613","repo":"warpdotdev/warp","slug":"could-not-determine-home-directory-ef954a","errorCode":null,"errorMessage":"could not determine home directory","messagePattern":"could not determine home directory","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/src/ai/agent_sdk/driver/harness/claude_code/parent_bridge.rs","lineNumber":260,"sourceCode":"        }\n        Ok(())\n    }\n}\n\npub(super) fn parent_bridge_root() -> Result<PathBuf> {\n    for env_name in [\n        OZ_MESSAGE_LISTENER_STATE_ROOT_ENV,\n        LEGACY_MESSAGE_LISTENER_STATE_ROOT_ENV,\n    ] {\n        if let Ok(dir) = std::env::var(env_name)\n            && !dir.is_empty()\n        {\n            return Ok(PathBuf::from(dir));\n        }\n    }\n    dirs::home_dir()\n        .map(|home| home.join(PARENT_BRIDGE_DEFAULT_STATE_ROOT))\n        .ok_or_else(|| anyhow!(\"could not determine home directory\"))\n}\n\nfn parent_bridge_staged_dir(state_dir: &Path) -> PathBuf {\n    state_dir.join(\"staged\")\n}\n\nfn parent_bridge_surfaced_dir(state_dir: &Path) -> PathBuf {\n    state_dir.join(PARENT_BRIDGE_SURFACED_DIR_NAME)\n}\n\npub(super) fn parent_bridge_hook_output_file(state_dir: &Path) -> PathBuf {\n    state_dir.join(PARENT_BRIDGE_HOOK_OUTPUT_FILE_NAME)\n}\n\npub(super) fn parent_bridge_hook_output_ack_file(state_dir: &Path) -> PathBuf {\n    state_dir.join(PARENT_BRIDGE_HOOK_OUTPUT_ACK_FILE_NAME)\n}\n","sourceCodeStart":242,"sourceCodeEnd":278,"githubUrl":"https://github.com/warpdotdev/warp/blob/e72fd7aacbbb2236d9b3be2aad7e7178fe94b4bc/app/src/ai/agent_sdk/driver/harness/claude_code/parent_bridge.rs#L242-L278","documentation":"Thrown by the parent-bridge state-root resolver when neither OZ_MESSAGE_LISTENER_STATE_ROOT_ENV nor the legacy LEGACY_MESSAGE_LISTENER_STATE_ROOT_ENV is set (or non-empty) and dirs::home_dir() returns None. Without a root there is nowhere to create the bridge's state/staged/surfaced directories.","triggerScenarios":"Starting the Claude message bridge in an environment with both state-root env vars unset and no home directory resolvable — unset HOME/USERPROFILE, getpwuid failure, stripped container or service context.","commonSituations":"Running the Claude harness in Docker/systemd/CI where HOME was never set; the env vars that override state location not being propagated to the agent process; hardened images with synthetic users lacking passwd entries.","solutions":["Set OZ_MESSAGE_LISTENER_STATE_ROOT_ENV to a writable directory; it takes precedence over home.","Otherwise set HOME (or USERPROFILE) to a writable path in the agent's environment.","Confirm with: printenv OZ_MESSAGE_LISTENER_STATE_ROOT HOME before launching."],"exampleFix":"# before\nwarp agent run --harness claude …  # no state-root env, no HOME\n\n# after\nexport OZ_MESSAGE_LISTENER_STATE_ROOT=/var/lib/warp/oz-message-listener\nwarp agent run --harness claude …","handlingStrategy":"validation","validationCode":"let state_root_ok = [OZ_MESSAGE_LISTENER_STATE_ROOT_ENV, LEGACY_MESSAGE_LISTENER_STATE_ROOT_ENV]\n    .iter()\n    .any(|k| std::env::var(k).map(|v| !v.is_empty()).unwrap_or(false))\n    || dirs::home_dir().is_some();\nanyhow::ensure!(state_root_ok, \"set OZ_MESSAGE_LISTENER_STATE_ROOT or HOME\");","typeGuard":"fn bridge_state_root_resolvable() -> bool {\n    dirs::home_dir().is_some()\n        || std::env::var(\"OZ_MESSAGE_LISTENER_STATE_ROOT\").map(|v| !v.is_empty()).unwrap_or(false)\n}","tryCatchPattern":"match bridge_state_root() {\n    Err(err) if err.to_string().contains(\"could not determine home directory\") => {\n        std::env::set_var(\"OZ_MESSAGE_LISTENER_STATE_ROOT\", \"/tmp/warp-bridge\");\n        bridge_state_root()\n    }\n    rest => rest,\n}","preventionTips":["Inject OZ_MESSAGE_LISTENER_STATE_ROOT (a writable dir) in headless/container Claude-harness deployments.","Keep HOME set as a baseline in all service environments.","Preflight env vars when orchestrating many agent sessions from a supervisor."],"tags":["environment","home-directory","claude-code","message-bridge","rust"],"backgroundTag":null,"analyzedSha":"e72fd7aacbbb2236d9b3be2aad7e7178fe94b4bc","analyzedAt":"2026-08-16T08:27:25.381Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}