i18n: operator rulings 1b (banner + download page in scope, R-559 unblocked) and 7 (interface nouns translate)
gates / gates (push) Successful in 21s

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-09-17 17:03:14 +02:00
parent 7462ac0b46
commit bc1a5db86c
4 changed files with 13 additions and 29 deletions
+2 -2
View File
@@ -33,8 +33,8 @@ language; `settings.json` `language`; `POST /settings/language`; `?lang=`; repor
(allowlisted in `wire_contract_gate.py` until slice 3 reads it). **The release gate for every slice is
`TestI18nParity`**: Hungarian renders vs fixtures captured from UNCONVERTED templates — never
regenerate them to make a conversion pass. Live on demo-hp: Hungarian pages identical to 0.246.0 apart
from version and CSRF token. **Open for the operator:** 1b (console banner + download page in scope?),
7 (do interface nouns translate?). Plan and costs: 10 §10; rows R-553..R-562, **R-553 first** (four
from version and CSRF token. **Ruled the same evening:** 1b — the console banner and the download page ARE in
scope (R-559 unblocked); 7 — interface nouns translate (Launcher, Dashboard, Backup); app names and „Felhom" stay. Plan and costs: 10 §10; rows R-553..R-562, **R-553 first** (four
places decide behaviour by Hungarian wording).
## Decisions 2026-09-17 — the chaos-night fixes (operator rulings)
+3 -7
View File
@@ -38,13 +38,9 @@
gate's count). Six of the ten are the plan's steps; one is four places where the program decides
something by reading Hungarian words — those must be fixed before any program text is translated.
**Needs you.**
1. **Are the console screen and the download page in scope?** Your answer named the dashboard, the
e-mails, the guide and the catalog, and not these two. If you do nothing, they wait at the end of
the plan; nothing else is blocked.
2. **Do screen names translate?** I translated them („Indítópult" became „Launcher"). The other choice
keeps the Hungarian names so support and household use the same word. If you do nothing, the
translation stays.
**Needs you.** Nothing. You answered both questions:
1. **The console screen and the download page are in scope.** They stay late in the plan.
2. **Screen names translate** („Indítópult" is „Launcher"). Every later step follows this.
3. **For information:** the demo HP box runs the new controller, put there by hand. The other boxes
stay on the previous version until you raise the floor. Nothing changes for them if you do not.
+7 -19
View File
@@ -234,7 +234,7 @@ session). Each slice ends with the parity gate green for every page it touched.
| 1 | R-556 | the other 31 dashboard templates (~1 500 strings, 600 of them JS), parity fixtures per page; switch shown to everyone; English retrieval stems; the extractor's ASCII word list reviewed per page | the whole dashboard in English with Hungarian byte-identical | 12–16 h, three releases |
| 2 | R-557 (after R-553) | Go-side customer strings: 947 shown + 184 errors; flash-in-URL → keys; country names; alert texts | a page's server messages follow the language | 16–20 h |
| 3 | R-558 | hub: per-customer language at creation; `configgen` renders it; `customerMessages` (39), the 5 lifecycle mails and the self-bind page in English; dispatcher reads the reported language | a household's e-mails arrive in its language | 6–8 h, one hub + one controller release |
| 4 | R-559 | console banner (34 lines, console-font limits) and the download page | — **operator to confirm it is in scope** (decision 1b) | 4–6 h + an ISO train |
| 4 | R-559 | console banner (34 lines, console-font limits) and the download page | an English household meets English from the first boot screen (in scope — ruling 1b) | 4–6 h + an ISO train |
| 5 | R-560 | catalog: §7 format, controller reads it, 835 strings / ~5 000 words, catalog copy gates per language | an app card, its settings and its first steps in English | 12–16 h |
| 6 | R-561 | the volunteer guide in English (~1 600 words); **then a stranger's first hour in English**, the 2026-09-14 walk; closes R-516 against the inventory | a newcomer can set up and use a box in English | 6–8 h |
@@ -258,22 +258,10 @@ These are rulings, not proposals. Anything specced against a different assumptio
5. **Mechanism (b2)** — §2.1.
6. **Switch hidden while only three pages are English** — §3.
### Open — for the operator, in the §3 shape of `09-update-architecture.md`
### 2026-09-17 (evening) — the two open questions, ruled
**1b. Are the console banner and the download page in scope?** The starter's summary listed them;
the ruling on decision 1 names „the controller, emails, guide, app catalog" and not them.
- *Yes* — slice 4 stays: 4–6 h plus an ISO release train; an English-speaking household sees English
from the first boot screen.
- *No* — slice 4 is dropped: nothing to build; an English household meets a Hungarian console banner
and download page before the dashboard.
- **If nothing is decided:** slice 4 waits at the end of the plan; slices 1–3, 5, 6 are not blocked.
- **Who is blocked:** nobody now; the stranger drill (slice 6) would walk a Hungarian first screen.
**7. Do product and interface nouns translate?** The spike translated them („Indítópult" → Launcher,
„Vezérlőpult" → Dashboard, „Biztonsági mentés" → Backup) and kept app names and „Felhom" as they are.
- *Translate interface nouns* (as built) — English pages read naturally; a Hungarian support person
and an English household name the same screen differently.
- *Keep Hungarian nouns as names* — one vocabulary for support; English pages carry untranslated
words a newcomer must learn.
- **If nothing is decided:** the spike's choice stands and slice 1 follows it.
- **Who is blocked:** slice 1's translation pass (it can proceed on the spike's choice and be revised).
1b. **The console banner and the download page ARE in scope** (operator: „yes"). Slice 4 (R-559) is
unblocked; it stays late in the plan and rides an ISO release train.
7. **Interface nouns translate** (operator: „translate"). „Indítópult" → Launcher, „Vezérlőpult" →
Dashboard, „Biztonsági mentés" → Backup, as the spike built. App names and „Felhom" stay as they
are. Every slice follows this.
+1 -1
View File
@@ -737,7 +737,7 @@ class (an image `VOLUME` at an unmounted path) is still live — `immich-server`
| **R-556** | **[P3-LOW] Localisation slice 1 — the other 31 dashboard templates in English, Hungarian byte-identical.** PLAN 2026-09-17 (`architecture/10-localisation.md` §10). ~1 500 strings, ~600 of them inside `<script>`. Per page: capture parity fixtures from the UNCONVERTED template, run `controller/scripts/i18n_extract.py`, **review by eye what it left** (its ASCII-only word list missed 8 strings on the first three pages), translate, parity + English page tests green. Also: show the language switch to every household (§3, decision 6); give the retrieval-promise gate English stems (it scans Hungarian only); widen the English page test past its fixture-string masking (§2.3). Cost 12–16 CC-hours over three releases. | **READY - rank P3-LOW; owner: CC** |
| **R-557** | **[P3-LOW] Localisation slice 2 — Go-side customer strings follow the language.** PLAN 2026-09-17 (10 §10). Inventory §2.2: 947 shown + 184 error literals in 84 files; 237 format strings, 111 concatenations, 42 numeric `%d` (English plurals). Flash messages travel inside the redirect URL (`?flash=<Hungarian>`) and must become keys; `cloudflare/countries.go` (113 country names); alert texts; handler errors printed with `err.Error()`. **After R-553** (the four compare-not-show sites). Cost 16–20 CC-hours. | **READY - rank P3-LOW; owner: CC** |
| **R-558** | **[P3-LOW] Localisation slice 3 — the hub's customer e-mails follow the household's language; the operator sets it at customer creation.** PLAN 2026-09-17 (10 §3, §10), operator decision 2. The box already reports `"language"` (controller v0.247.0); nothing hub-side reads it. Build: a per-customer language on the hub (default hu) set at creation and rendered into `controller.yaml` beside `customer.*` (`hub/internal/configgen/configgen.go`), used by the box only while `settings.json` has no choice; the dispatcher picks the language the box REPORTS; English for the 39 `customerMessages`, the 4 severity labels, the body wrapper, the claim/re-enroll/reset/claimed/self-bind mails and the public bind page (inventory §2.3). Delete the `language` allowlist entry in `wire_contract_gate.py` when the field is read. Cost 6–8 CC-hours, one hub + one controller release. | **READY - rank P3-LOW; owner: CC** |
| **R-559** | **[P3-LOW] Localisation slice 4 — the console banner and the download page in English. SCOPE UNCONFIRMED.** PLAN 2026-09-17 (10 §10, open decision 1b): the starter listed them; the operator's scope ruling names „the controller, emails, guide, app catalog" and not them. Inventory §2.4: 34 banner lines (`scripts/iso/felhom-bootstrap.sh`, printf to the console; `/etc/issue` byte-coupled to `iso/pkg/debian/postinst`, console font avoids ő/ű) and 32 strings on `website/letoltes.html`. Cost 4–6 CC-hours plus an ISO release train. | **BLOCKED on operator (decision 1b); owner: CC** |
| **R-559** | **[P3-LOW] Localisation slice 4 — the console banner and the download page in English.** IN SCOPE — operator ruling 2026-09-17 evening („yes", 10 §11 1b). PLAN 2026-09-17 (10 §10, open decision 1b): the starter listed them; the operator's scope ruling names „the controller, emails, guide, app catalog" and not them. Inventory §2.4: 34 banner lines (`scripts/iso/felhom-bootstrap.sh`, printf to the console; `/etc/issue` byte-coupled to `iso/pkg/debian/postinst`, console font avoids ő/ű) and 32 strings on `website/letoltes.html`. Cost 4–6 CC-hours plus an ISO release train. | **READY - rank P3-LOW; owner: CC** |
| **R-560** | **[P3-LOW] Localisation slice 5 — catalog cards, settings and first steps in English.** PLAN 2026-09-17 (10 §7, §10). Inventory §2.5: 835 strings, ~4 984 words across all 53 `.felhom.yml` (use_cases 262, first_steps 233, deploy_fields descriptions 79 / labels 68, prerequisites 60, description 56, tagline 53). Proposed format: an `i18n: {en: {...}}` block inside each `.felhom.yml` (controller's `yaml.Unmarshal` ignores unknown keys, so older controllers are unaffected), field-by-field fallback. Needs a controller change to read it and catalog copy gates with an English rule. Cost 12–16 CC-hours. | **READY - rank P3-LOW; owner: CC (catalog + controller)** |
| **R-561** | **[P3-LOW] Localisation slice 6 — the volunteer guide in English, then a stranger's first hour in English; closes R-516.** PLAN 2026-09-17 (10 §10). `runbooks/VOLUNTEER-first-hour.md`: 44 paragraphs, ~1 579 words. Then the 2026-09-14 walk repeated by an English speaker on a fresh box, R-516 closed against `audits/I18N-INVENTORY-2026-09-17.md`. Depends on R-556..R-560. Cost 6–8 CC-hours plus the attended walk. | **READY - rank P3-LOW; owner: CC** |
| **R-562** | **[P3-LOW] Dates and sizes are not formatted for any locale — and the Hungarian pages disagree with themselves.** FOUND 2026-09-17 by the i18n inventory §2.8: the two template date layouts differ (`2006. 01. 02. 15:04` Hungarian vs `2006-01-02 15:04` ISO); 10 layout literals in `internal/web` Go and 25 elsewhere pick formats ad hoc; sizes print a decimal POINT (`%.1f GB`, 4 helpers) where Hungarian uses a comma; `timeAgo`/`nextRunLabel`/`pruneLabel` produce Hungarian words outside the three converted pages. Not changed by v0.247.0 (Hungarian bytes are frozen by the parity rule). **Fix shape:** one date and one size formatter per language in `internal/i18n`, the Hungarian output deliberately changed in ONE reviewed release with the parity fixtures re-captured for that release only and the change named in its CHANGELOG. Needs an operator word on the Hungarian format (comma, date style). | **READY - rank P3-LOW; owner: CC** |