Files
felhom-controller/REPORT.md
T
admin f6909492cc
gates / gates (push) Successful in 27s
docs: v0.258.0's report, and what the walk then found
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
2026-09-20 19:27:33 +02:00

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.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.