Parent: #465. Related: #476, #752, and #812 (discovered while reconciling that issue's CI evidence).
Linux CI run 33440235057 failed the ReleaseSafe no-GIL corpus shard in jit/spawned-thread-butterfly-stress.js with TypeError: undefined is not an object:
https://github.com/zig-utils/zig-js/actions/runs/33440235057/job/99646369453
The exact ReleaseSafe case reproduces locally and intermittently, including with native JIT disabled. A diagnostic preserving the original for (const o of own) loop showed the owning thread's packed Array iterator yielding undefined at an index whose direct own[index] read still returned the expected object.
Root cause: compileForOf creates its iterator, captured next, result, and close-state bookkeeping with raw freshTemp() names but never registers those names as function locals. emitDefine/emitLoad therefore resolve the synthesized names through the shared Environment. Concurrent invocations of the same compiled function overwrite each other's Iterator Records and results. This is also wrong for recursive/reentrant execution. compileYieldStar uses the same raw temporary pattern and should use the same activation-owned abstraction.
Implement the fix at the compiler storage boundary: use frame-local bindings for ordinary functions, private activation bindings for suspendable functions, and Exec-owned scratch for program chunks. Do not serialize execution, add sleeps, weaken the corpus assertion, or special-case the test. Add structural compiler coverage plus required-bytecode parallel runtime coverage, then verify the exact ReleaseSafe no-GIL case repeatedly, unsuppressed TSan, focused/full units, and the relevant corpus gate.