close-out 2026-10-29 evening release (D65 = A): 04/09/03/05/08 [DESIGN]; R-1349, R-1350 closed (proven live); R-1351 filed; R-1346 measured (the save's own DB step); R-1344 planned events; CONTEXT, STATUS, report, evidence
gates / gates (push) Successful in 1m51s

This commit is contained in:
admin committed 2026-10-29 20:21:20 +01:00
1 parent 8cc555be6c
commit e7d9c46370
61 files changed
+1838 -11

No files matched your search

@@ -214,6 +214,19 @@ by verb**:
`unresponsive_since` in the stanza, the hub's operator-only `controller_unresponsive`. Not counted during a swap, a
parked or locked guest, or a vzdump. **It does not restart for it** until the R-1344 measurement (every probe, both
test boxes, through the 2026-10-29/30 night chain) shows a busy night never reads unhealthy that long.
- **`[DESIGN]` 2026-10-29 — the operator's „Reboot guest" (D65 = A, agent `ca15a31`, released v0.170.0; `04` §6.1,
`09` §3 decision 284).** The agent's list gains `reboot_guest <vmid>`: the existing guest-reboot path (`pct reboot`
of THAT guest — never the host), for a stuck Docker or a stuck network inside the box. Guards, each refusing with the
reason: provisioned, running, not locked, not parked; the host-wide heavy-operation gate free (held from the checks
until the guest is up); `jobBlocker` (agent backup job, controller swap, drive/NAS job, escrow ceremony, vzdump); the
controller's busy file not fresh (the controller rewrites `data/ctl/busy` every 15 s during a backup, restore,
off-site run, night catch-up, app update or app export/import; older than 90 s = a controller that stopped writing,
not a busy one; any read failure but „no file" refuses); at most one per hour per guest (`<guests>/<vmid>/
operator-reboot.json`, persisted); the restart brake (a reboot counts as a restart). The guest-power watchdog and the
supervisor leave the guest alone while it reboots. The result names both times from the press („rebooted; the guest was
up after N s, the controller answered after M s"). The record is written BEFORE the reboot; `GET /guest/operator-reboot`
(self-scoped) hands it to the controller that starts after it, and the household's dashboard says „A Felhom
ügyfélszolgálata HH:MM-kor újraindította a dobozt." for a day.
**[RULING 2026-09-16, operator] The brake catches a FAST crash loop and is blind to a SLOW one — a
second, slower counter is owed (R-539).** MEASURED the same day on the drill box: the controller was
@@ -193,7 +193,21 @@ report held now. **The AGENT has its own closed list on the host report's reply
(`store.ValidateHostOperatorAction` / agent `localapi.OperatorActionNames`; never a shared verb, `TestHostOperatorActions_ClosedList`):
the supervisor's restart with its guards, the 3-in-15-minutes brake counting operator restarts too (then 30 minutes
refused), the result in the next report (requested at once), a vmid that is not a guest of that host refused at the hub.
Neither verb deletes data, starts a countdown or shortens one. A guest reboot from the hub is NOT on either list.
Neither verb deletes data, starts a countdown or shortens one. ~~A guest reboot from the hub is NOT on either list.~~
(Superseded the same day by D65 below.)
**`[DESIGN]` 2026-10-29 — D65 = A: `reboot_guest <vmid>` joins the AGENT's list (operator ruling 15:50; `09` §3
decision 284).** No signature: a reboot destroys nothing (`03`). The agent's list is now `restart_controller` and
`reboot_guest`; the controller's list does not change and the two never share a verb (`TestHostOperatorActions_ClosedList`,
agent `TestOpActions_AgentClosedList`). The act is `pct reboot` of that guest over the existing exact sudo vector — never
the host. The agent refuses (reason in the result, nothing called) a guest it did not provision, a stopped, locked or
parked guest, a held heavy-operation gate, any agent job (`jobBlocker`: backup, controller swap, drive/NAS job, escrow
ceremony, vzdump), a fresh controller busy file (backup, restore, off-site run, night catch-up, app update, app
export/import — read over ONE new read-only grant, `pct exec <vmid> -- cat <the controller-data volume>/data/ctl/busy`;
any read failure but „no file" refuses), a second reboot within an hour (persisted), and the restart brake (a reboot
counts as a restart). It holds the heavy-operation gate until the guest is up. The hub expires an unpicked reboot after
30 minutes (a restart keeps the day). The closed list's rule stands: nothing on either list deletes data, starts a
countdown or shortens one.
### 6.2 Who may press the operator's buttons: session, Basic, or a scoped token [hub v0.152.0, `09` §3 decision 251]
@@ -824,4 +824,12 @@ agent does not report — found live, fixed in 0.176.1); it stores an AGENT row
and shows the result under Operator Actions. „Clear hold" sits on each Held apps row; its confirm step names the app,
the reason and since when, and for a restore or put-back hold warns that the app may start on half-restored data; the hub
refuses an app the box does not report held now. Both are `hosts:write`, CSRF like every form (a token press needs none
and is recorded as `access token "<name>"`), and neither is reachable without the confirm fold-out in the browser.
and is recorded as `access token "<name>"`), and neither is reachable without the confirm fold-out in the browser.
**`[DESIGN]` 2026-10-29 — „Reboot guest" beside it (hub v0.177.0; D65 = A, `04` §6.1).** One per guest of a customer
host, behind its own confirm step (the whole guest reboots, every app stops for about a minute, when it is refused); it
stores an AGENT row `reboot_guest <vmid>` and pokes the box like the restart. **A reboot row the agent did not pick up in
30 minutes expires** (`HostOperatorActionRebootTTL`; a restart keeps the 24 h) — a box that was off must not reboot by
itself when it comes back. The agent's result closes the row with one `operator_action` event. **R-1346:** the access-log
middleware also writes `[WARN] slow request: <method> <path> <status> <ms>` for a request over 5 s (path only;
`/api/v1/wait` exempt), and the artifact vouch save logs each leg's time.
@@ -127,6 +127,11 @@ live 2026-08-23 — one event across 22 scans.
- **Operator/hub event + dashboard banner.** `app_start_failed` is **not** in
`settings.DefaultEnabledEvents`, so by default it does **not** e-mail the customer.
- **`[DESIGN]` 2026-10-29 — no alarm after the operator's hold clear (R-1350).** The clear starts nothing, so a held app
stays stopped; the clear now records that stop as WANTED (desired state „stopped") for an app that is not up — once the
hold is found, before it is lifted — so the scan's tri-state reads „the household asked" and stays quiet. The
household's Start records „running" and ends it. Measured before the fix on Tester 1: `app_start_failed` 30 s after a
clear from the hub (controller, R-1350).
- **F-OBS heartbeat**, every 20 scans (~10 min), at `[INFO]`:
`[deadapp] check alive: N scans since boot, M deployed app(s) evaluated, K currently down`.
This line exists because an absent alarm and a stopped detector look identical in a log.
@@ -1206,6 +1206,17 @@ Wanderer's Meilisearch went 256 → 384 MB and was measured again (it sizes itse
`-tags faultinject` test build — never in the release image (`TestD63_TheReleaseBuildHasNoFaultSwitch`). *Operator,
2026-10-29 08:17.* `07` §6.3.
### 2026-10-29 (15:50, operator) — D65 = A: the hub may reboot a guest
284. **D65 = A — `reboot_guest` joins the AGENT's closed operator-action list, with no signature.** The operator reboots
one guest from the hub's host page (`pct reboot` of THAT guest, the existing guest-reboot path — never the host),
for a stuck Docker or a stuck network inside the box that „Restart controller" cannot reach. A reboot destroys
nothing (`03`, „healing … non-destructive by construction"). Guards on the agent: no backup of any tier, restore,
update, controller swap or other heavy job (the controller's busy file included); not a locked, stopped or parked
guest; at most one per hour per guest; the restart brake counts it. A press the agent did not pick up in 30 minutes
expires. The household's dashboard says for a day that Felhom support restarted the box. `04` §6.1, `03`.
*Operator, 2026-10-29 15:50.*
### 2026-10-29 (12:10, operator) — D64 = B: the hub may clear any hold
283. **D64 = B — the hub's „Clear hold" works for every hold reason, with no operator signature.** The operator accepted