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
@@ -2,7 +2,7 @@ require_relative "../projector"
2
2
 
3
3
  module Hecks
4
4
  module Projections
5
- # A DOMAIN'S OWN DECLARED FACTS, PROJECTED AS PLAIN ENGLISH SENTENCES
5
+ # A domain's own declared facts, projected as plain english sentences
6
6
  # — one atomic, independently-checkable statement per fact, not a
7
7
  # flowing document (`Projections::Reference`/`DocsProjector` already
8
8
  # do that job well; this is a flat list a caller can iterate, diff,
@@ -10,27 +10,30 @@ module Hecks
10
10
  # a sanity check that the domain still says what someone thinks it
11
11
  # says).
12
12
  #
13
- # NEVER INVENTS A SENTENCE FROM NOTHING — `DocsProjector`'s own
14
- # discipline, held here too: a relationship's sentence is built
15
- # MECHANICALLY from its own declared shape (holder, target,
16
- # relationship kind — the same facts `Projections::Diagrams`'s own
17
- # relationship_edge already reads), and an invariant's sentence IS
18
- # the domain author's own `description`, capitalized and
19
- # punctuated, never paraphrased. If a fact has no author-written
20
- # description and no unambiguous mechanical phrasing, it doesn't
21
- # get a sentence here — a wrong sentence is worse than a missing
22
- # one.
13
+ # ## Never invents a sentence from nothing
23
14
  #
24
- # REACHABLE THE SAME WAY EVERY PROJECTION ALREADY IS, no new facade
25
- # wiring needed: `Pizzas.project(Projections::Statements)` —
26
- # `Facade::Surface::Chapter#project`'s own comment already settled
15
+ # `DocsProjector`'s own discipline, held here too: a relationship's
16
+ # sentence is built mechanically from its own declared shape (holder,
17
+ # target, relationship kind — the same facts `Projections::Diagrams`'s
18
+ # own relationship_edge already reads), and an invariant's sentence is
19
+ # the domain author's own `description`, capitalized and punctuated,
20
+ # never paraphrased. If a fact has no author-written description and
21
+ # no unambiguous mechanical phrasing, it doesn't get a sentence here —
22
+ # a wrong sentence is worse than a missing one.
23
+ #
24
+ # ## Reachable like any projection
25
+ #
26
+ # No new facade wiring needed: `Pizzas.project(Projections::Statements)`
27
+ # — `Facade::Surface::Chapter#project`'s own comment already settled
27
28
  # this ("anything genuinely needing the graph is a projector, and a
28
29
  # projector is given it"). `bin/statements` is a thin, optional
29
30
  # convenience for reaching the same call from a shell.
30
31
  #
31
- # MVP SCOPE: "has many"/"has a"/"belongs to"/"references" sentences
32
- # for every list or relationship attribute, and every invariant's
33
- # own description (aggregate-level and every nested value object's),
32
+ # ## MVP scope
33
+ #
34
+ # "has many"/"has a"/"belongs to"/"references" sentences for every
35
+ # list or relationship attribute, and every invariant's own
36
+ # description (aggregate-level and every nested value object's),
34
37
  # verbatim. Lifecycle transitions and command given/ensures read the
35
38
  # same way and are the natural next sentences — not built yet.
36
39
  module Statements
@@ -40,17 +43,35 @@ module Hecks
40
43
 
41
44
  module_function
42
45
 
46
+ # Projects every reachable fact in the chapter into its flat sentence list.
47
+ #
48
+ # @param bluebook [Bluebook::Chapter] the chapter being projected
49
+ # @param options [Hash{Symbol => Object}] ignored; present to satisfy the
50
+ # `Projector::Target` calling convention
51
+ # @return [Array<String>] one sentence per attribute relationship and invariant,
52
+ # in holder order
43
53
  def call(bluebook:, options: {})
44
54
  holders(bluebook).flat_map { |holder| statements_for(holder) }
45
55
  end
46
56
 
57
+ # Every construct that can carry its own attributes and invariants — an
58
+ # aggregate and each of its entities.
59
+ #
60
+ # @param bluebook [Bluebook::Chapter] the chapter being walked
61
+ # @return [Array<Bluebook::Aggregate, Bluebook::Entity>] every aggregate followed
62
+ # by its own entities, in declaration order
47
63
  def holders(bluebook) = bluebook.aggregates.flat_map { |aggregate| [aggregate, *aggregate.entities] }
48
64
 
65
+ # All of one holder's sentences: its attribute relationships, then its invariants.
66
+ #
67
+ # @param holder [Bluebook::Aggregate, Bluebook::Entity] the construct being
68
+ # projected
69
+ # @return [Array<String>] the holder's sentences
49
70
  def statements_for(holder)
50
71
  attribute_statements(holder) + invariant_statements(holder)
51
72
  end
52
73
 
53
- # "MANY" READS THE SAME WAY REGARDLESS OF WHAT'S BEHIND IT — a
74
+ # "MANY" reads the same way regardless of what's behind it — a
54
75
  # `has_many` relationship to another aggregate and a plain
55
76
  # `list_of(Topping)` value-object attribute are the same idea to
56
77
  # someone reading the domain in English ("an Order has many
@@ -60,10 +81,24 @@ module Hecks
60
81
  # name, because the field's own name is what the domain author
61
82
  # actually chose to call the collection — "toppings", not
62
83
  # "Topping".
84
+ # Projects every one of a holder's attributes that says something in plain
85
+ # English — a list, or a named relationship.
86
+ #
87
+ # @param holder [Bluebook::Aggregate, Bluebook::Entity] the construct whose
88
+ # attributes are being read
89
+ # @return [Array<String>] one sentence per list or relationship attribute; a
90
+ # plain scalar attribute contributes none
63
91
  def attribute_statements(holder)
64
92
  holder.attributes.filter_map { |attribute| attribute_statement(holder, attribute) }
65
93
  end
66
94
 
95
+ # Projects one attribute's relationship, if it has one worth stating.
96
+ #
97
+ # @param holder [Bluebook::Aggregate, Bluebook::Entity] the attribute's owning
98
+ # construct, named as the sentence's subject
99
+ # @param attribute [Bluebook::Attribute] the attribute being projected
100
+ # @return [String, nil] the sentence, or `nil` if `attribute` is neither a list
101
+ # nor a `has_one`/`belongs_to`/`reference_to` relationship
67
102
  def attribute_statement(holder, attribute)
68
103
  subject = "#{article(holder.hecks_name)} #{holder.hecks_name}"
69
104
  return "#{subject} has many #{attribute.name}." if attribute.list?
@@ -77,29 +112,41 @@ module Hecks
77
112
  end
78
113
  end
79
114
 
80
- # "AN ACCOUNT", NOT "A ACCOUNT" — every subject/object noun here is
115
+ # "An account", not "A ACCOUNT" — every subject/object noun here is
81
116
  # a bare construct name (`ATMCard`, `ExternalTransfer`, `Account`),
82
117
  # never free text, so the ordinary "starts with a vowel LETTER"
83
118
  # heuristic is safe: this language's own naming never produces the
84
119
  # English exceptions that heuristic gets wrong (an "hour", a
85
120
  # "university") because a construct name is always spelled as a
86
121
  # plain word, never an abbreviation read letter-by-letter or a
87
- # word starting with a consonant LETTER but a vowel SOUND.
122
+ # word starting with a consonant letter but a vowel sound.
123
+ #
124
+ # @param word [String] a construct name to prefix
125
+ # @return [String] `"An"` if `word` starts with a vowel letter, `"A"` otherwise
88
126
  def article(word) = word.to_s.match?(/\A[AEIOUaeiou]/) ? "An" : "A"
89
127
 
90
- # INVARIANTS LIVE IN TWO PLACES — directly on the holder (an
128
+ # Invariants live in two places — directly on the holder (an
91
129
  # aggregate-level rule, checked after every command) and on every
92
130
  # value object nested inside it — `DocsProjector#rules_of`'s own
93
131
  # `value_object_for` lookup is the precedent for walking both.
132
+ #
133
+ # @param holder [Bluebook::Aggregate, Bluebook::Entity] the construct whose
134
+ # invariants, and whose value objects' invariants, are being read
135
+ # @return [Array<String>] one sentence per invariant, the holder's own first,
136
+ # then each nested value object's
94
137
  def invariant_statements(holder)
95
138
  own = Array(holder.respond_to?(:invariants) ? holder.invariants : [])
96
139
  nested = Array(holder.respond_to?(:value_objects) ? holder.value_objects : []).flat_map(&:invariants)
97
140
  (own + nested).map { |invariant| invariant_statement(invariant) }
98
141
  end
99
142
 
100
- # THE DOMAIN AUTHOR'S OWN WORDS, CAPITALIZED AND PUNCTUATED —
143
+ # The domain author's own words, capitalized and punctuated —
101
144
  # nothing else. `invariant("a pizza is named")` already reads as
102
145
  # a sentence; this is the entire transformation.
146
+ #
147
+ # @param invariant [Bluebook::Invariant] the invariant being projected
148
+ # @return [String] the invariant's `description`, capitalized, ending with `.`,
149
+ # `!` or `?`
103
150
  def invariant_statement(invariant)
104
151
  text = invariant.description.to_s.strip
105
152
  text = "#{text[0].upcase}#{text[1..]}" if text[0]
@@ -2,20 +2,20 @@ require_relative "../projector"
2
2
 
3
3
  module Hecks
4
4
  module Projections
5
- # THE CLOSED SETS, PROJECTED — lib/hecks/vocabulary.rb rendered
5
+ # **The closed sets, projected** — lib/hecks/vocabulary.rb rendered
6
6
  # from whichever chapter declares a `Vocabulary` aggregate, which in
7
7
  # practice is the language projecting its own tables.
8
8
  #
9
9
  # Projector.call(:vocabulary, bluebook: <the Bluebook chapter>)
10
10
  #
11
- # A PROJECTION RATHER THAN A BIN/ SCRIPT, and that correction is the
11
+ # A projection rather than a bin/ script, and that correction is the
12
12
  # point of it. This was first written as its own program with its own
13
13
  # call shape, beside `bin/project_parser_table`, `bin/reference` and
14
14
  # `bin/expression_projection` — four tools doing "canonical IR in,
15
15
  # external artifact out" four different ways, which is the exact
16
16
  # thing the projector registry exists to stop.
17
17
  #
18
- # Reads the chapter's JUDGED IR, so what is written out is what the
18
+ # Reads the chapter's judged IR, so what is written out is what the
19
19
  # language actually holds rather than what a builder happened to
20
20
  # produce.
21
21
  module Vocabulary
@@ -24,10 +24,10 @@ module Hecks
24
24
  projects_as :vocabulary, declares: "Vocabulary"
25
25
 
26
26
  HEADER = <<~RUBY.freeze
27
- # GENERATED — projected from the language's own Vocabulary aggregate
27
+ # Generated — projected from the language's own Vocabulary aggregate
28
28
  # (lib/hecks/language/bluebook/vocabulary.bluebook).
29
29
  #
30
- # DO NOT EDIT. spec/vocabulary_table_spec.rb re-projects this in memory
30
+ # Do not edit. spec/vocabulary_table_spec.rb re-projects this in memory
31
31
  # and refuses a diff, so an edit here fails the ordinary suite.
32
32
  #
33
33
  # Plain data on purpose — no requires, no dependency on the model —
@@ -40,22 +40,39 @@ module Hecks
40
40
 
41
41
  # The projector protocol. `options` is unused: a vocabulary table
42
42
  # has nothing to vary.
43
+ #
44
+ # @param bluebook [Bluebook::Behaviour::Chapter] the chapter declaring the
45
+ # Vocabulary aggregate to project
46
+ # @param options [Hash] unused; accepted to satisfy the registry's call shape
47
+ # @return [String] the rendered `lib/hecks/vocabulary.rb` source
43
48
  def call(bluebook:, options: {}) = render(bluebook)
44
49
 
45
- # FULL ROWS, not just the first field of each.
50
+ # Full rows, not just the first field of each.
46
51
  #
47
- # Most vocabularies ARE one-field lists and the field is the term.
52
+ # Most vocabularies are one-field lists and the field is the term.
48
53
  # Several are not: `Comparison` declares the algebra each operator
49
54
  # computes with, `RefusalTemplate` an error plus its key and text.
50
55
  # Taking the first field of those produced a list of thirty-nine
51
56
  # duplicated error names — well-formed and meaningless. So rows are
52
57
  # carried whole, and the terms are derived from them.
58
+ #
59
+ # @param bluebook [Bluebook::Behaviour::Chapter] the chapter declaring the
60
+ # Vocabulary aggregate to read
61
+ # @return [Hash{String => Array<Hash{String => String}>}] each closed set's name,
62
+ # mapped to its member rows with every field stringified
53
63
  def tables(bluebook)
54
64
  bluebook.aggregate("Vocabulary").value_objects.to_h do |vo|
55
65
  [vo.hecks_name, vo.members.map { |row| row.to_h.transform_keys(&:to_s).transform_values(&:to_s) }]
56
66
  end
57
67
  end
58
68
 
69
+ # Renders `lib/hecks/vocabulary.rb`'s full source: the frozen `TABLES`
70
+ # and `TERMS` constants and the `fetch`/`rows`/`symbols`/`names` reader
71
+ # methods, built from `bluebook`'s declared closed sets.
72
+ #
73
+ # @param bluebook [Bluebook::Behaviour::Chapter] the chapter declaring the
74
+ # Vocabulary aggregate to render
75
+ # @return [String] the generated Ruby source, ready to write to disk
59
76
  def render(bluebook)
60
77
  rows = tables(bluebook).sort_by(&:first).map do |name, members|
61
78
  " #{name.inspect} => [\n#{members.map { |row| " #{row.inspect}.freeze" }.join(",\n")}\n ].freeze"
@@ -69,8 +86,8 @@ module Hecks
69
86
  #{rows.join(",\n")}
70
87
  }.freeze
71
88
 
72
- # THE TERMS — the first field of each row, which for a
73
- # one-field vocabulary is the whole of it. Derived ONCE and
89
+ # The terms — the first field of each row, which for a
90
+ # one-field vocabulary is the whole of it. Derived once and
74
91
  # frozen rather than mapped per call: these are constant
75
92
  # tables, and a constant that allocates a new array every
76
93
  # time it is read is not one.
@@ -1,7 +1,7 @@
1
1
  require_relative "projector"
2
2
 
3
3
  module Hecks
4
- # THE TARGETS A DOMAIN CAN BE PROJECTED INTO, as constants rather than
4
+ # The targets a domain can be projected into, as constants rather than
5
5
  # bare symbols — `Pizzas.project(Projections::OIDC)`.
6
6
  #
7
7
  # A constant is worth the namespace for two reasons a Symbol cannot
@@ -10,9 +10,9 @@ module Hecks
10
10
  # carry its own documentation and defaults.
11
11
  #
12
12
  # Namespaced rather than top-level because `IR` is already taken —
13
- # `Hecks::Bluebook` is the MODEL (`Bluebook::Command`, and the
13
+ # `Hecks::Bluebook` is the model (`Bluebook::Command`, and the
14
14
  # chapter class itself).
15
- # `Projections::IR` is the projection OF that model, a different thing
15
+ # `Projections::IR` is the projection of that model, a different thing
16
16
  # that would be genuinely confusing under the same bare name.
17
17
  #
18
18
  # `include Hecks::Projections` gets the short spelling where the
@@ -26,6 +26,8 @@ require_relative "projections/shape"
26
26
  require_relative "projections/oidc"
27
27
  require_relative "projections/vocabulary"
28
28
  require_relative "projections/parser_table"
29
+ require_relative "projections/bootstrap_table"
30
+ require_relative "projections/rust_vocabulary"
29
31
  require_relative "projections/reference"
30
32
  require_relative "projections/model"
31
33
  require_relative "projections/diagrams"