External Sharing defaults misbehaving on freshly created Scratch Org
It looks like a regression in Summer '19. These is an entry in the Summer '19 release notes related to this. However, this doesn't explain why the explicit definition of external sharing model access on the various objects is being ignored (other than this being a bug).
The only workaround we have found at this point is to push the source to the scratch org, wait while the sharing calculation is performed in the background and only once that is done execute a deploy to re-send the object meta to the scratch org:
sfdx force:source:deploy --sourcepath force-app/main/default/objects -u alias
This forces all the object meta files to be deployed, even though there are no tracked changes. However, an attempt to do this before the initial sharing calculation has finished will not resolve the problem and gets the following error:
The sharing calculation you requested can't be processed right now, because it interferes with another operation already in progress. Please try again later
UPDATE:
We set up scripting to do the force:source:deploy of the object definitions that iterates until it succeeds which worked around the sharing calculation problem. However, once that's done we have to do a further push of everything to get the scratch org tracking, um, back on track. And then we hit further issues because part of that deployment is a permission set we use to ensure our scratch org user has permissions against our custom objects. And this causes the push to fail and the scratch org becomes useless. I can't even figure out how to prevent push of the permission set using the .forceignore file...
I am really looking forward to Salesforce actually fixing this issue - it is wasting so much of our time!