Discovered during the #782 slab-redesign verify (2026-07-04). make test-tsan (Makefile.cbm:622-623) just echoes 'TSan not yet wired…' — CFLAGS_TSAN/GRAMMAR_CFLAGS_TSAN are defined but no TSan object set or runner rule exists → NO working ThreadSanitizer gate in CI.
Now matters: the slab allocator (post-#782/#859) is hand-rolled lock-free (per-page MPSC remote-free queue via CAS + radix page-map + refcount-guard retire) — a data race there is exactly what TSan catches and ASan does not. It was verified MANUALLY (full -fsanitize=thread rebuild; note vendored test objects embed $(SANITIZE), so a plain override leaves ASan .o and the TSan link fails — objects must be rebuilt consistently) and came back clean, but that isn't in automation.
Wire a real test-tsan: TSan object set + runner rule + a CI leg running at least mem/slab_alloc/parallel under TSan (they exercise concurrent cross-thread slab alloc/free at workers=2/4).
Discovered during the #782 slab-redesign verify (2026-07-04).
make test-tsan(Makefile.cbm:622-623) just echoes 'TSan not yet wired…' — CFLAGS_TSAN/GRAMMAR_CFLAGS_TSAN are defined but no TSan object set or runner rule exists → NO working ThreadSanitizer gate in CI.Now matters: the slab allocator (post-#782/#859) is hand-rolled lock-free (per-page MPSC remote-free queue via CAS + radix page-map + refcount-guard retire) — a data race there is exactly what TSan catches and ASan does not. It was verified MANUALLY (full -fsanitize=thread rebuild; note vendored test objects embed $(SANITIZE), so a plain override leaves ASan .o and the TSan link fails — objects must be rebuilt consistently) and came back clean, but that isn't in automation.
Wire a real test-tsan: TSan object set + runner rule + a CI leg running at least mem/slab_alloc/parallel under TSan (they exercise concurrent cross-thread slab alloc/free at workers=2/4).