Replaces the timing-dependent execFileSync(timeout:5000) approach with a spawnSync-based runHook that tests the scanner's RESULT (exit code + output shape), never how long it takes. Root design flaw in the prior approach: execFileSync's timeout (5000ms) was identical to the scanner's own internal setTimeout(5000ms), creating a non-repeatable race (F.I.R.S.T. violation: not Repeatable). Under concurrent test-chunk load — which #2089's 3 new cursor test files redistribute — node22's event-loop scheduling let execFileSync's SIGTERM win the race, producing err.status=null → exitCode=1 → spurious property-test failure. Redesign (F.I.R.S.T.): - spawnSync (not execFileSync): non-zero exits return a result object, not an exception — cleaner for property tests - Non-serializable payloads (BigInt, circular refs, Symbol) are SKIPPED: the scanner receives JSON via stdin, so these values are outside its protocol — JSON.stringify throwing is a test-harness artifact, not a scanner defect - 30s safety-net timeout is NOT a test assertion: scanner exits in <100ms; 30s only catches a genuinely hung process (6x the scanner's own 5s internal timer → no race possible) - Assertions check exit===0 and output structure, never timing qa-test-architect pipeline: risk=HIGH (security boundary); automation= subprocess (real shipped hook); test-cases cover happy/boundary/negative/ independence; verified via gsd-test.
5.6 KiB
5.6 KiB