fix(mutation-testing): drop false --since for Stryker4s; add write-regime column - #2753
Conversation
…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>
|
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 finished @kyle-sexton's task in 38s —— View job Security Review
Scope: 3 files changed — 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 |
|
Last security-reviewed head: |
There was a problem hiding this comment.
💡 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".
|
Claude finished @kyle-sexton's task in 2m 27s —— View job Code review:
|
|
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 finished @cursor[bot]'s task in 2m 45s —— View job Code review:
|
Co-authored-by: Kyle Sexton <kyle-sexton@users.noreply.github.com>
…-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 finished @cursor[bot]'s task in 43s —— View job Code review:
|
…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>
Closes #2749
Summary
tooling.mdtold agents to pass--sincefor 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):--since→none(no git-diff scoping switch in the published options list).--incremental, with--incrementalFilenoted (already correct; re-verified).--since[:<target>]and--git-diff-lines(re-verified real).inPlacefor 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.Verification
Re-fetched upstream docs on 2026-08-15:
--incremental/--incrementalFile/inPlacedefaultfalse--since[:<target>]; no in-place option in options list--since, no in-place option--git-diff-lines/--git-diff-base/--git-diff-filterLocal gates:
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.