Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NKSN3gSg4TKVBBqkwW2djR
4.1 KiB
REPORT — F10 diagnostic: demo-hp offsite "enabled at the hub, absent on the box" (2026-07-23)
Task: F10 diagnostic spec (project Claude, 2026-07-23) — diagnose first, repair only via the
designed path, prove the tier. No code changed in any repo. Full evidence record:
documentation/audits/DIAG-f10-demo-hp-offsite-2026-07-23.md.
Phase-0 verdict
Neither of the spec's two candidate shapes. The evidence (hub DB + box state + live logs, every
claim cited in the DIAG) proves a third: the day-0 managed floor-update (0.153.0→0.156.0,
07-21 16:28:17Z) killed the offsite apply-bridge ~35 s after it consumed the one-time password
(16:27:42Z), before key-install/persist. Consume-then-persist + retry-only-on-restart
(offsiteapply.go:106–187) ⇒ the credential was burned, no key was ever installed (so the
key-auth-first recovery path could never engage), and every later start logged the consume-404 WARN
and gave up. 153 reports over 2 days never carried an offbox object; the hub's "Provisioned…"
line is static copy that reads neither consumed_at nor the reports.
- Shape B ruled out from source: managed offsite is fully automatic; the box's „Távoli mentési cél
beállítása" button is the BYO NAS/SFTP form only (
offbox_handlers.go:44–126). - Strictly this was the spec's "consumed but persist failed → STOP" class; since the mechanism provably held its fail-safe and the source itself designates the recovery ("the password is spent; reset it on the hub to retry" = the offsite Re-issue), the operator ruled in-session: proceed on the Re-issue path.
Repair (designed path only)
- Operator clicked Re-issue offsite credentials ONCE (R-31 click-once discipline; pre-verified
side-effect-free: no escrow blob existed, the box never held the old password, sub3 was empty).
Click 09:53:37Z → box consumed 09:53:41 →
offsite configured … (pending key escrow)09:53:45. 8 seconds click-to-converged. - Escrow ceremony run by the operator through the real
/backup/escrowwizard (one-shot R on the operator's screen only): blob stored 10:01:17 (zero_knowledge, pw-hash recorded), hub-verified auto-confirm 10:01:24 →escrowed; offsite runs enabled.
Tier proof (F10 closure bar)
paperless-ngx toggled into offsite scope via the real endpoint (per-app default is OFF). Then, all
via real endpoints from inside guest 9201 (endpoint-level method; no browser on DooPlex):
probe (md5 9120e65d6a9f071072d827fc404dc840) in the mandatory appdata/paperless/media →
first offsite run: repo initialized fresh on sub3, 79.8 MB / 49 files, 1m19s, ok →
probe deleted → mode=full restore (size gate 79.8 MB → confirm): snapshot 2bf7f2e1 to
staging, staging md5-identical → place: 1 file(s) merged (missing-only), live md5-identical.
Cleanup: probe removed, second run (2m17s ok) leaves the latest snapshot probe-free (retention
pruned the probe-bearing one); zero residue on box/repo; break-glass + DB copies shredded.
Hub now reports demo-hp offsite: enabled/escrowed/quota 50; nightly run scheduled (04:15 UTC).
Product findings + docs
- R-70 (P2-HIGH) minted: the offsite last mile is invisible on both surfaces (hub can't tell staged/consumed/applied; box shows the generic empty state). Coupled to R-31's status-card idiom and the R-39 consumed_at honesty-gauge precedent.
- R-71 (P1) minted: the race itself — recurs structurally on every fresh onboarding whose ISO floor lags the managed floor. Spec-first directions listed in the row (ordering / two-phase consume / hub-side auto-restage with the R-39(a) mint-race guard).
- Audit F10 row annotated: offsite leg resolved; PBS-DR half explicitly stays open (F13 + DR ceremony R-moment). CONTEXT.md updated.
Observed, not acted on
- demo-felhom's 07-21 staged offsite secret is still unconsumed (residue of the mistaken R-39-day offsite Re-issue; box recovered via key-auth-first, which never consumes). Harmless; supports R-70.
- The 3 dead unclaimed-appliance records from the ISO train remain for operator discard.
- Hub pod log only reaches back to 07-22 20:58Z (restart); the 07-21 correlation came from the DB.