Out-of-credit — surfaces & registers

One condition (provider authenticated, balance empty). Three surfaces, nothing more: the run that stopped, the toolbar pill, and — while browsing — nothing. The pill’s popover is the only resolve surface. Settings and the content area are untouched. Low-fi. Nothing built.

·The register legend

Failed run
ERROR — a run that didn’t complete. xmark.circle.fill, red. Once, on the project that stopped.
Standing state
The toolbar pill: amber dot, no glyph. Colour + label carry it. Persistent while unresolved.
— Browsing
Nothing. Reports are static data; no glyph, no colour. Absence is information.

Governing rule (already in the code): red is reserved for dead / didn’t-complete (invalid key, failed run); amber is recoverable / needs-action. Out-of-credit is authenticated and canActivate=true — so amber, never red, except at the instant a run fails.

1The run that stopped → sidebar row · red ✕

Per-project. The one place red is correct — a run did not complete. Read-only row; the action lives in the right-click menu.

ProjectSessionsQuotes
Right-click the project
Reanalyse
Show diagnostics…
Show in Finder
Remove from Sidebar

Register: ERROR. Red ✕ + red reason on the row — read-only. Action is Reanalyse in the right-click menu, not an inline button.

No content-area takeover. The run fails near-instantly (preflight / first call) — no sustained processing, so no shoal animation, nothing on the canvas. The failure lives on the row; clicking the ✕ opens the diagnostic popover. Menu term: code uses Analyse for the not-yet-succeeded case and reserves Reanalyse for a completed report — pick one.

2The standing condition → toolbar pill + popover · amber dot

App-global — blocks LLM work everywhere, so it rides the .status zone (reused from the Ollama pill). Amber dot, no triangle. The popover drops from the pill and is the only place to resolve it — nothing in the content area.

ProjectQuotes
Claude · no credit
Claude is out of credit

Add credit to run new analysis or coding.

Add funds…Switch provider…

Register: standing state. Amber dot + label; click → NSPopover (light-dismiss), dropping from the pill. Cloud-only. Clears on top-up or switch.

Icon spec: the dot is Image(systemName: "circle.fill").foregroundStyle(.orange) — the same ProviderStatus.dotColor shown in Settings, so one amber dot reads across both surfaces. (A creditcard glyph is a nicer touch — parked for later.)

Popover actions

Pill follows the active provider

Claude · no credit ChatGPT · no credit

3Browsing, or reaching for AutoCode → nothing new · pill is enough

A finished report is static data — it opens, searches, edits, exports with a dead key. The pill already says why LLM work won’t run, so AutoCode / codebook / elaboration get no bespoke inline warning. No extra chrome; the pill carries it.

ProjectCodebook
Claude · no credit

Register: none in the content. The pill is the only tell.

Code seams these two surfaces need (flagged, not built).