Files
felhom.eu/REPORT.md
T
admin 3335f2c02d CAMPAIGN-6B: .fab circle + edge + backup/regression (unattended); CRITICAL C6B-F1
Unattended close-out of the C6 remainder. Flagship finding C6B-F1 (CRITICAL):
.fab export silently produces hollow, data-free bundles for the standard
${USERDATA_PATH} needs_hdd convention (12/13 media apps) — sonarr 4.17 GB -> a
2308-byte config-only bundle, past the v0.125.0 anti-hollow guard. Transport
(upload/download, real CF edge, 413, byte-integrity) all PASS. C6B-F2 (MED,
confounded): net-storage removal leaves an orphaned autofs mount. Browser-
interactive + deep backup-tier items split to CAMPAIGN-6C. No code changed; no
secret/R/blob committed; campaign credential left for Viktor to rotate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A45Qop8YY8tS94bz63LFne
2026-07-14 13:29:13 +02:00

2.9 KiB

felhom.eu — task reports

Overwrite this file with a summary of the most recent task only (uniform with the other repos; not cumulative). The cumulative hub history lives in hub/CHANGELOG.md; the scripts history lives in scripts/CHANGELOG.md.

CAMPAIGN-6B — unattended close-out of the C6 remainder — 2026-07-14

controller 0.129.0 / agent 0.88.0 / hub 0.54.0 · demo + drill · findings-only, unattended

Continuation of CAMPAIGN-6A. Drove the .fab full-circle (upload/download + real Cloudflare edge), the server-observable browser/DOM planes, backup-tier + NAS integrity, and regression spot-checks. Full audit: documentation/audits/CAMPAIGN-6B-2026-07-14.md. Continuation: CAMPAIGN-6C-2026-07-14-PROMPT.md.

Headline finding — C6B-F1 (CRITICAL)

.fab export silently produces hollow, data-free bundles for the standard ${USERDATA_PATH} needs_hdd app convention — 12 of 13 media catalog apps (jellyfin, plex, emby, immich, sonarr, radarr, navidrome, paperless-ngx, audiobookshelf, calibre-web, komga, romm). Live: sonarr with 4.17 GB / 7 files exported to a 2308-byte, config-only bundle, reported done with no error, past the v0.125.0 anti-hollow guard. Two compounding causes in the needs_hdd branch: executeExport is either/or (needs_hdd apps never run exportVolumeData, dropping named volumes incl. the app DB), and ParseComposeHDDMounts substitutes only ${HDD_PATH}, never ${USERDATA_PATH} → 0 mounts → all userdata skipped. The guard only checks manifest-claimed tars, so 0-claimed passes. .fab is the customer portability/backup-download path → fresh/cross-box restore = silent total data loss. Fix direction in the audit; priority for project Claude to spec.

What passed

  • .fab transport is byte-clean end-to-end — LAN + real Cloudflare edge, upload (64 MiB chunked) and download, every sha256 == reference.
  • 413 edge-cap re-proven (120 MiB → CF 413 before origin; 80 MiB clears to origin).
  • Upload state machine 8/8 — wrong-ext 400, collision (N), single-flight 409, strict-offset 409, abort cleanup, oversize (both Hungarian numbers), restart-GC, idle-15min expiry.
  • F7 atomicity (.tar.tmp→rename) code-confirmed; native alert()/confirm() absent on all surfaces; CSRF stale → 403, session-expiry → 401-JSON/redirect; F4 uid-range friendly 400; agent-restart per-share re-arm verdicts logged.

Split to CAMPAIGN-6C

Supervised browser planes (escrow wizard click-through, hub 8-tab UX); deep backup tiers (live F7 6 s-cut, restic self-heal, offsite restore-to-verify, tier-2 F6, per-app toggles, snapshot coherence); dead-app alert + email cooldown; the C6B-F1 fix-verify full-circle byte-compare.

Notes

  • No code changed. Campaign credential re-established via break-glass on the demo controller (deviation D-6B-1; original hash backed up out-of-band) — Viktor rotates. No secret/R/blob committed.