v0.309.0: the default list completes groups 1 and 3 for households with no saved list (operator Q1); REPORT
gates / gates (push) Successful in 46s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-10-12 17:25:12 +02:00
parent 7626a28de3
commit 1b2f74c52f
4 changed files with 38 additions and 18 deletions
+4
View File
@@ -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
+21 -16
View File
@@ -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"
`<details>` 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.
+8
View File
@@ -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.
@@ -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] {