The RTSJ Spec says:

For purposes of scoped memory reference counting, the following are treated as execution contexts:

I think the most common way to keep a scope "open" is to leave a waiting real-time thread in it. A waiting async event handler would work equally well, but if an AEH is forced to wait, it is little different from a thread. An async event bound to a happening would work nicely, but not many people use happenings, and those who do take them too seriously to bind one to an async event that intentionally does nothing.

A one-shot timer, however, is a nice fit for the job. It even has a nice side effect. By setting its duration to a time longer than the scope should stay open, the developer has a chance to give it an AEH that reports the error ("Someone forgot to unpin this scope!") and maybe tries to recover from the error.

Here's a program that demonstrates these steps.