I very much endorse this amendment, and would like to add some experiential anecdata.
I've spent a lot of time over the past few weeks doing trial ports of existing projects over to the new concurrency model, and helping others do the same. I tried out the new compiler enforcing nonisolated for lets on my nursery of converted apps and the results were uniformly one of frustrating error squashing busywork.
Changing code to use the new features is, for the most part, a very fulfilling experience, leaving the code far more elegant than it was before. It's also often a very natural conversion that does not involve major refactors. It is surprising just how much Swift code is already structured in a way that naturally converts to both async/await and actors. Threading a completion handler through a bunch of calls? They can all become async and the surrounding code gets a nice clean up. Got a class that protects its state with a queue? That's an easy conversion to an actor.
That migration does involve some patience and care though. It is not purely mechanical, even when the code is already nicely suited to the model. Adding async or actor generates errors. Those errors help guide you to where you need to apply some of the new features.
But the errors can be intimidating, and sometimes the user gets into a vicious circle. They react to the errors generated by making more functions async, or by putting more things on the main actor. This leads to more errors and the user quickly becomes overwhelmed. At this point they may just give up with the migration.
For this reason, we need to be very circumspect about presenting errors that will seem unnecessary to a user. Every compilation error we show them needs to carry its weight. And telling a user that e.g. their .shared singleton instance of a controller they just converted to be on the main actor cannot be accessed until they put this seemingly unnecessary keyword on it has a high cost. Too high in my opinion.
And when I look at the reasons that have been cited for why it is necessary to make them jump through that hoop (ah but what if you wanted to convert that let to a var in the future?), I do not think they would stand up to scrutiny by users demanding an explanation for why the language is making them hang more keywords on their code.
I think we must acknowledge something: many users of Swift love it, but have this nagging feeling that it is skewed a little too much towards pedantry and not usability. I usually disagree, and think the case for how the language works (such as eschewing implicit conversions) is the correct one. But I am mindful whenever I would find it difficult in good faith to defend the compiler strictly enforcing something. This is one of those times.
Doug’s proposal, limiting access without nonisolated to the current module, seems like the pragmatic solution here.