Files
msd-core/.changeset/sturdy-orcas-snooze.md
Tom Boucher fa107c0461 fix(#4172): add --merge-async to test:coverage:scripts-floor (#4173)
* fix(#4172): add --merge-async to test:coverage:scripts-floor

The "Coverage gate (merged shards)" test.yml job has OOM-crashed (exit
134, SIGABRT) on every push to next since 4dfc46b. test:coverage:scripts-floor
was the only c8 coverage-merge invocation in package.json still missing
--merge-async: c8's default sync merge path (Report._getMergedProcessCov)
loads every raw V8 coverage file from the merged 3-shard coverage/tmp
directory into memory as one array before merging, instead of folding
them in one at a time, and now blows through the job's 8192 MB heap
ceiling.

This is the same bug class as #4068 (fixed in 4d70b4dc4), which added
--merge-async to test:coverage:unit and test:coverage:report -- the two
other scripts sharing this merge/report code path -- but missed this
third sibling, which reads the exact same merged coverage/tmp data in
the same job. check-coverage and report both dispatch through c8's
shared getCoverageMapFromAllCoverageFiles()/mergeAsync branch, so the
fix is identical in shape to #4068's.

Extends the existing #4068 regression guard (tests/c8-merge-async-flag.test.cjs)
to also assert test:coverage:scripts-floor carries --merge-async, closing
the coverage gap #4068 left on this sibling script.

Fixes #4172

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs(#4172): backfill changeset PR number (pr:0 -> 4173)

* fix(#4172): route scripts-floor through `c8 report`, not `check-coverage`

The prior commit (1a3d6b75e) added --merge-async to
test:coverage:scripts-floor, but the Coverage gate job still OOM-crashed
identically on PR #4173's CI run
(https://github.com/open-gsd/gsd-core/actions/runs/33587951779/job/100118358975).

Root cause of that miss: c8@11.0.0's `check-coverage` CLI subcommand
handler (node_modules/c8/lib/commands/check-coverage.js) never forwards
argv.mergeAsync into the Report constructor -- only the `report`
subcommand's handler (node_modules/c8/lib/commands/report.js) and the
default command (which also calls into report.js) do. Verified directly
by constructing Report the same way each handler does: the check-coverage
path yields report.mergeAsync === undefined even with --merge-async on
the command line, while the report path yields true.

Fix: route test:coverage:scripts-floor through `c8 report --check-coverage`
instead of `c8 check-coverage`. report.js's outputReport() calls the same
checkCoverages() threshold-checking helper when --check-coverage is
truthy, so behavior (and exit code on threshold failure) is unchanged --
only the code path taken to get there now actually honors --merge-async.

Extends the tests/c8-merge-async-flag.test.cjs regression guard with an
explicit assertion that scripts-floor invokes `c8 report`, not
`check-coverage`, so this can't silently regress back to the broken form.

Fixes #4172

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs(#4172): correct changeset to describe the actual root cause (check-coverage vs report subcommand gap, not just the missing flag)

---------

Co-authored-by: sim <sim@local>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-02 06:39:15 -04:00

676 B

type, pr
type pr
Fixed 4173

Fixed the coverage gate OOM-crashing on every push to next. The scripts/ coverage-floor check invoked c8's check-coverage subcommand, whose handler silently drops the async-merge flag even when it's passed (unlike its report sibling, which honors it) — the same OOM class as #4068, but this third script slipped through that fix because adding the flag alone wasn't enough here. Routing the check through c8 report --check-coverage instead makes the async-merge flag actually take effect, so coverage now merges incrementally instead of loading every shard's raw data into memory at once and blowing the 8GB CI heap ceiling. (#4172)