Surfaced by the #458 (#360) review.
#360 fixed the LOCAL backup path so a content-free footprint (fresh host, nothing to back up) yields no anchor and the deploy proceeds — an empty footprint is legitimate, it's just not a saved+verified backup.
BackupRemote still fails closed on this case: an empty remotePaths list produces a no-files archive that fails its own VerifyBackup, so via applyBackupFailurePolicy a fresh host's first remote deploy aborts instead of proceeding like the local path now does.
Fix: give BackupRemote the same empty-footprint handling — a content-free remote backup should yield no anchor and let the deploy proceed (gated the same way the local path is), rather than aborting. Keeps local/remote parity for the fresh-host first-deploy case.
Out of scope for #458 (which was explicitly local-only); filing for the parity follow-up.
Surfaced by the #458 (#360) review.
#360 fixed the LOCAL backup path so a content-free footprint (fresh host, nothing to back up) yields no anchor and the deploy proceeds — an empty footprint is legitimate, it's just not a saved+verified backup.
BackupRemotestill fails closed on this case: an emptyremotePathslist produces a no-files archive that fails its ownVerifyBackup, so viaapplyBackupFailurePolicya fresh host's first remote deploy aborts instead of proceeding like the local path now does.Fix: give BackupRemote the same empty-footprint handling — a content-free remote backup should yield no anchor and let the deploy proceed (gated the same way the local path is), rather than aborting. Keeps local/remote parity for the fresh-host first-deploy case.
Out of scope for #458 (which was explicitly local-only); filing for the parity follow-up.