- util/ref.c: refUnlock's assert(count >= 0) on an unsigned count was
tautological, so a double-unlock silently underflowed to UINT32_MAX
instead of asserting. Now asserts count > 0 before decrementing.
- duskpsp/time/timepsp.c: timeGetRealTimeZonePSP returned hours while
every other platform (and timeepoch.c's math) expects seconds.
- thread.c: threadHandler reset threadId outside the mutex, after
signaling STOPPED, letting a caller's immediate threadStart() race
threadStartRequest()'s "thread id not 0" assert. threadId is now
reset inside the same locked section.
- tools/color.py: whole-number CSV channels (0, 1) produced invalid C
float literals (0f, 1f) for the generated COLOR_*_3F/_4F macros.
Route through float() so they always stringify with a decimal point.
Also adds .claude/code-check.md: a full review pass over every
subsystem in src/dusk/, with the above (plus several other findings
not yet acted on) written up in detail.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>