rigortype 0.4.4 → 0.4.5

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 (147) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -5
  3. data/docs/handbook/11-sig-gen.md +90 -17
  4. data/docs/manual/02-cli-reference.md +39 -9
  5. data/docs/manual/03-configuration.md +10 -8
  6. data/docs/manual/04-diagnostics.md +16 -5
  7. data/docs/manual/05-inspecting-types.md +2 -2
  8. data/docs/manual/06-baseline.md +1 -1
  9. data/docs/manual/07-plugins.md +2 -1
  10. data/docs/manual/08-skills.md +7 -0
  11. data/docs/manual/10-mcp-server.md +8 -1
  12. data/docs/manual/18-removing-dead-code.md +18 -7
  13. data/docs/manual/plugins/rigor-rspec.md +101 -1
  14. data/lib/rigor/analysis/check_rules/clause_coverage.rb +134 -0
  15. data/lib/rigor/analysis/check_rules/lexical_method_sites.rb +111 -7
  16. data/lib/rigor/analysis/check_rules/rbs_receiver_surface.rb +190 -0
  17. data/lib/rigor/analysis/check_rules/rule_ids.rb +3 -1
  18. data/lib/rigor/analysis/check_rules/source_arity.rb +32 -3
  19. data/lib/rigor/analysis/check_rules/unreachable_clause_collector.rb +13 -4
  20. data/lib/rigor/analysis/check_rules.rb +228 -15
  21. data/lib/rigor/analysis/dependency_source_inference/walker.rb +2 -1
  22. data/lib/rigor/analysis/incremental.rb +49 -0
  23. data/lib/rigor/analysis/incremental_run_slot/write_guard.rb +36 -18
  24. data/lib/rigor/analysis/incremental_session.rb +166 -24
  25. data/lib/rigor/analysis/path_expansion.rb +3 -1
  26. data/lib/rigor/analysis/reachability/graph.rb +90 -13
  27. data/lib/rigor/analysis/reachability/scan.rb +279 -39
  28. data/lib/rigor/analysis/rule_catalog.rb +17 -4
  29. data/lib/rigor/analysis/runner/pool_coordinator.rb +69 -16
  30. data/lib/rigor/analysis/runner.rb +69 -65
  31. data/lib/rigor/analysis/severity_stamp.rb +11 -0
  32. data/lib/rigor/analysis/worker_session.rb +12 -1
  33. data/lib/rigor/cache/descriptor.rb +40 -7
  34. data/lib/rigor/cache/engine_source.rb +3 -2
  35. data/lib/rigor/cache/incremental_snapshot.rb +26 -8
  36. data/lib/rigor/cache/rbs_descriptor.rb +2 -1
  37. data/lib/rigor/cache/store.rb +4 -3
  38. data/lib/rigor/cli/command.rb +3 -1
  39. data/lib/rigor/cli/docs_command.rb +3 -2
  40. data/lib/rigor/cli/doctor_command.rb +1 -1
  41. data/lib/rigor/cli/explain_command.rb +3 -2
  42. data/lib/rigor/cli/plugin_command.rb +2 -1
  43. data/lib/rigor/cli/plugins_command.rb +2 -1
  44. data/lib/rigor/cli/sig_gen_command.rb +32 -11
  45. data/lib/rigor/cli/skill_command.rb +2 -1
  46. data/lib/rigor/cli/skill_describe.rb +3 -2
  47. data/lib/rigor/cli/unused_command.rb +10 -7
  48. data/lib/rigor/cli.rb +3 -2
  49. data/lib/rigor/config_audit.rb +60 -15
  50. data/lib/rigor/configuration/severity_profile.rb +20 -2
  51. data/lib/rigor/configuration.rb +29 -3
  52. data/lib/rigor/effects/signature_sources.rb +3 -1
  53. data/lib/rigor/environment/bundle_sig_discovery.rb +3 -2
  54. data/lib/rigor/environment/gated_signature_guard.rb +2 -1
  55. data/lib/rigor/environment/gated_signature_plan.rb +2 -1
  56. data/lib/rigor/environment/installed_gem_set.rb +2 -1
  57. data/lib/rigor/environment/missing_gem_constant_index.rb +4 -3
  58. data/lib/rigor/environment/rbs_loader.rb +21 -1
  59. data/lib/rigor/inference/block_call_timing.rb +7 -1
  60. data/lib/rigor/inference/builtins/method_catalog.rb +2 -1
  61. data/lib/rigor/inference/captured_locals.rb +44 -13
  62. data/lib/rigor/inference/clause_widening.rb +90 -0
  63. data/lib/rigor/inference/definer_resolution.rb +87 -20
  64. data/lib/rigor/inference/expression_typer.rb +35 -5
  65. data/lib/rigor/inference/intervening_ivar_reset.rb +303 -0
  66. data/lib/rigor/inference/macro_block_self_type.rb +20 -6
  67. data/lib/rigor/inference/method_dispatcher/constant_folding.rb +170 -35
  68. data/lib/rigor/inference/method_dispatcher/rbs_dispatch.rb +50 -2
  69. data/lib/rigor/inference/method_dispatcher.rb +67 -3
  70. data/lib/rigor/inference/module_function_state.rb +137 -42
  71. data/lib/rigor/inference/narrowing.rb +54 -10
  72. data/lib/rigor/inference/parameter_inference_collector.rb +4 -26
  73. data/lib/rigor/inference/project_patched_methods.rb +168 -4
  74. data/lib/rigor/inference/project_patched_mixins.rb +162 -0
  75. data/lib/rigor/inference/project_patched_scanner.rb +51 -12
  76. data/lib/rigor/inference/project_patched_visibility.rb +214 -0
  77. data/lib/rigor/inference/project_seed_tables.rb +120 -0
  78. data/lib/rigor/inference/refined_dispatch/constructed_class.rb +113 -0
  79. data/lib/rigor/inference/refined_dispatch/own_method.rb +41 -12
  80. data/lib/rigor/inference/reflective_ivar_write.rb +6 -6
  81. data/lib/rigor/inference/return_barrier.rb +16 -0
  82. data/lib/rigor/inference/scope_indexer.rb +675 -105
  83. data/lib/rigor/inference/self_call_ivar_writes.rb +11 -6
  84. data/lib/rigor/inference/singleton_external_ahead.rb +64 -0
  85. data/lib/rigor/inference/singleton_hook_decline.rb +7 -0
  86. data/lib/rigor/inference/statement_evaluator.rb +446 -139
  87. data/lib/rigor/inference/unthreaded_rebinds.rb +3 -1
  88. data/lib/rigor/lens/contract_reader.rb +45 -2
  89. data/lib/rigor/lens/document.rb +2 -1
  90. data/lib/rigor/lens/file_reader.rb +12 -2
  91. data/lib/rigor/lens/members.rb +16 -2
  92. data/lib/rigor/lens/run.rb +34 -7
  93. data/lib/rigor/mcp/server.rb +2 -2
  94. data/lib/rigor/plugin/base.rb +3 -2
  95. data/lib/rigor/plugin/io_boundary.rb +42 -6
  96. data/lib/rigor/plugin/isolation.rb +4 -3
  97. data/lib/rigor/protection/discovery_seed.rb +9 -36
  98. data/lib/rigor/protection/mutation_cache.rb +8 -2
  99. data/lib/rigor/rooted_glob.rb +27 -0
  100. data/lib/rigor/scope/discovery_index.rb +5 -0
  101. data/lib/rigor/scope/resolution_chain/relevance.rb +14 -0
  102. data/lib/rigor/scope/resolution_chain.rb +40 -5
  103. data/lib/rigor/scope.rb +45 -2
  104. data/lib/rigor/sig_gen/alias_index.rb +2 -1
  105. data/lib/rigor/sig_gen/classification.rb +4 -1
  106. data/lib/rigor/sig_gen/generator.rb +167 -22
  107. data/lib/rigor/sig_gen/layout_index.rb +5 -2
  108. data/lib/rigor/sig_gen/observation_collector.rb +137 -11
  109. data/lib/rigor/sig_gen/renderer.rb +13 -155
  110. data/lib/rigor/sig_gen/skip_reason_catalog.rb +11 -0
  111. data/lib/rigor/sig_gen/write_reporter.rb +203 -0
  112. data/lib/rigor/sig_gen/write_result.rb +3 -1
  113. data/lib/rigor/sig_gen/writer.rb +5 -3
  114. data/lib/rigor/signature_path_audit.rb +4 -2
  115. data/lib/rigor/type/constant.rb +10 -1
  116. data/lib/rigor/version.rb +1 -1
  117. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_discoverer.rb +1 -1
  118. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_discoverer.rb +1 -1
  119. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_discoverer.rb +1 -1
  120. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/render_locals.rb +6 -1
  121. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/view_assigns.rb +1 -1
  122. data/plugins/rigor-active-model-serializers/lib/rigor/plugin/active_model_serializers/serializer_discoverer.rb +1 -1
  123. data/plugins/rigor-activejob/lib/rigor/plugin/activejob/effects.rb +4 -3
  124. data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_discoverer.rb +1 -1
  125. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_discoverer.rb +1 -1
  126. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_discoverer.rb +1 -1
  127. data/plugins/rigor-alba/lib/rigor/plugin/alba/resource_discoverer.rb +1 -1
  128. data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types.rb +1 -1
  129. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_discoverer.rb +1 -1
  130. data/plugins/rigor-ffi/lib/rigor/plugin/ffi/discoverer.rb +38 -9
  131. data/plugins/rigor-ffi/lib/rigor/plugin/ffi/target_detector.rb +1 -1
  132. data/plugins/rigor-pundit/lib/rigor/plugin/pundit/authorization_scan.rb +1 -1
  133. data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_discoverer.rb +1 -1
  134. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_index.rb +7 -2
  135. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_loader.rb +5 -5
  136. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n.rb +18 -17
  137. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes.rb +1 -1
  138. data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_discoverer.rb +1 -1
  139. data/plugins/rigor-sinatra/lib/rigor/plugin/sinatra.rb +4 -2
  140. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet.rb +2 -2
  141. data/plugins/rigor-typelizer/lib/rigor/plugin/typelizer/serializer_discoverer.rb +2 -2
  142. data/sig/rigor/plugin/io_boundary.rbs +5 -2
  143. data/sig/rigor/rooted_glob.rbs +7 -0
  144. data/sig/rigor/scope.rbs +4 -3
  145. data/skills/rigor-doctor/references/01-checks.md +23 -11
  146. data/skills/rigor-type-oracle/references/01-oracle-commands.md +2 -1
  147. metadata +13 -1
@@ -78,17 +78,24 @@ Make sure a single `rigortype` is on the load path.
78
78
  - `warn` — the baseline file failed to load. Check the `baseline:` path
79
79
  in the config.
80
80
 
81
- ### `plugin_gap` — the stack has a plugin that is not enabled
81
+ ### `plugin_gap` — the stack has a plugin that is not listed
82
82
 
83
- Read from the `DEPENDENCIES` section of `Gemfile.lock`.
83
+ Read from the `DEPENDENCIES` section of `Gemfile.lock`, plus the Rails
84
+ components a direct `rails` stands for. A `plugins:` entry counts as
85
+ listing its plugin even with `enabled: false`. Skipped when no
86
+ `.rigor.yml` or `.rigor.dist.yml` is discovered in the current directory.
84
87
 
85
88
  - `fail` — the project depends on gems that bundled plugins model, and
86
- **none** of those plugins is enabled: framework calls will not resolve.
87
- Add the plugins for the stack to `plugins:` (the `rigor-plugin-tune`
88
- skill does this).
89
+ `plugins:` lists **none** of the bundled plugins that model gems (those
90
+ declaring `target_gems:`; `rigor-rbs-inline` does not count): framework
91
+ calls will not resolve. Add the plugins for the stack to `plugins:` (the
92
+ `rigor-plugin-tune` skill does this). Once any such plugin is listed,
93
+ the remaining gaps are reported as the per-plugin warnings below.
89
94
  - `warn` — one per plugin that models a direct dependency but is not
90
- enabled. Enable it, or leave it out deliberately; declining a plugin is
91
- a legitimate choice.
95
+ listed. Add it, or decline it deliberately — declining is a legitimate
96
+ choice, and the way to record it is a `plugins:` entry with
97
+ `enabled: false`. Do not enable an unrelated plugin only to silence
98
+ this check.
92
99
 
93
100
  ### `gemfile_install` — Rigor is a project dependency
94
101
 
@@ -98,10 +105,15 @@ Read from the `DEPENDENCIES` section of `Gemfile.lock`.
98
105
 
99
106
  ### `bundle_layout` — gem-shipped signatures are not discovered
100
107
 
101
- `warn` when a `Gemfile.lock` exists but Rigor cannot locate the installed
102
- bundle (the gems live in the active Ruby's default gem home). Gems that
103
- ship their own `sig/` are then not loaded. Point Rigor at the install
104
- root with `bundler.bundle_path:`, install into `vendor/bundle`, or supply
108
+ `warn` when a `Gemfile.lock` exists in the current directory but Rigor
109
+ cannot locate the installed bundle — typically the gems live in the
110
+ active Ruby's default gem home. Gems that ship their own `sig/` are then
111
+ not loaded. Rigor looks only where the project records the bundle: a
112
+ `bundler.bundle_path:` in `.rigor.yml` is used alone and must exist;
113
+ without one, and unless `bundler.auto_detect: false`, it reads
114
+ `.bundle/config`'s `BUNDLE_PATH`, then an in-tree `vendor/bundle`, then
115
+ the global Bundler config. Point Rigor at the install root with
116
+ `bundler.bundle_path:`, install into `vendor/bundle`, or supply
105
117
  signatures with `rbs collection install` instead.
106
118
 
107
119
  ## Not covered by `rigor doctor`: is the analysis seeing your code?
@@ -212,7 +212,8 @@ rigor explain [<rule>]
212
212
  | `--format=text\|json` | Default `text`. |
213
213
 
214
214
  With no argument it lists every rule. With a rule id, a legacy alias, or
215
- a family prefix (`call`, `flow`, `assert`, `dump`, `def`) it prints the
215
+ a family prefix (`call`, `flow`, `def`, `assert`, `dump`, `global`,
216
+ `suppression`, `static`, `effect`) it prints the
216
217
  rule's firing conditions, the severity per profile, the evidence tier,
217
218
  and how to suppress it.
218
219
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rigortype
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rigor contributors
@@ -446,6 +446,7 @@ files:
446
446
  - lib/rigor/analysis/buffer_binding.rb
447
447
  - lib/rigor/analysis/check_rules.rb
448
448
  - lib/rigor/analysis/check_rules/always_truthy_condition_collector.rb
449
+ - lib/rigor/analysis/check_rules/clause_coverage.rb
449
450
  - lib/rigor/analysis/check_rules/dead_assignment_collector.rb
450
451
  - lib/rigor/analysis/check_rules/dead_version_guard_arms.rb
451
452
  - lib/rigor/analysis/check_rules/declaration_sourced_guard.rb
@@ -455,6 +456,7 @@ files:
455
456
  - lib/rigor/analysis/check_rules/lexical_method_sites.rb
456
457
  - lib/rigor/analysis/check_rules/main_pass_collector.rb
457
458
  - lib/rigor/analysis/check_rules/published_constant_guard.rb
459
+ - lib/rigor/analysis/check_rules/rbs_receiver_surface.rb
458
460
  - lib/rigor/analysis/check_rules/return_in_ensure_collector.rb
459
461
  - lib/rigor/analysis/check_rules/ruby_deprecations.rb
460
462
  - lib/rigor/analysis/check_rules/rule_ids.rb
@@ -705,6 +707,7 @@ files:
705
707
  - lib/rigor/inference/builtins/struct_catalog.rb
706
708
  - lib/rigor/inference/builtins/time_catalog.rb
707
709
  - lib/rigor/inference/captured_locals.rb
710
+ - lib/rigor/inference/clause_widening.rb
708
711
  - lib/rigor/inference/closure_escape_analyzer.rb
709
712
  - lib/rigor/inference/content_join.rb
710
713
  - lib/rigor/inference/coverage_scanner.rb
@@ -743,6 +746,7 @@ files:
743
746
  - lib/rigor/inference/in_effect_refinements/walk.rb
744
747
  - lib/rigor/inference/index_write_widening.rb
745
748
  - lib/rigor/inference/indexed_narrowing.rb
749
+ - lib/rigor/inference/intervening_ivar_reset.rb
746
750
  - lib/rigor/inference/jump_targets.rb
747
751
  - lib/rigor/inference/key_presence_guard.rb
748
752
  - lib/rigor/inference/key_presence_guard/scan.rb
@@ -819,7 +823,10 @@ files:
819
823
  - lib/rigor/inference/project_method_ownership.rb
820
824
  - lib/rigor/inference/project_patched_definedness_guard.rb
821
825
  - lib/rigor/inference/project_patched_methods.rb
826
+ - lib/rigor/inference/project_patched_mixins.rb
822
827
  - lib/rigor/inference/project_patched_scanner.rb
828
+ - lib/rigor/inference/project_patched_visibility.rb
829
+ - lib/rigor/inference/project_seed_tables.rb
823
830
  - lib/rigor/inference/protection_scanner.rb
824
831
  - lib/rigor/inference/range_constant.rb
825
832
  - lib/rigor/inference/rbs_type_translator.rb
@@ -829,6 +836,7 @@ files:
829
836
  - lib/rigor/inference/refine_self.rb
830
837
  - lib/rigor/inference/refined_dispatch.rb
831
838
  - lib/rigor/inference/refined_dispatch/class_object.rb
839
+ - lib/rigor/inference/refined_dispatch/constructed_class.rb
832
840
  - lib/rigor/inference/refined_dispatch/own_method.rb
833
841
  - lib/rigor/inference/refinement_mutation.rb
834
842
  - lib/rigor/inference/reflective_ivar_write.rb
@@ -844,6 +852,7 @@ files:
844
852
  - lib/rigor/inference/scope_indexer/mixin_accumulator.rb
845
853
  - lib/rigor/inference/scope_indexer/superclasses_collector.rb
846
854
  - lib/rigor/inference/self_call_ivar_writes.rb
855
+ - lib/rigor/inference/singleton_external_ahead.rb
847
856
  - lib/rigor/inference/singleton_hook_decline.rb
848
857
  - lib/rigor/inference/singleton_object_constant.rb
849
858
  - lib/rigor/inference/statement_evaluator.rb
@@ -946,6 +955,7 @@ files:
946
955
  - lib/rigor/reflection.rb
947
956
  - lib/rigor/reflection/constant_ancestors.rb
948
957
  - lib/rigor/reflection/constant_path.rb
958
+ - lib/rigor/rooted_glob.rb
949
959
  - lib/rigor/runtime/jit.rb
950
960
  - lib/rigor/scope.rb
951
961
  - lib/rigor/scope/discovery_index.rb
@@ -969,6 +979,7 @@ files:
969
979
  - lib/rigor/sig_gen/skip_reason_catalog.rb
970
980
  - lib/rigor/sig_gen/superclass_spelling.rb
971
981
  - lib/rigor/sig_gen/type_elaborator.rb
982
+ - lib/rigor/sig_gen/write_reporter.rb
972
983
  - lib/rigor/sig_gen/write_result.rb
973
984
  - lib/rigor/sig_gen/writer.rb
974
985
  - lib/rigor/signature_path_audit.rb
@@ -1290,6 +1301,7 @@ files:
1290
1301
  - sig/rigor/plugin/type_node_resolver.rbs
1291
1302
  - sig/rigor/rbs_extended.rbs
1292
1303
  - sig/rigor/reflection.rbs
1304
+ - sig/rigor/rooted_glob.rbs
1293
1305
  - sig/rigor/scope.rbs
1294
1306
  - sig/rigor/sig_gen/skip_reason_catalog.rbs
1295
1307
  - sig/rigor/source.rbs