Only the manifest upload is conditional. The per file pushes in executeSyncPlan are plain PUTs, so a pass that later loses the manifest CAS has already overwritten objects the winning pass uploaded. The bucket then holds bytes that disagree with the hash the winning manifest records. Convergence eventually self heals via rehash, but any device pulling in the window receives bytes that do not match the manifest entry, and once #95 (verify pulled content) lands, that window becomes a hard sync failure loop instead of a silent mismatch.
Only the manifest upload is conditional. The per file pushes in executeSyncPlan are plain PUTs, so a pass that later loses the manifest CAS has already overwritten objects the winning pass uploaded. The bucket then holds bytes that disagree with the hash the winning manifest records. Convergence eventually self heals via rehash, but any device pulling in the window receives bytes that do not match the manifest entry, and once #95 (verify pulled content) lands, that window becomes a hard sync failure loop instead of a silent mismatch.