Skip to content

Releases: pgm1980/stryker-netx

v3.3.13 — INJ-001 Teil B: Constraint-Mutatoren entfernt (ADR-062)

Choose a tag to compare

@pgm1980 pgm1980 released this 15 Jun 07:42
f2eeae6

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)

Choose a tag to compare

@pgm1980 pgm1980 released this 15 Jun 02:04
ef2aece

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)

Choose a tag to compare

@pgm1980 pgm1980 released this 14 Jun 23:41
eaf2e84

Sprint 186 — zweiter Sprint des externen-360°-Test-Fix-Blocks (185–187). Drei niedrig-Risiko-Quick-Wins (ADR-060).

  • MAT-001 (Med) MathMutator mutierte Math.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) --solution bei 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)

Choose a tag to compare

@pgm1980 pgm1980 released this 14 Jun 23:16
d4d6c3b

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) RoslynSemanticDiagnosticsEquivalenceFilter filterte 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) ConservativeDefaultsEqualityFilter flaggte alle 8 unsigned-Kombis als äquivalent; nur 2 sind es. Positions-normalisiert.
  • EQF-002 (Low) IdentityArithmeticFilter struktur-basierte right-identity (x+0→x-0 / x*1→x/1 jetzt gefangen); IdempotentBooleanFilter ehrlich 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

Choose a tag to compare

@pgm1980 pgm1980 released this 12 Jun 15:42
883ea4c

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: RegisterCoverage lief 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 Kategorie Linq — 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

Choose a tag to compare

@pgm1980 pgm1980 released this 12 Jun 14:41
ace6848

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-framework erreichten nur die parallele MSBuild-Evaluation — die Roslyn-Sicht (Quelldateien, Referenzen, Output-Pfade) blieb Debug/Erst-TFM; mutierte Assemblies landeten in bin\Debug trotz Release-Builds. Der Resolver baut die Workspace jetzt einmal pro Lauf mit den Pins. Probe: Injektion in bin\Release\… ✓
  • #291 — Multi-TFM-Projekte laufen ohne --target-framework durch (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 deckte Language not supported als 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 konnte main auf maintenance auflösen — stiller falscher Diff-Base. Jetzt exaktes Segment-Matching; der historische Default master fällt mit Warnung auf main zurü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

Choose a tag to compare

@pgm1980 pgm1980 released this 12 Jun 13:38
5c94121

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 CompilationException statt 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): WaitEnd mit 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

Choose a tag to compare

@pgm1980 pgm1980 released this 12 Jun 12:09
c9c3e11

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 NoOpMutationFilter als 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 Ignored mit Equivalent 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 CompileError markiert; 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 Pending in den Final-Report. Sie werden jetzt score-neutral als Ignored mit 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

Choose a tag to compare

@pgm1980 pgm1980 released this 12 Jun 11:19
d0756a4

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): IsPatternExpressionMutator mutiert keine Patterns mehr, die eine Variable binden (x is string s → is not bricht 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. ContainsDeclarations erkennt 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

Choose a tag to compare

@pgm1980 pgm1980 released this 11 Jun 22:05
a147228

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 → typloses default-Literal)
  • #294: TestIdentifierList.Contains war 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 und goto case erzeugen 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