The release fixed four Go-side leftovers. The walk that judged it on a box installed from scratch that day found two more of the SAME SHAPE — a composed sentence handed to a renderer as page data — on the claim page (R-596, P1) and the Backup page (R-598). That shape now has three instances on file with R-573, which is worth naming as a class rather than fixing one at a time. Verdict recorded: not yet ready for an English-speaking tester. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
5.7 KiB
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.gocarries 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) andbackup_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.