# REPORT — v0.258.0: the last four Hungarian things, and the walk that judged them (R-561 slice 6) 2026-09-20 · `main` at the v0.258.0 commit · image `gitea.dooplex.hu/admin/felhom-controller:0.258.0` · live on demo-hp guest 9201 and on the drill box built from scratch the same day. MinAgent 0.131.0, unchanged. Hungarian byte-identical. Architecture read first and named: `felhom.eu/documentation/architecture/10-localisation.md` §1 (the Hungarian must not move), §4 (fallback), §5 (voice per language), §10.6b (this slice). ## What shipped Four rows, all of them Go-side — which is why neither the template parity fixtures nor `TestI18nEnglishPages` could see them, and why **slice 5's LIVE proof is what found them**. | row | what | how | |---|---|---| | **R-589** | the update badge („Naprakész" + its tooltip) and the abandoned-lifecycle badge | bundle-backed forms in `localeFuncs`, reusing `compareInstalledToTemplate` and `EffectiveLifecycle` so **the decision cannot drift between languages — only the words do**; the badge's `Class` is asserted equal across languages for the same stack | | **R-590** | the data-folder card's backup sentence — **a promise about the customer's files** | `consequenceFor` takes its lookup as a parameter; the test asserts the CONSEQUENCE in both languages, and that the two languages do not produce the same string | | **R-573** | the agent-channel and endpoint-drift banners | keyed by the checker's own CLASSIFICATION, with the composed sentence kept as a **fail-open** fallback: an unmapped reason renders it verbatim rather than a blank banner or a raw key | | **R-572** | **not what the row said** | the row claimed a template renders „vasárnap" on an English page. Measured: **no template and no Go file called `pruneLabel` or `nextPruneLabel`.** Dead func-map entries returning Hungarian — **deleted**, not translated | `lifecycleBadge` was not in any row. It is the same builder one function from `updateBadge`, and leaving a known identical defect there would have been a choice. ## Why deleting was the right direction for R-572, and how that was proven Translating dead code would have added machinery with no reader and a test pinning a fiction. Deletion is the **fail-loud** direction: `html/template` refuses to parse a template naming an undefined function, and `loadTemplates` parses every template once per language at startup. Proven rather than asserted — a template naming the removed function makes the parity test panic with `function "pruneLabel" not defined`. `fmtDuration`, named in the same row, produces no Hungarian at all ("< 1s", "5s", "2m 3s") and was left alone. ## Red-proofs — five, each seen to fail and then revert | what was broken | what convicted | |---|---| | the `updateBadge` override removed from `localeFuncs` | English read „Naprakész" | | `MessageKey` dropped from `SetAgentChannelAlert` | English read the Hungarian sentence | | the folder sentence hard-coded back to Hungarian | the English arm convicted on three assertions | | one Hungarian byte changed in a badge key | `TestLocaleFuncsHungarianBundleMatchesFuncMap` named both sides | | a template naming a deleted helper | startup panic in the parity test | **The fourth says something about the gate, not the code.** `i18n_go_parity.py` did NOT convict that changed byte, because `localeFuncs` keys sit under `_preexisting` and are deliberately not measured against the base capture. The citation to the test is what carries them — so the test had to be made real, and it was extended to compare `hu.json` against the frozen funcmap forms word for word. ## Proven live, twice - **demo-hp (0.258.0):** the English app page shows "Up to date" with an English tooltip while the Hungarian page still says „Naprakész"; the folder sentence is English on one and unchanged on the other; the free-space line reads "47.9 GB free" / „47.9 GB szabad". After the fixes, a scan of the English app pages and the Apps list finds **zero** Felhom-authored Hungarian — the only hit is the language picker naming itself „Magyar", which is correct. - **A box installed from scratch that day**, walked by an English speaker: the update badge and the time helpers were English there too, on hardware that had never run an older controller. ## What the walk then found, which this release does not fix The walk is `felhom.eu/documentation/audits/DRILL-first-hour-en-0258-2026-09-20.md`. Its verdict is **not yet ready for an English-speaking tester**, and the blocker is in this repo: - **R-596 (P1)** — `internal/web/claim.go` carries **sixteen** raw Hungarian literals, every one a message the claim page shows. The page's chrome is English; its answers are not. Same shape as R-573, one screen earlier in the journey, on the one screen between a household and their box. - **R-598** — `backup_handlers.go` (12) and `backup_target_offer.go` (10): the Backup page's two protection warnings and its two target names. Both are the *composed-sentence-into-page-data* shape. That shape now has three instances on file (R-573, R-596, R-598) and is worth naming as a class the next converter looks for. ## Needs the operator **Raise the fleet floor to 0.258.0.** Nothing breaks if it waits — the four fixes simply do not reach the other boxes. The drill box already ran 0.258.0, because the golden baked today is 0.258.0 and a golden above the floor is served normally (`managed floor SERVED … floor 0.257.0 … golden 0.258.0`). ## Teardown Nothing installed or removed on demo-hp; guest 9201 restarted onto the new image, which is the deploy. The drill VM and its hub customer are torn down in three layers — see the drill document. Every staged credential was shredded from both hosts and both guests.