We receive the pack-file only (not the index), which is a stream of objects. We get only the data for each object (no names), and each object is either the full bytes, or a delta (see [pack-format.txt](https://github.com/git/git/Documentation/technical/pack-format.txt) for details). We reconstruct each entry, which makes sure any deltas apply, and then sha1 the result. We then build the index using the names we generated. For non-blob objects, we do a sanity check that the objects are not malformed (the same checks as done by `git-fsck`). And finally we make sure that the tips the client sent us are fully connected to what we have. So a bit corruption in the pack stream, for example, will result in a misnamed object, which will result in a lack of full connectivity (we will be missing an object, because it is misnamed on our side).

So individual object entries should be in good shape (from the fsck check), the index should be accurate (we generated it), and the result should not be missing any objects (the connectivity check). As far as I know, we do not test for duplicate objects in the pack stream, but I am still digging there. I'm not sure that it is generally considered an invariant. Certainly it would be _stupid_ to send the same object twice, but aside from the experimental `sha1_entry_pos` function (which we do not use on our servers), nobody should care.