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.
xmark.circle.fill, red. Once, on the project that stopped.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.
Per-project. The one place red is correct — a run did not complete. Read-only row; the action lives in the right-click menu.
Register: ERROR. Red ✕ + red reason on the row — read-only. Action is Reanalyse in the right-click menu, not an inline button.
Analyse for the not-yet-succeeded case and reserves Reanalyse for a completed report — pick one.
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.
Add credit to run new analysis or coding.
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.)
console.anthropic.com, ChatGPT → platform.openai.com.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.
Register: none in the content. The pill is the only tell.
outOfCredit signal to reach the toolbar model.categoriseFailure matches rate limit|quota|429 but not the 402 credit balance too low — surface 1’s red reason may mis-label. Add the 402 string.errors counter — since there’s no inline warning, they should at least fail cleanly (empty result, not a wrong one), reason in the log.billing: URL for “Add funds…” (the console: URLs are homes, not add-funds pages).StatusPill shell (capsule + popover plumbing only) that both this and OllamaDownloadPill consume, so the two can’t drift. Content stays per-pill — don’t abstract the phases / progress / popover bodies. If the envelope ever needs to diverge, keep them separate; don’t force it..status is a non-issue — the out-of-credit pill is cloud-only, the Ollama pill is local-setup, so an active-provider gate keeps them mutually exclusive.