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

  1. Clear persisted hud_pane_id/hud_pane_pid and re-run shutdown
  2. Manually kill the reused pane if it is a leftover shell
  3. 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

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


AI-assisted analysis of Yeachan-Heo/oh-my-codex@3ad79a8a6f (2026-08-27). Data as JSON: /api/errors/4772d29ed3336f13. Report an issue: GitHub.