diff --git a/REPORT.md b/REPORT.md index 7cdb268..637b7d2 100644 --- a/REPORT.md +++ b/REPORT.md @@ -1,110 +1,89 @@ -# REPORT — localisation slice 1 (R-556): the whole dashboard in English, Hungarian byte-identical +# REPORT — controller v0.251.0: nothing decides by reading a Hungarian word (R-553 + R-563) -**Date:** 2026-09-17 · **Releases:** v0.248.0 (`ff68b0b`, apps and settings), v0.249.0 (`11b790e`, backups), -**v0.250.0** (`ac149c2` + `be2efe5`, storage, sharing, sign-in, guest, catch-all, debug, the switch for -everyone) · **MinAgent:** 0.131.0 (unchanged) · **Baseline of the slice:** v0.247.0. -**Architecture read before any claim:** `felhom.eu/documentation/architecture/10-localisation.md` -(updated: §2.2, §2.3, §3 decision 6 SUPERSEDED, §5, §10, §11), `02-controller-module-map.md`. -**Evidence:** `felhom.eu/documentation/audits/i18n-slice1-2026-09-17/{A,B,C}/`. +**Date:** 2026-09-17 · **Baseline:** `e236dca48653` (v0.250.0) · **Released:** `0194342` → image +`gitea.dooplex.hu/admin/felhom-controller:0.251.0` · **MinAgent:** 0.131.0 (unchanged). +**Architecture read before any claim:** `felhom.eu/documentation/architecture/10-localisation.md` §1/§9 +(§9 rewritten by this session), `07-backup-architecture.md`, `02-controller-module-map.md`. +**Evidence:** `felhom.eu/documentation/audits/r553-2026-09-17/`. ## Claims in the prompt that turned out wrong — named first -1. **Per-page Hungarian line counts** did not reproduce (debug 92 accented lines, not 103; monitoring 48, - not 72; others differ the same way). -2. **Marker counts of the v0.247.0 pages** — measured layout 105, backups 59, app_info 58, launcher 28; - the prompt said 95 / 52 / 48 / 25. -3. **"Templates decide nothing by Hungarian wording"** is false: `backups_remote.html` runs - `indexOf('Fut')` on its own status text. The prompt's sweep checked only `==`, `===` and `case`. - The word stays Hungarian (R-563). -4. **The list of unconverted copy omitted `backups_shared` `restore_banner_js`** — it was still - Hungarian after v0.247.0; converted in B. -5. **"Six direct-render pages"** — confirmed, not wrong: login, claim, recovery, launcher_shared, - launcher_share_password, catchall. No seventh `s.tmpl` render exists now. +1. **„`internal/system/mounts_linux.go` L176/L194/L199 produce site 3's warnings."** They do not. + `h.Warning` from `CheckBackupDestination` never reaches `report.Warnings` — the only producer folded + into the health report is `checkStoragePaths` (healthcheck.go). `system/` needed no change at all. +2. **„Site 1 matches `required field` … all producers are ours."** **Nothing produces `required field`.** + The router matched a phrase no code in this repo writes — a dead arm, removed with the rest. +3. **Site 3's condition matched more than the prompt implies.** Of the nine warnings that exist today, + exactly ONE matches („Az adattároló … nem külön meghajtón van"): the three patterns are lower-case + and every other warning capitalises the word. So the fix had to preserve *one* inline warning, not a + family — `WarnKindStorageNotSeparate` does exactly that. +4. **Line numbers drifted** as the prompt warned (router.go:478 → the block moved into a new + `deployStatusFor`; offbox.go:186/921; alerts.go:208; handlers.go:920/931 → 944). +5. **„`errors.New(refusal)` at the memory site"** — correct, and it is the reason the memory refusal + could not be pinned by a unit test: `memoryVerdict` reads the HOST's real memory. Its kind is pinned + at the source line instead, and the mapping is covered with a translated memory message. +6. **Confirmed as stated:** site 2's classifier has exactly one caller; `offbox_handlers.go:132` is a + false positive (an `[INFO]` log line); site 5 is the one rendered byte that changes. -## Per-page table — all 31 templates +## The five sites -Markers = `{{T}}` occurrences today. States = parity fixture cases rendering the page (captured from the -unconverted template first). +| # | decision | signal added | producer(s) changed | decision changed | test | HEAD-red → fixed-green | +|---|---|---|---|---|---|---| +| 1 | deploy HTTP status | `stacks.ErrRequiredField`, `ErrPathMissing`, `ErrNotEnoughMemory`, `ErrAlreadyDeployed` (`deploy_errors.go`) | `deploy.go` 205/311/326/333/245 | `api/router.go` → new `deployStatusFor` | `TestR553_Deploy_DecisionSurvivesWordingChange`, `TestR553_DeployHandlerUsesTheKind`, `TestR553_DeployProducersCarryKindAndKeepTheirWords` | red: every translated row `= 500, want 400/409`; green after | +| 2 | off-site failure class | `backup.ErrOffsiteQuota` | `offbox.go` 921 | `ClassifyOffsiteFailure` | `TestR553_OffsiteQuota_{Decision,HeadLine}SurvivesWordingChange`, `TestR553_QuotaProducerKeepsItsWords` | red: translated quota `= "unknown"`, head line „ismeretlen okból"; green after | +| 3 | disk-warning placement | `monitor.WarnKind*` + `HealthReport.WarningKinds` / `addWarning` / `WarningKindAt` | `healthcheck.go` `checkStoragePaths` | `web/alerts.go` | `TestR553_StorageWarningsCarryKindsAndKeepTheirWords`, `TestR553_DiskWarningPlacementSurvivesWordingChange`, `TestR553_HubReportWarningsAreUnchangedOnTheWire` | red: translated warning `Inline = false`, and an unrelated warning wrongly moved inline; green after | +| 4 | stale „nothing selected" note | `settings.OffboxTarget.LastWarningKind` + `backup.OffboxWarnNoAppsSelected` | `offbox.go` 1053/1095 (+ both clear sites, both copy sites) | `offboxWarningDisplay` | `TestR553_StaleNote*`, `TestR553_WarningKindIsPersistedAndCopied`, `TestR553_OffboxRunRecordsTheKind` | red: translated note shown verbatim; producer without its kind convicted; green after | +| 5 | remote-backup poll (R-563) | `data-status="{{.Offbox.LastStatus}}"` | `backups_remote.html` status element | the page's own script | `TestR563_PollStartsFromAttribute` (hu + en), `TestR563_AttributeFollowsTheStatus` | red twice: poll back on the word (both languages), word back inline (English page shows Hungarian); green after | -| rel | page | markers | states | | rel | page | markers | states | -|---|---|---|---|---|---|---|---|---| -| A | dashboard | 48 | 4 | | B | backups_restore_wizard | 46 | 5 | -| A | stacks | 37 | 1 | | B | backups_escrow | 58 | 4 | -| A | logs | 9 | 1 | | B | tier2_config | 23 | 4 | -| A | monitoring | 61 | 3 | | B | recovery | 43 | 7 | -| A | app_import | 40 | 2 | | C | storage | 162 | 2 | -| A | app_export | 30 | 1 | | C | storage_network | 70 | 2 | -| A | deploy | 171 | 5 | | C | storage_init | 42 | 1 | -| A | settings_system | 94 | 4 | | C | storage_attach | 27 | 1 | -| A | settings_security | 58 | 2 | | C | sharing | 74 | 6 | -| A | settings_notifications | 34 | 2 | | C | login | 9 | 1 | -| A | app_row | 0 (no copy) | via stacks/dashboard | | C | claim | 21 | 4 | -| A | meta_badge | 0 (no copy) | — | | C | launcher_shared | 4 | 2 | -| A | icons | 0 (no copy) | — | | C | launcher_share_password | 6 | 1 | -| B | backups_apps | 97 | 6 | | C | catchall | 4 | 2 | -| B | backups_remote | 81 | 12 | | C | debug | 189 | 1 | -| B | backups_restore | 78 | 4 | | | **total, all 36 templates** | **1 874** | **106** | +**Message bytes:** every producer's sentence is asserted equal to its pre-change string (sites 1, 2, 4) +or rendered identically (site 5). `util.KindErrorf` / `KindError` (new, `internal/util/errkind.go`, +documented in REUSE.md §1) build the same bytes `fmt.Errorf` did and carry the sentinel for `errors.Is`. -Bundles: hu 1 587 keys, en 1 590 (plural forms), English gap 0. +**External signatures kept, on purpose:** the classifier's restic and ssh arms — `unable to open config +file`, `is there a repository at the following location`, `produced no snapshots`, `connection refused`, +`connection reset`, `no route to host`, `i/o timeout`, `timed out`, `permission denied`, `host key`, +`handshake`, `could not resolve`, `network is unreachable`. We neither write nor translate that output. -## What release C shipped - -- 11 templates converted; six ASCII-only Hungarian JS fragments the extractor missed, found by eye. -- `login`, `claim`, both guest share pages and the catch-all through `executeTemplateLang` (household - language, no session CSRF, no escrow reminder). -- Title keys for storage, network storage, both wizards, sharing; the pin test for all 17 title keys. -- The switch on every dashboard page: the hide condition deleted; 89 layout fixtures re-captured, each - proven to equal its predecessor plus exactly one switch form after the version span (89/89). -- A correction: the release C cases had invented page titles; they now carry the handlers' titles and - the 12 affected fixtures were re-captured from `0555091` (unconverted). Diff: `