Parent: #786 Related: #477, #493
Audit finding
Interpreter.pushExecRoot currently discards gc_execs.append allocation errors. A failed root-list growth can therefore run bytecode without registering its precise roots. Separately, buildActivation installs callee state and performs argument/rest/parameter/debugger allocations before execLoop or runDriver registers its Exec. Saved caller state and newly prepared frame slots need precise ownership during that provisional window too.
This is a pre-existing publication/lifecycle issue found while fixing the stale saved caller copies in #786; it is not solved by moving those copies into Exec alone.
Scope and acceptance
- Root registration propagates allocation failure before executing an unregistered activation.
- Provisional activation preparation publishes all live managed caller/callee state before any allocation-recovery or observable call boundary.
- Every error path restores the caller and unregisters/recycles exactly the records it owns, including tail replacement and driver-list growth failures.
- Deterministic allocation-failure sweeps and moving-GC witnesses cover initial, inline, nested-driver, and tail-call entries.
- Normal/TSan/OOM and required integration gates pass with no ignored allocation errors, pinning, disabled GC, or fallback.
Coordinate any activation-driver lifecycle changes with the actor handling stack/queue/job-native work; this issue must not change Promise, Worker, or iterator behavior.