hecks 1.2.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 (358) 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 +60 -2
  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/postgres_era.adapter +5 -0
  23. data/lib/hecks/adapters/driven/prism.rb +4 -4
  24. data/lib/hecks/adapters/driven/sql_query_builder.rb +34 -22
  25. data/lib/hecks/adapters/driven/sqlite/codec.rb +38 -10
  26. data/lib/hecks/adapters/driven/sqlite/projection.rb +60 -32
  27. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +12 -12
  28. data/lib/hecks/adapters/driven/sqlite.rb +181 -21
  29. data/lib/hecks/adapters/driven.rb +4 -4
  30. data/lib/hecks/adapters/driving/github_webhook.rb +145 -0
  31. data/lib/hecks/behaviors/dsl.rb +2 -2
  32. data/lib/hecks/behaviors/expectations.rb +51 -23
  33. data/lib/hecks/behaviors/ir.rb +1 -1
  34. data/lib/hecks/behaviors/rspec.rb +1 -1
  35. data/lib/hecks/behaviors/runner.rb +2 -2
  36. data/lib/hecks/behaviors.rb +1 -1
  37. data/lib/hecks/bluebook/aggregate.rb +13 -13
  38. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +10 -10
  39. data/lib/hecks/bluebook/assembly/build.rb +1 -1
  40. data/lib/hecks/bluebook/assembly/contract.rb +39 -16
  41. data/lib/hecks/bluebook/assembly/contracts.rb +40 -38
  42. data/lib/hecks/bluebook/assembly/marks.rb +18 -18
  43. data/lib/hecks/bluebook/assembly/specializer.rb +19 -21
  44. data/lib/hecks/bluebook/assembly.rb +9 -9
  45. data/lib/hecks/bluebook/attribute.rb +9 -9
  46. data/lib/hecks/bluebook/behaviour/aggregate.rb +11 -11
  47. data/lib/hecks/bluebook/behaviour/attribute.rb +5 -5
  48. data/lib/hecks/bluebook/behaviour/chapter.rb +23 -5
  49. data/lib/hecks/bluebook/behaviour/command.rb +23 -23
  50. data/lib/hecks/bluebook/behaviour/domain_port.rb +27 -3
  51. data/lib/hecks/bluebook/behaviour/entity.rb +8 -8
  52. data/lib/hecks/bluebook/behaviour/hexagon.rb +4 -4
  53. data/lib/hecks/bluebook/behaviour/lifecycle.rb +5 -5
  54. data/lib/hecks/bluebook/behaviour/policy.rb +12 -12
  55. data/lib/hecks/bluebook/behaviour/process_manager.rb +7 -7
  56. data/lib/hecks/bluebook/behaviour/query.rb +1 -1
  57. data/lib/hecks/bluebook/behaviour/read_model.rb +8 -8
  58. data/lib/hecks/bluebook/behaviour/traits.rb +12 -12
  59. data/lib/hecks/bluebook/behaviour/value_object.rb +6 -6
  60. data/lib/hecks/bluebook/capabilities.rb +27 -0
  61. data/lib/hecks/bluebook/chapter.rb +28 -9
  62. data/lib/hecks/bluebook/command.rb +12 -12
  63. data/lib/hecks/bluebook/domain_port.rb +9 -9
  64. data/lib/hecks/bluebook/dsl/adapter_builder.rb +24 -0
  65. data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +49 -49
  66. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +96 -96
  67. data/lib/hecks/bluebook/dsl/attribute_collector.rb +41 -41
  68. data/lib/hecks/bluebook/dsl/binding_proxy.rb +22 -2
  69. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +111 -74
  70. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +48 -30
  71. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +116 -0
  72. data/lib/hecks/bluebook/dsl/command_builder.rb +103 -103
  73. data/lib/hecks/bluebook/dsl/const_shim.rb +46 -15
  74. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +90 -25
  75. data/lib/hecks/bluebook/dsl/entity_builder.rb +56 -56
  76. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +148 -132
  77. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +89 -30
  78. data/lib/hecks/bluebook/dsl/identity_declaration.rb +17 -17
  79. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +27 -4
  80. data/lib/hecks/bluebook/dsl/policy_builder.rb +30 -21
  81. data/lib/hecks/bluebook/dsl/port_builder.rb +38 -7
  82. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +56 -22
  83. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +35 -35
  84. data/lib/hecks/bluebook/dsl/query_builder.rb +5 -5
  85. data/lib/hecks/bluebook/dsl/read_model_builder.rb +34 -34
  86. data/lib/hecks/bluebook/dsl/rule_reference.rb +41 -39
  87. data/lib/hecks/bluebook/dsl/translation_builder.rb +9 -9
  88. data/lib/hecks/bluebook/dsl/value_object_builder.rb +16 -16
  89. data/lib/hecks/bluebook/dsl/word_gate.rb +59 -53
  90. data/lib/hecks/bluebook/dsl/world_builder.rb +51 -8
  91. data/lib/hecks/bluebook/entity.rb +11 -11
  92. data/lib/hecks/bluebook/expression/ast_json.rb +20 -20
  93. data/lib/hecks/bluebook/expression/ast_reader.rb +3 -3
  94. data/lib/hecks/bluebook/expression/canonical_form.rb +9 -9
  95. data/lib/hecks/bluebook/expression/evaluator.rb +18 -18
  96. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +18 -18
  97. data/lib/hecks/bluebook/expression/resolver.rb +60 -62
  98. data/lib/hecks/bluebook/hexagon.rb +1 -1
  99. data/lib/hecks/bluebook/lifecycle.rb +1 -1
  100. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -1
  101. data/lib/hecks/bluebook/meta_validator/judge.rb +122 -86
  102. data/lib/hecks/bluebook/meta_validator/plan.rb +39 -39
  103. data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -2
  104. data/lib/hecks/bluebook/meta_validator/readings.rb +43 -43
  105. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +44 -37
  106. data/lib/hecks/bluebook/meta_validator/shapes.rb +25 -21
  107. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +145 -31
  108. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +6 -6
  109. data/lib/hecks/bluebook/meta_validator/world_judge.rb +5 -5
  110. data/lib/hecks/bluebook/meta_validator.rb +70 -70
  111. data/lib/hecks/bluebook/model_check.rb +301 -84
  112. data/lib/hecks/bluebook/pattern_subset.rb +9 -9
  113. data/lib/hecks/bluebook/policy.rb +15 -13
  114. data/lib/hecks/bluebook/process_manager.rb +14 -14
  115. data/lib/hecks/bluebook/project_register.rb +6 -6
  116. data/lib/hecks/bluebook/query.rb +4 -4
  117. data/lib/hecks/bluebook/read_model.rb +14 -14
  118. data/lib/hecks/bluebook/reference.rb +8 -8
  119. data/lib/hecks/bluebook/smoke_test.rb +19 -19
  120. data/lib/hecks/bluebook/synthesizer.rb +12 -12
  121. data/lib/hecks/bluebook/translation.rb +4 -4
  122. data/lib/hecks/bluebook/value_object.rb +6 -6
  123. data/lib/hecks/bluebook.rb +2 -2
  124. data/lib/hecks/codemod/legacy_dispatch_args.rb +299 -0
  125. data/lib/hecks/codemod/legacy_dispatch_recorder.rb +186 -0
  126. data/lib/hecks/codemod.rb +36 -35
  127. data/lib/hecks/construct.rb +6 -6
  128. data/lib/hecks/corpus.rb +317 -0
  129. data/lib/hecks/deprecation.rb +95 -0
  130. data/lib/hecks/doc/reference.rb +19 -19
  131. data/lib/hecks/embryonaut_bluebook.rb +11 -11
  132. data/lib/hecks/facade/cli_door.rb +69 -10
  133. data/lib/hecks/facade/cli_runner.rb +105 -24
  134. data/lib/hecks/facade/command_request.rb +23 -0
  135. data/lib/hecks/facade/handle.rb +79 -32
  136. data/lib/hecks/facade/json_door.rb +106 -25
  137. data/lib/hecks/facade/surface/aggregate_door.rb +42 -27
  138. data/lib/hecks/facade/surface/chapter.rb +26 -17
  139. data/lib/hecks/facade/surface.rb +16 -3
  140. data/lib/hecks/facade.rb +15 -4
  141. data/lib/hecks/forms/app.rb +46 -30
  142. data/lib/hecks/forms/command_form_renderer.rb +70 -9
  143. data/lib/hecks/forms/field_renderer.rb +142 -6
  144. data/lib/hecks/forms/field_shape.rb +183 -20
  145. data/lib/hecks/forms/html.rb +51 -7
  146. data/lib/hecks/forms/index_renderer.rb +14 -2
  147. data/lib/hecks/forms/params.rb +120 -23
  148. data/lib/hecks/forms/port_argument.rb +2 -2
  149. data/lib/hecks/forms/query_form_renderer.rb +2 -2
  150. data/lib/hecks/forms/record_renderer.rb +2 -2
  151. data/lib/hecks/forms/record_table.rb +1 -1
  152. data/lib/hecks/forms/value_object_shape.rb +3 -3
  153. data/lib/hecks/forms.rb +24 -4
  154. data/lib/hecks/fqn.rb +1 -1
  155. data/lib/hecks/framework/bluebook/governance.bluebook +9 -0
  156. data/lib/hecks/framework.rb +48 -17
  157. data/lib/hecks/freezer.rb +11 -11
  158. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +90 -90
  159. data/lib/hecks/fuzzing/combination_miner.rb +119 -0
  160. data/lib/hecks/fuzzing/concurrent_dispatch.rb +361 -0
  161. data/lib/hecks/fuzzing/coverage_campaign.rb +118 -0
  162. data/lib/hecks/fuzzing/differential.rb +158 -0
  163. data/lib/hecks/fuzzing/domain_generator.rb +694 -0
  164. data/lib/hecks/fuzzing/era_boundary.rb +124 -0
  165. data/lib/hecks/fuzzing/form_census.rb +199 -0
  166. data/lib/hecks/fuzzing/generated_domain_check.rb +95 -0
  167. data/lib/hecks/fuzzing/invalid_value_generator.rb +6 -6
  168. data/lib/hecks/fuzzing/isolated_boot.rb +226 -38
  169. data/lib/hecks/fuzzing/nondeterministic.rb +67 -0
  170. data/lib/hecks/fuzzing/persistence_parity.rb +161 -0
  171. data/lib/hecks/fuzzing/properties/corrections.rb +100 -0
  172. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +321 -41
  173. data/lib/hecks/fuzzing/properties/guards.rb +129 -26
  174. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +32 -32
  175. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +31 -11
  176. data/lib/hecks/fuzzing/properties/outbox.rb +142 -0
  177. data/lib/hecks/fuzzing/properties/querying.rb +17 -17
  178. data/lib/hecks/fuzzing/properties.rb +84 -39
  179. data/lib/hecks/fuzzing/qa_settings.rb +152 -0
  180. data/lib/hecks/fuzzing/replay.rb +224 -114
  181. data/lib/hecks/fuzzing/rotation_priority.rb +94 -0
  182. data/lib/hecks/fuzzing/rust_gap_manifest.rb +113 -0
  183. data/lib/hecks/fuzzing/self_consistency.rb +676 -0
  184. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +526 -0
  185. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +101 -30
  186. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +55 -8
  187. data/lib/hecks/fuzzing/sequence_generator/picker.rb +31 -11
  188. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +123 -32
  189. data/lib/hecks/fuzzing/sequence_generator.rb +152 -31
  190. data/lib/hecks/fuzzing/shrinker.rb +197 -0
  191. data/lib/hecks/fuzzing/structural_skips.rb +39 -0
  192. data/lib/hecks/fuzzing/sweep_depth.rb +53 -0
  193. data/lib/hecks/fuzzing/target_capabilities.rb +180 -0
  194. data/lib/hecks/fuzzing/value_generator.rb +66 -14
  195. data/lib/hecks/fuzzing.rb +11 -0
  196. data/lib/hecks/grammar/evolve.rb +10 -10
  197. data/lib/hecks/grammar.rb +7 -7
  198. data/lib/hecks/ir.rb +13 -13
  199. data/lib/hecks/language/bluebook/bluebook.bluebook +41 -0
  200. data/lib/hecks/language/bluebook/policy.bluebook +11 -1
  201. data/lib/hecks/language/bluebook/vocabulary.bluebook +365 -15
  202. data/lib/hecks/language/oidc.json +5 -0
  203. data/lib/hecks/literal.rb +9 -9
  204. data/lib/hecks/naming.rb +89 -21
  205. data/lib/hecks/ports/access_control.rb +58 -2
  206. data/lib/hecks/ports/agent/answers.rb +83 -6
  207. data/lib/hecks/ports/agent.rb +119 -35
  208. data/lib/hecks/ports/authentication.rb +44 -4
  209. data/lib/hecks/ports/authorization.rb +53 -11
  210. data/lib/hecks/ports/clock.rb +42 -23
  211. data/lib/hecks/ports/extraction.rb +16 -0
  212. data/lib/hecks/ports/identity_assignment.rb +24 -2
  213. data/lib/hecks/ports/identity_generation.rb +17 -3
  214. data/lib/hecks/ports/identity_resolution.rb +18 -1
  215. data/lib/hecks/ports/loading.rb +4 -0
  216. data/lib/hecks/ports/persistence/append_only.rb +172 -8
  217. data/lib/hecks/ports/persistence/binding_policy.rb +34 -0
  218. data/lib/hecks/ports/persistence/codec_boundary.rb +178 -0
  219. data/lib/hecks/ports/persistence/execution.rb +4 -0
  220. data/lib/hecks/ports/persistence/null_saga_store.rb +12 -1
  221. data/lib/hecks/ports/persistence/plugin.rb +42 -4
  222. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +218 -25
  223. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +77 -9
  224. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +81 -24
  225. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +29 -18
  226. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +144 -60
  227. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +103 -8
  228. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +98 -23
  229. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +282 -109
  230. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +63 -25
  231. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +160 -58
  232. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +51 -28
  233. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +28 -5
  234. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +25 -12
  235. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +129 -34
  236. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +51 -6
  237. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +44 -6
  238. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +16 -0
  239. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +57 -4
  240. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +25 -2
  241. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +338 -83
  242. data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +68 -10
  243. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +9 -3
  244. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +9 -2
  245. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +42 -8
  246. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +16 -1
  247. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +36 -5
  248. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +23 -3
  249. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -19
  250. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +5 -5
  251. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +1 -1
  252. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -2
  253. data/lib/hecks/ports/persistence/plugins/era.rb +12 -2
  254. data/lib/hecks/ports/persistence/remote_runtime.rb +9 -2
  255. data/lib/hecks/ports/persistence/repository_factory.rb +29 -6
  256. data/lib/hecks/ports/persistence/state_codec.rb +319 -0
  257. data/lib/hecks/ports/persistence.rb +36 -1
  258. data/lib/hecks/ports/projection.rb +61 -7
  259. data/lib/hecks/ports/query/in_memory.rb +3 -3
  260. data/lib/hecks/ports/query/ordering.rb +6 -6
  261. data/lib/hecks/ports/query.rb +35 -0
  262. data/lib/hecks/projections/bootstrap_table.rb +112 -0
  263. data/lib/hecks/projections/diagrams.rb +75 -75
  264. data/lib/hecks/projections/glossary/html.rb +250 -0
  265. data/lib/hecks/projections/glossary/markdown.rb +105 -0
  266. data/lib/hecks/projections/glossary/mermaid.rb +110 -0
  267. data/lib/hecks/projections/glossary/page.css +271 -0
  268. data/lib/hecks/projections/glossary/page.js +72 -0
  269. data/lib/hecks/projections/glossary/sections.rb +17 -0
  270. data/lib/hecks/projections/glossary/sentences.rb +205 -0
  271. data/lib/hecks/projections/glossary.rb +214 -286
  272. data/lib/hecks/projections/ir.rb +1 -1
  273. data/lib/hecks/projections/model/deviations.rb +18 -17
  274. data/lib/hecks/projections/model.rb +25 -21
  275. data/lib/hecks/projections/oidc.rb +7 -7
  276. data/lib/hecks/projections/parser_table.rb +5 -5
  277. data/lib/hecks/projections/reference.rb +3 -3
  278. data/lib/hecks/projections/rust_vocabulary.rb +443 -0
  279. data/lib/hecks/projections/shape.rb +2 -2
  280. data/lib/hecks/projections/statements.rb +11 -11
  281. data/lib/hecks/projections/vocabulary.rb +9 -9
  282. data/lib/hecks/projections.rb +5 -3
  283. data/lib/hecks/projector/cli_projector.rb +29 -29
  284. data/lib/hecks/projector/docs_projector.rb +13 -13
  285. data/lib/hecks/projector/exporter.rb +42 -21
  286. data/lib/hecks/projector/ir_projector.rb +1 -1
  287. data/lib/hecks/projector/narrate_projector.rb +15 -22
  288. data/lib/hecks/projector/target.rb +13 -13
  289. data/lib/hecks/projector.rb +15 -15
  290. data/lib/hecks/query_ir.rb +47 -47
  291. data/lib/hecks/query_specification/common/comparators.rb +19 -3
  292. data/lib/hecks/query_specification/common/comparison.rb +132 -24
  293. data/lib/hecks/query_specification/common/dsl.rb +65 -9
  294. data/lib/hecks/query_specification/common/null_policy.rb +57 -13
  295. data/lib/hecks/query_specification/common/null_semantics.rb +4 -0
  296. data/lib/hecks/query_specification/common/options.rb +25 -0
  297. data/lib/hecks/query_specification/field_path.rb +69 -15
  298. data/lib/hecks/query_specification/hop_path.rb +57 -20
  299. data/lib/hecks/query_specification/read_model/specification.rb +4 -0
  300. data/lib/hecks/rendering.rb +3 -3
  301. data/lib/hecks/router/namespace_installer.rb +3 -3
  302. data/lib/hecks/router.rb +1 -1
  303. data/lib/hecks/runtime/aggregate_lock.rb +11 -11
  304. data/lib/hecks/runtime/boot_gates.rb +3 -3
  305. data/lib/hecks/runtime/caller.rb +8 -8
  306. data/lib/hecks/runtime/capability_graph.rb +2 -2
  307. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +22 -25
  308. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +64 -67
  309. data/lib/hecks/runtime/command_interpreter.rb +159 -102
  310. data/lib/hecks/runtime/command_rules/admissibility.rb +69 -69
  311. data/lib/hecks/runtime/command_rules/arithmetic.rb +137 -91
  312. data/lib/hecks/runtime/command_rules/authorization.rb +38 -17
  313. data/lib/hecks/runtime/command_rules/emission.rb +18 -1
  314. data/lib/hecks/runtime/command_rules/references.rb +94 -19
  315. data/lib/hecks/runtime/command_rules.rb +3 -0
  316. data/lib/hecks/runtime/dependency_planning.rb +11 -11
  317. data/lib/hecks/runtime/dispatcher.rb +283 -90
  318. data/lib/hecks/runtime/entity_element.rb +282 -46
  319. data/lib/hecks/runtime/entity_interpreter.rb +160 -69
  320. data/lib/hecks/runtime/errors.rb +19 -19
  321. data/lib/hecks/runtime/event.rb +6 -6
  322. data/lib/hecks/runtime/identity.rb +22 -22
  323. data/lib/hecks/runtime/instance.rb +39 -14
  324. data/lib/hecks/runtime/interpreting.rb +12 -12
  325. data/lib/hecks/runtime/invocation.rb +276 -0
  326. data/lib/hecks/runtime/loader.rb +14 -14
  327. data/lib/hecks/runtime/outbox.rb +23 -23
  328. data/lib/hecks/runtime/policy_interpreter.rb +54 -54
  329. data/lib/hecks/runtime/port_operation_interpreter.rb +22 -19
  330. data/lib/hecks/runtime/query_interpreter.rb +111 -56
  331. data/lib/hecks/runtime/reaction_invocation.rb +76 -9
  332. data/lib/hecks/runtime/read_model_interpreter.rb +40 -40
  333. data/lib/hecks/runtime/rebuild_sweep.rb +4 -4
  334. data/lib/hecks/runtime/reference_hop.rb +6 -6
  335. data/lib/hecks/runtime/refusal_wording.rb +92 -112
  336. data/lib/hecks/runtime/registry/saga_persistence.rb +21 -21
  337. data/lib/hecks/runtime/registry/verification.rb +36 -26
  338. data/lib/hecks/runtime/registry.rb +56 -27
  339. data/lib/hecks/runtime/remote_dispatcher.rb +38 -23
  340. data/lib/hecks/runtime/routing.rb +10 -88
  341. data/lib/hecks/runtime/saga_interpreter/correlation.rb +17 -17
  342. data/lib/hecks/runtime/saga_interpreter.rb +93 -56
  343. data/lib/hecks/runtime/saga_pending_dispatch.rb +12 -12
  344. data/lib/hecks/runtime/tenant_check.rb +9 -9
  345. data/lib/hecks/runtime/tenant_scope.rb +5 -5
  346. data/lib/hecks/runtime/value/admission.rb +75 -30
  347. data/lib/hecks/runtime/value/coercion.rb +379 -226
  348. data/lib/hecks/runtime/value/entity_list_coercion.rb +248 -0
  349. data/lib/hecks/runtime/value.rb +28 -23
  350. data/lib/hecks/runtime.rb +7 -7
  351. data/lib/hecks/storehouse.rb +64 -64
  352. data/lib/hecks/version.rb +3 -3
  353. data/lib/hecks/vocabulary.rb +207 -5
  354. data/lib/hecks.rb +13 -11
  355. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +11 -11
  356. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +14 -12
  357. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +11 -11
  358. metadata +43 -2
@@ -1,32 +1,19 @@
1
1
  module Hecks
2
2
  module Projections
3
3
  module Model
4
- # HOW THE MODEL'S SHAPE DIFFERS FROM THE LANGUAGE'S, and why.
4
+ # How the model's shape differs from the language's, and why.
5
5
  #
6
6
  # Every construct's `emits_ir` restates what the grammar declares —
7
7
  # and the two legitimately differ, in seven ways. These lived only
8
8
  # as prose in Ruby comments until spec/model_shape_conformance_spec
9
- # made them checkable; they live HERE so the generator and the gate
9
+ # made them checkable; they live here so the generator and the gate
10
10
  # read one source rather than two that must agree.
11
11
  #
12
12
  # A reason is carried beside each entry because the generated file
13
- # will CARRY it: a deviation is exactly the kind of thing whose
13
+ # will carry it: a deviation is exactly the kind of thing whose
14
14
  # explanation must survive regeneration, and the only way it can is
15
15
  # to be emitted rather than typed into the output.
16
16
  module Deviations
17
- # The grammar is relational — a Command points UP at its
18
- # Aggregate — where the model composes. An explicit `as:` still
19
- # keeps its `_id` (Command's own `entity_id`, kept as data); the
20
- # parent link itself mints bare now (ADR 0025) — `aggregate` or
21
- # `bluebook`, whichever this category's creating command declares
22
- # first — so both spellings are checked. Entity spells its own
23
- # (separate, non-colliding) text twin of the parent link `owner`.
24
- PARENT_REF = ->(field) { field.to_s.match?(/_id\z/) || %i[owner aggregate bluebook].include?(field) }
25
-
26
- # The judge's own field, never the model's — contracts.rb already
27
- # says so with `derived: { position: :walk }`.
28
- JUDGE_ONLY = %i[position].freeze
29
-
30
17
  # What the model holds that the grammar declares elsewhere: the
31
18
  # containment edges, stated in syntax.bluebook's Keyword rows as
32
19
  # `context` -> `opens`.
@@ -64,7 +51,7 @@ module Hecks
64
51
  "Policy" => { where_ast: "the structured form of `where`, derived from the same text at emission" }
65
52
  }.freeze
66
53
 
67
- # DECLARED, AND DELIBERATELY NOT EMITTED. The category that had no
54
+ # **Declared, and deliberately not emitted**. The category that had no
68
55
  # home anywhere before — each of these was a comment and nothing
69
56
  # more.
70
57
  OFF_THE_WIRE = {
@@ -85,6 +72,20 @@ module Hecks
85
72
 
86
73
  module_function
87
74
 
75
+ # The grammar is relational — a Command points up at its
76
+ # Aggregate — where the model composes. An explicit `as:` still
77
+ # keeps its `_id` (Command's own `entity_id`, kept as data); the
78
+ # parent link itself mints bare now (ADR 0025) — `aggregate` or
79
+ # `bluebook`, whichever this category's creating command declares
80
+ # first. Entity spells its own (separate, non-colliding) text twin
81
+ # of the parent link `owner`. Not restated here: the one list is
82
+ # `Assembly::PARENT_POINTERS`, which the assembly gate reads too.
83
+ def parent_ref?(field) = Hecks::Bluebook::Assembly.parent_pointer?(field)
84
+
85
+ # The judge's own fields, never the model's — read off the
86
+ # category's contract (`derived: { position: :walk }`), not restated.
87
+ def judge_only(name) = Hecks::Bluebook::Assembly.contract(name).walked
88
+
88
89
  # The tables that carry a reason answer with names only when the
89
90
  # caller wants the set rather than the explanations.
90
91
  def off_the_wire(name) = OFF_THE_WIRE.fetch(name, {}).keys
@@ -3,22 +3,22 @@ require_relative "../projector"
3
3
 
4
4
  module Hecks
5
5
  module Projections
6
- # THE MODEL CLASSES, PROJECTED FROM THE LANGUAGE THAT DECLARES THEM.
6
+ # The model classes, projected from the language that declares them.
7
7
  #
8
- # A construct's HOLDING half — its readers, its emission, a
8
+ # A construct's holding half — its readers, its emission, a
9
9
  # constructor that assigns declared fields and hands off — restates
10
10
  # what `bluebook.bluebook` already says, three times over in Ruby.
11
11
  # This renders it instead.
12
12
  #
13
- # ONLY THE HOLDING HALF. `Behaviour::X` is hand-written and permanent,
13
+ # **Only the holding half**. `Behaviour::X` is hand-written and permanent,
14
14
  # and `settle` is the seam: everything a declaration cannot state
15
15
  # lives behind it, so regenerating can never be lossy. That property
16
16
  # was established construct by construct before any of this was
17
17
  # written — the chapter looked generatable and was not, until its
18
18
  # `@hecks_root`, ports table and child stamping moved behind `settle`.
19
19
  #
20
- # THE HOST MANIFEST IS THE HONEST PART. The grammar states the fields;
21
- # it does not state which constructs are Ruby CLASSES rather than
20
+ # The HOST manifest is the honest part. The grammar states the fields;
21
+ # it does not state which constructs are Ruby classes rather than
22
22
  # instances, what a constructor's defaults are, or how a value is
23
23
  # coerced on the way in. Those are facts about Ruby, not about
24
24
  # bluebooks, so they are declared here rather than pretended into the
@@ -29,7 +29,7 @@ module Hecks
29
29
 
30
30
  projects_as :model, declares: "Bluebook", emits: :files
31
31
 
32
- # PER-CONSTRUCT RUBY FACTS. `coerce` is the only fiddly column: a
32
+ # **Per-construct Ruby facts**. `coerce` is the only fiddly column: a
33
33
  # declared field arrives as whatever the builder handed over, and
34
34
  # each construct has always normalised its own on the way in.
35
35
  HOST = {
@@ -37,21 +37,25 @@ module Hecks
37
37
  construct: "Policy",
38
38
  file: "policy.rb",
39
39
  behaviour: "Behaviour::Policy",
40
- readers: %i[name on_event trigger_command target_domain where for_each with_spec],
40
+ readers: %i[name on_event trigger_command target_domain expect_undelivered where for_each with_spec],
41
41
  accessors: %i[aggregate],
42
42
  defaults: { name: nil, on_event: "nil", trigger_command: "nil",
43
- target_domain: "nil", where: "nil", for_each: "nil",
43
+ target_domain: "nil", expect_undelivered: "false", where: "nil", for_each: "nil",
44
44
  with_spec: "[]", aggregate: "nil" },
45
- coerce: { name: ".to_s", aggregate: "&.to_s" },
46
- # A LIST OF BINDINGS IS NOT A SCALAR ON THE WIRE. Every other
45
+ # A flag on the wire is a boolean — the language holds it as
46
+ # text ("true"), the builder hands over `true`, and a
47
+ # reconstruction hands back whichever it read; all three land
48
+ # as the same `true`/`false`.
49
+ coerce: { name: ".to_s", aggregate: "&.to_s", expect_undelivered: ".to_s == \"true\"" },
50
+ # A list of bindings is not a scalar on the wire. Every other
47
51
  # field emits as itself; this one has to render the way
48
52
  # `DispatchSpec`'s own `with_spec` does — keys to strings, and
49
- # `render_value` KEEPING the leading colon on a Symbol, because
53
+ # `render_value` keeping the leading colon on a Symbol, because
50
54
  # a binding that reads an event field and one that supplies a
51
55
  # literal string are otherwise indistinguishable once written
52
56
  # down (see `MetaValidator::Readings`' own note on exactly that).
53
57
  renders: { with_spec: "-> { with_spec.map { |key, value| [key.to_s, Bluebook.render_value(value)] } }",
54
- # COMPUTED (Deviations::COMPUTED["Policy"]): the structured
58
+ # Computed (Deviations::COMPUTED["Policy"]): the structured
55
59
  # form of `where`, a pure function of that text, the same
56
60
  # `ast` every rule row carries beside its `canonical`.
57
61
  where_ast: "-> { where_ast }" },
@@ -67,8 +71,8 @@ module Hecks
67
71
 
68
72
  def render(bluebook, name, host)
69
73
  <<~RUBY
70
- # GENERATED — projected from the language's own #{name} aggregate.
71
- # DO NOT EDIT: the holding half is rendered, and #{host.fetch(:behaviour)}
74
+ # Generated — projected from the language's own #{name} aggregate.
75
+ # Do not edit: the holding half is rendered, and #{host.fetch(:behaviour)}
72
76
  # is where anything hand-written belongs.
73
77
  require_relative "behaviour/#{File.basename(host.fetch(:file), '.rb')}"
74
78
 
@@ -91,9 +95,9 @@ module Hecks
91
95
 
92
96
  # The emission, keyed as the model spells it and sourced as the
93
97
  # language declares it.
94
- # A COMPUTED field (Deviations::COMPUTED) is emitted too — it is
98
+ # A computed field (Deviations::COMPUTED) is emitted too — it is
95
99
  # model-only by definition, so it rides after the declared fields
96
- # and MUST have a `renders` entry, there being nothing to `send`.
100
+ # and must have a `renders` entry, there being nothing to `send`.
97
101
  def emits(bluebook, name)
98
102
  fields = emitted_fields(bluebook, name) + Deviations.computed(name)
99
103
  renders = HOST.fetch(name).fetch(:renders, {})
@@ -102,14 +106,14 @@ module Hecks
102
106
  "emits_ir(\n#{fields.map { |f| " #{"#{f}:".ljust(width + 1)} #{renders.fetch(f, ":#{f}")}" }.join(",\n")}\n)"
103
107
  end
104
108
 
105
- # WHAT THE CONSTRUCT EMITS: what the language declares, less every
109
+ # What the construct emits: what the language declares, less every
106
110
  # deviation the tables account for. The generator and
107
111
  # spec/model_shape_conformance_spec compute this the same way, from
108
112
  # the same tables, which is the point of the tables being in lib.
109
113
  def emitted_fields(bluebook, name)
110
114
  bluebook.aggregate(name).attributes.map(&:name)
111
- .reject { |f| Deviations::PARENT_REF.call(f) } -
112
- Deviations::JUDGE_ONLY -
115
+ .reject { |f| Deviations.parent_ref?(f) } -
116
+ Deviations.judge_only(name) -
113
117
  Deviations.off_the_wire(name) -
114
118
  Deviations.dynamic_tail(name) -
115
119
  Deviations.folded(name).values.flatten -
@@ -122,13 +126,13 @@ module Hecks
122
126
  return lines.join("\n") if accessors.empty?
123
127
 
124
128
  # A declared field the model deliberately does not emit still
125
- # needs a reader, and the REASON it is off the wire is carried
129
+ # needs a reader, and the reason it is off the wire is carried
126
130
  # here rather than typed in — a comment that survives
127
131
  # regeneration is one the generator writes.
128
132
  reasons = Deviations::OFF_THE_WIRE.fetch(host.fetch(:construct, ""), {})
129
133
  (lines + accessors.map do |a|
130
134
  why = reasons[a]
131
- (why ? "\n# #{a.upcase}, DECLARED AND DELIBERATELY OFF THE WIRE\n# #{wrap(why)}\n" : "") +
135
+ (why ? "\n# #{a.to_s.capitalize}, declared and deliberately off the wire\n# #{wrap(why)}\n" : "") +
132
136
  "attr_accessor :#{a}"
133
137
  end).join("\n")
134
138
  end
@@ -3,16 +3,16 @@ require_relative "../projector"
3
3
 
4
4
  module Hecks
5
5
  module Projections
6
- # AN OIDC CLIENT/SCOPE MANIFEST derived from a domain's own IR: what
6
+ # An OIDC client/scope manifest derived from a domain's own IR: what
7
7
  # an identity provider has to know about this domain before it can
8
8
  # issue a token that means anything here.
9
9
  #
10
- # THE ARTIFACT HALF OF SOMETHING ALREADY HALF-BUILT.
11
- # `spec/oidc_projection_spec.rb` covers the INTEGRATION half — verified
10
+ # The artifact half of something already half-built.
11
+ # `spec/oidc_projection_spec.rb` covers the integration half — verified
12
12
  # claims in, `IdentityResolution.resolve` → `Authorization.holds_role?`
13
13
  # → a dispatch scoped by `Hecks.as_caller(role:)`. That half enforces
14
14
  # a role per command. It just had no way to say, up front and as data,
15
- # WHICH role each command wants — every answer came from asking the
15
+ # which role each command wants — every answer came from asking the
16
16
  # live runtime one dispatch at a time.
17
17
  #
18
18
  # This is that catalogue, and the two are checked against each other
@@ -24,12 +24,12 @@ module Hecks
24
24
  # `Ports::Authorization.holds_role?` compares against a real
25
25
  # `Governance::RoleAssignment`.
26
26
  #
27
- # ROLES COME FROM THE COMMANDS, NOT FROM GOVERNANCE. A command's own
27
+ # Roles come from the commands, not from governance. A command's own
28
28
  # `role "Compliance officer"` is in the bluebook IR
29
29
  # (`Command#role`), whereas `uses_framework "Governance"` is
30
30
  # declared in the `.hecksagon` — which `call(bluebook:, options:)`
31
31
  # cannot see at all. Reading the commands is both the only thing
32
- # available here AND the more accurate source: it says what each
32
+ # available here and the more accurate source: it says what each
33
33
  # command actually demands, not merely which role vocabulary the
34
34
  # application happened to mount.
35
35
  #
@@ -93,7 +93,7 @@ module Hecks
93
93
  end
94
94
 
95
95
  # `banking:account.open` — the shape an OIDC scope is conventionally
96
- # spelled in, and snake_cased through the SAME `Naming.snake` the
96
+ # spelled in, and snake_cased through the same `Naming.snake` the
97
97
  # facade uses to name a command's own door method, so a scope and
98
98
  # the Ruby call that satisfies it cannot drift apart.
99
99
  def command_scopes(commands, verb_prefix, scope_prefix)
@@ -2,12 +2,12 @@ require_relative "../projector"
2
2
 
3
3
  module Hecks
4
4
  module Projections
5
- # THE RUST PARSER'S KEYWORD TABLE, projected from the chapter's own
6
- # Syntax aggregate — "the parser's grammar knowledge is DERIVED from
5
+ # The Rust parser's keyword table, projected from the chapter's own
6
+ # Syntax aggregate — "the parser's grammar knowledge is derived from
7
7
  # hecks's self-description, not hand-typed a second time", which
8
8
  # is the anti-drift idea the whole Rust-parser plan rests on.
9
9
  #
10
- # A REGISTERED TARGET NOW, rather than a module living inside its own
10
+ # A registered target now, rather than a module living inside its own
11
11
  # bin/ script. It was already a projection in everything but call
12
12
  # shape; this only stops it being a fifth way of spelling one.
13
13
  module ParserTable
@@ -20,7 +20,7 @@ module Hecks
20
20
 
21
21
  module_function
22
22
 
23
- # THE CHAPTER IS HANDED OVER, not reached for. This used to open the
23
+ # The chapter is handed over, not reached for. This used to open the
24
24
  # grammar registry itself, which meant the projection could only ever
25
25
  # project one chapter — the language's own. Taking it as an argument is
26
26
  # what the projector protocol asks for, and it costs nothing.
@@ -64,7 +64,7 @@ module Hecks
64
64
 
65
65
  # S14, ADR 0026 — Keyword/Argument are genuine entities of Syntax
66
66
  # now, dispatched (not merely declared) so their own `status`
67
- # really is a lifecycle. `SyntaxBoot.call` reads the STILL-STATIC
67
+ # really is a lifecycle. `SyntaxBoot.call` reads the still-static
68
68
  # seed rows (`KeywordSeed`/`ArgumentSeed`), dispatches each one
69
69
  # through the real admission/lifecycle door, and hands back the
70
70
  # exact same shape `rows` used to read straight off the closed set
@@ -3,18 +3,18 @@ require_relative "../projector"
3
3
 
4
4
  module Hecks
5
5
  module Projections
6
- # THE DSL REFERENCE PAGES, projected from the chapter's own Syntax
6
+ # The DSL reference pages, projected from the chapter's own Syntax
7
7
  # aggregate — the tables come from the declaration, the prose is
8
8
  # preserved from whatever is already committed.
9
9
  #
10
- # THE FIRST PROJECTION THAT EMITS A TREE. `emits: :files` says so,
10
+ # The first projection that emits a tree. `emits: :files` says so,
11
11
  # and the framework writes the map rather than inferring one: a Hash
12
12
  # of path => contents and a Hash that merely holds strings are the
13
13
  # same object to Ruby, so only the projection can know which it
14
14
  # meant. This is the case the output contract was designed for and
15
15
  # deliberately left unimplemented until something real needed it.
16
16
  #
17
- # NOT PURE, and it cannot be. `Doc::Reference.pages` READS the
17
+ # Not pure, and it cannot be. `Doc::Reference.pages` reads the
18
18
  # committed pages to harvest their prose, so the existing directory
19
19
  # is an input — passed as `from:` rather than assumed, so the
20
20
  # projection never reaches for a path of its own choosing.