# 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 1. **Per-page Hungarian line counts** did not reproduce (debug 92 accented lines, not 103; monitoring 48, not 72; others differ the same way). 2. **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. 3. **"Templates decide nothing by Hungarian wording"** is false: `backups_remote.html` runs `indexOf('Fut')` on its own status text. The prompt's sweep checked only `==`, `===` and `case`. The word stays Hungarian (R-563). 4. **The list of unconverted copy omitted `backups_shared` `restore_banner_js`** — it was still Hungarian after v0.247.0; converted in B. 5. **"Six direct-render pages"** — confirmed, not wrong: login, claim, recovery, launcher_shared, launcher_share_password, catchall. No seventh `s.tmpl` render 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 through `executeTemplateLang` (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: `` and the wizard nav. - `HU_FORMAL_CEILING` 12 → 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.py` 20/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; `/dashboard` differs 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:** `hu` 16:45:10, `en` 16:46:06, `hu` 16: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 1. A page decides its progress poll by reading its own Hungarian word „Fut". **FILED: R-563** 2. The retrieval gate's Hungarian stems miss split verbs, exposed by the English translation. **FILED: R-564** 3. Six ASCII-only Hungarian fragments reached the English pages with every test green; the English page test sees accented letters only. **FILED: R-565** 4. Three page titles built in Go around an app name stay Hungarian in the English tab. **FILED: R-566** 5. The two drive wizard pages do not highlight the storage menu group. **FILED: R-567** 6. The dashboard's drive-health rows swapped order between two fetches a minute apart. **FILED: R-568** 7. The formal-form stem list counts 4 of at least 22 formal forms on the release C pages. **FILED: R-516** 8. `r400_debug_routes_test.go` and `debug_route_gate.py` read `debug.html` raw 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.** 9. 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.**