8d786f7940
gates / gates (push) Successful in 28s
The drill is complete. Teardown done in three layers plus Gitea; the live catalog's every `image:` line is proven identical to before. WHAT WAS MEASURED. 21 edges across 19 apps, on scratch guest 9202 through the product's own guarded Update, against a PRIVATE DRILL CATALOG so the live catalog carried no test reference at any point: 14 proven, 3 failed, 4 inconclusive. Each app seeded and read back through its OWN front door, with a negative control on every readback. Ten of the fourteen printed a verbatim migration line. Up from the three apps this project had ever measured. THE RESULT THAT MATTERS. R-618, P1: three of the 53 templates name a health probe the app does not answer, and because the guarded update WAITS on that same probe, a SUCCESSFUL update ends by STOPPING a working app. tandoor was measured serving HTTP 200 on the new version at four samples across five minutes, docker's own healthcheck green, and was then stopped and the household sent to a restore they did not need. zipline and wger are the same defect, both confirmed live. The gate that catches all three is static and cheap: both health checks already sit in the same file. WHAT THE NIGHT ANSWERED that was open. The UNATTENDED HOLD (312.9 s, pressed once, never again) — which needed a purpose-built image store, because the rule that makes automatic updates safe is the same rule that refuses the obvious way to break one. MariaDB across a major through the real button, all four observables, first time. PostgreSQL across a major, refusing exactly as predicted, with the conversion costed at ~9 s of engine work. There is NO single-flight: five updates ran at once and all ended honest. And the two EARLY power-cut phases nobody had cut in. TWELVE NEW ROWS (R-615..R-626), register 303 -> 315, and eight existing rows updated with what was measured — including two CORRECTIONS: R-606 records the pre-flight refusals as reaching an English household in English and they do not, and R-446/R-458 are both narrower than their rows state. Two instrument fixes were needed before anything could be trusted: the unattended caller turned every success into a timeout (R-623), and one of my own reproductions was wrong and is kept labelled with what it actually measured. Interventions: zero. No controller, agent or hub code written. The hub was never touched beyond the floor the operator asked for. Gates: repo_gates.py --fast, all 15 OK. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
75 lines
9.0 KiB
Plaintext
75 lines
9.0 KiB
Plaintext
|
||
############################################## 22:16:43 L1 wger — the LAST unmeasured candidate in R-618, and the one that would close it
|
||
22:16:43 === wger — R-618's last unmeasured candidate
|
||
22:16:43 template probe : type=http port=80 (.felhom.yml)
|
||
22:16:43 traefik label : loadbalancer.server.port=8000 (the SAME template's compose)
|
||
22:16:45 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
|
||
22:18:26 [1] deployed, controller state=unhealthy, pinned={'wger': 'wger/server:2.6'}
|
||
22:18:26 [1] NOTE: the controller's own state is 'unhealthy', not 'running' — recorded, not treated as a failure; the fixture's front-door wait is the real gate
|
||
22:18:29 --- what wger actually LISTENS on, asked inside its own container:
|
||
22:18:29 --- the container's own docker healthcheck, if it has one:
|
||
22:18:29 healthy
|
||
22:18:29 --- port 80 from inside (the port the probe names):
|
||
22:18:29 refused on 80
|
||
22:18:29 --- port 8000 from inside (the port the compose says):
|
||
22:18:29 ANSWERED on 8000
|
||
22:18:29 the household's own front door: http=302
|
||
22:18:29 the box's own verdict: state='unhealthy'
|
||
22:18:29 VERDICT: CONFIRMED DEFECT — the same shape as tandoor
|
||
22:18:29 written -> /mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/update-night-2026-09-21/22-wger-probe-measured.txt
|
||
22:18:39 [X] stop -> 200 {'ok': True, 'message': 'Stack wger stop completed'}
|
||
22:18:45 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'wger', 'volumes_removed': ['wger_wger_data', 'wger_wger_media'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note
|
||
22:18:52 [X] after remove: deployed=False leftovers='/opt/docker/stacks/wger'
|
||
|
||
############################################## 22:18:52 L2 B5 retry — the cut in safety-dump, with a REAL pending edge this time
|
||
22:19:17 [knob] backup_max_age=24h :: update: | backup_max_age: 24h | Up 22 seconds (healthy)
|
||
22:19:17 ==== B5: a power cut during `safety-dump` on privatebin
|
||
22:19:17 [0] pending edge for the cut: installed={'privatebin': 'localhost:5000/drill/paste:2.0.1'} catalog={'privatebin': 'localhost:5000/drill/paste:2.0.2'}
|
||
22:19:21 [0] pinned before = {'privatebin': 'localhost:5000/drill/paste:2.0.1'}
|
||
22:19:22 [cut] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követ
|
||
22:19:22 + 0.023s phase=safety-dump
|
||
/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/update-night-2026-09-21/phase3_b5.py:82: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
|
||
decided = datetime.utcnow().isoformat(timespec="milliseconds") + "Z"
|
||
22:19:22 [cut] phase 'safety-dump' OBSERVED at 2026-09-21T20:19:22.234Z — pulling the plug NOW
|
||
22:19:26 [cut] `pct stop 9202` returned after 3.96s ::
|
||
22:19:29 [boot] guest 9202 starting
|
||
22:19:42 [boot] controller back: Up 6 seconds (healthy)
|
||
22:20:05 [boot] recovery lines: 2026/09/21 20:19:36 restore_record_wiring.go:35: [INFO] [backup] restore record wired: /opt/docker/felhom-controller/data/restore-status.json (interrupted at startup: false) | 2026/09/21 20:20:01 bootrecon.go:236: [INFO] [bootrecon] "glance" is a boot orphan by intent but is HELD (held after a failed update (2026-09-21T19:53:02Z) — restore it from its backup to start it) — NOT starting it; whatever is holding it owns its recovery | --- journal file: | ls: cannot access '/var/lib/docker/volumes/f
|
||
22:20:09 [2] household sentence HU: ['PrivateBin — Felhom.eu Indítópult Vezérlőpult Alkalmazások Tárhely Meghajtók Hálózati tárhely Biztonsági mentés Áttekintés Távoli mentés Alkalmazások Visszaállítás Megosztás Hálózati megosztás Rendszermonitor Debug Beállítások Rendszer Értesítések Biztonság és hozzáférés 0.261.0 Magyar English Kijelentkezés ↗ Hub kapcsolat kikapcsolva — a központi monitoring nem aktív Rendszermonitor → ← Alkalmazások PrivateBin Fut Frissítés elérhető — ma Megnyitás ↗ Napló Exportálás Beállítások Titkosított szöveg megosztás - a szerver nem látja a tartalmat ~30M RAM security Pi kompatibilis Áthelyezés másik tárhelyre Ennek az alkalmazásnak az adatait másik csatlakoztatott tárhelyre helyezheted át.', 'Érzékeny szövegek biztonságos megosztása E2E titkosítás - a szerver nem fér hozzá a tartalomhoz Beállítható lejárati idő (5 perc - 1 év, vagy soha) Olvasás után automatikus törlés opció Jelszóvédelem a még nagyobb biztonságért Első lépések Nyisd meg a paste.DOMAIN címet a böngészőben Írd be a szöveget és kattints a Küldés gombra Oszd meg a generált linket - a titkosítási kulcs az URL-ben van Dokumentáció Hivatalos dokumentáció ↗']
|
||
22:20:09 [2] household sentence EN: ['PrivateBin — Felhom.eu Launcher Dashboard Apps Storage Drives Network storage Backup Overview Remote backup Apps Restore Sharing Network sharing System monitor Debug Settings System Notifications Security and access 0.261.0 Magyar English Sign out ↗ The hub connection is off — central monitoring is not running System monitor → ← Apps PrivateBin Running Update available — today Open ↗ Log Export Settings Encrypted text sharing - the server never sees the content ~30M RAM security Runs on Pi Move to another storage You can move this app’s data to another connected storage.', 'Share sensitive text safely End-to-end encryption - the server cannot reach the content You choose how long it lasts (5 minutes to 1 year, or never) Optional: delete it automatically after it is read Password protection for extra safety First steps Open paste.DOMAIN in your browser Type your text and select Send Share the link you get - the encryption key is part of the URL Documentation Official documentation ↗']
|
||
22:20:09 privatebin: seeded paste id=5d8afde576872b63
|
||
22:20:09 privatebin: readback http=200 marker_present=True
|
||
22:20:09 [3] the app works and holds data after the cut: True
|
||
22:20:09 [4] pinned after = {'privatebin': 'localhost:5000/drill/paste:2.0.1'} (moved: False)
|
||
|
||
############################################## 22:20:09 L3 mealie — the edge that was never walked because its drill pin had already moved
|
||
22:20:09 ==== mealie: ghcr.io/mealie-recipes/mealie:v3.20.1 -> ghcr.io/mealie-recipes/mealie:v3.27.0 (sub=mealie, class=db-postgres)
|
||
22:20:09 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
|
||
22:20:29 [1] deployed, controller state=running, pinned={'mealie': 'ghcr.io/mealie-recipes/mealie:v3.20.1'}
|
||
22:20:32 [2] seeding through the app's own front door
|
||
22:20:33 mealie: create recipe http=201
|
||
22:20:33 [3] control C1 — reading the seed back BEFORE the update
|
||
22:20:34 mealie: readback of the seeded recipe http=200 ok=True
|
||
22:20:34 [4] „Mentés most" -> 200 {'ok': True, 'message': 'Mentés elindítva'}
|
||
22:21:49 [4] backup idle; last=None
|
||
22:21:50 [5] drill commit 004105af9a16: mealie ghcr.io/mealie-recipes/mealie:v3.20.1 -> ghcr.io/mealie-recipes/mealie:v3.27.0 (push rc=0)
|
||
22:21:55 [5] badge HU: [{'title': 'Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.', 'text': 'Frissítés elérhető — ma'}]
|
||
22:21:55 [5] badge EN: [{'title': 'A newer version of this app is available. Select the Update button to start it.', 'text': 'Update available — today'}]
|
||
22:21:55 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}
|
||
22:21:55 + 0.0s phase=safety-dump label=Adatbázis pillanatkép… err=None hold=None
|
||
22:21:56 + 1.1s phase=starting label=Indítás az új verzióval… err=None hold=None
|
||
22:21:58 + 3.1s phase=verifying label=Működés ellenőrzése… err=None hold=None
|
||
22:22:13 + 18.5s phase=done label=Frissítve err=None hold=None
|
||
22:22:13 [7] reading the seed back AFTER the update
|
||
22:22:15 mealie: readback of the seeded recipe http=200 ok=True
|
||
22:22:17 [8] pinned = {'mealie': 'ghcr.io/mealie-recipes/mealie:v3.27.0'}
|
||
22:22:17 [8] installed = {'mealie': 'ghcr.io/mealie-recipes/mealie:v3.27.0'}
|
||
22:22:17 [8] compose = ['image: ghcr.io/mealie-recipes/mealie:v3.27.0']
|
||
22:22:17 [8] inspect = ['mealie ghcr.io/mealie-recipes/mealie:v3.27.0 running=true restarts=0']
|
||
22:22:17 [9] verdict proven -> /mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/update-night-2026-09-21/apps/mealie/verdict.json
|
||
22:22:19 [X] stop -> 200 {'ok': True, 'message': 'Stack mealie stop completed'}
|
||
22:22:24 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'mealie', 'volumes_removed': ['mealie_mealie_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alkalm
|
||
22:22:32 [X] after remove: deployed=False leftovers='/opt/docker/stacks/mealie'
|
||
|
||
22:22:32 leftovers done
|