feat: changed-file mutation gate as a second required PR check (D-027) - #12
Merged
Conversation
Task 10 rehearsal (scratch PR #11, closed without merging): concurrency 1 hit the 15-minute job timeout at a 409-line mutate set with no report produced; concurrency 4 completed the same set cleanly in 7.7 min at 27.5 mutants/min, with no coverage-correlation warnings in the log. Concurrency 4 ships via MUTATION_GATE_EXTRA_ARGS. Derived sustainable threshold (27.5 * 12 / 0.5, rounded) is 700 lines, within 2x of the existing 800 default, so thresholdLines stays unchanged. Also carries back two stryker.conf.json fixes the rehearsal found necessary for the gate to run in CI at all (not rehearsal-specific, so they belong here rather than staying scratch-only): - tsconfigFile pointed at a nonexistent path, sidestepping a crash in Stryker 9.6.1's TSConfigPreprocessor (ts.parseConfigFileTextToJson, removed from TypeScript 7's module surface per D-022) that fired on every invocation regardless of which files were mutated - bun.timeout raised to 120s so the dry run's full-suite pass (~68-90s observed in CI) survives the runner plugin's own internal process timeout, which otherwise killed it well before Stryker's own dryRunTimeoutMinutes ever applied
…re, review minors)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements docs/superpowers/specs/2026-08-04-mutation-pr-gate-design.md: scripts/mutation-gate.mjs + .github/workflows/mutation.yml (the portable two-file unit), changed-file mode gating on zero undetected mutants, loud-skip over the size threshold with mutate-force/mutate-skip label overrides, incremental mode for adopters, report artifact on failure. Rehearsed end to end on a scratch PR (red on a planted survivor, green after the kill, both labels, skip-size, sticky comment upsert, artifact); concurrency and threshold set from the measured rate (D-027).
The rehearsal also surfaced two gate-blocking stryker.conf.json issues (fixed: tsconfigFile sentinel no-op for the TS7 crash, bun.timeout for the dry run) and one post-D-011 drift survivor at engine/index.ts:311 (killed; full engine recertified clean) — see D-027.