rigortype 0.4.5 → 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 (452) 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 +61 -5
  8. data/docs/handbook/appendix-phpstan.md +4 -4
  9. data/docs/manual/02-cli-reference.md +192 -27
  10. data/docs/manual/03-configuration.md +38 -4
  11. data/docs/manual/04-diagnostics.md +1 -1
  12. data/docs/manual/06-baseline.md +6 -4
  13. data/docs/manual/09-editor-integration.md +13 -2
  14. data/docs/manual/10-mcp-server.md +47 -3
  15. data/docs/manual/12-caching.md +9 -1
  16. data/docs/manual/plugins/rigor-actionmailer.md +30 -0
  17. data/docs/manual/plugins/rigor-actionpack.md +49 -11
  18. data/docs/manual/plugins/rigor-activesupport-core-ext.md +20 -1
  19. data/docs/manual/plugins/rigor-devise.md +15 -0
  20. data/docs/manual/plugins/rigor-rspec.md +2 -1
  21. data/lib/rigor/analysis/baseline.rb +24 -27
  22. data/lib/rigor/analysis/buffer_binding.rb +14 -0
  23. data/lib/rigor/analysis/check_rules/always_truthy_condition_collector.rb +5 -6
  24. data/lib/rigor/analysis/check_rules/dead_assignment_collector.rb +2 -2
  25. data/lib/rigor/analysis/check_rules/declaration_sourced_guard.rb +4 -4
  26. data/lib/rigor/analysis/check_rules/duplicate_hash_key_collector.rb +2 -2
  27. data/lib/rigor/analysis/check_rules/inferred_param_guard.rb +105 -12
  28. data/lib/rigor/analysis/check_rules/ivar_write_collector.rb +143 -15
  29. data/lib/rigor/analysis/check_rules/lexical_method_sites.rb +4 -1
  30. data/lib/rigor/analysis/check_rules/main_pass_collector.rb +5 -8
  31. data/lib/rigor/analysis/check_rules/published_constant_guard.rb +1 -1
  32. data/lib/rigor/analysis/check_rules/rbs_receiver_surface.rb +66 -3
  33. data/lib/rigor/analysis/check_rules/rebinding_block_callees/dispatch.rb +112 -0
  34. data/lib/rigor/analysis/check_rules/rebinding_block_callees.rb +394 -0
  35. data/lib/rigor/analysis/check_rules/return_in_ensure_collector.rb +1 -2
  36. data/lib/rigor/analysis/check_rules/ruby_deprecations.rb +7 -0
  37. data/lib/rigor/analysis/check_rules/rule_ids.rb +1 -1
  38. data/lib/rigor/analysis/check_rules/rule_walk.rb +9 -7
  39. data/lib/rigor/analysis/check_rules/shadowed_rescue_collector.rb +3 -4
  40. data/lib/rigor/analysis/check_rules/special_global_setters.rb +3 -3
  41. data/lib/rigor/analysis/check_rules/unreachable_clause_collector.rb +53 -2
  42. data/lib/rigor/analysis/check_rules/void_value_use_collector.rb +1 -1
  43. data/lib/rigor/analysis/check_rules.rb +217 -52
  44. data/lib/rigor/analysis/crash_signature.rb +2 -2
  45. data/lib/rigor/analysis/dependency_recorder.rb +15 -4
  46. data/lib/rigor/analysis/dependency_source_inference/boundary_cross_reporter.rb +14 -3
  47. data/lib/rigor/analysis/dependency_source_inference/gem_resolver.rb +1 -1
  48. data/lib/rigor/analysis/dependency_source_inference/index.rb +6 -8
  49. data/lib/rigor/analysis/dependency_source_inference/walker.rb +4 -4
  50. data/lib/rigor/analysis/edit_replay.rb +154 -0
  51. data/lib/rigor/analysis/fact_store.rb +3 -3
  52. data/lib/rigor/analysis/incremental.rb +37 -0
  53. data/lib/rigor/analysis/incremental_run_slot/write_guard.rb +2 -2
  54. data/lib/rigor/analysis/incremental_run_slot.rb +2 -2
  55. data/lib/rigor/analysis/incremental_session.rb +202 -43
  56. data/lib/rigor/analysis/path_expansion.rb +41 -0
  57. data/lib/rigor/analysis/require_relative_closure.rb +100 -0
  58. data/lib/rigor/analysis/rule_catalog.rb +7 -3
  59. data/lib/rigor/analysis/run_disclosure_credit.rb +80 -0
  60. data/lib/rigor/analysis/run_disclosure_ledger.rb +155 -0
  61. data/lib/rigor/analysis/run_stats.rb +2 -2
  62. data/lib/rigor/analysis/runner/buffer_pool_dispatcher.rb +8 -4
  63. data/lib/rigor/analysis/runner/declaration_position.rb +1 -1
  64. data/lib/rigor/analysis/runner/diagnostic_aggregator.rb +204 -96
  65. data/lib/rigor/analysis/runner/effect_envelope_pass.rb +1 -1
  66. data/lib/rigor/analysis/runner/pool_coordinator.rb +157 -320
  67. data/lib/rigor/analysis/runner/project_pre_passes.rb +48 -6
  68. data/lib/rigor/analysis/runner/run_level_facts.rb +304 -0
  69. data/lib/rigor/analysis/runner/run_snapshots.rb +44 -54
  70. data/lib/rigor/analysis/runner/scan_environment.rb +51 -0
  71. data/lib/rigor/analysis/runner/worker_payload.rb +36 -0
  72. data/lib/rigor/analysis/runner.rb +233 -120
  73. data/lib/rigor/analysis/self_call_resolution_recorder.rb +1 -1
  74. data/lib/rigor/analysis/template_unit_positions.rb +2 -3
  75. data/lib/rigor/analysis/template_units.rb +9 -1
  76. data/lib/rigor/analysis/worker_session.rb +38 -33
  77. data/lib/rigor/bleeding_edge.rb +3 -6
  78. data/lib/rigor/builtins/imported_refinements.rb +6 -8
  79. data/lib/rigor/builtins/predefined_constant_refinements.rb +1 -1
  80. data/lib/rigor/builtins/regex_refinement.rb +4 -6
  81. data/lib/rigor/cache/descriptor.rb +6 -5
  82. data/lib/rigor/cache/incremental_snapshot.rb +60 -18
  83. data/lib/rigor/cache/rbs_cache_producer.rb +2 -2
  84. data/lib/rigor/cache/rbs_class_ancestor_table.rb +1 -1
  85. data/lib/rigor/cache/rbs_class_type_param_names.rb +2 -2
  86. data/lib/rigor/cache/rbs_constant_table.rb +1 -1
  87. data/lib/rigor/cache/rbs_descriptor.rb +54 -3
  88. data/lib/rigor/cache/rbs_environment.rb +4 -1
  89. data/lib/rigor/cache/rbs_environment_marshal_patch.rb +2 -2
  90. data/lib/rigor/cache/rbs_known_class_names.rb +1 -1
  91. data/lib/rigor/cache/store.rb +11 -10
  92. data/lib/rigor/ci_detector.rb +1 -1
  93. data/lib/rigor/cli/annotate_command.rb +24 -19
  94. data/lib/rigor/cli/baseline_command.rb +145 -55
  95. data/lib/rigor/cli/catalogue.rb +256 -0
  96. data/lib/rigor/cli/check_command.rb +188 -93
  97. data/lib/rigor/cli/check_runner_factory.rb +2 -2
  98. data/lib/rigor/cli/command.rb +15 -1
  99. data/lib/rigor/cli/coverage_command.rb +21 -8
  100. data/lib/rigor/cli/coverage_mutation.rb +5 -7
  101. data/lib/rigor/cli/coverage_renderer.rb +2 -1
  102. data/lib/rigor/cli/coverage_scan.rb +3 -5
  103. data/lib/rigor/cli/diff_command.rb +27 -21
  104. data/lib/rigor/cli/docs_command.rb +1 -2
  105. data/lib/rigor/cli/doctor_command.rb +12 -12
  106. data/lib/rigor/cli/effects_command.rb +50 -40
  107. data/lib/rigor/cli/effects_diff_renderer.rb +18 -17
  108. data/lib/rigor/cli/effects_explain_renderer.rb +13 -12
  109. data/lib/rigor/cli/effects_renderer.rb +2 -1
  110. data/lib/rigor/cli/effects_snapshot_command.rb +18 -17
  111. data/lib/rigor/cli/explain_command.rb +18 -8
  112. data/lib/rigor/cli/fused_protection_renderer.rb +2 -1
  113. data/lib/rigor/cli/json_document.rb +41 -0
  114. data/lib/rigor/cli/lens_command.rb +17 -13
  115. data/lib/rigor/cli/lsp_command.rb +250 -23
  116. data/lib/rigor/cli/mcp_command.rb +14 -8
  117. data/lib/rigor/cli/mutation_fork_scan.rb +1 -1
  118. data/lib/rigor/cli/mutation_protection_renderer.rb +3 -2
  119. data/lib/rigor/cli/options.rb +60 -4
  120. data/lib/rigor/cli/plugin_command.rb +93 -46
  121. data/lib/rigor/cli/plugins_command.rb +22 -18
  122. data/lib/rigor/cli/plugins_renderer.rb +34 -8
  123. data/lib/rigor/cli/protection_fork_scan.rb +2 -2
  124. data/lib/rigor/cli/protection_renderer.rb +2 -1
  125. data/lib/rigor/cli/show_bleedingedge_command.rb +23 -16
  126. data/lib/rigor/cli/sig_gen_command.rb +130 -34
  127. data/lib/rigor/cli/skill_command.rb +32 -3
  128. data/lib/rigor/cli/skill_deep_probe.rb +1 -1
  129. data/lib/rigor/cli/skill_describe.rb +1 -1
  130. data/lib/rigor/cli/trace_command.rb +14 -9
  131. data/lib/rigor/cli/triage_command.rb +10 -11
  132. data/lib/rigor/cli/triage_renderer.rb +2 -1
  133. data/lib/rigor/cli/type_of_command.rb +18 -12
  134. data/lib/rigor/cli/type_of_project_scope.rb +24 -0
  135. data/lib/rigor/cli/type_of_renderer.rb +4 -1
  136. data/lib/rigor/cli/type_scan_command.rb +14 -9
  137. data/lib/rigor/cli/type_scan_renderer.rb +2 -1
  138. data/lib/rigor/cli/unused_command.rb +27 -17
  139. data/lib/rigor/cli/upgrade_command.rb +5 -0
  140. data/lib/rigor/cli.rb +209 -54
  141. data/lib/rigor/config_audit.rb +17 -6
  142. data/lib/rigor/configuration/severity_profile.rb +5 -5
  143. data/lib/rigor/configuration.rb +86 -34
  144. data/lib/rigor/effects/definition_context.rb +0 -2
  145. data/lib/rigor/effects/envelope.rb +1 -1
  146. data/lib/rigor/effects/framework_units.rb +1 -1
  147. data/lib/rigor/effects/mutation_classifier.rb +4 -7
  148. data/lib/rigor/effects/propagator.rb +1 -1
  149. data/lib/rigor/effects/registry.rb +2 -2
  150. data/lib/rigor/effects/snapshot.rb +1 -1
  151. data/lib/rigor/effects/taint_cause.rb +0 -2
  152. data/lib/rigor/effects/unit_scan.rb +9 -13
  153. data/lib/rigor/environment/bundle_sig_discovery.rb +5 -9
  154. data/lib/rigor/environment/class_registry.rb +3 -3
  155. data/lib/rigor/environment/core_root.rb +77 -0
  156. data/lib/rigor/environment/default_libraries.rb +1 -1
  157. data/lib/rigor/environment/deferred_signature_plan.rb +283 -0
  158. data/lib/rigor/environment/gated_signature_guard.rb +1 -1
  159. data/lib/rigor/environment/gated_signature_plan.rb +5 -2
  160. data/lib/rigor/environment/lockfile_resolver.rb +28 -12
  161. data/lib/rigor/environment/member_consistency/comparator.rb +18 -1
  162. data/lib/rigor/environment/member_consistency.rb +56 -7
  163. data/lib/rigor/environment/missing_gem_constant_index.rb +3 -2
  164. data/lib/rigor/environment/project_path_gems.rb +124 -0
  165. data/lib/rigor/environment/rbs_hierarchy.rb +6 -15
  166. data/lib/rigor/environment/rbs_loader.rb +592 -70
  167. data/lib/rigor/environment/reflection.rb +7 -7
  168. data/lib/rigor/environment/required_features.rb +136 -32
  169. data/lib/rigor/environment/ruby_library_roots.rb +122 -0
  170. data/lib/rigor/environment/vendored_signature_plan.rb +153 -0
  171. data/lib/rigor/environment.rb +44 -11
  172. data/lib/rigor/flow_contribution/merger.rb +4 -4
  173. data/lib/rigor/inference/acceptance.rb +93 -32
  174. data/lib/rigor/inference/block_parameter_binder.rb +2 -3
  175. data/lib/rigor/inference/block_run_count.rb +178 -0
  176. data/lib/rigor/inference/budget_trace.rb +8 -2
  177. data/lib/rigor/inference/builtins/exception_catalog.rb +2 -2
  178. data/lib/rigor/inference/builtins/numeric_catalog.rb +2 -5
  179. data/lib/rigor/inference/builtins/random_catalog.rb +2 -2
  180. data/lib/rigor/inference/callee_mutation_chain.rb +126 -0
  181. data/lib/rigor/inference/callee_write_census.rb +815 -0
  182. data/lib/rigor/inference/construction_escape.rb +217 -0
  183. data/lib/rigor/inference/declaration_walk/traversal.rb +1 -1
  184. data/lib/rigor/inference/deep_erasure.rb +170 -0
  185. data/lib/rigor/inference/def_handle.rb +1 -1
  186. data/lib/rigor/inference/def_node_resolver.rb +1 -1
  187. data/lib/rigor/inference/def_return_typer.rb +204 -12
  188. data/lib/rigor/inference/definer_resolution.rb +21 -5
  189. data/lib/rigor/inference/definers_index.rb +106 -0
  190. data/lib/rigor/inference/direct_ivar_writes.rb +300 -0
  191. data/lib/rigor/inference/element_read_widening.rb +49 -3
  192. data/lib/rigor/inference/error_info.rb +17 -3
  193. data/lib/rigor/inference/expression_typer.rb +173 -57
  194. data/lib/rigor/inference/external_ancestor_resolution.rb +3 -4
  195. data/lib/rigor/inference/global_write_census.rb +110 -1
  196. data/lib/rigor/inference/global_writer_reach.rb +260 -0
  197. data/lib/rigor/inference/hkt_body.rb +1 -2
  198. data/lib/rigor/inference/hkt_body_parser.rb +3 -5
  199. data/lib/rigor/inference/hkt_reducer.rb +2 -2
  200. data/lib/rigor/inference/hkt_registry.rb +3 -5
  201. data/lib/rigor/inference/indexed_narrowing.rb +4 -7
  202. data/lib/rigor/inference/intervening_ivar_reset.rb +26 -4
  203. data/lib/rigor/inference/ivar_writer_census.rb +246 -0
  204. data/lib/rigor/inference/key_presence_guard.rb +2 -1
  205. data/lib/rigor/inference/loop_value_record.rb +57 -0
  206. data/lib/rigor/inference/match_rebinding/frame.rb +65 -0
  207. data/lib/rigor/inference/match_rebinding/yielding_match.rb +45 -0
  208. data/lib/rigor/inference/match_rebinding.rb +11 -1
  209. data/lib/rigor/inference/memo_audit.rb +55 -0
  210. data/lib/rigor/inference/method_dispatcher/alias_strict_nominals.rb +1 -1
  211. data/lib/rigor/inference/method_dispatcher/argument_distribution.rb +40 -0
  212. data/lib/rigor/inference/method_dispatcher/block_folding.rb +1 -1
  213. data/lib/rigor/inference/method_dispatcher/constant_folding.rb +113 -12
  214. data/lib/rigor/inference/method_dispatcher/contested_overloads.rb +89 -0
  215. data/lib/rigor/inference/method_dispatcher/iterator_dispatch.rb +1 -1
  216. data/lib/rigor/inference/method_dispatcher/kernel_dispatch.rb +7 -3
  217. data/lib/rigor/inference/method_dispatcher/no_match_fallback.rb +54 -0
  218. data/lib/rigor/inference/method_dispatcher/overload_selector.rb +39 -27
  219. data/lib/rigor/inference/method_dispatcher/random_folding.rb +1 -1
  220. data/lib/rigor/inference/method_dispatcher/rbs_dispatch.rb +203 -17
  221. data/lib/rigor/inference/method_dispatcher/reduce_folding.rb +1 -1
  222. data/lib/rigor/inference/method_dispatcher/regexp_folding.rb +2 -2
  223. data/lib/rigor/inference/method_dispatcher/self_substitute.rb +2 -2
  224. data/lib/rigor/inference/method_dispatcher/set_folding.rb +59 -24
  225. data/lib/rigor/inference/method_dispatcher/shape_dispatch.rb +83 -20
  226. data/lib/rigor/inference/method_dispatcher/singleton_folding.rb +0 -1
  227. data/lib/rigor/inference/method_dispatcher/singleton_mixin_dispatch.rb +50 -17
  228. data/lib/rigor/inference/method_dispatcher/struct_folding.rb +5 -5
  229. data/lib/rigor/inference/method_dispatcher/struct_materialization.rb +4 -6
  230. data/lib/rigor/inference/method_dispatcher/uri_folding.rb +1 -1
  231. data/lib/rigor/inference/method_dispatcher.rb +109 -29
  232. data/lib/rigor/inference/module_function_state/spellings.rb +64 -0
  233. data/lib/rigor/inference/module_function_state.rb +23 -1
  234. data/lib/rigor/inference/multi_target_binder.rb +1 -1
  235. data/lib/rigor/inference/mutation_rejoin.rb +240 -4
  236. data/lib/rigor/inference/mutation_widening.rb +162 -29
  237. data/lib/rigor/inference/narrowing.rb +113 -38
  238. data/lib/rigor/inference/object_mixins.rb +13 -1
  239. data/lib/rigor/inference/optimistic_origin.rb +1 -1
  240. data/lib/rigor/inference/out_buffer_mutation.rb +72 -0
  241. data/lib/rigor/inference/parameter_inference_collector.rb +5 -6
  242. data/lib/rigor/inference/pre_eval_constants.rb +1 -1
  243. data/lib/rigor/inference/project_method_ownership.rb +6 -3
  244. data/lib/rigor/inference/project_seed_tables.rb +2 -1
  245. data/lib/rigor/inference/project_yielder.rb +122 -0
  246. data/lib/rigor/inference/receiver_alias.rb +20 -0
  247. data/lib/rigor/inference/refined_dispatch/constructed_class.rb +3 -1
  248. data/lib/rigor/inference/refined_dispatch/own_method.rb +2 -1
  249. data/lib/rigor/inference/remover_holder_scan.rb +233 -0
  250. data/lib/rigor/inference/remover_narrowing.rb +224 -0
  251. data/lib/rigor/inference/rewrite_mutation.rb +53 -2
  252. data/lib/rigor/inference/scope_indexer/certainty.rb +9 -1
  253. data/lib/rigor/inference/scope_indexer/constant_ivar_value.rb +93 -0
  254. data/lib/rigor/inference/scope_indexer/declared_ivar_types.rb +64 -0
  255. data/lib/rigor/inference/scope_indexer/declared_param_writes.rb +205 -0
  256. data/lib/rigor/inference/scope_indexer/derived_param_value.rb +112 -0
  257. data/lib/rigor/inference/scope_indexer/empty_seed.rb +99 -0
  258. data/lib/rigor/inference/scope_indexer/ivar_contributions.rb +135 -0
  259. data/lib/rigor/inference/scope_indexer/unseen_ivar_writers.rb +133 -0
  260. data/lib/rigor/inference/scope_indexer.rb +614 -146
  261. data/lib/rigor/inference/self_call_ivar_writes.rb +101 -17
  262. data/lib/rigor/inference/set_mutation.rb +189 -0
  263. data/lib/rigor/inference/singleton_hook_decline.rb +1 -2
  264. data/lib/rigor/inference/statement_evaluator.rb +3036 -278
  265. data/lib/rigor/inference/struct_fold_safety.rb +4 -6
  266. data/lib/rigor/inference/synthetic_method_index.rb +23 -0
  267. data/lib/rigor/inference/synthetic_method_scanner/project_members.rb +130 -0
  268. data/lib/rigor/inference/synthetic_method_scanner.rb +73 -14
  269. data/lib/rigor/inference/toplevel_def_census.rb +59 -0
  270. data/lib/rigor/inference/unknown_store_widening.rb +103 -4
  271. data/lib/rigor/inference/unthreaded_rebinds.rb +2 -3
  272. data/lib/rigor/inference/void_tail_summary.rb +2 -1
  273. data/lib/rigor/language_server/buffer_table.rb +9 -3
  274. data/lib/rigor/language_server/completion_provider.rb +26 -20
  275. data/lib/rigor/language_server/config_warning_announcer.rb +28 -0
  276. data/lib/rigor/language_server/diagnostic_publisher.rb +28 -9
  277. data/lib/rigor/language_server/document_symbol_provider.rb +1 -1
  278. data/lib/rigor/language_server/folding_range_provider.rb +1 -2
  279. data/lib/rigor/language_server/hover_provider.rb +1 -7
  280. data/lib/rigor/language_server/hover_renderer.rb +6 -8
  281. data/lib/rigor/language_server/project_context.rb +98 -4
  282. data/lib/rigor/language_server/publish_batcher.rb +3 -4
  283. data/lib/rigor/language_server/selection_range_provider.rb +2 -4
  284. data/lib/rigor/language_server/server.rb +12 -6
  285. data/lib/rigor/language_server/signature_help_provider.rb +4 -4
  286. data/lib/rigor/lens/plugins.rb +1 -1
  287. data/lib/rigor/mcp/server.rb +82 -3
  288. data/lib/rigor/mcp.rb +1 -1
  289. data/lib/rigor/plugin/access_denied_error.rb +1 -2
  290. data/lib/rigor/plugin/base.rb +26 -11
  291. data/lib/rigor/plugin/bundled_catalog.rb +1 -12
  292. data/lib/rigor/plugin/io_boundary.rb +1 -1
  293. data/lib/rigor/plugin/loader.rb +25 -8
  294. data/lib/rigor/plugin/macro/heredoc_template.rb +7 -8
  295. data/lib/rigor/plugin/macro/trait_registry.rb +6 -9
  296. data/lib/rigor/plugin/manifest.rb +38 -16
  297. data/lib/rigor/plugin/registry.rb +41 -3
  298. data/lib/rigor/plugin/services.rb +2 -3
  299. data/lib/rigor/plugin/source_rbs_synthesis_reporter.rb +11 -0
  300. data/lib/rigor/plugin/trust_policy.rb +2 -2
  301. data/lib/rigor/plugin/type_node_resolver.rb +2 -4
  302. data/lib/rigor/plugin.rb +6 -8
  303. data/lib/rigor/plugin_gap_advisory.rb +5 -1
  304. data/lib/rigor/project_environment.rb +16 -2
  305. data/lib/rigor/protection/analysis_guard.rb +1 -1
  306. data/lib/rigor/protection/discovery_seed.rb +96 -2
  307. data/lib/rigor/protection/mutator.rb +1 -1
  308. data/lib/rigor/rbs_extended/envelope_scanner.rb +4 -6
  309. data/lib/rigor/rbs_extended/hkt_directives.rb +6 -10
  310. data/lib/rigor/rbs_extended/reporter.rb +27 -3
  311. data/lib/rigor/rbs_extended.rb +2 -3
  312. data/lib/rigor/reflection/constant_ancestors.rb +5 -3
  313. data/lib/rigor/rooted_glob.rb +25 -2
  314. data/lib/rigor/run_scoped_slots.rb +38 -0
  315. data/lib/rigor/runtime/jit.rb +1 -1
  316. data/lib/rigor/scope/discovery_index.rb +19 -6
  317. data/lib/rigor/scope/resolution_chain.rb +3 -1
  318. data/lib/rigor/scope.rb +379 -36
  319. data/lib/rigor/sig_gen/classification.rb +4 -0
  320. data/lib/rigor/sig_gen/effect_annotation.rb +3 -3
  321. data/lib/rigor/sig_gen/generator.rb +668 -84
  322. data/lib/rigor/sig_gen/generic_header_scan.rb +189 -0
  323. data/lib/rigor/sig_gen/inline_declarations.rb +2 -2
  324. data/lib/rigor/sig_gen/layout_index.rb +3 -3
  325. data/lib/rigor/sig_gen/method_candidate.rb +23 -4
  326. data/lib/rigor/sig_gen/observation_collector.rb +7 -6
  327. data/lib/rigor/sig_gen/observed_call.rb +1 -1
  328. data/lib/rigor/sig_gen/path_mapper.rb +6 -0
  329. data/lib/rigor/sig_gen/rbs_validity.rb +1 -1
  330. data/lib/rigor/sig_gen/renderer.rb +21 -12
  331. data/lib/rigor/sig_gen/skip_reason_catalog.rb +15 -2
  332. data/lib/rigor/sig_gen/type_elaborator.rb +21 -5
  333. data/lib/rigor/sig_gen/type_name_qualification.rb +69 -0
  334. data/lib/rigor/sig_gen/write_reporter.rb +63 -14
  335. data/lib/rigor/sig_gen/write_result.rb +23 -12
  336. data/lib/rigor/sig_gen/writer.rb +217 -37
  337. data/lib/rigor/type/acceptance_router.rb +2 -2
  338. data/lib/rigor/type/accepts_result.rb +1 -1
  339. data/lib/rigor/type/app.rb +4 -6
  340. data/lib/rigor/type/combinator.rb +13 -16
  341. data/lib/rigor/type/constant.rb +48 -7
  342. data/lib/rigor/type/hash_shape.rb +26 -40
  343. data/lib/rigor/type/struct_instance.rb +3 -2
  344. data/lib/rigor/type/union.rb +1 -1
  345. data/lib/rigor/type_node/identifier.rb +1 -2
  346. data/lib/rigor/type_node/resolver_chain.rb +1 -1
  347. data/lib/rigor/type_node/string_literal.rb +1 -2
  348. data/lib/rigor/type_node/symbol_literal.rb +1 -2
  349. data/lib/rigor/type_node/union.rb +3 -6
  350. data/lib/rigor/value_semantics.rb +1 -10
  351. data/lib/rigor/version.rb +1 -1
  352. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_discoverer.rb +2 -2
  353. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_index.rb +2 -3
  354. data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable.rb +1 -1
  355. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_discoverer.rb +89 -70
  356. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_index.rb +4 -2
  357. data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer.rb +25 -4
  358. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/analyzer.rb +1 -1
  359. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_index.rb +1 -5
  360. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_scan.rb +0 -1
  361. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/erb_compiler.rb +2 -1
  362. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/view_assigns.rb +1 -1
  363. data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack.rb +79 -19
  364. data/plugins/rigor-activejob/lib/rigor/plugin/activejob/effects.rb +1 -1
  365. data/plugins/rigor-activejob/lib/rigor/plugin/activejob.rb +6 -3
  366. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/association_roots.rb +3 -2
  367. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/effects.rb +2 -2
  368. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_discoverer.rb +21 -31
  369. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_index.rb +10 -16
  370. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_parser.rb +2 -3
  371. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_table.rb +0 -1
  372. data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord.rb +5 -4
  373. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_discoverer.rb +3 -4
  374. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage/attachment_index.rb +1 -1
  375. data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage.rb +7 -12
  376. data/plugins/rigor-activestorage/lib/rigor-activestorage.rb +1 -1
  377. data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext/effects.rb +1 -1
  378. data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext/symbolize_keys.rb +102 -0
  379. data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext.rb +19 -6
  380. data/plugins/rigor-activesupport-core-ext/sig/active_support/core_ext.rbs +26 -13
  381. data/plugins/rigor-alba/lib/rigor/plugin/alba/resource_index.rb +3 -3
  382. data/plugins/rigor-devise/lib/rigor/plugin/devise.rb +5 -3
  383. data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/schema_scanner.rb +1 -3
  384. data/plugins/rigor-dry-struct/lib/rigor/plugin/dry_struct.rb +6 -6
  385. data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types/alias_scanner.rb +5 -6
  386. data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types.rb +7 -6
  387. data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/params_shape.rb +2 -3
  388. data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation.rb +5 -8
  389. data/plugins/rigor-ethon/lib/rigor/plugin/ethon.rb +0 -1
  390. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_discoverer.rb +1 -1
  391. data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot.rb +10 -18
  392. data/plugins/rigor-ffi/lib/rigor/plugin/ffi/analyzer.rb +0 -1
  393. data/plugins/rigor-ffi/lib/rigor/plugin/ffi/discoverer.rb +0 -2
  394. data/plugins/rigor-ffi/lib/rigor/plugin/ffi.rb +4 -5
  395. data/plugins/rigor-grape/lib/rigor/plugin/grape.rb +0 -2
  396. data/plugins/rigor-graphql/lib/rigor/plugin/graphql/type_scanner.rb +6 -7
  397. data/plugins/rigor-hanami/lib/rigor/plugin/hanami/action_checker.rb +2 -4
  398. data/plugins/rigor-hanami/lib/rigor/plugin/hanami.rb +2 -5
  399. data/plugins/rigor-mangrove/lib/rigor/plugin/mangrove.rb +2 -2
  400. data/plugins/rigor-minitest/lib/rigor/plugin/minitest/assertion_analyzer.rb +6 -6
  401. data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_discoverer.rb +2 -1
  402. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/analyzer.rb +3 -8
  403. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_index.rb +2 -3
  404. data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_loader.rb +5 -8
  405. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/analyzer.rb +1 -3
  406. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/devise_routes.rb +2 -3
  407. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_discoverer.rb +1 -1
  408. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/routes_parser.rb +4 -11
  409. data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes.rb +1 -1
  410. data/plugins/rigor-rbs-inline/lib/rigor/plugin/rbs_inline.rb +2 -1
  411. data/plugins/rigor-rspec/lib/rigor/plugin/rspec/matcher_analyzer.rb +102 -11
  412. data/plugins/rigor-rspec/lib/rigor/plugin/rspec.rb +2 -2
  413. data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails.rb +3 -4
  414. data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers/analyzer.rb +6 -8
  415. data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq.rb +5 -2
  416. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/absurd_recognizer.rb +4 -5
  417. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/assertion_recognizer.rb +6 -7
  418. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog.rb +1 -1
  419. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sig_parser.rb +2 -2
  420. data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet.rb +17 -21
  421. data/plugins/rigor-statesman/lib/rigor/plugin/statesman.rb +2 -3
  422. data/plugins/rigor-typelizer/lib/rigor/plugin/typelizer/serializer_discoverer.rb +3 -2
  423. data/plugins/rigor-typelizer/lib/rigor/plugin/typelizer/serializer_index.rb +4 -4
  424. data/plugins/rigor-typelizer/lib/rigor/plugin/typelizer.rb +1 -1
  425. data/sig/rigor/analysis/baseline.rbs +0 -2
  426. data/sig/rigor/analysis/fact_store.rbs +1 -0
  427. data/sig/rigor/analysis/reachability/scan_cache.rbs +1 -1
  428. data/sig/rigor/cli/diff_command.rbs +1 -1
  429. data/sig/rigor/cli/explain_command.rbs +1 -1
  430. data/sig/rigor/effects/file_collection.rbs +5 -6
  431. data/sig/rigor/effects/registry.rbs +8 -6
  432. data/sig/rigor/effects/summary.rbs +6 -5
  433. data/sig/rigor/environment.rbs +5 -3
  434. data/sig/rigor/inference/optimistic_origin.rbs +11 -0
  435. data/sig/rigor/inference.rbs +10 -1
  436. data/sig/rigor/plugin/additional_initializer.rbs +0 -5
  437. data/sig/rigor/plugin/base.rbs +1 -0
  438. data/sig/rigor/plugin/effect_ancestry.rbs +6 -4
  439. data/sig/rigor/plugin/effect_attribution.rbs +25 -10
  440. data/sig/rigor/plugin/effect_edge.rbs +12 -5
  441. data/sig/rigor/plugin/effect_entry_points.rbs +8 -3
  442. data/sig/rigor/plugin/io_boundary.rbs +6 -5
  443. data/sig/rigor/plugin/manifest.rbs +16 -18
  444. data/sig/rigor/plugin/protocol_contract.rbs +6 -9
  445. data/sig/rigor/plugin/registry.rbs +1 -1
  446. data/sig/rigor/scope.rbs +51 -50
  447. data/sig/rigor/type.rbs +0 -6
  448. data/skills/rigor-plugin-author/SKILL.md +4 -4
  449. data/skills/rigor-plugin-author/references/02-walker-and-types.md +5 -5
  450. data/skills/rigor-plugin-review/SKILL.md +3 -3
  451. data/skills/rigor-project-init/references/03-baseline-and-bugs.md +12 -1
  452. metadata +55 -3
@@ -5,6 +5,17 @@ module Rigor
5
5
  # (sig.skipped.untyped-return). The answer is the recorded `true` / `false` / `nil`, or the `UNKNOWN_MISS`
6
6
  # sentinel; declaring it is what lets sig-gen type `Scope#optimistic_local_miss` / `#optimistic_ivar_miss`.
7
7
  def self?.bound_miss: (untyped mark) -> Object?
8
+
9
+ class BoundMark < ::Data
10
+ # sig-gen gap: #1150 — a `Data.define` member; sig-gen proposes `untyped`. The cause a mark records.
11
+ def cause: () -> Symbol
12
+ # sig-gen gap: #1150 — a `Data.define` member; the recorded miss answer.
13
+ def miss: () -> bool?
14
+ # sig-gen gap: #1150 — the `Data.define` constructor; sig-gen types its members `untyped`.
15
+ def self.new: (cause: Symbol, miss: bool?) -> instance | (Symbol cause, bool? miss) -> instance
16
+ # sig-gen gap: #1150 — as above.
17
+ def self.[]: (cause: Symbol, miss: bool?) -> instance | (Symbol cause, bool? miss) -> instance
18
+ end
8
19
  end
9
20
  end
10
21
  end
@@ -3,7 +3,8 @@ module Rigor
3
3
  type closure_classification = :non_escaping | :escaping | :unknown
4
4
 
5
5
  class ExpressionTyper
6
- def self.harvest_return_memo: () -> Hash[untyped, Array[untyped]]
6
+ def self.harvest_return_memo: (?Hash[untyped, Hash[untyped, untyped]]? bucket) -> Hash[untyped, Array[untyped]]
7
+ def self.current_return_memo: () -> Hash[untyped, Hash[untyped, untyped]]?
7
8
  def initialize: (scope: Scope, ?tracer: FallbackTracer?) -> void
8
9
  def type_of: (untyped node) -> Type::t
9
10
  def return_type_for: (untyped def_node, Type::t receiver, Array[Type::t] arg_types) -> Type::t?
@@ -172,8 +173,16 @@ module Rigor
172
173
  def self?.collect_class_decls: (untyped node, Array[String] qualified_prefix, Hash[String, Type::t] accumulator) -> void
173
174
  def self?.constant_writes_for_file: (untyped root) -> Hash[String, untyped]
174
175
  def self?.constant_literal_value: (untyped rvalue) -> Array[untyped]?
176
+ # authored: the `Set[String]` values are source paths by contract; a Set's element type stays `untyped` in sig-gen (#2177, #2317), so the generator
177
+ # would never propose it.
175
178
  def self?.finalize_constant_writes: (Hash[String, Hash[String, untyped]] writes) -> [Hash[String, Type::Constant], Hash[String, Set[String]]]
176
179
  def self?.propagate: (untyped node, Hash[untyped, Scope] table, Scope parent_scope) -> void
180
+
181
+ class LayeredDefNestings
182
+ def initialize: (Hash[untyped, Array[String]] file, Scope::DiscoveryIndex::def_nestings seed) -> void
183
+ def []: (untyped def_node) -> Array[String]?
184
+ def empty?: () -> bool
185
+ end
177
186
  end
178
187
 
179
188
  class CoverageScanner
@@ -4,15 +4,10 @@ module Rigor
4
4
  # the read-before-write nil soundness gate does not widen their ivars. See
5
5
  # lib/rigor/plugin/additional_initializer.rb for the full contract.
6
6
  class AdditionalInitializer
7
- # sig-gen gap: #1154 — `attr_reader` rows over ivars assigned from `initialize` parameters are
8
- # skipped (untyped return); the constructor validates `receiver_constraint` is a non-empty
9
- # String and normalizes both lists with `map(&:to_sym)`, so the stored types are hand-written.
10
7
  attr_reader receiver_constraint: String
11
8
 
12
- # sig-gen gap: #1154 — as above.
13
9
  attr_reader methods: Array[Symbol]
14
10
 
15
- # sig-gen gap: #1154 — as above.
16
11
  attr_reader block_methods: Array[Symbol]
17
12
 
18
13
  # The validators accept Symbol or non-empty String elements; `initialize` normalizes to
@@ -84,5 +84,6 @@ class Rigor::Plugin::Base
84
84
  def effect_ancestry: () -> Array[Rigor::Plugin::EffectAncestry]
85
85
  def io_boundary: () -> Rigor::Plugin::IoBoundary
86
86
  def cache_for: (untyped producer_id, ?params: untyped, ?descriptor: untyped) -> Proc
87
+ # authored: returns Rigor::Cache::Descriptor::PluginEntry, which has no RBS declaration yet (#2404); stays `untyped` until it is declared
87
88
  def plugin_entry: () -> untyped
88
89
  end
@@ -5,12 +5,14 @@ module Rigor
5
5
  # immediate superclass. Bundled plugins only — `Effects::PluginFacts` enforces it. Frozen value
6
6
  # object.
7
7
  class EffectAncestry
8
- # sig-gen gap: #1154 — validated in `initialize` from the parameter of the same name
9
- # (`to_s`-normalized, frozen), so sig-gen proposes the raw parameter shape.
8
+ # sig-gen gap: #2312 — `child:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
9
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`, then a class-name
10
+ # check), and `initialize` stores the private `validate_class_name!` helper's result (#2312).
10
11
  attr_reader child: String
11
- # sig-gen gap: #1154 — same shape as `child`.
12
+ # sig-gen gap: #2312 — same shape as `child`.
12
13
  attr_reader parent: String
13
- # sig-gen gap: #1154 — same shape; `why:` is required and validated non-empty.
14
+ # sig-gen gap: #2312 — same shape; `why:` is `untyped` and the private `validate_why!` helper (#2312) requires
15
+ # it non-empty.
14
16
  attr_reader why: String
15
17
 
16
18
  def initialize: (child: untyped, parent: untyped, why: untyped) -> void
@@ -15,28 +15,43 @@ module Rigor
15
15
  # The taint causes a plugin row may name — a closed subset of `Effects::TaintCause::ALL`.
16
16
  TAINT_CAUSES: Array[String]
17
17
 
18
- # sig-gen gap: #1154 — normalized/validated in `initialize` from the parameter of the same
19
- # name (`to_s`-coerced, frozen), so sig-gen proposes the raw parameter shape.
18
+ # sig-gen gap: #2312 — `receiver:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
19
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`), and `initialize`
20
+ # stores the private `validate_receiver!` helper's result (#2312).
20
21
  attr_reader receiver: String
21
- # sig-gen gap: #1154 — `to_sym`-normalized from the `method:` parameter.
22
+ # sig-gen gap: #2325 — `method:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
23
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `String | Symbol`), stored as
24
+ # `method.to_sym`.
22
25
  attr_reader method: Symbol
23
26
  attr_reader singleton: bool
24
- # sig-gen gap: #1154 — `Array()`-normalized, deduplicated and frozen from `labels:`.
27
+ # sig-gen gap: #2312 — `labels:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
28
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `Array()` of anything
29
+ # answering `to_s`), stored from the private `normalize_labels` helper (#2312).
25
30
  attr_reader labels: Array[String]
26
- # sig-gen gap: #1154 — `to_s`-normalized from the `narrow:` parameter.
31
+ # sig-gen gap: #2325 — `narrow:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
32
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`, nil kept).
27
33
  attr_reader narrow: String?
28
34
  attr_reader discharge: bool
29
- # sig-gen gap: #1154 — `to_s`-normalized from the `within:` parameter.
35
+ # sig-gen gap: #2312 — `within:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
36
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`), stored from the
37
+ # private `validate_within!` helper (#2312).
30
38
  attr_reader within: String?
31
39
  attr_reader on_result: bool
32
- # sig-gen gap: #1154 — `to_s`-normalized from the `taint:` parameter.
40
+ # sig-gen gap: #2312 — `taint:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
41
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`), stored from the
42
+ # private `validate_taint!` helper (#2312).
33
43
  attr_reader taint: String?
34
- # sig-gen gap: #1154 — `to_s`-normalized from the `callee:` parameter.
44
+ # sig-gen gap: #2325 — `callee:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
45
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`, nil kept).
35
46
  attr_reader callee: String?
36
- # sig-gen gap: #1154 — normalized from the `callee_fallbacks:` parameter.
47
+ # sig-gen gap: #2312 — `callee_fallbacks:` is `untyped` (input `untyped`, looks deliberate; a declared type is
48
+ # authoring intent tracked by #2325, and only then does this row generate; coercion-facing: a Hash of coercible
49
+ # names), stored from the private `validate_callee_fallbacks!` helper (#2312).
37
50
  attr_reader callee_fallbacks: Hash[String, Array[String]]?
38
51
  attr_reader responds: bool
39
- # sig-gen gap: #1154 — `to_s`-normalized from the `why:` parameter.
52
+ # sig-gen gap: #2312 — `why:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
53
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`), stored from the
54
+ # private `validate_why!` helper (#2312).
40
55
  attr_reader why: String
41
56
 
42
57
  # The coercion-facing constructor: every parameter is `to_s`/`to_sym`/`Array()`-normalized,
@@ -7,15 +7,22 @@ module Rigor
7
7
  # The closed set of framework-edge strategies the engine implements.
8
8
  TARGETS: Array[Symbol]
9
9
 
10
- # sig-gen gap: #1154 — validated/normalized in `initialize` from the parameter of the same
11
- # name, so sig-gen proposes the raw parameter shape.
10
+ # sig-gen gap: #2312 — `receiver:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
11
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`), and `initialize`
12
+ # stores the result of the private `validate_receiver!` helper (#2312).
12
13
  attr_reader receiver: String
13
- # sig-gen gap: #1154 — `to_sym`-normalized from the `method:` parameter.
14
+ # sig-gen gap: #2325 — `method:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
15
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `String | Symbol | nil`),
16
+ # stored as `method&.to_sym`.
14
17
  attr_reader method: Symbol?
15
18
  attr_reader singleton: bool
16
- # sig-gen gap: #1154 — validated against `TARGETS` in `initialize`.
19
+ # sig-gen gap: #2312 — `target:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
20
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: a Symbol or String checked
21
+ # against `TARGETS`), stored from the private `validate_target!` helper (#2312).
17
22
  attr_reader target: (:activerecord_callbacks | :perform_now | :mailer_body)
18
- # sig-gen gap: #1154 — `to_s`-normalized from the `why:` parameter.
23
+ # sig-gen gap: #2312 — `why:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
24
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`), stored from the
25
+ # private `validate_why!` helper (#2312).
19
26
  attr_reader why: String
20
27
 
21
28
  def initialize: (receiver: untyped, target: untyped, why: untyped, ?method: untyped,
@@ -4,11 +4,16 @@ module Rigor
4
4
  # framework entry points (ADR-103 WD6). Frozen value object; {#globs} are deduplicated and
5
5
  # sorted in `initialize`.
6
6
  class EffectEntryPoints
7
- # sig-gen gap: #1154 — `to_s`-normalized in `initialize` from the `name:` parameter.
7
+ # sig-gen gap: #2325 — `initialize` declares `name:` `untyped` (input `untyped`, looks deliberate; a declared
8
+ # type is authoring intent tracked by #2325, and only then does this row generate; coercion-facing: it takes
9
+ # anything that answers `to_s`), so no input type reaches the reader.
8
10
  attr_reader name: String
9
- # sig-gen gap: #1154 — deduplicated/sorted/frozen in `initialize` from `globs:`.
11
+ # sig-gen gap: #2325 — `globs:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
12
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `Array(globs)`, each `to_s`),
13
+ # deduplicated and sorted in `initialize`.
10
14
  attr_reader globs: Array[String]
11
- # sig-gen gap: #1154 — `to_s`-normalized in `initialize` from `why:`.
15
+ # sig-gen gap: #2325 — `why:` is `untyped` (input `untyped`, looks deliberate; a declared type is authoring
16
+ # intent tracked by #2325, and only then does this row generate; coercion-facing: `to_s`).
12
17
  attr_reader why: String
13
18
 
14
19
  def initialize: (name: untyped, globs: untyped, ?why: untyped) -> void
@@ -4,17 +4,18 @@ class Rigor::Plugin::IoBoundary
4
4
  def file?: (untyped) -> bool
5
5
  def directory?: (untyped) -> bool
6
6
  def list_directory: (untyped) -> Array[String]
7
- def list_directory_kinds: (untyped) -> Hash[String, untyped]
7
+ def list_directory_kinds: (untyped) -> Hash[String, Symbol]
8
8
  # Records a `:names` glob row (membership only); a caller needing a match's content `read_file`s it. A `..`
9
9
  # segment, a brace or a backslash in `pattern` raises `AccessDeniedError`.
10
10
  def glob: (untyped root, untyped pattern) -> Array[String]
11
- # sig-gen gap: #1154 — the proposal leaves both string fields untyped. `nearest_root` comes from `@policy`, an
12
- # ivar assigned from an `initialize` parameter (the #1154 shape); `first_path` comes from `@first_refused_path`,
13
- # written from `record_refusal(path)`'s parameter outside `initialize`, a case #1154 as titled does not yet cover.
14
- # The record's fields are the running count and the first refused path, nil when nothing was refused.
11
+ # sig-gen gap: #2312 — the proposal leaves both string fields untyped. `nearest_root` comes from `@policy`, a bare
12
+ # assignment of the `policy:` parameter, declared `untyped` above (a `TrustPolicy`; typing it is authoring work,
13
+ # tracked by #2325); `first_path` comes from `@first_refused_path`, written from the private `record_refusal(path)`,
14
+ # whose parameter is undeclared.
15
15
  def refusal_summary: () -> { count: Integer, first_path: String?, nearest_root: String? }?
16
16
  def open_url: (untyped url) -> String
17
17
  # Returns a frozen `Rigor::Cache::Descriptor` (no RBS yet -> untyped).
18
+ # authored: returns Rigor::Cache::Descriptor, which has no RBS declaration yet (#2404); stays `untyped` until it is declared
18
19
  def cache_descriptor: () -> untyped
19
20
  def replay: (untyped descriptor) -> nil
20
21
  end
@@ -3,7 +3,7 @@ class Rigor::Plugin::Manifest::Consumption
3
3
  end
4
4
 
5
5
  class Rigor::Plugin::Manifest
6
- def initialize: (id: untyped, version: untyped, ?description: untyped, ?config_schema: untyped, ?target_gems: untyped, ?produces: untyped, ?consumes: untyped, ?owns_receivers: untyped, ?open_receivers: untyped, ?rbs_complete_ancestors: untyped, ?type_node_resolvers: untyped, ?block_as_methods: untyped, ?heredoc_templates: untyped, ?nested_class_templates: untyped, ?trait_registries: untyped, ?hkt_registrations: untyped, ?hkt_definitions: untyped, ?signature_paths: untyped, ?protocol_contracts: Array[Rigor::Plugin::ProtocolContract], ?source_rbs_synthesizer: untyped, ?additional_initializers: Array[Rigor::Plugin::AdditionalInitializer], ?effect_root: String?, ?effect_labels: Array[String], ?effect_attributions: Array[Rigor::Plugin::EffectAttribution], ?effect_edges: Array[Rigor::Plugin::EffectEdge], ?effect_entry_points: Array[Rigor::Plugin::EffectEntryPoints], ?effect_ancestry: Array[Rigor::Plugin::EffectAncestry], ?template_globs: untyped) -> void
6
+ def initialize: (id: untyped, version: untyped, ?description: untyped, ?config_schema: untyped, ?target_gems: untyped, ?produces: untyped, ?consumes: untyped, ?owns_receivers: untyped, ?open_receivers: untyped, ?rbs_complete_ancestors: untyped, ?type_node_resolvers: untyped, ?block_as_methods: untyped, ?heredoc_templates: untyped, ?nested_class_templates: untyped, ?trait_registries: untyped, ?hkt_registrations: untyped, ?hkt_definitions: untyped, ?signature_paths: untyped, ?protocol_contracts: Array[Rigor::Plugin::ProtocolContract], ?source_rbs_synthesizer: untyped, ?additional_initializers: Array[Rigor::Plugin::AdditionalInitializer], ?effect_root: String?, ?effect_labels: Array[String], ?effect_attributions: Array[Rigor::Plugin::EffectAttribution], ?effect_edges: Array[Rigor::Plugin::EffectEdge], ?effect_entry_points: Array[Rigor::Plugin::EffectEntryPoints], ?effect_ancestry: Array[Rigor::Plugin::EffectAncestry], ?template_globs: Array[String], ?per_invocation_classes: Array[String], ?per_invocation_non_action_macros: Array[Symbol | String]) -> void
7
7
 
8
8
  # Public attribute readers (the full `attr_reader` surface). Plugins
9
9
  # read `manifest.id` / `manifest.protocol_contracts` etc.; declaring
@@ -18,9 +18,9 @@ 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: #1154 — an `attr_reader` over an ivar assigned in `initialize` from a parameter the
22
- # manifest validates but does not type, so inference reaches `untyped` where the contract is
23
- # `Array[String]` (the same gap every other reader in this block carries).
21
+ # sig-gen gap: #2418 — written by a private `assign_*` helper whose parameters are undeclared (`initialize` hands
22
+ # its fields to such helpers); each write is a derived expression (`dup.freeze`, `map`), so the helper's parameter
23
+ # types alone would not generate it.
24
24
  def template_globs: () -> Array[String]
25
25
  def produces: () -> Array[Symbol]
26
26
  def consumes: () -> Array[Rigor::Plugin::Manifest::Consumption]
@@ -35,33 +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: #1154 — `attr_reader` over an ivar assigned in `initialize` from a parameter;
39
- # `validate_protocol_contracts!` requires every element `is_a?(ProtocolContract)`.
38
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_protocol_contracts!` requires every element
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: #1154 — `attr_reader` over an ivar assigned in `initialize` from a parameter;
46
- # the validator (`validate_additional_initializers!`) requires every element
47
- # `is_a?(AdditionalInitializer)`, so the element type is hand-written.
45
+ # sig-gen gap: #2418 — same shape as `template_globs`: the validator (`validate_additional_initializers!`) requires
46
+ # every element `is_a?(AdditionalInitializer)`, so the element type is hand-written.
48
47
  def additional_initializers: () -> Array[Rigor::Plugin::AdditionalInitializer]
49
48
 
50
- # sig-gen gap: #1154 — `attr_reader` over an ivar assigned in `initialize` from a parameter
51
- # (`to_s`-normalized); `validate_effect_root!` bounds the spelling.
49
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_root!` bounds the spelling.
52
50
  def effect_root: () -> String?
53
- # sig-gen gap: #1154 — `attr_reader` over an ivar normalized in `initialize` from a parameter;
54
- # `validate_effect_labels!` requires non-empty `String` elements.
51
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_labels!` requires non-empty `String`
52
+ # elements.
55
53
  def effect_labels: () -> Array[String]
56
- # sig-gen gap: #1154 — `attr_reader` over an ivar assigned in `initialize` from a parameter;
57
- # `validate_effect_attributions!` requires every element `is_a?(EffectAttribution)`.
54
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_attributions!` requires every element
55
+ # `is_a?(EffectAttribution)`.
58
56
  def effect_attributions: () -> Array[Rigor::Plugin::EffectAttribution]
59
- # sig-gen gap: #1154 — same shape; `validate_effect_edges!` requires `is_a?(EffectEdge)`.
57
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_edges!` requires `is_a?(EffectEdge)`.
60
58
  def effect_edges: () -> Array[Rigor::Plugin::EffectEdge]
61
- # sig-gen gap: #1154 — same shape; `validate_effect_entry_points!` requires
59
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_entry_points!` requires
62
60
  # `is_a?(EffectEntryPoints)`.
63
61
  def effect_entry_points: () -> Array[Rigor::Plugin::EffectEntryPoints]
64
- # sig-gen gap: #1154 — same shape; `validate_effect_ancestry!` requires `is_a?(EffectAncestry)`.
62
+ # sig-gen gap: #2418 — same shape as `template_globs`: `validate_effect_ancestry!` requires `is_a?(EffectAncestry)`.
65
63
  def effect_ancestry: () -> Array[Rigor::Plugin::EffectAncestry]
66
64
 
67
65
  # The identity opening a root when this plugin's labels join the run's vocabulary: the
@@ -23,26 +23,23 @@ 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: #1154 — `attr_reader` rows over ivars assigned in `initialize`; each is
27
- # validated/normalized first (`dup.freeze`/`to_sym`/truthiness collapse/coerce), so the
28
- # stored types are hand-written.
29
26
  attr_reader path_glob: String
30
27
 
31
- # sig-gen gap: #1154 — as above (`to_sym` normalizes the accepted Symbol|String).
32
28
  attr_reader method_name: Symbol
33
29
 
34
30
  # `singleton ? true : false` collapses any truthy input to bool — sig-gen already infers
35
- # `false | true`, so this row is generated-equivalent rather than a #1154 gap.
31
+ # `false | true`, so this row is generated-equivalent rather than a gap.
36
32
  attr_reader singleton: bool
37
33
 
38
- # sig-gen gap: #1154 — as above (`coerce_param_types` guarantees `Array[ParamType]`).
34
+ # sig-gen gap: #2312 — `initialize` stores what the private `coerce_param_types` helper returns, whose
35
+ # parameters are undeclared (it guarantees `Array[ParamType]`).
39
36
  attr_reader param_types: Array[ParamType]
40
37
 
41
- # sig-gen gap: #1154 — 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: #1154 — as above (`VALID_SEVERITIES.include?(to_sym)` bounds the stored value
45
- # to the three declared literals).
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.
46
43
  attr_reader severity: :error | :warning | :info
47
44
 
48
45
  # `method_name`/`severity` accept String too (both are `to_sym`'d); `param_types` entries are
@@ -18,7 +18,7 @@ class Rigor::Plugin::Registry
18
18
 
19
19
  # Newly declared — the attr_reader was absent from the sig. `compile_aggregates` builds the ivar
20
20
  # with `flat_map` over the manifests (not from an `initialize` parameter, so this is unmarked
21
- # residue like the `rbs_complete_ancestors` sibling rather than a #1154 row); the element type is
21
+ # residue like the `rbs_complete_ancestors` sibling rather than a parameter-credit row); the element type is
22
22
  # `AdditionalInitializer`, enforced per manifest by `validate_additional_initializers!`.
23
23
  attr_reader additional_initializers: Array[Rigor::Plugin::AdditionalInitializer]
24
24