While migrating a large SDK to the Swift 6 language mode, I wanted to avoid blanket @unchecked Sendable on our existing lock-guarded types. The pattern I landed on: implement SerialExecutor over NSRecursiveLock (jobs run inline on the calling thread under the lock), then back a nested @globalActor with it so the enclosing type can stay a class with a synchronous API while its state becomes compiler-isolated.
The write-up covers the executor, recursive-lock reentrancy and owner restoration, checkIsolated() / isIsolatingCurrentContext(), and a synchronous run entry point.
I'd genuinely value any feedback: