Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
7.9 KiB
REPORT — localisation slice 1 (R-556): the whole dashboard in English, Hungarian byte-identical
Date: 2026-09-17 · Releases: v0.248.0 (ff68b0b, apps and settings), v0.249.0 (11b790e, backups),
v0.250.0 (ac149c2 + be2efe5, storage, sharing, sign-in, guest, catch-all, debug, the switch for
everyone) · MinAgent: 0.131.0 (unchanged) · Baseline of the slice: v0.247.0.
Architecture read before any claim: felhom.eu/documentation/architecture/10-localisation.md
(updated: §2.2, §2.3, §3 decision 6 SUPERSEDED, §5, §10, §11), 02-controller-module-map.md.
Evidence: felhom.eu/documentation/audits/i18n-slice1-2026-09-17/{A,B,C}/.
Claims in the prompt that turned out wrong — named first
- Per-page Hungarian line counts did not reproduce (debug 92 accented lines, not 103; monitoring 48, not 72; others differ the same way).
- Marker counts of the v0.247.0 pages — measured layout 105, backups 59, app_info 58, launcher 28; the prompt said 95 / 52 / 48 / 25.
- "Templates decide nothing by Hungarian wording" is false:
backups_remote.htmlrunsindexOf('Fut')on its own status text. The prompt's sweep checked only==,===andcase. The word stays Hungarian (R-563). - The list of unconverted copy omitted
backups_sharedrestore_banner_js— it was still Hungarian after v0.247.0; converted in B. - "Six direct-render pages" — confirmed, not wrong: login, claim, recovery, launcher_shared,
launcher_share_password, catchall. No seventh
s.tmplrender exists now.
Per-page table — all 31 templates
Markers = {{T}} occurrences today. States = parity fixture cases rendering the page (captured from the
unconverted template first).
| rel | page | markers | states | rel | page | markers | states | |
|---|---|---|---|---|---|---|---|---|
| A | dashboard | 48 | 4 | B | backups_restore_wizard | 46 | 5 | |
| A | stacks | 37 | 1 | B | backups_escrow | 58 | 4 | |
| A | logs | 9 | 1 | B | tier2_config | 23 | 4 | |
| A | monitoring | 61 | 3 | B | recovery | 43 | 7 | |
| A | app_import | 40 | 2 | C | storage | 162 | 2 | |
| A | app_export | 30 | 1 | C | storage_network | 70 | 2 | |
| A | deploy | 171 | 5 | C | storage_init | 42 | 1 | |
| A | settings_system | 94 | 4 | C | storage_attach | 27 | 1 | |
| A | settings_security | 58 | 2 | C | sharing | 74 | 6 | |
| A | settings_notifications | 34 | 2 | C | login | 9 | 1 | |
| A | app_row | 0 (no copy) | via stacks/dashboard | C | claim | 21 | 4 | |
| A | meta_badge | 0 (no copy) | — | C | launcher_shared | 4 | 2 | |
| A | icons | 0 (no copy) | — | C | launcher_share_password | 6 | 1 | |
| B | backups_apps | 97 | 6 | C | catchall | 4 | 2 | |
| B | backups_remote | 81 | 12 | C | debug | 189 | 1 | |
| B | backups_restore | 78 | 4 | total, all 36 templates | 1 874 | 106 |
Bundles: hu 1 587 keys, en 1 590 (plural forms), English gap 0.
What release C shipped
- 11 templates converted; six ASCII-only Hungarian JS fragments the extractor missed, found by eye.
login,claim, both guest share pages and the catch-all throughexecuteTemplateLang(household language, no session CSRF, no escrow reminder).- Title keys for storage, network storage, both wizards, sharing; the pin test for all 17 title keys.
- The switch on every dashboard page: the hide condition deleted; 89 layout fixtures re-captured, each proven to equal its predecessor plus exactly one switch form after the version span (89/89).
- A correction: the release C cases had invented page titles; they now carry the handlers' titles and
the 12 affected fixtures were re-captured from
0555091(unconverted). Diff:<title>and the wizard nav. HU_FORMAL_CEILING12 → 16 (four more formal forms in unchanged Hungarian).
Red-proofs (release C; A and B in their folders) — each seen failing, then passing
| test | mutation | failure seen |
|---|---|---|
TestI18nParity |
hu sharing.megosztott_mappak loses one accent |
6 sharing cases Hungarian page CHANGED |
TestI18nEnglishPages |
en storage.eleresi_ut deleted |
Hungarian template copy on the English page … Elérési út (2 cases) |
TestI18nParityCoversEveryMarker |
a marker in a branch no case renders | marker never rendered by any parity case: storage_attach.hiba |
TestHandlerTitleKeysMatchHungarianTitle |
hu title reworded; the sharing TitleKey line deleted | handler title "Hálózati megosztás", but hu.json … = "Hálózati megosztások"; page.title.sharing has no handler |
TestDirectRenderHandlersFollowLanguage |
all five call sites back on s.tmpl.ExecuteTemplate |
five rows: with en saved: … <html lang="en" false |
TestI18nDirectRenderPagesHaveNoAdminChrome |
addEscrowBanner added to executeTemplateLang |
put EscrowBanner / CSRFField into the page data for every page. The page layer alone stays green under this mutation (the guest template has no slot for the bar) — stated in the test |
TestLanguageSwitch_EndToEnd |
the v0.247.0 hide condition restored | a Hungarian household with no ?lang= must see the language switch; 89 parity cases fail |
Gates
go build ./... && go vet ./... && go test ./...→ rc 0 before each commit.controller_gates.py --fast→ rc 0 (i18n: English missing 0/0, formal 16/16; retrieval-promise OK);test_gate_decoys.py20/20. Pre-push hook ran on both pushes; no--no-verify.
Live validation (endpoint-level; no browser on DooPlex) — demo-hp guest 9201
Deployed by hand; fleet floor NOT raised, no golden. Startup: lang=hu … 1874 markers expanded in 27.35ms, lang=en … 28.37ms (B: 26.5 / 21.3 ms; A: ~24 / ~20 ms).
- Hungarian 0.249.0 → 0.250.0: each dashboard page carries one switch form after the version span;
removed, 7 of 8 pages are identical;
/dashboarddiffers in live numbers and the order of two drive rows./login,/claim, catch-all: identical, no switch. - English:
POST /settings/language lang=en→ 302; all 11 pages<html lang="en">; no accented Hungarian on storage, sharing, wizards, debug, sign-in. Left: catalog taglines, Go-built text. - Back to Hungarian: identical to the after fetch apart from live numbers.
- Hub report:
hu16:45:10,en16:46:06,hu16:46:43 (all 0.250.0). - Guest share pages: not exercised live (would create a share link on the household's box); proven through the real route in unit tests.
Teardown
Machine: box on hu, 0.250.0; password, session and header files shredded; fetched pages pulled off
and removed; the three fetch/switch scripts (no secrets) stay in /root. Host: transfer files removed.
Hub: nothing written; DB copy shredded. Nothing provisioned.
Observations
- A page decides its progress poll by reading its own Hungarian word „Fut". FILED: R-563
- The retrieval gate's Hungarian stems miss split verbs, exposed by the English translation. FILED: R-564
- Six ASCII-only Hungarian fragments reached the English pages with every test green; the English page test sees accented letters only. FILED: R-565
- Three page titles built in Go around an app name stay Hungarian in the English tab. FILED: R-566
- The two drive wizard pages do not highlight the storage menu group. FILED: R-567
- The dashboard's drive-health rows swapped order between two fetches a minute apart. FILED: R-568
- The formal-form stem list counts 4 of at least 22 formal forms on the release C pages. FILED: R-516
r400_debug_routes_test.goanddebug_route_gate.pyreaddebug.htmlraw after conversion. NOT-A-FINDING: they match addresses and identifiers, which never move into a bundle (0/api/strings in either bundle, measured); both stay green and correct.- traefik answers an unrouted host itself, so the catch-all page was fetched from the container address. NOT-A-FINDING: routing of unknown subdomains is traefik configuration by design; the controller page renders when reached, and the method is stated in the evidence.