The final snapshot lists files through Obsidian's in memory file index, but sync writes files through the low level adapter, which the index only learns about asynchronously. A file pulled moments earlier can be absent from the uploaded manifest even though it exists on disk and in the bucket.
Any other device that already has that file reads its absence from the manifest as a remote deletion and deletes its local copy. Integration tests cannot catch this because their filesystem fake has no index staleness.
The final snapshot lists files through Obsidian's in memory file index, but sync writes files through the low level adapter, which the index only learns about asynchronously. A file pulled moments earlier can be absent from the uploaded manifest even though it exists on disk and in the bucket.
Any other device that already has that file reads its absence from the manifest as a remote deletion and deletes its local copy. Integration tests cannot catch this because their filesystem fake has no index staleness.