From 1b2f74c52ff075888ce9d5deebbfdc79f46d89dd Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Mon, 12 Oct 2026 17:25:12 +0200 Subject: [PATCH] v0.309.0: the default list completes groups 1 and 3 for households with no saved list (operator Q1); REPORT Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS --- CHANGELOG.md | 4 ++ REPORT.md | 37 +++++++++++-------- controller/internal/settings/settings.go | 8 ++++ .../internal/web/r388_notif_groups_test.go | 7 +++- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9788fc..2dbb45f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ same `enabled_events` list. Design `08-alarm-ladder.md` §8.1, `09` §3 decision 200; operator answers 2026-10-12 evening (Q1 „as picked": group 3 on for households; Q2 „as picked": the cooldown field under „Részletek"). +- **The default list follows Q1 (lead session).** `DefaultEnabledEvents` gains `storage_reconnected`, + `backup_integrity_failed`, `crossdrive_failed`, `health_recovered`, so a household with NO saved list sees groups 1 and 3 + fully on; group 2 stays „egyedi" because `app_start_failed` is off by the R-329 ruling. Nothing is seeded into stored + prefs. `TestR388_DefaultListAsGroups` (red-proved: the old list rendered all three as custom). - **R-388 slice 1 — three switches instead of eighteen.** The notification page shows „A gépem és a meghajtóim" / "My machine and drives", „Az alkalmazásaim" / "My apps" and „Amit mi intézünk" / "What we handle", each one switch with one sentence of what it sends. Membership is §8.1's table (`settings.NotificationGroups`; all 18 switches of diff --git a/REPORT.md b/REPORT.md index 0082f22..e4fa45d 100644 --- a/REPORT.md +++ b/REPORT.md @@ -1,19 +1,24 @@ -# REPORT — controller v0.308.0: the operator's answers S1, S9, S10, S11, S12, S27, S28, S32 (2026-10-12) +# REPORT — felhom-controller v0.309.0 (2026-10-12 evening) -Operator rulings 2026-10-12 (`felhom.eu` `09` §3 decisions 196–233). Implemented by a helper session under the -brief's full fences; reviewed, pushed, built and delivered by the lead session. Two commits: `fd28d70` (the batch) and -`faef8f8` (R-554, kept separate until the operator approved its Hungarian — approved in chat 2026-10-12). +Baseline 68294ec (v0.308.0). Commits 462196e, 402fa41, 7626a28 (helper session, under the brief's full fences) and the +lead's default-list commit. MinAgent 0.131.0 (unchanged). No wire change, no hub change. -| Item | What changed | Test (red-proved) | -|---|---|---| -| S1 / R-922 | Clearing the notification address asks first (server-side warning, both languages, „Igen, törlöm a címet"); nothing is saved or sent until confirmed | `TestR922_ClearWarnsFirst` | -| S9 / R-255 | One test renders 35 page templates (142 cases, both languages, 1581 planted values). Found and fixed one leak: an optional-config `secret_input` was rendered into `value="…"`; now revealed on demand | `TestR255_NoPlantedSecretReachesAnyPage`, `TestR255_OptionalSecretIsRevealedOnDemand` | -| S10 / R-266 | `StorageReport.read_failed` on `/` when the root statfs failed (hub 0.147.0 shows „read failed") | `TestRootStorageEntry_ReadFailed` | -| S11 / R-333 | No heat band for NVMe; the drive's `critical_warning` still gives Hiba; SATA unchanged | `TestDiskVerdict_NVMeHasNoHeatBand` | -| S12 / R-577 | Language globe on guest share pages (visitor's own cookie); the wrong-password flash follows it | `TestGuestSharePagesHaveGlobe`, `TestGuestSharePage_HonoursVisitorCookie` | -| S27 / R-554 | `recovery-info.txt` (now bilingual, bundle key `recovery_info.body`) points at Biztonsági mentés → Visszaállítás and Adatok visszaszerzése with the ten-word code; the first-boot setup wizard is deleted; a box that cannot get its config shows one waiting page and retries every minute | `TestRecoveryInfo_PointsAtDashboardNotWizard`, `TestWaitForConfig_ServesWaitingPageThenStarts` | -| S28 / R-562 | Hungarian `2026. 10. 10. 15:04` + decimal comma, English `2026-10-10 15:04` + point, everywhere the dashboard formats a date or a number (`internal/i18n/format.go`) | `TestR562_BackupsPageFormatsPerLanguage` | -| S32 / R-521 | The lost-drive option round-trips and is sent only when on; it stays in the default set (operator, 2026-10-12: keep on) | `TestR521_StorageDisconnectedOptionRoundTrips` | +## R-388 slice 1 — the notification page in three switches (`08` §8.1, `09` §3 decision 200; operator Q1/Q2 „as picked") +- Three group switches with one sentence each (hu+en); the 18 per-detector switches and the cooldown under a „Részletek" + `
` fold (Q2). +- A group is a view over `enabled_events` (`settings.NotificationGroups` = the §8.1 table). A moved group switch sets or + clears its detectors; an untouched one leaves the per-detector switches in charge, so an „egyedi" group is saved back + unchanged. Old forms without group fields behave as v0.308.0. +- Default list (Q1): groups 1 and 3 fully on for households with no saved list; group 2 „egyedi" (`app_start_failed` + off, R-329). No stored prefs are seeded. +- Tests `internal/web/r388_notif_groups_test.go` (7), red-proved (switch-off branch, untouched-group save, switch-on + branch, the default list). Parity: 2 fixtures re-captured, 1 new case. -Suite `go build/vet/test ./...` rc 0; `controller_gates.py --fast` rc 0 (helper, both commits; lead re-ran the suite: rc 0). -`MinAgent` unchanged (0.131.0). Delivery and read-back: `felhom.eu/documentation/audits/answers-2026-10-12/`. +## R-521 F7 — the guest's own disk event in the household's language +- The root filesystem is a fill-watch target (since v0.191.0) checked every 10 min (since v0.297.0); now pinned end to end. +- Fixed: the fill warning was Hungarian only — now bundle keys `event.fill.*`, the household text as `message_customer` + (`Notifier.PushEventHousehold`). One Hungarian word changed: the formal „Kérjük," dropped (te-form gate). +- Red-proved three ways (root target removed; household text dropped; watcher renders none). +- Not measured: "/" and `/mnt/sys_drive` may be one filesystem on a box, so one fill could send two disk events. + +Suite `go build/vet/test ./...` rc 0; `controller/scripts/controller_gates.py --fast` rc 0. diff --git a/controller/internal/settings/settings.go b/controller/internal/settings/settings.go index e285907..fdce417 100644 --- a/controller/internal/settings/settings.go +++ b/controller/internal/settings/settings.go @@ -664,6 +664,14 @@ var DefaultEnabledEvents = []string{ "app_update_held", // v0.269.0 (`09` §3 decision 28): the box stopped an app that kept crashing / ran out of memory. "app_stopped_unhealthy", + // v0.309.0 (R-388 slice 1, operator Q1 2026-10-12): the default completes the page's groups 1 and 3 + // („A gépem és a meghajtóim", „Amit mi intézünk" — on by default). Only households with NO saved list + // follow this; no saved choice is changed and nothing is seeded into stored prefs. + // Pinned by TestR388_DefaultListAsGroups. + "storage_reconnected", + "backup_integrity_failed", + "crossdrive_failed", + "health_recovered", } // PendingEvent is an event queued for the next Hub push cycle. diff --git a/controller/internal/web/r388_notif_groups_test.go b/controller/internal/web/r388_notif_groups_test.go index c6f7235..46ddf8c 100644 --- a/controller/internal/web/r388_notif_groups_test.go +++ b/controller/internal/web/r388_notif_groups_test.go @@ -236,10 +236,13 @@ func TestR388_FullListRendersThreeGroupsOn(t *testing.T) { // NOT change the default (the lead decides). The test pins the fact so a change to either side is seen; // when the default is made to cover the groups, flip `want` to on. func TestR388_DefaultListAsGroups(t *testing.T) { + // Operator Q1 (2026-10-12 evening, „as picked"): group 3 „Amit mi intézünk" is ON by default, and the + // default list completes groups 1 and 3. Group 2 stays custom: app_start_failed is OFF by the R-329 + // ruling (2026-08-23). RED-PROOF: the pre-Q1 list renders all three as custom. want := map[string]string{ - settings.NotifGroupMachine: settings.NotifGroupCustom, + settings.NotifGroupMachine: settings.NotifGroupOn, settings.NotifGroupApps: settings.NotifGroupCustom, - settings.NotifGroupHandled: settings.NotifGroupCustom, + settings.NotifGroupHandled: settings.NotifGroupOn, } for _, g := range settings.NotificationGroups { if got := settings.NotificationGroupState(settings.DefaultEnabledEvents, g.Key); got != want[g.Key] {