Skip to content

Statusline & Notices

The three-line footer, every indicator, and the toast notices Soma shows you — including the preload lifecycle.

Soma renders a three-line footer beneath the prompt and surfaces short toast notices for events worth knowing. This page is the canonical reference for both — what each glyph means, and which notice fires when.

╭─ Opus-4.6─◉36%─$1.01─◷4:15─♥on
│  ⊚ main 🌿soma ¶12 📝saved
╰─ ~/project 5m33s +72-2

The statusline is rendered by soma-statusline.ts. Notices are emitted by soma-breathe.ts (preload lifecycle) and soma-guard.ts (guards).

Line 1 — model, context, cost, cache

╭─ <model> ◉<context%> $<cost> ◷<cache-ttl> ♥<keepalive>

GlyphMeaning
<model>Active model (e.g. Opus-4.6), with thinking level appended (• high) when reasoning is on.
◉<n>%Context window used. Yellow ≥ 50%, red ≥ 75%.
$<n> / FreeSession cost so far. Free when the model has no metered cost.
◷<m:ss>Time left on the Anthropic prompt-cache TTL (5 min). The keepalive refreshes it.
♥on / ♥<n>Keepalive: ♥on (dim) when idle, ♥<n> (green) showing pings sent. Absent if keepalive is disabled.
<n>invGuard interventions this session (yellow > 0, red > 5). Only shown when non-zero.

Line 2 — session state

│ <git> 🌿soma ¶<turns> [📋<session>] [📝<scratch>] [📝saved\|📝stale] [⚠ IDLE] [⬆ update]

GlyphMeaning
/ Git: clean ( blue) or dirty ( yellow), followed by the branch.
🌿somaSoma is active in this directory.
¶<n>Turn count this session.
📋<id>Session id (when shown).
📝<n>Scratchpad note count.
📝savedA preload for this session is written to disk and will auto-load next session (green).
📝staleA preload exists but ≥ 5 state-changing tool calls happened since (yellow) — consider /exhale to refresh.
⚠ IDLE <n>mNo user input for ≥ 5 min while keepalives burn tokens.
⬆ updateA newer Soma version is available.

The 📝saved/📝stale indicator is passive and persistent — it reflects the preload lifecycle state every render. A prior session’s preload never shows green: only a preload written this session (file mtime ≥ session start) lands as saved.

Line 3 — location, runtime, restart signals

╰─ <cwd> <runtime-branch> <uptime> <diff> [restart-tag]

GlyphMeaning
<cwd>Current working directory.
(main)Runtime on plain stable main (dim).
(main +dev)main with dev code synced in (yellow).
(⚡dev) / (⚡detached)Runtime on the dev branch / a detached HEAD (red).
<uptime>Session uptime.
+<n>-<m>Uncommitted diff size (lines added / removed).

Restart tags — appear when a change touches files the running session might want to pick up. Each tells you exactly what to do:

TagTriggerAction
🔄 /reloadextensions/*.ts, core/*.ts editedRun /reload to re-import.
⚠ sync dev + /reloadA reload-class edit landed in a different worktree than the runtime loads fromsoma-dev sync dev, then /reload.
📝 /rebuild?body/*.md editedOptional — only if you want it applied mid-session. Skip freely; preloads/journal/identity land naturally on fresh boot.
⚠ relaunchdist/*, core/*.js (Pi’s static imports, frozen at boot)/exit, then soma. /reload can’t help.

Preload notices

When you write a preload (via /exhale, /breathe, or a direct write of a preload-*.md file), Soma confirms it once and validates it. The canonical detector is the soma-breathe.ts tool_result handler, which drives the shared preload lifecycle state machine; the statusline 📝saved indicator and these toasts read that one source.

NoticeWhen
✅ Preload written: <file> (N lines)A preload was written — with line count and any recommended-section hints.
✅ Preload updated: <file> (N lines)An existing preload was edited.
⚠️ Preload missing required sections: …The preload lacks ## What Shipped or ## Start Here.
⚠️ Preload is thin (N lines)Written but very short — add more detail for your next self.
🟡 Preload now stale (N tool calls since save)≥ 5 state-changing tool calls happened after the save — /exhale to refresh.
📦 Archived N old preloadsOlder preloads (> 7 days) were cleaned up after the new one landed.

One confirmation per write. A single preload write produces exactly one confirmation toast () plus the persistent statusline 📝saved indicator — never a second “saved” toast. The 🟡 stale warning is the only transition notice (nothing else surfaces staleness). This invariant is documented at the top of extensions/_shared/preload-lifecycle.ts and guarded by tests/test-sx786-preload-notice.sh.

At high context, the breathe extension also nudges you toward rotation (Context N% — preload saved, /breathe to rotate). That’s rotation guidance, gated to fire once per threshold (50/70/80%) — distinct from the write confirmation above.

  • Commands/exhale, /breathe, /inhale, /keepalive, /status.
  • Sessions — the preload + exhale cycle in depth.
  • Configuration — context thresholds, keepalive, guard settings.