`run-workspace-checks.mjs` buffers each check's output, writes it in one piece, and then called `process.exit(1)`. On a pipe, stdout is asynchronous, so the exit dropped what was still buffered: the log of a failing check stopped in the middle, before the test runner's failure summary. Set `process.exitCode` and return, so the process ends after stdout drains.