16def7b8cc
A welcome-tier 403 classifies as auth_permanent, so the desktop's error surface mapped it to "Your Nous Portal sign-in expired" with a Nous Portal re-login button — the chat sentence never reached the user. Terminal results on the free route now carry a structured free_tier block (kind + the chat sentence); agent/error_surface.py turns it into a free_tier_<kind> code on the provider layer with the sentence as `message`. The desktop gives those codes their own titles, shows the backend sentence as the body, and offers "Sign in with a Nous account" (the free-tier dialog) instead of the OAuth re-login, with Retry only where a later send can succeed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>