Where: apps/web/src/lib/format.ts — friendlyError().
friendlyError maps 502/504 → "box unreachable", plus 429, 403 and network-level 0 — but has no 503 case, so a 503 surfaces the raw server message. The kernel now returns 503 deliberately in at least one place (semantic search with no embedding worker running, which sets Retry-After), and the Semantic tab has to special-case the message itself because of this gap.
Fix: add a 503 branch returning an operator-readable "service temporarily unavailable — retry shortly" style message, then drop the now-redundant special-case in apps/web/src/modules/search/page.tsx.
Good first issue because: a small, well-bounded change in one helper plus one call site, with the existing branches as a template.
Where:
apps/web/src/lib/format.ts—friendlyError().friendlyErrormaps 502/504 → "box unreachable", plus 429, 403 and network-level 0 — but has no 503 case, so a 503 surfaces the raw server message. The kernel now returns 503 deliberately in at least one place (semantic search with no embedding worker running, which setsRetry-After), and the Semantic tab has to special-case the message itself because of this gap.Fix: add a 503 branch returning an operator-readable "service temporarily unavailable — retry shortly" style message, then drop the now-redundant special-case in
apps/web/src/modules/search/page.tsx.Good first issue because: a small, well-bounded change in one helper plus one call site, with the existing branches as a template.