rigortype 0.4.6 → 0.4.7

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 (417) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/data/gem_overlay/activesupport/core_ext.rbs +16 -13
  4. data/data/vendored_gem_sigs/bundler/bundler.rbs +1 -1
  5. data/data/vendored_gem_sigs/rubygems/rubygems_extras.rbs +4 -3
  6. data/docs/handbook/01-getting-started.md +5 -2
  7. data/docs/handbook/11-sig-gen.md +50 -3
  8. data/docs/handbook/appendix-phpstan.md +4 -4
  9. data/docs/manual/02-cli-reference.md +152 -26
  10. data/docs/manual/03-configuration.md +36 -3
  11. data/docs/manual/06-baseline.md +6 -4
  12. data/docs/manual/09-editor-integration.md +13 -2
  13. data/docs/manual/10-mcp-server.md +38 -2
  14. data/docs/manual/12-caching.md +4 -3
  15. data/docs/manual/plugins/rigor-actionpack.md +19 -11
  16. data/docs/manual/plugins/rigor-activesupport-core-ext.md +20 -1
  17. data/lib/rigor/analysis/baseline.rb +24 -27
  18. data/lib/rigor/analysis/check_rules/always_truthy_condition_collector.rb +5 -6
  19. data/lib/rigor/analysis/check_rules/dead_assignment_collector.rb +2 -2
  20. data/lib/rigor/analysis/check_rules/declaration_sourced_guard.rb +4 -4
  21. data/lib/rigor/analysis/check_rules/duplicate_hash_key_collector.rb +2 -2
  22. data/lib/rigor/analysis/check_rules/inferred_param_guard.rb +85 -13
  23. data/lib/rigor/analysis/check_rules/ivar_write_collector.rb +3 -2
  24. data/lib/rigor/analysis/check_rules/lexical_method_sites.rb +0 -1
  25. data/lib/rigor/analysis/check_rules/main_pass_collector.rb +5 -8
  26. data/lib/rigor/analysis/check_rules/published_constant_guard.rb +1 -1
  27. data/lib/rigor/analysis/check_rules/rebinding_block_callees.rb +3 -3
  28. data/lib/rigor/analysis/check_rules/return_in_ensure_collector.rb +1 -2
  29. data/lib/rigor/analysis/check_rules/rule_ids.rb +1 -1
  30. data/lib/rigor/analysis/check_rules/rule_walk.rb +9 -7
  31. data/lib/rigor/analysis/check_rules/shadowed_rescue_collector.rb +3 -4
  32. data/lib/rigor/analysis/check_rules/special_global_setters.rb +3 -3
  33. data/lib/rigor/analysis/check_rules/unreachable_clause_collector.rb +2 -2
  34. data/lib/rigor/analysis/check_rules/void_value_use_collector.rb +1 -1
  35. data/lib/rigor/analysis/check_rules.rb +124 -44
  36. data/lib/rigor/analysis/crash_signature.rb +2 -2
  37. data/lib/rigor/analysis/dependency_recorder.rb +4 -4
  38. data/lib/rigor/analysis/dependency_source_inference/boundary_cross_reporter.rb +14 -3
  39. data/lib/rigor/analysis/dependency_source_inference/gem_resolver.rb +1 -1
  40. data/lib/rigor/analysis/dependency_source_inference/index.rb +6 -8
  41. data/lib/rigor/analysis/dependency_source_inference/walker.rb +4 -4
  42. data/lib/rigor/analysis/edit_replay.rb +93 -6
  43. data/lib/rigor/analysis/fact_store.rb +3 -3
  44. data/lib/rigor/analysis/incremental_run_slot/write_guard.rb +2 -2
  45. data/lib/rigor/analysis/incremental_run_slot.rb +2 -2
  46. data/lib/rigor/analysis/incremental_session.rb +27 -16
  47. data/lib/rigor/analysis/rule_catalog.rb +2 -2
  48. data/lib/rigor/analysis/run_stats.rb +2 -2
  49. data/lib/rigor/analysis/runner/buffer_pool_dispatcher.rb +2 -2
  50. data/lib/rigor/analysis/runner/declaration_position.rb +1 -1
  51. data/lib/rigor/analysis/runner/diagnostic_aggregator.rb +193 -93
  52. data/lib/rigor/analysis/runner/effect_envelope_pass.rb +1 -1
  53. data/lib/rigor/analysis/runner/pool_coordinator.rb +147 -323
  54. data/lib/rigor/analysis/runner/project_pre_passes.rb +3 -3
  55. data/lib/rigor/analysis/runner/run_level_facts.rb +304 -0
  56. data/lib/rigor/analysis/runner/run_snapshots.rb +44 -54
  57. data/lib/rigor/analysis/runner/worker_payload.rb +36 -0
  58. data/lib/rigor/analysis/runner.rb +77 -71
  59. data/lib/rigor/analysis/self_call_resolution_recorder.rb +1 -1
  60. data/lib/rigor/analysis/template_unit_positions.rb +2 -3
  61. data/lib/rigor/analysis/template_units.rb +9 -1
  62. data/lib/rigor/analysis/worker_session.rb +24 -31
  63. data/lib/rigor/bleeding_edge.rb +3 -6
  64. data/lib/rigor/builtins/imported_refinements.rb +6 -8
  65. data/lib/rigor/builtins/predefined_constant_refinements.rb +1 -1
  66. data/lib/rigor/builtins/regex_refinement.rb +4 -6
  67. data/lib/rigor/cache/descriptor.rb +6 -5
  68. data/lib/rigor/cache/incremental_snapshot.rb +31 -12
  69. data/lib/rigor/cache/rbs_cache_producer.rb +2 -2
  70. data/lib/rigor/cache/rbs_class_ancestor_table.rb +1 -1
  71. data/lib/rigor/cache/rbs_class_type_param_names.rb +2 -2
  72. data/lib/rigor/cache/rbs_constant_table.rb +1 -1
  73. data/lib/rigor/cache/rbs_descriptor.rb +54 -3
  74. data/lib/rigor/cache/rbs_environment.rb +4 -1
  75. data/lib/rigor/cache/rbs_environment_marshal_patch.rb +2 -2
  76. data/lib/rigor/cache/rbs_known_class_names.rb +1 -1
  77. data/lib/rigor/cache/store.rb +11 -10
  78. data/lib/rigor/ci_detector.rb +1 -1
  79. data/lib/rigor/cli/annotate_command.rb +24 -19
  80. data/lib/rigor/cli/baseline_command.rb +145 -55
  81. data/lib/rigor/cli/catalogue.rb +256 -0
  82. data/lib/rigor/cli/check_command.rb +108 -102
  83. data/lib/rigor/cli/check_runner_factory.rb +2 -2
  84. data/lib/rigor/cli/command.rb +15 -1
  85. data/lib/rigor/cli/coverage_command.rb +21 -8
  86. data/lib/rigor/cli/coverage_mutation.rb +5 -7
  87. data/lib/rigor/cli/coverage_renderer.rb +2 -1
  88. data/lib/rigor/cli/coverage_scan.rb +3 -5
  89. data/lib/rigor/cli/diff_command.rb +25 -20
  90. data/lib/rigor/cli/docs_command.rb +1 -2
  91. data/lib/rigor/cli/doctor_command.rb +12 -12
  92. data/lib/rigor/cli/effects_command.rb +50 -40
  93. data/lib/rigor/cli/effects_diff_renderer.rb +18 -17
  94. data/lib/rigor/cli/effects_explain_renderer.rb +13 -12
  95. data/lib/rigor/cli/effects_renderer.rb +2 -1
  96. data/lib/rigor/cli/effects_snapshot_command.rb +18 -17
  97. data/lib/rigor/cli/explain_command.rb +18 -8
  98. data/lib/rigor/cli/fused_protection_renderer.rb +2 -1
  99. data/lib/rigor/cli/json_document.rb +41 -0
  100. data/lib/rigor/cli/lens_command.rb +12 -8
  101. data/lib/rigor/cli/lsp_command.rb +250 -23
  102. data/lib/rigor/cli/mcp_command.rb +12 -7
  103. data/lib/rigor/cli/mutation_fork_scan.rb +1 -1
  104. data/lib/rigor/cli/mutation_protection_renderer.rb +3 -2
  105. data/lib/rigor/cli/options.rb +40 -1
  106. data/lib/rigor/cli/plugin_command.rb +93 -46
  107. data/lib/rigor/cli/plugins_command.rb +17 -18
  108. data/lib/rigor/cli/plugins_renderer.rb +10 -6
  109. data/lib/rigor/cli/protection_fork_scan.rb +2 -2
  110. data/lib/rigor/cli/protection_renderer.rb +2 -1
  111. data/lib/rigor/cli/show_bleedingedge_command.rb +21 -15
  112. data/lib/rigor/cli/sig_gen_command.rb +84 -27
  113. data/lib/rigor/cli/skill_command.rb +32 -3
  114. data/lib/rigor/cli/skill_deep_probe.rb +1 -1
  115. data/lib/rigor/cli/skill_describe.rb +1 -1
  116. data/lib/rigor/cli/trace_command.rb +14 -9
  117. data/lib/rigor/cli/triage_command.rb +10 -11
  118. data/lib/rigor/cli/triage_renderer.rb +2 -1
  119. data/lib/rigor/cli/type_of_command.rb +16 -11
  120. data/lib/rigor/cli/type_of_project_scope.rb +1 -4
  121. data/lib/rigor/cli/type_of_renderer.rb +4 -1
  122. data/lib/rigor/cli/type_scan_command.rb +14 -9
  123. data/lib/rigor/cli/type_scan_renderer.rb +2 -1
  124. data/lib/rigor/cli/unused_command.rb +27 -17
  125. data/lib/rigor/cli/upgrade_command.rb +5 -0
  126. data/lib/rigor/cli.rb +209 -54
  127. data/lib/rigor/config_audit.rb +1 -1
  128. data/lib/rigor/configuration/severity_profile.rb +5 -5
  129. data/lib/rigor/configuration.rb +72 -30
  130. data/lib/rigor/effects/definition_context.rb +0 -2
  131. data/lib/rigor/effects/envelope.rb +1 -1
  132. data/lib/rigor/effects/framework_units.rb +1 -1
  133. data/lib/rigor/effects/mutation_classifier.rb +4 -7
  134. data/lib/rigor/effects/propagator.rb +1 -1
  135. data/lib/rigor/effects/registry.rb +2 -2
  136. data/lib/rigor/effects/snapshot.rb +1 -1
  137. data/lib/rigor/effects/taint_cause.rb +0 -2
  138. data/lib/rigor/effects/unit_scan.rb +9 -13
  139. data/lib/rigor/environment/bundle_sig_discovery.rb +5 -9
  140. data/lib/rigor/environment/class_registry.rb +3 -3
  141. data/lib/rigor/environment/core_root.rb +77 -0
  142. data/lib/rigor/environment/default_libraries.rb +1 -1
  143. data/lib/rigor/environment/deferred_signature_plan.rb +283 -0
  144. data/lib/rigor/environment/gated_signature_guard.rb +1 -1
  145. data/lib/rigor/environment/gated_signature_plan.rb +5 -2
  146. data/lib/rigor/environment/lockfile_resolver.rb +28 -12
  147. data/lib/rigor/environment/member_consistency/comparator.rb +18 -1
  148. data/lib/rigor/environment/member_consistency.rb +56 -7
  149. data/lib/rigor/environment/missing_gem_constant_index.rb +3 -2
  150. data/lib/rigor/environment/project_path_gems.rb +124 -0
  151. data/lib/rigor/environment/rbs_hierarchy.rb +6 -15
  152. data/lib/rigor/environment/rbs_loader.rb +480 -67
  153. data/lib/rigor/environment/reflection.rb +7 -7
  154. data/lib/rigor/environment/required_features.rb +0 -3
  155. data/lib/rigor/environment/ruby_library_roots.rb +1 -1
  156. data/lib/rigor/environment/vendored_signature_plan.rb +153 -0
  157. data/lib/rigor/environment.rb +41 -10
  158. data/lib/rigor/flow_contribution/merger.rb +4 -4
  159. data/lib/rigor/inference/acceptance.rb +93 -32
  160. data/lib/rigor/inference/block_parameter_binder.rb +2 -3
  161. data/lib/rigor/inference/block_run_count.rb +178 -0
  162. data/lib/rigor/inference/budget_trace.rb +8 -2
  163. data/lib/rigor/inference/builtins/exception_catalog.rb +2 -2
  164. data/lib/rigor/inference/builtins/numeric_catalog.rb +2 -5
  165. data/lib/rigor/inference/builtins/random_catalog.rb +2 -2
  166. data/lib/rigor/inference/callee_mutation_chain.rb +88 -77
  167. data/lib/rigor/inference/callee_write_census.rb +815 -0
  168. data/lib/rigor/inference/construction_escape.rb +217 -0
  169. data/lib/rigor/inference/declaration_walk/traversal.rb +1 -1
  170. data/lib/rigor/inference/deep_erasure.rb +39 -7
  171. data/lib/rigor/inference/def_handle.rb +1 -1
  172. data/lib/rigor/inference/def_node_resolver.rb +1 -1
  173. data/lib/rigor/inference/def_return_typer.rb +46 -4
  174. data/lib/rigor/inference/definer_resolution.rb +4 -2
  175. data/lib/rigor/inference/definers_index.rb +106 -0
  176. data/lib/rigor/inference/direct_ivar_writes.rb +300 -0
  177. data/lib/rigor/inference/element_read_widening.rb +49 -3
  178. data/lib/rigor/inference/expression_typer.rb +116 -49
  179. data/lib/rigor/inference/external_ancestor_resolution.rb +3 -4
  180. data/lib/rigor/inference/global_write_census.rb +76 -2
  181. data/lib/rigor/inference/global_writer_reach.rb +260 -0
  182. data/lib/rigor/inference/hkt_body.rb +1 -2
  183. data/lib/rigor/inference/hkt_body_parser.rb +3 -5
  184. data/lib/rigor/inference/hkt_reducer.rb +2 -2
  185. data/lib/rigor/inference/hkt_registry.rb +3 -5
  186. data/lib/rigor/inference/indexed_narrowing.rb +4 -7
  187. data/lib/rigor/inference/intervening_ivar_reset.rb +26 -4
  188. data/lib/rigor/inference/ivar_writer_census.rb +51 -0
  189. data/lib/rigor/inference/key_presence_guard.rb +2 -1
  190. data/lib/rigor/inference/loop_value_record.rb +8 -4
  191. data/lib/rigor/inference/match_rebinding/frame.rb +46 -0
  192. data/lib/rigor/inference/match_rebinding/yielding_match.rb +45 -0
  193. data/lib/rigor/inference/match_rebinding.rb +11 -1
  194. data/lib/rigor/inference/memo_audit.rb +55 -0
  195. data/lib/rigor/inference/method_dispatcher/alias_strict_nominals.rb +1 -1
  196. data/lib/rigor/inference/method_dispatcher/argument_distribution.rb +40 -0
  197. data/lib/rigor/inference/method_dispatcher/block_folding.rb +1 -1
  198. data/lib/rigor/inference/method_dispatcher/constant_folding.rb +3 -3
  199. data/lib/rigor/inference/method_dispatcher/contested_overloads.rb +89 -0
  200. data/lib/rigor/inference/method_dispatcher/iterator_dispatch.rb +1 -1
  201. data/lib/rigor/inference/method_dispatcher/kernel_dispatch.rb +1 -1
  202. data/lib/rigor/inference/method_dispatcher/no_match_fallback.rb +54 -0
  203. data/lib/rigor/inference/method_dispatcher/overload_selector.rb +39 -27
  204. data/lib/rigor/inference/method_dispatcher/random_folding.rb +1 -1
  205. data/lib/rigor/inference/method_dispatcher/rbs_dispatch.rb +203 -17
  206. data/lib/rigor/inference/method_dispatcher/reduce_folding.rb +1 -1
  207. data/lib/rigor/inference/method_dispatcher/regexp_folding.rb +2 -2
  208. data/lib/rigor/inference/method_dispatcher/self_substitute.rb +2 -2
  209. data/lib/rigor/inference/method_dispatcher/set_folding.rb +9 -7
  210. data/lib/rigor/inference/method_dispatcher/shape_dispatch.rb +83 -20
  211. data/lib/rigor/inference/method_dispatcher/singleton_folding.rb +0 -1
  212. data/lib/rigor/inference/method_dispatcher/singleton_mixin_dispatch.rb +50 -17
  213. data/lib/rigor/inference/method_dispatcher/struct_folding.rb +5 -5
  214. data/lib/rigor/inference/method_dispatcher/struct_materialization.rb +4 -6
  215. data/lib/rigor/inference/method_dispatcher/uri_folding.rb +1 -1
  216. data/lib/rigor/inference/method_dispatcher.rb +64 -14
  217. data/lib/rigor/inference/module_function_state.rb +11 -1
  218. data/lib/rigor/inference/multi_target_binder.rb +1 -1
  219. data/lib/rigor/inference/mutation_rejoin.rb +240 -4
  220. data/lib/rigor/inference/mutation_widening.rb +157 -27
  221. data/lib/rigor/inference/narrowing.rb +47 -33
  222. data/lib/rigor/inference/optimistic_origin.rb +1 -1
  223. data/lib/rigor/inference/out_buffer_mutation.rb +72 -0
  224. data/lib/rigor/inference/parameter_inference_collector.rb +5 -6
  225. data/lib/rigor/inference/pre_eval_constants.rb +1 -1
  226. data/lib/rigor/inference/project_method_ownership.rb +6 -3
  227. data/lib/rigor/inference/project_yielder.rb +11 -17
  228. data/lib/rigor/inference/receiver_alias.rb +20 -0
  229. data/lib/rigor/inference/refined_dispatch/constructed_class.rb +3 -1
  230. data/lib/rigor/inference/refined_dispatch/own_method.rb +2 -1
  231. data/lib/rigor/inference/remover_holder_scan.rb +233 -0
  232. data/lib/rigor/inference/remover_narrowing.rb +224 -0
  233. data/lib/rigor/inference/rewrite_mutation.rb +53 -2
  234. data/lib/rigor/inference/scope_indexer/certainty.rb +0 -1
  235. data/lib/rigor/inference/scope_indexer/constant_ivar_value.rb +93 -0
  236. data/lib/rigor/inference/scope_indexer/declared_param_writes.rb +58 -15
  237. data/lib/rigor/inference/scope_indexer/derived_param_value.rb +112 -0
  238. data/lib/rigor/inference/scope_indexer/empty_seed.rb +99 -0
  239. data/lib/rigor/inference/scope_indexer/ivar_contributions.rb +135 -0
  240. data/lib/rigor/inference/scope_indexer.rb +137 -46
  241. data/lib/rigor/inference/self_call_ivar_writes.rb +84 -12
  242. data/lib/rigor/inference/set_mutation.rb +189 -0
  243. data/lib/rigor/inference/singleton_hook_decline.rb +1 -2
  244. data/lib/rigor/inference/statement_evaluator.rb +2328 -138
  245. data/lib/rigor/inference/struct_fold_safety.rb +4 -6
  246. data/lib/rigor/inference/synthetic_method_scanner.rb +5 -6
  247. data/lib/rigor/inference/toplevel_def_census.rb +59 -0
  248. data/lib/rigor/inference/unknown_store_widening.rb +103 -4
  249. data/lib/rigor/inference/unthreaded_rebinds.rb +2 -3
  250. data/lib/rigor/inference/void_tail_summary.rb +2 -1
  251. data/lib/rigor/language_server/buffer_table.rb +3 -3
  252. data/lib/rigor/language_server/completion_provider.rb +26 -20
  253. data/lib/rigor/language_server/config_warning_announcer.rb +28 -0
  254. data/lib/rigor/language_server/diagnostic_publisher.rb +8 -3
  255. data/lib/rigor/language_server/document_symbol_provider.rb +1 -1
  256. data/lib/rigor/language_server/folding_range_provider.rb +1 -2
  257. data/lib/rigor/language_server/hover_provider.rb +1 -7
  258. data/lib/rigor/language_server/hover_renderer.rb +6 -8
  259. data/lib/rigor/language_server/project_context.rb +39 -1
  260. data/lib/rigor/language_server/publish_batcher.rb +3 -4
  261. data/lib/rigor/language_server/selection_range_provider.rb +2 -4
  262. data/lib/rigor/language_server/server.rb +7 -3
  263. data/lib/rigor/language_server/signature_help_provider.rb +4 -4
  264. data/lib/rigor/lens/plugins.rb +1 -1
  265. data/lib/rigor/mcp/server.rb +73 -2
  266. data/lib/rigor/mcp.rb +1 -1
  267. data/lib/rigor/plugin/access_denied_error.rb +1 -2
  268. data/lib/rigor/plugin/bundled_catalog.rb +1 -12
  269. data/lib/rigor/plugin/io_boundary.rb +1 -1
  270. data/lib/rigor/plugin/loader.rb +25 -8
  271. data/lib/rigor/plugin/macro/heredoc_template.rb +7 -8
  272. data/lib/rigor/plugin/macro/trait_registry.rb +6 -9
  273. data/lib/rigor/plugin/manifest.rb +9 -13
  274. data/lib/rigor/plugin/registry.rb +3 -3
  275. data/lib/rigor/plugin/services.rb +2 -3
  276. data/lib/rigor/plugin/source_rbs_synthesis_reporter.rb +11 -0
  277. data/lib/rigor/plugin/trust_policy.rb +2 -2
  278. data/lib/rigor/plugin/type_node_resolver.rb +2 -4
  279. data/lib/rigor/plugin.rb +6 -8
  280. data/lib/rigor/plugin_gap_advisory.rb +5 -1
  281. data/lib/rigor/project_environment.rb +16 -2
  282. data/lib/rigor/protection/analysis_guard.rb +1 -1
  283. data/lib/rigor/protection/discovery_seed.rb +44 -5
  284. data/lib/rigor/protection/mutator.rb +1 -1
  285. data/lib/rigor/rbs_extended/envelope_scanner.rb +4 -6
  286. data/lib/rigor/rbs_extended/hkt_directives.rb +6 -10
  287. data/lib/rigor/rbs_extended/reporter.rb +27 -3
  288. data/lib/rigor/rbs_extended.rb +2 -3
  289. data/lib/rigor/reflection/constant_ancestors.rb +5 -3
  290. data/lib/rigor/rooted_glob.rb +15 -1
  291. data/lib/rigor/run_scoped_slots.rb +38 -0
  292. data/lib/rigor/runtime/jit.rb +1 -1
  293. data/lib/rigor/scope/discovery_index.rb +19 -6
  294. data/lib/rigor/scope/resolution_chain.rb +3 -1
  295. data/lib/rigor/scope.rb +365 -31
  296. data/lib/rigor/sig_gen/classification.rb +4 -0
  297. data/lib/rigor/sig_gen/effect_annotation.rb +3 -3
  298. data/lib/rigor/sig_gen/generator.rb +371 -58
  299. data/lib/rigor/sig_gen/generic_header_scan.rb +189 -0
  300. data/lib/rigor/sig_gen/inline_declarations.rb +2 -2
  301. data/lib/rigor/sig_gen/layout_index.rb +3 -3
  302. data/lib/rigor/sig_gen/method_candidate.rb +23 -4
  303. data/lib/rigor/sig_gen/observation_collector.rb +3 -5
  304. data/lib/rigor/sig_gen/observed_call.rb +1 -1
  305. data/lib/rigor/sig_gen/path_mapper.rb +6 -0
  306. data/lib/rigor/sig_gen/renderer.rb +15 -9
  307. data/lib/rigor/sig_gen/skip_reason_catalog.rb +15 -2
  308. data/lib/rigor/sig_gen/type_name_qualification.rb +69 -0
  309. data/lib/rigor/sig_gen/write_reporter.rb +63 -14
  310. data/lib/rigor/sig_gen/write_result.rb +23 -12
  311. data/lib/rigor/sig_gen/writer.rb +217 -37
  312. data/lib/rigor/type/acceptance_router.rb +2 -2
  313. data/lib/rigor/type/accepts_result.rb +1 -1
  314. data/lib/rigor/type/app.rb +4 -6
  315. data/lib/rigor/type/combinator.rb +9 -13
  316. data/lib/rigor/type/constant.rb +4 -5
  317. data/lib/rigor/type/hash_shape.rb +21 -40
  318. data/lib/rigor/type/union.rb +1 -1
  319. data/lib/rigor/type_node/identifier.rb +1 -2
  320. data/lib/rigor/type_node/resolver_chain.rb +1 -1
  321. data/lib/rigor/type_node/string_literal.rb +1 -2
  322. data/lib/rigor/type_node/symbol_literal.rb +1 -2
  323. data/lib/rigor/type_node/union.rb +3 -6
  324. data/lib/rigor/value_semantics.rb +1 -10
  325. data/lib/rigor/version.rb +1 -1
  326. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_discoverer.rb +2 -2
  327. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_index.rb +2 -3
  328. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable.rb +1 -1
  329. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_discoverer.rb +38 -36
  330. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_index.rb +4 -2
  331. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer.rb +6 -4
  332. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/analyzer.rb +1 -1
  333. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_index.rb +1 -5
  334. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_scan.rb +0 -1
  335. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/erb_compiler.rb +2 -1
  336. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/view_assigns.rb +1 -1
  337. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack.rb +66 -19
  338. data/plugins/rigor-activejob/lib/rigor/plugin/activejob/effects.rb +1 -1
  339. data/plugins/rigor-activejob/lib/rigor/plugin/activejob.rb +4 -3
  340. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/association_roots.rb +3 -2
  341. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/effects.rb +2 -2
  342. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_discoverer.rb +21 -31
  343. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_index.rb +10 -16
  344. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_parser.rb +2 -3
  345. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_table.rb +0 -1
  346. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord.rb +5 -4
  347. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_discoverer.rb +3 -4
  348. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_index.rb +1 -1
  349. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage.rb +7 -12
  350. data/plugins/rigor-activestorage/lib/rigor-activestorage.rb +1 -1
  351. data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext/effects.rb +1 -1
  352. data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext/symbolize_keys.rb +102 -0
  353. data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext.rb +19 -6
  354. data/plugins/rigor-activesupport-core-ext/sig/active_support/core_ext.rbs +26 -13
  355. data/plugins/rigor-alba/lib/rigor/plugin/alba/resource_index.rb +3 -3
  356. data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/schema_scanner.rb +1 -3
  357. data/plugins/rigor-dry-struct/lib/rigor/plugin/dry_struct.rb +6 -6
  358. data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types/alias_scanner.rb +5 -6
  359. data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types.rb +1 -1
  360. data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/params_shape.rb +2 -3
  361. data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation.rb +5 -8
  362. data/plugins/rigor-ethon/lib/rigor/plugin/ethon.rb +0 -1
  363. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_discoverer.rb +1 -1
  364. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot.rb +10 -18
  365. data/plugins/rigor-ffi/lib/rigor/plugin/ffi/analyzer.rb +0 -1
  366. data/plugins/rigor-ffi/lib/rigor/plugin/ffi/discoverer.rb +0 -2
  367. data/plugins/rigor-ffi/lib/rigor/plugin/ffi.rb +4 -5
  368. data/plugins/rigor-grape/lib/rigor/plugin/grape.rb +0 -2
  369. data/plugins/rigor-graphql/lib/rigor/plugin/graphql/type_scanner.rb +6 -7
  370. data/plugins/rigor-hanami/lib/rigor/plugin/hanami/action_checker.rb +2 -4
  371. data/plugins/rigor-hanami/lib/rigor/plugin/hanami.rb +2 -5
  372. data/plugins/rigor-mangrove/lib/rigor/plugin/mangrove.rb +2 -2
  373. data/plugins/rigor-minitest/lib/rigor/plugin/minitest/assertion_analyzer.rb +6 -6
  374. data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_discoverer.rb +2 -1
  375. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/analyzer.rb +3 -8
  376. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_index.rb +2 -3
  377. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_loader.rb +5 -8
  378. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/analyzer.rb +1 -3
  379. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/devise_routes.rb +2 -3
  380. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_discoverer.rb +1 -1
  381. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/routes_parser.rb +4 -11
  382. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes.rb +1 -1
  383. data/plugins/rigor-rbs-inline/lib/rigor/plugin/rbs_inline.rb +2 -1
  384. data/plugins/rigor-rspec/lib/rigor/plugin/rspec/matcher_analyzer.rb +1 -1
  385. data/plugins/rigor-rspec/lib/rigor/plugin/rspec.rb +2 -2
  386. data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails.rb +3 -4
  387. data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers/analyzer.rb +6 -8
  388. data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq.rb +3 -2
  389. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/absurd_recognizer.rb +4 -5
  390. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/assertion_recognizer.rb +6 -7
  391. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog.rb +1 -1
  392. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sig_parser.rb +2 -2
  393. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet.rb +17 -21
  394. data/plugins/rigor-statesman/lib/rigor/plugin/statesman.rb +2 -3
  395. data/plugins/rigor-typelizer/lib/rigor/plugin/typelizer/serializer_discoverer.rb +3 -2
  396. data/plugins/rigor-typelizer/lib/rigor/plugin/typelizer/serializer_index.rb +4 -4
  397. data/sig/rigor/analysis/baseline.rbs +0 -3
  398. data/sig/rigor/analysis/fact_store.rbs +1 -0
  399. data/sig/rigor/analysis/reachability/scan_cache.rbs +1 -1
  400. data/sig/rigor/cli/diff_command.rbs +1 -1
  401. data/sig/rigor/cli/explain_command.rbs +1 -1
  402. data/sig/rigor/effects/registry.rbs +2 -2
  403. data/sig/rigor/inference.rbs +4 -1
  404. data/sig/rigor/plugin/additional_initializer.rbs +0 -5
  405. data/sig/rigor/plugin/base.rbs +1 -0
  406. data/sig/rigor/plugin/effect_attribution.rbs +3 -3
  407. data/sig/rigor/plugin/effect_edge.rbs +1 -1
  408. data/sig/rigor/plugin/effect_entry_points.rbs +3 -3
  409. data/sig/rigor/plugin/io_boundary.rbs +2 -1
  410. data/sig/rigor/plugin/manifest.rbs +9 -9
  411. data/sig/rigor/plugin/protocol_contract.rbs +3 -7
  412. data/sig/rigor/scope.rbs +23 -3
  413. data/skills/rigor-plugin-author/SKILL.md +4 -4
  414. data/skills/rigor-plugin-author/references/02-walker-and-types.md +5 -5
  415. data/skills/rigor-plugin-review/SKILL.md +3 -3
  416. data/skills/rigor-project-init/references/03-baseline-and-bugs.md +12 -1
  417. metadata +36 -3
@@ -18,7 +18,7 @@ class Rigor::Plugin::Manifest
18
18
  def config_schema: () -> untyped
19
19
  def config_defaults: () -> Hash[String, untyped]
20
20
  def target_gems: () -> Array[String]
21
- # sig-gen gap: #2321 — written by a private `assign_*` helper whose parameters are undeclared (`initialize` hands
21
+ # sig-gen gap: #2418 — written by a private `assign_*` helper whose parameters are undeclared (`initialize` hands
22
22
  # its fields to such helpers); each write is a derived expression (`dup.freeze`, `map`), so the helper's parameter
23
23
  # types alone would not generate it.
24
24
  def template_globs: () -> Array[String]
@@ -35,31 +35,31 @@ class Rigor::Plugin::Manifest
35
35
  def hkt_registrations: () -> untyped
36
36
  def hkt_definitions: () -> untyped
37
37
  def signature_paths: () -> Array[String]
38
- # sig-gen gap: #2321 — same shape as `template_globs`: `validate_protocol_contracts!` requires every element
38
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_protocol_contracts!` requires every element
39
39
  # `is_a?(ProtocolContract)`.
40
40
  def protocol_contracts: () -> Array[Rigor::Plugin::ProtocolContract]
41
41
  # ADR-32 WD6/WD12 — any object responding to `call`, and its result is a documented multi-shape
42
42
  # outcome (`String` / nil / `[:error, msg]` / `[:ok, src, msgs]`), not `String?` — `untyped` is the
43
43
  # honest claim until the outcome has a sig'd shape.
44
44
  def source_rbs_synthesizer: () -> untyped
45
- # sig-gen gap: #2321 — same shape as `template_globs`: the validator (`validate_additional_initializers!`) requires
45
+ # sig-gen gap: #2418 — same shape as `template_globs`: the validator (`validate_additional_initializers!`) requires
46
46
  # every element `is_a?(AdditionalInitializer)`, so the element type is hand-written.
47
47
  def additional_initializers: () -> Array[Rigor::Plugin::AdditionalInitializer]
48
48
 
49
- # sig-gen gap: #2321 — same shape as `template_globs`: `validate_effect_root!` bounds the spelling.
49
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_root!` bounds the spelling.
50
50
  def effect_root: () -> String?
51
- # sig-gen gap: #2321 — same shape as `template_globs`: `validate_effect_labels!` requires non-empty `String`
51
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_labels!` requires non-empty `String`
52
52
  # elements.
53
53
  def effect_labels: () -> Array[String]
54
- # sig-gen gap: #2321 — same shape as `template_globs`: `validate_effect_attributions!` requires every element
54
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_attributions!` requires every element
55
55
  # `is_a?(EffectAttribution)`.
56
56
  def effect_attributions: () -> Array[Rigor::Plugin::EffectAttribution]
57
- # sig-gen gap: #2321 — same shape as `template_globs`: `validate_effect_edges!` requires `is_a?(EffectEdge)`.
57
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_edges!` requires `is_a?(EffectEdge)`.
58
58
  def effect_edges: () -> Array[Rigor::Plugin::EffectEdge]
59
- # sig-gen gap: #2321 — same shape as `template_globs`: `validate_effect_entry_points!` requires
59
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_entry_points!` requires
60
60
  # `is_a?(EffectEntryPoints)`.
61
61
  def effect_entry_points: () -> Array[Rigor::Plugin::EffectEntryPoints]
62
- # sig-gen gap: #2321 — same shape as `template_globs`: `validate_effect_ancestry!` requires `is_a?(EffectAncestry)`.
62
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_ancestry!` requires `is_a?(EffectAncestry)`.
63
63
  def effect_ancestry: () -> Array[Rigor::Plugin::EffectAncestry]
64
64
 
65
65
  # The identity opening a root when this plugin's labels join the run's vocabulary: the
@@ -23,11 +23,8 @@ module Rigor
23
23
  def self.[]: (index: Integer, type_name: String) -> instance | (Integer index, String type_name) -> instance
24
24
  end
25
25
 
26
- # sig-gen gap: #2321 — `attr_reader` rows over ivars `initialize` assigns from expressions derived
27
- # from its parameters (`dup.freeze`/`to_sym`), so the stored types are hand-written.
28
26
  attr_reader path_glob: String
29
27
 
30
- # sig-gen gap: #2321 — as above (`to_sym` normalizes the accepted Symbol|String).
31
28
  attr_reader method_name: Symbol
32
29
 
33
30
  # `singleton ? true : false` collapses any truthy input to bool — sig-gen already infers
@@ -38,12 +35,11 @@ module Rigor
38
35
  # parameters are undeclared (it guarantees `Array[ParamType]`).
39
36
  attr_reader param_types: Array[ParamType]
40
37
 
41
- # sig-gen gap: #2321 — as above (nil or a non-empty `dup.freeze`d String).
42
38
  attr_reader return_type_name: String?
43
39
 
44
- # sig-gen gap: #2321 — as above (`VALID_SEVERITIES.include?(to_sym)` bounds the stored value
45
- # to the three declared literals; a derived-write credit would generate `Symbol`, not the literal union, so
46
- # this row needs the declared literals kept as intent).
40
+ # authored: the declared literal union is intent. `initialize` stores `severity.to_sym` after
41
+ # `validate_severity!` bounds it to `VALID_SEVERITIES`, so the value is one of the three literals, but sig-gen
42
+ # generates `Symbol` for it, not the union.
47
43
  attr_reader severity: :error | :warning | :info
48
44
 
49
45
  # `method_name`/`severity` accept String too (both are `to_sym`'d); `param_types` entries are
data/sig/rigor/scope.rbs CHANGED
@@ -18,6 +18,7 @@ module Rigor
18
18
  # its bare cause (issue #1302).
19
19
  attr_reader optimistic_locals: Hash[Symbol, Symbol | Inference::OptimisticOrigin::BoundMark]
20
20
  attr_reader optimistic_ivars: Hash[Symbol, Symbol | Inference::OptimisticOrigin::BoundMark]
21
+ attr_reader construction_facts: Hash[Symbol, Set[untyped]]
21
22
  attr_reader repeated_or_writes: Hash[untyped, bool]
22
23
  # sig-gen gap: #2323 — the same reader shape; `Inference::MatchRebinding::Frame` carries no signature.
23
24
  attr_reader match_frame: untyped
@@ -64,14 +65,24 @@ module Rigor
64
65
  # authored: the list holds module names and the `InEffectRefinements::UNKNOWN` Symbol; sig-gen reads the delegated
65
66
  # return through an unsigned class as untyped.
66
67
  def in_effect_refinements: (untyped node, ?Array[String] declared) -> Array[String | Symbol]
68
+ # authored: the element is an `Array` led by its Symbol kind by contract (`[:defines, name]`, `[:ivar_set, name]`); a Set's element type stays `untyped` in sig-gen (#2177, #2317), so the generator
69
+ # would never propose it.
67
70
  def discovered_global_write_census: () -> Set[Array[untyped]]
68
71
  def discovered_includes: () -> Hash[String, Array[String]]
69
72
  # Issue #1123 — the instance-ancestor-ORDER table beside the include one.
70
73
  def discovered_prepends: () -> Hash[String, Array[String]]
71
74
  def discovered_extends: () -> Hash[String, Array[String]]
75
+ # authored: the element is `String` (a source path) by contract; a Set's element type stays `untyped` in sig-gen (#2177, #2317), so the generator
76
+ # would never propose it.
72
77
  def discovered_class_sources: () -> Hash[String, Set[String]]
78
+ # authored: the element is `String` (a source path) by contract; a Set's element type stays `untyped` in sig-gen (#2177, #2317), so the generator
79
+ # would never propose it.
73
80
  def constant_sources: () -> Hash[String, Set[String]]
81
+ # authored: the element is `String` (a constant's last segment) by contract; a Set's element type stays `untyped` in sig-gen (#2177, #2317), so the generator
82
+ # would never propose it.
74
83
  def published_constant_names: () -> Set[String]
84
+ # authored: the element is `String` (a constant name) by contract; a Set's element type stays `untyped` in sig-gen (#2177, #2317), so the generator
85
+ # would never propose it.
75
86
  def local_constant_names: () -> Set[String]
76
87
  # sig-gen gap: #1150 — the `Data.define` table it reads carries no type, so sig-gen skips the return; the shape is hand-written.
77
88
  def bound_constant_names: (String name) -> Array[String]
@@ -208,7 +219,7 @@ module Rigor
208
219
 
209
220
  def self.empty: (?environment: Environment, ?source_path: String?) -> Scope
210
221
 
211
- def initialize: (environment: Environment, locals: Hash[Symbol, Type::t], ?fact_store: Analysis::FactStore, ?self_type: Type::t?, ?ivars: Hash[Symbol, Type::t], ?cvars: Hash[Symbol, Type::t], ?globals: Hash[Symbol, Type::t], ?discovery: DiscoveryIndex, ?source_path: String?, ?opaque_block_self: bool, ?block_self_unknown: bool | :refinement, ?singleton_class_body: bool, ?dynamic_origins: Hash[untyped, Symbol], ?indexed_narrowings: Hash[IndexedKey, Type::t], ?method_chain_narrowings: Hash[ChainKey, Type::t], ?declaration_sourced: Set[[Symbol, Symbol] | [Symbol, Symbol, Symbol]], ?published_constant_sourced: Set[[Symbol, Symbol]], ?struct_fold_safe_locals: Set[Symbol], ?lexical_nesting: Array[String]?, ?local_origins: Hash[Symbol, Symbol], ?ivar_origins: Hash[Symbol, Symbol], ?void_origins: Hash[untyped, Inference::VoidOrigin], ?plugin_typed_calls: Hash[untyped, bool], ?optimistic_origins: Hash[untyped, Symbol], ?optimistic_locals: Hash[Symbol, Symbol | Inference::OptimisticOrigin::BoundMark], ?optimistic_ivars: Hash[Symbol, Symbol | Inference::OptimisticOrigin::BoundMark], ?repeated_or_writes: Hash[untyped, bool], ?match_frame: untyped, ?constant_narrowings: Hash[String, Type::t], ?guard_records: Hash[[Symbol, Symbol | String], Type::t], ?bot_guard_classes: Hash[[Symbol, Symbol | String], Array[String]], ?declared_refinements: Array[String | Symbol]) -> void
222
+ def initialize: (environment: Environment, locals: Hash[Symbol, Type::t], ?fact_store: Analysis::FactStore, ?self_type: Type::t?, ?ivars: Hash[Symbol, Type::t], ?cvars: Hash[Symbol, Type::t], ?globals: Hash[Symbol, Type::t], ?discovery: DiscoveryIndex, ?source_path: String?, ?opaque_block_self: bool, ?block_self_unknown: bool | :refinement, ?singleton_class_body: bool, ?dynamic_origins: Hash[untyped, Symbol], ?indexed_narrowings: Hash[IndexedKey, Type::t], ?method_chain_narrowings: Hash[ChainKey, Type::t], ?declaration_sourced: Set[[Symbol, Symbol] | [Symbol, Symbol, Symbol]], ?published_constant_sourced: Set[[Symbol, Symbol]], ?struct_fold_safe_locals: Set[Symbol], ?lexical_nesting: Array[String]?, ?local_origins: Hash[Symbol, Symbol], ?ivar_origins: Hash[Symbol, Symbol], ?void_origins: Hash[untyped, Inference::VoidOrigin], ?plugin_typed_calls: Hash[untyped, bool], ?optimistic_origins: Hash[untyped, Symbol], ?optimistic_locals: Hash[Symbol, Symbol | Inference::OptimisticOrigin::BoundMark], ?optimistic_ivars: Hash[Symbol, Symbol | Inference::OptimisticOrigin::BoundMark], ?construction_facts: Hash[Symbol, Set[Symbol]], ?repeated_or_writes: Hash[untyped, bool], ?match_frame: untyped, ?constant_narrowings: Hash[String, Type::t], ?guard_records: Hash[[Symbol, Symbol | String], Type::t], ?bot_guard_classes: Hash[[Symbol, Symbol | String], Array[String]], ?declared_refinements: Array[String | Symbol]) -> void
212
223
  def with_source_path: (String? path) -> Scope
213
224
  def with_struct_fold_safe: (Set[Symbol] locals) -> Scope
214
225
  def with_lexical_nesting: (Array[String]? chain) -> Scope
@@ -229,10 +240,15 @@ module Rigor
229
240
  def global: (String | Symbol name) -> Type::t?
230
241
  def local_origin: (String | Symbol name) -> Symbol?
231
242
  def ivar_origin: (String | Symbol name) -> Symbol?
243
+ # sig-gen gap: #2403 — the `Hash#[]` miss in `bound_cause` is lost across the call; sig-gen says `Symbol`.
232
244
  def optimistic_local: (String | Symbol name) -> Symbol?
245
+ # sig-gen gap: #2403 — the `Hash#[]` miss in `bound_cause` is lost across the call; sig-gen says `Symbol`.
233
246
  def optimistic_ivar: (String | Symbol name) -> Symbol?
234
247
  def optimistic_local_miss: (String | Symbol name) -> Object?
235
248
  def optimistic_ivar_miss: (String | Symbol name) -> Object?
249
+ def construction_fact?: (String | Symbol name, ?Symbol fact) -> bool
250
+ def project_method_name?: (untyped) -> (false | true)
251
+ def with_construction_fact: (untyped, untyped) -> Rigor::Scope
236
252
  def with_local: (String | Symbol name, Type::t type) -> Scope
237
253
  def with_rejoined_locals: (untyped) -> Rigor::Scope
238
254
  def with_ivar: (String | Symbol name, Type::t type) -> Scope
@@ -271,8 +287,6 @@ module Rigor
271
287
  def seed_declaration_sourced_global: (String | Symbol name, Type::t type) -> Scope
272
288
  def with_global_copy_marks: (String | Symbol name, Array[String | Symbol] globals) -> Scope
273
289
  def without_local_declaration_marks: (String | Symbol name) -> Scope
274
- # sig-gen gap: #2322 — the records come out of `@declaration_sourced`, whose set now types; `ref[2]` reads as
275
- # `Symbol?`, but the `filter_map` over it answers `Array[untyped]`.
276
290
  def declaration_sourced_global_copies: (String | Symbol name) -> Array[Symbol]
277
291
  def with_declaration_sourced_local: (String | Symbol name, Type::t type) -> Scope
278
292
  def with_local_declaration_mark: (String | Symbol name) -> Scope
@@ -307,6 +321,8 @@ module Rigor
307
321
  def def_node_slot: (untyped class_name, untyped method_name, ?Symbol kind) -> untyped
308
322
  def user_def_for: (String | Symbol class_name, String | Symbol method_name) -> ::Prism::DefNode?
309
323
  def user_def_through_ancestors: (String | Symbol class_name, String | Symbol method_name, ?name_memo: Hash[untyped, untyped]) -> ([::Prism::DefNode, String] | [nil, nil])
324
+ def subclassing_opacity: () -> [false | true, Array[untyped]]
325
+ def user_instance_def_owners: (untyped) -> Array[untyped]
310
326
  def discovered_method_through_ancestors?: (String | Symbol? class_name, String | Symbol method_name, Symbol kind, ?name_memo: Hash[untyped, untyped]) -> bool
311
327
  def external_ancestor_name_candidates: (String | Symbol class_name, ?name_memo: Hash[untyped, untyped]) -> Array[Array[String]]
312
328
  def enqueue_ancestors: (String current, Array[String] queue, Hash[untyped, untyped] name_memo, ?mixins: bool) -> void
@@ -320,6 +336,7 @@ module Rigor
320
336
  def known_user_class?: (String | Symbol name) -> bool
321
337
  def singleton_def_for: (String | Symbol class_name, String | Symbol method_name) -> ::Prism::DefNode?
322
338
  def module_function_def?: (untyped, untyped) -> (false | true)
339
+ def module_function_row_def?: (untyped, untyped) -> (false | true)
323
340
  def singleton_def_through_ancestors: (String | Symbol class_name, String | Symbol method_name, ?name_memo: Hash[untyped, untyped]) -> ([::Prism::DefNode, String] | [nil, nil])
324
341
  def user_def_site_for: (String | Symbol class_name, String | Symbol method_name) -> String?
325
342
  def user_singleton_def_site_for: (String | Symbol class_name, String | Symbol method_name) -> String?
@@ -330,6 +347,9 @@ module Rigor
330
347
  # sig-gen gap: #1167 — the instance-side twin: the same untyped `call_node`, the same untyped-return skip.
331
348
  def instance_def_shadows_call?: (String | Symbol class_name, String | Symbol method_name, untyped call_node) -> bool
332
349
  def top_level_def_for: (String | Symbol method_name) -> ::Prism::DefNode?
350
+ def ownerless_definition?: (untyped, ?top_level: untyped) -> (false | true)
351
+ def toplevel_def_ambiguity: (String | Symbol method_name) -> (:contested | :several | :main_singleton | :aliased | :anonymous | :object)?
352
+ def declared_class?: (String | Symbol class_name) -> bool
333
353
  def bindable_top_level_def_for: (String | Symbol method_name) -> ::Prism::DefNode?
334
354
  def toplevel?: () -> bool
335
355
  def discovered_method_visibility: (String | Symbol class_name, String | Symbol method_name) -> Symbol?
@@ -68,10 +68,10 @@ install`), every plugin bundled in the toolchain is readable source.
68
68
  Use it as a worked-example library throughout this skill:
69
69
 
70
70
  ```sh
71
- rigor plugin list # all bundled + example plugins, with paths
72
- rigor plugin print rigor-activesupport-core-ext # a plugin's main source, inline
73
- rigor plugin path rigor-units # the dir, to browse with your file tool
74
- rigor plugin root # gem root + public API (lib/rigor/plugin.rb)
71
+ rigor plugin # all bundled + example plugins, with paths
72
+ rigor plugin rigor-activesupport-core-ext # a plugin's main source, inline
73
+ rigor plugin --path rigor-units # the dir, to browse with your file tool
74
+ rigor plugin --root # gem root + public API (lib/rigor/plugin.rb)
75
75
  ```
76
76
 
77
77
  `rigor plugin` (singular) browses the toolchain's plugins; `rigor
@@ -254,8 +254,8 @@ Two ways to wire the RBS, depending on how the plugin is packaged:
254
254
  read one as a worked example:
255
255
 
256
256
  ```sh
257
- rigor plugin print rigor-activesupport-core-ext # see manifest + sig/ layout
258
- rigor plugin path rigor-activesupport-core-ext # then browse its sig/ dir
257
+ rigor plugin rigor-activesupport-core-ext # see manifest + sig/ layout
258
+ rigor plugin --path rigor-activesupport-core-ext # then browse its sig/ dir
259
259
  ```
260
260
 
261
261
  2. **A project-private plugin** — the manifest field still works, but
@@ -280,9 +280,9 @@ They compose — many plugins ship both.
280
280
 
281
281
  > **Browse a real plugin instead of guessing the API.** Because Rigor
282
282
  > is installed on disk (`mise` / `gem install`), every bundled plugin's
283
- > source is readable as a worked example. `rigor plugin list` shows
284
- > them all with absolute paths; `rigor plugin print <name>` inlines a
285
- > plugin's main source; `rigor plugin root` points at the engine source
283
+ > source is readable as a worked example. `rigor plugin` shows
284
+ > them all with absolute paths; `rigor plugin <name>` inlines a
285
+ > plugin's main source; `rigor plugin --root` points at the engine source
286
286
  > and the public `Rigor::Plugin::Base` API. When the prose here is
287
287
  > thinner than you need, read a shipped plugin that does the same thing.
288
288
 
@@ -74,9 +74,9 @@ Rigor is installed on disk, so both the plugin under review and the
74
74
  worked-example plugins are readable source:
75
75
 
76
76
  ```sh
77
- rigor plugin list # every bundled + example plugin, with paths
78
- rigor plugin print rigor-<id> # a plugin's main source, inline
79
- rigor plugin path rigor-<id> # its directory, to browse
77
+ rigor plugin # every bundled + example plugin, with paths
78
+ rigor plugin rigor-<id> # a plugin's main source, inline
79
+ rigor plugin --path rigor-<id> # its directory, to browse
80
80
  ```
81
81
 
82
82
  The **authoritative** authoring surface — the one this review scores
@@ -218,8 +218,19 @@ baseline is a ceiling, not a blanket. Reducing it later is the
218
218
  Recommend committing `.rigor-baseline.yml` — it documents project
219
219
  state; list it in the Final step's file inventory.
220
220
 
221
+ **Rule-less diagnostics cannot be baselined.** A file Prism cannot
222
+ parse (a parse error), a missing `paths:` entry or an internal error
223
+ yields a diagnostic with no rule, so it has no `(file, rule)` bucket.
224
+ The summary then prints a second line ("N diagnostic(s) have no rule
225
+ (parse, path or internal errors) in M file(s) and cannot be
226
+ baselined") and lists the files; the command still exits 0. Acknowledge
227
+ mode reaches a green `rigor check` only after those files are fixed or
228
+ added to `exclude:`, or the bad `paths:` entry is removed. Do that
229
+ before wiring `baseline:`, then re-run `rigor baseline regenerate`.
230
+
221
231
  Print the suppression summary for the user: "N diagnostics recorded
222
- as baseline; M will surface on subsequent runs."
232
+ as baseline; M will surface on subsequent runs." Take N from the
233
+ `covering N diagnostic(s)` count, and count the unbaselineable ones in M.
223
234
 
224
235
  ## Phase 8 — Surface real bugs & offer escalation
225
236
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rigortype
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.6
4
+ version: 0.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rigor contributors
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
10
+ date: 1980-01-01 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: language_server-protocol
@@ -513,8 +513,10 @@ files:
513
513
  - lib/rigor/analysis/runner/envelope_messages.rb
514
514
  - lib/rigor/analysis/runner/pool_coordinator.rb
515
515
  - lib/rigor/analysis/runner/project_pre_passes.rb
516
+ - lib/rigor/analysis/runner/run_level_facts.rb
516
517
  - lib/rigor/analysis/runner/run_snapshots.rb
517
518
  - lib/rigor/analysis/runner/scan_environment.rb
519
+ - lib/rigor/analysis/runner/worker_payload.rb
518
520
  - lib/rigor/analysis/self_call_resolution_recorder.rb
519
521
  - lib/rigor/analysis/severity_stamp.rb
520
522
  - lib/rigor/analysis/shadow_harness.rb
@@ -551,6 +553,7 @@ files:
551
553
  - lib/rigor/cli.rb
552
554
  - lib/rigor/cli/annotate_command.rb
553
555
  - lib/rigor/cli/baseline_command.rb
556
+ - lib/rigor/cli/catalogue.rb
554
557
  - lib/rigor/cli/check_command.rb
555
558
  - lib/rigor/cli/check_invocation.rb
556
559
  - lib/rigor/cli/check_runner_factory.rb
@@ -574,6 +577,7 @@ files:
574
577
  - lib/rigor/cli/explain_command.rb
575
578
  - lib/rigor/cli/fused_protection_renderer.rb
576
579
  - lib/rigor/cli/fused_protection_report.rb
580
+ - lib/rigor/cli/json_document.rb
577
581
  - lib/rigor/cli/lens_command.rb
578
582
  - lib/rigor/cli/lsp_command.rb
579
583
  - lib/rigor/cli/mcp_command.rb
@@ -660,7 +664,9 @@ files:
660
664
  - lib/rigor/environment/bundle_sig_discovery.rb
661
665
  - lib/rigor/environment/class_registry.rb
662
666
  - lib/rigor/environment/constant_type_cache_holder.rb
667
+ - lib/rigor/environment/core_root.rb
663
668
  - lib/rigor/environment/default_libraries.rb
669
+ - lib/rigor/environment/deferred_signature_plan.rb
664
670
  - lib/rigor/environment/failure_slot.rb
665
671
  - lib/rigor/environment/gated_signature_guard.rb
666
672
  - lib/rigor/environment/gated_signature_plan.rb
@@ -670,6 +676,7 @@ files:
670
676
  - lib/rigor/environment/member_consistency.rb
671
677
  - lib/rigor/environment/member_consistency/comparator.rb
672
678
  - lib/rigor/environment/missing_gem_constant_index.rb
679
+ - lib/rigor/environment/project_path_gems.rb
673
680
  - lib/rigor/environment/rbs_collection_discovery.rb
674
681
  - lib/rigor/environment/rbs_coverage_report.rb
675
682
  - lib/rigor/environment/rbs_hierarchy.rb
@@ -679,6 +686,7 @@ files:
679
686
  - lib/rigor/environment/required_features.rb
680
687
  - lib/rigor/environment/ruby_library_roots.rb
681
688
  - lib/rigor/environment/source_rbs_synthesis.rb
689
+ - lib/rigor/environment/vendored_signature_plan.rb
682
690
  - lib/rigor/flow_contribution.rb
683
691
  - lib/rigor/flow_contribution/conflict.rb
684
692
  - lib/rigor/flow_contribution/element.rb
@@ -692,6 +700,7 @@ files:
692
700
  - lib/rigor/inference/block_call_timing.rb
693
701
  - lib/rigor/inference/block_parameter_binder.rb
694
702
  - lib/rigor/inference/block_repetition.rb
703
+ - lib/rigor/inference/block_run_count.rb
695
704
  - lib/rigor/inference/body_fixpoint.rb
696
705
  - lib/rigor/inference/budget_trace.rb
697
706
  - lib/rigor/inference/builtins/array_catalog.rb
@@ -716,9 +725,11 @@ files:
716
725
  - lib/rigor/inference/builtins/struct_catalog.rb
717
726
  - lib/rigor/inference/builtins/time_catalog.rb
718
727
  - lib/rigor/inference/callee_mutation_chain.rb
728
+ - lib/rigor/inference/callee_write_census.rb
719
729
  - lib/rigor/inference/captured_locals.rb
720
730
  - lib/rigor/inference/clause_widening.rb
721
731
  - lib/rigor/inference/closure_escape_analyzer.rb
732
+ - lib/rigor/inference/construction_escape.rb
722
733
  - lib/rigor/inference/content_join.rb
723
734
  - lib/rigor/inference/coverage_scanner.rb
724
735
  - lib/rigor/inference/declaration_walk.rb
@@ -732,6 +743,8 @@ files:
732
743
  - lib/rigor/inference/def_return_typer.rb
733
744
  - lib/rigor/inference/define_method_block_self.rb
734
745
  - lib/rigor/inference/definer_resolution.rb
746
+ - lib/rigor/inference/definers_index.rb
747
+ - lib/rigor/inference/direct_ivar_writes.rb
735
748
  - lib/rigor/inference/dynamic_origin.rb
736
749
  - lib/rigor/inference/element_read_widening.rb
737
750
  - lib/rigor/inference/error_info.rb
@@ -743,6 +756,7 @@ files:
743
756
  - lib/rigor/inference/fork_map.rb
744
757
  - lib/rigor/inference/fresh_frame_blocks.rb
745
758
  - lib/rigor/inference/global_write_census.rb
759
+ - lib/rigor/inference/global_writer_reach.rb
746
760
  - lib/rigor/inference/guard_rebinding.rb
747
761
  - lib/rigor/inference/hash_lookup_mutation.rb
748
762
  - lib/rigor/inference/hkt_body.rb
@@ -773,8 +787,11 @@ files:
773
787
  - lib/rigor/inference/match_rebinding/frame.rb
774
788
  - lib/rigor/inference/match_rebinding/operands.rb
775
789
  - lib/rigor/inference/match_rebinding/self_calls.rb
790
+ - lib/rigor/inference/match_rebinding/yielding_match.rb
791
+ - lib/rigor/inference/memo_audit.rb
776
792
  - lib/rigor/inference/method_dispatcher.rb
777
793
  - lib/rigor/inference/method_dispatcher/alias_strict_nominals.rb
794
+ - lib/rigor/inference/method_dispatcher/argument_distribution.rb
778
795
  - lib/rigor/inference/method_dispatcher/argument_nodes.rb
779
796
  - lib/rigor/inference/method_dispatcher/arithmetic_sequence_elements.rb
780
797
  - lib/rigor/inference/method_dispatcher/array_to_h_folding.rb
@@ -782,6 +799,7 @@ files:
782
799
  - lib/rigor/inference/method_dispatcher/call_context.rb
783
800
  - lib/rigor/inference/method_dispatcher/cgi_folding.rb
784
801
  - lib/rigor/inference/method_dispatcher/constant_folding.rb
802
+ - lib/rigor/inference/method_dispatcher/contested_overloads.rb
785
803
  - lib/rigor/inference/method_dispatcher/data_folding.rb
786
804
  - lib/rigor/inference/method_dispatcher/facet_distribution.rb
787
805
  - lib/rigor/inference/method_dispatcher/file_folding.rb
@@ -797,6 +815,7 @@ files:
797
815
  - lib/rigor/inference/method_dispatcher/math_folding.rb
798
816
  - lib/rigor/inference/method_dispatcher/member_shape_projection.rb
799
817
  - lib/rigor/inference/method_dispatcher/method_folding.rb
818
+ - lib/rigor/inference/method_dispatcher/no_match_fallback.rb
800
819
  - lib/rigor/inference/method_dispatcher/optional_count.rb
801
820
  - lib/rigor/inference/method_dispatcher/overload_selector.rb
802
821
  - lib/rigor/inference/method_dispatcher/process_folding.rb
@@ -831,6 +850,7 @@ files:
831
850
  - lib/rigor/inference/operand_walk.rb
832
851
  - lib/rigor/inference/optimistic_origin.rb
833
852
  - lib/rigor/inference/origin_lookup.rb
853
+ - lib/rigor/inference/out_buffer_mutation.rb
834
854
  - lib/rigor/inference/parameter_inference_collector.rb
835
855
  - lib/rigor/inference/pre_eval_constants.rb
836
856
  - lib/rigor/inference/precision_scanner.rb
@@ -855,21 +875,28 @@ files:
855
875
  - lib/rigor/inference/refined_dispatch/own_method.rb
856
876
  - lib/rigor/inference/refinement_mutation.rb
857
877
  - lib/rigor/inference/reflective_ivar_write.rb
878
+ - lib/rigor/inference/remover_holder_scan.rb
879
+ - lib/rigor/inference/remover_narrowing.rb
858
880
  - lib/rigor/inference/repeated_or_writes.rb
859
881
  - lib/rigor/inference/return_barrier.rb
860
882
  - lib/rigor/inference/rewrite_mutation.rb
861
883
  - lib/rigor/inference/scope_indexer.rb
862
884
  - lib/rigor/inference/scope_indexer/certainty.rb
863
885
  - lib/rigor/inference/scope_indexer/class_cvars_collector.rb
886
+ - lib/rigor/inference/scope_indexer/constant_ivar_value.rb
864
887
  - lib/rigor/inference/scope_indexer/declared_ivar_types.rb
865
888
  - lib/rigor/inference/scope_indexer/declared_param_writes.rb
866
889
  - lib/rigor/inference/scope_indexer/def_nestings_collector.rb
890
+ - lib/rigor/inference/scope_indexer/derived_param_value.rb
891
+ - lib/rigor/inference/scope_indexer/empty_seed.rb
892
+ - lib/rigor/inference/scope_indexer/ivar_contributions.rb
867
893
  - lib/rigor/inference/scope_indexer/layered_def_nestings.rb
868
894
  - lib/rigor/inference/scope_indexer/member_layouts_collector.rb
869
895
  - lib/rigor/inference/scope_indexer/mixin_accumulator.rb
870
896
  - lib/rigor/inference/scope_indexer/superclasses_collector.rb
871
897
  - lib/rigor/inference/scope_indexer/unseen_ivar_writers.rb
872
898
  - lib/rigor/inference/self_call_ivar_writes.rb
899
+ - lib/rigor/inference/set_mutation.rb
873
900
  - lib/rigor/inference/singleton_external_ahead.rb
874
901
  - lib/rigor/inference/singleton_hook_decline.rb
875
902
  - lib/rigor/inference/singleton_object_constant.rb
@@ -881,6 +908,7 @@ files:
881
908
  - lib/rigor/inference/synthetic_method_index.rb
882
909
  - lib/rigor/inference/synthetic_method_scanner.rb
883
910
  - lib/rigor/inference/synthetic_method_scanner/project_members.rb
911
+ - lib/rigor/inference/toplevel_def_census.rb
884
912
  - lib/rigor/inference/unknown_store_widening.rb
885
913
  - lib/rigor/inference/unthreaded_rebinds.rb
886
914
  - lib/rigor/inference/untyped_rejoin.rb
@@ -891,6 +919,7 @@ files:
891
919
  - lib/rigor/language_server/buffer_resolution.rb
892
920
  - lib/rigor/language_server/buffer_table.rb
893
921
  - lib/rigor/language_server/completion_provider.rb
922
+ - lib/rigor/language_server/config_warning_announcer.rb
894
923
  - lib/rigor/language_server/debouncer.rb
895
924
  - lib/rigor/language_server/diagnostic_publisher.rb
896
925
  - lib/rigor/language_server/document_symbol_provider.rb
@@ -975,6 +1004,7 @@ files:
975
1004
  - lib/rigor/reflection/constant_ancestors.rb
976
1005
  - lib/rigor/reflection/constant_path.rb
977
1006
  - lib/rigor/rooted_glob.rb
1007
+ - lib/rigor/run_scoped_slots.rb
978
1008
  - lib/rigor/runtime/jit.rb
979
1009
  - lib/rigor/scope.rb
980
1010
  - lib/rigor/scope/discovery_index.rb
@@ -986,6 +1016,7 @@ files:
986
1016
  - lib/rigor/sig_gen/declaration_equivalence.rb
987
1017
  - lib/rigor/sig_gen/effect_annotation.rb
988
1018
  - lib/rigor/sig_gen/generator.rb
1019
+ - lib/rigor/sig_gen/generic_header_scan.rb
989
1020
  - lib/rigor/sig_gen/inline_declarations.rb
990
1021
  - lib/rigor/sig_gen/layout_index.rb
991
1022
  - lib/rigor/sig_gen/meta_class_shape.rb
@@ -998,6 +1029,7 @@ files:
998
1029
  - lib/rigor/sig_gen/skip_reason_catalog.rb
999
1030
  - lib/rigor/sig_gen/superclass_spelling.rb
1000
1031
  - lib/rigor/sig_gen/type_elaborator.rb
1032
+ - lib/rigor/sig_gen/type_name_qualification.rb
1001
1033
  - lib/rigor/sig_gen/write_reporter.rb
1002
1034
  - lib/rigor/sig_gen/write_result.rb
1003
1035
  - lib/rigor/sig_gen/writer.rb
@@ -1125,6 +1157,7 @@ files:
1125
1157
  - plugins/rigor-activesupport-core-ext/lib/rigor-activesupport-core-ext.rb
1126
1158
  - plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext.rb
1127
1159
  - plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext/effects.rb
1160
+ - plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext/symbolize_keys.rb
1128
1161
  - plugins/rigor-activesupport-core-ext/sig/active_support/core_ext.rbs
1129
1162
  - plugins/rigor-alba/lib/rigor-alba.rb
1130
1163
  - plugins/rigor-alba/lib/rigor/plugin/alba.rb
@@ -1436,7 +1469,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1436
1469
  - !ruby/object:Gem::Version
1437
1470
  version: '0'
1438
1471
  requirements: []
1439
- rubygems_version: 4.0.10
1472
+ rubygems_version: 3.7.2
1440
1473
  specification_version: 4
1441
1474
  summary: Inference-first static analysis for Ruby.
1442
1475
  test_files: []