Files
felhom-controller/REPORT.md
T

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

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