If you care at all about deterministic data quality, never overwrite anything in S3, and never rely on object listing. Read-after-new-write is consistent in S3. If you need to list objects but don't want to sync additional metadata in e.g. DynamoDB, then a common pattern is to write a file listing ("manifest") in another S3 object.
Last year, I spent two full months hunting temporary inconsistency bugs in the Docker Registry's Swift driver. I added several heuristics that reduced the frequency of inconsistency-induced errors by about two orders of magnitude, but in the end, we still ended up switching to Quay, which has gotten the memo that you mentioned: "never overwrite anything, and never rely on object listing". They put metadata in an RDBMS instead, just like s3mper which was mentioned in the submission.