Rulings 66 (licences) + 67 (userdata stays on remove, 07 §6.5); R-789..R-795 ruled, R-802 (lawyer review) opened; R-800 live proof on 9202 (0.288.0); floor 0.288.0; golden 0.288.0 baked + vouched
gates / gates (push) Successful in 29s

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-02 14:16:41 +02:00
parent 2633dc1654
commit 5ed44ada6e
14 changed files with 618 additions and 6 deletions
@@ -572,6 +572,11 @@ its definition binds through `${HDD_PATH}`) in place. A reinstall over it no lon
THIS drive's install — the app's own unit, the second-drive mirror or (since v0.277.0) the off-site copy — loaded under the kept files, then the
template's `after_load:`, e.g. nextcloud's `occ files:scan --all`) or „Tiszta lappal kezdem" / "Start fresh".
**The household's userdata stays on every remove (`09` §3 decision 67, R-800).** "Remove with data" deletes the app's
own data — its volumes, `<drive>/appdata/<app>` (the `${HDD_PATH}` binds) and its backups. A folder the app binds through
`${USERDATA_PATH}` (`userdata/media/grimmory`, `userdata/media/metube`, …) is the household's: it is never deleted by a
remove, and the dialog and the result say so and name the folder (controller ≥ the release that carries R-800).
**Where it lives.** "Start fresh" RENAMES the folder — same drive, never a copy, never across drives — to
`<drive>/kept/<app>/<YYYY-MM-DD_HHMMSS>/`, together with the removed app's unit when one sits on that drive (so a later
Load has its database). `<drive>/kept` is in `ProtectedHDDPaths`, never under `userdata/`, never bound by a live app.
@@ -701,6 +701,17 @@ its length, and both fixes cost something the household would notice — operato
2026-10-02.* **Why, recorded:** the operator's model is that Felhom sells installation and care, not software; that
holds for OSI licences, but this licence names indirect use "in any … service … resulting in … monetary
compensation", so it needs the permission. STATUS carries it as a standing item with that trigger.
66. **Licences (R-789 … R-795):** Tandoor is treated like SparkyFitness (decision 65): it stays offered, the operator asks
its authors for written permission, and **without it before the first paying customer it is hidden**. Emby, Plex and
n8n are KEPT — the household is the licensee/user and Felhom installs the official, unchanged image. The non-OSI list
(R-789 … R-795) goes to a lawyer **before the first paying customer**. recipe-importer is Felhom's own code: no action
unless it is shared. STATUS carries one standing section, "Before the first paying customer" — *operator ruling
2026-10-02 (afternoon).*
67. **"Remove with data" keeps the household's own files (R-800, option A):** an app's folder under `userdata` (books,
videos, photos the household sees in the file browser) STAYS on any remove; the remove dialog and the result say so
and name the folder. What "with data" deletes is the app's own data: its volumes, `${HDD_PATH}/appdata/<app>` and its
backups — *operator ruling 2026-10-02 (afternoon).* **Why:** userdata is the household's, browsable and often shared
(`media/`); a remove must never take it, but it must never be silent about leaving it either. Recorded in `07` §6.5.
### 2026-09-30 (day) — operator notes, recorded before the work
@@ -0,0 +1,10 @@
## RP-R788: the new test against the OLD classify (catalog febf58c) — 2026-10-02T11:43:05Z
test_both_written_is_clean (__main__.TestEmptyDeclaredVolume.test_both_written_is_clean) ... ok
test_empty_declared_volume_is_undetermined_even_when_another_mount_has_data (__main__.TestEmptyDeclaredVolume.test_empty_declared_volume_is_undetermined_even_when_another_mount_has_data)
R-788: one mount holds data, the DECLARED volume is empty — the old rule called this CLEAN. ... FAIL
FAIL: test_empty_declared_volume_is_undetermined_even_when_another_mount_has_data (__main__.TestEmptyDeclaredVolume.test_empty_declared_volume_is_undetermined_even_when_another_mount_has_data)
AssertionError: 'CLEAN' != 'UNDETERMINED'
FAILED (failures=1)
## the new rule:
OK
@@ -0,0 +1,20 @@
## RP-R800-1 the dialog's source lists no userdata (userdataKept returns nothing) (2026-10-02T12:01:04Z)
=== RUN TestRemoveStack_R800_UserdataKeptIsNamed
delete_r442_test.go:443: hdd-data userdata_kept = [], want [/tmp/TestRemoveStack_R800_UserdataKeptIsNamed39760160/001/userdata/media/app] — the dialog must be able to name the household's folder
--- FAIL: TestRemoveStack_R800_UserdataKeptIsNamed (0.00s)
=== RUN TestRemoveStack_R800_SSDAppUserdataKeptEmpty
--- PASS: TestRemoveStack_R800_SSDAppUserdataKeptEmpty (26.01s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/stacks 26.025s
FAIL
## RP-R800-2 the note still claims no drive data when userdata stays (2026-10-02T12:01:33Z)
=== RUN TestRemoveStack_R800_UserdataKeptIsNamed
delete_r442_test.go:457: hdd_note = "Az alkalmazás nem tárolt saját adatot külső meghajtón, így ott nem volt mit törölni." — false: the app's files are on the drive and stay
--- FAIL: TestRemoveStack_R800_UserdataKeptIsNamed (26.02s)
=== RUN TestRemoveStack_R800_SSDAppUserdataKeptEmpty
--- PASS: TestRemoveStack_R800_SSDAppUserdataKeptEmpty (26.02s)
FAIL
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/stacks 52.046s
FAIL
## restored
ok gitea.dooplex.hu/admin/felhom-controller/internal/stacks 52.047s
@@ -0,0 +1,14 @@
##### R-800 on 9202 — controller gitea.dooplex.hu/admin/felhom-controller:0.288.0 | catalog febf58c Grimmory + MeTube records: row 2.6 with the demo-hp with-data | 2026-10-02T12:05:56Z
deploy metube -> True
metube: POST /add http=200 {"status": "ok"}
metube: the download finished (991017 bytes)
metube: history has it=True; GET /download/<file> http=200
the seed reads back: True
the download on the drive: /mnt/felhom-drives/scratch_hdd/userdata/metube/userdata/media/metube/Big_Buck_Bunny_360_10s_1MB.mp4
the dialog's source GET /api/stacks/metube/hdd-data -> 200 {"stack": "metube", "hdd_paths": null, "has_hdd_data": false, "userdata_kept": [{"path": "/mnt/felhom-drives/scratch_hdd/userdata/metube/userdata/media/metube", "size_bytes": 995113, "size_human": "972K", "exists": true}]}
the stacks page (hu) carries the dialog line: True | negative control 'no-such-sentence-xyz': False
the stacks page (en) carries the dialog line: True | negative control 'no-such-sentence-xyz': False
remove WITH data -> 409 {'ok': False, 'error': 'A(z) /mnt/felhom-drives/scratch_hdd/userdata/metube tárhely jelenleg nem elérhető — az alkalmazás nem távolítható el, amíg a meghajtó vissza nem csatlakozik.'} (9202 has no host agent: R-442 refuses, app kept — the with-data result is pinned by TestRemoveStack_R800_UserdataKeptIsNamed)
remove KEEPING data -> 200 {"removed": "metube", "volumes_removed": ["metube_metube_state"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": ["/mnt/felhom-drives/scratch_hdd/userdata/metube/userdata/media/metube (972K)"], "verified": true}
the file after the remove: STILL THERE
the harness removed its own test folder /mnt/felhom-drives/scratch_hdd/userdata/metube by hand (scratch box)
@@ -0,0 +1,7 @@
## 2026-10-02T12:07:47Z BEFORE: name="min_controller_version" value="0.287.0" name="min_agent" value="0.131.0"
demo-hp 9201: gitea.dooplex.hu/admin/felhom-controller:0.287.0 | demo-felhom 9201: gitea.dooplex.hu/admin/felhom-controller:0.287.0
## 2026-10-02T12:07:52Z POST /configuration/global-floor min_controller_version=0.288.0 min_agent=0.131.0 (the v0.288.0 CHANGELOG header)
HTTP/1.1 303 See Other
Location: /configuration?flash=floor_set
## AFTER: name="min_controller_version" value="0.288.0" name="min_agent" value="0.131.0"
2026-10-02T12:08:12Z both on 0.288.0: demo-hp gitea.dooplex.hu/admin/felhom-controller:0.288.0 | demo-felhom gitea.dooplex.hu/admin/felhom-controller:0.288.0
@@ -0,0 +1,41 @@
#!/usr/bin/env python3
"""r800_live.py — R-800 / decision 67 on scratch 9202 (controller 0.288.0, the LIVE catalog: MeTube is published): MeTube
installed through the product, one download through its own API, then what the remove dialog reads
(`GET /api/stacks/metube/hdd-data` — the call the dialog makes), the dialog text on the page in both languages, the
remove (with data: R-442 refuses on 9202 — no host agent; keeping data: the result), and the file still there.
Endpoint-level method (no browser on DooPlex). Secrets never printed. Env: SC, EV."""
import json, os, re, subprocess, sys, time
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts")
import box_walk as w
import upgrade_fixtures_box as fixtures
MT = fixtures.FIXTURES["metube"]
log = open(f"{w.EV}/B/r800-9202.txt", "a", buffering=1)
def say(*a):
w.say(*a); log.write(" ".join(map(str, a)) + "\n")
w.login()
say(f"##### R-800 on 9202 — controller {w.guest('docker inspect felhom-controller --format {{.Config.Image}}').strip()} | catalog "
+ w.guest("cd /var/lib/docker/volumes/felhom-controller-data/_data/data/catalog-cache && git log --oneline -1").strip()[:70]
+ f" | {time.strftime('%FT%TZ', time.gmtime())}")
say("deploy metube ->", w.deploy("metube", "video"))
t = MT.seed(w, "video", say)
say("the seed reads back:", MT.verify(w, "video", t, say) if t else "NO SEED")
f = w.guest("find /mnt/felhom-drives -path '*userdata*metube*' -name '*.mp4' | head -1").strip()
say("the download on the drive:", f)
code, d = w.ctl("GET", "/api/stacks/metube/hdd-data")
say("the dialog's source GET /api/stacks/metube/hdd-data ->", code, json.dumps(d.get("data"), ensure_ascii=False)[:400])
for lang, q, frag in (("hu", "", "fajljaid ezekben a mapp"), ("en", "?lang=en", "Your files in these folders stay")):
page = w.page(f"/stacks{q}")
ascii_page = page.encode("ascii", "ignore").decode()
pos = frag.replace("fajljaid", "fjljaid") if lang == "hu" else frag
say(f" the stacks page ({lang}) carries the dialog line: {pos in ascii_page} | negative control 'no-such-sentence-xyz': {'no-such-sentence-xyz' in ascii_page}")
w.ctl("POST", "/api/stacks/metube/stop")
for _ in range(24):
time.sleep(5)
if w.stack("metube").get("state") != "running": break
code, d = w.ctl("POST", "/api/stacks/metube/remove", {"remove_hdd_data": True, "remove_backups": True})
say("remove WITH data ->", code, str(d)[:220], "(9202 has no host agent: R-442 refuses, app kept — the with-data result is pinned by TestRemoveStack_R800_UserdataKeptIsNamed)")
code, d = w.ctl("POST", "/api/stacks/metube/remove", {"remove_hdd_data": False, "remove_backups": True})
say("remove KEEPING data ->", code, json.dumps(d.get("data"), ensure_ascii=False)[:500])
say("the file after the remove:", "STILL THERE" if w.guest(f"test -f '{f}' && echo yes").strip() == "yes" else "GONE")
w.guest("rm -rf /mnt/felhom-drives/scratch_hdd/userdata/metube")
say("the harness removed its own test folder /mnt/felhom-drives/scratch_hdd/userdata/metube by hand (scratch box)")
+7 -6
View File
@@ -900,19 +900,20 @@ class (an image `VOLUME` at an unmounted path) is still live — `immich-server`
| **R-786** | **[P3-LOW] SparkyFitness's onboarding record has six open rows** (`app-catalog-felhom.eu/onboarding/sparkyfitness.md`): 0.5 runtime internet (food search providers), 0.7 the phone app's sign-in route through traefik, 1.6 the env names the server reads, 1.7 the entrypoint read, 5.4 a second memory watch at another limit, 8.3 no logo/screenshots on felhom.eu (404). Everything else measured this session (bench + 9202). **Needs:** each row measured, or n/a with a reason. | **READY — rank P3-LOW; owner: CC (catalog)** |
| **R-787** | **[P2-MEDIUM] No catalog app's LICENCE has been checked against Felhom being a paid service; the first look (SparkyFitness, R-784) found a non-commercial-only licence.** The new-app checklist row 0.1 binds apps opened from 2026-10-01; the 53 exempt apps were never read. **Needs:** a read of every template's licence at its pinned tag (SPDX + any custom terms), one table, and the non-open ones to the operator. **UPDATE 2026-10-02 — READ:** all 58 templates (56 published + Grimmory + MeTube), every image, at the pinned tag — one table: `audits/licences-2026-10-02/TABLE.md` (method in `read-1.md`, `read-2.md`). OSI-approved: all but the rows below. Not OSI / limiting, each now its own row: Tandoor (Commons Clause, R-789), Emby (R-790), n8n (R-791), Plex (R-792), the EE/BUSL parts of Cal.com, Docmost, Outline and meilisearch (R-793), redis 7.4 in seven apps (R-794), recipe-importer has no licence file (R-795); SparkyFitness is R-784. Nothing was hidden or changed because of the read (the brief's rule). New apps carry their licence in record row 0.1. | **CLOSED 2026-10-02 — the read (decisions are R-784, R-789..R-795)** |
| **R-788** | **[P3-LOW] The volume-persistence gate reads an EMPTY declared volume as CLEAN — MeTube's `/state` passed while the app had written nothing there.** MEASURED 2026-10-02 on the bench (`audits/family-gate-2026-10-02/C-metube-bench/C2-volume-persistence-metube.txt`): "declared volume /state is EMPTY" → exit 0. The catalog's CLAUDE.md says an app that wrote nothing is UNDETERMINED (exit 2), never a pass. MeTube's real proof came from elsewhere (the history read back after a recreate and after a restore). **Needs:** the gate treats an empty declared volume as undecided, or the app gets an exerciser (MeTube: one `POST /add`); a decoy that is an app writing nothing. **UPDATE 2026-10-02:** part of the cause was R-801 (no port → no exercise at all); the catalog now also has `APP_EXERCISE` (MeTube: one `POST /add`). The empty-volume → CLEAN path itself is still to be checked. | **READY — rank P3-LOW; owner: CC** |
| **R-789** | **[P2-MEDIUM] Tandoor's licence is AGPL-3.0 WITH the Commons Clause: it forbids selling "a product or service whose value derives, entirely or substantially, from the functionality of the Software" — fees for hosting or support included.** READ 2026-10-02 at 2.6.15 (`audits/licences-2026-10-02/TABLE.md`). Felhom charges for installing and caring for the household's apps; whether that value comes "substantially" from Tandoor is the question. **Needs (operator):** keep (the fee is for the box, not Tandoor), hide for new installs, or ask the authors. Nothing changed meanwhile. | **WAITING-ON-OPERATOR — rank P2-MEDIUM; owner: operator** |
| **R-790** | **[P2-MEDIUM] Emby is proprietary: a personal, non-commercial, non-transferable licence.** READ 2026-10-02 (emby.media/terms.html; `audits/licences-2026-10-02/TABLE.md`). The household's private use fits; Felhom installs the official image from Emby (no copy distributed) as part of a paid service, a context the licence does not cover. Jellyfin (GPL) offers the same. **Needs (operator):** keep, hide, or ask Emby. | **WAITING-ON-OPERATOR — rank P2-MEDIUM; owner: operator** |
| **R-791** | **[P3-LOW] n8n's Sustainable Use License allows own internal or personal use, and distribution only free of charge for non-commercial purposes.** READ 2026-10-02 at 2.42.1 (`audits/licences-2026-10-02/TABLE.md`). The household's own use is allowed; Felhom pulling the unchanged official image onto the household's box is arguably not distributing — a grey zone. **Needs (operator):** keep (recommended reading) or ask n8n. | **WAITING-ON-OPERATOR — rank P3-LOW; owner: operator** |
| **R-792** | **[P3-LOW] Plex is proprietary (Plex Terms of Service): the HOUSEHOLD is the licensee under its own Plex account.** READ 2026-10-02 (the ToS page answered 403; quoted from a search snippet — `audits/licences-2026-10-02/TABLE.md`). Felhom gets no right and installs it as the household's agent; selling Plex or Plex Pass is not covered. **Needs (operator):** keep as is, or a page sentence that the Plex account is the household's own. | **WAITING-ON-OPERATOR — rank P3-LOW; owner: operator** |
| **R-789** | **[P2-MEDIUM] Tandoor's licence is AGPL-3.0 WITH the Commons Clause: it forbids selling "a product or service whose value derives, entirely or substantially, from the functionality of the Software" — fees for hosting or support included.** READ 2026-10-02 at 2.6.15 (`audits/licences-2026-10-02/TABLE.md`). Felhom charges for installing and caring for the household's apps; whether that value comes "substantially" from Tandoor is the question. **Needs (operator):** keep (the fee is for the box, not Tandoor), hide for new installs, or ask the authors. Nothing changed meanwhile. **RULED 2026-10-02 afternoon (`09` §3 decision 66):** treated like SparkyFitness — stays offered; the operator asks the authors for written permission; without it before the first paying customer Tandoor is hidden (`lifecycle: hidden`). STATUS "Before the first paying customer". | **WAITING-ON-OPERATOR — rank P2-MEDIUM; owner: operator (the request; trigger: first paying customer)** |
| **R-790** | **[P2-MEDIUM] Emby is proprietary: a personal, non-commercial, non-transferable licence.** READ 2026-10-02 (emby.media/terms.html; `audits/licences-2026-10-02/TABLE.md`). The household's private use fits; Felhom installs the official image from Emby (no copy distributed) as part of a paid service, a context the licence does not cover. Jellyfin (GPL) offers the same. **Needs (operator):** keep, hide, or ask Emby. **RULED 2026-10-02 afternoon (`09` §3 decision 66):** KEPT — the household is the licensee; Felhom installs the official, unchanged image. Part of the lawyer's review (R-802). | **CLOSED 2026-10-02 — operator ruling (kept)** |
| **R-791** | **[P3-LOW] n8n's Sustainable Use License allows own internal or personal use, and distribution only free of charge for non-commercial purposes.** READ 2026-10-02 at 2.42.1 (`audits/licences-2026-10-02/TABLE.md`). The household's own use is allowed; Felhom pulling the unchanged official image onto the household's box is arguably not distributing — a grey zone. **Needs (operator):** keep (recommended reading) or ask n8n. **RULED 2026-10-02 afternoon (`09` §3 decision 66):** KEPT — the household is the user; the official, unchanged image. Part of the lawyer's review (R-802). | **CLOSED 2026-10-02 — operator ruling (kept)** |
| **R-792** | **[P3-LOW] Plex is proprietary (Plex Terms of Service): the HOUSEHOLD is the licensee under its own Plex account.** READ 2026-10-02 (the ToS page answered 403; quoted from a search snippet — `audits/licences-2026-10-02/TABLE.md`). Felhom gets no right and installs it as the household's agent; selling Plex or Plex Pass is not covered. **Needs (operator):** keep as is, or a page sentence that the Plex account is the household's own. **RULED 2026-10-02 afternoon (`09` §3 decision 66):** KEPT — the household is the licensee under its own Plex account. Part of the lawyer's review (R-802). | **CLOSED 2026-10-02 — operator ruling (kept)** |
| **R-793** | **[P3-LOW] Enterprise / BUSL code ships inside four open images — Cal.com and Docmost (EE folders, off without a key), Outline (BUSL-1.1: no commercial "Document Service"), meilisearch v1.36 in Wanderer (EE modules).** READ 2026-10-02 (`audits/licences-2026-10-02/TABLE.md`). Each is fine as the catalog runs them: no EE key, the household's own Outline is not a Document Service, Wanderer uses plain search. **Watch:** never turn on an EE feature, never switch Karakeep's/Wanderer's meilisearch to the `-enterprise` image, and re-read on each major. | **WATCHING — rank P3-LOW; owner: CC** |
| **R-794** | **[P3-LOW] redis 7.4 (RSALv2 / SSPL, not OSI) runs as a private cache in seven apps: dawarich, docmost, immich, nextcloud, outline, paperless-ngx, romm.** READ 2026-10-02 (`audits/licences-2026-10-02/TABLE.md`). Read as permitted (a private cache only its app uses is not Redis offered as a service — inferred). Valkey (BSD-3) or redis 8 (AGPL option) removes the question. **Needs:** a ladder step per app to valkey or redis 8, through the harness — no hurry. | **READY — rank P3-LOW; owner: CC** |
| **R-795** | **[P3-LOW] recipe-importer, Felhom's own image, has no licence file.** READ 2026-10-02 (`audits/licences-2026-10-02/TABLE.md`): all rights reserved by default; its dependencies are permissive (inferred from requirements.txt). **Needs (operator):** pick a licence (or none, on purpose) and add the file. | **WAITING-ON-OPERATOR — rank P3-LOW; owner: operator** |
| **R-795** | **[P3-LOW] recipe-importer, Felhom's own image, has no licence file.** READ 2026-10-02 (`audits/licences-2026-10-02/TABLE.md`): all rights reserved by default; its dependencies are permissive (inferred from requirements.txt). **Needs (operator):** pick a licence (or none, on purpose) and add the file. **RULED 2026-10-02 afternoon (`09` §3 decision 66):** Felhom's own code — no action unless it is shared with anyone. | **CLOSED 2026-10-02 — operator ruling (no action unless shared)** |
| **R-796** | **[P3-LOW] MeTube's "send to MeTube" helpers (browser extensions, bookmarklets, phone apps) cannot work behind the family gate.** READ 2026-10-02 (`audits/family-gate-2026-10-02/B/metube-reads/reads-2026.09.29.txt`): they call `/add` from another site and carry no family login; the template sets no CORS origin and MeTube has NO exception by design (an exception on an app with no login would be an open door). The household pastes links in the page (first_steps). **Needs:** nothing unless households ask; a way would be a per-member token the gate accepts on `/add` only — a design question, not a fix. | **WATCHING — rank P3-LOW; owner: CC** |
| **R-797** | **[P3-LOW] `check-family-gate.py` rule 3 (a family_gate template needs a baked golden ≥ 0.287.0) is checked only where the felhom.eu sibling exists — CI's single clone cannot.** MEASURED 2026-10-02 (`audits/family-gate-2026-10-02/C-metube-bench/C3b-family-gate-with-sibling.txt`): without the sibling the gate printed NOT CHECKED and its summary read OK. The summary line now says "rule 3 … NOT CHECKED here". The pre-push hook (with the sibling) is where it bites. **Needs:** nothing more unless CI gets the sibling. | **WATCHING — rank P3-LOW; owner: CC** |
| **R-798** | **[P3-LOW] Grimmory's template sets `SWAGGER_ENABLED=false`, which v3.5.0 does not read (it reads `API_DOCS_ENABLED`, default false).** READ 2026-10-02 (`audits/family-gate-2026-10-02/B/grimmory-reads/upstream-v3.5.0.txt`). Harmless today — the API docs are off by default. **Needs:** remove the dead line or set the right name, on the next Grimmory step. | **READY — rank P3-LOW; owner: CC** |
| **R-799** | **[P3-LOW] The MeTube fixture's `POST /add` leaves out `download_type`, which upstream's validator lists as required.** MEASURED 2026-10-02 (`audits/family-gate-2026-10-02/C-metube-bench/`): both 2026.09.28 and .29 answered 200 and downloaded anyway. Fragile if a later tag enforces it. **Needs:** add `download_type: video` to the fixture with the next MeTube step. | **READY — rank P3-LOW; owner: CC** |
| **R-800** | **[P2-MEDIUM] "Delete your data from the hard drive" keeps the app's files in the household's userdata folder — and neither the dialog nor the result says so.** MEASURED 2026-10-02. On demo-hp (live catalog, `audits/family-gate-2026-10-02/B4/grimmory-demo.txt`, `metube-demo.txt`): remove WITH data removed Grimmory's database volume, appdata and backups but KEPT the uploaded EPUB in `userdata/media/grimmory`; for MeTube the dialog offers no data checkbox at all and the result says "the app stored no data of its own on a drive" while the downloaded video stays in `userdata/media/metube`. On 9202 "keeping data" answers `hdd_paths_preserved: []` for the same reason (`audits/family-gate-2026-10-02/B/box/life.txt`): the remove reads `${HDD_PATH}` binds only. The model behind it may be right — userdata is the household's own files (a shared `media/` tree must never go with one app) — but then the dialog must say the files stay and where. **Needs (operator):** keep userdata on remove (and say so on the dialog), or delete an app's OWN userdata subfolder when the household ticks the box. | **WAITING-ON-OPERATOR — rank P2-MEDIUM; owner: operator (the rule), CC (the dialog)** |
| **R-800** | **[P2-MEDIUM] "Delete your data from the hard drive" keeps the app's files in the household's userdata folder — and neither the dialog nor the result says so.** MEASURED 2026-10-02. On demo-hp (live catalog, `audits/family-gate-2026-10-02/B4/grimmory-demo.txt`, `metube-demo.txt`): remove WITH data removed Grimmory's database volume, appdata and backups but KEPT the uploaded EPUB in `userdata/media/grimmory`; for MeTube the dialog offers no data checkbox at all and the result says "the app stored no data of its own on a drive" while the downloaded video stays in `userdata/media/metube`. On 9202 "keeping data" answers `hdd_paths_preserved: []` for the same reason (`audits/family-gate-2026-10-02/B/box/life.txt`): the remove reads `${HDD_PATH}` binds only. The model behind it may be right — userdata is the household's own files (a shared `media/` tree must never go with one app) — but then the dialog must say the files stay and where. **Needs (operator):** keep userdata on remove (and say so on the dialog), or delete an app's OWN userdata subfolder when the household ticks the box. **RULED 2026-10-02 afternoon (`09` §3 decision 67, option A):** the household's userdata files stay on every remove; the dialog and the result say so and name the folder. Recorded in `07` §6.5. Built in the next controller release. | **READY — rank P2-MEDIUM; owner: CC (the dialog and the result text)** |
| **R-801** | **[P2-MEDIUM] The volume-persistence gate never sent a request to ANY app: it read the routed port from label VALUES while `docker compose config --format json` puts the port in the label NAME.** MEASURED 2026-10-02 on the bench (`audits/family-gate-2026-10-02/B/volume-persistence-metube-exerciser-diag.txt`: `"ports": []`, `"exercise": []` for MeTube; the label shape read on Compose 2.26.1). So every verdict since the gate exists came only from what an app writes at start by itself; the GET exercise and the deep second pass never ran. **Fixed in the catalog** (`routed_ports()`, key=value; unit tests, red-proofed: `audits/family-gate-2026-10-02/B/RP-R801-routed-ports.txt`). **Still owed:** a full re-sweep of all 58 templates on the bench with the fixed gate — an app whose data path is written only on a request may now read differently. | **READY — rank P2-MEDIUM; owner: CC (the re-sweep)** |
| **R-802** | **[P2-MEDIUM] A lawyer reviews the non-OSI licence list before the first paying customer.** Operator ruling 2026-10-02 (`09` §3 decision 66): Tandoor (R-789), SparkyFitness (R-784), Emby, n8n, Plex (kept — R-790..R-792), the EE/BUSL parts (R-793), redis 7.4 (R-794); the table is `audits/licences-2026-10-02/TABLE.md`. STATUS "Before the first paying customer". | **WAITING-ON-OPERATOR — rank P2-MEDIUM; owner: operator (trigger: first paying customer)** |
<!-- DUE-CHECKS-BEGIN — machine-readable. Parsed by scripts/due_checks_gate.py.
One row per dated check. The R-number must have a row above. Dates are UTC.
@@ -0,0 +1,94 @@
## 2026-10-02T12:08:18Z golden 0.288.0 — bake in the drill VM (RUNBOOK-manual-build §4.0/§4.1)
reverted to virgin (this also proves no qemu holds the qcow2)
cold boot started
ssh up: pve-manager/9.2.2/b9984c6d90a4bd80 (running kernel: 7.0.2-6-pve)
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LC_NUMERIC = (unset),
LC_COLLATE = (unset),
LC_TIME = (unset),
LC_MESSAGES = (unset),
LC_MONETARY = (unset),
LC_ADDRESS = (unset),
LC_IDENTIFICATION = (unset),
LC_MEASUREMENT = (unset),
LC_PAPER = (unset),
LC_TELEPHONE = (unset),
LC_NAME = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
system debian-13-standard_13.6-1_amd64.tar.zst
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LC_NUMERIC = (unset),
LC_COLLATE = (unset),
LC_TIME = (unset),
LC_MESSAGES = (unset),
LC_MONETARY = (unset),
LC_ADDRESS = (unset),
LC_IDENTIFICATION = (unset),
LC_MEASUREMENT = (unset),
LC_PAPER = (unset),
LC_TELEPHONE = (unset),
LC_NAME = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
template (current point release, listed not assumed): debian-13-standard_13.6-1_amd64.tar.zst
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
template downloaded
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
script (v3.0.0) + token landed, non-empty, executable
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
bake launched 2026-10-02T12:09:09Z
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
token leak check on the unit (needle non-empty): 0
unit state: inactive at 2026-10-02T12:14:41Z
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
log copied off the machine FIRST: 327 lines
markers: overlay2=1 mountpoints=2 upload=1 FATAL=0 excluding=0
docker OK (overlay2; data-root /var/lib/docker)
INFO: including mount point rootfs ('/') in backup
INFO: including mount point mp0 ('/var/lib/felhom') in backup
[golden] upload OK (HTTP 201)
GOLDEN_VERSION=0.288.0
GOLDEN_SHA256=436fdfa106d82eb2ff56112469f8279ca081ee9b40f033147f4a3955878e49cb
token-leak grep on the saved log: 0
positive control (token appended to a throwaway copy): 1
REGISTRY CHECK (the outcome, not the attempt): golden 0.288.0 -> http=206
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
secrets shredded (3 expected absent): 3
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LC_NUMERIC = (unset),
LC_COLLATE = (unset),
LC_TIME = (unset),
LC_MESSAGES = (unset),
LC_MONETARY = (unset),
LC_ADDRESS = (unset),
LC_IDENTIFICATION = (unset),
LC_MEASUREMENT = (unset),
LC_PAPER = (unset),
LC_TELEPHONE = (unset),
LC_NAME = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
pct list lines after destroy: 0
qemu processes: 0
disk reverted to virgin
## bake finished 2026-10-02T12:15:08Z
@@ -0,0 +1,4 @@
## 2026-10-02T12:15:33Z anonymous full download (no auth header)
http=200 bytes=652180371
436fdfa106d82eb2ff56112469f8279ca081ee9b40f033147f4a3955878e49cb golden.tar.zst
bake log GOLDEN_SHA256: 436fdfa106d82eb2ff56112469f8279ca081ee9b40f033147f4a3955878e49cb
@@ -0,0 +1,21 @@
## BEFORE:
name="min_agent" value="0.131.0"
<option value="0.138.0" data-sha="55916026001790a79ebf97d32c032610cfde8e09d02979b9b9d8c2cbc5d88195" selected
<option value="0.287.0" data-sha="c95fbd9c62accd8b7ff6cf4edd4a19fcebb4e09cb40e0bbb3b03d2e8ee904b65" selected
name="min_agent" value="0.131.0"
## 2026-10-02T12:15:45Z the vouch: golden 0.288.0 + agent 0.138.0 + min_agent 0.131.0 (MinAgent from the controller CHANGELOG v0.288.0 header); golden sha == the round trip
HTTP/1.1 303 See Other
Location: /configuration?flash=artifacts_set
## AFTER:
name="min_agent" value="0.131.0"
<option value="0.138.0" data-sha="55916026001790a79ebf97d32c032610cfde8e09d02979b9b9d8c2cbc5d88195" selected
<option value="0.288.0" data-sha="436fdfa106d82eb2ff56112469f8279ca081ee9b40f033147f4a3955878e49cb" selected
name="min_agent" value="0.131.0"
## 2026-10-02T12:16:14Z R-120 negative control: try golden 0.287.0 now
HTTP/1.1 303 See Other
Location: /configuration?flash=golden_behind_fleet
manifest after the refusal:
name="min_agent" value="0.131.0"
<option value="0.138.0" data-sha="55916026001790a79ebf97d32c032610cfde8e09d02979b9b9d8c2cbc5d88195" selected
<option value="0.288.0" data-sha="436fdfa106d82eb2ff56112469f8279ca081ee9b40f033147f4a3955878e49cb" selected
name="min_agent" value="0.131.0"
@@ -0,0 +1,9 @@
# golden 0.288.0 — 2026-10-02 (controller v0.288.0: the remove dialog names the household's files, R-800)
Baked in the drill VM on DooPlex per `RUNBOOK-manual-build.md` §4.0/§4.1 by `bake-driver.sh` (this folder; the token goes
file → file and is read inside the VM). Markers: overlay2 1, mount points rootfs + mp0, upload OK (HTTP 201), FATAL 0.
`GOLDEN_SHA256=436fdfa106d82eb2ff56112469f8279ca081ee9b40f033147f4a3955878e49cb`.
Token leak: 0 in the unit, 0 in the saved log, positive control 1. Registry range-GET 206; an anonymous full download
(652 180 371 bytes) hashes to the same sha (`02-round-trip.txt`). Vouched — three fields: golden 0.288.0, agent 0.138.0,
min_agent 0.131.0 (the v0.288.0 CHANGELOG header); the R-120 gate then refused golden 0.287.0 (`05-vouch.txt`).
Teardown: CT 9100 destroyed, secrets shredded (3/3), qemu exited, the disk reverted to `virgin`.
@@ -0,0 +1,48 @@
#!/bin/bash
# bake.sh <VER> — golden bake per RUNBOOK-manual-build §4.0/§4.1 (shape of evidence-golden-0283). Secrets: the Gitea token
# goes file -> file and is read INSIDE the VM; never on a command line here.
set -u
VER=$1; D=/mnt/5_hdd/felhom.eu/drill; Q=$D/drill.qcow2; K=$D/id_drill
EVG=/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/tests/golden-0.288.0-2026-10-02
S="ssh -i $K -p 2222 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectTimeout=5 root@localhost"
say(){ echo "$*"; }
say "## $(date -u +%FT%TZ) golden $VER — bake in the drill VM (RUNBOOK-manual-build §4.0/§4.1)"
n=$(ps -eo comm | grep -c '^qemu-system-x86'); [ "$n" = 0 ] || { say "FATAL qemu already running ($n)"; exit 1; }
qemu-img snapshot -a virgin $Q && say " reverted to virgin (this also proves no qemu holds the qcow2)" || { say FATAL revert; exit 1; }
qemu-system-x86_64 -enable-kvm -cpu host -smp 4 -m 8192 \
-drive file=$Q,format=qcow2,if=virtio,cache=writeback \
-netdev user,id=n0,dhcpstart=10.0.2.30,hostfwd=tcp::2222-10.0.2.15:22 \
-device virtio-net-pci,netdev=n0 -display none -daemonize -pidfile $D/qemu.pid && say " cold boot started"
for i in $(seq 1 60); do $S true 2>/dev/null && break; sleep 5; done
say " ssh up: $($S pveversion 2>/dev/null)"
$S 'pveam update >/dev/null 2>&1; pveam available --section system | grep "debian-13-standard_.*_amd64"'
T=$($S 'pveam available --section system | grep -o "debian-13-standard_[^ ]*_amd64.tar.zst" | sort -V | tail -1')
say " template (current point release, listed not assumed): $T"
$S "pveam download local $T >/dev/null 2>&1 && echo ' template downloaded'"
scp -q -i $K -P 2222 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null /mnt/5_hdd/felhom.eu/git/felhom-agent/configs/build-golden.sh root@localhost:/root/build-golden.sh
scp -q -i $K -P 2222 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ~/.gitea-token root@localhost:/root/.gitea-token
$S "chmod 0700 /root/build-golden.sh; chmod 0600 /root/.gitea-token; cat > /root/bake-run.sh <<EOS
#!/bin/bash
GT=\\\$(cat /root/.gitea-token)
export GITEA_USER=admin GITEA_TOKEN=\"\\\$GT\" REGISTRY_USER=admin REGISTRY_TOKEN=\"\\\$GT\"
exec /root/build-golden.sh 9100 local:vztmpl/$T local-lvm local vmbr0 gitea.dooplex.hu/admin/felhom-controller:$VER
EOS
chmod 0700 /root/bake-run.sh; [ -s /root/.gitea-token ] && [ -x /root/build-golden.sh ] && echo ' script ('\$(grep -o 'v[0-9]\\.[0-9]\\.[0-9]' /root/build-golden.sh | head -1)') + token landed, non-empty, executable'"
$S 'systemd-run --unit=golden-bake --collect bash -c "/root/bake-run.sh > /root/bake.log 2>&1" >/dev/null 2>&1' && say " bake launched $(date -u +%FT%TZ)"
say " token leak check on the unit (needle non-empty): $($S '[ -s /root/.gitea-token ] && systemctl show golden-bake -p Environment -p ExecStart | grep -c -F "$(cat /root/.gitea-token)"')"
for i in $(seq 1 180); do st=$($S 'systemctl is-active golden-bake' 2>/dev/null); [ "$st" = active ] || [ "$st" = activating ] || break; sleep 10; done
say " unit state: ${st:-gone} at $(date -u +%FT%TZ)"
$S 'cat /root/bake.log' > $EVG/bake.log; say " log copied off the machine FIRST: $(wc -l < $EVG/bake.log) lines"
L=$EVG/bake.log
say " markers: overlay2=$(grep -c 'docker OK (overlay2' $L) mountpoints=$(grep -c 'including mount point' $L) upload=$(grep -c 'upload OK (HTTP 201)' $L) FATAL=$(grep -c FATAL $L) excluding=$(grep -c excluding $L)"
grep -E 'docker OK \(overlay2|including mount point|upload OK|^GOLDEN_' $L | sed 's/^/ /'
say " token-leak grep on the saved log: $(grep -c -F "$(cat ~/.gitea-token)" $L)"
cp $L /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/05c3d295-b388-481a-8c36-44a2a80b7d7d/scratchpad/pc.log; cat ~/.gitea-token >> /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/05c3d295-b388-481a-8c36-44a2a80b7d7d/scratchpad/pc.log
say " positive control (token appended to a throwaway copy): $(grep -c -F "$(cat ~/.gitea-token)" /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/05c3d295-b388-481a-8c36-44a2a80b7d7d/scratchpad/pc.log)"; shred -u /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/05c3d295-b388-481a-8c36-44a2a80b7d7d/scratchpad/pc.log
say " REGISTRY CHECK (the outcome, not the attempt): golden $VER -> http=$(curl -s -o /dev/null -w '%{http_code}' -r 0-0 https://gitea.dooplex.hu/api/packages/admin/generic/felhom-golden/$VER/golden.tar.zst)"
say " secrets shredded (3 expected absent): $($S 'shred -u /root/.gitea-token /root/bake-run.sh /root/bake.log; n=0; for f in /root/.gitea-token /root/bake-run.sh /root/bake.log; do [ -e $f ] || n=$((n+1)); done; echo $n')"
$S 'pct destroy 9100 --purge >/dev/null 2>&1; true'; say " pct list lines after destroy: $($S 'pct list | tail -n +2 | wc -l')"
$S 'poweroff' 2>/dev/null; for i in $(seq 1 60); do [ "$(ps -eo comm | grep -c '^qemu-system-x86')" = 0 ] && break; sleep 3; done
say " qemu processes: $(ps -eo comm | grep -c '^qemu-system-x86')"
qemu-img snapshot -a virgin $Q && say " disk reverted to virgin"
say "## bake finished $(date -u +%FT%TZ)"
@@ -0,0 +1,327 @@
[golden] build-golden.sh v3.0.0 — baking controller gitea.dooplex.hu/admin/felhom-controller:0.288.0
[golden] creating build LXC 9100 (nesting=1,keyctl=1, unprivileged; rootfs 32G + ONE data volume 24G @ /var/lib/felhom, backup=1) …
Logical volume "vm-9100-disk-0" created.
Logical volume pve/vm-9100-disk-0 changed.
Creating filesystem with 8388608 4k blocks and 2097152 inodes
Filesystem UUID: d2ed589e-457b-47c6-9e11-9e332fb7dee5
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624
Logical volume "vm-9100-disk-1" created.
Logical volume pve/vm-9100-disk-1 changed.
Creating filesystem with 6291456 4k blocks and 1572864 inodes
Filesystem UUID: 9562b00e-26d6-4d0d-bc28-253cc8671107
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
extracting archive '/var/lib/vz/template/cache/debian-13-standard_13.6-1_amd64.tar.zst'
Total bytes read: 553512960 (528MiB, 121MiB/s)
Detected container architecture: amd64
Creating SSH host key 'ssh_host_rsa_key' - this may take some time ...
done: SHA256:EvOk53ZpYWqzsKLrkL8kQhwcLDNK49DDngTTC9F8AMw root@felhom-golden
Creating SSH host key 'ssh_host_ed25519_key' - this may take some time ...
done: SHA256:+/jbbnCS5YqsV4zDy9EmP9HF+IPwkEpAQJTUyNo/gIU root@felhom-golden
Creating SSH host key 'ssh_host_ecdsa_key' - this may take some time ...
done: SHA256:xfsHnllfVg3nRh/I6i1I84wxrMBSr2EwI2VtxQ6dLBI root@felhom-golden
[golden] starting + installing Docker (official repo, trixie channel) …
apt-listchanges: Can't set locale; make sure $LC_* and $LANG are correct!
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = (unset),
LC_NUMERIC = (unset),
LC_COLLATE = (unset),
LC_TIME = (unset),
LC_MESSAGES = (unset),
LC_MONETARY = (unset),
LC_ADDRESS = (unset),
LC_IDENTIFICATION = (unset),
LC_MEASUREMENT = (unset),
LC_PAPER = (unset),
LC_TELEPHONE = (unset),
LC_NAME = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
apt-listchanges: Can't set locale; make sure $LC_* and $LANG are correct!
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = (unset),
LC_NUMERIC = (unset),
LC_COLLATE = (unset),
LC_TIME = (unset),
LC_MESSAGES = (unset),
LC_MONETARY = (unset),
LC_ADDRESS = (unset),
LC_IDENTIFICATION = (unset),
LC_MEASUREMENT = (unset),
LC_PAPER = (unset),
LC_TELEPHONE = (unset),
LC_NAME = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
[golden] baking daemon.json: classic overlay2 driver (containerd-snapshotter OFF) + log rotation …
[golden] wiring the single data volume (R-165 variant V-c): /var/lib/felhom/{docker,sys_drive} -> binds …
[golden] verifying Docker works in the build guest (storage driver should be overlay2 on the ext4 data volume) …
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pulling fs layer
4f55086f7dd0: Verifying Checksum
4f55086f7dd0: Download complete
4f55086f7dd0: Pull complete
Digest: sha256:5e23090353324d887c48ad5e5c56d294eab81588df9605b07d1afe895f9cc8f8
Status: Downloaded newer image for hello-world:latest
docker OK (overlay2; data-root /var/lib/docker)
/var/lib/docker is a real mount: /dev/mapper/pve-vm--9100--disk--1[/docker] ext4
/mnt/sys_drive is a real mount: /dev/mapper/pve-vm--9100--disk--1[/sys_drive] ext4
both paths are ONE filesystem: /dev/mapper/pve-vm--9100--disk--1 23317576
[golden] baking the in-guest controller image gitea.dooplex.hu/admin/felhom-controller:0.288.0 (no registry cred at deploy) …
WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/
0.288.0: Pulling from admin/felhom-controller
774043ccc8cc: Pulling fs layer
ab6b448d4be9: Pulling fs layer
23a5bfa58353: Pulling fs layer
862a57157567: Pulling fs layer
e485e0aa3e72: Pulling fs layer
c577ed0bacc6: Pulling fs layer
862a57157567: Waiting
c577ed0bacc6: Waiting
e485e0aa3e72: Waiting
774043ccc8cc: Verifying Checksum
774043ccc8cc: Download complete
862a57157567: Verifying Checksum
862a57157567: Download complete
23a5bfa58353: Verifying Checksum
23a5bfa58353: Download complete
e485e0aa3e72: Verifying Checksum
e485e0aa3e72: Download complete
c577ed0bacc6: Verifying Checksum
c577ed0bacc6: Download complete
ab6b448d4be9: Verifying Checksum
ab6b448d4be9: Download complete
774043ccc8cc: Pull complete
ab6b448d4be9: Pull complete
23a5bfa58353: Pull complete
862a57157567: Pull complete
e485e0aa3e72: Pull complete
c577ed0bacc6: Pull complete
Digest: sha256:5b317a9c1c777807002e6010848f03b6bcbaafdc804461322c6b7042847b2d09
Status: Downloaded newer image for gitea.dooplex.hu/admin/felhom-controller:0.288.0
gitea.dooplex.hu/admin/felhom-controller:0.288.0
[golden] asking the controller which infra images it manages …
[golden] baking infra images (4): traefik:v3.6.7 cloudflare/cloudflared:2026.6.0 gtstef/filebrowser:1.3.3-stable gitea.dooplex.hu/admin/felhom-samba:1.1.0 …
v3.6.7: Pulling from library/traefik
589002ba0eae: Pulling fs layer
ef63511ea6cc: Pulling fs layer
0738e5cb835e: Pulling fs layer
3e6813f70c64: Pulling fs layer
3e6813f70c64: Waiting
589002ba0eae: Verifying Checksum
589002ba0eae: Download complete
ef63511ea6cc: Verifying Checksum
ef63511ea6cc: Download complete
3e6813f70c64: Verifying Checksum
3e6813f70c64: Download complete
0738e5cb835e: Verifying Checksum
0738e5cb835e: Download complete
589002ba0eae: Pull complete
ef63511ea6cc: Pull complete
0738e5cb835e: Pull complete
3e6813f70c64: Pull complete
Digest: sha256:a9890c898f379c1905ee5b28342f6b408dc863f08db2dab20e46c267d1ff463a
Status: Downloaded newer image for traefik:v3.6.7
docker.io/library/traefik:v3.6.7
2026.6.0: Pulling from cloudflare/cloudflared
47de5dd0b812: Pulling fs layer
c172f21841df: Pulling fs layer
99515e7b4d35: Pulling fs layer
99ba982a9142: Pulling fs layer
d6b1b89eccac: Pulling fs layer
2780920e5dbf: Pulling fs layer
7c12895b777b: Pulling fs layer
3214acf345c0: Pulling fs layer
52630fc75a18: Pulling fs layer
dd64bf2dd177: Pulling fs layer
b839dfae01f6: Pulling fs layer
ebddc55facdc: Pulling fs layer
bdfd7f7e5bf6: Pulling fs layer
2d4d7adf6272: Pulling fs layer
40008157d8d2: Pulling fs layer
bd8962e29291: Pulling fs layer
cac2ae0193cb: Pulling fs layer
74d1dac84ecc: Pulling fs layer
7c12895b777b: Waiting
3214acf345c0: Waiting
52630fc75a18: Waiting
dd64bf2dd177: Waiting
b839dfae01f6: Waiting
ebddc55facdc: Waiting
bdfd7f7e5bf6: Waiting
2d4d7adf6272: Waiting
40008157d8d2: Waiting
bd8962e29291: Waiting
cac2ae0193cb: Waiting
74d1dac84ecc: Waiting
99ba982a9142: Waiting
d6b1b89eccac: Waiting
2780920e5dbf: Waiting
c172f21841df: Verifying Checksum
c172f21841df: Download complete
99515e7b4d35: Verifying Checksum
99515e7b4d35: Download complete
47de5dd0b812: Download complete
99ba982a9142: Verifying Checksum
99ba982a9142: Download complete
d6b1b89eccac: Verifying Checksum
d6b1b89eccac: Download complete
2780920e5dbf: Verifying Checksum
2780920e5dbf: Download complete
7c12895b777b: Verifying Checksum
7c12895b777b: Download complete
47de5dd0b812: Pull complete
3214acf345c0: Verifying Checksum
3214acf345c0: Download complete
52630fc75a18: Verifying Checksum
52630fc75a18: Download complete
dd64bf2dd177: Verifying Checksum
dd64bf2dd177: Download complete
b839dfae01f6: Download complete
ebddc55facdc: Verifying Checksum
ebddc55facdc: Download complete
bdfd7f7e5bf6: Verifying Checksum
bdfd7f7e5bf6: Download complete
c172f21841df: Pull complete
40008157d8d2: Verifying Checksum
40008157d8d2: Download complete
2d4d7adf6272: Verifying Checksum
2d4d7adf6272: Download complete
bd8962e29291: Verifying Checksum
bd8962e29291: Download complete
cac2ae0193cb: Verifying Checksum
cac2ae0193cb: Download complete
74d1dac84ecc: Verifying Checksum
74d1dac84ecc: Download complete
99515e7b4d35: Pull complete
99ba982a9142: Pull complete
d6b1b89eccac: Pull complete
2780920e5dbf: Pull complete
7c12895b777b: Pull complete
3214acf345c0: Pull complete
52630fc75a18: Pull complete
dd64bf2dd177: Pull complete
b839dfae01f6: Pull complete
ebddc55facdc: Pull complete
bdfd7f7e5bf6: Pull complete
2d4d7adf6272: Pull complete
40008157d8d2: Pull complete
bd8962e29291: Pull complete
cac2ae0193cb: Pull complete
74d1dac84ecc: Pull complete
Digest: sha256:ba461b8aa9c042156dbd39c38657fe7431bafa063220eab8d5330a523863da9f
Status: Downloaded newer image for cloudflare/cloudflared:2026.6.0
docker.io/cloudflare/cloudflared:2026.6.0
1.3.3-stable: Pulling from gtstef/filebrowser
6a0ac1617861: Pulling fs layer
ef8806083e82: Pulling fs layer
b74107c861c7: Pulling fs layer
adc935def003: Pulling fs layer
4f4fb700ef54: Pulling fs layer
18695ccc900a: Pulling fs layer
45d119d5c397: Pulling fs layer
dac52db4fc51: Pulling fs layer
6d598f86b2f2: Pulling fs layer
8aa349c8396c: Pulling fs layer
adc935def003: Waiting
4f4fb700ef54: Waiting
18695ccc900a: Waiting
45d119d5c397: Waiting
dac52db4fc51: Waiting
6d598f86b2f2: Waiting
8aa349c8396c: Waiting
6a0ac1617861: Verifying Checksum
6a0ac1617861: Download complete
adc935def003: Verifying Checksum
adc935def003: Download complete
4f4fb700ef54: Verifying Checksum
4f4fb700ef54: Download complete
ef8806083e82: Verifying Checksum
ef8806083e82: Download complete
45d119d5c397: Verifying Checksum
45d119d5c397: Download complete
6a0ac1617861: Pull complete
dac52db4fc51: Verifying Checksum
dac52db4fc51: Download complete
6d598f86b2f2: Verifying Checksum
6d598f86b2f2: Download complete
18695ccc900a: Verifying Checksum
18695ccc900a: Download complete
8aa349c8396c: Verifying Checksum
8aa349c8396c: Download complete
b74107c861c7: Verifying Checksum
b74107c861c7: Download complete
ef8806083e82: Pull complete
b74107c861c7: Pull complete
adc935def003: Pull complete
4f4fb700ef54: Pull complete
18695ccc900a: Pull complete
45d119d5c397: Pull complete
dac52db4fc51: Pull complete
6d598f86b2f2: Pull complete
8aa349c8396c: Pull complete
Digest: sha256:eb3733681db8757412632c61a99ad656f0d94ed6781bb2ea114b4d70babab78c
Status: Downloaded newer image for gtstef/filebrowser:1.3.3-stable
docker.io/gtstef/filebrowser:1.3.3-stable
1.1.0: Pulling from admin/felhom-samba
897d797d2723: Pulling fs layer
3051591aa250: Pulling fs layer
ce57a3f93416: Pulling fs layer
fb94eeec2fe1: Pulling fs layer
fb94eeec2fe1: Waiting
ce57a3f93416: Verifying Checksum
ce57a3f93416: Download complete
897d797d2723: Verifying Checksum
897d797d2723: Download complete
fb94eeec2fe1: Verifying Checksum
fb94eeec2fe1: Download complete
897d797d2723: Pull complete
3051591aa250: Verifying Checksum
3051591aa250: Download complete
3051591aa250: Pull complete
ce57a3f93416: Pull complete
fb94eeec2fe1: Pull complete
Digest: sha256:1c17c09422bec0366d7cf0e0fcfc1486ba6c90334a0a5d5c851073a9342f8f10
Status: Downloaded newer image for gitea.dooplex.hu/admin/felhom-samba:1.1.0
gitea.dooplex.hu/admin/felhom-samba:1.1.0
[golden] baking the controller-bootstrap unit (deploys the BAKED controller from the config mount) …
Created symlink '/etc/systemd/system/multi-user.target.wants/felhom-controller-bootstrap.service' → '/etc/systemd/system/felhom-controller-bootstrap.service'.
[golden] baking the controller-bootstrap PATH unit (starts the service on bootstrap-mount hot-plug — B1) …
Created symlink '/etc/systemd/system/multi-user.target.wants/felhom-controller-bootstrap.path' → '/etc/systemd/system/felhom-controller-bootstrap.path'.
[golden] baking the first-boot SSH host-key regeneration unit (F3) …
Created symlink '/etc/systemd/system/multi-user.target.wants/felhom-regen-hostkeys.service' → '/etc/systemd/system/felhom-regen-hostkeys.service'.
[golden] identity-clean + minimize …
[golden] stop + archive …
INFO: including mount point rootfs ('/') in backup
INFO: including mount point mp0 ('/var/lib/felhom') in backup
INFO: archive file size: 621MB
INFO: Finished Backup of VM 9100 (00:00:43)
[golden] DONE. golden archive volid: local:backup/vzdump-lxc-9100-2026_10_02-14_13_23.tar.zst (rootfs 32G + ONE data volume 24G @ /var/lib/felhom, all in the archive)
[golden] publishing golden (652180371 bytes, sha256 436fdfa106d82eb2…) → https://gitea.dooplex.hu/api/packages/admin/generic/felhom-golden/0.288.0/golden.tar.zst
[golden] pre-delete existing: HTTP 404 (404/204 expected)
[golden] upload OK (HTTP 201)
GOLDEN_VERSION=0.288.0
GOLDEN_SHA256=436fdfa106d82eb2ff56112469f8279ca081ee9b40f033147f4a3955878e49cb
[golden] Record in the hub operator UI (Configs → Day-0 artifacts): golden 0.288.0 / 436fdfa106d82eb2ff56112469f8279ca081ee9b40f033147f4a3955878e49cb
[golden] (the build guest 9100 is stopped; destroy it with: pct destroy 9100 --purge)