It can be very surprising when code which was previously compiling is suddenly failing with an error like:
Task-isolated 'foo' is passed as a 'sending' parameter; Uses in callee may race with later task-isolated uses
or:
Sending value of non-Sendable type 'Foo' risks causing data races
Passing task-isolated value of non-Sendable type 'Foo' as a 'sending' parameter to initializer 'init(_:)' risks causing races inbetween task-isolated uses and uses reachable from 'init(_:)'
My understanding of Region Based Isolated (RBI) is that the compiler silently colors each value as either bound to the current "isolation region" or not, and if you attempt to send a "bound" value ("task-isolated"?) to a different region then you will get an error similar to those above.
What I had not thought about until being bitten by this issue again just now is the full set of rules that determine whether a value is "task-isolated" or "disconnected", and the big rule that I wasn't conscious of is that when a value is initialized it will be disconnected if all values passed to the initializer are disconnected, but if one of those arguments becomes task-isolated then the value being initialized is also considered task-isolated.
I think that both for the seasoned concurrency expert who wants to fix the given isolation issue and for the novice who is trying to build their mental model about Swift Concurrency it would go a long way if at the site of the attempt to send the task-isolated value one of the diagnostics listed the task-isolated initializer arguments that are responsible for infecting the value and binding it to the current region.
I'm sure that there are all kinds of edge cases where such a list could not be generated, but it seems like it should be pretty straightforward in the simpler cases, and given how opaque the RBI errors are and how much effort the Swift team is putting toward branding Swift Concurrency as reasonably approachable this seems to me like it should be a somewhat high priority.