You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
mutations-core intermittently hangs until the 60-minute job timeout #46
The mutations-core job in mutation-tests.yml intermittently stalls and runs until the job's timeout-minutes: 60, so the run ends up cancelled. A normal run takes 7 to 8 minutes. gh run rerun <id> --failed has cleared it every time, with no code change.
It's frequent: 13 hangs in 77 workflow runs since 2026-08-26, about one run in six. It has only ever hit core. The other four targets (extensions, legacy, ratelimiting, testing) have never hung.
The hang is in the unmutated test suite, not a mutant
In every hung job, the last Stryker log line is one of the two steps that run Paramore.Fences.Core.Testsbefore any mutant is tested:
Stalls at
Jobs
Number of tests found: 698/700 … Initial test run started.
8
Capture mutant coverage using 'CoverageBasedTest' mode.
5
So this isn't a mutant causing an infinite loop, which Stryker would report as a Timeout mutant and move on from. Something in the Core test suite itself occasionally never finishes under Stryker's test runner. A plain local dotnet test test/Paramore.Fences.Core.Tests -f net10.0 also hung once in testhost on 2026-09-26, and a re-run with --blame-hang-timeout 90s then completed, so the hang may not be Stryker-specific.
Related: the mutation score is also non-deterministic
Separately from the hang, main failed mutations-core on the #44 merge (36323895894) with a score of 99.72% against the 100% break threshold. #44 only changed two build properties. #45's run on the same main code scored 100% and passed.
One mutant survived: src/Paramore.Fences.Core/Utils/Pipeline/ExecutionTrackingComponent.cs:54, a Negate expression on if (_timeProvider.GetElapsedTime(start) > Timeout) in the DisposeAsync wait loop. Whether it's killed depends on timing. The line's // stryker disable once equality comment only covers equality mutations, so the negation isn't excluded. The run also reported 22 Timeout mutants, which suggests the suite is timing-sensitive under mutation generally.
Cost
Each hang costs an hour of runner time plus a manual re-run, and it blocks the PR's checks until then.
Find the hanging test: run the Core suite in CI with --blame-hang-timeout (outside Stryker) enough times to catch a hang dump. Or check whether Stryker's own test-runner settings can surface it.
Fail fast: a much lower timeout-minutes for core (for example 20) would turn a one-hour wait into a quick, obvious failure. It doesn't fix the cause.
Timing-dependent mutants: decide whether ExecutionTrackingComponent's wait-loop condition should be excluded explicitly or tested deterministically.
Summary
The
mutations-corejob inmutation-tests.ymlintermittently stalls and runs until the job'stimeout-minutes: 60, so the run ends upcancelled. A normal run takes 7 to 8 minutes.gh run rerun <id> --failedhas cleared it every time, with no code change.It's frequent: 13 hangs in 77 workflow runs since 2026-08-26, about one run in six. It has only ever hit
core. The other four targets (extensions,legacy,ratelimiting,testing) have never hung.The hang is in the unmutated test suite, not a mutant
In every hung job, the last Stryker log line is one of the two steps that run
Paramore.Fences.Core.Testsbefore any mutant is tested:Number of tests found: 698/700 … Initial test run started.Capture mutant coverage using 'CoverageBasedTest' mode.So this isn't a mutant causing an infinite loop, which Stryker would report as a
Timeoutmutant and move on from. Something in the Core test suite itself occasionally never finishes under Stryker's test runner. A plain localdotnet test test/Paramore.Fences.Core.Tests -f net10.0also hung once in testhost on 2026-09-26, and a re-run with--blame-hang-timeout 90sthen completed, so the hang may not be Stryker-specific.Hung runs
mainmainmainmainRelated: the mutation score is also non-deterministic
Separately from the hang,
mainfailedmutations-coreon the #44 merge (36323895894) with a score of 99.72% against the 100% break threshold. #44 only changed two build properties. #45's run on the samemaincode scored 100% and passed.One mutant survived:
src/Paramore.Fences.Core/Utils/Pipeline/ExecutionTrackingComponent.cs:54, a Negate expression onif (_timeProvider.GetElapsedTime(start) > Timeout)in theDisposeAsyncwait loop. Whether it's killed depends on timing. The line's// stryker disable once equalitycomment only covers equality mutations, so the negation isn't excluded. The run also reported 22Timeoutmutants, which suggests the suite is timing-sensitive under mutation generally.Cost
Possible directions (not decided)
--blame-hang-timeout(outside Stryker) enough times to catch a hang dump. Or check whether Stryker's own test-runner settings can surface it.timeout-minutesforcore(for example 20) would turn a one-hour wait into a quick, obvious failure. It doesn't fix the cause.ExecutionTrackingComponent's wait-loop condition should be excluded explicitly or tested deterministically.🤖 Generated with Claude Code