hecks 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. checksums.yaml +4 -4
  2. data/lib/hecks/adapters/driven/claude_code.rb +7 -7
  3. data/lib/hecks/adapters/driven/d1.rb +187 -23
  4. data/lib/hecks/adapters/driven/folder.rb +10 -10
  5. data/lib/hecks/adapters/driven/google_authentication.rb +8 -8
  6. data/lib/hecks/adapters/driven/governance_authorization.rb +31 -13
  7. data/lib/hecks/adapters/driven/heki/journal.rb +5 -4
  8. data/lib/hecks/adapters/driven/heki/saga_store.rb +5 -5
  9. data/lib/hecks/adapters/driven/heki.rb +13 -7
  10. data/lib/hecks/adapters/driven/identity_registry.rb +2 -2
  11. data/lib/hecks/adapters/driven/in_memory_ordering.rb +3 -3
  12. data/lib/hecks/adapters/driven/lambda/client.rb +34 -9
  13. data/lib/hecks/adapters/driven/lambda.rb +39 -33
  14. data/lib/hecks/adapters/driven/local_storage.rb +17 -10
  15. data/lib/hecks/adapters/driven/memory.rb +205 -9
  16. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +1 -1
  17. data/lib/hecks/adapters/driven/postgres/codec.rb +27 -11
  18. data/lib/hecks/adapters/driven/postgres/outbox.rb +40 -2
  19. data/lib/hecks/adapters/driven/postgres/reconnect.rb +23 -7
  20. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +14 -14
  21. data/lib/hecks/adapters/driven/postgres.rb +175 -28
  22. data/lib/hecks/adapters/driven/prism.rb +4 -4
  23. data/lib/hecks/adapters/driven/sql_query_builder.rb +34 -22
  24. data/lib/hecks/adapters/driven/sqlite/codec.rb +38 -10
  25. data/lib/hecks/adapters/driven/sqlite/projection.rb +60 -32
  26. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +12 -12
  27. data/lib/hecks/adapters/driven/sqlite.rb +181 -21
  28. data/lib/hecks/adapters/driven.rb +4 -4
  29. data/lib/hecks/adapters/driving/github_webhook.rb +18 -18
  30. data/lib/hecks/behaviors/dsl.rb +2 -2
  31. data/lib/hecks/behaviors/expectations.rb +23 -23
  32. data/lib/hecks/behaviors/ir.rb +1 -1
  33. data/lib/hecks/behaviors/rspec.rb +1 -1
  34. data/lib/hecks/behaviors/runner.rb +2 -2
  35. data/lib/hecks/behaviors.rb +1 -1
  36. data/lib/hecks/bluebook/aggregate.rb +13 -13
  37. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +10 -10
  38. data/lib/hecks/bluebook/assembly/build.rb +1 -1
  39. data/lib/hecks/bluebook/assembly/contract.rb +39 -16
  40. data/lib/hecks/bluebook/assembly/contracts.rb +40 -38
  41. data/lib/hecks/bluebook/assembly/marks.rb +18 -18
  42. data/lib/hecks/bluebook/assembly/specializer.rb +19 -21
  43. data/lib/hecks/bluebook/assembly.rb +9 -9
  44. data/lib/hecks/bluebook/attribute.rb +9 -9
  45. data/lib/hecks/bluebook/behaviour/aggregate.rb +11 -11
  46. data/lib/hecks/bluebook/behaviour/attribute.rb +5 -5
  47. data/lib/hecks/bluebook/behaviour/chapter.rb +23 -5
  48. data/lib/hecks/bluebook/behaviour/command.rb +23 -23
  49. data/lib/hecks/bluebook/behaviour/domain_port.rb +7 -7
  50. data/lib/hecks/bluebook/behaviour/entity.rb +8 -8
  51. data/lib/hecks/bluebook/behaviour/hexagon.rb +4 -4
  52. data/lib/hecks/bluebook/behaviour/lifecycle.rb +5 -5
  53. data/lib/hecks/bluebook/behaviour/policy.rb +12 -12
  54. data/lib/hecks/bluebook/behaviour/process_manager.rb +7 -7
  55. data/lib/hecks/bluebook/behaviour/query.rb +1 -1
  56. data/lib/hecks/bluebook/behaviour/read_model.rb +8 -8
  57. data/lib/hecks/bluebook/behaviour/traits.rb +12 -12
  58. data/lib/hecks/bluebook/behaviour/value_object.rb +6 -6
  59. data/lib/hecks/bluebook/capabilities.rb +27 -0
  60. data/lib/hecks/bluebook/chapter.rb +28 -9
  61. data/lib/hecks/bluebook/command.rb +12 -12
  62. data/lib/hecks/bluebook/domain_port.rb +9 -9
  63. data/lib/hecks/bluebook/dsl/adapter_builder.rb +24 -0
  64. data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +49 -49
  65. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +96 -96
  66. data/lib/hecks/bluebook/dsl/attribute_collector.rb +41 -41
  67. data/lib/hecks/bluebook/dsl/binding_proxy.rb +22 -2
  68. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +111 -74
  69. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +48 -30
  70. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +116 -0
  71. data/lib/hecks/bluebook/dsl/command_builder.rb +103 -103
  72. data/lib/hecks/bluebook/dsl/const_shim.rb +46 -15
  73. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +90 -25
  74. data/lib/hecks/bluebook/dsl/entity_builder.rb +56 -56
  75. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +148 -132
  76. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +89 -30
  77. data/lib/hecks/bluebook/dsl/identity_declaration.rb +17 -17
  78. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +27 -4
  79. data/lib/hecks/bluebook/dsl/policy_builder.rb +30 -21
  80. data/lib/hecks/bluebook/dsl/port_builder.rb +38 -7
  81. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +56 -22
  82. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +35 -35
  83. data/lib/hecks/bluebook/dsl/query_builder.rb +5 -5
  84. data/lib/hecks/bluebook/dsl/read_model_builder.rb +34 -34
  85. data/lib/hecks/bluebook/dsl/rule_reference.rb +41 -39
  86. data/lib/hecks/bluebook/dsl/translation_builder.rb +9 -9
  87. data/lib/hecks/bluebook/dsl/value_object_builder.rb +16 -16
  88. data/lib/hecks/bluebook/dsl/word_gate.rb +59 -53
  89. data/lib/hecks/bluebook/dsl/world_builder.rb +51 -8
  90. data/lib/hecks/bluebook/entity.rb +11 -11
  91. data/lib/hecks/bluebook/expression/ast_json.rb +20 -20
  92. data/lib/hecks/bluebook/expression/ast_reader.rb +3 -3
  93. data/lib/hecks/bluebook/expression/canonical_form.rb +9 -9
  94. data/lib/hecks/bluebook/expression/evaluator.rb +18 -18
  95. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +18 -18
  96. data/lib/hecks/bluebook/expression/resolver.rb +60 -62
  97. data/lib/hecks/bluebook/hexagon.rb +1 -1
  98. data/lib/hecks/bluebook/lifecycle.rb +1 -1
  99. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -1
  100. data/lib/hecks/bluebook/meta_validator/judge.rb +101 -87
  101. data/lib/hecks/bluebook/meta_validator/plan.rb +39 -39
  102. data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -2
  103. data/lib/hecks/bluebook/meta_validator/readings.rb +43 -43
  104. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +44 -37
  105. data/lib/hecks/bluebook/meta_validator/shapes.rb +25 -21
  106. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +145 -31
  107. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +6 -6
  108. data/lib/hecks/bluebook/meta_validator/world_judge.rb +5 -5
  109. data/lib/hecks/bluebook/meta_validator.rb +70 -70
  110. data/lib/hecks/bluebook/model_check.rb +170 -84
  111. data/lib/hecks/bluebook/pattern_subset.rb +9 -9
  112. data/lib/hecks/bluebook/policy.rb +15 -13
  113. data/lib/hecks/bluebook/process_manager.rb +14 -14
  114. data/lib/hecks/bluebook/project_register.rb +6 -6
  115. data/lib/hecks/bluebook/query.rb +4 -4
  116. data/lib/hecks/bluebook/read_model.rb +14 -14
  117. data/lib/hecks/bluebook/reference.rb +8 -8
  118. data/lib/hecks/bluebook/smoke_test.rb +19 -19
  119. data/lib/hecks/bluebook/synthesizer.rb +12 -12
  120. data/lib/hecks/bluebook/translation.rb +4 -4
  121. data/lib/hecks/bluebook/value_object.rb +6 -6
  122. data/lib/hecks/bluebook.rb +2 -2
  123. data/lib/hecks/codemod/legacy_dispatch_args.rb +299 -0
  124. data/lib/hecks/codemod/legacy_dispatch_recorder.rb +186 -0
  125. data/lib/hecks/codemod.rb +36 -35
  126. data/lib/hecks/construct.rb +6 -6
  127. data/lib/hecks/corpus.rb +317 -0
  128. data/lib/hecks/deprecation.rb +95 -0
  129. data/lib/hecks/doc/reference.rb +19 -19
  130. data/lib/hecks/embryonaut_bluebook.rb +11 -11
  131. data/lib/hecks/facade/cli_door.rb +69 -10
  132. data/lib/hecks/facade/cli_runner.rb +105 -24
  133. data/lib/hecks/facade/command_request.rb +23 -0
  134. data/lib/hecks/facade/handle.rb +79 -32
  135. data/lib/hecks/facade/json_door.rb +106 -25
  136. data/lib/hecks/facade/surface/aggregate_door.rb +42 -27
  137. data/lib/hecks/facade/surface/chapter.rb +26 -17
  138. data/lib/hecks/facade/surface.rb +16 -3
  139. data/lib/hecks/facade.rb +15 -4
  140. data/lib/hecks/forms/app.rb +46 -30
  141. data/lib/hecks/forms/command_form_renderer.rb +70 -9
  142. data/lib/hecks/forms/field_renderer.rb +142 -6
  143. data/lib/hecks/forms/field_shape.rb +180 -19
  144. data/lib/hecks/forms/html.rb +51 -7
  145. data/lib/hecks/forms/index_renderer.rb +14 -2
  146. data/lib/hecks/forms/params.rb +120 -23
  147. data/lib/hecks/forms/port_argument.rb +2 -2
  148. data/lib/hecks/forms/query_form_renderer.rb +2 -2
  149. data/lib/hecks/forms/record_renderer.rb +2 -2
  150. data/lib/hecks/forms/record_table.rb +1 -1
  151. data/lib/hecks/forms/value_object_shape.rb +3 -3
  152. data/lib/hecks/forms.rb +24 -4
  153. data/lib/hecks/fqn.rb +1 -1
  154. data/lib/hecks/framework/bluebook/governance.bluebook +9 -0
  155. data/lib/hecks/framework.rb +48 -17
  156. data/lib/hecks/freezer.rb +11 -11
  157. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +90 -90
  158. data/lib/hecks/fuzzing/combination_miner.rb +119 -0
  159. data/lib/hecks/fuzzing/concurrent_dispatch.rb +140 -45
  160. data/lib/hecks/fuzzing/coverage_campaign.rb +118 -0
  161. data/lib/hecks/fuzzing/differential.rb +158 -0
  162. data/lib/hecks/fuzzing/domain_generator.rb +694 -0
  163. data/lib/hecks/fuzzing/era_boundary.rb +37 -18
  164. data/lib/hecks/fuzzing/form_census.rb +35 -20
  165. data/lib/hecks/fuzzing/generated_domain_check.rb +95 -0
  166. data/lib/hecks/fuzzing/invalid_value_generator.rb +6 -6
  167. data/lib/hecks/fuzzing/isolated_boot.rb +62 -62
  168. data/lib/hecks/fuzzing/nondeterministic.rb +67 -0
  169. data/lib/hecks/fuzzing/persistence_parity.rb +19 -21
  170. data/lib/hecks/fuzzing/properties/corrections.rb +9 -9
  171. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +154 -49
  172. data/lib/hecks/fuzzing/properties/guards.rb +42 -42
  173. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +32 -32
  174. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +22 -35
  175. data/lib/hecks/fuzzing/properties/outbox.rb +24 -24
  176. data/lib/hecks/fuzzing/properties/querying.rb +17 -17
  177. data/lib/hecks/fuzzing/properties.rb +64 -40
  178. data/lib/hecks/fuzzing/qa_settings.rb +152 -0
  179. data/lib/hecks/fuzzing/replay.rb +114 -114
  180. data/lib/hecks/fuzzing/rotation_priority.rb +10 -10
  181. data/lib/hecks/fuzzing/rust_gap_manifest.rb +113 -0
  182. data/lib/hecks/fuzzing/self_consistency.rb +141 -112
  183. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +35 -35
  184. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +18 -11
  185. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +13 -12
  186. data/lib/hecks/fuzzing/sequence_generator/picker.rb +21 -12
  187. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +58 -31
  188. data/lib/hecks/fuzzing/sequence_generator.rb +111 -23
  189. data/lib/hecks/fuzzing/shrinker.rb +197 -0
  190. data/lib/hecks/fuzzing/structural_skips.rb +23 -130
  191. data/lib/hecks/fuzzing/sweep_depth.rb +4 -4
  192. data/lib/hecks/fuzzing/target_capabilities.rb +49 -18
  193. data/lib/hecks/fuzzing/value_generator.rb +14 -14
  194. data/lib/hecks/fuzzing.rb +5 -0
  195. data/lib/hecks/grammar/evolve.rb +10 -10
  196. data/lib/hecks/grammar.rb +7 -7
  197. data/lib/hecks/ir.rb +13 -13
  198. data/lib/hecks/language/bluebook/bluebook.bluebook +41 -0
  199. data/lib/hecks/language/bluebook/policy.bluebook +11 -1
  200. data/lib/hecks/language/bluebook/vocabulary.bluebook +348 -13
  201. data/lib/hecks/language/oidc.json +5 -0
  202. data/lib/hecks/literal.rb +9 -9
  203. data/lib/hecks/naming.rb +25 -25
  204. data/lib/hecks/ports/access_control.rb +58 -2
  205. data/lib/hecks/ports/agent/answers.rb +83 -6
  206. data/lib/hecks/ports/agent.rb +119 -35
  207. data/lib/hecks/ports/authentication.rb +44 -4
  208. data/lib/hecks/ports/authorization.rb +53 -11
  209. data/lib/hecks/ports/clock.rb +42 -23
  210. data/lib/hecks/ports/extraction.rb +16 -0
  211. data/lib/hecks/ports/identity_assignment.rb +24 -2
  212. data/lib/hecks/ports/identity_generation.rb +17 -3
  213. data/lib/hecks/ports/identity_resolution.rb +18 -1
  214. data/lib/hecks/ports/loading.rb +4 -0
  215. data/lib/hecks/ports/persistence/append_only.rb +172 -8
  216. data/lib/hecks/ports/persistence/binding_policy.rb +34 -0
  217. data/lib/hecks/ports/persistence/codec_boundary.rb +178 -0
  218. data/lib/hecks/ports/persistence/execution.rb +4 -0
  219. data/lib/hecks/ports/persistence/null_saga_store.rb +12 -1
  220. data/lib/hecks/ports/persistence/plugin.rb +42 -4
  221. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +218 -25
  222. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +77 -9
  223. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +81 -24
  224. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +29 -18
  225. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +144 -60
  226. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +103 -8
  227. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +98 -23
  228. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +282 -109
  229. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +63 -25
  230. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +118 -66
  231. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +51 -28
  232. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +28 -5
  233. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +25 -12
  234. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +129 -34
  235. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +51 -6
  236. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +33 -9
  237. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +16 -0
  238. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +57 -4
  239. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +25 -2
  240. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +314 -90
  241. data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +68 -10
  242. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +9 -3
  243. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +9 -2
  244. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +42 -8
  245. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +16 -1
  246. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +36 -5
  247. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +23 -3
  248. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -19
  249. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +5 -5
  250. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +1 -1
  251. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -2
  252. data/lib/hecks/ports/persistence/plugins/era.rb +12 -2
  253. data/lib/hecks/ports/persistence/remote_runtime.rb +9 -2
  254. data/lib/hecks/ports/persistence/repository_factory.rb +23 -3
  255. data/lib/hecks/ports/persistence/state_codec.rb +319 -0
  256. data/lib/hecks/ports/persistence.rb +36 -1
  257. data/lib/hecks/ports/projection.rb +61 -7
  258. data/lib/hecks/ports/query/in_memory.rb +3 -3
  259. data/lib/hecks/ports/query/ordering.rb +6 -6
  260. data/lib/hecks/ports/query.rb +35 -0
  261. data/lib/hecks/projections/bootstrap_table.rb +112 -0
  262. data/lib/hecks/projections/diagrams.rb +75 -75
  263. data/lib/hecks/projections/glossary/html.rb +3 -3
  264. data/lib/hecks/projections/glossary/markdown.rb +3 -3
  265. data/lib/hecks/projections/glossary/mermaid.rb +1 -1
  266. data/lib/hecks/projections/glossary/sections.rb +1 -1
  267. data/lib/hecks/projections/glossary/sentences.rb +5 -5
  268. data/lib/hecks/projections/glossary.rb +15 -15
  269. data/lib/hecks/projections/ir.rb +1 -1
  270. data/lib/hecks/projections/model/deviations.rb +18 -17
  271. data/lib/hecks/projections/model.rb +25 -21
  272. data/lib/hecks/projections/oidc.rb +7 -7
  273. data/lib/hecks/projections/parser_table.rb +5 -5
  274. data/lib/hecks/projections/reference.rb +3 -3
  275. data/lib/hecks/projections/rust_vocabulary.rb +443 -0
  276. data/lib/hecks/projections/shape.rb +2 -2
  277. data/lib/hecks/projections/statements.rb +11 -11
  278. data/lib/hecks/projections/vocabulary.rb +9 -9
  279. data/lib/hecks/projections.rb +5 -3
  280. data/lib/hecks/projector/cli_projector.rb +29 -29
  281. data/lib/hecks/projector/docs_projector.rb +13 -13
  282. data/lib/hecks/projector/exporter.rb +42 -21
  283. data/lib/hecks/projector/ir_projector.rb +1 -1
  284. data/lib/hecks/projector/narrate_projector.rb +11 -11
  285. data/lib/hecks/projector/target.rb +13 -13
  286. data/lib/hecks/projector.rb +15 -15
  287. data/lib/hecks/query_ir.rb +47 -47
  288. data/lib/hecks/query_specification/common/comparators.rb +19 -3
  289. data/lib/hecks/query_specification/common/comparison.rb +109 -27
  290. data/lib/hecks/query_specification/common/dsl.rb +65 -9
  291. data/lib/hecks/query_specification/common/null_policy.rb +57 -13
  292. data/lib/hecks/query_specification/common/null_semantics.rb +4 -0
  293. data/lib/hecks/query_specification/common/options.rb +25 -0
  294. data/lib/hecks/query_specification/field_path.rb +69 -15
  295. data/lib/hecks/query_specification/hop_path.rb +57 -20
  296. data/lib/hecks/query_specification/read_model/specification.rb +4 -0
  297. data/lib/hecks/rendering.rb +3 -3
  298. data/lib/hecks/router/namespace_installer.rb +3 -3
  299. data/lib/hecks/router.rb +1 -1
  300. data/lib/hecks/runtime/aggregate_lock.rb +11 -11
  301. data/lib/hecks/runtime/boot_gates.rb +3 -3
  302. data/lib/hecks/runtime/caller.rb +8 -8
  303. data/lib/hecks/runtime/capability_graph.rb +2 -2
  304. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +22 -25
  305. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +42 -63
  306. data/lib/hecks/runtime/command_interpreter.rb +159 -102
  307. data/lib/hecks/runtime/command_rules/admissibility.rb +69 -69
  308. data/lib/hecks/runtime/command_rules/arithmetic.rb +137 -91
  309. data/lib/hecks/runtime/command_rules/authorization.rb +38 -17
  310. data/lib/hecks/runtime/command_rules/emission.rb +18 -1
  311. data/lib/hecks/runtime/command_rules/references.rb +35 -35
  312. data/lib/hecks/runtime/command_rules.rb +3 -0
  313. data/lib/hecks/runtime/dependency_planning.rb +11 -11
  314. data/lib/hecks/runtime/dispatcher.rb +283 -90
  315. data/lib/hecks/runtime/entity_element.rb +151 -67
  316. data/lib/hecks/runtime/entity_interpreter.rb +108 -82
  317. data/lib/hecks/runtime/errors.rb +19 -19
  318. data/lib/hecks/runtime/event.rb +6 -6
  319. data/lib/hecks/runtime/identity.rb +22 -22
  320. data/lib/hecks/runtime/instance.rb +39 -14
  321. data/lib/hecks/runtime/interpreting.rb +12 -12
  322. data/lib/hecks/runtime/invocation.rb +276 -0
  323. data/lib/hecks/runtime/loader.rb +14 -14
  324. data/lib/hecks/runtime/outbox.rb +23 -23
  325. data/lib/hecks/runtime/policy_interpreter.rb +54 -54
  326. data/lib/hecks/runtime/port_operation_interpreter.rb +22 -19
  327. data/lib/hecks/runtime/query_interpreter.rb +55 -64
  328. data/lib/hecks/runtime/reaction_invocation.rb +20 -20
  329. data/lib/hecks/runtime/read_model_interpreter.rb +40 -40
  330. data/lib/hecks/runtime/rebuild_sweep.rb +4 -4
  331. data/lib/hecks/runtime/reference_hop.rb +6 -6
  332. data/lib/hecks/runtime/refusal_wording.rb +92 -115
  333. data/lib/hecks/runtime/registry/saga_persistence.rb +21 -21
  334. data/lib/hecks/runtime/registry/verification.rb +36 -26
  335. data/lib/hecks/runtime/registry.rb +45 -28
  336. data/lib/hecks/runtime/remote_dispatcher.rb +38 -23
  337. data/lib/hecks/runtime/routing.rb +10 -153
  338. data/lib/hecks/runtime/saga_interpreter/correlation.rb +17 -17
  339. data/lib/hecks/runtime/saga_interpreter.rb +64 -64
  340. data/lib/hecks/runtime/saga_pending_dispatch.rb +12 -12
  341. data/lib/hecks/runtime/tenant_check.rb +9 -9
  342. data/lib/hecks/runtime/tenant_scope.rb +5 -5
  343. data/lib/hecks/runtime/value/admission.rb +75 -30
  344. data/lib/hecks/runtime/value/coercion.rb +318 -127
  345. data/lib/hecks/runtime/value/entity_list_coercion.rb +34 -34
  346. data/lib/hecks/runtime/value.rb +21 -21
  347. data/lib/hecks/runtime.rb +7 -7
  348. data/lib/hecks/storehouse.rb +64 -64
  349. data/lib/hecks/version.rb +3 -3
  350. data/lib/hecks/vocabulary.rb +205 -4
  351. data/lib/hecks.rb +13 -11
  352. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +11 -11
  353. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +14 -12
  354. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +11 -11
  355. metadata +22 -2
@@ -1,7 +1,7 @@
1
- # GENERATED — projected from the language's own Vocabulary aggregate
1
+ # Generated — projected from the language's own Vocabulary aggregate
2
2
  # (lib/hecks/language/bluebook/vocabulary.bluebook).
3
3
  #
4
- # DO NOT EDIT. spec/vocabulary_table_spec.rb re-projects this in memory
4
+ # Do not edit. spec/vocabulary_table_spec.rb re-projects this in memory
5
5
  # and refuses a diff, so an edit here fails the ordinary suite.
6
6
  #
7
7
  # Plain data on purpose — no requires, no dependency on the model —
@@ -13,6 +13,7 @@ module Hecks
13
13
  module Vocabulary
14
14
  TABLES = {
15
15
  "AggregateDispatchOrder" => [
16
+ {"step"=>"decode_arguments"}.freeze,
16
17
  {"step"=>"refuse_unknown_arguments"}.freeze,
17
18
  {"step"=>"refuse_absent_arguments"}.freeze,
18
19
  {"step"=>"normalize_args"}.freeze,
@@ -30,6 +31,24 @@ module Hecks
30
31
  {"step"=>"save"}.freeze,
31
32
  {"step"=>"emit"}.freeze
32
33
  ].freeze,
34
+ "CargoReservedName" => [
35
+ {"name"=>"name"}.freeze,
36
+ {"name"=>"version"}.freeze,
37
+ {"name"=>"edition"}.freeze,
38
+ {"name"=>"path"}.freeze,
39
+ {"name"=>"authors"}.freeze,
40
+ {"name"=>"license"}.freeze,
41
+ {"name"=>"description"}.freeze,
42
+ {"name"=>"default"}.freeze,
43
+ {"name"=>"features"}.freeze,
44
+ {"name"=>"package"}.freeze,
45
+ {"name"=>"lib"}.freeze,
46
+ {"name"=>"bin"}.freeze,
47
+ {"name"=>"dependencies"}.freeze,
48
+ {"name"=>"dev-dependencies"}.freeze,
49
+ {"name"=>"build-dependencies"}.freeze,
50
+ {"name"=>"workspace"}.freeze
51
+ ].freeze,
33
52
  "Comparison" => [
34
53
  {"symbol"=>">=", "compares_less_than"=>"true", "compares_equal"=>"false", "negated"=>"true"}.freeze,
35
54
  {"symbol"=>"<=", "compares_less_than"=>"true", "compares_equal"=>"true", "negated"=>"false"}.freeze,
@@ -56,6 +75,7 @@ module Hecks
56
75
  {"name"=>"UnknownVerb"}.freeze
57
76
  ].freeze,
58
77
  "EntityDispatchOrder" => [
78
+ {"step"=>"decode_arguments"}.freeze,
59
79
  {"step"=>"refuse_unknown_arguments"}.freeze,
60
80
  {"step"=>"refuse_absent_arguments"}.freeze,
61
81
  {"step"=>"normalize_args"}.freeze,
@@ -123,6 +143,136 @@ module Hecks
123
143
  {"name"=>"contains"}.freeze,
124
144
  {"name"=>"none_in_state"}.freeze
125
145
  ].freeze,
146
+ "RefusalSiteArgument" => [
147
+ {"refusal"=>"NotFound", "site"=>"creating_no_identity", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
148
+ {"refusal"=>"NotFound", "site"=>"creating_no_identity", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
149
+ {"refusal"=>"NotFound", "site"=>"creating_no_identity", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
150
+ {"refusal"=>"AlreadyExists", "site"=>"creating_duplicate", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
151
+ {"refusal"=>"AlreadyExists", "site"=>"creating_duplicate", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
152
+ {"refusal"=>"AlreadyExists", "site"=>"creating_duplicate", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
153
+ {"refusal"=>"AlreadyExists", "site"=>"creating_duplicate", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
154
+ {"refusal"=>"AlreadyExists", "site"=>"entity_duplicate", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
155
+ {"refusal"=>"AlreadyExists", "site"=>"entity_duplicate", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
156
+ {"refusal"=>"AlreadyExists", "site"=>"entity_duplicate", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
157
+ {"refusal"=>"AlreadyExists", "site"=>"entity_duplicate", "argument"=>"offered", "shape"=>"list", "quoting"=>"none", "separator"=>", ", "sorted"=>"false", "when_empty"=>""}.freeze,
158
+ {"refusal"=>"NotFound", "site"=>"acting_no_identity", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
159
+ {"refusal"=>"NotFound", "site"=>"acting_no_identity", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
160
+ {"refusal"=>"NotFound", "site"=>"acting_no_identity", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
161
+ {"refusal"=>"NotFound", "site"=>"record_missing", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
162
+ {"refusal"=>"NotFound", "site"=>"record_missing", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
163
+ {"refusal"=>"NotFound", "site"=>"record_missing", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
164
+ {"refusal"=>"NotFound", "site"=>"entity_parent_no_identity", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
165
+ {"refusal"=>"NotFound", "site"=>"entity_parent_no_identity", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
166
+ {"refusal"=>"NotFound", "site"=>"entity_parent_no_identity", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
167
+ {"refusal"=>"NotFound", "site"=>"entity_parent_no_identity", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
168
+ {"refusal"=>"UnknownVerb", "site"=>"entity_unknown", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
169
+ {"refusal"=>"UnknownVerb", "site"=>"entity_unknown", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
170
+ {"refusal"=>"NotFound", "site"=>"entity_element_no_identity", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
171
+ {"refusal"=>"NotFound", "site"=>"entity_element_no_identity", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
172
+ {"refusal"=>"NotFound", "site"=>"entity_element_no_identity", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
173
+ {"refusal"=>"NotFound", "site"=>"entity_element_missing", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
174
+ {"refusal"=>"NotFound", "site"=>"entity_element_missing", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
175
+ {"refusal"=>"NotFound", "site"=>"entity_element_missing", "argument"=>"wants", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
176
+ {"refusal"=>"NotFound", "site"=>"entity_element_missing", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
177
+ {"refusal"=>"NotFound", "site"=>"entity_element_missing", "argument"=>"parent_id", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
178
+ {"refusal"=>"NotFound", "site"=>"reference_target_missing", "argument"=>"target", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
179
+ {"refusal"=>"NotFound", "site"=>"reference_target_missing", "argument"=>"heads", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
180
+ {"refusal"=>"NotFound", "site"=>"reference_target_missing", "argument"=>"key", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
181
+ {"refusal"=>"NotFound", "site"=>"read_model_reference_missing", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
182
+ {"refusal"=>"NotFound", "site"=>"read_model_reference_missing", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
183
+ {"refusal"=>"TypeMismatch", "site"=>"read_model_object_reference", "argument"=>"query", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
184
+ {"refusal"=>"TypeMismatch", "site"=>"read_model_object_reference", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
185
+ {"refusal"=>"UnknownVerb", "site"=>"no_query", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
186
+ {"refusal"=>"UnknownVerb", "site"=>"no_query", "argument"=>"query", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
187
+ {"refusal"=>"UnknownVerb", "site"=>"entity_query_missing", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
188
+ {"refusal"=>"UnknownVerb", "site"=>"entity_query_missing", "argument"=>"query", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
189
+ {"refusal"=>"UnknownVerb", "site"=>"entity_holds_no_list", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
190
+ {"refusal"=>"UnknownVerb", "site"=>"entity_holds_no_list", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
191
+ {"refusal"=>"UnknownVerb", "site"=>"entity_no_command", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
192
+ {"refusal"=>"UnknownVerb", "site"=>"entity_no_command", "argument"=>"command", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
193
+ {"refusal"=>"UnknownVerb", "site"=>"aggregate_no_command", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
194
+ {"refusal"=>"UnknownVerb", "site"=>"aggregate_no_command", "argument"=>"command", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
195
+ {"refusal"=>"UnknownVerb", "site"=>"port_no_operation", "argument"=>"port", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
196
+ {"refusal"=>"UnknownVerb", "site"=>"port_no_operation", "argument"=>"operation", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
197
+ {"refusal"=>"UnknownVerb", "site"=>"no_domain", "argument"=>"domain", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
198
+ {"refusal"=>"UnknownVerb", "site"=>"no_domain", "argument"=>"verb", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
199
+ {"refusal"=>"UnknownVerb", "site"=>"no_read_model", "argument"=>"domain", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
200
+ {"refusal"=>"UnknownVerb", "site"=>"no_read_model", "argument"=>"query", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
201
+ {"refusal"=>"UnknownVerb", "site"=>"not_fully_qualified", "argument"=>"verb", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
202
+ {"refusal"=>"UnknownVerb", "site"=>"no_aggregate", "argument"=>"domain", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
203
+ {"refusal"=>"UnknownVerb", "site"=>"no_aggregate", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
204
+ {"refusal"=>"LifecycleRefused", "site"=>"transition_blocked", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
205
+ {"refusal"=>"LifecycleRefused", "site"=>"transition_blocked", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
206
+ {"refusal"=>"LifecycleRefused", "site"=>"transition_blocked", "argument"=>"current", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
207
+ {"refusal"=>"LifecycleRefused", "site"=>"transition_blocked", "argument"=>"allowed", "shape"=>"list", "quoting"=>"inspect", "separator"=>" or ", "sorted"=>"false", "when_empty"=>""}.freeze,
208
+ {"refusal"=>"TypeMismatch", "site"=>"value_object_shape", "argument"=>"name", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
209
+ {"refusal"=>"TypeMismatch", "site"=>"value_object_shape", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
210
+ {"refusal"=>"TypeMismatch", "site"=>"value_object_shape", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
211
+ {"refusal"=>"TypeMismatch", "site"=>"reference_wrong_shape", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
212
+ {"refusal"=>"TypeMismatch", "site"=>"reference_wrong_shape", "argument"=>"attribute", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
213
+ {"refusal"=>"TypeMismatch", "site"=>"reference_wrong_shape", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
214
+ {"refusal"=>"TypeMismatch", "site"=>"reference_wrong_shape", "argument"=>"known_by", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
215
+ {"refusal"=>"TypeMismatch", "site"=>"multi_field_scalar", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
216
+ {"refusal"=>"TypeMismatch", "site"=>"composite_identity", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
217
+ {"refusal"=>"TypeMismatch", "site"=>"numeric_field", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
218
+ {"refusal"=>"TypeMismatch", "site"=>"numeric_field", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
219
+ {"refusal"=>"TypeMismatch", "site"=>"numeric_field", "argument"=>"expected", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
220
+ {"refusal"=>"TypeMismatch", "site"=>"numeric_field", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
221
+ {"refusal"=>"TypeMismatch", "site"=>"non_finite_field", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
222
+ {"refusal"=>"TypeMismatch", "site"=>"non_finite_field", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
223
+ {"refusal"=>"TypeMismatch", "site"=>"non_finite_field", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
224
+ {"refusal"=>"TypeMismatch", "site"=>"integer_range", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
225
+ {"refusal"=>"TypeMismatch", "site"=>"integer_range", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
226
+ {"refusal"=>"TypeMismatch", "site"=>"integer_range", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
227
+ {"refusal"=>"TypeMismatch", "site"=>"pattern_mismatch", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
228
+ {"refusal"=>"TypeMismatch", "site"=>"pattern_mismatch", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
229
+ {"refusal"=>"TypeMismatch", "site"=>"pattern_mismatch", "argument"=>"pattern", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
230
+ {"refusal"=>"TypeMismatch", "site"=>"pattern_mismatch", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
231
+ {"refusal"=>"TypeMismatch", "site"=>"arithmetic_amount", "argument"=>"op", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
232
+ {"refusal"=>"TypeMismatch", "site"=>"arithmetic_amount", "argument"=>"target", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
233
+ {"refusal"=>"TypeMismatch", "site"=>"arithmetic_amount", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
234
+ {"refusal"=>"TypeMismatch", "site"=>"arithmetic_current", "argument"=>"op", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
235
+ {"refusal"=>"TypeMismatch", "site"=>"arithmetic_current", "argument"=>"target", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
236
+ {"refusal"=>"TypeMismatch", "site"=>"arithmetic_current", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
237
+ {"refusal"=>"TypeMismatch", "site"=>"arithmetic_shared_field", "argument"=>"op", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
238
+ {"refusal"=>"TypeMismatch", "site"=>"arithmetic_shared_field", "argument"=>"target", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
239
+ {"refusal"=>"UnknownArgument", "site"=>"unknown_args", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
240
+ {"refusal"=>"UnknownArgument", "site"=>"unknown_args", "argument"=>"unknown", "shape"=>"list", "quoting"=>"none", "separator"=>", ", "sorted"=>"true", "when_empty"=>""}.freeze,
241
+ {"refusal"=>"UnknownArgument", "site"=>"unknown_args", "argument"=>"declared", "shape"=>"list", "quoting"=>"none", "separator"=>", ", "sorted"=>"false", "when_empty"=>"none"}.freeze,
242
+ {"refusal"=>"AbsentArgument", "site"=>"absent_args", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
243
+ {"refusal"=>"AbsentArgument", "site"=>"absent_args", "argument"=>"absent", "shape"=>"list", "quoting"=>"none", "separator"=>", ", "sorted"=>"true", "when_empty"=>""}.freeze,
244
+ {"refusal"=>"AbsentArgument", "site"=>"absent_args", "argument"=>"declared", "shape"=>"list", "quoting"=>"none", "separator"=>", ", "sorted"=>"false", "when_empty"=>"none"}.freeze,
245
+ {"refusal"=>"InvariantViolation", "site"=>"closed_set_member", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
246
+ {"refusal"=>"InvariantViolation", "site"=>"closed_set_member", "argument"=>"admitted", "shape"=>"list", "quoting"=>"inspect", "separator"=>", ", "sorted"=>"false", "when_empty"=>""}.freeze,
247
+ {"refusal"=>"InvariantViolation", "site"=>"closed_set_member", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
248
+ {"refusal"=>"InvariantViolation", "site"=>"value_object_invariant", "argument"=>"name", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
249
+ {"refusal"=>"InvariantViolation", "site"=>"value_object_invariant", "argument"=>"description", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
250
+ {"refusal"=>"InvariantViolation", "site"=>"value_object_invariant", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
251
+ {"refusal"=>"InvariantViolation", "site"=>"admits_declared_set", "argument"=>"name", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
252
+ {"refusal"=>"InvariantViolation", "site"=>"admits_declared_set", "argument"=>"admits", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
253
+ {"refusal"=>"InvariantViolation", "site"=>"admits_declared_set", "argument"=>"admitted", "shape"=>"list", "quoting"=>"inspect", "separator"=>", ", "sorted"=>"false", "when_empty"=>""}.freeze,
254
+ {"refusal"=>"InvariantViolation", "site"=>"admits_declared_set", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
255
+ {"refusal"=>"InvariantViolation", "site"=>"undeclared_set", "argument"=>"name", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
256
+ {"refusal"=>"InvariantViolation", "site"=>"undeclared_set", "argument"=>"admits", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
257
+ {"refusal"=>"Unauthorized", "site"=>"tenant_required", "argument"=>"query", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
258
+ {"refusal"=>"Unauthorized", "site"=>"tenant_required", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
259
+ {"refusal"=>"Unauthorized", "site"=>"role_mismatch", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
260
+ {"refusal"=>"Unauthorized", "site"=>"role_mismatch", "argument"=>"role", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
261
+ {"refusal"=>"Unauthorized", "site"=>"role_mismatch", "argument"=>"caller_role", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
262
+ {"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
263
+ {"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
264
+ {"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"tenant", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
265
+ {"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"attribute", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
266
+ {"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"target", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
267
+ {"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"target_field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
268
+ {"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"other", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
269
+ {"refusal"=>"AttributeAbsent", "site"=>"absent_read", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
270
+ {"refusal"=>"AttributeAbsent", "site"=>"absent_read", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
271
+ {"refusal"=>"ProjectionAbsent", "site"=>"absent_read", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
272
+ {"refusal"=>"ProjectionAbsent", "site"=>"absent_read", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
273
+ {"refusal"=>"ProjectionAbsent", "site"=>"absent_read", "argument"=>"reference", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
274
+ {"refusal"=>"ProjectionAbsent", "site"=>"absent_read", "argument"=>"remote_field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze
275
+ ].freeze,
126
276
  "RefusalTemplate" => [
127
277
  {"refusal"=>"NotFound", "site"=>"creating_no_identity", "template"=>"{command} creates a {aggregate} — pass {identity}:"}.freeze,
128
278
  {"refusal"=>"AlreadyExists", "site"=>"creating_duplicate", "template"=>"{command} creates a {aggregate} that already exists — {identity} {offered}"}.freeze,
@@ -170,6 +320,57 @@ module Hecks
170
320
  {"refusal"=>"AttributeAbsent", "site"=>"absent_read", "template"=>"{aggregate} {field} is absent on this record — declared, not optional, and added since it was written. Backfill it in a translation (backfill :{field}, default: ...), or declare it optional: true"}.freeze,
171
321
  {"refusal"=>"ProjectionAbsent", "site"=>"absent_read", "template"=>"{aggregate} {field} is not yet projected on this record — declared via projects :{field}, but no rebuild sweep has populated it. Run the sweep, or read {reference}.{remote_field} directly if this rule cannot wait"}.freeze
172
322
  ].freeze,
323
+ "RustReservedWord" => [
324
+ {"word"=>"as"}.freeze,
325
+ {"word"=>"break"}.freeze,
326
+ {"word"=>"const"}.freeze,
327
+ {"word"=>"continue"}.freeze,
328
+ {"word"=>"crate"}.freeze,
329
+ {"word"=>"dyn"}.freeze,
330
+ {"word"=>"else"}.freeze,
331
+ {"word"=>"enum"}.freeze,
332
+ {"word"=>"extern"}.freeze,
333
+ {"word"=>"false"}.freeze,
334
+ {"word"=>"fn"}.freeze,
335
+ {"word"=>"for"}.freeze,
336
+ {"word"=>"if"}.freeze,
337
+ {"word"=>"impl"}.freeze,
338
+ {"word"=>"in"}.freeze,
339
+ {"word"=>"let"}.freeze,
340
+ {"word"=>"loop"}.freeze,
341
+ {"word"=>"match"}.freeze,
342
+ {"word"=>"mod"}.freeze,
343
+ {"word"=>"move"}.freeze,
344
+ {"word"=>"mut"}.freeze,
345
+ {"word"=>"pub"}.freeze,
346
+ {"word"=>"ref"}.freeze,
347
+ {"word"=>"return"}.freeze,
348
+ {"word"=>"self"}.freeze,
349
+ {"word"=>"Self"}.freeze,
350
+ {"word"=>"static"}.freeze,
351
+ {"word"=>"struct"}.freeze,
352
+ {"word"=>"super"}.freeze,
353
+ {"word"=>"trait"}.freeze,
354
+ {"word"=>"true"}.freeze,
355
+ {"word"=>"type"}.freeze,
356
+ {"word"=>"unsafe"}.freeze,
357
+ {"word"=>"use"}.freeze,
358
+ {"word"=>"where"}.freeze,
359
+ {"word"=>"while"}.freeze,
360
+ {"word"=>"abstract"}.freeze,
361
+ {"word"=>"become"}.freeze,
362
+ {"word"=>"box"}.freeze,
363
+ {"word"=>"do"}.freeze,
364
+ {"word"=>"final"}.freeze,
365
+ {"word"=>"macro"}.freeze,
366
+ {"word"=>"override"}.freeze,
367
+ {"word"=>"priv"}.freeze,
368
+ {"word"=>"typeof"}.freeze,
369
+ {"word"=>"unsized"}.freeze,
370
+ {"word"=>"virtual"}.freeze,
371
+ {"word"=>"yield"}.freeze,
372
+ {"word"=>"try"}.freeze
373
+ ].freeze,
173
374
  "SignTest" => [
174
375
  {"name"=>"positive?", "compares_via"=>">"}.freeze,
175
376
  {"name"=>"negative?", "compares_via"=>"<"}.freeze,
@@ -196,8 +397,8 @@ module Hecks
196
397
  ].freeze
197
398
  }.freeze
198
399
 
199
- # THE TERMS — the first field of each row, which for a
200
- # one-field vocabulary is the whole of it. Derived ONCE and
400
+ # The terms — the first field of each row, which for a
401
+ # one-field vocabulary is the whole of it. Derived once and
201
402
  # frozen rather than mapped per call: these are constant
202
403
  # tables, and a constant that allocates a new array every
203
404
  # time it is read is not one.
data/lib/hecks.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require_relative "hecks/version"
2
+ require_relative "hecks/deprecation"
2
3
  # The closed sets the runtime computes with, generated from
3
4
  # vocabulary.bluebook. Plain data, required first, because some of
4
5
  # them are read while a bluebook is still being parsed.
@@ -22,16 +23,17 @@ require_relative "hecks/router"
22
23
  require_relative "hecks/runtime"
23
24
  require_relative "hecks/adapters"
24
25
  require_relative "hecks/projector"
25
- # AFTER the projector registry and its `Target` mixin are both real —
26
- # every target registers itself as it loads, so this require IS the
26
+ # After the projector registry and its `Target` mixin are both real —
27
+ # every target registers itself as it loads, so this require is the
27
28
  # installation of them.
28
29
  require_relative "hecks/projections"
29
- # AFTER `Projector` (dispatches against the `:cli` projection) and
30
+ # After `Projector` (dispatches against the `:cli` projection) and
30
31
  # `Ports::Clock` (fills a staleness rule's `now` at the door) both exist.
31
32
  require_relative "hecks/facade/cli_door"
32
33
  require_relative "hecks/facade/cli_runner"
33
34
  require_relative "hecks/storehouse"
34
35
  require_relative "hecks/framework"
36
+ require_relative "hecks/corpus"
35
37
  require_relative "hecks/embryonaut_bluebook"
36
38
 
37
39
  # The root namespace and public facade of the whole DSL/runtime: `Hecks.boot`/
@@ -44,14 +46,14 @@ module Hecks
44
46
  class LoadOutsideBoot < StandardError; end
45
47
 
46
48
  class << self
47
- # The loading words below collect into the registry the RUNTIME is
49
+ # The loading words below collect into the registry the runtime is
48
50
  # holding open ; booting and that ambient state belong to the runtime
49
51
  # layer, so this module is their facade and Hecks::Runtime is where
50
52
  # they live.
51
53
  # `install_facade:` — see Runtime::Loader.boot. Defaults on; a caller
52
54
  # that only dispatches by FQN string can skip the global sugar.
53
55
  #
54
- # `environment:` — RECOVERED, not new: this parameter (and the
56
+ # `environment:` — recovered, not new: this parameter (and the
55
57
  # `environments/<name>.hecksagon` / `.world` overlay it loads —
56
58
  # see Adapters::Folder#load_domain) existed on a prior commit of
57
59
  # this repo (933d1dd), was vendored out to a real consumer
@@ -86,14 +88,14 @@ module Hecks
86
88
  # default), a command's role stays exactly what it is without this:
87
89
  # decoration.
88
90
  #
89
- # `actor_id` is OPTIONAL — a caller naming only a role is checked by
91
+ # `actor_id` is optional — a caller naming only a role is checked by
90
92
  # string equality against the command's own `role`, exactly as
91
- # before. A caller that also names WHO it is lets the check run
93
+ # before. A caller that also names who it is lets the check run
92
94
  # against a real Governance `RoleAssignment` instead, once the
93
95
  # command's domain has Governance attached — see
94
96
  # `CommandRules::Authorization`'s own header.
95
97
  #
96
- # `as_of` and `scope` are OPTIONAL too, same shape — see
98
+ # `as_of` and `scope` are optional too, same shape — see
97
99
  # `Runtime.as_caller`'s own header for what each does.
98
100
  def as_caller(role:, actor_id: nil, as_of: nil, scope: nil, &)
99
101
  Runtime.as_caller(role: role, actor_id: actor_id, as_of: as_of, scope: scope, &)
@@ -104,7 +106,7 @@ module Hecks
104
106
  end
105
107
 
106
108
  def hecksagon(name, &) = collect(:add_hecksagon, Bluebook::DSL::HecksagonBuilder.build(name, &))
107
- # REPOINTED TO DomainPortBuilder — the migration DomainPort's own
109
+ # Repointed to DomainPortBuilder — the migration DomainPort's own
108
110
  # class comment names as its goal, now landed for the top-level
109
111
  # `.port` file callers too (the aggregate-scoped `Thing.port(...)`,
110
112
  # binding_proxy.rb, already went through this builder). Every real
@@ -115,12 +117,12 @@ module Hecks
115
117
  # identity check) — a pure repoint, no behavior change for any
116
118
  # existing caller reading `.verb`/`.signal` off what comes back.
117
119
  #
118
- # `legacy_bare_port: true` — the ONE real semantic gap this repoint
120
+ # `legacy_bare_port: true` — the one real semantic gap this repoint
119
121
  # would otherwise open: `PortBuilder#build` never refused a
120
122
  # completely empty build (no verb, no signal even), a real shape
121
123
  # dsl_spec.rb's own "a port" tests exercise (`signal`-only, no
122
124
  # `verb`). `DomainPortBuilder`'s own "declares no verb and no
123
- # operations" refusal is real and correct for its OTHER two callers
125
+ # operations" refusal is real and correct for its other two callers
124
126
  # (`BindingProxy#port`, `HecksagonBuilder#port_impl`) — only this,
125
127
  # the literal top-level `.port` file entry point, keeps the older,
126
128
  # looser rule (see `DomainPortBuilder#initialize`'s own comment).
@@ -1,11 +1,11 @@
1
1
  module RuboCop
2
2
  module Cop
3
3
  module Hecks
4
- # FLAGS THE EXACT SHAPE behind 8+ real bugs already fixed one at a
4
+ # Flags the exact shape behind 8+ real bugs already fixed one at a
5
5
  # time across this codebase (Tiers 1-5): `holder[a] || holder[b]` —
6
- # the SAME receiver looked up by two different keys, falling back to
6
+ # the same receiver looked up by two different keys, falling back to
7
7
  # the second lookup whenever the first is falsy. `||` cannot tell a
8
- # genuinely STORED `false` from a MISSING key — both are falsy in
8
+ # genuinely stored `false` from a missing key — both are falsy in
9
9
  # Ruby — so a real `false` sitting at `holder[a]` is silently
10
10
  # discarded and `holder[b]` (usually absent, so `nil`) is returned
11
11
  # instead. Every one of those 8+ instances was the identical
@@ -13,26 +13,26 @@ module RuboCop
13
13
  # `h[k.to_sym] || h[k]`, reading a value that could arrive keyed
14
14
  # either by symbol or by string off the wire).
15
15
  #
16
- # THE FIX THIS CODEBASE ALREADY CONVERGED ON — see
16
+ # The fix this codebase already converged on — see
17
17
  # `lib/hecks/query_specification/field_path.rb#read`, the shared
18
18
  # digger this whole bug class got consolidated behind: check
19
- # `key?` FIRST, never fall back through `||`.
19
+ # `key?` first, never fall back through `||`.
20
20
  #
21
21
  # sym = segment.to_sym
22
22
  # return current.key?(sym) ? current[sym] : current[segment]
23
23
  #
24
24
  # That method's own comment says it plainly: "`key?` first, never
25
25
  # `||`, because `||` falls through a genuinely-stored `false` to
26
- # the OTHER spelling (usually absent) and returns `nil` instead."
27
- # This cop exists so the NEXT `holder[a] || holder[b]` gets caught
26
+ # the other spelling (usually absent) and returns `nil` instead."
27
+ # This cop exists so the next `holder[a] || holder[b]` gets caught
28
28
  # mechanically, before it becomes bug #9, rather than found by
29
29
  # hand again in a future audit.
30
30
  #
31
- # SCOPED TO THE `[]`/`[]` SHAPE ONLY, deliberately — a receiver
31
+ # Scoped to the `[]`/`[]` shape only, deliberately — a receiver
32
32
  # method-call is compared by AST structure (`==`, which ignores
33
33
  # source location), so `hash[a] || hash[b]` is flagged whether
34
34
  # `hash` is a local variable, a method call, or a constant, but
35
- # `a[k] || b[k]` (DIFFERENT receivers) and `value || default`
35
+ # `a[k] || b[k]` (different receivers) and `value || default`
36
36
  # (an ordinary default, not a second lookup at all) are both left
37
37
  # alone — neither one can silently drop a stored `false` the way
38
38
  # a same-receiver double-lookup can.
@@ -65,11 +65,11 @@ module RuboCop
65
65
  rhs_receiver, rhs_key = bracket_lookup(node.rhs)
66
66
  return unless rhs_receiver
67
67
 
68
- # THE STRUCTURAL EQUALITY CHECK — `==` on an AST node (from the
68
+ # **The structural equality check** — `==` on an AST node (from the
69
69
  # `ast` gem `Node` this compiles down to) compares `type` and
70
70
  # `children` recursively and ignores source location, so
71
71
  # `hash[a] || hash[b]` matches even though the two `hash`
72
- # sub-nodes are two distinct node OBJECTS parsed from two
72
+ # sub-nodes are two distinct node objects parsed from two
73
73
  # different source ranges. A different receiver on each side
74
74
  # (`a[k] || b[k]`) fails this check and is correctly left alone.
75
75
  return unless lhs_receiver == rhs_receiver
@@ -1,47 +1,48 @@
1
1
  module RuboCop
2
2
  module Cop
3
3
  module Hecks
4
- # FLAGS `hash[new] = hash.delete(old)` INSIDE A LOOP — a method that
5
- # both READS and WRITES the same hash across a loop's iterations,
4
+ # Flags `hash[new] = hash.delete(old)` inside a loop — a method that
5
+ # both reads and writes the same hash across a loop's iterations,
6
6
  # in the specific rename/permutation shape this codebase has
7
7
  # already lost real data to once.
8
8
  #
9
- # THE BUG THIS IS THE MECHANICAL FOLLOW-UP TO (M27,
9
+ # The bug this is the mechanical follow-up to (M27,
10
10
  # docs/audits/2026-08-10-main-bug-audit.md,
11
11
  # docs/audits/2026-08-11-bug-triage.md; fixed in
12
12
  # `Hecks::Ports::Persistence::Lineage#apply_renames`,
13
13
  # lib/hecks/ports/persistence/plugins/era/lineage.rb): a rename
14
14
  # rule set applied one rule at a time, `state[new_name] =
15
- # state.delete(old_name)` per rule, against the SAME hash it was
15
+ # state.delete(old_name)` per rule, against the same hash it was
16
16
  # reading from — so a swap (`rename :a, to: :b` alongside `rename
17
17
  # :b, to: :a`) on `{a: 1, b: 2}` collapsed to `{a: 1}`. The first
18
18
  # rule wrote `b: 1` (clobbering the real `b: 2`) before the second
19
19
  # rule ever got a chance to read the value that was supposed to
20
20
  # move to `:a` — sequential edits stepping on each other, not the
21
21
  # simultaneous permutation a rename set actually means. The same
22
- # shape loses data identically for ANY chain longer than one link
22
+ # shape loses data identically for any chain longer than one link
23
23
  # (`a->b->c->a`), not just a two-element swap.
24
24
  #
25
- # THE FIX THIS COP POINTS AT — snapshot every old key's value
26
- # FIRST, delete all old keys, THEN write all new keys, so no
25
+ # **The fix this cop points at** — snapshot every old key's value
26
+ # first, delete all old keys, then write all new keys, so no
27
27
  # rename in the pass ever reads a key this same pass has already
28
28
  # written:
29
29
  #
30
- # snapshot = renames.filter_map { |old_name, new_name| [old_name, new_name, state[old_name]] if state.key?(old_name) }
30
+ # snapshot = renames.filter_map { |old_name, new_name| [old_name, new_name, state[old_name]]
31
+ # if state.key?(old_name) }
31
32
  # snapshot.each { |old_name, _new_name, _value| state.delete(old_name) }
32
33
  # snapshot.each { |_old_name, new_name, value| state[new_name] = value }
33
34
  #
34
- # WHAT THIS COP DOES NOT ATTEMPT — the general checklist item is
35
+ # **What this cop does not attempt** — the general checklist item is
35
36
  # broader than any AST pattern can safely automate ("any method
36
37
  # that both reads and writes the same collection across a loop"
37
38
  # covers plenty of correct code too — accumulating into a result
38
39
  # hash, memoizing into a cache). This cop stays narrow and
39
- # precise: only the EXACT `recv[x] = recv.delete(y)` shape, same
40
+ # precise: only the exact `recv[x] = recv.delete(y)` shape, same
40
41
  # receiver both sides, inside something that iterates. A single
41
42
  # rename outside any loop is not this bug (nothing else can have
42
43
  # run first); `hash.store(...)` instead of `hash[...] =`, or
43
44
  # `hash.delete(...)` whose result is not immediately written back
44
- # into the SAME hash, are not this shape either and are left to
45
+ # into the same hash, are not this shape either and are left to
45
46
  # the broader code-review checklist item, not this cop.
46
47
  #
47
48
  # @example
@@ -51,7 +52,8 @@ module RuboCop
51
52
  # end
52
53
  #
53
54
  # # good — snapshot first, then delete, then write: one permutation
54
- # snapshot = renames.filter_map { |old_name, new_name| [old_name, new_name, state[old_name]] if state.key?(old_name) }
55
+ # snapshot = renames.filter_map { |old_name, new_name| [old_name, new_name, state[old_name]]
56
+ # if state.key?(old_name) }
55
57
  # snapshot.each { |old_name, _new_name, _value| state.delete(old_name) }
56
58
  # snapshot.each { |_old_name, new_name, value| state[new_name] = value }
57
59
  class SequentialHashRenameInLoop < Base
@@ -1,7 +1,7 @@
1
1
  module RuboCop
2
2
  module Cop
3
3
  module Hecks
4
- # FLAGS PLAIN `@ivar` MUTATION inside a class this codebase already
4
+ # Flags plain `@ivar` mutation inside a class this codebase already
5
5
  # knows is a thread-shared singleton — one `Dispatcher`/`Registry`
6
6
  # instance lives for the life of a boot and is dispatched through
7
7
  # from every thread of a Puma worker pool (or any other multi-
@@ -9,29 +9,29 @@ module RuboCop
9
9
  # shared, mutable state with no per-thread or mutex-guarded
10
10
  # isolation at all.
11
11
  #
12
- # THIS IS THE MECHANICAL FOLLOW-UP to a real bug already fixed here
12
+ # This is the mechanical follow-up to a real bug already fixed here
13
13
  # (see `dispatcher.rb`'s own `#reenter` comment, and
14
14
  # `spec/runtime/dispatcher_spec.rb`): `@reaction_depth` used to be a
15
15
  # plain ivar on `Dispatcher`, so two threads' concurrent top-level
16
16
  # dispatches corrupted each other's view of "how deep into a
17
17
  # reaction cascade am I". The fix moved that one ivar to
18
18
  # `Thread.current[:hecks_reaction_depth]`. This cop exists so the
19
- # NEXT plain ivar someone adds to either class gets flagged before
19
+ # next plain ivar someone adds to either class gets flagged before
20
20
  # it becomes the next instance of the same bug, rather than after.
21
21
  #
22
- # SCOPED NARROWLY ON PURPOSE — by class name
22
+ # **Scoped narrowly on purpose** — by class name
23
23
  # (`Hecks::Runtime::Dispatcher`/`Hecks::Runtime::Registry`), not by
24
24
  # blanket-flagging every ivar mutation in the codebase. Most classes
25
- # in this codebase are NOT shared across threads (a fresh value
25
+ # in this codebase are not shared across threads (a fresh value
26
26
  # object per call, a builder used once at boot) and ivar mutation
27
27
  # there is completely ordinary Ruby with no hazard behind it at
28
28
  # all — flagging it everywhere would be noise nobody trusts, the
29
29
  # same reasoning `.rubocop.yml`'s own header gives for every other
30
30
  # cop in this repo.
31
31
  #
32
- # WHAT COUNTS AS "PLAIN": `@ivar = ...`, `@ivar ||= ...`, `@ivar +=
32
+ # What counts as "PLAIN": `@ivar = ...`, `@ivar ||= ...`, `@ivar +=
33
33
  # ...`, `@ivar << ...`, `@ivar[k] = v`. `initialize` is exempt — an
34
- # ivar being SET UP for the first time, before any other thread can
34
+ # ivar being set up for the first time, before any other thread can
35
35
  # possibly hold a reference to this object, is not the hazard (see
36
36
  # `Registry#initialize`'s own `@saga_mutex = Mutex.new`, which this
37
37
  # cop must not flag). `Thread.current[...]`-backed state and a
@@ -68,8 +68,8 @@ module RuboCop
68
68
  RESTRICT_ON_SEND = [:<<, :[]=].freeze
69
69
 
70
70
  def on_ivasgn(node)
71
- # A PLAIN `@x = 1` parses as `(ivasgn :@x (int 1))` — two
72
- # children. The commissioner also visits the BARE `(ivasgn :@x)`
71
+ # A plain `@x = 1` parses as `(ivasgn :@x (int 1))` — two
72
+ # children. The commissioner also visits the bare `(ivasgn :@x)`
73
73
  # node nested one level inside an `op_asgn`/`or_asgn` (`@x += 1`,
74
74
  # `@x ||= 1`) as its own `ivasgn` node with only one child — that
75
75
  # one is handled by `on_op_asgn`/`on_or_asgn` below instead, so
@@ -81,7 +81,7 @@ module RuboCop
81
81
 
82
82
  def on_op_asgn(node)
83
83
  # `@x += 1` parses as `(op_asgn (ivasgn :@x) :+ (int 1))` — the
84
- # target is an `ivasgn` node carrying JUST the name (no value
84
+ # target is an `ivasgn` node carrying just the name (no value
85
85
  # child, unlike a plain `@x = 1`), not an `ivar` node.
86
86
  ivar_node = node.children.first
87
87
  return unless ivar_node.is_a?(RuboCop::AST::Node) && ivar_node.ivasgn_type?
@@ -99,7 +99,7 @@ module RuboCop
99
99
  receiver = node.receiver
100
100
  return unless receiver
101
101
 
102
- # `@ivar << x` — the receiver IS the ivar.
102
+ # `@ivar << x` — the receiver is the ivar.
103
103
  # `@ivar[k] = v` — the receiver is a `send(@ivar, :[], k)`, whose
104
104
  # own receiver is the ivar (`node.receiver.receiver`).
105
105
  ivar_node = if receiver.ivar_type?