hecks 1.3.0 → 1.5.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 (373) hide show
  1. checksums.yaml +4 -4
  2. data/lib/hecks/adapters/driven/claude_code.rb +72 -7
  3. data/lib/hecks/adapters/driven/d1.rb +187 -23
  4. data/lib/hecks/adapters/driven/folder.rb +83 -10
  5. data/lib/hecks/adapters/driven/google_authentication.rb +33 -12
  6. data/lib/hecks/adapters/driven/governance_authorization.rb +87 -18
  7. data/lib/hecks/adapters/driven/heki/journal.rb +13 -4
  8. data/lib/hecks/adapters/driven/heki/saga_store.rb +56 -10
  9. data/lib/hecks/adapters/driven/heki/snapshot.rb +1 -1
  10. data/lib/hecks/adapters/driven/heki.rb +106 -9
  11. data/lib/hecks/adapters/driven/identity_registry.rb +12 -2
  12. data/lib/hecks/adapters/driven/in_memory_ordering.rb +25 -3
  13. data/lib/hecks/adapters/driven/in_process_key_vault.adapter +3 -0
  14. data/lib/hecks/adapters/driven/in_process_key_vault.rb +53 -0
  15. data/lib/hecks/adapters/driven/lambda/client.rb +67 -14
  16. data/lib/hecks/adapters/driven/lambda.rb +82 -35
  17. data/lib/hecks/adapters/driven/local_storage.rb +83 -10
  18. data/lib/hecks/adapters/driven/memory.rb +205 -9
  19. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +21 -1
  20. data/lib/hecks/adapters/driven/postgres/codec.rb +27 -11
  21. data/lib/hecks/adapters/driven/postgres/outbox.rb +40 -2
  22. data/lib/hecks/adapters/driven/postgres/reconnect.rb +23 -7
  23. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +14 -14
  24. data/lib/hecks/adapters/driven/postgres.rb +175 -28
  25. data/lib/hecks/adapters/driven/prism.rb +50 -11
  26. data/lib/hecks/adapters/driven/secure_random_identity.rb +3 -0
  27. data/lib/hecks/adapters/driven/sql_query_builder.rb +34 -22
  28. data/lib/hecks/adapters/driven/sqlite/codec.rb +38 -10
  29. data/lib/hecks/adapters/driven/sqlite/projection.rb +60 -32
  30. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +12 -12
  31. data/lib/hecks/adapters/driven/sqlite.rb +181 -21
  32. data/lib/hecks/adapters/driven/system_clock.rb +3 -0
  33. data/lib/hecks/adapters/driven/tenant_provisioner.adapter +3 -0
  34. data/lib/hecks/adapters/driven/tenant_provisioner.rb +66 -0
  35. data/lib/hecks/adapters/driven.rb +6 -4
  36. data/lib/hecks/adapters/driving/github_webhook.rb +31 -18
  37. data/lib/hecks/behaviors/dsl.rb +60 -2
  38. data/lib/hecks/behaviors/expectations.rb +190 -29
  39. data/lib/hecks/behaviors/ir.rb +12 -1
  40. data/lib/hecks/behaviors/rspec.rb +9 -1
  41. data/lib/hecks/behaviors/runner.rb +21 -2
  42. data/lib/hecks/behaviors.rb +9 -1
  43. data/lib/hecks/bluebook/aggregate.rb +43 -13
  44. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +17 -10
  45. data/lib/hecks/bluebook/assembly/build.rb +26 -5
  46. data/lib/hecks/bluebook/assembly/contract.rb +98 -23
  47. data/lib/hecks/bluebook/assembly/contracts.rb +59 -52
  48. data/lib/hecks/bluebook/assembly/marks.rb +159 -30
  49. data/lib/hecks/bluebook/assembly/specializer.rb +38 -21
  50. data/lib/hecks/bluebook/assembly.rb +32 -14
  51. data/lib/hecks/bluebook/attribute.rb +26 -12
  52. data/lib/hecks/bluebook/behaviour/aggregate.rb +43 -11
  53. data/lib/hecks/bluebook/behaviour/attribute.rb +18 -5
  54. data/lib/hecks/bluebook/behaviour/chapter.rb +76 -5
  55. data/lib/hecks/bluebook/behaviour/command.rb +55 -25
  56. data/lib/hecks/bluebook/behaviour/domain_port.rb +27 -7
  57. data/lib/hecks/bluebook/behaviour/entity.rb +20 -8
  58. data/lib/hecks/bluebook/behaviour/hexagon.rb +30 -4
  59. data/lib/hecks/bluebook/behaviour/lifecycle.rb +27 -6
  60. data/lib/hecks/bluebook/behaviour/policy.rb +42 -17
  61. data/lib/hecks/bluebook/behaviour/process_manager.rb +39 -8
  62. data/lib/hecks/bluebook/behaviour/query.rb +6 -1
  63. data/lib/hecks/bluebook/behaviour/read_model.rb +29 -8
  64. data/lib/hecks/bluebook/behaviour/traits.rb +48 -12
  65. data/lib/hecks/bluebook/behaviour/value_object.rb +21 -9
  66. data/lib/hecks/bluebook/capabilities.rb +27 -0
  67. data/lib/hecks/bluebook/chapter.rb +51 -9
  68. data/lib/hecks/bluebook/command.rb +62 -17
  69. data/lib/hecks/bluebook/domain_port.rb +34 -9
  70. data/lib/hecks/bluebook/dsl/adapter_builder.rb +24 -0
  71. data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +49 -49
  72. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +282 -123
  73. data/lib/hecks/bluebook/dsl/attribute_collector.rb +112 -75
  74. data/lib/hecks/bluebook/dsl/binding_proxy.rb +81 -2
  75. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +486 -117
  76. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +179 -47
  77. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +116 -0
  78. data/lib/hecks/bluebook/dsl/command_builder.rb +284 -122
  79. data/lib/hecks/bluebook/dsl/const_shim.rb +46 -15
  80. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +90 -25
  81. data/lib/hecks/bluebook/dsl/entity_builder.rb +191 -61
  82. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +148 -132
  83. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +130 -30
  84. data/lib/hecks/bluebook/dsl/identity_declaration.rb +38 -21
  85. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +27 -4
  86. data/lib/hecks/bluebook/dsl/policy_builder.rb +86 -36
  87. data/lib/hecks/bluebook/dsl/port_builder.rb +38 -7
  88. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +56 -22
  89. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +111 -47
  90. data/lib/hecks/bluebook/dsl/query_builder.rb +37 -8
  91. data/lib/hecks/bluebook/dsl/read_model_builder.rb +127 -52
  92. data/lib/hecks/bluebook/dsl/rule_reference.rb +97 -43
  93. data/lib/hecks/bluebook/dsl/translation_builder.rb +150 -44
  94. data/lib/hecks/bluebook/dsl/value_object_builder.rb +68 -20
  95. data/lib/hecks/bluebook/dsl/word_gate.rb +59 -53
  96. data/lib/hecks/bluebook/dsl/world_builder.rb +51 -8
  97. data/lib/hecks/bluebook/entity.rb +40 -11
  98. data/lib/hecks/bluebook/expression/ast_json.rb +128 -36
  99. data/lib/hecks/bluebook/expression/ast_reader.rb +32 -3
  100. data/lib/hecks/bluebook/expression/canonical_form.rb +55 -16
  101. data/lib/hecks/bluebook/expression/evaluator.rb +221 -43
  102. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +54 -18
  103. data/lib/hecks/bluebook/expression/resolver.rb +369 -128
  104. data/lib/hecks/bluebook/hexagon.rb +35 -1
  105. data/lib/hecks/bluebook/lifecycle.rb +12 -1
  106. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +2 -1
  107. data/lib/hecks/bluebook/meta_validator/judge.rb +126 -108
  108. data/lib/hecks/bluebook/meta_validator/plan.rb +81 -46
  109. data/lib/hecks/bluebook/meta_validator/port_judge.rb +3 -2
  110. data/lib/hecks/bluebook/meta_validator/readings.rb +200 -50
  111. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +68 -41
  112. data/lib/hecks/bluebook/meta_validator/shapes.rb +166 -21
  113. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +286 -46
  114. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +11 -10
  115. data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -5
  116. data/lib/hecks/bluebook/meta_validator.rb +235 -139
  117. data/lib/hecks/bluebook/model_check.rb +434 -104
  118. data/lib/hecks/bluebook/pattern_subset.rb +32 -10
  119. data/lib/hecks/bluebook/policy.rb +15 -13
  120. data/lib/hecks/bluebook/process_manager.rb +27 -14
  121. data/lib/hecks/bluebook/project_discovery.rb +5 -0
  122. data/lib/hecks/bluebook/project_loader.rb +40 -0
  123. data/lib/hecks/bluebook/project_register.rb +50 -6
  124. data/lib/hecks/bluebook/query.rb +31 -4
  125. data/lib/hecks/bluebook/read_model.rb +35 -15
  126. data/lib/hecks/bluebook/reference.rb +26 -13
  127. data/lib/hecks/bluebook/smoke_test.rb +46 -23
  128. data/lib/hecks/bluebook/synthesizer.rb +46 -12
  129. data/lib/hecks/bluebook/translation.rb +34 -5
  130. data/lib/hecks/bluebook/value_object.rb +29 -11
  131. data/lib/hecks/bluebook.rb +5 -6
  132. data/lib/hecks/codemod.rb +138 -50
  133. data/lib/hecks/construct.rb +21 -7
  134. data/lib/hecks/corpus.rb +438 -0
  135. data/lib/hecks/deploy/bluebook/deploy.hecksagon +19 -0
  136. data/lib/hecks/doc/reference.rb +200 -31
  137. data/lib/hecks/embryonaut_bluebook.rb +38 -15
  138. data/lib/hecks/facade/cli_door.rb +69 -10
  139. data/lib/hecks/facade/cli_runner.rb +105 -24
  140. data/lib/hecks/facade/command_request.rb +23 -0
  141. data/lib/hecks/facade/handle.rb +155 -35
  142. data/lib/hecks/facade/json_door.rb +106 -25
  143. data/lib/hecks/facade/surface/aggregate_door.rb +50 -27
  144. data/lib/hecks/facade/surface/chapter.rb +26 -17
  145. data/lib/hecks/facade/surface.rb +16 -3
  146. data/lib/hecks/facade.rb +15 -4
  147. data/lib/hecks/forms/app.rb +46 -30
  148. data/lib/hecks/forms/command_form_renderer.rb +70 -9
  149. data/lib/hecks/forms/field_renderer.rb +142 -6
  150. data/lib/hecks/forms/field_shape.rb +183 -19
  151. data/lib/hecks/forms/html.rb +51 -7
  152. data/lib/hecks/forms/index_renderer.rb +14 -2
  153. data/lib/hecks/forms/page.rb +14 -0
  154. data/lib/hecks/forms/params.rb +120 -23
  155. data/lib/hecks/forms/port_argument.rb +14 -2
  156. data/lib/hecks/forms/query_form_renderer.rb +65 -2
  157. data/lib/hecks/forms/record_renderer.rb +60 -2
  158. data/lib/hecks/forms/record_table.rb +28 -1
  159. data/lib/hecks/forms/reference_options.rb +24 -0
  160. data/lib/hecks/forms/value_object_shape.rb +13 -3
  161. data/lib/hecks/forms.rb +24 -4
  162. data/lib/hecks/fqn.rb +59 -1
  163. data/lib/hecks/framework/bluebook/governance.bluebook +9 -0
  164. data/lib/hecks/framework/bluebook/privacy.bluebook +155 -0
  165. data/lib/hecks/framework/oidc.json +15 -0
  166. data/lib/hecks/framework.rb +79 -25
  167. data/lib/hecks/freezer.rb +27 -11
  168. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +241 -106
  169. data/lib/hecks/fuzzing/combination_miner.rb +178 -0
  170. data/lib/hecks/fuzzing/concurrent_dispatch.rb +241 -45
  171. data/lib/hecks/fuzzing/coverage_campaign.rb +161 -0
  172. data/lib/hecks/fuzzing/differential.rb +192 -0
  173. data/lib/hecks/fuzzing/domain_generator.rb +871 -0
  174. data/lib/hecks/fuzzing/era_boundary.rb +68 -19
  175. data/lib/hecks/fuzzing/form_census.rb +121 -20
  176. data/lib/hecks/fuzzing/generated_domain_check.rb +171 -0
  177. data/lib/hecks/fuzzing/invalid_value_generator.rb +45 -6
  178. data/lib/hecks/fuzzing/isolated_boot.rb +137 -80
  179. data/lib/hecks/fuzzing/nondeterministic.rb +79 -0
  180. data/lib/hecks/fuzzing/persistence_parity.rb +111 -21
  181. data/lib/hecks/fuzzing/properties/corrections.rb +34 -9
  182. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +300 -51
  183. data/lib/hecks/fuzzing/properties/guards.rb +86 -42
  184. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +80 -32
  185. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +40 -35
  186. data/lib/hecks/fuzzing/properties/outbox.rb +70 -32
  187. data/lib/hecks/fuzzing/properties/querying.rb +82 -28
  188. data/lib/hecks/fuzzing/properties.rb +84 -51
  189. data/lib/hecks/fuzzing/qa_settings.rb +164 -0
  190. data/lib/hecks/fuzzing/replay.rb +241 -133
  191. data/lib/hecks/fuzzing/rotation_priority.rb +48 -28
  192. data/lib/hecks/fuzzing/rust_gap_manifest.rb +139 -0
  193. data/lib/hecks/fuzzing/self_consistency.rb +315 -137
  194. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +46 -40
  195. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +18 -11
  196. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +13 -12
  197. data/lib/hecks/fuzzing/sequence_generator/picker.rb +21 -12
  198. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +59 -32
  199. data/lib/hecks/fuzzing/sequence_generator.rb +158 -23
  200. data/lib/hecks/fuzzing/shrinker.rb +309 -0
  201. data/lib/hecks/fuzzing/structural_skips.rb +37 -130
  202. data/lib/hecks/fuzzing/sweep_depth.rb +12 -4
  203. data/lib/hecks/fuzzing/target_capabilities.rb +107 -29
  204. data/lib/hecks/fuzzing/value_generator.rb +110 -22
  205. data/lib/hecks/fuzzing.rb +5 -0
  206. data/lib/hecks/grammar/evolve.rb +188 -12
  207. data/lib/hecks/grammar.rb +53 -7
  208. data/lib/hecks/ir.rb +51 -20
  209. data/lib/hecks/language/bluebook/bluebook.bluebook +41 -0
  210. data/lib/hecks/language/bluebook/policy.bluebook +11 -1
  211. data/lib/hecks/language/bluebook/vocabulary.bluebook +348 -13
  212. data/lib/hecks/language/hecksagon/hecksagon.bluebook +11 -0
  213. data/lib/hecks/language/oidc.json +5 -0
  214. data/lib/hecks/literal.rb +41 -9
  215. data/lib/hecks/naming.rb +112 -31
  216. data/lib/hecks/ports/access_control.rb +53 -2
  217. data/lib/hecks/ports/agent/answers.rb +83 -6
  218. data/lib/hecks/ports/agent.rb +119 -35
  219. data/lib/hecks/ports/authentication.rb +44 -4
  220. data/lib/hecks/ports/authorization.rb +50 -11
  221. data/lib/hecks/ports/clock.rb +42 -23
  222. data/lib/hecks/ports/extraction.rb +16 -0
  223. data/lib/hecks/ports/identity_assignment.rb +23 -2
  224. data/lib/hecks/ports/identity_generation.rb +17 -3
  225. data/lib/hecks/ports/identity_resolution.rb +17 -1
  226. data/lib/hecks/ports/key_vault.port +6 -0
  227. data/lib/hecks/ports/key_vault.rb +58 -0
  228. data/lib/hecks/ports/loading.rb +4 -0
  229. data/lib/hecks/ports/persistence/append_only.rb +172 -8
  230. data/lib/hecks/ports/persistence/binding_policy.rb +34 -0
  231. data/lib/hecks/ports/persistence/codec_boundary.rb +178 -0
  232. data/lib/hecks/ports/persistence/execution.rb +4 -0
  233. data/lib/hecks/ports/persistence/null_saga_store.rb +12 -1
  234. data/lib/hecks/ports/persistence/plugin.rb +42 -4
  235. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +218 -25
  236. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +77 -9
  237. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +81 -24
  238. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +29 -18
  239. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +144 -60
  240. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +103 -8
  241. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +98 -23
  242. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +282 -109
  243. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +63 -25
  244. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +118 -66
  245. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +51 -28
  246. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +34 -5
  247. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +25 -12
  248. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +129 -34
  249. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +51 -6
  250. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +33 -9
  251. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +16 -0
  252. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +95 -6
  253. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +25 -2
  254. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +314 -90
  255. data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +68 -10
  256. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +9 -3
  257. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +9 -2
  258. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +48 -8
  259. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +16 -1
  260. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +36 -5
  261. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +23 -3
  262. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +58 -19
  263. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +96 -5
  264. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +15 -0
  265. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +9 -1
  266. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -2
  267. data/lib/hecks/ports/persistence/plugins/era.rb +12 -2
  268. data/lib/hecks/ports/persistence/remote_runtime.rb +9 -2
  269. data/lib/hecks/ports/persistence/repository_factory.rb +23 -3
  270. data/lib/hecks/ports/persistence/state_codec.rb +319 -0
  271. data/lib/hecks/ports/persistence.rb +36 -1
  272. data/lib/hecks/ports/projection.rb +61 -7
  273. data/lib/hecks/ports/query/in_memory.rb +41 -8
  274. data/lib/hecks/ports/query/ordering.rb +21 -6
  275. data/lib/hecks/ports/query.rb +35 -0
  276. data/lib/hecks/ports.rb +1 -0
  277. data/lib/hecks/projections/bootstrap_table.rb +147 -0
  278. data/lib/hecks/projections/diagrams.rb +315 -79
  279. data/lib/hecks/projections/glossary/html.rb +91 -3
  280. data/lib/hecks/projections/glossary/markdown.rb +50 -3
  281. data/lib/hecks/projections/glossary/mermaid.rb +49 -1
  282. data/lib/hecks/projections/glossary/sections.rb +1 -1
  283. data/lib/hecks/projections/glossary/sentences.rb +110 -5
  284. data/lib/hecks/projections/glossary.rb +173 -31
  285. data/lib/hecks/projections/ir.rb +1 -1
  286. data/lib/hecks/projections/model/deviations.rb +62 -17
  287. data/lib/hecks/projections/model.rb +75 -21
  288. data/lib/hecks/projections/oidc.rb +45 -8
  289. data/lib/hecks/projections/parser_table.rb +53 -12
  290. data/lib/hecks/projections/reference.rb +15 -3
  291. data/lib/hecks/projections/rust_vocabulary.rb +646 -0
  292. data/lib/hecks/projections/shape.rb +10 -2
  293. data/lib/hecks/projections/statements.rb +69 -22
  294. data/lib/hecks/projections/vocabulary.rb +26 -9
  295. data/lib/hecks/projections.rb +5 -3
  296. data/lib/hecks/projector/cli_projector.rb +245 -37
  297. data/lib/hecks/projector/docs_projector.rb +154 -28
  298. data/lib/hecks/projector/exporter.rb +104 -29
  299. data/lib/hecks/projector/ir_projector.rb +7 -1
  300. data/lib/hecks/projector/narrate_projector.rb +144 -23
  301. data/lib/hecks/projector/target.rb +42 -18
  302. data/lib/hecks/projector.rb +86 -18
  303. data/lib/hecks/query_ir.rb +94 -47
  304. data/lib/hecks/query_specification/common/comparators.rb +19 -3
  305. data/lib/hecks/query_specification/common/comparison.rb +109 -27
  306. data/lib/hecks/query_specification/common/dsl.rb +65 -9
  307. data/lib/hecks/query_specification/common/null_policy.rb +61 -15
  308. data/lib/hecks/query_specification/common/null_semantics.rb +4 -0
  309. data/lib/hecks/query_specification/common/options.rb +25 -0
  310. data/lib/hecks/query_specification/field_path.rb +69 -15
  311. data/lib/hecks/query_specification/hop_path.rb +57 -20
  312. data/lib/hecks/query_specification/read_model/specification.rb +4 -0
  313. data/lib/hecks/rendering.rb +9 -3
  314. data/lib/hecks/router/namespace_installer.rb +16 -3
  315. data/lib/hecks/router.rb +56 -1
  316. data/lib/hecks/runtime/aggregate_lock.rb +20 -11
  317. data/lib/hecks/runtime/boot_gates.rb +21 -3
  318. data/lib/hecks/runtime/caller.rb +40 -8
  319. data/lib/hecks/runtime/capability_graph.rb +13 -2
  320. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +40 -41
  321. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +45 -67
  322. data/lib/hecks/runtime/command_interpreter.rb +195 -113
  323. data/lib/hecks/runtime/command_rules/admissibility.rb +231 -80
  324. data/lib/hecks/runtime/command_rules/arithmetic.rb +154 -96
  325. data/lib/hecks/runtime/command_rules/authorization.rb +38 -17
  326. data/lib/hecks/runtime/command_rules/emission.rb +18 -1
  327. data/lib/hecks/runtime/command_rules/references.rb +145 -55
  328. data/lib/hecks/runtime/command_rules.rb +3 -0
  329. data/lib/hecks/runtime/dependency_planning.rb +56 -11
  330. data/lib/hecks/runtime/dispatcher.rb +263 -92
  331. data/lib/hecks/runtime/entity_element.rb +304 -67
  332. data/lib/hecks/runtime/entity_interpreter.rb +149 -88
  333. data/lib/hecks/runtime/errors.rb +37 -23
  334. data/lib/hecks/runtime/event.rb +15 -10
  335. data/lib/hecks/runtime/identity.rb +91 -23
  336. data/lib/hecks/runtime/instance.rb +103 -18
  337. data/lib/hecks/runtime/interpreting.rb +24 -16
  338. data/lib/hecks/runtime/invocation.rb +358 -0
  339. data/lib/hecks/runtime/loader.rb +105 -19
  340. data/lib/hecks/runtime/outbox.rb +164 -26
  341. data/lib/hecks/runtime/policy_interpreter.rb +73 -60
  342. data/lib/hecks/runtime/port_operation_interpreter.rb +42 -19
  343. data/lib/hecks/runtime/query_interpreter.rb +93 -74
  344. data/lib/hecks/runtime/reaction_invocation.rb +73 -28
  345. data/lib/hecks/runtime/read_model_interpreter.rb +60 -44
  346. data/lib/hecks/runtime/rebuild_sweep.rb +32 -4
  347. data/lib/hecks/runtime/reference_hop.rb +48 -6
  348. data/lib/hecks/runtime/refusal_wording.rb +142 -115
  349. data/lib/hecks/runtime/registry/saga_persistence.rb +32 -21
  350. data/lib/hecks/runtime/registry/verification.rb +153 -28
  351. data/lib/hecks/runtime/registry.rb +202 -32
  352. data/lib/hecks/runtime/remote_dispatcher.rb +125 -24
  353. data/lib/hecks/runtime/routing.rb +36 -154
  354. data/lib/hecks/runtime/saga_interpreter/correlation.rb +25 -27
  355. data/lib/hecks/runtime/saga_interpreter.rb +90 -76
  356. data/lib/hecks/runtime/saga_pending_dispatch.rb +12 -12
  357. data/lib/hecks/runtime/tenant_check.rb +33 -13
  358. data/lib/hecks/runtime/tenant_scope.rb +23 -5
  359. data/lib/hecks/runtime/value/admission.rb +75 -30
  360. data/lib/hecks/runtime/value/coercion.rb +555 -142
  361. data/lib/hecks/runtime/value/entity_list_coercion.rb +132 -60
  362. data/lib/hecks/runtime/value.rb +71 -21
  363. data/lib/hecks/runtime.rb +39 -7
  364. data/lib/hecks/storehouse.rb +368 -72
  365. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +130 -0
  366. data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +32 -0
  367. data/lib/hecks/version.rb +3 -3
  368. data/lib/hecks/vocabulary.rb +205 -4
  369. data/lib/hecks.rb +91 -11
  370. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +19 -11
  371. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +24 -12
  372. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +38 -14
  373. metadata +28 -2
@@ -0,0 +1,130 @@
1
+ # ITS OWN BOUNDED CONTEXT, booted centrally like `Deploy` — never
2
+ # attached via `uses_framework` (a framework member's aggregate folds
3
+ # into the ATTACHING domain's own per-boot registry, framework.rb:43-66
4
+ # — since hecks gives each tenant its own separate `Runtime.boot`, a
5
+ # framework-attached Tenant would exist as a single-row copy inside
6
+ # EVERY tenant's own boot, never as one cross-tenant list, defeating
7
+ # this domain's whole point). `Deploy::Tenant` (deploy.bluebook) stays
8
+ # a SEPARATE, validation-only aggregate — a shape check before
9
+ # provisioning; this is the durable, reactable runtime fact that
10
+ # aggregate's own comment named and deliberately deferred. Two
11
+ # different meanings of "Tenant," on purpose, translated at the one
12
+ # explicit seam `tenancy.hecksagon`'s own `translates` line names.
13
+ Hecks.bluebook "Tenancy" do
14
+ vision "Which tenants exist, which realm and storage each one owns, and whether each is currently allowed to run, is one queryable, historical fact — not scattered across a world-file overlay and a validation-only command."
15
+
16
+ supporting
17
+
18
+ aggregate "Tenant" do
19
+ description "One tenant's durable identity and lifecycle — registered, then active or suspended, until retired."
20
+
21
+ identified_by :slug
22
+
23
+ attribute :slug, Slug
24
+ attribute :domain, DomainName
25
+ attribute :realm, Realm
26
+ attribute :schema, Schema
27
+ attribute :status, Status, default: { value: "Active" }
28
+
29
+ value_object "Slug" do
30
+ attribute :value, String, pattern: '^[a-z][a-z0-9_]*$'
31
+ invariant("a tenant slug is named") { !value.to_s.empty? }
32
+ end
33
+
34
+ value_object "DomainName" do
35
+ attribute :value, String
36
+ invariant("a tenant names the domain it is for") { !value.to_s.empty? }
37
+ end
38
+
39
+ value_object "Realm" do
40
+ attribute :value, String
41
+ invariant("a tenant realm is named") { !value.to_s.empty? }
42
+ end
43
+
44
+ value_object "Schema" do
45
+ attribute :value, String, pattern: '^[a-z][a-z0-9_]*$'
46
+ invariant("a schema is named") { !value.to_s.empty? }
47
+ end
48
+
49
+ value_object "Status" do
50
+ attribute :value, String, one_of: ["Active", "Suspended", "Retired"]
51
+ end
52
+
53
+ # FIRES AFTER PROVISIONING, NEVER BEFORE — a pure record with no
54
+ # side effects, dispatched by `tenancy.hecksagon`'s own `translates`
55
+ # reaction once `Deploy::Tenant.Provision`'s adapter has already
56
+ # written the world overlay and proven the domain boots. Driving
57
+ # provisioning FROM this command's own emission would need a
58
+ # process manager reacting to it — the exact durable-saga cost
59
+ # `deploy.bluebook`'s own `Tenant` aggregate comment already argued
60
+ # three local, idempotent, single-process steps don't need.
61
+ command "Register" do
62
+ goal "Record that a tenant now exists, after its shape has been validated and its schema provisioned"
63
+
64
+ attribute :slug, Slug
65
+ attribute :domain, DomainName
66
+ attribute :realm, Realm
67
+ attribute :schema, Schema
68
+
69
+ sets :slug
70
+ sets :domain
71
+ sets :realm
72
+ sets :schema
73
+
74
+ emits "TenantRegistered"
75
+ end
76
+
77
+ # RECORD-ONLY — nothing today reads `status` before dispatch or
78
+ # boot, so suspending a tenant here does not yet stop anything from
79
+ # running. Spelled out in this command's own `goal`, not just a
80
+ # comment, so it survives into generated docs/corpus rather than
81
+ # quietly reading as enforced when it isn't — the exact "a dial
82
+ # says a check runs when nothing runs it" defect class this
83
+ # project has already been burned by once.
84
+ command "Suspend" do
85
+ goal "Record that a tenant should no longer be treated as active — nothing yet enforces this at dispatch or boot time"
86
+
87
+ reference_to Tenant
88
+
89
+ sets :status, to: "Suspended"
90
+
91
+ emits "TenantSuspended"
92
+ end
93
+
94
+ command "Reactivate" do
95
+ goal "Restore a suspended tenant to active"
96
+
97
+ reference_to Tenant
98
+
99
+ sets :status, to: "Active"
100
+
101
+ emits "TenantReactivated"
102
+ end
103
+
104
+ # RECORD-ONLY, DELIBERATELY — dropping a live Postgres schema as an
105
+ # automatic side effect of a command handler would break the pure,
106
+ # no-adapter-calls-from-a-handler shape every other command in this
107
+ # corpus holds to. Real teardown, if ever built, is its own
108
+ # separate, deliberately reviewed tool — never implicit here.
109
+ command "Retire" do
110
+ goal "Record that a tenant is permanently done — real schema teardown is a deliberately separate, manually-run tool, never automatic here"
111
+
112
+ reference_to Tenant
113
+
114
+ sets :status, to: "Retired"
115
+
116
+ emits "TenantRetired"
117
+ end
118
+
119
+ query "Active" do
120
+ description "Every tenant currently allowed to run."
121
+ where(status: "Active")
122
+ end
123
+
124
+ query "BySlug" do
125
+ description "One tenant's current record, by its slug."
126
+ attribute :slug, Slug
127
+ where(slug: :slug)
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,32 @@
1
+ Hecks.hecksagon "Tenancy" do
2
+ Tenancy::Tenant.persisted_by("LocalStorage")
3
+
4
+ # THE TRANSLATION SEAM — the one explicit place Deploy's "Tenant"
5
+ # (a validated request) becomes Tenancy's "Tenant" (a durable fact).
6
+ # `on` deliberately omits the "Deploy::" prefix: PolicyInterpreter
7
+ # matches by event name plus the emitting aggregate's own demodulised
8
+ # name only, never the domain (confirmed live — a domain-qualified
9
+ # `on` silently never matches).
10
+ #
11
+ # `with:` IS REQUIRED, confirmed live — `TenantProvisioned`'s own
12
+ # payload is the ANSWER (slug/domain/realm/schema) merged with the
13
+ # port operation's OWN dispatch-time args (database/adapter,
14
+ # PortOperationInterpreter#ask's `ctx.args.merge(spread(answer))`),
15
+ # so the whole payload forwarded verbatim carries two fields
16
+ # `Register` never declares and gets refused outright.
17
+ # CHECKED TOGETHER, NOT IN ISOLATION — `bin/model_check`'s own
18
+ # `deaf_policy` check only sees ONE domain's own emitted events by
19
+ # default, which would flag this reaction as deaf (it reacts to a
20
+ # FOREIGN event, not one Tenancy itself emits). Fixed by
21
+ # `global_emitted_events:`, a cross-domain set `bin/model_check`
22
+ # builds across every target it boots in one run — run `bin/model_check
23
+ # lib/hecks/deploy lib/hecks/tenancy` (both targets, one invocation),
24
+ # not each directory separately, or this reads as a false positive
25
+ # again. Neither `deploy` nor `tenancy` is in
26
+ # `Hecks::Corpus::MODEL_CHECK_KINDS`, so the automatic sweep never
27
+ # reaches this at all, checked or not.
28
+ translates "RegisterProvisionedTenant" do
29
+ on Tenant::TenantProvisioned
30
+ trigger Tenant::Register, with: { slug: :slug, domain: :domain, realm: :realm, schema: :schema }
31
+ end
32
+ end
data/lib/hecks/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Hecks
2
- # ISOLATED, ON PURPOSE — the gemspec reads this file directly rather
2
+ # **Isolated, on purpose** — the gemspec reads this file directly rather
3
3
  # than `require_relative "lib/hecks"` (the whole framework),
4
- # specifically so evaluating the gemspec never triggers ANY of this
4
+ # specifically so evaluating the gemspec never triggers any of this
5
5
  # gem's own dependencies (prism among them) before Bundler has even
6
6
  # resolved what to install. A real, live chicken-and-egg bug caught
7
7
  # deploying to a Ruby version that doesn't bundle prism for free
@@ -12,5 +12,5 @@ module Hecks
12
12
  # it there, or even in the consuming Gemfile, never closed the gap,
13
13
  # because gemspec evaluation happens before anything Bundler
14
14
  # resolves is actually loadable yet.
15
- VERSION = "1.3.0".freeze
15
+ VERSION = "1.5.0".freeze
16
16
  end
@@ -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.