Parents: #502, #812. Related: #792 and #41.
Evidence
Pushed Linux CI for current main bcc3e75 reproducibly exhausted the full 600-second no-GIL deadline in both Debug and ReleaseSafe:
- api/lock-async-hold.js: functional shard 1/4 job https://github.com/zig-utils/zig-js/actions/runs/33421511036/job/99584763257 and ReleaseSafe shard 1/4 job https://github.com/zig-utils/zig-js/actions/runs/33421511036/job/99584763100
- api/condition-async-wait.js: functional shard 2/4 job https://github.com/zig-utils/zig-js/actions/runs/33421511036/job/99584763228 and ReleaseSafe shard 2/4 job https://github.com/zig-utils/zig-js/actions/runs/33421511036/job/99584763385
Both runners produced empty stdout/stderr and were reaped by the corpus deadline. The same run passed the normal mid-GC profile at 900/900 and the unsuppressed TSan mid-GC profile at 90/90, so this is not the #812 collection-completion signature or a reported sanitizer race. Root cause and introducing revision are not yet established.
Scope
Reproduce both promoted cases in direct no-GIL mode and inspect lock/condition waiter ownership, queued versus in-flight realm tasks, completion notification, run-loop quiescence, and teardown publication. Determine whether the stalled owner is parked behind a task that was dequeued but cannot complete, a lost wake, or another exact lifecycle boundary; do not infer the cause from the timeout alone.
Acceptance
- Both named cases finish within their established Debug and ReleaseSafe budgets with exact semantic results.
- Native task, waiter, reacquire, and completion ownership is proved exactly once, including exception and teardown paths.
- A focused deterministic witness fails before and passes after the fix.
- Normal and TSan no-GIL corpus, lifecycle/mid-GC fuzz, and full unit gates pass.
- No added sleeps or polling windows, unconditional extra drains, weakened timeout/assertion, hidden GIL, or disabled GC.