Parents: #478, #476. Related: #812 and #502.
Evidence
Pushed Linux CI for current main bcc3e75 fails the promoted PR-249 case jit/spawned-thread-butterfly-stress.js in both optimization modes:
- Debug functional shard 2/4: https://github.com/zig-utils/zig-js/actions/runs/33421511036/job/99584763228
- ReleaseSafe shard 2/4: https://github.com/zig-utils/zig-js/actions/runs/33421511036/job/99584763385
The case exits immediately with TypeError: undefined is not an object. In each run one spawned Thread record reports threw=true and all records report done/exited/joins-settled. The failure is deterministic across Debug and ReleaseSafe in this run, is not a timeout, and is not a reported sanitizer race. Root cause and introducing revision are not yet established.
Scope
Reproduce the promoted case directly in no-GIL mode, minimize the failing object/property lifecycle, and identify whether object backing publication, shape/property synchronization, root retention, or thread completion transport exposes undefined. Preserve the intended shared-realm program-race contract while keeping every engine metadata transition race-free and memory-safe.
Acceptance
- The exact promoted case and a minimized deterministic witness preserve every expected object/property value in Debug and ReleaseSafe.
- The responsible publication/root/shape boundary has an explicit synchronization and moving-GC ownership proof.
- Focused unsuppressed TSan coverage passes without masking a program-byte race.
- Full no-GIL corpus, unit/TSan, lifecycle/mid-GC/threadfuzz, and relevant object/GC gates pass.
- No hidden GIL, blanket object lock, disabled GC/JIT, retry-until-pass loop, weakened assertion, or corpus exemption.