diff --git a/CHANGELOG.md b/CHANGELOG.md
index d8d88d5..2d9906a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,32 @@ ships (the engine drives 0.14 → 0.15; each product's patch number advances
independently). The exact pinned engine commit is recorded by the `MandoCode`
submodule.
+## [0.14.1] — 2026-07-28
+
+First-five-minutes polish from watching 0.14.0's fresh-machine debut, plus honest guidance
+about cloud model pricing.
+
+### Changed
+- **New agents get callsigns by default.** Tabs now open as Morphy, Kernel, Cloud — the
+ 500-name deck — instead of Agent 1, Agent 2. Numbered naming is still one Settings toggle
+ away, and anyone who had explicitly chosen it keeps their choice (only the default flipped).
+- **The "can't reach Ollama" screen puts the likely fix first.** On a machine without Ollama,
+ the options now read: Install Ollama for me → Open the Ollama Download Page (I'll install it
+ myself) → Change the Endpoint URL (Not Recommended) → Retry → Cancel Setup. The endpoint
+ override — the option a fresh machine never needs — used to lead the list. The message now
+ opens with a plain-language diagnosis ("Ollama isn't running on this computer — it may not
+ be installed yet") instead of a raw socket error; the technical detail still shows, dimmed.
+
+### Added
+- **Cloud subscription awareness.** Cloud models on ollama.com now require an account with an
+ active cloud subscription — without one, requests fail with 403 Forbidden, which previously
+ surfaced as a raw error that looked like the app breaking. The subscription requirement is
+ now stated everywhere a cloud model is chosen (the starter picker, the sign-in prompt, and
+ on every model switch to a `:cloud` tag), and a 403 response gets its own explanation card
+ naming the real cause and the two real exits (subscribe, or `/model` to a free local model).
+ Deliberately distinct from the 401 path: 403 does *not* trigger the sign-in walkthrough,
+ which cannot fix it and would loop.
+
## [0.14.0] — 2026-07-28
**The first public release of MandoCode Desktop** — the WinUI 3 desktop home for the MandoCode
diff --git a/src/MandoCode.Desktop.Tests/ResponseStreamerTests.cs b/src/MandoCode.Desktop.Tests/ResponseStreamerTests.cs
index 4e1be7d..01d3fc6 100644
--- a/src/MandoCode.Desktop.Tests/ResponseStreamerTests.cs
+++ b/src/MandoCode.Desktop.Tests/ResponseStreamerTests.cs
@@ -143,6 +143,34 @@ public async Task NormalResponse_DoesNotInvoke401()
Assert.False(fired);
}
+ [Fact]
+ public async Task Response_LookingLike403_ExplainsSubscription_NotSignIn()
+ {
+ // 403 = signed in but no cloud subscription. The sign-in walkthrough (401 recovery)
+ // must NOT fire — it would loop uselessly — and the card must name the real cause.
+ var (s, blocks) = Make(new FakeAiService(new[] { "Error: HTTP 403 (Forbidden) from ollama.com" }));
+ var signInFired = false;
+ s.On401 = () => { signInFired = true; return Task.CompletedTask; };
+
+ await s.StreamAsync("hi", CancellationToken.None);
+
+ Assert.False(signInFired);
+ Assert.Contains(blocks, b => b.StartsWith("WARN:") && b.Contains("subscription"));
+ Assert.Contains(blocks, b => b.StartsWith("DIM:") && b.Contains("/model"));
+ }
+
+ [Fact]
+ public async Task NormalResponse_DoesNotEmit403Card()
+ {
+ // "403" alone in prose (e.g. a line number or HTTP discussion) must not trigger —
+ // the match requires "forbidden" too.
+ var (s, blocks) = Make(new FakeAiService(new[] { "see RFC 9110 section 403 for details" }));
+
+ await s.StreamAsync("hi", CancellationToken.None);
+
+ Assert.DoesNotContain(blocks, b => b.Contains("subscription"));
+ }
+
[Fact]
public async Task Cancellation_SurfacesAsWarning_NotThrow()
{
diff --git a/src/MandoCode.Desktop/MainWindow.xaml b/src/MandoCode.Desktop/MainWindow.xaml
index 699bb73..a3cdd2d 100644
--- a/src/MandoCode.Desktop/MainWindow.xaml
+++ b/src/MandoCode.Desktop/MainWindow.xaml
@@ -1059,7 +1059,7 @@
the change; existing tabs keep their names. -->
+ ToolTipService.ToolTip="On (default): each new agent draws a random callsign — Morphy, Kernel, Cloud — from a 500-name deck that doesn't repeat until it runs dry. Off: new agents are Agent 1, Agent 2, … Renaming a tab always works either way."/>
diff --git a/src/MandoCode.Desktop/MainWindow.xaml.cs b/src/MandoCode.Desktop/MainWindow.xaml.cs
index 339059e..ee40070 100644
--- a/src/MandoCode.Desktop/MainWindow.xaml.cs
+++ b/src/MandoCode.Desktop/MainWindow.xaml.cs
@@ -102,7 +102,10 @@ public MainWindow()
_historySeenAt = panelState.HistorySeenAt;
_lastNotePath = panelState.LastNotePath;
_noteModel = panelState.NoteModel;
- AgentCallsigns.Enabled = panelState.AgentCallsigns ?? false;
+ // Callsigns are the default face; numbered agents are the opt-in. The null-coalesce
+ // matters: a user who explicitly toggled numbering keeps it (saved false), while
+ // fresh installs and pre-0.14.1 panel states get callsigns.
+ AgentCallsigns.Enabled = panelState.AgentCallsigns ?? true;
// The editor writes note content; the panel only lists. One store, handed over once.
NoteEditor.Store = _notes;
WireNotesPanel();
diff --git a/src/MandoCode.Desktop/MandoCode.Desktop.csproj b/src/MandoCode.Desktop/MandoCode.Desktop.csproj
index ca9514f..7ce8f40 100644
--- a/src/MandoCode.Desktop/MandoCode.Desktop.csproj
+++ b/src/MandoCode.Desktop/MandoCode.Desktop.csproj
@@ -14,7 +14,7 @@
true
enable
enable
- 0.14.0
+ 0.14.1
Armando Fernandez (DevMando)
MandoCode Desktop — the MandoCode AI coding agent with a native WinUI 3 interface.