Night brief part 2 (run by day 2026-10-20): register 160 -> 156 (closed R-1001, R-1011, R-1167, R-1070, R-1010, R-893, R-1169; opened R-1171..R-1173; R-1019/R-462 narrowed, R-49 READY -> D21, R-1083 re-stated); 07 §6.3 option A as the design; STATUS morning list; report part 2; P4 Immich plan, P7 release evidence
gates / gates (push) Successful in 12m57s

This commit is contained in:
2026-10-20 11:06:00 +02:00
parent bcaa9576b2
commit 5c487313fa
12 changed files with 327 additions and 24 deletions
+126 -1
View File
@@ -1,4 +1,129 @@
# REPORT — evening/night brief 2026-10-19 (one stop less per night, no false tunnel error, R-893 measured, hub and agent fixes ready, a scanner on every push, ep0's first weekly clean-up)
# REPORT — the night briefs of 2026-10-19 and 2026-10-20 (part 2 run by day): one stop less per night, the safe undo for a failed off-site restore, hub 0.162.0 / agent 0.161.0 / installer 1.35.0 delivered, downloads out of the backups, a scanner on every push
# PART 2 — the night brief part 2 (run by day, 2026-10-20): your four answers, the safe undo, downloads out of the backups, Immich, the update test
**Safest readings taken alone (written first, as the brief asks):**
1. **R-1083 is not in agent 0.161.0.** An agent key would make 9202's controller book the agent's whole-guest backups,
one of which writes to ep0 — a change on ep0 the brief forbids; 9202 is also outside the `felhom` pool.
2. **All five downloaders' folders are `excluded`, not only the two named** (qBittorrent, Transmission; also NZBGet,
SABnzbd, MeTube): the brief's gate rule — a download folder is never optional or mandatory — covers all five.
3. **No update-test edge was run:** the bench (guest 9401) and the drill catalog are outside the brief's machines and
repos. The list done and the list left are written; the ask is on the morning list.
4. The brief was written for a night run and ran by day; its „stop by 05:00" was read as a time box, not a clock.
## Part 2 — in plain words
- **Morning list:** vouch agent 0.161.0 · decide D21 (Immich) · MeTube's videos out of the second-drive copy — keep? ·
the bench and the drill catalog for the update test — yes?
- **Hub 0.162.0 is live.** Its own deploy was the real restart test: Tester-2 (down since 4 October) got no repeat mail
— read in the hub and, separately, in your mailbox.
- **Agent 0.161.0 runs on demo-hp, Tester 1 and demo-felhom.** On demo-hp the agent said „busy" during a backup and
„free" before and after. **Not vouched — that is yours.**
- **Installer 1.35.0 is published.** The served file equals the tag's file.
- **A failed off-site restore now puts the app back exactly as it was** (your D20 = A, controller 0.336.0, the floor).
Proven on the scratch box: after a forced failure the database matched its fingerprints from before, the app ran,
nothing was held; a normal restore then worked.
- **Downloads are out of the backups** (torrent, usenet, MeTube): the controller's own check copies 0 of them now.
- **Immich's off-site copy:** 1.33 GB, of which 102 MB must survive. Two options; pick B (leave out the AI model files).
- **ep0's first weekly clean-up:** done this morning (Part 10 of part 1 below).
## Part 2 — each part
| Part | Done? | Why / how |
|---|---|---|
| 1a hub deploy | **done** | `manifests/hub.yaml` → 0.162.0 (`e1d349f1`), only Deployment/hub synced (the only OutOfSync); image `sha256:69285e64…` = the build; Synced/Healthy; reports from all three boxes; floor read 0.335.0; Day-0 agent list has no `-step1`. R-1001 + R-1011 closed. |
| 1b agent release | **done** | R-1083 left out (above). `release-agent.sh 0.161.0` from a clean clone; signed `agent_update` per box: demo-hp 06:38, Tester 1 06:54, demo-felhom 06:55 UTC, each COMPLETED, 76/76, committed. `host_busy` live; tunnel `absent` = the fixture row (9202's real Docker 29 answer); R-1010 by its tests. R-1070 + R-1010 closed. |
| 1b R-921 live | **not done** | The no-stop case happens only on the night schedule (a press backs up the local tier only). Row R-1173 with a dated check after demo-hp's next off-site night. |
| 1c installer | **done** | tag `installer-v1.35.0`, both webpage pins (`b0ae2c57`), webpage Deployment synced alone; served sha256 `f7a196fd…` = tag. R-1167 closed. |
| 2 safe undo | **done** | below. R-893 + R-1169 closed. |
| 3 downloads | **done, one read left** | catalog `c50adfc`, gate `download-binds`; classifier proof. demo-felhom (qBittorrent) runs its next second-drive copy 2026-10-21 03:30 — dated check on R-1019 (NARROWED). |
| 4 Immich | **done (plan only)** | below. R-49 → READY, D21. |
| 5 update test | **not done** | fixture side complete for every installed app; the edges need the bench / drill catalog (above). R-462 NARROWED. |
| 6 ep0 clean-up | **done** | part 1, Part 10. |
| 7 controller release | **done** | 0.336.0 below. |
## Part 2 — the safe undo, the 9202 proof (`07` §6.3; `audits/night2-2026-10-20/P2/`)
- Code `93fb251`: the fit check before the stop, the copy right after it (`backups/restore-undo/<app>/`), the put-back on
every failure branch, the hold only when the put-back fails, the copy removed on success. 11 tests; nine mutations red.
- **9202, rc.1** (a helper with the fences in full; Rallly + postgres 18; the same forced failure as on 19 October):
| | Live before | After the forced failure |
|---|---|---|
| public tables | 36 | 36 |
| markers | A, B, C, D | A, B, C, D |
| `r893_only_old` (backup only) | absent | **absent** (on 19 October: present) |
| schema / data / row-count md5 | `05828c77` / `e5c1a72f` / `d8bcbc4b` | **equal** |
| app | running | **running**, no hold |
| the copy | — | 69 MB in 0.9 s, removed after |
The sentence: „…visszaállítása sikertelen. Nem változott semmi: az alkalmazás adatai visszakerültek a visszaállítás
előtti állapotba, és az alkalmazás újra fut". Then a normal restore of the same snapshot: the snapshot's content
(A–C, the backup-only table present), the app running, the copy removed. 9202 back on 0.331.0 as found.
- Not measured live (each pinned by a red-proved test): the version-change branch, the `_files` sentence, the refusals
before the stop, a failing put-back, the operator event (9202 has no hub).
## Part 2 — download binds (`15` §7; `audits/night2-2026-10-20/P3/`)
| App | Bind (userdata) | Class now | Copied by a tier |
|---|---|---|---|
| qBittorrent | media/torrents | excluded (was optional) | none (was the second drive) |
| Transmission | media/transmission, media/transmission/watch | excluded, excluded | none |
| NZBGet | media/nzbget | excluded (was optional) | none |
| SABnzbd | media/usenet | excluded (was optional) | none |
| MeTube | media/metube | excluded (was optional) | none |
| Sonarr, Radarr | media (rw) | excluded | none |
| Jellyfin, Plex, Emby | media (:ro) | excluded | none |
| Prowlarr | no userdata bind | — | — |
## Part 2 — Immich (`audits/night2-2026-10-20/P4/immich-offsite-plan.md`)
Model cache 824 MB (62 %) · raw database folder 283 MB (21 %) · Immich's own backups 115 MB (9 %) · logical dump 54 MB
· originals 49 MB · thumbnails 2 MB. **A** (leave out all three re-fetchable parts, −92 %) needs a never-run restore
from the dump alone on the vectorchord image; **B** (only the model cache, −62 %) needs one restore with an empty cache.
**Pick B now**, A's other parts after their proof.
## Part 2 — update-test edges
None run (above). Installed apps: 16; with a fixture: 15; without: bentopdf (keeps no data). Upstream within a major,
waiting for a tested step: PrivateBin 2.0.6→2.1.0, Home Assistant 2026.9.4→2026.10.2, RomM 5.3.1→5.4.0, Plex
1.41.4→1.43.4, Kimai 2.67.0→2.70.0 (`audits/night2-2026-10-20/P5/r462-list.txt`).
## Part 2 — versions, commits, rows
- Hub 0.162.0 deployed (`e1d349f1`). Agent 0.161.0 released (`5152123`, tag `v0.161.0`; notes `4e1621c`). Installer
1.35.0 published (`b0ae2c57`). Controller 0.336.0 the floor (`93fb251`; notes `aa9e09e`, `7ca59e2`), image
`sha256:93cd67d8…8d73`. Catalog `c50adfc`. Evidence `301f4e9e`, `bcaa9576`.
- i18n: no page template changed; seven Go-side keys (HU + EN), one rewritten (R-1169); no fixture changed.
- **System poster:** no listed fact changed — none of the three.
- **Register 160 before, 156 after. Closed 7:** R-1001, R-1011, R-1167, R-1070, R-1010, R-893, R-1169. **Opened 3:**
R-1171 (demo-hp's local copy never restore-tested), R-1172 (the put-back logs at ERROR; an empty folder stays),
R-1173 (R-921's no-stop not yet seen live). Re-stated: R-1019 (NARROWED, dated 2026-10-21), R-1083, R-462 (NARROWED),
R-49 (READY, D21). **Both briefs together: 161 before, 156 after; closed 11, opened 6.**
## Observations — part 2
1. demo-hp's local whole-guest copy is never restore-tested: one copy kept, a 24 h settle, replaced at 24 h. FILED: R-1171
2. A successful put-back is logged at ERROR, and an empty `backups/restore-undo/` folder stays after a restore. FILED: R-1172
3. R-921's no-stop branch has no live observation yet (it needs a night schedule). FILED: R-1173
4. R-462's „only three apps are tested" was out of date: 58 apps have fixtures on both venues. NOT-A-FINDING: the row is re-stated with today's list.
5. The hub deploy at 06:03 UTC removed the old pod's log, which held the 07:10 Budapest off-site audit lines of today (R-895). NOT-A-FINDING: R-895's dated check is 2026-10-21; that run happens in the new pod.
6. In step 4 of the 9202 drill the data-only md5 differed from a read taken before snapshot 2, while the schema and every row count were equal. NOT-A-FINDING: the two reads were at different moments (the read, then the snapshot's own dump); the claim under test — before and after the forced failure — matched on all three fingerprints.
7. The helper's brief expected 37 tables after the normal restore; snapshot 2 has 36. NOT-A-FINDING: last night's 37 was the mixed state, not the snapshot (my arithmetic, corrected).
8. The first background wait loop for demo-hp's agent update printed a time and stopped before the box had updated. NOT-A-FINDING: the version was read directly and a foreground loop used instead.
9. A Python edit of the controller CHANGELOG failed on a quote character, and the commit carried only REPORT.md. NOT-A-FINDING: fixed by the next commit (`7ca59e2`).
## Part 2 — teardown
- Machine: 9202 back on 0.331.0 as found (Rallly removed through the product, the SFTP target, images and files removed
by name, settings and the off-box folder put back); demo-hp 9201's probe script removed.
- Host: demo-hp `/tmp` copies removed; nothing on `pve/data`; no whole-guest backup of 9202.
- Hub: per-box floors set and cleared; the global floor raised; nothing else.
- ep0: read only.
---
# PART 1 — the evening/night brief of 2026-10-19
## In plain words
+14 -6
View File
File diff suppressed because one or more lines are too long
@@ -736,6 +736,19 @@ stayed (37 tables, the live app had 36); the definition did not move (same versi
answered 409. The restore page's „the database is back as it was" is false for it. Design note with the two options and
the pick (A: a copy of the app's live volumes, put back on failure — one copy's disk for the restore's length, a fit
check before the stop): `audits/night-2026-10-19/P3/design-R-893.md`; the decision is on `STATUS.md`.
**`[DESIGN]` 2026-10-20 — „put back exactly as it was" (R-893 option A, operator decision D20 = A, `09` §3 decision 192
second half; controller 0.336.0 is the floor).** Before the stop, every named volume the snapshot will replace is measured
and its copy is added to the restore's own free-space need (R-357's exact rule); too little room or an unmeasurable volume
refuses with nothing stopped. Right after the stop the volumes are tarred into `<namespace>/backups/restore-undo/<app>/`
(outside every capture set). On ANY failure after a volume or the definition moved, the copies are poured back, a volume
the snapshot added is removed, the live definition is written back and the app is STARTED; the household reads that the
restore failed and nothing changed (with placed files: its database and volumes are back, the copied files stay); the
operator gets `backup_run_failures` leg `restore-put-back`. The hold (`restore_mixed`) remains only for a put-back that
fails — then the copy is kept for support — and the double failure (replay AND rollback) holds as before. On success the
copy is removed. **`[FACT]` 2026-10-20 (9202, controller 0.336.0-rc.1, `audits/night2-2026-10-20/P2/live/`):** the same
forced failure as on 2026-10-19 → 36 tables, the backup-only table absent, schema/data/row-count md5 equal to before,
the app running, no hold, the copy (69 MB, 0.9 s) gone; a normal restore of the same snapshot then worked. The R-893
known limit above is closed for named volumes; placed FILES are still not taken back (the plain-files mix, as ruled).
**[DESIGN] 2026-08-22 — the failure ladder of a database restore: replay → rollback → hold.**
Recorded here rather than only in a closed register row, because a decision that survives only inside
@@ -0,0 +1,45 @@
# R-49 — Immich's off-site copy: what it holds, and two ways to shrink it (2026-10-20)
Status: **measure and plan only — nothing changed.** Night brief part 2 (run by day), Part 4. Architecture: `07-backup-architecture.md`
(the off-site tier = the recovery unit + the app's mandatory data). Measured read-only on scratch guest 9202 (demo-hp), Immich
v3.2.4 + `ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0`, data on the drive `/mnt/sizing-bench`, 09:0x UTC.
## What today's off-site copy holds
The off-site tier copies the recovery unit (`backups/primary/immich/`, 1 160 553 825 B) and the mandatory drive folder
`appdata/immich/` (166 077 159 B) — about **1.33 GB** in all. The external library `media/photos` is `optional` (not off-site;
0 B here anyway).
| Part | Where | Bytes | Share | Can it come back without the copy? |
|---|---|---:|---:|---|
| ML model cache | unit `volume-dumps/immich_immich_ml_cache.tar` (volume 823 835 298 B) | 823 764 480 | 62 % | **Yes** — Immich downloads the models again when a smart-search or face job first needs them |
| Raw database folder | unit `volume-dumps/immich_immich_postgres_data.tar` (volume 282 169 461 B) | 283 049 472 | 21 % | **Yes, if** a restore from the logical dump alone is proven (below) |
| Immich's own database backups | `appdata/immich/backups/` | 115 367 547 | 9 % | Yes — a second copy of what the logical dump already holds; it grows every night |
| Logical database dump | unit `db-dumps/immich-postgres.sql` | 53 711 763 | 4 % | **No** — this IS the household's albums, people, metadata |
| Originals | `appdata/immich/upload/` | 48 673 663 | 4 % | **No** — the photos themselves |
| Thumbnails | `appdata/immich/thumbs/` | 2 035 910 | <1 % | Yes — Immich regenerates them |
| Redis | volume `immich_immich_redis_data` (31 594 479 B) | — | — | not in the unit (a queue cache) |
**What must survive: 102 MB of 1.33 GB (8 %).** The 2026-07-19 measurement (R-49) said the same shape: ~60 % model cache.
## Two options
| | A — leave out all three re-fetchable parts | B — leave out only the model cache |
|---|---|---|
| Off-site size here | ~105 MB (dump + originals + thumbnails + unit metadata) — **−92 %** | ~510 MB — **−62 %** |
| What a restore then needs | the models download again (~824 MB, from Immich's model host) before smart search and face recognition work again — the photos, albums and timeline work at once; the database is rebuilt from the logical dump alone into an EMPTY volume (no raw folder to lay under it) | the models download again, as in A; the database comes back as today (volume, then dump) |
| The proof it needs | (1) one off-site restore of Immich onto a box with an empty model cache: photos and albums read back, then a smart search answers after the download (time measured); (2) **one off-site restore from the dump alone** into an empty database volume, on this vectorchord image: the extensions and vector indexes come back, the row counts match, Immich starts and searches — today's restore always lays the raw folder first, so this has never been run | only proof (1) |
| Risk | the dump-only database restore is the unmeasured part; if the vector extension needs more than the dump gives, a restore would fail where it works today (option A's put-back keeps the app as it was, but the backup would be weaker) | none new: the cache is a cache |
| Also | Immich's own `backups/` folder needs a catalog class (`excluded`) — a template change in the `hdd` block | a catalog change: the model-cache volume marked as not captured |
Not measured today: the model download's time and size on a real line (the 824 MB is the cache as it stands, which holds every
model this box used); the off-site bytes after restic's compression and de-duplication (the table is the plain size).
## Pick: B now, then A's other two parts after proof (2)
B removes 62 % of the copy with no new risk — the strongest case R-49 named first — and needs only proof (1). The raw database
folder and Immich's own backups are another 30 %, but leaving out the raw folder changes HOW the database comes back, and that
path has never run for this extension image; it should be a separate step with its own proof, not ride along.
**If the operator does nothing:** every Immich household keeps sending ~12× its real data off-site each night, against its
quota and transfer.
@@ -0,0 +1,4 @@
# per-box floors 0.336.0 / MinAgent 0.158.1 set 08:51:06Z; image sha256:93cd67d871125877e935a024765075b5a0b7c0e7683e1165976ff7a654fe8d73 (clean clone 93fb251; rc.1 on 9202 first)
demo-felhom|0.336.0|2026-10-20 08:54:55
demo-hp|0.336.0|2026-10-20 08:54:56
tester-1|0.336.0|2026-10-20 08:54:54
@@ -0,0 +1,27 @@
=== demo-hp (enkisfelhom.hu) 08:53:38
containers: 24 running; not healthy/running: traefik Up 4 days;
unhealthy: 0
2026/10/20 08:51:19 updater.go:855: [INFO] [selfupdate] Post-update startup: update successful (0.335.0 → 0.336.0)
allow-list refusals since start: 0
2026/10/20 08:51:19 sync.go:142: [INFO] [sync] Initial sync: Sablonok naprakészek — nincs változás
installed apps (stacks with app.yaml): 12
public https://felhom.enkisfelhom.hu/: 302
public https://files.enkisfelhom.hu/: 200
=== demo-felhom (demo-felhom.eu) 08:53:41
containers: 9 running; not healthy/running: traefik Up 4 days;
unhealthy: 0
2026/10/20 08:51:08 [INFO] [selfupdate] Post-update startup: update successful (0.335.0 → 0.336.0)
allow-list refusals since start: 0
2026/10/20 08:51:11 [INFO] [sync] Initial sync: Sablonok naprakészek — nincs változás
installed apps (stacks with app.yaml): 5
public https://felhom.demo-felhom.eu/: 302
public https://files.demo-felhom.eu/: 200
=== tester-1 (enkicsifelhom.hu) 08:53:42
containers: 10 running; not healthy/running: traefik Up 4 days;
unhealthy: 0
2026/10/20 08:51:18 [INFO] [selfupdate] Post-update startup: update successful (0.335.0 → 0.336.0)
allow-list refusals since start: 0
2026/10/20 08:51:19 [INFO] [sync] Initial sync: Sablonok naprakészek — nincs változás
installed apps (stacks with app.yaml): 3
public https://felhom.enkicsifelhom.hu/: 302
public https://files.enkicsifelhom.hu/: 200
@@ -0,0 +1,33 @@
control NEGATIVE (a stub answering 200 over plain http): convicted, as it must (200 -)
== tester-1 (enkicsifelhom.hu): 6 public name(s)
OK control POSITIVE http://felhom.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkicsifelhom.hu/r1033-check?q=1
OK http://files.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://files.enkicsifelhom.hu/r1033-check?q=1
OK http://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1
OK http://paperless.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paperless.enkicsifelhom.hu/r1033-check?q=1
OK http://paste.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paste.enkicsifelhom.hu/r1033-check?q=1
OK http://wiki.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkicsifelhom.hu/r1033-check?q=1
== demo-hp (enkisfelhom.hu): 14 public name(s)
OK http://arcade.enkisfelhom.hu/r1033-check?q=1 -> 301 https://arcade.enkisfelhom.hu/r1033-check?q=1
OK http://books.enkisfelhom.hu/r1033-check?q=1 -> 301 https://books.enkisfelhom.hu/r1033-check?q=1
OK http://docs.enkisfelhom.hu/r1033-check?q=1 -> 301 https://docs.enkisfelhom.hu/r1033-check?q=1
OK http://felhom.enkisfelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkisfelhom.hu/r1033-check?q=1
OK http://files.enkisfelhom.hu/r1033-check?q=1 -> 301 https://files.enkisfelhom.hu/r1033-check?q=1
OK http://gist.enkisfelhom.hu/r1033-check?q=1 -> 301 https://gist.enkisfelhom.hu/r1033-check?q=1
OK http://ha.enkisfelhom.hu/r1033-check?q=1 -> 301 https://ha.enkisfelhom.hu/r1033-check?q=1
OK http://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1
OK http://papir.enkisfelhom.hu/r1033-check?q=1 -> 301 https://papir.enkisfelhom.hu/r1033-check?q=1
OK http://paste.enkisfelhom.hu/r1033-check?q=1 -> 301 https://paste.enkisfelhom.hu/r1033-check?q=1
OK http://pdf.enkisfelhom.hu/r1033-check?q=1 -> 301 https://pdf.enkisfelhom.hu/r1033-check?q=1
OK http://plex.enkisfelhom.hu/r1033-check?q=1 -> 301 https://plex.enkisfelhom.hu/r1033-check?q=1
OK http://travel.enkisfelhom.hu/r1033-check?q=1 -> 301 https://travel.enkisfelhom.hu/r1033-check?q=1
OK http://wiki.enkisfelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkisfelhom.hu/r1033-check?q=1
== demo-felhom (demo-felhom.eu): 8 public name(s)
OK http://felhom.demo-felhom.eu/r1033-check?q=1 -> 301 https://felhom.demo-felhom.eu/r1033-check?q=1
OK http://files.demo-felhom.eu/r1033-check?q=1 -> 301 https://files.demo-felhom.eu/r1033-check?q=1
OK http://gist.demo-felhom.eu/r1033-check?q=1 -> 301 https://gist.demo-felhom.eu/r1033-check?q=1
OK http://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1 -> 301 https://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1
OK http://prowlarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://prowlarr.demo-felhom.eu/r1033-check?q=1
OK http://radarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://radarr.demo-felhom.eu/r1033-check?q=1
OK http://sonarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://sonarr.demo-felhom.eu/r1033-check?q=1
OK http://torrent.demo-felhom.eu/r1033-check?q=1 -> 301 https://torrent.demo-felhom.eu/r1033-check?q=1
== every public name redirects http -> https
@@ -0,0 +1,16 @@
== demo-hp
dashboard sign-in: 302
the Fajlok button goes to: https://files.enkisfelhom.hu/_felhom/sso
the pass answer goes to: https://files.enkisfelhom.hu/files/; files cookie set: 1
FileBrowser with the files cookie: felhom-household admin: False modify: True
FileBrowser without it, a fresh browser: HTTP 401
dashboard sign-out: 302
after the sign-out, the files cookie sends the browser to: https://felhom.enkisfelhom.hu/__files/open?to=%2Ffiles%2F
== tester-1
dashboard sign-in: 302
the Fajlok button goes to: https://files.enkicsifelhom.hu/_felhom/sso
the pass answer goes to: https://files.enkicsifelhom.hu/files/; files cookie set: 1
FileBrowser with the files cookie: felhom-household admin: False modify: True
FileBrowser without it, a fresh browser: HTTP 401
dashboard sign-out: 302
after the sign-out, the files cookie sends the browser to: https://felhom.enkicsifelhom.hu/__files/open?to=%2Ffiles%2F
@@ -0,0 +1,22 @@
2026-10-20T08:54:35Z
global floor:
HTTP/1.1 303 See Other
Location: /configuration?flash=floor_set
read back (hub DB with WAL):
min_controller_version|0.336.0
min_controller_version_declared_min_agent|0.336.0=0.158.1
clear the per-box floors:
== tester-1
HTTP/1.1 303 See Other
Location: /customers/tester-1?flash=floor_set
== demo-hp
HTTP/1.1 303 See Other
Location: /customers/demo-hp?flash=floor_set
== demo-felhom
HTTP/1.1 303 See Other
Location: /customers/demo-felhom?flash=floor_set
Error: in prepare, no such table: customers
per-box floors after the clear (customer_configs):
demo-felhom|''|''
demo-hp|''|''
tester-1|''|''
+12
View File
@@ -26,6 +26,18 @@
---
## 2026-10-20 (night brief part 2, run by day) — hub 0.162.0, agent 0.161.0, installer 1.35.0, the safe undo for a failed off-site restore (full text of each row: `git show bcaa9576:documentation/backlog/OPEN-ITEMS.md`)
| Row | What | Closed | Evidence |
|---|---|---|---|
| **R-1001** | **Every hub restart re-mails the operator about a box that is already known to be down.** (P3) | CLOSED 2026-10-20 — **hub 0.162.0 deployed (operator yes) and the deploy itself was the real restart:** Tester-2 (down since 2026-10-04) had been re-mailed on every earlier restart (host_down + two restore_test_stale at 02:15, 09:30, 14:12 on 2026-10-19). After the 06:03 UTC restart: `Host staleness checker initialized: … 1 already alarmed (seeded silently, R-1001)`, `restore-test staleness: Tester-2 … already reported before the restart — not re-sent` for both tiers, 0 new events (id > 6129), and the mailbox (a different channel) holds no Tester-2 host_down / restore_test_stale mail after 14:12 on 2026-10-19 while the daily 03:00 mails are there. | `audits/night2-2026-10-20/P1/1a-hub-deploy.txt` |
| **R-1011** | **The Day-0 „Agent" list offers step-bundle packages (`0.156.1-step1`, `0.152.0-step1` …) as agent versions; one has no agent binary, so the hub shows the bundle JSON's sha (`FileSHA256` falls back to the first file) and a vouch would point fresh installs at a package with no binary.** (P3) | CLOSED 2026-10-20 — **hub 0.162.0 deployed:** the Day-0 agent list (GET /configuration with CC's token) offers 0.160.0 … 0.150.0 and no `-step1` package. | `audits/night2-2026-10-20/P1/1a-hub-deploy.txt` |
| **R-1167** | **The installer does not word the hub's new 409 („this customer already has a live box").** (P4) | CLOSED 2026-10-20 — **installer 1.35.0 published (operator yes):** tag `installer-v1.35.0` (→ `e1d349f1`), both webpage git-sync pins, the webpage Deployment synced alone; `https://felhom.eu/scripts/felhom-host-install.sh` serves `SCRIPT_VERSION="1.35.0"` with sha256 `f7a196fd…` = the tag's file (before: 1.34.0, `df722ee4…`). | `audits/night2-2026-10-20/P1/1c-installer-publish.txt` |
| **R-1070** | **A box with no Cloudflare tunnel gets an ERROR after its host OS update: „NOT healthy … (the tunnel is unknown)”.** (P3) | CLOSED 2026-10-20 — **agent 0.161.0 released and on demo-hp, Tester 1 and demo-felhom** (signed jobs, all committed, 76/76; hub 0.162.0 shows `absent` as „none set up"). The agent's own probe in 9202 (no tunnel) answers `error: no such object: cloudflared` rc 1 — exactly the `TestClassifyTunnel` „absent, docker 29" fixture row; 9201 answers `running`. | `audits/night2-2026-10-20/P1/1b-agent-release.txt` |
| **R-1010** | **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.** (P3) | CLOSED 2026-10-20 — **agent 0.161.0 released and on the three test hosts.** Proven by its red-proved tests (`TestStaleLock_R1010_ForcesOnceOnlyWhenTheVolumeIsGone`, `TestDeleteSnapshotForce_R1010`), rerun green on the released commit; a half-removed snapshot on `pve/data` was not made (rule 6). | `audits/night2-2026-10-20/P1/1b-agent-release.txt` |
| **R-893** | **After a failed OFF-SITE replay, the rollback pours the NEWER pre-restore copy over the OLDER volume just put back.** (P3) | CLOSED 2026-10-20 — **option A built and released (operator D20 = A): controller 0.336.0 is the floor (08:54 UTC).** Before the stop the live volumes the snapshot will replace are measured and the copy must fit (refused with nothing stopped otherwise); right after the stop they are tarred into `backups/restore-undo/<app>/`; on any failure after a volume or the definition moved they are poured back, a volume the snapshot added is removed, the live definition written back and the app started; a put-back that fails holds and keeps the copy. 11 unit tests, nine mutations red. **Live on 9202** (rc.1): a forced replay failure after the volume was replaced → 36 tables, markers A–D, the backup-only table ABSENT, schema/data/row-count md5 EQUAL to before, Rallly running, no hold, the copy gone; then a normal restore of the same snapshot worked. `07` §6.3 now states it as the design. Follow-up: R-1172. | `audits/night2-2026-10-20/P2/` (unit red-proofs, `live/` the 9202 drill), `P7/` (release) |
| **R-1169** | **After a failed off-site restore that is held (`restore_mixed`), the restore page says the database is back as it was and the app's files and other data come from the backup — measured false on both halves.** (P3) | CLOSED 2026-10-20 — **controller 0.336.0:** `err.backup.db_restore_failed_held_mixed` says only what is certain (stopped half-way, the data could not be returned, the app stays stopped, the copy is kept, support helps), HU + EN; the plain rolled-back case with placed files no longer claims „your data is back as it was" (it says the files stay). Pinned by `assertR893Held` / `TestR893A_AFailedPutBackHoldsTheAppAndKeepsTheCopy`. | `audits/night2-2026-10-20/P2/redproof-unit.txt` |
## 2026-10-19 (evening/night brief) — no stop for a busy host, the scanner on every push, the ArgoCD prune danger gone (full text of each row: `git show f92fa5a8:documentation/backlog/OPEN-ITEMS.md`)
| Row | What | Closed | Evidence |
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,4 +1,4 @@
## v0.162.0 — a hub restart no longer re-mails a known-down box (R-1001); the Day-0 agent list offers only real agent packages (R-1011); a box with no tunnel reads „none set up" (R-1070) (2026-10-19)
## v0.162.0 — a hub restart no longer re-mails a known-down box (R-1001); the Day-0 agent list offers only real agent packages (R-1011); a box with no tunnel reads „none set up" (R-1070) (2026-10-19) — DEPLOYED 2026-10-20 06:03 UTC on the operator's yes (morning answers)
Built, NOT deployed (the night brief of 2026-10-19: the hub is never deployed at night; the deploy is the operator's
word in the morning).