R-553 + R-563 CLOSED (controller v0.251.0): evidence, 10 §9 rewritten, R-569..R-571, slice-2 dependency
gates / gates (push) Successful in 24s

- audits/r553-2026-09-17/: live before/after on demo-hp (CSRF redacted), the 409 refusal, the hub
  health block, red-proofs for all five sites, the site-5 fixture diff, gates.
- 10-localisation.md §9: the five decisions with what each reads now; the rule (a text signature may
  remain only where the text is not ours); the one legacy exception and its end date.
- Register: R-553 and R-563 closed to CLOSED-ITEMS; R-569 (four API handlers match English words),
  R-570 (the legacy stale-note fallback + the slice-2 fence), R-571 (classifier and alert placement
  documented nowhere). R-557 carries the R-570 dependency. 263 -> 264 open.
- STATUS, including the live probe that installed an app and was removed the same minute.

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 21:11:31 +02:00
parent b408b283c3
commit 2bd6fbfac9
22 changed files with 8549 additions and 8 deletions
+29 -5
View File
@@ -238,11 +238,35 @@ gates need an English rule. Read on privatebin, nextcloud and immich (inventory
## 9. Compared, not shown — latent bugs a translation would trigger
**[FACT]** Four places decide behaviour by matching Hungarian wording (inventory §3): an HTTP status
(`api/router.go:478`), an off-site quota classification (`backup/offbox.go:186`), an alert's placement
(`web/alerts.go:208`), and a **persisted** warning compared by marker (`web/handlers.go:927`). Each
breaks the day the words change in either language. **R-553 fixes them first, before slice 2 touches a
single Go string.**
**[FACT] There were FIVE, and they are fixed (controller v0.251.0, R-553 + R-563, 2026-09-17).** Four
in Go and one in a page script. Each producer now attaches a machine-readable signal and each decision
reads that signal; every Hungarian sentence is byte-identical (pinned per producer), and the hub report
is unchanged.
| decision | read before | reads now |
|---|---|---|
| deploy HTTP status — `api.deployStatusFor` | „kötelező", „memória", "does not exist", "already deployed" | `stacks.ErrRequiredField`, `ErrPathMissing`, `ErrNotEnoughMemory` (400); `ErrAlreadyDeployed` (409) |
| off-site failure class — `ClassifyOffsiteFailure` | „tárhelykeretet" | `backup.ErrOffsiteQuota` |
| alert placement — `web/alerts.go` | „meghajtó" / „adattároló" in the warning | `monitor.WarnKindStorageNotSeparate`, carried in `HealthReport.WarningKinds` (internal; NOT on the wire) |
| the stale off-site note — `offboxWarningDisplay` | „nincs mentésre jelölt alkalmazás" in the PERSISTED text | `settings.OffboxTarget.LastWarningKind` = `backup.OffboxWarnNoAppsSelected` |
| the remote-backup poll — `backups_remote.html` | the displayed word „Fut" | `data-status="running"` on the status element (R-563) |
**[DESIGN] The rule this establishes:** a text signature may remain ONLY where the text is not ours.
The classifier's restic and ssh signatures stay, because that output is neither written nor translated
here; every sentence this product writes is display, and a decision reads a signal beside it.
`internal/util.KindErrorf` exists for exactly that: the same message bytes `fmt.Errorf` produced, plus
a sentinel for `errors.Is` — never `fmt.Errorf("%w: …")`, which would prepend the sentinel's own text
to the customer's sentence.
**[FACT] One exception, with an end date:** a box upgraded to 0.251.0 carries the OLD persisted note
with no kind until its next off-site run, so `offboxWarningDisplay` keeps the substring test for
`kind == ""` only. **Slice 2 (R-557) must not translate that producer until R-570 closes.**
**[FACT] Measured after the fix** (`audits/r553-2026-09-17/`): the inventory's comparison detector finds
**no template compare** (was one) and no Go compare of ours — the two remaining hits are the known
false positive (an `[INFO]` log line) and the deliberate legacy fallback above; planted decoys prove the
detector still convicts. **What it does NOT cover:** four API handlers pick their status by matching
ENGLISH internal words — the same shape, one language over, filed as R-569 rather than folded in here.
---