Skip to content

Resolve the first Stryker survivor queue - #67

Merged
feO2x merged 1 commit into
mainfrom
66-resolve-first-stryker-survivor-queue
Aug 1, 2026
Merged

Resolve the first Stryker survivor queue#67
feO2x merged 1 commit into
mainfrom
66-resolve-first-stryker-survivor-queue

Conversation

@feO2x

@feO2x feO2x commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Triaging the survivors of the two smallest scoped mutation runs produced four distinct outcomes, three of which are addressed here. The fourth — twelve survivors covering the target-provided branch of the typed validation OpenAPI helpers — is deferred to #57, because that branch passes a null message and testing it now would encode the bug as the expected contract.

Two survivors turned out to be false. Applying them by hand fails 46 and 52 of 112 tests respectively, yet Stryker reports both as survived: they sit in code reachable only during static initialization, which a reused test host runs once per process. Document that as a blind spot, since the report alone cannot settle such a survivor.

Three survivors are unkillable and now carry narrow suppressions with their justification on the directive line, where Stryker records it — a reason split across lines is silently truncated in the report.

Three were genuine guard-clause gaps: no test invoked the typed helpers on a null builder or ExecuteResultAsync on a null context, where the guards are what turn a NullReferenceException into the documented ArgumentNullException.

Closes #66

Claude-Session: https://claude.ai/code/session_0184eh1G3XxvjRB11cNKyMRT

Triaging the survivors of the two smallest scoped mutation runs produced
four distinct outcomes, three of which are addressed here. The fourth —
twelve survivors covering the target-provided branch of the typed
validation OpenAPI helpers — is deferred to #57, because that branch
passes a null message and testing it now would encode the bug as the
expected contract.

Two survivors turned out to be false. Applying them by hand fails 46 and
52 of 112 tests respectively, yet Stryker reports both as survived: they
sit in code reachable only during static initialization, which a reused
test host runs once per process. Document that as a blind spot, since
the report alone cannot settle such a survivor.

Three survivors are unkillable and now carry narrow suppressions with
their justification on the directive line, where Stryker records it —
a reason split across lines is silently truncated in the report.

Three were genuine guard-clause gaps: no test invoked the typed helpers
on a null builder or ExecuteResultAsync on a null context, where the
guards are what turn a NullReferenceException into the documented
ArgumentNullException.

Closes #66

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0184eh1G3XxvjRB11cNKyMRT
@feO2x feO2x self-assigned this Aug 1, 2026
@feO2x feO2x added the chore Internal cleanup work label Aug 1, 2026
@feO2x
feO2x merged commit 67c0015 into main Aug 1, 2026
1 check passed
@feO2x
feO2x deleted the 66-resolve-first-stryker-survivor-queue branch August 1, 2026 20:37
@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown

Code Coverage

Package Line Rate Branch Rate Complexity Health
Light.PortableResults 97% 94% 2880
Light.PortableResults.AspNetCore.MinimalApis 89% 75% 25
Light.PortableResults.AspNetCore.Mvc 89% 75% 25
Light.PortableResults.AspNetCore.OpenApi 94% 83% 505
Light.PortableResults.AspNetCore.Shared 100% 100% 28
Light.PortableResults.Validation 97% 89% 2954
Light.PortableResults.Validation.OpenApi 98% 91% 146
Light.PortableResults.Validation.OpenApi.SourceGeneration 88% 83% 786
Summary 96% (13320 / 13895) 90% (5619 / 6239) 7349

Minimum allowed line rate is 60%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

chore Internal cleanup work

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Resolve the first Stryker survivor queue: static-initializer blind spot, unreachable arms, and untested guard clauses

1 participant