---
title: Show system messages (per-session diagnostic toggle)
---
# Show system messages

## What it is

### What it does

The chat panel's default view — the [real-conversation layout](real-conversation-layout.md) — hides the "plumbing" rows that Omniscio generates around your actual conversation, so a long session reads as the dialogue you actually had. Most of the time that's what you want. But sometimes you need to confirm the plumbing is working: did the OAuth retry actually fire? did the account-switch recovery happen? is the away-mode auto-reply going out? **Show system messages** is a per-session toggle that reveals those hidden rows for one session at a time.

Turn it on for a session and the chat panel adds back three classes of rows that the default view folds away. Turn it off and the session goes back to the clean conversation view. Each session remembers its own setting, and the setting survives an app restart — so you can leave it on for the one session you're debugging without affecting any other session.

It is **off by default**, and turning it on changes only what you _see_ — it never alters, deletes, or re-fetches anything. The hidden rows were always stored and always available; the toggle just unfolds them in the chat view.

### What you see when it's on

With the toggle ON, these three normally-hidden row classes appear inline in the conversation, in the order they happened:

- **System status events** — plain unkinded rows like "Session ready" bootstrap chatter. (See "What stays the same" below for the kinded ones, which are always visible regardless of the toggle — with the one exception called out there.)
- **System-injected continues** — the "Please continue" style prompts Omniscio sends _on your behalf_, not messages you typed: auto-continue after an interrupted answer, stall-retry, rate-limit recovery, crash recovery, and restart recovery. When revealed they appear as their own turns so you can see exactly when each one fired.
- **Away-mode auto-replies** — the rule-driven automatic responses Omniscio sends while you're away (e.g. an SMS auto-reply like "I'm asleep right now, will reply in the morning").

With the toggle OFF (the default), none of those three classes render — the view shows only your real messages and the agent's real replies.

**Plus a kinded exception — interruption notices.** A small family of "session interrupted" rows are _kinded_ but, unlike the other kinded markers below, are **hidden by default** (chat clutter, not signal) and revealed only by this toggle: the "Session interrupted — app closed unexpectedly" row written for each running session when Omniscio restarts after an _unclean_ shutdown, and — as of 2026-08-12 — the "Session interrupted when the app closed…" row written for a mid-work session at a _normal_ app-close (previously a loud card that appeared on every close for Codex and other non-Claude engines, since those never take Claude's quieter "will resume on restart" path). None are ever deleted — the rows stay in the database and search/export still find them. See [crash-interruption-notice-contract.md](../../.claude/memory/contracts/crash-interruption-notice-contract.md).

### Why this exists

The real-conversation layout deliberately folds plumbing rows so long, tool-heavy sessions read as a conversation instead of a wall of noise. That's the right default for _reading_, but it's the wrong default for _debugging_ — when you're checking whether a recovery, retry, or away-mode rule actually fired, you need to see the plumbing. Rather than make everyone choose between "readable" and "complete", Omniscio keeps the clean view as the default and gives you a per-session escape hatch for the one session where you need the detail.

This is **not** the same thing as the older, rejected idea of hiding system rows in the database query and surfacing them behind a button. That approach made the stored timeline lie about what existed. This toggle does the opposite: the database always returns everything, and the toggle only changes how the already-loaded rows are folded for display. (See the reconciliation note in `show-all-messages-system-only-postmortem.md` in the repo for the full history of why these are different.)

## Where to find it

### How to turn it on

1. Open the session you want to inspect.
2. Click the **⋯ overflow menu** in the session header.
3. Expand **More**.
4. Under **Filter Messages**, click **Show system messages** (wrench icon). A check mark appears when it's on.
5. Click it again to turn it back off.

The chat re-renders immediately when you toggle it — no reload needed.

> **Note:** this toggle only has an effect when the real-conversation layout is on (the default). If you've turned the real-conversation layout _off_ (Settings → Sessions → "Real-conversation layout"), the chat already shows every row — including all the system and auto-reply rows — so there is nothing for this toggle to reveal.

## How it behaves

### What stays the same

- **Kinded system markers always render — toggle or not.** Compaction dividers, snooze markers, rate-limit notices, auth-retry messages, seed-context rows, and sub-agent results are _kinded_ system rows; they show up in the conversation view whether or not the toggle is on. The toggle governs the three classes listed above (the unkinded system events, the system-injected continues, and the away-mode auto-replies) — **plus a deliberate exception: the interruption notices** (the unclean-restart "Session interrupted — app closed unexpectedly" and the normal-app-close "Session interrupted when the app closed…"), which are kinded but hidden by default and revealed by this toggle (see the note above).
- **It's per-session and persistent.** Each session has its own setting, stored on the session row. Flipping it for one session leaves every other session untouched, and the choice is remembered across restarts.
- **It's render-only.** The rows it reveals are always kept in the database. Nothing is deleted, nothing is hidden from storage, and toggling does not re-query anything — it re-folds rows the panel already has.
- **Search, export, share, and audit are unaffected.** Those features always saw every row regardless of this toggle; they don't go through the conversation-view fold at all.

## For agents

### Where it lives in code

| What                                                                                         | Where                                                                                                                                                                                            |
| -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Persisted column `sessions.show_system_messages` (schema v224, default `0`)                  | [src/main/db/database.ts](../../src/main/db/database.ts)                                                                                                                                         |
| `Session.showSystemMessages: boolean`                                                        | [src/shared/types.ts](../../src/shared/types.ts)                                                                                                                                                 |
| IPC channel `SESSION_SET_SHOW_SYSTEM_MESSAGES` + push `SESSION_SHOW_SYSTEM_MESSAGES_CHANGED` | [src/shared/ipc-channels/index.ts](../../src/shared/ipc-channels/index.ts)                                                                                                                       |
| Store action `setShowSystemMessages` + push reducer `updateSessionShowSystemMessages`        | [src/renderer/src/stores/session-store.ts](../../src/renderer/src/stores/session-store.ts)                                                                                                       |
| Menu item (⋯ → More → Filter Messages → Show system messages)                                | [src/renderer/src/features/sessions/SessionOverflowMenu.tsx](../../src/renderer/src/features/sessions/SessionOverflowMenu.tsx)                                                                   |
| Render-time fold the toggle overrides                                                        | `buildRealConversationTurns(messages, { excludeAutoResponses, showSystemMessages })` in [src/renderer/src/lib/real-conversation-turns.ts](../../src/renderer/src/lib/real-conversation-turns.ts) |
| Call site that reads the flag and recomputes turns                                           | [src/renderer/src/features/sessions/useSessionPanel/useSessionConversationTurns.ts](../../src/renderer/src/features/sessions/useSessionPanel/useSessionConversationTurns.ts)                     |
| Build contract (R18 / AC20)                                                                  | [.claude/memory/project_real_conversation_layout.md](../../.claude/memory/project_real_conversation_layout.md)                                                                                   |

## Related

- [real-conversation-layout.md](real-conversation-layout.md) — the default chat view whose hidden rows this toggle reveals.
- [lazy-content-load.md](lazy-content-load.md) — the lite cold-mount data layer the conversation view consumes.
