Parent: #63 Related: #54, #61, #62 CI evidence: https://github.com/zig-utils/zig-js/actions/runs/29327767669
Problem
The full push CI for 3a8eda3 passed unit, docs, benchmark-harness, test262-parallel, ordinary thread, threadfuzz, and most TSan jobs, but two production no-GIL corpus shards found unsuppressed data races:
semantics/proto-cycle-race.js: a byte write inInterpreter.ordinarySetPrototypeOfatsrc/interpreter.zig:9266races during concurrent prototype-cycle mutation;objectmodel/i08-named-vs-indexed-first-install.js: a read inObject.appendSlotatsrc/value.zig:1009races while named and indexed properties are first installed concurrently.
These are correctness failures and invalidate the final TSan publication gate even though they are independent of the recent single-thread VM optimization.
Scope
- reproduce both cases under the same Linux TSan configuration used by CI;
- identify the unsynchronized fields and establish the narrow object-level locking or atomic protocol required by the no-GIL object model;
- preserve cycle rejection, prototype semantics, indexed/named property descriptors, insertion barriers, and existing fast paths;
- add focused regressions that reliably overlap the conflicting operations;
- keep the production corpus suppression-free.
Acceptance criteria
semantics/proto-cycle-race.jsis TSan-clean and preserves valid prototype-cycle outcomes.objectmodel/i08-named-vs-indexed-first-install.jsis TSan-clean with correct final named/indexed properties.- Focused no-GIL semantic tests pass repeatedly.
- The affected TSan corpus shards pass with no race reports.
- Full unit, thread, and eventual publication TSan gates remain green.
- Retained commits reference this issue.