Yeachan-Heo/oh-my-codex · error · Error

shutdown_shared_session_${kind.replaceAll(' ', '_')}_owner_u

Error message

shutdown_shared_session_${kind.replaceAll(' ', '_')}_owner_unavailable:${paneId}:${owner.error}

What it means

Thrown when reading the team owner tag for a pane during shutdown fails outright (read error, not just a mismatch). The owner tag establishes which team owns the pane; without it, shutdown cannot safely act on the pane.

Source

Thrown at src/team/runtime.ts:5191

      paneId: string,
      kind: 'HUD pane' | 'restore leader pane',
      expectedPid?: number | null,
    ): FrozenSharedPaneAuthorization => {
      const proof = readExactPaneProofSync(paneId);
      if (proof.status !== 'live') {
        throw new Error(`shutdown_shared_session_${kind.replaceAll(' ', '_')}_proof_unavailable:${paneId}`);
      }
      if (typeof expectedPid === 'number') {
        if (!Number.isSafeInteger(expectedPid) || expectedPid <= 0) {
          throw new Error(`shutdown_shared_session_${kind.replaceAll(' ', '_')}_pid_missing:${paneId}`);
        }
        if (proof.pid !== expectedPid) {
          throw new Error(`shutdown_shared_session_${kind.replaceAll(' ', '_')}_identity_changed:${paneId}`);
        }
      }
      const owner = readPaneTeamOwnerTagResult(paneId);
      if (owner.status === 'error') {
        throw new Error(`shutdown_shared_session_${kind.replaceAll(' ', '_')}_owner_unavailable:${paneId}:${owner.error}`);
      }
      if (owner.status !== 'value' || !tmuxPaneOwnerId || owner.value !== tmuxPaneOwnerId) {
        throw new Error(`shutdown_shared_session_${kind.replaceAll(' ', '_')}_owner_changed:${paneId}`);
      }
      return { paneId, pid: proof.pid, owner: owner.value };
    };
    const assertSharedPaneAuthorizationContinuous = (
      authorization: FrozenSharedPaneAuthorization,
      kind: 'HUD pane' | 'restore leader pane',
    ): void => {
      const scope = sharedSessionTopology ? 'shared_session' : 'detached_session';
      const proof = readExactPaneProofSync(authorization.paneId);
      if (proof.status !== 'live' || proof.pid !== authorization.pid) {
        throw new Error(`shutdown_${scope}_${kind.replaceAll(' ', '_')}_identity_changed:${authorization.paneId}`);
      }
      const owner = readPaneTeamOwnerTagResult(authorization.paneId);
      if (owner.status === 'error') {
        throw new Error(`shutdown_${scope}_${kind.replaceAll(' ', '_')}_owner_unavailable:${authorization.paneId}:${owner.error}`);

View on GitHub (pinned to 3ad79a8a6f)

Solutions

  1. Check the appended owner.error text for the underlying tmux failure
  2. Confirm the tmux server is alive (tmux info) and the pane still exists, then retry shutdown
  3. Verify your tmux version supports pane user options (@-prefixed options) used for owner tags
Defensive patterns

Strategy: retry

Validate before calling

const ownerOk = (paneId) => readPaneTeamOwnerTagResult(paneId).status !== 'error';

Try / catch

catch (e) { if (/owner_unavailable:.*:.+/.test(e.message)) await sleep(250), retryShutdown(); }

Prevention

When it happens

Trigger: readPaneTeamOwnerTagResult(paneId) returns {status:'error'} — the tmux user-option lookup failed, e.g. tmux error, unknown option error, or IPC failure; the raw error is appended to the message.

Common situations: tmux server restarted or socket unavailable mid-shutdown; pane destroyed between proof read and owner read (TOCTOU); tmux version that does not support the user option used for tagging.

Related errors


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