diff --git a/documentation/audits/CAMPAIGN-6D-2026-07-15.md b/documentation/audits/CAMPAIGN-6D-2026-07-15.md new file mode 100644 index 0000000..8ddf4be --- /dev/null +++ b/documentation/audits/CAMPAIGN-6D-2026-07-15.md @@ -0,0 +1,98 @@ +# CAMPAIGN-6D — supervised acceptance of the backup-classification redesign (2026-07-15) + +**Operator:** Viktor (present, async rulings). **Driver:** Claude Code (live box). **Validator:** project Claude. +Redesign under test: 3-core `ComputeCaptureSet`/`ComputeFabBuckets` (v0.133.0), 3a offsite engine + +restore + placement (v0.134.x, hub v0.55.0), 3b tier-2 v2 + NAS exclusion (v0.135.0), Task 4 `.fab` +exclusion scoping (v0.136.0). Baselines: ctrl **0.136.0**, agent **0.88.0** (published), hub **0.55.0**, +golden **0.136.0** (baked+published this day). Evidence sink: `180:~/campaign6/6D/evidence/`. + +--- + +## Headline verdict + +**The redesign's core promise is GREEN.** Both gating legs PASS on real data: + +- **Accept #1 (`.fab` ≥1 GiB full circle) — PASS.** A 1.7 GB immich `.fab` (1.06 GiB mandatory tar) + round-trips byte-identically through a destructive compose-down-volumes re-import; the DB restores, + the app boots clean, assets resolve, and **zero sibling contamination** (the SQ6 fix) is proven on a + genuinely shared userdata root. +- **SQ3 immich offsite (broken-not-empty) — PASS.** immich's offsite snapshot carries unit + mandatory + `appdata/immich` (not the `:ro` optional library); a destructive restore-to-live from offsite alone + makes immich functional (thumbnail **and** full-res original resolve), mandatory tree byte-identical. + +**⇒ The friend-alpha core-promise gate is GREEN.** (Remaining friend-alpha prerequisites: the deferred +phases below — none block the core promise.) + +--- + +## 1. Pre-flight gate (G0–G7) + +| Gate | Result | Note | +|---|---|---| +| G0 baselines | 🟢 | ctrl 0.136.0 live, hub 0.55.0, agent 0.88.0 published | +| G1 images settled | 🟢 | ctrl image + golden 0.136.0 + agent 0.88.0 all pushed to gitea today | +| G2 guest health | 🟢 | `felhom-controller:0.136.0 Up (healthy)`, "Controller elindult (0.136.0)" | +| G3 credential | 🟢 | proven: login POST 302 → GET /backups 200 (authed) | +| G4 customer email | 🟠 | wiped; ruling = restore to nagyfenyvesi.viktor@gmail.com via UI during browser phase — **deferred with P3-DELIVERY** | +| G5 storage headroom | 🟢 | 176 G local + 868/108 G on drives | +| G6 evidence sink | 🟢 | `180:~/campaign6/6D/evidence/` | +| G7 clean box | 🟠 | campaign6 = orphaned host autofs (no systemd unit; needs a host reboot to clear; NOT a registered target → empirically inert in P-REG). teszt_enroll kept (ruling). | + +## 2. Per-phase results + +| Phase | Result | One-line evidence | +|---|---|---| +| **P-REG** F-6C-1 nightly | **PASS** | Fresh tier-2: calibre-web (NAS data) → **local** teszt_enroll, NAS skipped, exit 0, v2 tree; `crossdrive_failed`=0 in the persistent ring. | +| **P-FAB** Accept #1 (⚠) | **PASS** | 1.7 GB `.fab` (1.06 GiB mandatory); userdata.tar=2 KB (no siblings); DB captured; destructive re-import → immich boots, 90 photos + thumbnail resolve; mandatory byte-identical (only immich boot-markers differ). | +| **P-TIER2** v2 deep | **PARTIAL** | Core proven in P-REG (v2 tree `.felhom-tier2-layout=2`, recovery-unit + userdata leg, `másik adatmeghajtó`). The 4 fixture-heavy scenarios (no-block app, N>1 appdata, re-class reconcile, old-flat→v2 migration) **not run** — need bespoke fixtures. Source guards present. | +| **P-IMMICH** SQ3 (⚠) | **PASS** | Offsite snapshot = unit + mandatory `appdata/immich` (not optional-ro); restore scratch LOCAL (felhom-usb, not NAS), SP-3.1 shape; place missing-only (286 files); immich functional from offsite (thumbnail 200 + original 2.07 MB 200); mandatory byte-identical. | +| **P-PLACE** F-3a-1..4 (⚠) | **PASS** | Folds in from P-IMMICH (scratch local + removed-on-success, ownership faithful). Negative: place refused with ZERO copies on no-prepared-restore. F-3a-1a/1b/4 present in source + unit-tested. | +| **P3-BROWSER** | **DEFERRED** | Needs the claude-in-chrome bridge (not exercised this session). Escrow typed-back / session-CSRF / hub 8-tab ring not run. | +| **P3-DELIVERY** enlarge-block | **DEFERRED** | Needs G4 email restore (UI) + offbox quota lower/revert to trip the gate organically. Self-contained follow-up. | +| **P4-DEEP** deep tiers | **PARTIAL** | **Snapshot coherence PASS** (calibre-web + immich snapshot paths == capture set, excludes excluded/optional-ro). F7 timed-cut / restic self-heal-mid-run / restore-to-verify-compare not run (timing-sensitive). | +| **P5-REST** real crash (⚠) | **PASS** | SIGKILL host-PID mid-offbox → auto-restart ~15 s; journal marked interrupted run failed (no false success); all apps stayed up; post-crash offbox run clean (no stale lock, no marker-without-legs). | +| **P-DAY0** golden provision | **DEFERRED** | Golden 0.136.0 baked+published+verified-fetchable (GET 200) this day; a full nested-drill day-0 provision (~1 h) not run this session. | +| **P-OBS** aggregate-state | **NOT REPRODUCED** | No Exited(0) container present on the box → the cosmetic condition is absent right now. Observation-only. | + +## 3. Findings (ranked) + +- **LOW — duplicate recovery units.** offbox logs: "immich: multiple recovery units found, using newest + (…felhom-usb…); ignoring: …felhom-flash…" (same for audiobookshelf). Controller handles it (uses newest), + but a stale duplicate unit lingers on a second drive. Track: cleanup of superseded per-app recovery units. + No follow-up TASK required (cosmetic/no data risk). +- **LOW — G7 orphaned autofs (campaign6).** A `/mnt/felhom-drives/campaign6` autofs mount with no backing + systemd unit persists; cannot be cleared without a host reboot. Not a registered target (inert). Track: + clear on next demo-host reboot. +- No HIGH/MED correctness findings surfaced. No inline fixes made (RUNBOOK §13). + +## 4. Headline verdict → friend-alpha + +Core promise (SQ3 immich + Accept #1) **GREEN**. Friend-alpha's backup-safety gate is satisfied on real +data. Recommended before recruiting: close the deferred customer-facing leg **P3-DELIVERY** (enlarge-block ++ the "Kedves Ügyfél!" email) and the **P-DAY0** golden provision as a final dress rehearsal. + +## 5. Evidence index → `180:~/campaign6/6D/evidence/` + +`00-preflight-gate.md`, `01-P-REG.md`, `02-box-state-reality.md`, `03-immich-prestate.manifest`, +`04-P-FAB-export.md`, `05-P-FAB-byteidentical-diff.txt`, `06-P-FAB-import.md`, `07-P-IMMICH-offsite.md`, +`08-P-IMMICH-restore-diff.txt`, `09-P-IMMICH-restore.md`, `10-P-PLACE.md`, `11-P5-REST.md`, +`12-P4-DEEP-coherence.md`. + +## 6. Box / morning-recovery state + +- **immich is now DEPLOYED** on the demo (4 containers, 90 fixture photos, admin `admin@demo-felhom.eu`, + offbox-included). Left running as a legitimate demo app / reusable fixture — **not** torn down. The prior + "immich nincs telepítve" offbox warning is resolved. +- Temporary artifacts removed: P-FAB filler, P-IMMICH moved-aside tree, restore scratch (auto), session + + immich token temp files, the 1.7 GB `.fab` bundle, the generated-photos tars. +- No quota/catalog/config changes were made (P3-DELIVERY not run). teszt_enroll kept (ruling). campaign6 + orphaned mount remains (see findings). + +## 7. Outstanding queue + +- **P3-DELIVERY** (enlarge-block + customer email) — needs G4 restore + quota trip/revert. +- **P3-BROWSER** — needs the browser bridge. +- **P-TIER2** deep 4 scenarios + **P4-DEEP** timing sub-tests (F7 cut / restic self-heal / restore-verify). +- **P-DAY0** — full nested-drill provision from golden 0.136.0. +- Signed-update train (publish agent/golden to production customers) + Peti's box — out of 6D scope. +- LOW: duplicate recovery-unit cleanup; campaign6 autofs (host reboot).