From c70e736c85a46dda9c948113d586b04b4a77267b Mon Sep 17 00:00:00 2001 From: sim Date: Wed, 12 Aug 2026 08:16:57 -0400 Subject: [PATCH] fix: eliminate resource-collision race in ship-notes-wedged-pr jq() mock Unrelated defect surfaced by a real gsd-test failure while verifying #3339 (test/3339-fold-state-model-profile diffs zero files this fix touches -- confirmed via `git diff origin/next -- ...` returning empty for this file, ship.md, and gsd-core/bin/lib/*.cjs). Fixed inline per this repo's no-defer policy for defects found while building, rather than deferred. The test's jq() mock shelled out to a full new Node.js process for every mocked `jq -r .field` call inside the extracted track_shipping bash script. The "exhausts the polling bound" test hits up to 24 cold Node spawns in one spawnSync call (6 polling iterations x 4 jq calls), racing a hardcoded 10s timeout -- under CI contention this tipped over on the linux-node22 lane specifically while linux-node24 had headroom, producing spawnSync's signal-killed `status: null` instead of the process's real exit code, asserted against the expected 0. Replaced the Node-subprocess jq() mock with a pure-shell sed -nE field extractor that never forks a process, eliminating the variable-cost operation rather than just widening the timeout. Verified extraction correctness against sample JSON (head/status/checks/review, including empty-string and non-matching-field cases). Locally verified (scoped per session policy): all 9 tests in the file pass; the previously- marginal test dropped from ~617ms to ~198ms. The underlying track_shipping polling logic in ship.md was confirmed correct and untouched -- this was a test-fixture race, not a product bug. --- tests/ship-notes-wedged-pr.test.cjs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/ship-notes-wedged-pr.test.cjs b/tests/ship-notes-wedged-pr.test.cjs index 17e35a5d6..915031b0a 100644 --- a/tests/ship-notes-wedged-pr.test.cjs +++ b/tests/ship-notes-wedged-pr.test.cjs @@ -62,7 +62,11 @@ function runTrackShipping(responses) { ' sed -n "${_call}p" "$GH_RESPONSES"', '}', 'jq() {', - ' "$NODE_BIN" -e "let d=\'\';process.stdin.on(\'data\',c=>d+=c);process.stdin.on(\'end\',()=>{const o=JSON.parse(d);process.stdout.write(String(o[process.argv[1].slice(1)] ?? \'\'));});" "$2"', + ' _field="${2#.}"', + ' _raw=$(sed -nE \'s/.*"\'"$_field"\'":("[^"]*"|[^,}]*).*/\\1/p\')', + ' _raw="${_raw%\\"}"', + ' _raw="${_raw#\\"}"', + ' printf \'%s\' "$_raw"', '}', ].join('\n'); @@ -77,7 +81,6 @@ function runTrackShipping(responses) { GH_CALLS: ghCallsPath, GH_RESPONSES: responsesPath, GIT_CALLS: gitCallsPath, - NODE_BIN: process.execPath, PHASE_NUMBER: '1', PR_NUMBER: '123', padded_phase: '01',