Skip to content

fix(mutation-testing): drop false --since for Stryker4s; add write-regime column - #2753

Merged
kyle-sexton merged 3 commits into
mainfrom
cursor/2749-stryker-since-8f91
Aug 15, 2026
Merged

fix(mutation-testing): drop false --since for Stryker4s; add write-regime column#2753
kyle-sexton merged 3 commits into
mainfrom
cursor/2749-stryker-since-8f91

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

Closes #2749

Summary

tooling.md told agents to pass --since for Stryker4s (and the issue also called out StrykerJS). That flag is Stryker.NET-only; inventing it makes Phase 2 fail and invites a whole-project fallback. This PR corrects the table against current upstream docs and adds the write-regime column Phase 0 needs.

Fix

In plugins/mutation-testing/skills/principles/reference/tooling.md (plugin bumped to 0.2.1):

  • Stryker4s diff-scoping: --sincenone (no git-diff scoping switch in the published options list).
  • StrykerJS diff-scoping: left as --incremental, with --incrementalFile noted (already correct; re-verified).
  • Stryker.NET / Infection: left as --since[:<target>] and --git-diff-lines (re-verified real).
  • New column: Write-regime settinginPlace for StrykerJS; none — … where the regime is a constant (Stryker.NET / Stryker4s / Infection by enumeration; PIT's documented in-memory guarantee; mutmut's ≤2.x / ≥3.0.0 boundary), with evidence classes kept separate so a negative-by-enumeration is not promoted to a documented guarantee.
  • Fetched date updated to 2026-08-15; source links pointed at the specific docs pages used for re-verification.

Verification

Re-fetched upstream docs on 2026-08-15:

Claim Source
StrykerJS --incremental / --incrementalFile / inPlace default false https://stryker-mutator.io/docs/stryker-js/incremental/, https://stryker-mutator.io/docs/stryker-js/configuration/
Stryker.NET --since[:<target>]; no in-place option in options list https://stryker-mutator.io/docs/stryker-net/configuration/
Stryker4s: no --since, no in-place option https://stryker-mutator.io/docs/stryker4s/configuration/
Infection --git-diff-lines / --git-diff-base / --git-diff-filter https://infection.github.io/guide/command-line-options.html
PIT in-memory guarantee https://pitest.org/faq/

Local gates:

scripts/check-changelog-parity.sh --check              # PASS
scripts/check-changelog-parity.sh --check-bump origin/main   # PASS
scripts/check-changelog-parity.sh --check-preserved origin/main  # PASS
scripts/check-changelog-parity.sh --check-order        # PASS
markdownlint-cli2 tooling.md CHANGELOG.md              # 0 issues

Table spot-check: Stryker4s row is none / none — fixed out-of-tree; only Stryker.NET retains --since[:<target>].

Related

Refs #2680 / PR #2715 — where this surfaced; deliberately not widened into that PR.

…gime column

tooling.md claimed --since for Stryker4s (Stryker.NET-only). Correct to none,
keep StrykerJS as --incremental, and add the Phase 0 write-regime column.

Closes #2749

Co-authored-by: Kyle Sexton <kyle-sexton@users.noreply.github.com>
@cursor

cursor Bot commented Aug 15, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@claude

claude Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 38s —— View job


Security Review

  • Gather context (PR diff, changed files)
  • Understand the request (security review of this PR per /review:security-review)
  • Review changed files for security issues
  • Post final findings

Scope: 3 files changed — plugins/mutation-testing/.claude-plugin/plugin.json (version bump), plugins/mutation-testing/CHANGELOG.md (changelog entry), and plugins/mutation-testing/skills/principles/reference/tooling.md (reference table content/prose).

Findings: none.

This PR is a documentation-only change: a version bump string, a changelog entry, and edits to a markdown reference table describing mutation-testing CLI flags and write-regime behavior for external tools (StrykerJS, Stryker.NET, Stryker4s, PIT, Infection, mutmut). There is no executable code, no scripts, no shell/CLI invocation logic, no user-input handling, no secrets, no dependency changes, and no CI/workflow changes in this diff — nothing that introduces a trust-boundary, injection, or authz/authn concern. The referenced upstream doc URLs are informational citations, not fetched/executed by any tooling in this repo.

I did not run /review:security-review's full orchestration (skill invocation returned an error in this environment), but a direct manual review of the full diff (git diff origin/main...HEAD) confirms there is no security-relevant surface to assess here.

@github-actions

Copy link
Copy Markdown

Last security-reviewed head: c1e2fd4e184717dde79a4671987610375ff8ef2a. On the next push, the relevance gate compares only the commits since this SHA; delete this comment to force a full re-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: c1e2fd4e18

ℹ️ 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 plugins/mutation-testing/skills/principles/reference/tooling.md Outdated
Comment thread plugins/mutation-testing/skills/principles/reference/tooling.md Outdated
@claude

claude Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 2m 27s —— View job


Code review: /review:code-review

  • Gather context (PR diff, CLAUDE.md, REVIEW.md)
  • Run skip-gate checks
  • Review changed files for correctness/maintainability
  • Post findings (inline + summary)

Skip-gate: PR is open, not a draft, and the change is a substantive doc-correctness fix (not trivial/automated) — proceeded with full review.

Scope: plugins/mutation-testing/{.claude-plugin/plugin.json, CHANGELOG.md, skills/principles/reference/tooling.md} — a documentation-only fix removing an invented --since flag for Stryker4s and adding a Write-regime setting column.

Findings

None that clear the high-signal bar. No inline comments posted.

Notes (not findings, for transparency)

  • External factual claims are author-claimed and unverified by me. This lane doesn't have web access in this run, so I could not independently re-fetch the Stryker4s/Stryker.NET/StrykerJS/Infection/PIT/mutmut docs to confirm the table's claims (e.g., that Stryker4s truly has no git-diff scoping flag, or that inPlace defaults to false in StrykerJS). The claims are internally consistent with what's cited in the PR body and match my own background knowledge of these tools, but I'm flagging that as unverified rather than confirmed, per this lane's evidence bar.
  • Internal consistency checked and clean:
    • No other file in the plugin (audit/SKILL.md, setup/SKILL.md, principles/SKILL.md, operators-and-states.md, evals.json) references the old (incorrect) --since claim for Stryker4s or otherwise goes stale against this table change — verified via grep across the plugin dir.
    • plugin.json version bump (0.2.0 → 0.2.1) and the new ## [0.2.1] CHANGELOG.md heading satisfy scripts/check-changelog-parity.sh's bump/preserved/order/reverse-parity invariants (traced the script logic manually against this diff — bumped-candidate scoping, fork-point heading preservation, and the reverse "changelog ahead of manifest" check all resolve cleanly).
    • Table formatting and prose additions in tooling.md don't trip any enabled markdownlint rule (MD013 line-length is disabled repo-wide, so the long table rows are fine).
    • The new "Write-regime setting" column's evidence-class breakdown (named key vs. constant-by-enumeration vs. documented guarantee vs. version-boundary) is stated coherently and doesn't blend evidence tiers.

Small, well-scoped, self-consistent doc fix. Nothing here would block merge.

@github-actions

github-actions Bot commented Aug 15, 2026

Copy link
Copy Markdown

Claude has reviewed this PR 3 times. The lane skips further automatic reviews after 5; deleting this comment resets the count.

Merge main (0.3.0) and bump to 0.3.1. Teach the Write-regime column the
full out-of-tree / whole-file / per-mutant regimes Phase 0 gates on, and
require line-level scope (or the manual protocol) when Diff-scoping is none.

Co-authored-by: Kyle Sexton <kyle-sexton@users.noreply.github.com>
@claude

claude Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

Claude finished @cursor[bot]'s task in 2m 45s —— View job


Code review: /review:code-review

  • Gather context (PR diff, CLAUDE.md, changed files)
  • Invoke /review:code-review and follow its instructions
  • Review changed files, check consistency with audit/SKILL.md and Codex's open review comments
  • Post final summary

Skip-gate: PR is open, not draft, and this is a substantive doc-correctness fix — proceeded with full review.

Scope: plugins/mutation-testing/{.claude-plugin/plugin.json, CHANGELOG.md, skills/principles/reference/tooling.md} — corrects the invented --since flag for Stryker4s and adds a Write-regime setting column.

Findings

None that clear the high-signal bar. No inline comments posted.

On the two open Codex review comments

Both of Codex's comments (P1 "distinguish per-mutant from whole-file in-place writes", P2 "preserve line-level scope when no diff switch exists") were posted against the PR's first commit (c1e2fd4). This PR's second commit (251ccfe, "resolve main conflicts; three-way write regime" — the current HEAD) already addresses both:

  • P1c1e2fd4's Write-regime column only had inPlace (default false) for StrykerJS and "≤2.x in-place" for mutmut, collapsing whole-file vs per-mutant into one label. Current HEAD splits it three ways: StrykerJS inPlace: true → "in-tree whole-file (schemata rewrite once)"; mutmut ≤2.x → "in-tree per-mutant". See tooling.md#L18 and #L23, which now match audit/SKILL.md's three-regime gate (out-of-tree / in-tree whole-file / in-tree per-mutant) verbatim.
  • P2c1e2fd4's diff-scoping prose said none should fall back to "the tool's file/mutate selection or the manual protocol," permitting a file-level selector. Current HEAD replaces that with an explicit prohibition: a file-level selector "cannot express" line-level scope and "will mutate every site in a large file for a tiny diff," so none now requires the manual protocol unless the tool can express changed-line scope. See tooling.md#L27-L33.

Both are resolved as of the current head; no action needed.

Other checks (clean)

  • Internal consistency: grepped the whole plugin for Stryker4s, --since, inPlace, in-place — no other file (audit/SKILL.md, principles/evals/evals.json, suppression.md) carries a stale reference to the old (incorrect) Stryker4s --since claim.
  • Version/changelog parity: plugin.json version (0.3.1) matches the new ## [0.3.1] CHANGELOG.md heading.
  • External factual claims remain author-claimed and unverified by me — this lane has no web access in this run (WebFetch denied), so I could not independently re-fetch the Stryker4s/StrykerJS/mutmut docs cited in the PR body. They're internally consistent with the table and with my own background knowledge, but treat them as unverified rather than confirmed.
  • Minor, non-blocking: the PR description says "plugin bumped to 0.2.1," but the actual diff bumps 0.3.00.3.1. Doesn't affect the code change, just a stale line in the PR body.

Small, well-scoped, self-consistent doc fix that also closes out both outstanding bot review comments. Nothing here would block merge.

Co-authored-by: Kyle Sexton <kyle-sexton@users.noreply.github.com>
@kyle-sexton
kyle-sexton merged commit 4776575 into main Aug 15, 2026
41 checks passed
@kyle-sexton
kyle-sexton deleted the cursor/2749-stryker-since-8f91 branch August 15, 2026 20:33
kyle-sexton added a commit that referenced this pull request Aug 15, 2026
…-no-checkout

#2753 published mutation-testing 0.3.1 for the Stryker4s --since correction and
the write-regime column, taking the number this branch had claimed. Renumbered
to 0.3.2 above it; both entries kept, theirs under the released 0.3.1 heading
and mine under a new one, so no published heading is reused or dropped.

No content collision. #2753 edited principles/reference/tooling.md, which this
branch does not touch, and its write-regime column complements Phase 0's
three-regime resolution in SKILL.md rather than restating it — the table gives
the per-tool key to read, the skill gives what to do with it. The guard clause,
the deference clause, and the spoke pointer are untouched.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@claude

claude Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

Claude finished @cursor[bot]'s task in 43s —— View job


Code review: /review:code-review

  • Gather context (PR diff, changed files)
  • Invoke /review:code-review and follow its instructions
  • Run skip-gate checks
  • Post findings

Skip-gate triggered: PR is already merged.

Per /review:code-review's skip gate ("PR is closed or not open → stop early, say so in the summary, post nothing else"), this PR is closed to further review — it is already MERGED into main (the local git log on main already contains a later PR, #2757, confirming this). No inline comments were posted.

For reference, this PR previously received both a security review (no findings) and a code review (no high-signal findings — see the earlier Claude comments on this thread) before merging.

kyle-sexton added a commit that referenced this pull request Aug 15, 2026
…ty two ways (#2759)

**No linked issue.** Follow-up to #2737, which merged at `c8470efd`;
this is follow-through on findings against a merged change, not unmet
acceptance criteria of #2681, which stays closed.

#2737 tightened the aridity evidence bar to require a node kind from the
closed vocabulary, landed it in Phase 4 and the crosswalk row, and left
four other statements describing the looser rule. An independent
fresh-context lane auditing that change found them, plus one eval that
graded the new contract only partially. This is the remediation.

## The eval findings — the ones that matter

**Case 3 under-graded.** Its expected output asked for "a complete
proposed suppression entry whose `reason` names the behavior". A
five-key entry carrying `claim: arid(logging noise here)` — free prose,
no `kind=` — satisfies that wording, while both Phase 4 and
`context/suppression.md` reject it. **That wrong implementation passed
the case.** It now has to bind a node kind from the closed vocabulary,
and the case states outright that free prose in `claim` fails even when
the entry is otherwise complete and the reason is good.

**Case 11's prompt and expectation disagreed, and the fix belongs on the
PROMPT.** The prompt said "one arid" unqualified while the rewritten
expectation asserted no row for the *demonstrated* arid survivor and
"exactly two rows" — so an implementation reading the prompt correctly
answers **three** rows and fails the rubric. The prompt already
qualified the equivalent survivor's evidence status and not the arid
one; that asymmetry is the defect.

Patching the expectation instead would have made the suite agree with
whatever shipped, which is the specific pattern the verification lane
was dispatched to catch. Fixing the prompt keeps the expectation grading
the contract.

## The divergence findings

- **`docs/conventions/detector-findings/README.md`** — the
producer-registry row stated the aridity bar **without** the node-kind
half, in the same file as the crosswalk row that states it fully. One
document, one bar, two descriptions, and nothing to catch it:
`scripts/check-detector-findings-crosswalk.sh` validates the crosswalk
table and does not read the Adopters table.
- **`SKILL.md` Gotchas** — flatly called aridity's bar "a judgment about
value rather than about observable behavior", which is what Phase 4 now
says it is **otherwise**, the membership test being what makes it
checkable. It carries the same qualifier.
- **A two-hop pointer** — the node-kind vocabulary is enumerated in the
`principles` skill's `scaling-and-suppression.md`;
`context/suppression.md` owns the rule that a survivor fitting none is
not arid. Phase 4 attributed both to the latter. Naming each owner
directly matters most in a chain whose thesis is that a mechanic has one
owner reached by pointer.

## Versions

`0.3.0` and convention `2.0.0` shipped with #2737, and `0.3.1` then
shipped with #2753 while this branch was open — so all three are
history. This lands as **plugin `0.3.2`** and **convention `2.0.1`**
rather than editing published sections.

`check-changelog-parity.sh` caught the in-place edit twice: first when
`0.3.0` was still my working section, then again after `0.3.1` was taken
out from under me by a concurrent merge. `--check-preserved` passes
against a freshly fetched `main` (6 headings compared), which is the
check that proves no released entry was rewritten.

## Verification

Gates run against `main` as the base, not the old stack base:

```text
check-detector-findings-crosswalk.sh --check   -> Crosswalk OK: 4 rule row(s)
check-detector-findings-crosswalk.test.sh      -> all 16 self-tests pass
validate-plugins.sh                            -> Validation passed
check-changelog-parity.sh --check              -> pass
                          --check-order        -> pass
                          --check-bump         -> pass
                          --check-preserved    -> pass (6 headings compared)
check-changed-skills.sh origin/main            -> 1 skill checked, 0 failed
check-cross-plugin-source-drift.sh --check     -> pass
markdownlint-cli2 (1128 files)                 -> 0 issues
typos                                          -> 0
evals.json                                     -> parses, 14 cases
```

Re-run in full after merging `main` (which moved three times while this
was open), not carried over from the pre-merge run. Scope against a
freshly fetched `origin/main`: **6 files, +46 −10**.

## Related

- #2737 — the crosswalk hardening this corrects; merged at `c8470efd`.
- #2715 — the mutation-testing pilot whose Phase 4 owns the bar.
- #2681 — the crosswalk issue. Not reopened by this; the four items are
follow-through on a merged change rather than unmet acceptance criteria.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Kyle Sexton <kyle-sexton@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(mutation-testing): tooling.md names --since for StrykerJS and Stryker4s; neither has it

2 participants