0fe04bb6d5
gates / gates (push) Successful in 28s
The 2026-09-20 English drill ended one screen short: the claim page was English and its answers were Hungarian, so a household who mistyped the code from their e-mail could not tell a typo from a dead code. Fourteen call sites carrying nine messages now go through s.msg; the backup page's two protection warnings — which are promises about whether the customer's files are safe — follow the same route. Hungarian is byte-identical, proved structurally by the go-parity gate against the frozen base capture and red-proofed on a single added full stop. data["Title"] was DEAD (claim.html is standalone; .Title is layout.html's) and is deleted rather than translated — a translated dead field is a permanent false signal about where the page's title comes from. Six existing copy-contract tests were kept, not weakened: each now resolves its key through the real bundle, so it still convicts on a reworded Hungarian sentence. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
67 lines
3.9 KiB
Markdown
67 lines
3.9 KiB
Markdown
# REPORT — controller v0.259.0: the claim page and the backup warnings in the reader's language
|
|
|
|
**R-596 (P1), R-598.** Base `f6909492cc6e` → v0.259.0. MinAgent 0.131.0 unchanged.
|
|
|
|
## Claims in the task that turned out wrong
|
|
|
|
1. **"Sixteen Hungarian literals reach that page."** Fifteen literal sites reach it, carrying **ten**
|
|
distinct messages (four are repeats). Of the fifteen, **one is dead**: `data["Title"]` is read only
|
|
by `layout.html`, and `claim.html` is standalone with its own bundle-backed `<title>`. So
|
|
**fourteen live sites, nine messages** were converted and the dead one was deleted.
|
|
2. **"`backup_handlers.go` (12 Hungarian literals)."** Nine are code; the other three are Hungarian
|
|
inside COMMENTS (`"Mentés most"`, `"Rendszermentés"`, a label quoted in a struct doc). The offer
|
|
file's ten is right.
|
|
3. **"the recovery code (10 words — find its caller)" in the hub.** The hub does not mint it.
|
|
**felhom-agent** does, in `internal/escrow`, from the **EFF large wordlist** — so the recovery code
|
|
**has always been English**, ten words, ≈129 bits. R-597's recovery-code leg needed no work and
|
|
this repo does not own that secret. No row was added for it: inventing a second definition here is
|
|
how two sources of truth start.
|
|
4. **"the mail says 'three words'."** No claim mail states a count; they say `Setup code: %s`. The
|
|
only count wording in the product is the **bind page's** passphrase hint/placeholder ("five
|
|
words" / „öt szó"). The English pair is now count-free; the Hungarian is untouched.
|
|
5. **§16's phone-safe filter** ("no two words differing by one letter within the first six") was
|
|
measured before adoption: it removes **5270 of 7772** words, 12.92 → 11.29 bits/word. **Not
|
|
adopted** — see the hub REPORT for the three reasons and what replaced it.
|
|
6. **Line numbers** in the task were accurate. **"29 633 words"** is right to the line (29 634 lines,
|
|
29 609 after dedup). **"`customer.language` reaches the anonymous claim page"** is TRUE and is now
|
|
pinned by a test rather than assumed.
|
|
7. **"the box checks a hash and needs no change" (for R-597)** is TRUE — verified and pinned by
|
|
`TestClaimAcceptsAnEnglishWordCode`.
|
|
|
|
## What shipped
|
|
|
|
- `internal/web/claim.go` — 14 sites → `s.msg(r, "claim.msg.*")`; the dead `Title` deleted with the
|
|
reason recorded in place.
|
|
- `internal/web/backup_target_offer.go` — three copy constants → bundle keys; `degradedMessageFor`
|
|
returns the KEY (decision language-free, in one place); `backupTargetView(ctx, lang)`.
|
|
- `internal/web/backup_handlers.go` — `buildTierViews`/`backupTargetLabel`/`loadGuestBackup` take the
|
|
reader's language, the `buildDataPathCards` shape.
|
|
- 23 new keys in both bundles; all 23 listed in `scripts/i18n_go_keys.json`.
|
|
|
|
## Evidence
|
|
|
|
| Check | Result |
|
|
|---|---|
|
|
| `go build ./... && go vet ./... && go test ./...` | green |
|
|
| `controller_gates.py --fast` (17 gates) | all OK |
|
|
| `scripts/i18n_go_parity.py` | OK — 718 keys, byte-for-byte against the frozen base |
|
|
| `scripts/i18n_missing_gate.py` | English missing **0** (ceiling 0); Hungarian formal 18 (ceiling 18) |
|
|
| `scripts/test_gate_decoys.py` | 23/23 |
|
|
|
|
**Red-proofs, both seen failing:**
|
|
- One added full stop on `claim.msg.bad_code` in `hu.json` → go-parity named both sides.
|
|
- The wrong-code Hungarian literal restored in `claim.go` → the English test convicted twice (the
|
|
English sentence absent AND the Hungarian sentence present on the English page).
|
|
|
|
## Two things the tests caught that review did not
|
|
|
|
- **An apostrophe never renders.** `"The system backup's drive…"` is escaped to `'` by
|
|
`html/template` and no `strings.Contains` on the page ever matched it. Reworded; all 23 English
|
|
values are now free of `' " < > &`.
|
|
- **"please" is not this product's voice.** The i18n gate convicted two of my English sentences for
|
|
pleading. Rewritten to plain second person.
|
|
|
|
## Open
|
|
|
|
Nothing from this release. The live proof and the floor are in the felhom.eu report.
|