R-1052 closed: a new box from the public ISO (golden 0.313.0) reached the floor 0.314.0 by itself, 2 min 52 s after the bind (throwaway customer Tester3, VM removed)
gates / gates (push) Successful in 6m39s
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
@@ -107,3 +107,13 @@ R-1052 blocked on you.
|
|||||||
- A stranger now meets Plex's own sign-in: the web page 200, the library 401 without a token.
|
- A stranger now meets Plex's own sign-in: the web page 200, the library 401 without a token.
|
||||||
- One library wiring run: `plex=done(2)` — it switched on Plex's „scan on change" settings.
|
- One library wiring run: `plex=done(2)` — it switched on Plex's „scan on change" settings.
|
||||||
- R-1060 is closed. Evidence: `documentation/audits/gate-restore-2026-10-15/plex9201/02-claim.txt`.
|
- R-1060 is closed. Evidence: `documentation/audits/gate-restore-2026-10-15/plex9201/02-claim.txt`.
|
||||||
|
|
||||||
|
## Addendum 2 — a new box reaches the floor by itself (R-1052, 14:06 UTC)
|
||||||
|
|
||||||
|
- You made the test customer Tester3 with a placeholder domain (`tester3.test`). The floor path does not need a real domain.
|
||||||
|
- I installed a VM on demo-hp from the public installer, bound it through the mailed link with your phrase, and claimed it.
|
||||||
|
- **It updated itself from the golden 0.313.0 to the floor 0.314.0, 2 min 52 s after the bind** („auto-floor"), before
|
||||||
|
anyone claimed the dashboard. The hub's reports and the box's own record say the same.
|
||||||
|
- Then I switched it off through its own dashboard (the hub knows it was on purpose, so no alarm mail) and removed the VM.
|
||||||
|
- R-1052 is closed. Register now **152** (closed 6 in this task).
|
||||||
|
- **Waits on you:** delete customer Tester3 in the hub (browser only).
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
`documentation/backlog/STATUS-HISTORY.md`. Reports: `REPORT-night-2026-10-14.md`, `REPORT-immich-rollout-2026-10-14.md`, `REPORT-seo-felho-tarhely-2026-10-14.md`, `REPORT-immich-repair-2026-10-14.md`, `REPORT-power-cut-fixes-2026-10-14.md`, `REPORT-night-power-2026-10-13.md`, `REPORT-poweroff.md`.
|
`documentation/backlog/STATUS-HISTORY.md`. Reports: `REPORT-night-2026-10-14.md`, `REPORT-immich-rollout-2026-10-14.md`, `REPORT-seo-felho-tarhely-2026-10-14.md`, `REPORT-immich-repair-2026-10-14.md`, `REPORT-power-cut-fixes-2026-10-14.md`, `REPORT-night-power-2026-10-13.md`, `REPORT-poweroff.md`.
|
||||||
|
|
||||||
## What works
|
## What works
|
||||||
- A restored app comes back exactly as safe as it was at the backup: closed to strangers until its first account is made (0.314.0, proven on the scratch box). A box on a test build now moves with the floor (Tester 1 did, by itself). The box claims Plex again (demo-hp's Plex claimed through the dashboard, 2026-10-15).
|
- A restored app comes back exactly as safe as it was at the backup: closed to strangers until its first account is made (0.314.0, proven on the scratch box). A box on a test build now moves with the floor (Tester 1 did, by itself). The box claims Plex again (demo-hp's Plex claimed through the dashboard, 2026-10-15). A brand-new box from the public installer updated itself to the floor 3 minutes after it was linked (test box, since removed).
|
||||||
- Scripts use the hub with a scoped token, not your password (hub 0.153.0): CC sets the floor with its own token; no token can see a secret, delete anything, or send, make or show a household's password or link. Your new hub password is yours alone (changed 2026-10-15).
|
- Scripts use the hub with a scoped token, not your password (hub 0.153.0): CC sets the floor with its own token; no token can see a secret, delete anything, or send, make or show a household's password or link. Your new hub password is yours alone (changed 2026-10-15).
|
||||||
- Every public name of the three test boxes answers only over https: plain http gets a 301 to the same https address, and browsers are told to remember it for one day (29 names checked, 2026-10-14 night).
|
- Every public name of the three test boxes answers only over https: plain http gets a 301 to the same https address, and browsers are told to remember it for one day (29 names checked, 2026-10-14 night).
|
||||||
- Media apps work together on one drive: a download reaches Sonarr/Radarr as one file, no copy; the download apps see only their own folder (live catalog, proven on demo-hp).
|
- Media apps work together on one drive: a download reaches Sonarr/Radarr as one file, no copy; the download apps see only their own folder (live catalog, proven on demo-hp).
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
| D8 | R-206 | Install DooPlex's Docker settings from git (restarts Docker), and prune the build cache weekly: yes or no? | **Yes, in a quiet window** | — | a rebuild of DooPlex still has the settings in git | — |
|
| D8 | R-206 | Install DooPlex's Docker settings from git (restarts Docker), and prune the build cache weekly: yes or no? | **Yes, in a quiet window** | — | a rebuild of DooPlex still has the settings in git | — |
|
||||||
|
|
||||||
## Waiting on you — do
|
## Waiting on you — do
|
||||||
- **Make a throwaway customer in the hub (browser only), or name one I may reuse,** for the new-box proof (R-1052). If not: nobody has seen a brand-new box reach the floor by itself.
|
- **Delete the test customer „Tester3” in the hub (browser only).** Its test box is already gone and switched off on purpose, so no alarm is coming. If not: a dead test customer stays in your list.
|
||||||
- **Hub 0.153.0 (your rulings 13:20 + R-1059 „A"): no token can resend a claim code, create or edit a customer, make a passphrase or a link, or re-issue an off-site password.** Live since 13:39 (checked with CC's token: all six refused).
|
- **Hub 0.153.0 (your rulings 13:20 + R-1059 „A"): no token can resend a claim code, create or edit a customer, make a passphrase or a link, or re-issue an off-site password.** Live since 13:39 (checked with CC's token: all six refused).
|
||||||
- **Remove the test server „plex-k6” from your Plex account** (plex.tv → Settings → Authorized Devices). The claim test passed and the server is gone from Tester 1. If not: a dead server stays listed in your Plex apps.
|
- **Remove the test server „plex-k6” from your Plex account** (plex.tv → Settings → Authorized Devices). The claim test passed and the server is gone from Tester 1. If not: a dead server stays listed in your Plex apps.
|
||||||
- System poster needs a refresh: every public name answers only over https (http → 301).
|
- System poster needs a refresh: every public name answers only over https (http → 301).
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
iso=/var/lib/vz/template/iso/felhom-installer-1.29.0-pve9.2-1.iso sha256=dceacae5da247d76
|
||||||
|
Formatting '/mnt/hdd_1/images/9301/vm-9301-disk-0.raw', fmt=raw size=128849018880 preallocation=off
|
||||||
|
scsi0: successfully created disk 'nvme-scratch:9301/vm-9301-disk-0.raw,size=120G'
|
||||||
|
update VM 9301: -boot order=scsi0;ide2
|
||||||
|
boot: order=scsi0;ide2
|
||||||
|
ide2: local:iso/felhom-installer-1.29.0-pve9.2-1.iso,media=cdrom,size=1665356K
|
||||||
|
memory: 8192
|
||||||
|
net0: virtio=BC:24:11:06:60:6E,bridge=vmbr0
|
||||||
|
scsi0: nvme-scratch:9301/vm-9301-disk-0.raw,size=120G
|
||||||
|
13:47:13
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
install pressed 13:51:20
|
||||||
|
bind posted 13:59:17
|
||||||
|
claim posted 14:04:09
|
||||||
|
claim posted (2) 14:04:35
|
||||||
|
poweroff posted 14:05:18
|
||||||
|
poweroff posted 14:05:32
|
||||||
|
--- read from the hub DB (copied with its WAL) and from the box's own /api/selfupdate/status ---
|
||||||
|
13:45:52 hub: customer Tester3 created by the operator; the bind mail sent at once
|
||||||
|
13:51:20 Install pressed (ISO 1.29.0, sha256 dceacae5… = published), VM 9301 on demo-hp, 8 GB / 4 cores / 120 GB
|
||||||
|
~13:57 console: pairing code shown (screens/n9301-15-console.png)
|
||||||
|
13:59:17 bind through the mailed link: „Sikeres összekötés"
|
||||||
|
13:59:40 setup-code mail
|
||||||
|
14:02:01 first report: controller 0.313.0 (the vouched golden)
|
||||||
|
14:02:09 the box's own record: update 0.313.0 -> 0.314.0 status success, initiated_by „auto-floor"
|
||||||
|
14:02:14 report: controller 0.314.0
|
||||||
|
14:04:35 dashboard claimed (302 /), the household's password set
|
||||||
|
14:05:32 the household's „turn off" (hub deliberate_off_at 14:05:32Z); 14:06:03 VM stopped; VM 9301 destroyed
|
||||||
|
=> from bind to the floor: 2 min 52 s; from Install to the floor: 10 min 49 s. Nobody pressed an update.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Felhom — Doboz összekötése Felhom doboz összekötése Sikeres összekötés. A doboz kb. egy percen belül folytatja a telepítést. Ezt az oldalt bezárhatod — a beállítás a háttérben befejeződik, és a vezérlőpultod hamarosan elérhető lesz. Felhom.eu
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"ok":true,"message":"felhom-controller is healthy"}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Permission denied, please try again.
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
HTTP/2 200
|
||||||
|
0.314.0
|
||||||
|
HTTP/2 302
|
||||||
|
location: /
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
/api/selfupdate/status -> {"ok":true,"data":{"running":false,"last_check":{"current_version":"0.314.0","latest_version":"0.314.0","update_available":false,"checked_at":"2026-10-15T14:02:39Z"},"last_state":{"status":"success","previous_version":"0.313.0","previous_image":"gitea.dooplex.hu/admin/felhom-controller:0.313.0","target_version":"0.314.0","target_image":"gitea.dooplex.hu/admin/felhom-controller:0.314.0","initiated_
|
||||||
|
/api/system/info -> {"ok":true,"data":{"sync_status":{"last_sync":"2026-10-15T14:02:09.644603083Z","last_status":"ok","syncing":false},"system":{"total_mem_mb":4096,"used_mem_mb":0,"avail_mem_mb":4096,"mem_percent":0,"disk_total_gb":68.72599792480469,"disk_used_gb":0.989349365234375,"disk_avail_gb":64.22103500366211,"disk_percent":1.5171653637825615,"disk_known":true,"hdd_configured":false,"hdd_known":false,"cpu_perc
|
||||||
|
/api/version -> {"ok":false,"error":"endpoint not found"}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{"ok":false,"error":"CSRF token missing or invalid"}
|
||||||
|
HTTP 403
|
||||||
|
{"data":{"powering_off":true},"ok":true}
|
||||||
|
|
||||||
|
HTTP 202
|
||||||
|
Tester3-ac1287|2026-10-15 14:05:34|2026-10-15T14:05:32Z
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
name: newbox-r1052
|
||||||
|
scsi0: nvme-scratch:9301/vm-9301-disk-0.raw,size=120G
|
||||||
|
purging VM 9301 from related configurations..
|
||||||
|
Configuration file 'nodes/demo-hp/qemu-server/9301.conf' does not exist
|
||||||
|
ls: cannot access '/mnt/hdd_1/images/9301': No such file or directory
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# R-1052 — a brand-new box installed from the public ISO reaches the floor by itself (2026-10-15)
|
||||||
|
|
||||||
|
Throwaway customer **Tester3** (domain `tester3.test`, a reserved name that never resolves; no off-site, no PBS-DR —
|
||||||
|
nothing on ep0). VM 9301 on demo-hp from ISO 1.29.0 (checksum = the published one), the graphical installer driven by
|
||||||
|
`qm sendkey`; the household's path: the mailed bind link + pairing code + owner phrase, then the setup code.
|
||||||
|
|
||||||
|
- `02-timeline.txt` — every step with its time. **The golden 0.313.0 box moved to the floor 0.314.0 by itself 2 min 52 s
|
||||||
|
after the bind (initiated_by „auto-floor"), before the household claimed the dashboard.**
|
||||||
|
- `screens/` — the installer and the console (pairing banner, then „the box is linked").
|
||||||
|
- `03-bind.txt`, `05-claim.txt` — the bind page's answer; the claim's 302 (the first try was a 200 refusal: the claim form
|
||||||
|
has its own CSRF field).
|
||||||
|
- `06-version-on-the-box.txt` — the box's own `/api/selfupdate/status`: a second channel beside the hub's reports.
|
||||||
|
- `07-poweroff.txt` — the household's „turn off", recorded by the hub as deliberate (no alarm mails).
|
||||||
|
- `99-teardown.txt` — VM 9301 destroyed. **Left for the operator (session only):** delete customer Tester3.
|
||||||
|
|
||||||
|
Not walked: SSH or a console login on the new host — Felhom replaces the root password at first boot (G1, vaulted in the
|
||||||
|
hub), so the installer's password stops working; the vault was not opened for this.
|
||||||
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 157 KiB |
|
After Width: | Height: | Size: 157 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 129 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 129 KiB |
|
After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 132 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 148 KiB |
|
After Width: | Height: | Size: 131 KiB |
|
After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
@@ -32,6 +32,7 @@
|
|||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| **R-1057** | **A restore of a REMOVED gated app came back without its setup gate, even from a backup made before the setup.** (P2 — raised from P3 by the reviewer 2026-10-15) | CLOSED 2026-10-15 — **controller v0.314.0** (`09` §3 decision 253): the per-app backup records the gate; a restore puts it back as it was (closed then → closed now, file first; open then → open; no record → closed until the probe or „Kész"). Unit tests red-proved by ten mutations. **Live on 9202** (rc.1): Prowlarr installed, no account, the Update's per-app backup, remove keeping backups, restore → a stranger got `/ping` 401, `/` 302 to the gate, `/initialize.json` 401; the household 200; the box's log: „restored with its setup gate CLOSED — it was closed when the backup was taken (R-1057)"; „Kész" then opened it. Before the fix the same walk gave the stranger 200. Plex: the same rule, proven by a unit test with Plex's gate shape (no live Plex restore). | `audits/gate-restore-2026-10-15/9202/restore.txt`, `02-controller-log.txt` |
|
| **R-1057** | **A restore of a REMOVED gated app came back without its setup gate, even from a backup made before the setup.** (P2 — raised from P3 by the reviewer 2026-10-15) | CLOSED 2026-10-15 — **controller v0.314.0** (`09` §3 decision 253): the per-app backup records the gate; a restore puts it back as it was (closed then → closed now, file first; open then → open; no record → closed until the probe or „Kész"). Unit tests red-proved by ten mutations. **Live on 9202** (rc.1): Prowlarr installed, no account, the Update's per-app backup, remove keeping backups, restore → a stranger got `/ping` 401, `/` 302 to the gate, `/initialize.json` 401; the household 200; the box's log: „restored with its setup gate CLOSED — it was closed when the backup was taken (R-1057)"; „Kész" then opened it. Before the fix the same walk gave the stranger 200. Plex: the same rule, proven by a unit test with Plex's gate shape (no live Plex restore). | `audits/gate-restore-2026-10-15/9202/restore.txt`, `02-controller-log.txt` |
|
||||||
| **R-1053** | **A box on an `-rc` tag was never moved by the floor.** (P3) | CLOSED 2026-10-15 — **controller v0.314.0**: `util.ParseVersionPre` puts `X.Y.Z-rc.N` below `X.Y.Z` for the floor only; the button never offers a test build; an unreadable version WARNs once per change. **Live:** Tester 1 put on 0.314.0-rc.1 by hand (rc.4 runs the old check and could never leave by itself), then the floor 0.314.0 moved it: „Post-update startup: update successful (0.314.0-rc.1 → 0.314.0)" at 13:09:38 UTC. | `audits/gate-restore-2026-10-15/release/01-tester1-rc1.txt`, `03-boxes-move.txt` |
|
| **R-1053** | **A box on an `-rc` tag was never moved by the floor.** (P3) | CLOSED 2026-10-15 — **controller v0.314.0**: `util.ParseVersionPre` puts `X.Y.Z-rc.N` below `X.Y.Z` for the floor only; the button never offers a test build; an unreadable version WARNs once per change. **Live:** Tester 1 put on 0.314.0-rc.1 by hand (rc.4 runs the old check and could never leave by itself), then the floor 0.314.0 moved it: „Post-update startup: update successful (0.314.0-rc.1 → 0.314.0)" at 13:09:38 UTC. | `audits/gate-restore-2026-10-15/release/01-tester1-rc1.txt`, `03-boxes-move.txt` |
|
||||||
|
| **R-1052** | **A fresh box installed from a golden older than the floor reaching the floor at first boot was not proven.** (P3) | CLOSED 2026-10-15 — proven: a VM on demo-hp from the public ISO 1.29.0 (golden 0.313.0), bound to the throwaway customer Tester3 through the mailed link, moved to the floor 0.314.0 by itself — initiated_by „auto-floor", 2 min 52 s after the bind, 10 min 49 s after Install, before the household claimed the dashboard; read from the hub's reports AND the box's own self-update record. The domain was a reserved placeholder (`tester3.test`); the floor path does not need a working domain. The operator deletes customer Tester3 (session only). | `audits/gate-restore-2026-10-15/newbox/` |
|
||||||
| **R-1060** | **On controller 0.313.0 the Plex claim button could never work: Plex refused the code with 401 because the box called it as `http://plex:32400`.** (P2) | CLOSED 2026-10-15 — **controller v0.314.0**: every Plex call by the container's address (`mediawire.PlexURL`). **Live on demo-hp 9201** with the operator's fresh code, through the dashboard's own claim call: 200 `claimed: true` in 11.8 s; the box: „claimed — the setup gate is open"; `/identity` „claimed":true; the gate file gone; a stranger meets Plex's own sign-in (`/web/index.html` 200, `/library/sections` 401 without a token); one library wiring run: `plex=done(2)` (`FSEventLibraryUpdatesEnabled=1`, `FSEventLibraryPartialScanEnabled=1`). A fifth call by name — the health probe's `/identity` — is harmless (Plex answers it to anyone). | `audits/gate-restore-2026-10-15/plex9201/01-fake-code.txt`, `02-claim.txt` |
|
| **R-1060** | **On controller 0.313.0 the Plex claim button could never work: Plex refused the code with 401 because the box called it as `http://plex:32400`.** (P2) | CLOSED 2026-10-15 — **controller v0.314.0**: every Plex call by the container's address (`mediawire.PlexURL`). **Live on demo-hp 9201** with the operator's fresh code, through the dashboard's own claim call: 200 `claimed: true` in 11.8 s; the box: „claimed — the setup gate is open"; `/identity` „claimed":true; the gate file gone; a stranger meets Plex's own sign-in (`/web/index.html` 200, `/library/sections` 401 without a token); one library wiring run: `plex=done(2)` (`FSEventLibraryUpdatesEnabled=1`, `FSEventLibraryPartialScanEnabled=1`). A fifth call by name — the health probe's `/identity` — is harmless (Plex answers it to anyone). | `audits/gate-restore-2026-10-15/plex9201/01-fake-code.txt`, `02-claim.txt` |
|
||||||
| **R-1023** | **Build: media apps see every drive, and the box says when they must restart.** (P2) | CLOSED 2026-10-15 — delivered by controller v0.313.0 and the floor; its last step was Tester 1 off the test build (R-1053): Tester 1 runs the release 0.314.0 since 13:09:38 UTC, moved by the floor by itself. | `audits/gate-restore-2026-10-15/release/03-boxes-move.txt`, `audits/media-build-2026-10-15/` |
|
| **R-1023** | **Build: media apps see every drive, and the box says when they must restart.** (P2) | CLOSED 2026-10-15 — delivered by controller v0.313.0 and the floor; its last step was Tester 1 off the test build (R-1053): Tester 1 runs the release 0.314.0 since 13:09:38 UTC, moved by the floor by itself. | `audits/gate-restore-2026-10-15/release/03-boxes-move.txt`, `audits/media-build-2026-10-15/` |
|
||||||
| **R-1058** | **Prowlarr installed AFTER Sonarr/Radarr was not linked until „Bekötés most".** (P3) | CLOSED 2026-10-15 — **controller v0.314.0**: Prowlarr's own start runs the media wiring (`linkOnlyApps`). **Live on 9202** (rc.1): Sonarr first, then Prowlarr → „a media app came up: prowlarr", Sonarr in Prowlarr's Apps ~40 s later, no button; a second run „unchanged"; Prowlarr's connection test 200. Catalog `e67aad4` and the website card drop the button sentence. | `audits/gate-restore-2026-10-15/9202/link.txt` |
|
| **R-1058** | **Prowlarr installed AFTER Sonarr/Radarr was not linked until „Bekötés most".** (P3) | CLOSED 2026-10-15 — **controller v0.314.0**: Prowlarr's own start runs the media wiring (`linkOnlyApps`). **Live on 9202** (rc.1): Sonarr first, then Prowlarr → „a media app came up: prowlarr", Sonarr in Prowlarr's Apps ~40 s later, no button; a second run „unchanged"; Prowlarr's connection test 200. Catalog `e67aad4` and the website card drop the button sentence. | `audits/gate-restore-2026-10-15/9202/link.txt` |
|
||||||
|
|||||||
@@ -221,7 +221,7 @@ stopping line that lies.
|
|||||||
| **R-1050** | Security & access | P4 | **Raise HSTS to one year on or after 2026-11-15, if no https trouble was reported.** `09` §3 decision 249 (D2 = A, operator 2026-10-15): HSTS stays `max-age=86400` now; after a month with no https trouble it becomes one year (`31536000`); never preload, never `includeSubDomains`. The value is `HSTSMaxAgeSeconds` in `felhom-controller/controller/internal/infra/infra.go`, pinned by `TestRenderForwardedHeaders_HTTPSOnly`. „Trouble” = any report of a name that will not open, or a box answering http after the floor. | **WATCHING** — filed 2026-10-15 | the date | On or after 2026-11-15: read the register and the operator's mail for https trouble since 2026-10-15; none → a controller release with one year (test updated), bake → vouch → floor | CC |
|
| **R-1050** | Security & access | P4 | **Raise HSTS to one year on or after 2026-11-15, if no https trouble was reported.** `09` §3 decision 249 (D2 = A, operator 2026-10-15): HSTS stays `max-age=86400` now; after a month with no https trouble it becomes one year (`31536000`); never preload, never `includeSubDomains`. The value is `HSTSMaxAgeSeconds` in `felhom-controller/controller/internal/infra/infra.go`, pinned by `TestRenderForwardedHeaders_HTTPSOnly`. „Trouble” = any report of a name that will not open, or a box answering http after the floor. | **WATCHING** — filed 2026-10-15 | the date | On or after 2026-11-15: read the register and the operator's mail for https trouble since 2026-10-15; none → a controller release with one year (test updated), bake → vouch → floor | CC |
|
||||||
| **R-1054** | Security & access | P3 | **The hub's operator/global API key is still one bearer that can do everything on `/api/v1`, including reading every box's break-glass root password (`GET /admin/hosts/{id}/recovery-credential`).** Hub v0.152.0 gave the web surface scoped tokens (`05` §17) but tokens are refused on `/api/v1` by design. Who uses the global key today is not listed in one place. Fix: list its consumers; move each operator use to a scoped token on the web side (or a token class on the API), and keep the global key only where a box path needs it — or retire it. | OPEN — filed 2026-10-15 by the token build | — | List the global key's consumers (pod env, scripts, runbooks) | CC |
|
| **R-1054** | Security & access | P3 | **The hub's operator/global API key is still one bearer that can do everything on `/api/v1`, including reading every box's break-glass root password (`GET /admin/hosts/{id}/recovery-credential`).** Hub v0.152.0 gave the web surface scoped tokens (`05` §17) but tokens are refused on `/api/v1` by design. Who uses the global key today is not listed in one place. Fix: list its consumers; move each operator use to a scoped token on the web side (or a token class on the API), and keep the global key only where a box path needs it — or retire it. | OPEN — filed 2026-10-15 by the token build | — | List the global key's consumers (pod env, scripts, runbooks) | CC |
|
||||||
|
|
||||||
## Box system & updates — 13 rows (P2 1, P3 8, P4 4)
|
## Box system & updates — 12 rows (P2 1, P3 7, P4 4)
|
||||||
|
|
||||||
| ID | Category | Sev | What | State | Blocked on | Next action | Owner |
|
| ID | Category | Sev | What | State | Blocked on | Next action | Owner |
|
||||||
|---|---|---|---|---|---|---|---|
|
|---|---|---|---|---|---|---|---|
|
||||||
@@ -236,7 +236,6 @@ stopping line that lies.
|
|||||||
| **R-1004** | Box system & updates | P4 | **After an unclean stop every guest ext4 volume waits ~43 s in multi-mount protection before it mounts, so each restart after a power cut takes ~1.5 min longer.** Kernel: „EXT4-fs warning (device dm-6): ext4_multi_mount_protect: MMP interval 42 higher than expected, please wait" on dm-6/dm-7 and loop0/loop1, demo-hp and Tester 1, every round of `audits/night-power-2026-10-13/` (R1 `repairs.txt`). | **READY** — filed 2026-10-14 | — | CC: find where MMP is switched on for the guest volumes (Proxmox `pct` create, or our own mkfs), whether it protects anything on a one-host disk, and measure the restart without it on a scratch guest | CC |
|
| **R-1004** | Box system & updates | P4 | **After an unclean stop every guest ext4 volume waits ~43 s in multi-mount protection before it mounts, so each restart after a power cut takes ~1.5 min longer.** Kernel: „EXT4-fs warning (device dm-6): ext4_multi_mount_protect: MMP interval 42 higher than expected, please wait" on dm-6/dm-7 and loop0/loop1, demo-hp and Tester 1, every round of `audits/night-power-2026-10-13/` (R1 `repairs.txt`). | **READY** — filed 2026-10-14 | — | CC: find where MMP is switched on for the guest volumes (Proxmox `pct` create, or our own mkfs), whether it protects anything on a one-host disk, and measure the restart without it on a scratch guest | CC |
|
||||||
| **R-1013** | Box system & updates | P4 | **After a power cut the agent's start-up stale-lock pass logs an ERROR „pct unlock failed … no lock found" when Proxmox's own start-all removed the lock in the same second.** The outcome is the goal (no lock), so the line is a false alarm in the log. Seen on demo-hp 2026-10-14 12:07:44–45 UTC (`audits/power-cut-fixes-2026-10-14/E/after-boot.txt`; Proxmox: „removed left over backup lock from '9201'!"). Small, but the agent's release for this session is spent (v0.156.1). | **OPEN** — filed 2026-10-14 | — | CC: treat „no lock found" from `pct unlock` as already clear (INFO), with a test; ride the next agent release | CC |
|
| **R-1013** | Box system & updates | P4 | **After a power cut the agent's start-up stale-lock pass logs an ERROR „pct unlock failed … no lock found" when Proxmox's own start-all removed the lock in the same second.** The outcome is the goal (no lock), so the line is a false alarm in the log. Seen on demo-hp 2026-10-14 12:07:44–45 UTC (`audits/power-cut-fixes-2026-10-14/E/after-boot.txt`; Proxmox: „removed left over backup lock from '9201'!"). Small, but the agent's release for this session is spent (v0.156.1). | **OPEN** — filed 2026-10-14 | — | CC: treat „no lock found" from `pct unlock` as already clear (INFO), with a test; ride the next agent release | CC |
|
||||||
| **R-1010** | Box system & updates | P3 | **The agent's stale-lock janitor cannot remove a half-removed `vzdump` snapshot: Proxmox's delete fails on the first missing volume („Failed to find logical volume pve/snap_vm-9201-disk-0_vzdump") and the janitor retries the same call every 10 min forever, leaving the other volume's snapshot and the snapshot entry.** Seen 2026-10-14 after a backup ran out of space on a full host root (LVM could not write its metadata; `audits/power-cut-fixes-2026-10-14/README.md` C4). Fixed by hand with `pct delsnapshot 9201 vzdump --force`. | **READY** — filed 2026-10-14 | — | CC: on that error, retry once with `--force` (a sudoers line or the API's `force=1`), with a test that replays the error text; next agent release | CC |
|
| **R-1010** | Box system & updates | P3 | **The agent's stale-lock janitor cannot remove a half-removed `vzdump` snapshot: Proxmox's delete fails on the first missing volume („Failed to find logical volume pve/snap_vm-9201-disk-0_vzdump") and the janitor retries the same call every 10 min forever, leaving the other volume's snapshot and the snapshot entry.** Seen 2026-10-14 after a backup ran out of space on a full host root (LVM could not write its metadata; `audits/power-cut-fixes-2026-10-14/README.md` C4). Fixed by hand with `pct delsnapshot 9201 vzdump --force`. | **READY** — filed 2026-10-14 | — | CC: on that error, retry once with `--force` (a sudoers line or the API's `force=1`), with a test that replays the error text; next agent release | CC |
|
||||||
| **R-1052** | Box system & updates | P3 | **The new-box path is not proven: a fresh install from a golden older than the floor reaching the floor by itself at first boot.** `09` §3 decision 250 relies on it (the golden is weekly, releases ride the floor). Proof owed at the next controller release: a throwaway VM on demo-hp installed from the ISO (the vouched golden one release behind the floor); time from claim to the floor; the controller's self-update log lines; then the VM and its hub records removed. | **BLOCKED** — filed 2026-10-15; not run with the 0.314.0 release: the proof needs a throwaway customer, and creating a customer is session only since hub 0.153.0 (`09` §3 decision 252) — CC's token is refused by design | the operator: create a throwaway customer (or name one to reuse) in the browser | Then: a VM on demo-hp from the current ISO, claimed as that customer; time from claim to the floor; remove the VM; the operator deletes the customer (session only) | CC |
|
|
||||||
| **R-1061** | Box system & updates | P4 | **A per-customer floor reached Tester 1 only at its next 15-minute report, not in seconds.** Set 2026-10-15 12:55:51 UTC for tester-1, demo-hp and demo-felhom together (hub 0.153.0, CC's token): demo-hp and demo-felhom ran 0.314.0 within 13 s (the hub's wake); Tester 1 moved at 13:09:35, its regular report (`audits/gate-restore-2026-10-15/release/03-boxes-move.txt`). It had restarted at 12:54:29 onto rc.1 and logged „hub wait channel active". Why the wake did not reach it is not read (the wake line is DEBUG). No harm: the floor arrived. | **OPEN** — filed 2026-10-15 | — | Read Tester 1's DEBUG ring at the next floor change; compare with the hub's bump log | CC |
|
| **R-1061** | Box system & updates | P4 | **A per-customer floor reached Tester 1 only at its next 15-minute report, not in seconds.** Set 2026-10-15 12:55:51 UTC for tester-1, demo-hp and demo-felhom together (hub 0.153.0, CC's token): demo-hp and demo-felhom ran 0.314.0 within 13 s (the hub's wake); Tester 1 moved at 13:09:35, its regular report (`audits/gate-restore-2026-10-15/release/03-boxes-move.txt`). It had restarted at 12:54:29 onto rc.1 and logged „hub wait channel active". Why the wake did not reach it is not read (the wake line is DEBUG). No harm: the floor arrived. | **OPEN** — filed 2026-10-15 | — | Read Tester 1's DEBUG ring at the next floor change; compare with the hub's bump log | CC |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||