Review round 2 (batch 2 + close-out): 02/07/09/10/11/14/15/16/inventory facts corrected at file:line (EDITS.md), undocumented decisions as notes (R-1265), rulings left for the operator (R-1266); register 190 -> 207 (R-1251..R-1267 opened: R-1251 P1 cut drive-app restore put back over newer data, R-1252 P2 rejected backup block deletes second-drive copies - reproduced on 9202); STATUS D43-D45; CONTEXT; audit README
gates / gates (push) Successful in 13m10s
gates / gates (push) Successful in 13m10s
This commit is contained in:
1 parent
77015997f8
commit
876d92367e
23 files changed
+551
-70
No files matched your search
@@ -128,7 +128,9 @@ the hub's e-mails follow.**
|
||||
`expired` pinned to Hungarian so the language cannot become the oracle the text refuses to be.
|
||||
Full design: `05-hub-architecture.md` §15. **R-555 closed** — the `language` allowlist entry is out
|
||||
of `wire_contract_gate.py` and the gate now checks the field for real.
|
||||
- **[DESIGN] Slice 3 Part A as planned — now built; the box half (Part B) is the remaining piece:** the hub stores a per-customer language, renders it into
|
||||
- **[DESIGN] Slice 3 Part A as planned — now built; the box half (Part B) is the remaining piece** *(Part B is built
|
||||
too — the controller reads `customer.language` as its start language since v0.256.0, `internal/config/config.go:149-154`;
|
||||
corrected 2026-10-24)*: the hub stores a per-customer language, renders it into
|
||||
`controller.yaml` next to `customer.id/name/domain/email` (`hub/internal/configgen/configgen.go`),
|
||||
and the box uses it **only while the household has never chosen** (`settings.json` empty). The
|
||||
household's own choice always wins; the hub's e-mails follow the language the box **reports**, which
|
||||
@@ -184,7 +186,8 @@ bundles. They now judge the page **as rendered in each language** (`controller/s
|
||||
- **hu** — the product speaks in „te". The converted copy carries formal („ön") forms (R-516). They are
|
||||
not fixed by a localisation release (§1), so the gate counts them against `HU_FORMAL_CEILING` as a
|
||||
ratchet: a new one convicts, fixing one lowers the ceiling. The ceiling followed the conversion:
|
||||
6 (spike) → 10 (release A) → 12 (release B) → **16** (release C). **[FACT] Measured limit:** the stem
|
||||
6 (spike) → 10 (release A) → 12 (release B) → **16** (release C) → … → **0** (R-516 item 12, the last eleven in the
|
||||
te-form — `felhom-controller/controller/scripts/i18n_missing_gate.py:41`; corrected 2026-10-24). **[FACT] Measured limit:** the stem
|
||||
list is short — on the release C pages it counts 4 formal forms, while a wider list („írja be",
|
||||
„adja meg", „válassza", „biztosan eltávolítja", „engedélyezze", …) finds at least 22 keys (R-516).
|
||||
- **en** — second person, plain: no „please", no „kindly".
|
||||
@@ -201,7 +204,8 @@ vissza") — R-564. The hub copy gate and the catalog have no language concept
|
||||
- **[DESIGN] The hub's operator pages** — the operator reads them; they stay English (decision 1).
|
||||
- **[DESIGN] The first-boot wizard** (`controller/internal/setup/`, 8 pages, 95 strings) — out of scope
|
||||
and obsolete (decision 4, 2026-09-17; `02-controller-module-map.md` L56). A household still reaches
|
||||
it when bootstrap ingestion leaves `customer.id` empty (inventory §2.7). Its deletion is **R-554**.
|
||||
it when bootstrap ingestion leaves `customer.id` empty (inventory §2.7). Its deletion is **R-554**. *(Deleted since:
|
||||
`internal/setup/` is gone (v0.308.0); `bootstrap.WaitForConfig` shows a waiting page instead — corrected 2026-10-24.)*
|
||||
- **[FACT]** App containers' own UIs (Uptime Kuma, PrivateBin…) — not Felhom's copy (R-516 items 5-6).
|
||||
|
||||
---
|
||||
@@ -226,7 +230,7 @@ i18n:
|
||||
```
|
||||
|
||||
Why: one app's copy stays in one file a reviewer sees whole; the controller's `yaml.Unmarshal` ignores
|
||||
unknown keys (`internal/stacks/metadata.go` L316 — **verified: this repo constructs no `yaml.Decoder`
|
||||
unknown keys (`internal/stacks/metadata.go` L316 then, L475 now — **verified: this repo constructs no `yaml.Decoder`
|
||||
at all, so there is no `KnownFields` anywhere to turn strict**), so older controllers are unaffected;
|
||||
a missing English field falls back field by field.
|
||||
|
||||
@@ -234,7 +238,7 @@ a missing English field falls back field by field.
|
||||
reached only through `LocalizeStacks` / `LocalizeStackPtr` / `Stack.MetaFor`.
|
||||
|
||||
- **`For("hu")` is the parsed struct with `I18n` cleared and nothing else**, deep-compared against all
|
||||
53 real catalog files (`TestMetaForHuIsIdentity`, fixtures in `internal/stacks/testdata/catalog/`).
|
||||
53 real catalog files (the identity fixtures are still those 53; the catalog has 65 apps — noted 2026-10-24) (`TestMetaForHuIsIdentity`, fixtures in `internal/stacks/testdata/catalog/`).
|
||||
§1 therefore holds by construction for catalog copy, and `LocalizeStacks` returns the INPUT SLICE
|
||||
for Hungarian rather than a copy, so nothing on the Hungarian path is even touched.
|
||||
- **Fallback is field by field, and blank counts as absent** (ruling 3). A half-translated app is a
|
||||
@@ -307,10 +311,10 @@ for the English page test (R-565), arriving again in a different repo. So
|
||||
`app-catalog-felhom.eu/scripts/check-copy-i18n.py` folds and matches word-bounded stems, with a
|
||||
positive and two negative controls printed on every run.
|
||||
|
||||
**[FACT] The gate**, fifth row of `catalog_gates.py`, static, in the pre-push hook:
|
||||
**[FACT] The gate**, fifth row of `catalog_gates.py` (the sixth since — corrected 2026-10-24), static, in the pre-push hook:
|
||||
|
||||
1. **FREEZE** — every Hungarian copy string equals `scripts/copy_freeze/hu.json`, captured in its own
|
||||
commit before any translation. Runs on all 53 apps whatever scope is named. A new app must be
|
||||
commit before any translation. Runs on every app in the freeze file (65 on 2026-10-24) whatever scope is named. A new app must be
|
||||
admitted with `--add-app NAME --reason "…"`.
|
||||
2. **STRUCTURE** — the `en` block may carry copy fields and nothing else; every key-matched entry must
|
||||
have a Hungarian twin, or it is INERT on the box and the translator never learns.
|
||||
|
||||
Reference in new issue
Block a user