WHICH UPDATE REFUSALS ACTUALLY REACH AN ENGLISH HOUSEHOLD IN ENGLISH
2026-09-21, guest 9202, controller v0.261.0.  `langFor` DOES honour ?lang= (api/i18n_api.go:30).

  glance         hu  http=409  reason=held           :: A(z) glance frissítése 2026-09-21 21:53-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva mar
  glance         en  http=409  reason=held           :: A(z) glance frissítése 2026-09-21 21:53-kor nem sikerült, és az alkalmazás nem indult el az új verzióval. Az alkalmazás biztonsági okból leállítva mar

  adventurelog   hu  http=409  reason=not_deployed   :: Az alkalmazás nincs telepítve, ezért nem frissíthető.
  adventurelog   en  http=409  reason=not_deployed   :: Az alkalmazás nincs telepítve, ezért nem frissíthető.

  nosuchapp      hu  http=404  reason=not_found      :: stack "nosuchapp" not found
  nosuchapp      en  http=404  reason=not_found      :: stack "nosuchapp" not found


WHAT THIS CORRECTS
==================
R-606's own text records that controller v0.260.0 "routed the 409 REFUSAL through `errText` (so the
pre-flight refusals reach an English household in English)". **That is measured FALSE for at least
three refusals**, and the reason is mechanical rather than a regression:

  * the ROUTING is there — `Router.langFor` honours `?lang=` (`api/i18n_api.go:30-40`) and
    `errText` calls it, so an English request IS asked for in English;
  * but the SENTENCES are not keys. `MsgUpdateDiskFmt`, `MsgUpdateNotDeployed`, `MsgUpdateBusy` and
    their siblings (`stacks/update.go` L81-96) are **finished Hungarian string constants**, raised
    with `fmt.Sprintf` into `refuseUpdate`. `errText` renders "its own text" for an error that
    carries no bundle message — which is exactly right, and which means routing them through it
    changes nothing at all.

So v0.260.0 built the pipe and the old sentences never entered it. Only the sentences BORN as keys
(v0.260.0's `downgrade`, v0.261.0's `self_updating`) actually translate.

**Why this matters more than a cosmetic:** the `held` refusal is the one that tells a household
which copy can bring their data back and what is inside it. An English household pressing Update on
a held app is told, in Hungarian, why they cannot.

MEASURED, all three with the Hungarian request as the control:
  held          -> identical Hungarian in both languages
  not_deployed  -> identical Hungarian in both languages
  disk          -> identical Hungarian in both languages ("Nincs eleg szabad hely a frissiteshez:
                   1.4 GB szabad, az uj verzio letolteshez legalabb 2 GB szukseges.")
  not_found     -> English in both, because it is a Go error and not ours (correct)
