Repository navigation
Releases: pgm1980/stryker-netx
Release list
v3.3.13 — INJ-001 Teil B: Constraint-Mutatoren entfernt (ADR-062)
INJ-001 Teil B endgültig gelöst — die beiden Generic-Constraint-Mutatoren wurden entfernt.
Vertiefte Analyse (MAXential 18 Gedanken + ToT + IL-Live-Probe) zeigte: Generic Constraints (where T : …) sind rein Compile-Time und erzeugen kein IL — eine Constraint-Mutation kann nur CompileError oder einen äquivalenten, unkillbaren Survivor ergeben, nie einen killbaren Mutanten. Die IL-Probe belegte byte-identische Method-Bodies mit/ohne Constraint. Die Mutatoren waren zudem redundant zu den Operator-Mutatoren. „Injizierbar machen" hätte die Performance-USP (ADR-021) gebrochen und den Score verfälscht — daher entfernt statt gefixt.
Änderungen
GenericConstraintMutator+GenericConstraintLoosenMutator(+ Tests) entfernt- Mutator-Katalog 52 → 50 (Defaults 26, Stronger 17, All-only 7)
- ADR-062 (supersedes ADR-061 Teil B)
Verifikation
Build 0/0 · Stryker.Core.Tests 562/562 · Dogfood 1239/1248 · Semgrep 0 · alle CI-Checks grün (build+test, e2e, ~30 integration-test-Matrix-Jobs).
INJ-001 ist damit endgültig geschlossen (Teil A in v3.3.12 / Sprint 187, Teil B in v3.3.13 / Sprint 188).
What's Changed
- chore(sprint-187): close Sprint 187 — Fix-Block 185–187 abgeschlossen by @pgm1980 in #322
- chore: Dogfood-Manifest-Pin auf v3.3.12 nachziehen by @pgm1980 in #323
- docs: README auf v3.3.12 / Sprint 187 aktualisieren by @pgm1980 in #324
- docs: Top-Level-Status-Docs (MEMORY/DEEP_MEMORY/Serena) auf v3.3.12 nachziehen by @pgm1980 in #325
- fix(sprint-188): INJ-001 Teil B — Constraint-Mutatoren entfernt (semantisches Modell-Limit, ADR-062) by @pgm1980 in #326
Full Changelog: v3.3.12...v3.3.13
v3.3.12 — INJ-001 (Sprint 187, Fix-Block-Abschluss)
Sprint 187 — dritter und letzter Sprint des externen-360°-Test-Fix-Blocks (185–187). INJ-001 (ADR-061), Analyse via MAXential+ToT + Live-Probe.
- Teil A (gefixt): MethodBodyReplacementMutator war nicht injizierbar (MethodDeclaration-OriginalNode in keinem Inject-Frame → CompileError-Soft-Fail). Zu einem BlockSyntax-Mutator umgebaut (zielt den direkten Method-Body-Block, wie BlockMutator; Type=Statement gegen IgnoreBlockMutantFilter). E2E bug03/bug02: 'Echo' CompileError → KILLED. Operator funktional.
- Teil B (vertagt → #279-Epic): GenericConstraint + GenericConstraintLoosen mutieren Signatur-Constraints, im Laufzeit-Schalt-Modell prinzipiell nicht injizierbar (Orchestrator besucht ConstraintClauses nie). Roadmap-Vorbild Loosen empirisch falsifiziert. Als nicht-injizierbar dokumentiert, nicht deaktiviert.
Build 0/0, Core 574/574, Dogfood 36/37, Semgrep 0. Fix-Block 185–187 abgeschlossen: 6/7 externe Bugs behoben + INJ-001 Teil A.
What's Changed
- chore(sprint-186): close Sprint 186 — all housekeeping items done by @pgm1980 in #320
- fix(sprint-187): INJ-001 — MethodBodyReplacement injizierbar; Constraint-Mutatoren als Modell-Limit dokumentiert (ADR-061) by @pgm1980 in #321
Full Changelog: v3.3.11...v3.3.12
v3.3.11 — Quick-Wins (Sprint 186)
Sprint 186 — zweiter Sprint des externen-360°-Test-Fix-Blocks (185–187). Drei niedrig-Risiko-Quick-Wins (ADR-060).
- MAT-001 (Med)
MathMutatormutierteMath.X(...)-Member-Aufrufe nie mit Semantic-Model (Member-Pfad prüfte ContainingType des Receiver-Typsymbols System.Math = null statt des Symbols). Fix:symbol?.ToString(). E2E bug03: Math.Ceiling-Member-Call wird jetzt mutiert (2 Math-Mutanten statt 1). - SOL-001 (Low)
--solutionbei cwd-Mismatch still ignoriert (IsSolutionContext an cwd==SolutionDir gebunden). Fix:IsSolutionContext => SolutionPath != null(SolutionPath nur via --solution gesetzt). - RUN-001 (Med) README-Kompatibilitäts-Tabelle korrigiert: Runner nur VsTest, Frameworks xUnit/MSTest/NUnit; MTP + TUnit als roadmapped (#3094, ADR-044).
Build 0/0, Core 572/572, Semgrep 0, E2E-Probe grün. 6 der 7 externen Bugs nun behoben.
What's Changed
- chore(sprint-185): close Sprint 185 — all housekeeping items done by @pgm1980 in #318
- fix(sprint-186): Quick-Wins — MathMutator-Semantic-Model, --solution-cwd, README (ADR-060) by @pgm1980 in #319
Full Changelog: v3.3.10...v3.3.11
v3.3.10 — Äquivalenz-Filter-Korrektheit (Sprint 185)
Sprint 185 — erster Sprint des externen-360°-Test-Fix-Blocks (185–187). Behebt den Äquivalenz-Filter-Cluster (EQF-001/003/002, ADR-059).
- EQF-001 (High)
RoslynSemanticDiagnosticsEquivalenceFilterfilterte Methodengruppen-Mutanten (StringMethod immer, Linq bei datei-level using) fälschlich als equivalent → killbare Mutanten still entfernt, Score aufgebläht. Fix: CandidateSymbols-Gate (beide Pfade). E2E: 8 Mutanten getestet statt ge-Ignored, Linq Min→Max Killed. - EQF-003 (Med)
ConservativeDefaultsEqualityFilterflaggte alle 8 unsigned-Kombis als äquivalent; nur 2 sind es. Positions-normalisiert. - EQF-002 (Low)
IdentityArithmeticFilterstruktur-basierte right-identity (x+0→x-0 / x*1→x/1 jetzt gefangen);IdempotentBooleanFilterehrlich als konzeptuell inert dokumentiert.
Build 0/0, Core 567/567, Semgrep 0, E2E-Probe grün. 3 bug-pinnende Tests korrigiert.
What's Changed
- chore(sprint-184): close — v3.3.9 shipped, Fahrplan 179–184 komplett by @pgm1980 in #316
- fix(sprint-185): Äquivalenz-Filter-Korrektheit — Methodengruppen, unsigned-Null, arithmetische Identitäten (ADR-059) by @pgm1980 in #317
Full Changelog: v3.3.9...v3.3.10
v3.3.9 — Backlog-Rest: Coverage-Perf 11,2×, Mutator-Kategorien, Typ-Gates Batch 1
Fix-Sprint 6/6 — Abschluss des 360°-Analyse-Fahrplans (Sprints 173–178 Analyse, 179–184 Fixes; ADR-058).
Fixes
- #287 — Coverage-Erfassung 11,2× schneller:
RegisterCoveragelief im User-Testprozess mit lock + List.Contains pro Mutationspunkt-Ausführung — quadratisches Verhalten. HashSet-Drop-in; BenchmarkDotNet (Release): 10.000 Mutanten 23.262 µs → 2.076 µs, 1.000: 375 → 203 µs. - #280 — Konstanten-Mutanten sind jetzt
Number: Sie meldeten mangels passender KategorieLinq—ignore-mutations: ['linq']deaktivierte sie still und Reports kategorisierten sie falsch. Additiver Enum-Member, bestehende Konfigurationen unverändert. - #279 Batch 1 — Typ-Gates gegen garantierte Compile-Errors (Epic bleibt offen): UOI mutiert keine nicht-inkrementierbaren Typen, get-only-Properties, readonly-Felder, Namespaces oder Methodengruppen mehr; die ROR-Ordnungs-Matrix verlangt geordnete Operanden (Null-Checks erzeugen keine vier CS0019-Mutanten mehr); Struct-Konstruktionen werden nicht zu null; async-Methoden bekommen die
default(T)-Form statt CS4016. Sechs Doku-Kommentare, die „classified as killed" behaupteten, sind korrigiert. CE-Probe (Profil All): 56 % → 29,4 % — verbleibende Compile-Errors gehören zu den bewusst offenen Epic-Klassen (Block-Removal, AsyncAwait). - H-25 — Threshold-Quervalidierung gegen Effektivwerte: Ein einzeln gesetzter Threshold konnte still ein inkonsistentes Tripel erzeugen.
- I-11 — MTP-Singleton-Guard: Multi-Mutant-Gruppen liefen still ohne aktive Mutation (False-Survivor-Klasse) — jetzt ein lauter Fehler, der die Pool-Invariante kodifiziert.
Verifikation
Build 0/0 · Vollsuite grün (10 Testprojekte, E2E 18/18) · Semgrep 0 · Benchmark-Delta dokumentiert · CE-Probe 56 % → 29,4 %.
Full Changelog: v3.3.8...v3.3.9
What's Changed
- chore(sprint-183): close — housekeeping done, v3.3.8 shipped by @pgm1980 in #314
- fix(sprint-184): Backlog-Rest — Coverage-Perf, Mutator-Kategorien, Typ-Gates Batch 1 (ADR-058) by @pgm1980 in #315
Full Changelog: v3.3.8...v3.3.9
v3.3.8 — Config & Nebenläufigkeit: Workspace-Pins, Multi-TFM, Init-Sequenz, Branch-Matching, SSE-Sync
Fix-Sprint 5/6 des 360°-Analyse-Fahrplans (ADR-057). Fünf Fixes gegen Optionen, die still nicht wirkten, und geteilten Zustand, der unter Nebenläufigkeit korrumpierte.
Fixes
- #290 — Konfigurations-Pins erreichen die Roslyn-Workspace:
--configuration/--target-frameworkerreichten nur die parallele MSBuild-Evaluation — die Roslyn-Sicht (Quelldateien, Referenzen, Output-Pfade) blieb Debug/Erst-TFM; mutierte Assemblies landeten inbin\Debugtrotz Release-Builds. Der Resolver baut die Workspace jetzt einmal pro Lauf mit den Pins. Probe: Injektion inbin\Release\…✓ - #291 — Multi-TFM-Projekte laufen ohne
--target-frameworkdurch (zwei Schichten): Das TFM-Listen-Fallback parst das erste Segment statt die Rohliste in den Framework-Parser zu kippen, UND der Loader pinnt die MSBuild-Evaluation aufs erste TFM — die Outer-Evaluation eines Multi-TFM-Projekts trägt keine per-Framework-Properties (die Live-Probe deckteLanguage not supportedals zweite Schicht auf). Probe: Exit 1 → Exit 0, Score berechnet ✓ - #296 — Multi-Projekt-Initialisierung sequenziell: Die Initial-Test-Sessions liefen konkurrent über unsynchronisierten VsTest-Kontext-Zustand (Korruption, Lost-Updates, falsche Timeout-Basis). Jetzt strikt sequenziell; der Lost-Update-Pfad in der Test-Registry ist entfernt.
- #299 — Exaktes Branch-Matching für
--since-target: Substring-Matching konntemainaufmaintenanceauflösen — stiller falscher Diff-Base. Jetzt exaktes Segment-Matching; der historische Defaultmasterfällt mit Warnung aufmainzurück; Kurz-SHAs (7–40 Hex) werden unterstützt; die Fehlermeldung nennt die Option. - #300 — Realtime-HTML stabil: Writer-Liste und Event-Queue sind synchronisiert; der Listener stirbt beim Shutdown nicht mehr als stiller Task-Fault; das Schließen des SSE-Endpoints ist best-effort — vorher konnte ein getrennter Browser-Client die Reporter-Kette brechen und Json-/Baseline-Reports am Laufende verschlucken.
Verifikation
Build 0/0 · Vollsuite grün (10 Testprojekte, E2E 18/18) · Semgrep 0 · Live-Proben P-5 (Release-Injektion) und P-6 (Multi-TFM Exit 0) bestanden.
Full Changelog: v3.3.7...v3.3.8
What's Changed
- chore(sprint-182): close — housekeeping done, v3.3.7 shipped by @pgm1980 in #312
- fix(sprint-183): Config & Nebenläufigkeit — Workspace-Pins, Multi-TFM, Init-Sequenz, Branch-Matching, SSE-Sync (ADR-057) by @pgm1980 in #313
Full Changelog: v3.3.7...v3.3.8
v3.3.7 — Robustheit: Crash-, Hang- und Parse-Härtung
Fix-Sprint 4/6 des 360°-Analyse-Fahrplans (ADR-056). Acht Fixes in drei Klassen — ein Mutationstest-Lauf darf weder an einem Mutator-Bug sterben noch an toter Infrastruktur ewig hängen.
Crash-Klasse (#277, P1)
- RegexMutator stürzte auf interpolierten Patterns (
new Regex($"^{prefix}"), Level Advanced+) mit InvalidCastException ab — Exit 127, kein Report. Interpolierte Patterns werden jetzt sauber übersprungen. - Neue Robustheitsschicht um die Mutator-Schleife: ein Mutator-Bug überspringt den Mutator für diesen Knoten mit Warnung (Mutator-Name, Node-Kind, Issue-Hinweis) statt den Lauf zu töten. Cancellation propagiert weiterhin.
Hang-Klasse (#288, #297)
- Roslyn-Emit-NRE-Retry begrenzt (#288): kein Scan-Fortschritt oder mehr als 5 Runden → diagnostizierbare
CompilationExceptionstatt Endlosschleife. - VsTest-Runner-Pool (#297a): Konstruktions-Fehler (vstest.console fehlt) werden beobachtet und signalisiert; Warten ist auf 5 Minuten begrenzt mit Fortschritts-Logs und Fail-fast samt Ursache.
- Test-Discovery (#297b):
WaitEndmit 5-Minuten-Timeout in den Aborted-Pfad statt Monitor.Wait für immer. - MTP-Disconnect (#297c): ein toter Server settled jetzt alle wartenden Listener mit der Disconnect-Ursache — timeout-lose Waits (Discovery, Initial-Runs) enden sauber.
Parse-Klasse (H-19, G-37b)
- MSBuild-Properties („yes", „high"), stale Referenzpfade, unlesbare Solution-Dateien und unbekannte Status-Werte aus Fremd-Baselines führen nicht mehr zu rohen Exceptions — TryParse-Fallbacks, Existenz-Guard und saubere
InputException.
Verifikation
Build 0/0 · Vollsuite grün (10 Testprojekte, E2E 18/18) · Semgrep 0 · Crash-Probe: interpolierter Regex + Advanced → Exit 0 statt Exit 127, sauberer Report.
Full Changelog: v3.3.6...v3.3.7
What's Changed
- chore(sprint-181): close — housekeeping done, v3.3.6 shipped by @pgm1980 in #310
- fix(sprint-182): Robustheit — Crash-, Hang- und Parse-Härtung (ADR-056) by @pgm1980 in #311
Full Changelog: v3.3.6...v3.3.7
v3.3.6 — Score-Integrität: Geister-Mutanten, No-op-Filter, sichtbare Filter-Entscheidungen
Fix-Sprint 3/6 des 360°-Analyse-Fahrplans (ADR-055). Vier Befunde behoben, die den Mutation-Score leise verfälschten — durch False Survivors, unsichtbare Mutanten-Verluste und schema-fremde Report-Stati.
Fixes
- G-17 (False Survivors): Neuer
NoOpMutationFilterals Filter #0 — Mutationen, deren Replacement strukturell dem Original entspricht (z. B. eine Type-driven-Return-Mutation auf den bereits vorhandenen Wert), überlebten jeden Test und drückten den Score. Der trivia-insensitive Baum-Vergleich fängt die gesamte Klasse zentral. - G-19 (unsichtbare Verluste): Equivalence-gefilterte Mutationen erscheinen jetzt als
IgnoredmitEquivalent mutant (filter: <Id>)im Report (wie Upstream) statt spurlos verworfen zu werden. Sie werden registriert, aber nie ins Assembly injiziert. - #286/G-15 (Geister-Mutanten): Das Orchestrierungs-Sicherheitsnetz (ADR-032) verwarf slot-inkompatible mutierte Subtrees nur mit Debug-Log — die enthaltenen, bereits registrierten Mutanten endeten als „NoCoverage"-Geister oder False Survivors. Verworfene Subtrees werden jetzt gemeldet und die betroffenen Mutanten als
CompileErrormarkiert; ein generischer Geister-Detektor sichert das in den Integrationstests über alle historischen Crash-Patterns ab. - J-01 (Report-Vertrag): Mutanten, die die Testsession nicht bewerten konnte, liefen mit dem schema-fremden Status
Pendingin den Final-Report. Sie werden jetzt score-neutral alsIgnoredmit Begründung finalisiert und erreichen das Realtime-Reporting genau einmal.
Verifikation
Build 0/0 · Vollsuite grün (10 Testprojekte, E2E 18/18) · Semgrep 0 Findings (11 Src-Dateien) · Geister-Detektor grün über alle 10 historischen Patterns.
Full Changelog: v3.3.5...v3.3.6
What's Changed
- chore(sprint-180): close — housekeeping done, v3.3.5 shipped by @pgm1980 in #308
- fix(sprint-181): Score-Integrität — Geister-Mutanten, No-op-Filter, sichtbare Filter-Entscheidungen (ADR-055) by @pgm1980 in #309
Full Changelog: v3.3.5...v3.3.6
v3.3.5 — CE-Noise I: Designation-Patterns & TrackValue-Marker
Fix-Sprint 2/6 des 360°-Analyse-Fahrplans (ADR-054). Drei CE-Klassen eliminiert, die zusammen 62,5 % Compile-Error-Rate auf der Probe-Datei trugen — nach diesem Release: 0 %.
Fixes
- #278 (CS0165):
IsPatternExpressionMutatormutiert keine Patterns mehr, die eine Variable binden (x is string s→is notbricht Definite Assignment jeder späteren Nutzung). Discard-Designationen bleiben mutierbar. - #284 (CS0128): Mutationen in designation-tragenden is-Patterns (Relational-/Binary-Pattern-Operatoren, Konstanten in geschachtelten Patterns) werden auf Block-Ebene kontrolliert statt als Ternary am is-Ausdruck — der Wrap duplizierte die Designation im selben Statement-Scope.
ContainsDeclarationserkennt jetzt auch Recursive-/Var-/List-Pattern-Designationen (Lambda-scoped bleibt ausgeschlossen). - #285 (CS8754/CS0266): Der
TrackValue-Static-Tracking-Marker wird nicht mehr auf target-typed Initializern (= new();) oder mutationsfreien Konstanten (byte x = 5;) platziert — bisher räumte erst eine stille Rollback-Heilrunde (mutant −1, Extra-Compile-Runde) den Marker ab. Initializer mit User-Code behalten den Marker (transitives Static-Context-Tracking, per Test gepinnt). Property-Initializer-Pfad jetzt wie der Field-Pfad auf Coverage-Logik gegated. - Deps: Transitiver Pin
MessagePack 2.5.301(GHSA-hv8m-jj95-wg3x / CVE-2026-48109 in 2.5.198 via StreamJsonRpc; brach den ersten v3.3.5-Release-Restore mit NU1903).
Verifikation
Build 0/0 · Vollsuite grün (8 Testprojekte, E2E 18/18) · Semgrep 0 · Probe-1 CE-Rate 62,5 % → 0 % · Debug-Log ohne Heilrunde · Locked-Mode-Restore clean.
Full Changelog: v3.3.4...v3.3.5
What's Changed
- chore(sprint-179): close Sprint 179 — all housekeeping items done (v3.3.4 shipped) by @pgm1980 in #305
- fix(sprint-180): CE-Noise I — Designation-Patterns & TrackValue-Marker (ADR-054) by @pgm1980 in #306
- fix(deps): pin MessagePack 2.5.301 — release-gate NU1903 (GHSA-hv8m-jj95-wg3x) by @pgm1980 in #307
Full Changelog: v3.3.4...v3.3.5
v3.3.4 — Quick-Wins + P1 aus dem 360°-Analyse-Programm
Erster Fix-Sprint (179) des 360°-Fahrplans (_docs/analysis/sprint_178_synthesis.md). Details: ADR-053.
Fixes
- P1 #282: C# 14 typlose out-Lambda-Parameter (
(out v) => …) crashen nicht mehr den gesamten Lauf (unhandled NRE → typlosesdefault-Literal) - #294:
TestIdentifierList.Containswar invertiert — korrigiert + erste Vertragstests der Mengen-API - #295: MsTest-Erkennung setzte das Flag nie (
&= ~statt|=) →<DisableParallelization>greift jetzt für MsTest-Suiten - #283: String-/Konstanten-Mutationen in
case-Labels undgoto caseerzeugen keine garantierten CompileErrors mehr (Konstanten-Kontext gefenced) - #292: Test-Enrichment übersteht VsTest-Metadaten ohne Quellinfo (LineNumber 0, fehlende Methodendeklaration)
- #273: Flaky-Timeout-Test deterministisch
- #274: Dogfood-Config des MTP-Moduls (vendored
test-runner: mtp-Key entfernt) - #302: H-05 (FindProjectFile fail-fast auf Nicht-Projektdateien), J-11 (Config-Pfad-Probe)
Außerdem
G-01-Mechanik-Korrektur auf #279: Der needReturn-Pfad liefert das Ending-Return bereits; Proben-Block-CEs waren Rollback-Kollateral (echte Ursache #284/#278 → nächster Sprint). Pin-Test ergänzt.
Verifikation: Build 0/0 · Vollsuite grün (E2E-Erstlauf-Flakes sauber re-validiert) · Semgrep 0 · Live-Proben: P-4 Exit 127→0, Probe-1 Case-Label-CE-Klasse eliminiert.
What's Changed
- chore(sprint-172): close Sprint 172 — all housekeeping items done (v3.3.3 shipped) by @pgm1980 in #275
- analysis(sprint-173): 360°-Analyse A — Mutatoren-Katalog komplett, 41 Findings (kein Tag) by @pgm1980 in #281
- analysis(sprint-174): 360°-Analyse B — Mutations-Pipeline komplett, 39 Findings, 4 Proben, #282 P1 (kein Tag) by @pgm1980 in #289
- analysis(sprint-175): 360°-Analyse C — Initialisation/Utilities/Solutions/Configuration komplett, 28 Findings, 3 Proben (kein Tag) by @pgm1980 in #293
- analysis(sprint-176): 360°-Analyse D — Test-Runner-Kette komplett, 16 Findings, #274-Root-Cause bestätigt (kein Tag) by @pgm1980 in #298
- analysis(sprint-177): 360°-Analyse E — Reporters/Baseline/CLI/Abstractions/Helpers, 15 Findings (kein Tag) by @pgm1980 in #301
- analysis(sprint-178): Synthese F — Programm-Abschluss, Fix-Backlog + Fahrplan 179–184 (kein Tag) by @pgm1980 in #303
- fix(sprint-179): Quick-Wins + P1 aus dem 360°-Fahrplan — v3.3.4-Vorbereitung (ADR-053) by @pgm1980 in #304
Full Changelog: v3.3.3...v3.3.4