---
title: Work through interrupted sessions — auto-advance
---

# Work through interrupted sessions — auto-advance

## What it is

When you act on a session in the sidebar's **Interrupted** section, Omniscio moves you straight to the **next Interrupted session** — so you can clear the pile one by one without hunting for the next row. It behaves exactly like the **Needs You** and **Paused** sections: act on one, land on the next in that same section, and bounce back to the previous row when you act on the last one. It never crosses into another section (Live / Paused / Needs You).

The Interrupted section is broader than just "dead" sessions — it holds every session that stopped without delivering a final message: `ended` (finished/dead), `waiting` (rate-limit parked), non-reconnecting `error`/`stalled`, and the failed `needs_you` sub-states (give-up, api/auth error, user-stopped, aborted, sub-agent timeout, suspended). Acting on ANY of them advances to the next Interrupted session, whatever its status. (Before 2026-08-23 the advance covered only `ended` rows, so acting on a waiting/errored one could skip the next interrupted row or jump you into Live — now fixed; the advance follows the whole section.)

"Act on" means any of the ways you clear an interrupted session:

- **Archive** it (middle-click, right-click → Archive, or **E** / **Ctrl+W**).
- **Snooze** it.
- **Revive** it — send a message, click the "Please continue" nudge, or **Restart**.

## Where to find it

There is nothing to switch on. The behavior belongs to the sidebar's **Interrupted** section: act on a session there and the next one opens by itself. The same auto-advance applies to the **Needs You** and **Paused** sections.

## How it behaves

### The order it picks the next session

1. **Next Interrupted session** — the next member of that project's visible Interrupted section, in the same top-to-bottom order you see in the sidebar. Start at the top, middle, or bottom; it never repeats or skips, and when you act on the last row it steps back up to the previous one (never wraps to the top).
2. **Section exhausted → the on-screen neighbour** — when the row you acted on was the last one in its section, selection falls through to whatever sits next to it in the visible list (the same "land on the row below" behaviour every non-attention row uses). It deliberately does NOT jump to the oldest Needs You — that would break inbox parity and re-introduce the "lands on the oldest sibling, not the on-screen neighbour" bug.

### When it does NOT apply

- **The row isn't in the Interrupted (or Paused) section.** A Live (running) row keeps its own on-screen-neighbour behaviour; a Paused row advances within Paused; a genuine Needs You row advances within Needs You.
- **You're not on that session.** It only advances when the interrupted row you acted on is the one you're actually viewing. A background delivery landing on an off-screen row won't yank your view.
- **You're in the global Inbox, or a special session area.** It's scoped to a regular project's session list — the Inbox and the OpenClaw / Ask-Omniscio / Session-Search virtual areas are excluded, and the inbox advance stays status-blind.
- **The interrupted rows aren't visible.** If you've turned off "show ended sessions" or collapsed the Interrupted group, there are no visible rows to jump to, so it falls through to the on-screen neighbour.

## For agents

### Where it lives in code

The selection logic lives in the action-advance transition of the nav machine:

- `sessionTriageSection(session)` in [session-nav-lists.ts](../../src/renderer/src/stores/session-nav-lists.ts) — classifies a row into its triage section (`'interrupted'` via the shared `isInterruptedSectionMember`, `'paused'`, or `null`), the SAME rule the sidebar section split uses, so the advance order and the rendered section can never drift.
- `getProjectSectionPileInOrder(...)` — builds the project's visible session order (`getVisibleProjectSessionsInOrder` — the same source the sidebar + keyboard nav use, so show-ended / collapse / snooze gates all apply for free) filtered to the acted-on row's section.
- `resolveTriagePileTarget(...)` in [session-nav-machine.ts](../../src/renderer/src/stores/session-nav-machine.ts) — walks that section with `findNextItem` (same-group advance + bounce-back), or returns `null` (fall through) when the section is exhausted.

It fires ONLY from the action-advance intent (archive / snooze / close / clear / restart / continue), gated to a real project view. For a middle-click / X close of a live-ish interrupted row (which terminate-firsts — flipping the status to `terminating` before the advance runs) the section is captured PRE-terminate as the intent's `currentSection`, so the advance still stays in-section. The inbox advance and the typed-reply post-send cascade stay status-blind — they never call the pile. Invariants + tests: [inbox-navigation-contract.md](../../.claude/memory/contracts/inbox-navigation-contract.md) (`project-pile-triage`) + [session-nav-machine-contract.md](../../.claude/memory/contracts/session-nav-machine-contract.md).

## Related

- [interrupted-sessions-section.md](interrupted-sessions-section.md) — the Interrupted section itself (which sessions group there)
- [paused-session-triage.md](paused-session-triage.md) — the same auto-advance for the Paused section
- [archive-a-session.md](archive-a-session.md) — removing a session from the sidebar
- [stalled-session.md](stalled-session.md) — the stalled state
- [session-stuck-in-needs-you.md](session-stuck-in-needs-you.md) — when a row is stuck amber
- [crash-recovery.md](crash-recovery.md) — sessions interrupted by an app crash/restart
