Skip to content

Repair Stryker.NET backend mutation lane - #1503

Open
Chris0Jeky wants to merge 7 commits into
mainfrom
issue-1500/mutation-lane
Open

Repair Stryker.NET backend mutation lane#1503
Chris0Jeky wants to merge 7 commits into
mainfrom
issue-1500/mutation-lane

Conversation

@Chris0Jeky

@Chris0Jeky Chris0Jeky commented Jul 27, 2026

Copy link
Copy Markdown
Owner

Closes #1500

Summary

  • pin Stryker.NET 4.16.0 and use the supported ignore-methods / ignore-mutations keys
  • run from Taskdeck.Domain.Tests context so unrelated test projects are not discovered
  • add a cross-platform fail-closed preflight for config shape, valid exclusion entries, execution context, timeout, version, and artifact drift
  • cap the backend job at 180 minutes and fail artifact upload when no report exists
  • preserve frontend behavior/manual inputs and resolve the durable 16-run backend evidence outage

Local verification — current head

  • native Windows PowerShell 5 preflight: 25/25 (4 valid contracts, 21 rejected fixtures)
  • Linux PowerShell 7.4 preflight: 25/25
  • Domain tests: 1,636/1,636 passed
  • pinned Actionlint 1.7.12: passed
  • failure-ledger renderer tests: 11/11
  • docs governance and golden-principles gates: passed
  • JSON, diff/show, and DCO checks: passed

Hosted evidence

  • first repaired proof: run 30236307062, SHA 307add004fbe142321a6ec11be21fab708824d5d, 3,682 mutants, 70.75%, 192s, non-empty 874,386-byte two-file artifact
  • prior final-head proof before the review fix: run 30236739913, SHA 89e5f9b1ce86823ae155e5fad25e0fae54cab2d5, 3,682 mutants, 70.78%, 198s, non-empty 871,031-byte two-file artifact
  • final current-head proof: run 30237563760, SHA b18b9a5c54d7337fe4ba6aaf1eaa134896e63439, preflight 25/25, 3,682 mutants, 70.75%, 292s overall, non-empty 878,708-byte two-file artifact (SHA-256 310e5aa214bdfc72a54c8971b625cf93779096c8d1b2622ae830595258c5fb63)

The one-mutant survived/timeout classification shift between the two completed runs is disclosed timing variance; both reports are valid and the killed count is unchanged.

Review resolution

  • policy and config now agree that intentional exclusions are non-empty string-array entries; invalid shapes/entries fail closed
  • the manual checklist uses the same preflight and Domain-test context as CI
  • the policy uses the existing testing and hardening labels
  • all three Codex threads have fix evidence and are resolved
  • two independent final reviews require current-head rerun/CI and metadata refresh; no finding was dropped

Remaining gate

  • final current-head backend-only mutation run with a non-empty report
  • current-head Required CI, CI Extended, CodeQL, final Codex result, and comment/thread sweep
  • the previous Extended Workflow Lint failed before checkout because Docker Hub metadata timed out three times; the current-head rerun must be green

Merge boundary

Maintainer-merge only, per #1500. This PR must not be self-merged.

Signed-off-by: Chris0Jeky <jeky.tck@gmail.com>
Signed-off-by: Chris0Jeky <jeky.tck@gmail.com>
@Chris0Jeky

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6c9ccb5dfb

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread backend/stryker-config.json
Signed-off-by: Chris0Jeky <jeky.tck@gmail.com>
Signed-off-by: Chris0Jeky <jeky.tck@gmail.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 307add004f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread scripts/ci/Test-StrykerConfig.ps1 Outdated
Comment thread .github/workflows/mutation-testing.yml
Signed-off-by: Chris0Jeky <jeky.tck@gmail.com>
@Chris0Jeky

Copy link
Copy Markdown
Owner Author

Final exact-head hosted proof — 89e5f9b1ce86823ae155e5fad25e0fae54cab2d5

Backend-only Mutation Testing run 30236739913 completed successfully on the current PR head.

  • Frontend skipped as intended.
  • Pinned Stryker.NET 4.16.0 installed; preflight passed 18/18 (2 valid contracts, 16 rejected drift fixtures).
  • Domain context proved: Taskdeck.Domain.Tests, 1,636 discovered tests.
  • 3,682 mutants created; 753 skipped; 2,929 tested.
  • 2,351 killed, 575 survived, 3 timed out; score 70.78%.
  • Coverage phase 4.958s; mutant execution 125.244s; Stryker step 156s; backend job 190s; overall run 198s.
  • Exactly one non-expired stryker-net-report artifact: 871,031 bytes, two report files, archive SHA-256 9618f8cf7e0c2547fcc2425ffe18889485430fe705ba8c822967f4627c5ceb12.

The prior exact-workflow proof at 307add00 classified one of these unchanged-result mutants as survived rather than timed out (70.75% versus 70.78%). This is a disclosed timing-classification variance, not a lane failure; both runs produced valid reports. Canonical docs intentionally retain the first repaired baseline and this comment supplies the final-head proof after the docs-only evidence commit.

Local final-head docs/render verification: Stryker preflight 18/18, failure-ledger renderer tests 11/11, docs governance, golden-principles governance, and diff checks passed. The workflow itself was already Actionlint-clean at 307add00; the final commit changed docs/ledger only, and hosted workflow lint remains authoritative.

@codex review exact head 89e5f9b, please.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Another round soon, please!

Reviewed commit: 89e5f9b1ce

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@Chris0Jeky Chris0Jeky left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent adversarial evidence/policy review — exact head 89e5f9b1ce86823ae155e5fad25e0fae54cab2d5

I read the linked issue/acceptance criteria, full diff, all issue comments, both prior Codex reviews, every inline comment, and all three unresolved review threads before reviewing this head. Lens: canonical STATUS/MASTERPLAN/TESTING/policy truth, append-only failure-ledger resolution, exact run/SHA/count/duration/artifact evidence, backward compatibility, and single-baseline claim boundaries.

MEDIUM

  1. The preflight rejects the intentional exclusions the policy tells maintainers to add. scripts/ci/Test-StrykerConfig.ps1:83-91 requires ignore-methods and ignore-mutations to stay empty, while docs/testing/MUTATION_TESTING_POLICY.md:118-120 explicitly makes those supported spellings the backend suppression mechanism. That means the first legitimate exclusion re-breaks the lane before Stryker starts. Confirmed existing thread: #1503 (comment). Accept arrays of valid string entries rather than enforcing emptiness, and add a positive self-test proving non-empty supported lists pass (plus malformed-entry rejection if the preflight owns entry validation).

  2. The durable manual checklist still invokes the removed backend-root contract. docs/MANUAL_TEST_CHECKLIST.md:1050-1057 still tells an operator to run dotnet stryker --config-file stryker-config.json from backend/. This PR deliberately removes solution/test-projects and makes backend/tests/Taskdeck.Domain.Tests the execution context, so that checklist can be checked off without exercising the repaired lane (or can fail for unrelated discovery/path reasons). Confirmed existing thread: #1503 (comment). Mirror the preflight plus Domain-test-project invocation already documented in TESTING_GUIDE/policy.

  3. The PR's exact-head evidence section is stale and does not yet record the issue AC that is now actually satisfied. The body still says run 30236307062 at 307add00 is running and that ledger/canonical-doc updates remain outstanding. Live evidence now shows final run 30236739913 completed successfully on this exact head 89e5f9b1...; its two-file stryker-net-report artifact is 871,031 bytes with GitHub digest sha256:9618f8cf7e0c2547fcc2425ffe18889485430fe705ba8c822967f4627c5ceb12. The downloaded JSON contains 3,682 mutants: 2,351 killed, 575 survived, 3 timeout, 397 no-coverage, 317 ignored, and 39 compile-error (70.78% total score). Update the PR body/evidence comment to record this exact-head run and replace the now-false remaining-work text. This is metadata-only and need not invalidate the head.

LOW

  1. The mutation follow-up process names a label that does not exist. docs/testing/MUTATION_TESTING_POLICY.md:115 says to file findings with test-hardening, but the live repository has only the relevant testing and hardening labels, and the project automation contract requires real repository labels. Use the existing labels or seed/approve the taxonomy change explicitly; do not leave a non-executable instruction in the refreshed policy.

Existing-thread triage

  • #1503 (comment) is fixed in this head: policy line 119 now uses ignore-mutations / ignore-methods and explicitly rejects the obsolete spellings. It still needs a reply with 89e5f9b1 evidence and thread resolution.
  • The other two Codex threads are confirmed above and remain unresolved.

Evidence and residual gate state

  • The append-only failure ledger is correctly shaped: the original open record remains, a later resolution record was appended, the Markdown projection matches, and exact-head Docs Governance passed.
  • The documented first baseline is accurate: run 30236307062, SHA 307add00, 192-second workflow lifecycle, 3,682 mutants, 70.75%, one two-file artifact, 874,386-byte archive, digest 0e8a9a41.... The canonical docs correctly keep this as calibration rather than a merge threshold.
  • The final exact-head run differs by one survivor/timeout (575/3 vs. 576/2) while total mutants stay 3,682, reinforcing that two back-to-back proofs are not the policy's 3–4-run calibration window.
  • Required CI and CI Extended were still running when reviewed. CI Extended's Workflow Lint job is already red because Build rhysd/actionlint@v1.7.12 failed in Docker before checkout/actionlint execution; this is not evidence of a workflow syntax defect, but it remains a merge-gate failure that needs a terminal-log investigation and bounded rerun.

Verdict: changes requested. Do not merge; the PR is maintainer-held regardless.

@Chris0Jeky

Copy link
Copy Markdown
Owner Author

Independent workflow/Stryker review ? exact head 89e5f9b1ce86823ae155e5fad25e0fae54cab2d5

I read the PR body, linked issue #1500, all 3 issue comments, both submitted reviews, all 3 inline comments, and the unresolved-thread state before reviewing the diff. Lens: workflow correctness, Stryker.NET 4.16 schema/operating context, timeout/concurrency/artifact behavior, PowerShell portability, and hosted evidence.

Findings

CRITICAL / HIGH: none.

MEDIUM ? the preflight makes the documented intentional-exclusion workflow impossible (confirms the existing P2 at discussion_r3654359096).

  • scripts/ci/Test-StrykerConfig.ps1:83-91 rejects every non-empty ignore-methods or ignore-mutations array, and the self-test at :258 codifies that rejection.
  • docs/testing/MUTATION_TESTING_POLICY.md:118-120 explicitly instructs maintainers to record intentional exclusions in those arrays. Those are the supported Stryker.NET 4.16 keys; non-empty string arrays are valid configuration.
  • Result: following the policy causes the fast preflight to fail before Stryker. Validate the arrays/entries without requiring them to stay empty, and add positive non-empty fixtures plus invalid-shape/entry rejection coverage.

MEDIUM ? the canonical manual checklist still validates the obsolete solution-root execution path (confirms the existing P2 at discussion_r3654359111).

  • docs/MANUAL_TEST_CHECKLIST.md:1050-1057 still directs dotnet stryker --config-file stryker-config.json from backend/.
  • This PR deliberately removes solution / test-projects selectors and makes the Taskdeck.Domain.Tests working directory the scoping contract. The stale checklist therefore does not exercise the repaired lane and can be checked off after running a different discovery mode.
  • Update it to run the preflight and the same Domain-test-project command/output path as CI.

LOW: none beyond thread hygiene below.

Prior-thread triage

  • discussion_r3654141179 is fixed in the exact-head content: MUTATION_TESTING_POLICY.md:119 now uses ignore-mutations / ignore-methods and calls the old spellings obsolete. The thread still has no reply and remains unresolved; reply with the fix commit/evidence and resolve it.
  • The other two threads above are current, valid, and unresolved. The exact-head Codex no-major-issues notice does not invalidate specific open P2 findings under this repo's all-severity review policy.

What held under attempted refutation

  • Stryker's documented test-project mode matches the workflow: run in the test-project directory, and use project as the referenced source-project filename. Taskdeck.Domain.Tests.csproj has exactly one ProjectReference, to Taskdeck.Domain.csproj.
  • The workflow pins dotnet-stryker 4.16.0 (a .NET 8 tool), runs in backend/tests/Taskdeck.Domain.Tests, writes to backend/StrykerOutput, has one 180-minute job ceiling, and fails missing backend artifacts.
  • The execution files are byte-identical between 307add00 and this head; 89e5f9b1 changes docs/ledger only. Run 30236307062 independently proved the execution path: one test project, 1,636 Domain tests, 3,682 mutants, and a non-empty report artifact. The now-terminal exact-head run 30236739913 separately reproduced that shape and uploaded one non-empty artifact; I did not use its success to waive either static finding.
  • The 70.75% ? 70.78% difference is one unchanged mutant moving from survived to timeout (576/2 ? 575/3). That disclosed timing classification variance supports keeping the score advisory during calibration; it does not refute Domain-only discovery.

Checks/evidence inspected

  • Native Windows PowerShell preflight: 18/18 passed at exact head.
  • Linux pwsh preflight: 18/18 passed in hosted runs 30236307062 and 30236739913. Local pwsh and dotnet-stryker are not installed on this machine, so I did not claim a local Linux/tool execution.
  • Exact-head mutation run 30236739913: success; one test project, 1,636 tests, 3,682 mutants, artifact stryker-net-report 871,031 bytes.
  • Required CI/CodeQL: the completed jobs inspected are green; some Extended/E2E jobs remain pending.
  • Exact-head CI Extended Workflow Lint is red. Its job never checked out the PR or ran Actionlint: the pinned action's container build retried three times and each attempt timed out fetching alpine, golang, or shellcheck-alpine metadata from Docker Hub. That is an understood external failure, but it remains a real red gate and needs an identical-head rerun/proof before merge.

Verdict: changes requested. Fix the two confirmed P2s in one batch, reply/resolve all three threads with evidence, rerun scoped verification, and require exact-head CI/Extended green. Maintainer-only merge boundary remains unchanged.

Signed-off-by: Chris0Jeky <jeky.tck@gmail.com>
@Chris0Jeky

Copy link
Copy Markdown
Owner Author

Combined review-fix evidence — exact head b18b9a5c54d7337fe4ba6aaf1eaa134896e63439

Signed commit b18b9a5c resolves every current independent/Codex finding:

  • preflight accepts valid non-empty ignore-methods and ignore-mutations arrays while rejecting scalar, null, numeric, empty, and whitespace entries;
  • self-test is now 25 checks: 4 valid contracts (including both non-empty array paths) plus 21 rejected fixtures;
  • manual checklist item 22 uses the repository-root preflight and Domain-test context/config/output command;
  • policy uses live testing + hardening labels and documents the validated exclusion contract;
  • PR body now records both completed hosted proofs and the current-head pending gate.

Verification: Windows PowerShell 5 25/25; Linux pwsh 7.4 25/25; pinned Actionlint 1.7.12; docs/golden gates; diff/show; DCO. All three inline threads have evidence replies and are resolved. The prior Extended Workflow Lint red was a three-retry Docker Hub metadata timeout before checkout; the new exact-head run must still pass.

@codex review exact head b18b9a5, please.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b18b9a5c54

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/STATUS.md Outdated
Last Updated: 2026-07-27

Backend mutation-testing runway repair (2026-07-27, `#1500`):
- **The scheduled Domain mutation lane now reaches a bounded, artifact-backed result instead of failing before execution.** Stryker.NET is pinned to 4.16.0; an 18-check PowerShell preflight rejects obsolete schema keys, wrong solution/test context, workflow timeout drift, and non-failing artifact uploads; and the workflow runs from `Taskdeck.Domain.Tests` with a 180-minute ceiling. Backend-only run [30236307062](https://github.com/Chris0Jeky/Taskdeck/actions/runs/30236307062) on exact workflow head `307add004fbe142321a6ec11be21fab708824d5d` completed in 192 seconds: 3,682 mutants created, 2,351 killed, 576 survived, 2 timed out, 753 skipped, score 70.75%. The non-empty two-file `stryker-net-report` artifact is 874,386 bytes (SHA-256 `0e8a9a41b8cd484b6c267bd914c57cda0ffa973f59d8989e89038157605f21c8`). The score remains a non-blocking calibration signal; PR `#1503` and merge remain maintainer-held because the workflow changes operational CI posture.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Update canonical docs to the 25-check preflight

The final self-test now counts 4 valid contracts plus 21 rejected fixtures (Test-StrykerConfig.ps1:311-313), so this new source-of-truth entry's “18-check” claim is stale; the same incorrect count appears in docs/IMPLEMENTATION_MASTERPLAN.md:15. Update both canonical documents to 25 so their stated verification coverage matches the exact-head implementation.

AGENTS.md reference: AGENTS.md:L113-L118

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Valid P2. Exact head now runs 25 checks (4 valid / 21 rejected), while these two canonical summaries still say 18. The factual wording will be fixed in the next signed #1503 head, then docs/golden/preflight gates will be rerun and this thread resolved. That push is intentionally held until #1510 removes the repeatedly failing Workflow Lint bootstrap so the changed head can receive meaningful exact-head CI Extended proof rather than another identical pre-checkout failure.

@Chris0Jeky

Chris0Jeky commented Jul 27, 2026

Copy link
Copy Markdown
Owner Author

Final exact-head mutation proof — b18b9a5c54d7337fe4ba6aaf1eaa134896e63439

Backend-only run 30237563760 completed green on the current PR head:

  • frontend skipped;
  • preflight 25/25 (4 valid contracts, 21 rejected fixtures);
  • Domain context: 1,636 tests, 3,682 mutants;
  • 2,351 killed, 576 survived, 2 timed out, 753 skipped; score 70.75%;
  • Stryker step 243s; backend job 284s; overall run 292s;
  • exactly one non-expired stryker-net-report artifact: 878,708 bytes, two files, SHA-256 310e5aa214bdfc72a54c8971b625cf93779096c8d1b2622ae830595258c5fb63.

CodeQL and Required CI are fully green. CI Extended remains in progress, but Workflow Lint is red: its Docker action bootstrap failed before checkout after three Docker Hub metadata timeouts. That repeated substrate failure is tracked as #1510 and blocks this PR until repaired and re-proved. PR body contains this exact-head mutation evidence. Merge remains maintainer-only.

Edited to correct the original contemporaneous gate sentence: Workflow Lint had already failed when this comment was first posted.

@Chris0Jeky

Copy link
Copy Markdown
Owner Author

Exact-head gate classification

Required CI is now terminal green at b18b9a5c, including E2E. Backend-only mutation run 30237563760 is also green and produced the expected non-empty report artifact.

CI Extended run 30237518666 has the second consecutive Workflow Lint failure before checkout: the Docker action build for rhysd/actionlint@v1.7.12 exhausted three attempts fetching Docker Hub image metadata. This is not a workflow-syntax result and is not being dismissed as flaky.

Per the two-strike runway rule, #1510 now owns replacement of the Docker Hub bootstrap with a checksum-pinned Actionlint release install. This PR is project-Blocked until #1510 lands and this exact head is re-proved through CI Extended. No further mutation retry will be spent on the unchanged bootstrap.

Signed-off-by: Chris0Jeky <jeky.tck@gmail.com>

# Conflicts:
#	docs/IMPLEMENTATION_MASTERPLAN.md
#	docs/STATUS.md
#	docs/agentic/FAILURE_LEDGER.md
#	docs/agentic/failure_ledger.jsonl

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: beeb2529f0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +77 to +79
$thresholds.high -ne 80 -or
$thresholds.low -ne 60 -or
$thresholds.break -ne 0) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Enforce numeric threshold types before Stryker

When a threshold is accidentally quoted (for example, "high": "80") or replaced with a matching boolean, PowerShell's non-strict -ne comparisons coerce the expected number to the JSON value's type, allowing malformed thresholds to pass this supposedly fail-closed preflight. Stryker's threshold schema requires numeric values, so the subsequent mutation run can still reject the configuration and produce no evidence; validate the threshold value types explicitly and add quoted/boolean rejection fixtures.

Useful? React with 👍 / 👎.

cd backend
dotnet stryker --config-file stryker-config.json
# Install the workflow-pinned Stryker.NET version as a global tool (once).
dotnet tool install --global dotnet-stryker --version 4.16.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Handle an already-installed global Stryker tool

When a contributor previously followed this policy and already has another global dotnet-stryker version installed, dotnet tool install --global ... --version 4.16.0 does not replace that installation, so the documented local run either stops at installation or continues using the unpinned version that this change is intended to avoid. The .NET CLI provides dotnet tool update --global <PACKAGE_NAME> for changing an installed tool (Microsoft CLI documentation); make this sequence handle both fresh and existing installations.

Useful? React with 👍 / 👎.

$count = 0
$searchIndex = 0
while ($true) {
$matchIndex = $Block.IndexOf($ExpectedFragment, $searchIndex, [System.StringComparison]::Ordinal)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Anchor workflow fragments before accepting the contract

When the Stryker command is extended with an extra option such as --mutate SomeFile.cs or a shell operator such as || true, this IndexOf check still finds the expected command as a substring and the separate invocation counter still reports one command, so the preflight accepts changed mutation scope or failure semantics. The same behavior permits trailing step keys after the artifact fragment, including continue-on-error: true, which can defeat the advertised fail-closed upload; compare complete lines/steps or parse the YAML rather than accepting unanchored fragments.

Useful? React with 👍 / 👎.

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

Projects

Status: Blocked

Development

Successfully merging this pull request may close these issues.

[CI] Repair Stryker.NET config schema and prove backend mutation lane

1 participant