10-localisation.md §7 goes from [DESIGN, proposed] to [FACT], with the numbers it was specced against corrected — and one correction chose an instrument rather than a footnote. The catalog has 1 032 copy strings, not 835. 832 carry a Hungarian letter, which was right. But the ASCII-ONLY Hungarian is ~120 strings, not three: „Aldomain" appears 53 times and „A szerver domain neve" 53 times, and the three the plan named („Igen"/„Nem"/„Nincs") do not occur in this catalog at all. An accent-only gate passes every one of them inside an English block — R-565's blind spot arriving again in a different repo. New §10.6 records what was proven live rather than reasoned about: the English pages show English; the seven Hungarian pages are byte-identical before and after the push apart from the per-session CSRF token; and a 0.255.0 box with the block synced onto it renders identically and logs no warning, in a 93-line window that contains the sync's own lines, so the absence is evidence and not a dead log. Rows R-589 (the update badge is Hungarian on an English page), R-590 (the data-folder card's backup promise, likewise, and it is a promise about the customer's files), R-591 (Stack.Copy() deep-copies five Meta fields and not the new I18n map — safe today, which is precisely why it is a row), R-592 (three defects inside the new catalog gate, closed the same session, each found by its own decoy). R-560 updated: Parts A and B done, Part C waiting on the operator's read of the pilot. STATUS asks for that read, and for the floor to 0.257.0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
5.8 KiB
REPORT — localisation slice 5: the catalog read path, the copy gate, and the pilot (R-560)
2026-09-20. Three repos touched: felhom-controller v0.257.0 (the read path), app-catalog-felhom.eu (freeze + gate + pilot), felhom.eu (this file, the architecture document, the register, STATUS, the audit). Hub, agent, ISO and website untouched.
What the operator has to do
Read the English of the three pilot apps — quoted in full in app-catalog-felhom.eu/REPORT.md —
and say "go", or say what to change. Fifty more apps follow whatever is said. Ten minutes now against
a day of rework later. This is the §16 default of the plan and it was taken: Part C is not started.
And, separately: raise the fleet floor to 0.257.0. Until it moves, only demo-hp can read an English app block at all. Nothing breaks if it waits.
What was proven, and how it was seen
Endpoint level. No browser exists on DooPlex, so every page was fetched with curl from inside the
guest at the controller's container address, with the customer Host header and a real logged-in
session — the same handlers and templates a browser drives, with only the drawing skipped.
| claim | evidence |
|---|---|
| The English app pages show English catalog text | demo-hp on 0.257.0: privatebin, paperless-ngx, romm app pages, the Apps list, two deploy pages |
| The Hungarian did not move | the same seven pages in Hungarian, before and after the catalog push: byte-identical apart from the per-session CSRF token — equal byte counts and equal hashes once normalised |
| An old controller ignores the block | demo-felhom on 0.255.0: with the block synced (confirmed positively — the sync named the three apps and the block is in both the cache and the stack copy), pages hash identically before and after, and no parse warning in a 93-line log window that contains the sync's own lines |
| The gate can convict | 33 decoy cases in the catalog repo, every one seen to convict or to pass as intended |
| The read path is not hollow | nine red-proofs in the controller, each seen to fail and then revert |
What is still Hungarian on an English app page
Measured with an accent scan AND an ASCII-folded stem scan, each with a positive and a negative control. Three things; the first is correct.
- The language picker's own „Magyar" button — a picker names each language in its own tongue.
- The update badge „Naprakész" and its tooltip — R-589. Slice 1 listed it; slice 2 was to take it and closed without it.
- The data-folder card's consequence sentence — R-590. It makes a promise about the customer's files, and the label above it is already English, so the line reads half and half.
The Apps list also shows fifty Hungarian descriptions: those are the apps nobody has translated yet.
Claims in the plan that turned out wrong
| the plan said | measured |
|---|---|
| "835 strings and the table is the complete list of copy fields" | 1 032 copy strings; the table omitted deploy_fields[].placeholder (13 of them) and counted only the strings with an accent |
| "832 with a Hungarian letter" | 832 ✔ |
| "three are ASCII-only Hungarian words — „Igen", „Nem", „Nincs"" | ~120 are ASCII-only Hungarian, and those three do not occur in this catalog at all. This is the one that chose an instrument: an accent-only gate passes „Aldomain" (53×) and „A szerver domain neve" (53×) inside an English block |
| "catalog copy reaches 13 templates" | four: dashboard.html (the app rows' second line), stacks.html (the Apps list), app_info.html (the app page, including the data-folder cards) and deploy.html. A fifth, app_export.html, reads .Stack.Meta.Subdomain — configuration, not copy. Five handler sites feed them |
| "no gate reads copy at all" | ✔ correct — none did |
| "the sync is 15 min with no pin" | ✔ correct; a manual trigger exists (POST /api/sync, the dashboard's "Sablonok frissítése") and was used |
"yaml.Unmarshal is non-strict" |
✔ correct, and stronger than stated: this repo constructs no yaml.Decoder at all, so there is no KnownFields anywhere that could be turned on |
the line numbers (metadata.go L15/L123/L158/L316) |
✔ all correct |
Rows
Opened: R-589 (the update badge is Hungarian on an English page), R-590 (the data-folder card's
backup promise is Hungarian on an English page), R-591 (Stack.Copy() deep-copies five Meta fields
and not the new I18n map — safe today, which is why it is a row and not a fix), R-592 (three
defects inside the new catalog gate, closed the same session, each found by its own decoy rather
than by reading it).
Updated: R-560 — Parts A and B done, Part C waiting on the operator's read.
Register: 281 → 285 rows.
Documents changed here
documentation/architecture/10-localisation.md— §7 rewritten from [DESIGN, proposed] to [FACT] measured, with the corrected numbers, the key-matching rules, and the gate's five checks; new §10.6 for the slice.documentation/backlog/OPEN-ITEMS.md— the four rows above, and R-560's progress.STATUS.md— the operator note, in plain language, with the one read that is being asked for.documentation/audits/i18n-slice5-2026-09-20/— the captures from both boxes, the Hungarian parity table, the English leftover scan with its controls, and a README saying what was NOT proven.
Teardown, three layers
- Machine: nothing installed or removed on either demo box; no app deployed; no VM created. Guest 9201 on demo-hp was restarted onto the new controller image, which is the deploy itself.
- Host: the staged password file and the capture scripts were shredded from both Proxmox hosts and
both guests;
lsconfirms they are gone. - Hub: nothing. No floor change, no golden, no vouch, no appliance registration.
Both boxes left on Hungarian.