necropsy 0.1.0 → 0.3.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 (131) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +33 -0
  3. data/CHANGELOG.md +44 -0
  4. data/MEASUREMENTS.md +112 -0
  5. data/README.md +233 -16
  6. data/Rakefile +3 -1
  7. data/bench/README.md +92 -0
  8. data/bench/audit.rb +113 -0
  9. data/bench/audits/0.2.1/audit.json +501 -0
  10. data/bench/audits/0.2.1/audit.md +55 -0
  11. data/bench/audits/0.2.1/baseline_performance.yml +16 -0
  12. data/bench/audits/0.2.1/config.yml +42 -0
  13. data/bench/audits/0.2.1/review.yml +56 -0
  14. data/bench/audits/0.2.1/review_queue.yml +3651 -0
  15. data/bench/corpora/v1/README.md +30 -0
  16. data/bench/corpora/v1/labels.yml +37 -0
  17. data/bench/corpora/v1/manifest.yml +63 -0
  18. data/bench/corpora/v1/rubocop.necropsy.yml +7 -0
  19. data/bench/corpora/v1/self.necropsy.yml +8 -0
  20. data/bench/corpora/v1/tools/debride.yml +42 -0
  21. data/bench/corpora/v1/tools/spoom.yml +12 -0
  22. data/bench/corpora/v1/tools/type_aware.yml +11 -0
  23. data/bench/golden/v1/candidate_union.json +21918 -0
  24. data/bench/golden/v1/metadata.json +12 -0
  25. data/bench/golden/v1/reports/dynamic_evidence.json +146 -0
  26. data/bench/golden/v1/reports/plain_ruby.json +135 -0
  27. data/bench/golden/v1/reports/rails.json +176 -0
  28. data/bench/golden/v1/reports/rubocop_1_75_0.json +26848 -0
  29. data/bench/golden/v1/reports/self.json +3449 -0
  30. data/bench/review_queue.rb +35 -0
  31. data/bench/run.rb +31 -0
  32. data/bench/schema/candidate-union-v1.schema.json +70 -0
  33. data/docs/impv_implementation_matrix.md +179 -0
  34. data/docs/migrations/0.2.1.md +57 -0
  35. data/docs/migrations/0.3.0.md +207 -0
  36. data/docs/migrations/0.4.0.md +13 -0
  37. data/docs/necropsy_performance_adr.md +43 -0
  38. data/docs/necropsy_scope_decisions.md +58 -0
  39. data/docs/necropsy_type_facts_adr.md +22 -0
  40. data/gemfiles/prism_min.gemfile +9 -0
  41. data/gemfiles/prism_min.gemfile.lock +50 -0
  42. data/lib/necropsy/analyzer.rb +121 -2
  43. data/lib/necropsy/analyzers/dynamic/coverage_collector.rb +81 -19
  44. data/lib/necropsy/analyzers/dynamic/coverage_importer.rb +104 -10
  45. data/lib/necropsy/analyzers/dynamic/coverband_importer.rb +74 -250
  46. data/lib/necropsy/analyzers/dynamic/coverband_payload_set.rb +149 -0
  47. data/lib/necropsy/analyzers/dynamic/observation_policy.rb +96 -0
  48. data/lib/necropsy/analyzers/dynamic/redis_input_limits.rb +121 -0
  49. data/lib/necropsy/analyzers/dynamic/redis_nonblocking_io.rb +94 -0
  50. data/lib/necropsy/analyzers/dynamic/redis_payload_loader.rb +165 -0
  51. data/lib/necropsy/analyzers/dynamic/redis_transport.rb +217 -0
  52. data/lib/necropsy/analyzers/dynamic/runtime_reference.rb +96 -0
  53. data/lib/necropsy/analyzers/dynamic/trace_point_collector.rb +225 -20
  54. data/lib/necropsy/analyzers/dynamic/trace_point_importer.rb +3 -1
  55. data/lib/necropsy/analyzers/legacy_result_adapter.rb +226 -0
  56. data/lib/necropsy/analyzers/static/cha.rb +33 -69
  57. data/lib/necropsy/analyzers/static/name_resolution.rb +151 -21
  58. data/lib/necropsy/analyzers/static/rta.rb +249 -25
  59. data/lib/necropsy/ast_scanner/call_recording.rb +275 -0
  60. data/lib/necropsy/ast_scanner/call_site_creation.rb +54 -0
  61. data/lib/necropsy/ast_scanner/definition_creation.rb +43 -0
  62. data/lib/necropsy/ast_scanner/dsl_macros.rb +532 -0
  63. data/lib/necropsy/ast_scanner/method_definitions.rb +358 -0
  64. data/lib/necropsy/ast_scanner/references.rb +115 -0
  65. data/lib/necropsy/ast_scanner/ruby_semantics.rb +263 -0
  66. data/lib/necropsy/ast_scanner/traversal.rb +347 -0
  67. data/lib/necropsy/ast_scanner/value_definitions.rb +78 -0
  68. data/lib/necropsy/ast_scanner.rb +89 -564
  69. data/lib/necropsy/bench/candidate_union.rb +555 -0
  70. data/lib/necropsy/bench/claim_gate.rb +112 -0
  71. data/lib/necropsy/bench/evaluator.rb +356 -24
  72. data/lib/necropsy/bench/finding_facts.rb +152 -0
  73. data/lib/necropsy/bench/precision_gate.rb +144 -0
  74. data/lib/necropsy/bench/release_audit/adversarial_runner.rb +56 -0
  75. data/lib/necropsy/bench/release_audit/artifact_writer.rb +112 -0
  76. data/lib/necropsy/bench/release_audit/config_validator.rb +112 -0
  77. data/lib/necropsy/bench/release_audit/git_snapshot.rb +36 -0
  78. data/lib/necropsy/bench/release_audit/performance_gate.rb +165 -0
  79. data/lib/necropsy/bench/release_audit/run_provenance.rb +133 -0
  80. data/lib/necropsy/bench/release_audit.rb +360 -0
  81. data/lib/necropsy/bench/report_normalizer.rb +140 -0
  82. data/lib/necropsy/bench/review_queue.rb +154 -0
  83. data/lib/necropsy/bench/safety_mutation_harness.rb +59 -0
  84. data/lib/necropsy/bench/seed_runner.rb +408 -0
  85. data/lib/necropsy/bounded_canonicalizer.rb +218 -0
  86. data/lib/necropsy/cache/scan_cache.rb +94 -18
  87. data/lib/necropsy/call_site_identity.rb +54 -0
  88. data/lib/necropsy/cli.rb +296 -53
  89. data/lib/necropsy/clock.rb +40 -0
  90. data/lib/necropsy/confidence/scorer.rb +181 -58
  91. data/lib/necropsy/configuration.rb +339 -18
  92. data/lib/necropsy/convention_rules.rb +138 -0
  93. data/lib/necropsy/definition_identity/canonical_digest.rb +278 -0
  94. data/lib/necropsy/definition_identity.rb +37 -0
  95. data/lib/necropsy/diagnostics.rb +342 -0
  96. data/lib/necropsy/embedded_ruby.rb +55 -0
  97. data/lib/necropsy/entry_points/plain.rb +125 -7
  98. data/lib/necropsy/entry_points/rails.rb +422 -105
  99. data/lib/necropsy/entry_points/test.rb +6 -1
  100. data/lib/necropsy/flow_interpreter.rb +460 -0
  101. data/lib/necropsy/graph/blocker_matching.rb +338 -0
  102. data/lib/necropsy/graph/call_graph.rb +1234 -62
  103. data/lib/necropsy/graph/definition_index.rb +149 -0
  104. data/lib/necropsy/graph/dynamic_evidence_tracking.rb +206 -0
  105. data/lib/necropsy/graph/evidence_store.rb +213 -0
  106. data/lib/necropsy/graph/resolution_store.rb +497 -0
  107. data/lib/necropsy/graph_self_check.rb +79 -0
  108. data/lib/necropsy/guardrail/baseline.rb +359 -13
  109. data/lib/necropsy/guardrail/diff.rb +5 -2
  110. data/lib/necropsy/guardrail/quarantine.rb +101 -10
  111. data/lib/necropsy/load_graph.rb +206 -0
  112. data/lib/necropsy/models.rb +894 -21
  113. data/lib/necropsy/performance_profiler.rb +108 -0
  114. data/lib/necropsy/project.rb +361 -13
  115. data/lib/necropsy/reachability/engine.rb +80 -15
  116. data/lib/necropsy/reference_barrier.rb +458 -0
  117. data/lib/necropsy/report.rb +153 -14
  118. data/lib/necropsy/reporter.rb +441 -19
  119. data/lib/necropsy/runner.rb +258 -14
  120. data/lib/necropsy/runtime_feedback.rb +136 -0
  121. data/lib/necropsy/semantics_matrix.rb +153 -0
  122. data/lib/necropsy/trace_point_runtime.rb +19 -0
  123. data/lib/necropsy/type_facts.rb +53 -0
  124. data/lib/necropsy/version.rb +1 -1
  125. data/lib/necropsy/why_not_explanation.rb +436 -0
  126. data/lib/necropsy/why_not_renderer.rb +197 -0
  127. data/lib/necropsy/world_policy.rb +90 -0
  128. data/lib/necropsy.rb +39 -2
  129. data/schema/necropsy-report-v2.schema.json +366 -0
  130. data/script/measure.rb +20 -0
  131. metadata +106 -2
@@ -0,0 +1,42 @@
1
+ schema_version: 1
2
+ release: 0.2.1
3
+ corpora: [dynamic_evidence, plain_ruby, rails, rubocop_1_75_0, self]
4
+
5
+ baseline:
6
+ git_ref: d0168e881120320d28dc2f42e10f9947330fdcb7
7
+ reports_path: bench/golden/v1/reports
8
+ reason: >-
9
+ d0168e881120320d28dc2f42e10f9947330fdcb7 is the first commit with the bounded evidence
10
+ identity path and artifact-independent production scopes for all five required corpora.
11
+
12
+ labels_path: bench/corpora/v1/labels.yml
13
+
14
+ review:
15
+ path: bench/audits/0.2.1/review.yml
16
+ corpora:
17
+ rails: { strategy: all }
18
+ rubocop_1_75_0: { strategy: stratified, minimum_per_stratum: 5 }
19
+
20
+ performance:
21
+ baseline_path: bench/audits/0.2.1/baseline_performance.yml
22
+ wall_time_ratio: 1.5
23
+ wall_time_allowance_seconds: 0.75
24
+ max_wall_time_seconds:
25
+ dynamic_evidence: 1.0
26
+ plain_ruby: 1.0
27
+ rails: 2.0
28
+ rubocop_1_75_0: 10.0
29
+ self: 30.0
30
+ rss_ratio: 1.25
31
+ rss_allowance_kb: 65536
32
+ max_rss_kb: 1300000
33
+
34
+ adversarial_suites:
35
+ ambiguity:
36
+ command: [bundle, exec, rspec, spec/necropsy/safety_invariants_spec.rb, spec/necropsy/reflective_blocker_visibility_spec.rb]
37
+ dynamic:
38
+ command: [bundle, exec, rspec, spec/necropsy/analyzers/dynamic/coverage_importer_spec.rb, spec/necropsy/confidence/scorer_spec.rb]
39
+ parse:
40
+ command: [bundle, exec, rspec, spec/necropsy/parse_incompleteness_spec.rb, spec/necropsy/safety_mutation_spec.rb]
41
+ remote_input:
42
+ command: [bundle, exec, rspec, spec/necropsy/analyzers/dynamic/coverband_importer_spec.rb]
@@ -0,0 +1,56 @@
1
+ schema_version: 1
2
+ reviews:
3
+ - corpus: rubocop_1_75_0
4
+ change_type: state_changed
5
+ id: "RuboCop::Cop::Force#cops"
6
+ outcome: expected_safety_change
7
+ rationale: "A runtime unknown-dispatch blocker now conservatively overrides test-only status, so this finding cannot remain a deletion candidate."
8
+ reviewer: maintainer
9
+ - corpus: rubocop_1_75_0
10
+ change_type: state_changed
11
+ id: "RuboCop::Cop::Force#name"
12
+ outcome: expected_safety_change
13
+ rationale: "Runtime dispatch by name is incomplete; blocked correctly takes precedence over the prior test-only conclusion."
14
+ reviewer: maintainer
15
+ - corpus: rubocop_1_75_0
16
+ change_type: state_changed
17
+ id: "RuboCop::DirectiveComment#range"
18
+ outcome: expected_safety_change
19
+ rationale: "The new unresolved runtime call scope matches range, making blocked safer than the legacy test-only state."
20
+ reviewer: maintainer
21
+ - corpus: rubocop_1_75_0
22
+ change_type: state_changed
23
+ id: "RuboCop::Formatter::SimpleTextFormatter#message"
24
+ outcome: expected_safety_change
25
+ rationale: "An unresolved runtime message call can target this method, so the blocked transition withdraws the candidate conservatively."
26
+ reviewer: maintainer
27
+ - corpus: rubocop_1_75_0
28
+ change_type: state_changed
29
+ id: "RuboCop::CLI::Command::AutoGenerateConfig#run"
30
+ outcome: expected_safety_change
31
+ rationale: "CLI command classes are registry-selected; the run blocker removes a known dynamic-registry false positive from candidates."
32
+ reviewer: maintainer
33
+ - corpus: rubocop_1_75_0
34
+ change_type: state_changed
35
+ id: "RuboCop::CLI::Command::ExecuteRunner#run"
36
+ outcome: expected_safety_change
37
+ rationale: "CLI command classes are registry-selected; the run blocker removes a known dynamic-registry false positive from candidates."
38
+ reviewer: maintainer
39
+ - corpus: rubocop_1_75_0
40
+ change_type: state_changed
41
+ id: "RuboCop::CLI::Command::InitDotfile#run"
42
+ outcome: expected_safety_change
43
+ rationale: "CLI command classes are registry-selected; the run blocker removes a known dynamic-registry false positive from candidates."
44
+ reviewer: maintainer
45
+ - corpus: rubocop_1_75_0
46
+ change_type: state_changed
47
+ id: "RuboCop::CLI::Command::LSP#run"
48
+ outcome: expected_safety_change
49
+ rationale: "CLI command classes are registry-selected; the run blocker removes a known dynamic-registry false positive from candidates."
50
+ reviewer: maintainer
51
+ - corpus: rubocop_1_75_0
52
+ change_type: state_changed
53
+ id: "RuboCop::CLI::Command::ShowCops#run"
54
+ outcome: expected_safety_change
55
+ rationale: "CLI command classes are registry-selected; the run blocker removes a known dynamic-registry false positive from candidates."
56
+ reviewer: maintainer