Yeachan-Heo/oh-my-codex · error · Error
shutdown_detached_session_HUD_pane_identity_changed:${effect
Error message
shutdown_detached_session_HUD_pane_identity_changed:${effectiveHudPaneId} What it means
Detached-session HUD authorization requires the live pane proof PID to equal the persisted hudPanePid. This error means the pane id resolves to a live pane whose PID differs — the original HUD process is gone.
Source
Thrown at src/team/runtime.ts:5240
if (persistedHudPaneId && effectiveHudPaneId === persistedHudPaneId && (typeof hudPanePid !== 'number' || !Number.isSafeInteger(hudPanePid) || hudPanePid <= 0)) {
const scope = sharedSessionTopology ? 'shared_session' : 'detached_session';
throw new Error(`shutdown_${scope}_HUD_pane_pid_missing:${effectiveHudPaneId}`);
}
const frozenHudAuthorization = effectiveHudPaneId
? (sharedSessionTopology
? freezeSharedPaneAuthorization(
effectiveHudPaneId,
'HUD pane',
effectiveHudPaneId === persistedHudPaneId ? hudPanePid : undefined,
)
: (() => {
if (!persistedHudPaneId || effectiveHudPaneId !== persistedHudPaneId || !tmuxPaneOwnerId
|| typeof hudPanePid !== 'number' || !Number.isSafeInteger(hudPanePid) || hudPanePid <= 0) {
throw new Error(`shutdown_detached_session_HUD_pane_authorization_unavailable:${effectiveHudPaneId}`);
}
const proof = readExactPaneProofSync(effectiveHudPaneId);
if (proof.status !== 'live' || proof.pid !== hudPanePid) {
throw new Error(`shutdown_detached_session_HUD_pane_identity_changed:${effectiveHudPaneId}`);
}
const owner = readPaneTeamOwnerTagResult(proof.paneId);
if (owner.status !== 'value' || owner.value !== tmuxPaneOwnerId) {
throw new Error(`shutdown_detached_session_HUD_pane_owner_changed:${effectiveHudPaneId}`);
}
const finalProof = readExactPaneProofSync(proof.paneId);
if (finalProof.status !== 'live' || finalProof.pid !== hudPanePid) {
throw new Error(`shutdown_detached_session_HUD_pane_identity_changed:${effectiveHudPaneId}`);
}
return { paneId: finalProof.paneId, pid: hudPanePid, owner: tmuxPaneOwnerId };
})())
: null;
if (persistedLeaderPaneId && trustedHudRestoreLeaderPaneId === persistedLeaderPaneId && (typeof leaderPanePid !== 'number' || !Number.isSafeInteger(leaderPanePid) || leaderPanePid <= 0)) {
throw new Error(`shutdown_shared_session_restore_leader_pane_pid_missing:${trustedHudRestoreLeaderPaneId}`);
}
const frozenRestoreLeaderAuthorization = sharedSessionTopology && trustedHudRestoreLeaderPaneId
? freezeSharedPaneAuthorization(
trustedHudRestoreLeaderPaneId,View on GitHub (pinned to 3ad79a8a6f)
Solutions
- Clear persisted hud_pane_id/hud_pane_pid and re-run shutdown
- Manually kill the reused pane if it is a leftover shell
- Prevent respawn hooks from reusing HUD panes
Defensive patterns
Strategy: validation
Validate before calling
const p = readExactPaneProofSync(hudPaneId); if (p.status !== 'live' || p.pid !== hudPanePid) clearPin();
Prevention
- Disable respawn-pane automation on HUD panes
- Clear stale pins on startup
When it happens
Trigger: Detached topology, first readExactPaneProofSync(effectiveHudPaneId) returns live but proof.pid !== hudPanePid.
Common situations: tmux pane respawn/reuse under the same %id; stale config from a previous detached run; the HUD process crashed and tmux respawned a shell in the pane.
Related errors
- detached Hermes leader has no tmux pane identity
- omx question cannot open a visible renderer because this tmu
- shutdown_shared_session_${kind.replaceAll(' ', '_')}_identit
- shutdown_detached_session_HUD_pane_authorization_unavailable
- tmux pane identity changed: ${normalizedLeaderPaneId}
AI-assisted analysis of Yeachan-Heo/oh-my-codex@3ad79a8a6f (2026-08-27).
Data as JSON: /api/errors/4772d29ed3336f13.
Report an issue: GitHub.