@wokalski I gather that it’s too late by now, but the problem that you faced here with Eio has a solution in the just released affect concurrency model and library via the notion of asynchronous call handlers. See here for an example.
It’s not exactly syntactic scope in the sense that you need to manually plug your call handler when you do your asynchronous function call, but once you have done that it respects the function scope: call handlers are inherited and composed with those of child asynchronous function calls. So these child calls will be subject to it unless their own call handlers override it.
That entails at least an operational reconciliation with what you’d expect from syntactic scope – i.e. no Exception: Stdlib.Effect.Unhandled E in a subcomputation of f if you plugged a handler for E when calling f.