evilution 0.23.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/.beads/interactions.jsonl +210 -0
  3. data/CHANGELOG.md +51 -0
  4. data/README.md +81 -4
  5. data/exe/evil +6 -0
  6. data/lib/evilution/ast/source_surgeon.rb +15 -1
  7. data/lib/evilution/cli/commands/compare.rb +68 -0
  8. data/lib/evilution/cli/parser/command_extractor.rb +78 -0
  9. data/lib/evilution/cli/parser/file_args.rb +41 -0
  10. data/lib/evilution/cli/parser/options_builder.rb +123 -0
  11. data/lib/evilution/cli/parser/stdin_reader.rb +28 -0
  12. data/lib/evilution/cli/parser.rb +27 -196
  13. data/lib/evilution/cli/printers/compare.rb +159 -0
  14. data/lib/evilution/cli.rb +1 -0
  15. data/lib/evilution/compare/categorizer.rb +109 -0
  16. data/lib/evilution/compare/detector.rb +21 -0
  17. data/lib/evilution/compare/fingerprint.rb +83 -0
  18. data/lib/evilution/compare/normalizer.rb +106 -0
  19. data/lib/evilution/compare/record.rb +16 -0
  20. data/lib/evilution/compare.rb +15 -0
  21. data/lib/evilution/config.rb +178 -3
  22. data/lib/evilution/example_filter.rb +143 -0
  23. data/lib/evilution/integration/base.rb +11 -57
  24. data/lib/evilution/integration/crash_detector.rb +5 -2
  25. data/lib/evilution/integration/minitest.rb +25 -7
  26. data/lib/evilution/integration/minitest_crash_detector.rb +5 -2
  27. data/lib/evilution/integration/rspec.rb +99 -12
  28. data/lib/evilution/isolation/fork.rb +26 -0
  29. data/lib/evilution/isolation/in_process.rb +1 -0
  30. data/lib/evilution/mcp/info_tool.rb +77 -5
  31. data/lib/evilution/mcp/mutate_tool/config_builder.rb +20 -0
  32. data/lib/evilution/mcp/mutate_tool/error_payload.rb +17 -0
  33. data/lib/evilution/mcp/mutate_tool/option_parser.rb +54 -0
  34. data/lib/evilution/mcp/mutate_tool/progress_streamer.rb +37 -0
  35. data/lib/evilution/mcp/mutate_tool/report_trimmer.rb +31 -0
  36. data/lib/evilution/mcp/mutate_tool/survived_enricher.rb +52 -0
  37. data/lib/evilution/mcp/mutate_tool.rb +34 -186
  38. data/lib/evilution/mutation.rb +43 -3
  39. data/lib/evilution/mutator/base.rb +39 -1
  40. data/lib/evilution/mutator/operator/argument_nil_substitution.rb +5 -1
  41. data/lib/evilution/mutator/operator/argument_removal.rb +5 -1
  42. data/lib/evilution/parallel/work_queue.rb +149 -31
  43. data/lib/evilution/parallel_db_warning.rb +68 -0
  44. data/lib/evilution/reporter/cli.rb +38 -11
  45. data/lib/evilution/reporter/html/assets/style.css +85 -0
  46. data/lib/evilution/reporter/html/baseline_keys.rb +28 -0
  47. data/lib/evilution/reporter/html/diff_formatter.rb +27 -0
  48. data/lib/evilution/reporter/html/escape.rb +12 -0
  49. data/lib/evilution/reporter/html/namespace.rb +11 -0
  50. data/lib/evilution/reporter/html/report.rb +68 -0
  51. data/lib/evilution/reporter/html/section.rb +21 -0
  52. data/lib/evilution/reporter/html/sections/baseline_comparison.rb +46 -0
  53. data/lib/evilution/reporter/html/sections/error_details.rb +30 -0
  54. data/lib/evilution/reporter/html/sections/error_entry.rb +22 -0
  55. data/lib/evilution/reporter/html/sections/file_section.rb +62 -0
  56. data/lib/evilution/reporter/html/sections/header.rb +29 -0
  57. data/lib/evilution/reporter/html/sections/mutation_map.rb +32 -0
  58. data/lib/evilution/reporter/html/sections/neutral_details.rb +25 -0
  59. data/lib/evilution/reporter/html/sections/summary_cards.rb +11 -0
  60. data/lib/evilution/reporter/html/sections/survived_details.rb +35 -0
  61. data/lib/evilution/reporter/html/sections/survived_entry.rb +36 -0
  62. data/lib/evilution/reporter/html/sections/truncation_notice.rb +17 -0
  63. data/lib/evilution/reporter/html/sections/unparseable_details.rb +25 -0
  64. data/lib/evilution/reporter/html/sections/unresolved_details.rb +25 -0
  65. data/lib/evilution/reporter/html/sections.rb +4 -0
  66. data/lib/evilution/reporter/html/stylesheet.rb +14 -0
  67. data/lib/evilution/reporter/html/templates/baseline_comparison.html.erb +8 -0
  68. data/lib/evilution/reporter/html/templates/error_details.html.erb +6 -0
  69. data/lib/evilution/reporter/html/templates/error_entry.html.erb +10 -0
  70. data/lib/evilution/reporter/html/templates/file_section.html.erb +12 -0
  71. data/lib/evilution/reporter/html/templates/header.html.erb +4 -0
  72. data/lib/evilution/reporter/html/templates/mutation_map.html.erb +6 -0
  73. data/lib/evilution/reporter/html/templates/neutral_details.html.erb +14 -0
  74. data/lib/evilution/reporter/html/templates/report.html.erb +17 -0
  75. data/lib/evilution/reporter/html/templates/summary_cards.html.erb +26 -0
  76. data/lib/evilution/reporter/html/templates/survived_details.html.erb +21 -0
  77. data/lib/evilution/reporter/html/templates/survived_entry.html.erb +8 -0
  78. data/lib/evilution/reporter/html/templates/truncation_notice.html.erb +1 -0
  79. data/lib/evilution/reporter/html/templates/unparseable_details.html.erb +11 -0
  80. data/lib/evilution/reporter/html/templates/unresolved_details.html.erb +11 -0
  81. data/lib/evilution/reporter/html.rb +11 -390
  82. data/lib/evilution/reporter/json.rb +19 -9
  83. data/lib/evilution/reporter/suggestion/diff_helpers.rb +28 -0
  84. data/lib/evilution/reporter/suggestion/registry.rb +64 -0
  85. data/lib/evilution/reporter/suggestion/templates/generic.rb +55 -0
  86. data/lib/evilution/reporter/suggestion/templates/minitest.rb +659 -0
  87. data/lib/evilution/reporter/suggestion/templates/rspec.rb +613 -0
  88. data/lib/evilution/reporter/suggestion.rb +8 -1327
  89. data/lib/evilution/result/mutation_result.rb +9 -1
  90. data/lib/evilution/result/summary.rb +21 -1
  91. data/lib/evilution/runner/baseline_runner.rb +92 -0
  92. data/lib/evilution/runner/diagnostics.rb +105 -0
  93. data/lib/evilution/runner/isolation_resolver.rb +134 -0
  94. data/lib/evilution/runner/mutation_executor.rb +325 -0
  95. data/lib/evilution/runner/mutation_planner.rb +126 -0
  96. data/lib/evilution/runner/report_publisher.rb +60 -0
  97. data/lib/evilution/runner/subject_pipeline.rb +121 -0
  98. data/lib/evilution/runner.rb +61 -692
  99. data/lib/evilution/source_ast_cache.rb +39 -0
  100. data/lib/evilution/spec_ast_cache.rb +166 -0
  101. data/lib/evilution/spec_resolver.rb +6 -1
  102. data/lib/evilution/spec_selector.rb +39 -0
  103. data/lib/evilution/temp_dir_tracker.rb +23 -3
  104. data/lib/evilution/version.rb +1 -1
  105. data/script/memory_check +7 -5
  106. metadata +75 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7fe91007e7b5113b2e790e726991bcc872abe8fe8e3c321b1e1f5896f9ccec8d
4
- data.tar.gz: 809753233bdd01ec72a9014e31dcc0f821f9e569b915bc58aee4ac69ce0168df
3
+ metadata.gz: 41c28afbfc162902708394c367eb87150663ac64ab7b2228ee72ab7bb3b0549b
4
+ data.tar.gz: 269ec61ea7f4d9f083247b022ba7e331bfce85ebc62d75151cf0b14d6769a8f9
5
5
  SHA512:
6
- metadata.gz: 5e1a965330f8d02db82e5bee493682a70a3492f67985e2e0729a66354de51c9e8d3e0b2323617d82dc3209eb7791e5cfc0af2e735c5351081fe48f44d6e26f22
7
- data.tar.gz: 43bbd5cf785fe4370ef351642f697a205cd2af2490dbc15a187aae640a35df0d7a472f2d133ad45ac274fd0c5841401f1a6f8a42b395a97cb92b125b51ec84fb
6
+ metadata.gz: 11f61c28eca30a943b6632066b8992860e2bf67fb1a617e8cf0ac6ccfcbbce33d48baec4452a57127aacaeacf2f834f6d01350be091a5d2bbd279df226e5cbc0
7
+ data.tar.gz: 6d3c6f07b8ddda520966ef2bc9616752fa693499fff18e0542e3059a1f1ff16ae9a56f9b68fe96eea6b90cb41981e5f87bc540238a2fd2e29f166f629cf1259f
@@ -20,3 +20,213 @@
20
20
  {"id":"int-a43dbc64","kind":"field_change","created_at":"2026-04-13T10:26:45.290646646Z","actor":"Denis Kiselev","issue_id":"EV-gs1r","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
21
21
  {"id":"int-ec0a4368","kind":"field_change","created_at":"2026-04-13T11:25:13.089935275Z","actor":"Denis Kiselev","issue_id":"EV-930z","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged in PR #687"}}
22
22
  {"id":"int-a59bbad4","kind":"field_change","created_at":"2026-04-13T16:01:10.349431405Z","actor":"Denis Kiselev","issue_id":"EV-fu7n","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
23
+ {"id":"int-5a773d98","kind":"field_change","created_at":"2026-04-14T07:15:14.387885641Z","actor":"Denis Kiselev","issue_id":"EV-6e58","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
24
+ {"id":"int-bef8f44b","kind":"field_change","created_at":"2026-04-14T09:12:39.415079726Z","actor":"Denis Kiselev","issue_id":"EV-ruc4","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
25
+ {"id":"int-501725bd","kind":"field_change","created_at":"2026-04-14T09:55:34.799184486Z","actor":"Denis Kiselev","issue_id":"EV-2qeo","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
26
+ {"id":"int-7ea18f00","kind":"field_change","created_at":"2026-04-14T14:17:33.257720856Z","actor":"Denis Kiselev","issue_id":"EV-dqrk","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged as PR #709."}}
27
+ {"id":"int-3d40763b","kind":"field_change","created_at":"2026-04-14T14:17:35.373478774Z","actor":"Denis Kiselev","issue_id":"EV-rqy0","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged as PR #711: Runner refactored into 7 SOLID collaborators (825→193 lines)."}}
28
+ {"id":"int-569cb56b","kind":"field_change","created_at":"2026-04-14T16:21:45.776278181Z","actor":"Denis Kiselev","issue_id":"EV-it90","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Released in 0.24.0 (GH #487, PR #712)"}}
29
+ {"id":"int-20b78381","kind":"field_change","created_at":"2026-04-16T02:05:26.583148033Z","actor":"Denis Kiselev","issue_id":"EV-30ap","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #644 closed in v0.22.1 — Zeitwerk/Ruby 4.0 fix shipped"}}
30
+ {"id":"int-d5663958","kind":"field_change","created_at":"2026-04-16T02:05:28.116222221Z","actor":"Denis Kiselev","issue_id":"EV-3zo4","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #676 closed in v0.22.5 — ActiveSupport::Concern fix shipped"}}
31
+ {"id":"int-5832dda1","kind":"field_change","created_at":"2026-04-16T02:05:29.112735617Z","actor":"Denis Kiselev","issue_id":"EV-8u1x","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #673 closed in v0.22.4 — preload LoadError fix shipped"}}
32
+ {"id":"int-3da6d1db","kind":"field_change","created_at":"2026-04-16T02:05:30.203453287Z","actor":"Denis Kiselev","issue_id":"EV-df9s","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #680 closed in v0.22.6 — Zeitwerk const_added fix shipped"}}
33
+ {"id":"int-19dd8abd","kind":"field_change","created_at":"2026-04-16T02:05:31.273875078Z","actor":"Denis Kiselev","issue_id":"EV-np1y","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #645 closed in v0.22.1 — error messages now preserved"}}
34
+ {"id":"int-d503fb6a","kind":"field_change","created_at":"2026-04-16T02:05:34.506857099Z","actor":"Denis Kiselev","issue_id":"EV-u8pu","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #650 closed in v0.23.0 — neutral mutation category shipped"}}
35
+ {"id":"int-7b2c244a","kind":"field_change","created_at":"2026-04-16T02:06:05.969566741Z","actor":"Denis Kiselev","issue_id":"EV-241","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #522 closed in v0.21.0 — heredoc-aware mutations shipped"}}
36
+ {"id":"int-9b986121","kind":"field_change","created_at":"2026-04-16T02:06:09.216368138Z","actor":"Denis Kiselev","issue_id":"EV-248","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #533 closed in v0.19.0 — memory budget CI gate shipped"}}
37
+ {"id":"int-fd1e430d","kind":"field_change","created_at":"2026-04-16T02:06:10.229407144Z","actor":"Denis Kiselev","issue_id":"EV-262","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #549 closed in v0.21.0 — heredoc tests shipped"}}
38
+ {"id":"int-5a012098","kind":"field_change","created_at":"2026-04-16T02:06:11.164107351Z","actor":"Denis Kiselev","issue_id":"EV-203","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #349 closed in v0.15.0 — extended equivalent detection shipped"}}
39
+ {"id":"int-28176e9c","kind":"field_change","created_at":"2026-04-16T02:08:21.95210098Z","actor":"Denis Kiselev","issue_id":"EV-oeip","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #636 closed in v0.23.0 — MCP redesign shipped"}}
40
+ {"id":"int-4abb9d5c","kind":"field_change","created_at":"2026-04-16T02:08:22.890701839Z","actor":"Denis Kiselev","issue_id":"EV-104","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #250 closed in v0.16.0 — global variable mutation shipped"}}
41
+ {"id":"int-a49a6636","kind":"field_change","created_at":"2026-04-16T02:08:25.582199392Z","actor":"Denis Kiselev","issue_id":"EV-112","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #257 closed in v0.16.0 — super call mutations shipped"}}
42
+ {"id":"int-6566b7c9","kind":"field_change","created_at":"2026-04-16T02:08:26.482231475Z","actor":"Denis Kiselev","issue_id":"EV-128","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #274 closed — TTY progress bar shipped"}}
43
+ {"id":"int-73de2db6","kind":"field_change","created_at":"2026-04-16T02:08:27.346775973Z","actor":"Denis Kiselev","issue_id":"EV-131","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #276 closed in v0.17.0 — index access operators shipped"}}
44
+ {"id":"int-0858f8e7","kind":"field_change","created_at":"2026-04-16T02:08:28.191294015Z","actor":"Denis Kiselev","issue_id":"EV-141","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #297 closed — pattern matching mutations shipped"}}
45
+ {"id":"int-24a39fbd","kind":"field_change","created_at":"2026-04-16T02:08:29.06177528Z","actor":"Denis Kiselev","issue_id":"EV-152","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #296 closed in v0.18.0 — type-aware return mutations shipped"}}
46
+ {"id":"int-22321de2","kind":"field_change","created_at":"2026-04-16T02:08:29.874481603Z","actor":"Denis Kiselev","issue_id":"EV-153","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #299 closed in v0.18.0 — dynamic work allocation shipped"}}
47
+ {"id":"int-85dd2460","kind":"field_change","created_at":"2026-04-16T02:08:30.736003358Z","actor":"Denis Kiselev","issue_id":"EV-164","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #312 closed in v0.17.0 — AST pattern language shipped"}}
48
+ {"id":"int-81673576","kind":"field_change","created_at":"2026-04-16T02:08:31.582998038Z","actor":"Denis Kiselev","issue_id":"EV-171","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #317 closed — AST pattern filter integration shipped"}}
49
+ {"id":"int-98befab4","kind":"field_change","created_at":"2026-04-16T02:08:32.396299435Z","actor":"Denis Kiselev","issue_id":"EV-172","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #318 closed in v0.18.0 — evilution:disable comments shipped"}}
50
+ {"id":"int-a59ac84c","kind":"field_change","created_at":"2026-04-16T02:08:33.259586219Z","actor":"Denis Kiselev","issue_id":"EV-178","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #324 closed in v0.15.0 — rich subject expression shipped"}}
51
+ {"id":"int-6b172e8c","kind":"field_change","created_at":"2026-04-16T02:08:34.145795048Z","actor":"Denis Kiselev","issue_id":"EV-170","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #316 closed in v0.18.0 — environment diagnostics shipped"}}
52
+ {"id":"int-3cd505bc","kind":"field_change","created_at":"2026-04-16T02:08:35.003283418Z","actor":"Denis Kiselev","issue_id":"EV-181","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #327 closed in v0.18.0 — Sorbet awareness shipped"}}
53
+ {"id":"int-4a82b034","kind":"field_change","created_at":"2026-04-16T02:08:35.840786003Z","actor":"Denis Kiselev","issue_id":"EV-185","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #331 closed in v0.18.0 — cross-run comparison shipped"}}
54
+ {"id":"int-04833eca","kind":"field_change","created_at":"2026-04-16T02:08:36.687395137Z","actor":"Denis Kiselev","issue_id":"EV-194","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #340 closed in v0.15.0 — class/module mutations shipped"}}
55
+ {"id":"int-e9a5a2d1","kind":"field_change","created_at":"2026-04-16T02:08:37.537699958Z","actor":"Denis Kiselev","issue_id":"EV-206","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #352 closed — MCP server enhancements shipped"}}
56
+ {"id":"int-eb6e4fca","kind":"field_change","created_at":"2026-04-16T02:08:38.389832285Z","actor":"Denis Kiselev","issue_id":"EV-210","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #496 closed in v0.20.0 — defined? mutations shipped"}}
57
+ {"id":"int-4f75f621","kind":"field_change","created_at":"2026-04-16T02:08:39.257856752Z","actor":"Denis Kiselev","issue_id":"EV-211","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #357 closed in v0.18.0 — regex capture mutations shipped"}}
58
+ {"id":"int-f9f3bd65","kind":"field_change","created_at":"2026-04-16T02:08:40.209131358Z","actor":"Denis Kiselev","issue_id":"EV-212","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"GH #358 closed in v0.18.0 — self reference mutations shipped"}}
59
+ {"id":"int-3f19ce6b","kind":"field_change","created_at":"2026-04-16T02:10:16.257425279Z","actor":"Denis Kiselev","issue_id":"EV-150","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #298 closed — session result storage shipped"}}
60
+ {"id":"int-6c0a7c26","kind":"field_change","created_at":"2026-04-16T02:10:17.164231198Z","actor":"Denis Kiselev","issue_id":"EV-207","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #353 closed — session history browsing shipped"}}
61
+ {"id":"int-121ac57e","kind":"field_change","created_at":"2026-04-16T02:11:01.091777219Z","actor":"Denis Kiselev","issue_id":"EV-252","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #539 closed — RSS growth measurement done"}}
62
+ {"id":"int-203a15ac","kind":"field_change","created_at":"2026-04-16T02:11:02.151171157Z","actor":"Denis Kiselev","issue_id":"EV-256","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #507 closed — memory leak fixed"}}
63
+ {"id":"int-d974c83b","kind":"field_change","created_at":"2026-04-16T02:11:03.004583357Z","actor":"Denis Kiselev","issue_id":"EV-2kca","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #644 closed in v0.22.1 — Zeitwerk fix shipped"}}
64
+ {"id":"int-9fe4d392","kind":"field_change","created_at":"2026-04-16T02:11:03.994524878Z","actor":"Denis Kiselev","issue_id":"EV-08nw","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #652 closed in v0.23.0 — safe mutation restoration shipped"}}
65
+ {"id":"int-6fc42bef","kind":"field_change","created_at":"2026-04-16T02:11:04.86882981Z","actor":"Denis Kiselev","issue_id":"EV-21dn","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #651 closed in v0.23.0 — spec auto-detection improved"}}
66
+ {"id":"int-1311be15","kind":"field_change","created_at":"2026-04-16T02:11:05.964339838Z","actor":"Denis Kiselev","issue_id":"EV-271","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #558 closed — IO.select timeout fixed"}}
67
+ {"id":"int-6d2a8f55","kind":"field_change","created_at":"2026-04-16T02:11:06.887896734Z","actor":"Denis Kiselev","issue_id":"EV-9kt1","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #649 closed in v0.23.0 — Prism validation shipped"}}
68
+ {"id":"int-3237f61b","kind":"field_change","created_at":"2026-04-16T02:13:43.284847098Z","actor":"Denis Kiselev","issue_id":"EV-142","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #288 closed — []= removal mutation"}}
69
+ {"id":"int-9a7c4feb","kind":"field_change","created_at":"2026-04-16T02:13:44.262319975Z","actor":"Denis Kiselev","issue_id":"EV-143","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #287 closed — --no-progress flag"}}
70
+ {"id":"int-35975d7c","kind":"field_change","created_at":"2026-04-16T02:13:45.242603005Z","actor":"Denis Kiselev","issue_id":"EV-144","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #291 closed — send vs public_send swap"}}
71
+ {"id":"int-1b236192","kind":"field_change","created_at":"2026-04-16T02:13:46.207082879Z","actor":"Denis Kiselev","issue_id":"EV-145","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #290 closed — hooks config in .evilution.yml"}}
72
+ {"id":"int-ba4f076d","kind":"field_change","created_at":"2026-04-16T02:13:47.156492728Z","actor":"Denis Kiselev","issue_id":"EV-146","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #292 closed — RSpec suggestion templates for index access"}}
73
+ {"id":"int-bb6526aa","kind":"field_change","created_at":"2026-04-16T02:13:48.096600171Z","actor":"Denis Kiselev","issue_id":"EV-147","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #293 closed — pattern matching guard mutation"}}
74
+ {"id":"int-28a83035","kind":"field_change","created_at":"2026-04-16T02:13:49.037047717Z","actor":"Denis Kiselev","issue_id":"EV-149","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #295 closed — RSpec tests for hooks system"}}
75
+ {"id":"int-769663ff","kind":"field_change","created_at":"2026-04-16T02:13:49.953400941Z","actor":"Denis Kiselev","issue_id":"EV-151","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #297 closed — pattern matching alternative mutation"}}
76
+ {"id":"int-b20c1ee3","kind":"field_change","created_at":"2026-04-16T02:13:50.835438696Z","actor":"Denis Kiselev","issue_id":"EV-154","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #300 closed — type-aware return mutations for collections"}}
77
+ {"id":"int-6619cc59","kind":"field_change","created_at":"2026-04-16T02:13:51.733675193Z","actor":"Denis Kiselev","issue_id":"EV-155","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #301 closed — pattern matching find/array pattern mutations"}}
78
+ {"id":"int-849f8907","kind":"field_change","created_at":"2026-04-16T02:13:57.577750671Z","actor":"Denis Kiselev","issue_id":"EV-156","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #302 closed — session list command"}}
79
+ {"id":"int-b61238c3","kind":"field_change","created_at":"2026-04-16T02:13:58.653821833Z","actor":"Denis Kiselev","issue_id":"EV-157","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #303 closed — shared work queue with pipe-based IPC"}}
80
+ {"id":"int-c8e6d4fb","kind":"field_change","created_at":"2026-04-16T02:13:59.629519823Z","actor":"Denis Kiselev","issue_id":"EV-158","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #304 closed — type-aware return mutations for scalars"}}
81
+ {"id":"int-c7d675bf","kind":"field_change","created_at":"2026-04-16T02:14:00.618026651Z","actor":"Denis Kiselev","issue_id":"EV-159","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #305 closed — RSpec suggestion templates for pattern matching"}}
82
+ {"id":"int-db179dcf","kind":"field_change","created_at":"2026-04-16T02:14:01.68105553Z","actor":"Denis Kiselev","issue_id":"EV-160","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #306 closed — session show command"}}
83
+ {"id":"int-6c47942d","kind":"field_change","created_at":"2026-04-16T02:14:02.612244772Z","actor":"Denis Kiselev","issue_id":"EV-161","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #307 closed — work-stealing for idle workers"}}
84
+ {"id":"int-a2609c3c","kind":"field_change","created_at":"2026-04-16T02:14:03.585668324Z","actor":"Denis Kiselev","issue_id":"EV-162","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #308 closed — RSpec suggestion templates for type-aware return"}}
85
+ {"id":"int-85f1146f","kind":"field_change","created_at":"2026-04-16T02:14:04.532146872Z","actor":"Denis Kiselev","issue_id":"EV-163","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #310 closed — session gc command"}}
86
+ {"id":"int-9c676206","kind":"field_change","created_at":"2026-04-16T02:14:05.434458895Z","actor":"Denis Kiselev","issue_id":"EV-165","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #311 closed — update Parallel::Pool to use dynamic queue"}}
87
+ {"id":"int-0c9debee","kind":"field_change","created_at":"2026-04-16T02:14:06.358150091Z","actor":"Denis Kiselev","issue_id":"EV-166","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #312 closed — design AST pattern language syntax"}}
88
+ {"id":"int-56dcb8bd","kind":"field_change","created_at":"2026-04-16T02:14:13.778653465Z","actor":"Denis Kiselev","issue_id":"EV-168","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #314 closed — parallel execution metrics"}}
89
+ {"id":"int-08416c00","kind":"field_change","created_at":"2026-04-16T02:14:14.806947296Z","actor":"Denis Kiselev","issue_id":"EV-169","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #315 closed — AST pattern parser"}}
90
+ {"id":"int-a7f92b47","kind":"field_change","created_at":"2026-04-16T02:14:15.782969323Z","actor":"Denis Kiselev","issue_id":"EV-174","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #321 closed — comment-based disable detection"}}
91
+ {"id":"int-8dc0ffe3","kind":"field_change","created_at":"2026-04-16T02:14:16.754581703Z","actor":"Denis Kiselev","issue_id":"EV-175","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #320 closed — ignore_patterns in .evilution.yml"}}
92
+ {"id":"int-2a4f2640","kind":"field_change","created_at":"2026-04-16T02:14:17.717585359Z","actor":"Denis Kiselev","issue_id":"EV-177","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #323 closed — filter mutations against disabled ranges"}}
93
+ {"id":"int-c8f77406","kind":"field_change","created_at":"2026-04-16T02:14:18.73378774Z","actor":"Denis Kiselev","issue_id":"EV-179","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #325 closed — --show-disabled flag"}}
94
+ {"id":"int-665183a8","kind":"field_change","created_at":"2026-04-16T02:14:19.6380817Z","actor":"Denis Kiselev","issue_id":"EV-183","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #329 closed — namespace wildcard matching"}}
95
+ {"id":"int-46b09d1f","kind":"field_change","created_at":"2026-04-16T02:14:20.626689614Z","actor":"Denis Kiselev","issue_id":"EV-186","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #332 closed — method-type selectors"}}
96
+ {"id":"int-72383f73","kind":"field_change","created_at":"2026-04-16T02:14:21.513519725Z","actor":"Denis Kiselev","issue_id":"EV-189","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #335 closed — descendant matching"}}
97
+ {"id":"int-c173713a","kind":"field_change","created_at":"2026-04-16T02:14:22.471220675Z","actor":"Denis Kiselev","issue_id":"EV-192","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #338 closed — source glob matching"}}
98
+ {"id":"int-dfb9ae4c","kind":"field_change","created_at":"2026-04-16T02:14:26.638900727Z","actor":"Denis Kiselev","issue_id":"EV-196","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #341 closed — code diffs for survived mutations in text output"}}
99
+ {"id":"int-e98ed4d3","kind":"field_change","created_at":"2026-04-16T02:14:27.909476146Z","actor":"Denis Kiselev","issue_id":"EV-240","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #521 closed — neutral mutation category"}}
100
+ {"id":"int-cc537216","kind":"field_change","created_at":"2026-04-16T02:14:28.933676483Z","actor":"Denis Kiselev","issue_id":"EV-243","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #528 closed — profile memory allocation during single mutation cycle"}}
101
+ {"id":"int-cfcf9fca","kind":"field_change","created_at":"2026-04-16T02:14:29.877534863Z","actor":"Denis Kiselev","issue_id":"EV-245","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #529 closed — investigate cross-run session memory growth"}}
102
+ {"id":"int-21537254","kind":"field_change","created_at":"2026-04-16T02:14:30.797425218Z","actor":"Denis Kiselev","issue_id":"EV-246","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #531 closed — investigate parent vs child process memory split"}}
103
+ {"id":"int-a2942d49","kind":"field_change","created_at":"2026-04-16T02:14:31.692536304Z","actor":"Denis Kiselev","issue_id":"EV-247","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #532 closed — RSS tracking per mutation in JSON output"}}
104
+ {"id":"int-bb9e1ad0","kind":"field_change","created_at":"2026-04-16T02:14:32.570817406Z","actor":"Denis Kiselev","issue_id":"EV-272","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #559 closed — no timeout on collect_worker_timing blocks shutdown"}}
105
+ {"id":"int-006d84cc","kind":"field_change","created_at":"2026-04-16T02:14:33.530740405Z","actor":"Denis Kiselev","issue_id":"EV-273","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #561 closed — double Process.wait in Fork isolation"}}
106
+ {"id":"int-dbc9c7fe","kind":"field_change","created_at":"2026-04-16T02:14:34.612725332Z","actor":"Denis Kiselev","issue_id":"EV-276","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #569 closed — InProcess suppress_output closes /dev/null handles"}}
107
+ {"id":"int-a2cb395e","kind":"field_change","created_at":"2026-04-16T02:14:35.686281771Z","actor":"Denis Kiselev","issue_id":"EV-ashp","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #688 closed — restrict evilution-session path params to results directory"}}
108
+ {"id":"int-736fcc15","kind":"field_change","created_at":"2026-04-16T02:14:44.529629929Z","actor":"Denis Kiselev","issue_id":"EV-f7t8","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #639 closed — respect .evilution.yml config in MCP by default"}}
109
+ {"id":"int-b4bc1d6a","kind":"field_change","created_at":"2026-04-16T02:14:46.89406021Z","actor":"Denis Kiselev","issue_id":"EV-oe9n","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #640 closed — add missing CLI parameters to MCP mutate tool"}}
110
+ {"id":"int-9750aa12","kind":"field_change","created_at":"2026-04-16T02:14:47.861746772Z","actor":"Denis Kiselev","issue_id":"EV-t3ez","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #638 closed — add discovery mode to MCP"}}
111
+ {"id":"int-8d2c6bd3","kind":"field_change","created_at":"2026-04-16T02:19:06.323911789Z","actor":"Denis Kiselev","issue_id":"EV-102","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #248 closed — redo statement mutator implemented"}}
112
+ {"id":"int-74903e57","kind":"field_change","created_at":"2026-04-16T02:19:07.290523375Z","actor":"Denis Kiselev","issue_id":"EV-103","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #249 closed — pop/shift push/unshift swap pairs added"}}
113
+ {"id":"int-bb21ff83","kind":"field_change","created_at":"2026-04-16T02:19:08.215016678Z","actor":"Denis Kiselev","issue_id":"EV-106","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #252 closed — each_key/each_value assoc/rassoc swap pairs added"}}
114
+ {"id":"int-bb5144b9","kind":"field_change","created_at":"2026-04-16T02:19:09.055667339Z","actor":"Denis Kiselev","issue_id":"EV-107","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #253 closed — RSpec suggestion templates for control flow added"}}
115
+ {"id":"int-10e36497","kind":"field_change","created_at":"2026-04-16T02:19:09.892425116Z","actor":"Denis Kiselev","issue_id":"EV-108","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #254 closed — RSpec suggestion templates for variable mutations added"}}
116
+ {"id":"int-557b3759","kind":"field_change","created_at":"2026-04-16T02:19:10.720964116Z","actor":"Denis Kiselev","issue_id":"EV-109","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #255 closed — bitwise binary operator mutator implemented"}}
117
+ {"id":"int-4092ab70","kind":"field_change","created_at":"2026-04-16T02:19:11.562627411Z","actor":"Denis Kiselev","issue_id":"EV-111","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #256 closed — grep/grep_v take/drop swap pairs added"}}
118
+ {"id":"int-eb703709","kind":"field_change","created_at":"2026-04-16T02:19:12.400033931Z","actor":"Denis Kiselev","issue_id":"EV-113","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #258 closed — rescue clause removal mutator implemented"}}
119
+ {"id":"int-11d2d0ca","kind":"field_change","created_at":"2026-04-16T02:19:13.243199858Z","actor":"Denis Kiselev","issue_id":"EV-114","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #259 closed — bitwise complement mutator implemented"}}
120
+ {"id":"int-427ccf4f","kind":"field_change","created_at":"2026-04-16T02:19:14.090055351Z","actor":"Denis Kiselev","issue_id":"EV-115","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #260 closed — min/max min_by/max_by swap pairs added"}}
121
+ {"id":"int-fe50b394","kind":"field_change","created_at":"2026-04-16T02:19:15.023143658Z","actor":"Denis Kiselev","issue_id":"EV-116","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #262 closed — zsuper removal mutator implemented"}}
122
+ {"id":"int-a64c0212","kind":"field_change","created_at":"2026-04-16T02:19:15.802272235Z","actor":"Denis Kiselev","issue_id":"EV-117","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #263 closed — rescue body replacement mutator implemented"}}
123
+ {"id":"int-19a816d6","kind":"field_change","created_at":"2026-04-16T02:19:16.595537881Z","actor":"Denis Kiselev","issue_id":"EV-118","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #264 closed — compact/flatten zip/product swap pairs added"}}
124
+ {"id":"int-c310f44e","kind":"field_change","created_at":"2026-04-16T02:19:19.382085113Z","actor":"Denis Kiselev","issue_id":"EV-119","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #265 closed — hook registry and configuration API designed"}}
125
+ {"id":"int-264748b1","kind":"field_change","created_at":"2026-04-16T02:19:20.189120501Z","actor":"Denis Kiselev","issue_id":"EV-120","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #266 closed — explicit super argument mutations implemented"}}
126
+ {"id":"int-8c58f451","kind":"field_change","created_at":"2026-04-16T02:19:20.990869383Z","actor":"Denis Kiselev","issue_id":"EV-121","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #267 closed — RSpec suggestion templates for bitwise operators added"}}
127
+ {"id":"int-50494a37","kind":"field_change","created_at":"2026-04-16T02:19:21.864300817Z","actor":"Denis Kiselev","issue_id":"EV-122","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #268 closed — inline rescue mutation implemented"}}
128
+ {"id":"int-3984bf60","kind":"field_change","created_at":"2026-04-16T02:19:22.635431613Z","actor":"Denis Kiselev","issue_id":"EV-124","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #269 closed — first/last keys/values swap pairs added"}}
129
+ {"id":"int-dad6a564","kind":"field_change","created_at":"2026-04-16T02:19:23.465439016Z","actor":"Denis Kiselev","issue_id":"EV-125","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #271 closed — RSpec suggestion templates for super mutations added"}}
130
+ {"id":"int-8ad9bd5e","kind":"field_change","created_at":"2026-04-16T02:19:24.329363865Z","actor":"Denis Kiselev","issue_id":"EV-126","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #272 closed — hook registry module implemented"}}
131
+ {"id":"int-767e016e","kind":"field_change","created_at":"2026-04-16T02:19:25.309893208Z","actor":"Denis Kiselev","issue_id":"EV-127","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #273 closed — ensure clause removal mutator implemented"}}
132
+ {"id":"int-af306e2b","kind":"field_change","created_at":"2026-04-16T02:19:26.184984842Z","actor":"Denis Kiselev","issue_id":"EV-129","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #275 closed — bang vs non-bang method mutations added"}}
133
+ {"id":"int-b87dbb6c","kind":"field_change","created_at":"2026-04-16T02:19:27.074213622Z","actor":"Denis Kiselev","issue_id":"EV-130","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #277 closed — worker_process_start hook point added"}}
134
+ {"id":"int-f565c816","kind":"field_change","created_at":"2026-04-16T02:19:27.949894748Z","actor":"Denis Kiselev","issue_id":"EV-132","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #278 closed — RSpec suggestion templates for exception handling added"}}
135
+ {"id":"int-e10ba316","kind":"field_change","created_at":"2026-04-16T02:19:28.776987961Z","actor":"Denis Kiselev","issue_id":"EV-133","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #279 closed — TTY progress bar renderer implemented"}}
136
+ {"id":"int-fd1fe8b2","kind":"field_change","created_at":"2026-04-16T02:19:29.632632163Z","actor":"Denis Kiselev","issue_id":"EV-134","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #280 closed — [] to fetch mutation implemented"}}
137
+ {"id":"int-11df8ae5","kind":"field_change","created_at":"2026-04-16T02:19:30.494640376Z","actor":"Denis Kiselev","issue_id":"EV-135","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #281 closed — enumerable reduction method swaps added"}}
138
+ {"id":"int-47e8c761","kind":"field_change","created_at":"2026-04-16T02:19:31.287260884Z","actor":"Denis Kiselev","issue_id":"EV-136","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #282 closed — mutation_insert_pre/post hook points added"}}
139
+ {"id":"int-aecf564c","kind":"field_change","created_at":"2026-04-16T02:19:32.076018259Z","actor":"Denis Kiselev","issue_id":"EV-137","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #284 closed — progress bar integrated with Runner"}}
140
+ {"id":"int-5f786c2a","kind":"field_change","created_at":"2026-04-16T02:19:32.932531679Z","actor":"Denis Kiselev","issue_id":"EV-138","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #283 closed — [] to dig mutation implemented"}}
141
+ {"id":"int-a1e9dced","kind":"field_change","created_at":"2026-04-16T02:19:33.842599021Z","actor":"Denis Kiselev","issue_id":"EV-139","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #285 closed — to_s/to_i/to_f/to_a/to_h conversion swaps added"}}
142
+ {"id":"int-b280c29b","kind":"field_change","created_at":"2026-04-16T02:19:34.684429316Z","actor":"Denis Kiselev","issue_id":"EV-140","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #286 closed — setup_integration_pre/post hook points added"}}
143
+ {"id":"int-22017c31","kind":"field_change","created_at":"2026-04-16T02:19:35.484967762Z","actor":"Denis Kiselev","issue_id":"EV-92","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #237 closed — local variable assignment removal mutator implemented"}}
144
+ {"id":"int-e7887fb5","kind":"field_change","created_at":"2026-04-16T02:19:36.318889145Z","actor":"Denis Kiselev","issue_id":"EV-94","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #240 closed — break statement mutator implemented"}}
145
+ {"id":"int-b16d730f","kind":"field_change","created_at":"2026-04-16T02:19:37.131852636Z","actor":"Denis Kiselev","issue_id":"EV-95","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #241 closed — instance variable mutation implemented"}}
146
+ {"id":"int-e7f59cae","kind":"field_change","created_at":"2026-04-16T02:19:38.00644884Z","actor":"Denis Kiselev","issue_id":"EV-98","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #244 closed — next statement mutator implemented"}}
147
+ {"id":"int-b55a0635","kind":"field_change","created_at":"2026-04-16T02:19:38.84785033Z","actor":"Denis Kiselev","issue_id":"EV-99","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #245 closed — class variable mutation implemented"}}
148
+ {"id":"int-ca09b719","kind":"field_change","created_at":"2026-04-16T02:19:39.805878699Z","actor":"Denis Kiselev","issue_id":"EV-193","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #339 closed — cross-run comparison added to HTML report"}}
149
+ {"id":"int-92942f99","kind":"field_change","created_at":"2026-04-16T02:19:40.701371386Z","actor":"Denis Kiselev","issue_id":"EV-195","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #342 closed — superclass removal mutation implemented"}}
150
+ {"id":"int-d2ddcec7","kind":"field_change","created_at":"2026-04-16T02:19:41.615300741Z","actor":"Denis Kiselev","issue_id":"EV-197","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #343 closed — module include/extend removal implemented"}}
151
+ {"id":"int-18c20557","kind":"field_change","created_at":"2026-04-16T02:19:42.492164928Z","actor":"Denis Kiselev","issue_id":"EV-198","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #344 closed — RSpec suggestion templates for class/module mutations added"}}
152
+ {"id":"int-c33ae1d7","kind":"field_change","created_at":"2026-04-16T02:19:43.387705296Z","actor":"Denis Kiselev","issue_id":"EV-204","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #350 closed — more automatic equivalence heuristics added"}}
153
+ {"id":"int-8fe52b36","kind":"field_change","created_at":"2026-04-16T02:19:44.217391118Z","actor":"Denis Kiselev","issue_id":"EV-205","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #351 closed — evilution:equivalent manual marking supported"}}
154
+ {"id":"int-838c9fc6","kind":"field_change","created_at":"2026-04-16T02:19:45.174893704Z","actor":"Denis Kiselev","issue_id":"EV-208","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #354 closed — cross-run diff added to MCP server"}}
155
+ {"id":"int-3981a79e","kind":"field_change","created_at":"2026-04-16T02:19:46.038933707Z","actor":"Denis Kiselev","issue_id":"EV-209","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #355 closed — streaming test suggestions via MCP added"}}
156
+ {"id":"int-35823b10","kind":"field_change","created_at":"2026-04-16T02:19:46.896684903Z","actor":"Denis Kiselev","issue_id":"EV-275","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #567 closed — project classes used as memory check fixture"}}
157
+ {"id":"int-cd4c3b2b","kind":"field_change","created_at":"2026-04-16T02:19:47.858515018Z","actor":"Denis Kiselev","issue_id":"EV-278","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #618 closed — IndexToAt operator implemented"}}
158
+ {"id":"int-85f768da","kind":"field_change","created_at":"2026-04-16T02:19:48.782397897Z","actor":"Denis Kiselev","issue_id":"EV-6iso","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #641 closed — MCP tool descriptions improved"}}
159
+ {"id":"int-c6d70b4b","kind":"field_change","created_at":"2026-04-16T02:19:49.703768969Z","actor":"Denis Kiselev","issue_id":"EV-qi84","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #642 closed — richer structured data returned from MCP"}}
160
+ {"id":"int-e32cf801","kind":"field_change","created_at":"2026-04-16T02:19:50.562589924Z","actor":"Denis Kiselev","issue_id":"EV-wtah","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #643 closed — skip-heredoc-literals config option considered"}}
161
+ {"id":"int-7e7ab160","kind":"field_change","created_at":"2026-04-16T02:19:51.405507515Z","actor":"Denis Kiselev","issue_id":"EV-188","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #334 closed — mutation generation skipped inside sig blocks"}}
162
+ {"id":"int-bc68a79f","kind":"field_change","created_at":"2026-04-16T02:19:53.996883385Z","actor":"Denis Kiselev","issue_id":"EV-184","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #330 closed — Sorbet sig blocks detected in source"}}
163
+ {"id":"int-c1aeba6b","kind":"field_change","created_at":"2026-04-16T02:19:54.853186845Z","actor":"Denis Kiselev","issue_id":"EV-180","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #326 closed — evilution tests list command added"}}
164
+ {"id":"int-35a1b7a2","kind":"field_change","created_at":"2026-04-16T02:19:55.777295518Z","actor":"Denis Kiselev","issue_id":"EV-176","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #322 closed — evilution subjects command added"}}
165
+ {"id":"int-535c68ca","kind":"field_change","created_at":"2026-04-16T02:19:56.640633089Z","actor":"Denis Kiselev","issue_id":"EV-173","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #319 closed — evilution environment show command added"}}
166
+ {"id":"int-b999f1d0","kind":"field_change","created_at":"2026-04-16T02:19:57.646764284Z","actor":"Denis Kiselev","issue_id":"EV-187","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #333 closed — session result diffing engine implemented"}}
167
+ {"id":"int-8df0f11d","kind":"field_change","created_at":"2026-04-16T02:19:58.510270741Z","actor":"Denis Kiselev","issue_id":"EV-190","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #336 closed — evilution session diff CLI command added"}}
168
+ {"id":"int-3736796b","kind":"field_change","created_at":"2026-04-16T02:21:14.19716773Z","actor":"Denis Kiselev","issue_id":"EV-167","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #313 closed — efficiency metrics shipped"}}
169
+ {"id":"int-4748c250","kind":"field_change","created_at":"2026-04-16T02:21:15.19692779Z","actor":"Denis Kiselev","issue_id":"EV-182","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #328 closed — mutation preview command shipped"}}
170
+ {"id":"int-c477087f","kind":"field_change","created_at":"2026-04-16T02:21:16.124223109Z","actor":"Denis Kiselev","issue_id":"EV-279","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"GH #619 closed — BlockPassRemoval operator shipped"}}
171
+ {"id":"int-83f6ef33","kind":"field_change","created_at":"2026-04-18T02:28:55.484568434Z","actor":"Denis Kiselev","issue_id":"EV-269","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"merged"}}
172
+ {"id":"int-921ad06a","kind":"field_change","created_at":"2026-04-18T02:32:34.711348814Z","actor":"Denis Kiselev","issue_id":"EV-2t6w","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"merged"}}
173
+ {"id":"int-3a5d743d","kind":"field_change","created_at":"2026-04-18T04:15:40.927791612Z","actor":"Denis Kiselev","issue_id":"EV-butc","extra":{"field":"status","new_value":"in_progress","old_value":"open"}}
174
+ {"id":"int-dc9eb87b","kind":"field_change","created_at":"2026-04-18T04:26:07.228880915Z","actor":"Denis Kiselev","issue_id":"EV-5kvc","extra":{"field":"status","new_value":"in_progress","old_value":"open"}}
175
+ {"id":"int-68aa4ad7","kind":"field_change","created_at":"2026-04-18T04:35:03.842661968Z","actor":"Denis Kiselev","issue_id":"EV-volu","extra":{"field":"status","new_value":"in_progress","old_value":"open"}}
176
+ {"id":"int-c1f560e9","kind":"field_change","created_at":"2026-04-18T04:35:10.815746246Z","actor":"Denis Kiselev","issue_id":"EV-zzhb","extra":{"field":"status","new_value":"in_progress","old_value":"open"}}
177
+ {"id":"int-6487a248","kind":"field_change","created_at":"2026-04-18T05:11:06.852811567Z","actor":"Denis Kiselev","issue_id":"EV-61yc","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged via PR #760 (488: Refactor Evilution::Reporter::Suggestion SOLID decomposition)"}}
178
+ {"id":"int-6413e1b6","kind":"field_change","created_at":"2026-04-18T05:11:07.195769012Z","actor":"Denis Kiselev","issue_id":"EV-bksr","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged via PR #760 (488: Refactor Evilution::Reporter::Suggestion SOLID decomposition)"}}
179
+ {"id":"int-1c234d47","kind":"field_change","created_at":"2026-04-18T05:11:07.53397537Z","actor":"Denis Kiselev","issue_id":"EV-butc","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged via PR #760 (488: Refactor Evilution::Reporter::Suggestion SOLID decomposition)"}}
180
+ {"id":"int-28f21f93","kind":"field_change","created_at":"2026-04-18T05:11:07.897783653Z","actor":"Denis Kiselev","issue_id":"EV-5kvc","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged via PR #760 (488: Refactor Evilution::Reporter::Suggestion SOLID decomposition)"}}
181
+ {"id":"int-d120424c","kind":"field_change","created_at":"2026-04-18T05:11:08.240473048Z","actor":"Denis Kiselev","issue_id":"EV-zzhb","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged via PR #760 (488: Refactor Evilution::Reporter::Suggestion SOLID decomposition)"}}
182
+ {"id":"int-149f2a7d","kind":"field_change","created_at":"2026-04-18T05:11:08.587853975Z","actor":"Denis Kiselev","issue_id":"EV-volu","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged via PR #760 (488: Refactor Evilution::Reporter::Suggestion SOLID decomposition)"}}
183
+ {"id":"int-03834d33","kind":"field_change","created_at":"2026-04-18T05:38:39.136492096Z","actor":"Denis Kiselev","issue_id":"EV-le77","extra":{"field":"status","new_value":"in_progress","old_value":"open"}}
184
+ {"id":"int-55c0a5a0","kind":"field_change","created_at":"2026-04-18T06:00:40.350507783Z","actor":"Denis Kiselev","issue_id":"EV-le77","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged to master. GH #734."}}
185
+ {"id":"int-83db96fa","kind":"field_change","created_at":"2026-04-18T07:34:45.768077276Z","actor":"Denis Kiselev","issue_id":"EV-2w5j","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged in PR #762"}}
186
+ {"id":"int-5b96895b","kind":"field_change","created_at":"2026-04-18T07:34:50.168369964Z","actor":"Denis Kiselev","issue_id":"EV-nfqu","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged in PR #762"}}
187
+ {"id":"int-e87dfd79","kind":"field_change","created_at":"2026-04-18T09:45:43.224280989Z","actor":"Denis Kiselev","issue_id":"EV-l3e3","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Superseded by existing Mutator::Operator::IndexToFetch (lib/evilution/mutator/operator/index_to_fetch.rb), already registered in Registry.default and covered by spec/evilution/mutator/operator/index_to_fetch_spec.rb. Sibling tickets A2/A3/A4 (EV-en0u, EV-yhmz, EV-8t3h) superseded as well."}}
188
+ {"id":"int-0164aeec","kind":"field_change","created_at":"2026-04-18T09:45:45.091305862Z","actor":"Denis Kiselev","issue_id":"EV-en0u","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Superseded by existing Mutator::Operator::IndexToFetch (already registered + spec'd). See EV-l3e3 close note."}}
189
+ {"id":"int-0324d72c","kind":"field_change","created_at":"2026-04-18T09:45:45.408103497Z","actor":"Denis Kiselev","issue_id":"EV-yhmz","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Superseded by existing Mutator::Operator::IndexToFetch (already registered + spec'd). See EV-l3e3 close note."}}
190
+ {"id":"int-aa1894b5","kind":"field_change","created_at":"2026-04-18T09:45:45.73252259Z","actor":"Denis Kiselev","issue_id":"EV-8t3h","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Superseded by existing Mutator::Operator::IndexToFetch (already registered + spec'd). See EV-l3e3 close note."}}
191
+ {"id":"int-e0fadc18","kind":"field_change","created_at":"2026-04-18T10:30:07.980111872Z","actor":"Denis Kiselev","issue_id":"EV-r1tt","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
192
+ {"id":"int-d4c71203","kind":"field_change","created_at":"2026-04-18T11:17:35.817902447Z","actor":"Denis Kiselev","issue_id":"EV-g3w8","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
193
+ {"id":"int-39071543","kind":"field_change","created_at":"2026-04-18T18:21:18.147170095Z","actor":"Denis Kiselev","issue_id":"EV-2ixl","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
194
+ {"id":"int-a25cdcd8","kind":"field_change","created_at":"2026-04-19T04:31:30.809202237Z","actor":"Denis Kiselev","issue_id":"EV-ijkc","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
195
+ {"id":"int-5bf39758","kind":"field_change","created_at":"2026-04-19T05:25:35.940636751Z","actor":"Denis Kiselev","issue_id":"EV-d871","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
196
+ {"id":"int-fe8612d2","kind":"field_change","created_at":"2026-04-19T05:57:21.832710081Z","actor":"Denis Kiselev","issue_id":"EV-hc5x","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
197
+ {"id":"int-e2d113b8","kind":"field_change","created_at":"2026-04-19T06:28:26.78633549Z","actor":"Denis Kiselev","issue_id":"EV-l5cs","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Investigation complete. Numbers + analysis recorded in bead notes and GH #727 comment. No code merged (instrumentation reverted per ticket scope). Implication for B2 (EV-7e86): example-level targeting is the win, file-level resolver already narrow."}}
198
+ {"id":"int-479728ff","kind":"field_change","created_at":"2026-04-19T07:21:47.594004118Z","actor":"Denis Kiselev","issue_id":"EV-7e86","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Design complete. Spec doc at docs/superpowers/specs/2026-04-19-per-mutation-spec-targeting-design.md, summary cross-posted to GH #729. Two-stage pipeline (file-level SpecResolver + new example-level ExampleFilter w/ static line-based body-token match, LRU SpecAstCache, configurable fallback). B3 needs rescoping to cover Stage 2."}}
199
+ {"id":"int-2027b7a5","kind":"field_change","created_at":"2026-04-19T14:41:32.897007819Z","actor":"Denis Kiselev","issue_id":"EV-dhs1","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Investigation complete: not a source bug. Both MCP paths (server.rb:15, info_tool.rb:209) use Evilution::VERSION constant. Old log discrepancy was env mismatch (CLI from newer local source vs MCP server from older installed gem)."}}
200
+ {"id":"int-dee5c940","kind":"field_change","created_at":"2026-04-19T14:41:33.667793781Z","actor":"Denis Kiselev","issue_id":"EV-hjse","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Premise invalidated by EV-dhs1: no hardcoded version string in MCP code. Both paths already use Evilution::VERSION constant."}}
201
+ {"id":"int-67814d98","kind":"field_change","created_at":"2026-04-19T14:41:33.946408807Z","actor":"Denis Kiselev","issue_id":"EV-lkpi","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Premise invalidated by EV-dhs1: no hardcoded version string in MCP code. Both paths already use Evilution::VERSION constant."}}
202
+ {"id":"int-faf00141","kind":"field_change","created_at":"2026-04-19T15:26:24.609462146Z","actor":"Denis Kiselev","issue_id":"EV-ckri","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged via PR #776"}}
203
+ {"id":"int-359235bd","kind":"field_change","created_at":"2026-04-19T15:26:29.344647393Z","actor":"Denis Kiselev","issue_id":"EV-pblo","extra":{"field":"status","new_value":"in_progress","old_value":"open"}}
204
+ {"id":"int-98d54cf5","kind":"field_change","created_at":"2026-04-19T16:52:53.787857361Z","actor":"Denis Kiselev","issue_id":"EV-g56w","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged via PR #779"}}
205
+ {"id":"int-23e3912a","kind":"field_change","created_at":"2026-04-19T17:13:11.431552936Z","actor":"Denis Kiselev","issue_id":"EV-0qjd","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged via PR #780"}}
206
+ {"id":"int-bc991877","kind":"field_change","created_at":"2026-04-20T02:51:29.636495065Z","actor":"Denis Kiselev","issue_id":"EV-ojot","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Baseline captured + posted to GH #742. Peak RSS 411 MB (vs 869 orig). No leak across 351 mutations. Threshold candidate for B5: 280 MB."}}
207
+ {"id":"int-114b49b1","kind":"field_change","created_at":"2026-04-20T03:03:43.714014784Z","actor":"Denis Kiselev","issue_id":"EV-gtod","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Audit complete. Fork is not a leak source. Findings posted to GH #743. Recommendations rolled into B4 (fix epic)."}}
208
+ {"id":"int-02f0a501","kind":"field_change","created_at":"2026-04-20T03:43:28.689552746Z","actor":"Denis Kiselev","issue_id":"EV-qjmt","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Audit complete. Pool structurally clean. Worker-side heap growth identified as B4 fix target. Findings posted to GH #745."}}
209
+ {"id":"int-584e6b85","kind":"field_change","created_at":"2026-04-20T04:58:00.473019534Z","actor":"Denis Kiselev","issue_id":"EV-vlrg","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged via PR #787. Zombie-on-raise reap landed in Fork. Followups in EV-7nh8/EV-f91x."}}
210
+ {"id":"int-d432c007","kind":"field_change","created_at":"2026-04-20T05:34:17.505137781Z","actor":"Denis Kiselev","issue_id":"EV-r77x","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
211
+ {"id":"int-ee66c8d8","kind":"field_change","created_at":"2026-04-20T05:42:55.359712675Z","actor":"Denis Kiselev","issue_id":"EV-f91x","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
212
+ {"id":"int-5c649a45","kind":"field_change","created_at":"2026-04-20T09:05:45.015112347Z","actor":"Denis Kiselev","issue_id":"EV-6u4b","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
213
+ {"id":"int-aa5ae01a","kind":"field_change","created_at":"2026-04-20T09:47:42.130773834Z","actor":"Denis Kiselev","issue_id":"EV-7nh8","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
214
+ {"id":"int-f6c4a9c5","kind":"field_change","created_at":"2026-04-20T10:11:07.439088993Z","actor":"Denis Kiselev","issue_id":"EV-tuz0","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
215
+ {"id":"int-4231479b","kind":"field_change","created_at":"2026-04-20T10:22:21.362054652Z","actor":"Denis Kiselev","issue_id":"EV-9vq4","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
216
+ {"id":"int-ff9b86c5","kind":"field_change","created_at":"2026-04-20T10:47:59.380162274Z","actor":"Denis Kiselev","issue_id":"EV-rf98","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
217
+ {"id":"int-41cd9916","kind":"field_change","created_at":"2026-04-20T10:58:18.145076185Z","actor":"Denis Kiselev","issue_id":"EV-sbq1","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
218
+ {"id":"int-2946b593","kind":"field_change","created_at":"2026-04-20T10:58:57.835726035Z","actor":"Denis Kiselev","issue_id":"EV-wrse","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged — spec_selector.rb landed on master (commit 1f38f72)"}}
219
+ {"id":"int-27d7552a","kind":"field_change","created_at":"2026-04-20T11:19:32.391218628Z","actor":"Denis Kiselev","issue_id":"EV-5j1u","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
220
+ {"id":"int-43ca2ac9","kind":"field_change","created_at":"2026-04-20T11:32:46.220570596Z","actor":"Denis Kiselev","issue_id":"EV-14jj","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
221
+ {"id":"int-168ecedc","kind":"field_change","created_at":"2026-04-20T11:49:59.790731318Z","actor":"Denis Kiselev","issue_id":"EV-7i6t","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
222
+ {"id":"int-b007ce5d","kind":"field_change","created_at":"2026-04-20T12:08:08.644044755Z","actor":"Denis Kiselev","issue_id":"EV-p7nm","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
223
+ {"id":"int-c93991d3","kind":"field_change","created_at":"2026-04-20T12:34:05.7132637Z","actor":"Denis Kiselev","issue_id":"EV-71be","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
224
+ {"id":"int-6f0aad07","kind":"field_change","created_at":"2026-04-20T13:57:39.757055532Z","actor":"Denis Kiselev","issue_id":"EV-r1ii","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
225
+ {"id":"int-9e15518d","kind":"field_change","created_at":"2026-04-20T13:57:40.052132758Z","actor":"Denis Kiselev","issue_id":"EV-7rpg","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
226
+ {"id":"int-79fdd807","kind":"field_change","created_at":"2026-04-20T15:05:28.985115609Z","actor":"Denis Kiselev","issue_id":"EV-mczd","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
227
+ {"id":"int-f4d0d9f6","kind":"field_change","created_at":"2026-04-20T15:31:50.422670854Z","actor":"Denis Kiselev","issue_id":"EV-s2ta","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"merged to master (EV-s2ta via commit 5c00d6b / GH #735, EV-pblo via PR merging GH #739); bead status lagging"}}
228
+ {"id":"int-b4860441","kind":"field_change","created_at":"2026-04-20T15:31:50.730121806Z","actor":"Denis Kiselev","issue_id":"EV-pblo","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"merged to master (EV-s2ta via commit 5c00d6b / GH #735, EV-pblo via PR merging GH #739); bead status lagging"}}
229
+ {"id":"int-0a7a5348","kind":"field_change","created_at":"2026-04-20T15:58:18.315080169Z","actor":"Denis Kiselev","issue_id":"EV-2qvg","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Benchmark completed. Post-B4 wall at -j 8: 38.6s vs 7456s baseline (193x faster). Zero timeouts vs 25/246 baseline. Score 1.0. Under 60s target achieved. Results posted to GH #744 comment. Remaining gap vs mutant (17s) tracked as follow-up."}}
230
+ {"id":"int-94972aae","kind":"field_change","created_at":"2026-04-20T16:13:12.727090894Z","actor":"Denis Kiselev","issue_id":"EV-0fgx","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged via PR #813 (commit 262b9ae). Integration spec spec/evilution/compare/integration_spec.rb + e2e fixtures landed. 15/15 examples pass."}}
231
+ {"id":"int-4d639e4e","kind":"field_change","created_at":"2026-04-20T16:57:42.95949164Z","actor":"Denis Kiselev","issue_id":"EV-ynlo","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Merged via PR #816. SourceAstCache content-keyed LRU + ExampleFilter integration + BaselineRunner wiring."}}
232
+ {"id":"int-c15ed3e8","kind":"field_change","created_at":"2026-04-20T17:49:38.782150309Z","actor":"Denis Kiselev","issue_id":"EV-toid","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
data/CHANGELOG.md CHANGED
@@ -1,5 +1,56 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.25.0] - 2026-04-21
4
+
5
+ ### Added
6
+
7
+ - **`compare` command** — compare two saved mutation runs (JSON files, e.g. `.evilution/results/*.json`) and categorize each mutation into fixed / new / persistent / flaky / reintroduced buckets; supports `--against PATH --current PATH` flag binding or positional paths, emits `--format json` or `text`. Useful for CI gates that track regressions between runs (#746, #749, #750, #810, #811, #812, #813)
8
+ - **Per-mutation example targeting** — when a mutation is scoped to a specific method, the RSpec integration filters the resolved spec file to only the examples whose body text references symbols from the mutated method; typical workloads run a fraction of the file per mutation. New flags: `--no-example-targeting` disables the optimization, `--example-targeting-fallback MODE` picks between `full_file` (default) and `unresolved` when no example matches. Also adds `--spec-pattern GLOB` to restrict resolved spec candidates (#732, #800, #801, #802, #803, PR #816)
9
+ - **`:unparseable` mutation status** — mutations whose generated source fails to parse (e.g. dangling heredoc openers after `method_body_replacement`) are short-circuited before test execution and reported as a separate status, excluded from the score like `:unresolved`. Includes HTML, JSON, and text reporter support, MCP `info statuses` action, and a dedicated HTML "Unparseable" details section (#724, #725, #726, #728, #731)
10
+ - **`:neutral` details in HTML report** — surfaces mutations that were reclassified as neutral (infra errors, baseline-failed specs) in a dedicated HTML section so users can distinguish them from real kills (#758, #759)
11
+ - **Per-worker SQLite DB isolation** — `Parallel::WorkQueue` sets `ENV["TEST_ENV_NUMBER"]` per forked worker (`""` for worker 1, `"2"` for worker 2, …) following the [`parallel_tests`](https://github.com/grosser/parallel_tests) convention; Rails apps whose `config/database.yml` interpolates `TEST_ENV_NUMBER` now get one SQLite file per worker. When a parallel run is detected against a SQLite-backed `test:` section, evilution prints a one-time startup notice pointing to the README (#817, #819)
12
+ - **Infrastructure error neutralization** — results are reclassified as `:neutral` when the failure came from test infrastructure rather than the mutation itself. Two independent paths: (1) `:error` from `LoadError` / `NameError` whose first backtrace frame is `spec_helper.rb`, `rails_helper.rb`, or `spec/support/`; (2) `:killed` from a CrashDetector `test_crashed` whose sole crash class is in `INFRA_CRASH_CLASSES` (`ActiveRecord::StatementTimeout`, `ActiveRecord::Deadlocked`, `ActiveRecord::ConnectionTimeoutError`, `ActiveRecord::LockWaitTimeout`, `Timeout::Error`, `SQLite3::BusyException`). Keeps mutation scores clean under parallel DB contention and broken spec setup (#757, #814, #818)
13
+ - **Worker recycling** — `Parallel::WorkQueue` accepts `worker_max_items: N` to spawn a fresh worker after every N mutations; prevents unbounded RSS growth on long parallel runs. Defaults to no recycling. Works alongside `prefetch > 1` with bounded overshoot (#785)
14
+ - **`evil` executable** — short alias for `evilution` (handy with `alias be='bundle exec'` → `be evil run ...`) (#720)
15
+ - **`:unresolved` mutation status** — mutations whose source file has no resolvable spec/test are reported as `:unresolved` (coverage gap, not a failure) instead of erroring out; `--fallback-full-suite` still opts into running the whole suite (#718, #719)
16
+ - **MCP `info statuses` action** — returns a glossary of mutation result statuses (survived / killed / timeout / error / neutral / equivalent / unresolved / unparseable) with descriptions (#756)
17
+ - **RSpec evilution templates** — scaffold files helping users stand up evilution config and CI workflows faster (#488)
18
+ - **Peak-RSS regression spec** — benchmark fixture that asserts a 250-mutation workload stays under the documented peak-RSS budget; guards against memory regressions in isolation and pool code paths (#748)
19
+ - **Source AST caching** — caches parsed ASTs keyed by path + mtime, reducing re-parse cost when the same source file is referenced by multiple mutation plans in one run (#772, #803)
20
+ - **Survived-mutant unified diff output** — CLI and JSON surfacing of unified diffs alongside each survived entry (and in `util mutation`), matching the inline-patch format used by reviewers (#733, #735, #737, #741)
21
+
22
+ ### Changed
23
+
24
+ - **Argument mutators refactored** — shared collaborators for position-style argument mutators (array/hash/call args); no user-visible behavior change (#734)
25
+ - **`MCP::Mutate` refactored** — split into focused collaborators; no user-visible behavior change (#489)
26
+ - **`ReportTrimmer` enhancements** — supports new statuses (`:unresolved`, `:unparseable`, `:neutral`) and keeps JSON/HTML output compact on big runs (#763)
27
+ - **Minitest assertion lookup refactored** — assertion values use indexed lookup instead of linear scans when matching integration mutators (perf win on large test suites) (#780)
28
+ - **`SourceSurgeon` parse status exposed** — carries a `parse_status` field through to `MutationResult` so the runner can short-circuit unparseable mutations cleanly (#724)
29
+ - **Original and mutated slices tracked on every mutation** — `Mutation` now carries both `original_slice` and `mutated_slice`, enabling accurate diff rendering without re-reading source files (#730)
30
+
31
+ ### Fixed
32
+
33
+ - **`ThreadError: can't be called from trap context` in `TempDirTracker.cleanup_all`** — the signal handler installed by `Runner` called `FileUtils.rm_rf` under `Signal.trap`, which raises `ThreadError` for mutex operations executed from a trap context; now the cleanup path avoids the mutex when invoked from trap and falls back to direct enumeration with graceful `Errno::ENOENT` rescue (#793)
34
+ - **`Encoding::UndefinedConversionError` under Rails with `Encoding.default_internal = UTF-8`** — `Parallel::WorkQueue` pipes default to text mode and transcoded ASCII-8BIT Marshal payloads to UTF-8, failing on any high byte with no UTF-8 mapping; all pipe ends are now forced into `binmode` (#786, #788)
35
+ - **Zombie worker processes on mid-run errors** — when a worker exited unexpectedly or the map raised, `Parallel::WorkQueue` left children in a zombie state until the main process exited; now reaps child PIDs on every error path (#747)
36
+ - **Preload / spec_helper load errors** (continued from 0.22.x) — consolidated fallback logic so missing `rspec-core` surfaces a clear `ConfigError` rather than a bare `LoadError` in parallel runs (#742, #743, #745)
37
+
38
+ ## [0.24.0] - 2026-04-14
39
+
40
+ ### Added
41
+
42
+ - **`--fallback-full-suite` CLI flag** — when a mutation has no matching spec/test (spec resolver finds nothing), run the whole test suite instead of marking the mutation `:unresolved` and skipping; opt-in so the default remains fast (#697, PR #707)
43
+
44
+ ### Fixed
45
+
46
+ - **`require_relative` in mutated files broken for sibling files** — the previous temp-dir copy strategy wrote the mutated source to a scratch directory where sibling source files did not exist, so any `require_relative "./sibling"` inside a mutated file failed to resolve; `Evilution::Integration::Base` now evaluates mutated source via `eval` with `__FILE__` set to the original path, so `require_relative` and `__dir__` resolve against the real source tree (#700, PR #708)
47
+
48
+ ### Changed
49
+
50
+ - **Internal `Evilution::Reporter::HTML` refactor** — `lib/evilution/reporter/html.rb` (previously 410 lines) decomposed into section collaborators with one ERB template per section and CSS extracted to `lib/evilution/reporter/html/assets/style.css`; no output changes (#487, PR #712)
51
+ - **Internal `Evilution::Runner` refactor** — extracted `BaselineRunner`, `IsolationResolver`, `MutationPlanner`, `SubjectPipeline`, `Diagnostics`, `MutationExecutor`, and `ReportPublisher` collaborators; no user-visible behavior change (#486, PR #711)
52
+ - **Internal `Evilution::CLI::Parser` refactor** — decomposed into `CommandExtractor`, `FileArgs`, `OptionsBuilder`, and `StdinReader`; no user-visible behavior change (#703, PR #706)
53
+
3
54
  ## [0.23.0] - 2026-04-14
4
55
 
5
56
  ### Changed