hecks 2.8.0 → 2.9.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 (404) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +4 -6
  3. data/lib/hecks/adapters/driven/claude_code.rb +4 -104
  4. data/lib/hecks/adapters/driven/d1.rb +44 -237
  5. data/lib/hecks/adapters/driven/folder.rb +17 -76
  6. data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
  7. data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
  8. data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
  9. data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
  10. data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
  11. data/lib/hecks/adapters/driven/heki.rb +13 -42
  12. data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
  13. data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
  14. data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
  15. data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
  16. data/lib/hecks/adapters/driven/lambda.rb +10 -84
  17. data/lib/hecks/adapters/driven/local_storage.rb +5 -40
  18. data/lib/hecks/adapters/driven/memory.rb +17 -98
  19. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
  20. data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
  21. data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
  22. data/lib/hecks/adapters/driven/postgres/reconnect.rb +4 -30
  23. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
  24. data/lib/hecks/adapters/driven/postgres.rb +145 -134
  25. data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
  26. data/lib/hecks/adapters/driven/prism.rb +7 -30
  27. data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
  28. data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
  29. data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
  30. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
  31. data/lib/hecks/adapters/driven/sqlite.rb +128 -65
  32. data/lib/hecks/adapters/driven/tenant_provisioner.rb +5 -48
  33. data/lib/hecks/adapters/driven.rb +5 -36
  34. data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
  35. data/lib/hecks/behaviors/dsl.rb +7 -25
  36. data/lib/hecks/behaviors/expectations.rb +31 -141
  37. data/lib/hecks/behaviors/ir.rb +7 -20
  38. data/lib/hecks/behaviors/rspec.rb +6 -17
  39. data/lib/hecks/behaviors/runner.rb +10 -34
  40. data/lib/hecks/behaviors.rb +4 -8
  41. data/lib/hecks/bluebook/aggregate.rb +9 -75
  42. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
  43. data/lib/hecks/bluebook/assembly/build.rb +4 -15
  44. data/lib/hecks/bluebook/assembly/contract.rb +15 -136
  45. data/lib/hecks/bluebook/assembly/contracts.rb +54 -174
  46. data/lib/hecks/bluebook/assembly/marks.rb +31 -223
  47. data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
  48. data/lib/hecks/bluebook/assembly.rb +6 -45
  49. data/lib/hecks/bluebook/attribute.rb +12 -61
  50. data/lib/hecks/bluebook/behaviour/aggregate.rb +10 -39
  51. data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
  52. data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
  53. data/lib/hecks/bluebook/behaviour/command.rb +14 -66
  54. data/lib/hecks/bluebook/behaviour/domain_port.rb +4 -20
  55. data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
  56. data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
  57. data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
  58. data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
  59. data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
  60. data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
  61. data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
  62. data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
  63. data/lib/hecks/bluebook/capabilities.rb +17 -49
  64. data/lib/hecks/bluebook/chapter.rb +10 -48
  65. data/lib/hecks/bluebook/command.rb +23 -81
  66. data/lib/hecks/bluebook/domain_port.rb +14 -63
  67. data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
  68. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
  69. data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
  70. data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
  71. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +86 -708
  72. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +56 -170
  73. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +1 -0
  74. data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
  75. data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
  76. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +12 -87
  77. data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
  78. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
  79. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +26 -194
  80. data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
  81. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
  82. data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
  83. data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
  84. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
  85. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
  86. data/lib/hecks/bluebook/dsl/query_builder.rb +11 -42
  87. data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
  88. data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
  89. data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
  90. data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
  91. data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
  92. data/lib/hecks/bluebook/dsl/world_builder.rb +19 -111
  93. data/lib/hecks/bluebook/entity.rb +13 -71
  94. data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
  95. data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
  96. data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
  97. data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
  98. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
  99. data/lib/hecks/bluebook/expression/resolver.rb +37 -660
  100. data/lib/hecks/bluebook/hexagon.rb +5 -28
  101. data/lib/hecks/bluebook/lifecycle.rb +5 -16
  102. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
  103. data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
  104. data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
  105. data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
  106. data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
  107. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +24 -176
  108. data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
  109. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +43 -305
  110. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
  111. data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
  112. data/lib/hecks/bluebook/meta_validator.rb +79 -349
  113. data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
  114. data/lib/hecks/bluebook/model_check.rb +100 -597
  115. data/lib/hecks/bluebook/pattern_subset.rb +11 -69
  116. data/lib/hecks/bluebook/process_manager.rb +13 -83
  117. data/lib/hecks/bluebook/project_loader.rb +3 -39
  118. data/lib/hecks/bluebook/project_register.rb +12 -60
  119. data/lib/hecks/bluebook/query.rb +9 -48
  120. data/lib/hecks/bluebook/read_model.rb +57 -81
  121. data/lib/hecks/bluebook/reference.rb +7 -41
  122. data/lib/hecks/bluebook/smoke_test.rb +8 -98
  123. data/lib/hecks/bluebook/synthesizer.rb +13 -62
  124. data/lib/hecks/bluebook/translation.rb +26 -62
  125. data/lib/hecks/bluebook/value_object.rb +11 -36
  126. data/lib/hecks/bluebook.rb +5 -22
  127. data/lib/hecks/cache_dir.rb +4 -23
  128. data/lib/hecks/cli/document.rb +3 -21
  129. data/lib/hecks/cli/ir.rb +3 -5
  130. data/lib/hecks/cli/mcp.rb +2 -3
  131. data/lib/hecks/cli/mcp_door.rb +19 -114
  132. data/lib/hecks/cli/model_check.rb +18 -85
  133. data/lib/hecks/cli/project_cli.rb +7 -40
  134. data/lib/hecks/cli/project_diagrams.rb +0 -7
  135. data/lib/hecks/cli/run.rb +12 -58
  136. data/lib/hecks/cli/smoke_test.rb +2 -16
  137. data/lib/hecks/cli/stores.rb +1 -2
  138. data/lib/hecks/cli.rb +18 -24
  139. data/lib/hecks/construct.rb +8 -34
  140. data/lib/hecks/deploy/bluebook/deploy.bluebook +33 -142
  141. data/lib/hecks/deploy/bluebook/deploy.hecksagon +2 -9
  142. data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
  143. data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
  144. data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
  145. data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
  146. data/lib/hecks/embryonaut_bluebook.rb +4 -71
  147. data/lib/hecks/facade/cli_door.rb +24 -106
  148. data/lib/hecks/facade/cli_runner.rb +28 -172
  149. data/lib/hecks/facade/command_request.rb +13 -33
  150. data/lib/hecks/facade/handle.rb +34 -121
  151. data/lib/hecks/facade/json_door.rb +31 -146
  152. data/lib/hecks/facade/surface/aggregate_door.rb +39 -104
  153. data/lib/hecks/facade/surface/chapter.rb +10 -54
  154. data/lib/hecks/facade/surface.rb +8 -23
  155. data/lib/hecks/facade.rb +10 -25
  156. data/lib/hecks/forms/app.rb +15 -70
  157. data/lib/hecks/forms/command_form_renderer.rb +10 -29
  158. data/lib/hecks/forms/field_renderer.rb +17 -156
  159. data/lib/hecks/forms/field_shape.rb +30 -222
  160. data/lib/hecks/forms/html.rb +12 -47
  161. data/lib/hecks/forms/index_renderer.rb +1 -4
  162. data/lib/hecks/forms/page.rb +3 -9
  163. data/lib/hecks/forms/params.rb +14 -60
  164. data/lib/hecks/forms/port_argument.rb +2 -19
  165. data/lib/hecks/forms/query_form_renderer.rb +4 -79
  166. data/lib/hecks/forms/record_renderer.rb +8 -75
  167. data/lib/hecks/forms/record_table.rb +7 -50
  168. data/lib/hecks/forms/reference_options.rb +3 -30
  169. data/lib/hecks/forms/value_object_shape.rb +8 -35
  170. data/lib/hecks/forms.rb +5 -33
  171. data/lib/hecks/fqn.rb +5 -12
  172. data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
  173. data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
  174. data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
  175. data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
  176. data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
  177. data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
  178. data/lib/hecks/framework.rb +11 -80
  179. data/lib/hecks/freezer.rb +5 -39
  180. data/lib/hecks/grammar/expression.bluebook +15 -40
  181. data/lib/hecks/grammar/translation.bluebook +3 -6
  182. data/lib/hecks/grammar.rb +16 -41
  183. data/lib/hecks/ir.rb +14 -83
  184. data/lib/hecks/language/adapter.bluebook +2 -7
  185. data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
  186. data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
  187. data/lib/hecks/language/bluebook/bluebook.bluebook +15 -83
  188. data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
  189. data/lib/hecks/language/bluebook/command.bluebook +27 -144
  190. data/lib/hecks/language/bluebook/entity.bluebook +24 -97
  191. data/lib/hecks/language/bluebook/policy.bluebook +16 -67
  192. data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
  193. data/lib/hecks/language/bluebook/projection.bluebook +126 -60
  194. data/lib/hecks/language/bluebook/query.bluebook +12 -43
  195. data/lib/hecks/language/bluebook/shape.bluebook +23 -73
  196. data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
  197. data/lib/hecks/language/bluebook/vocabulary.bluebook +82 -197
  198. data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
  199. data/lib/hecks/language/hecksagon/domain_port.bluebook +4 -19
  200. data/lib/hecks/language/hecksagon/hecksagon.bluebook +6 -25
  201. data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
  202. data/lib/hecks/language/oidc.json +35 -0
  203. data/lib/hecks/language/port.bluebook +4 -17
  204. data/lib/hecks/language/translation/translation.bluebook +3 -9
  205. data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
  206. data/lib/hecks/language/world/wiring.bluebook +1 -3
  207. data/lib/hecks/language/world/world.bluebook +5 -7
  208. data/lib/hecks/literal.rb +8 -50
  209. data/lib/hecks/mcp_door_scope.rb +9 -90
  210. data/lib/hecks/mcp_stdio_guard.rb +4 -41
  211. data/lib/hecks/naming.rb +29 -137
  212. data/lib/hecks/ports/access_control.rb +7 -23
  213. data/lib/hecks/ports/agent/answers.rb +5 -23
  214. data/lib/hecks/ports/agent.rb +47 -172
  215. data/lib/hecks/ports/authentication.rb +12 -39
  216. data/lib/hecks/ports/authorization.rb +16 -43
  217. data/lib/hecks/ports/clock.rb +5 -45
  218. data/lib/hecks/ports/extraction.rb +7 -12
  219. data/lib/hecks/ports/identity_assignment.rb +8 -29
  220. data/lib/hecks/ports/identity_generation.rb +6 -29
  221. data/lib/hecks/ports/identity_resolution.rb +2 -10
  222. data/lib/hecks/ports/key_vault.rb +9 -45
  223. data/lib/hecks/ports/persistence/append_only.rb +61 -64
  224. data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
  225. data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
  226. data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
  227. data/lib/hecks/ports/persistence/plugin.rb +13 -42
  228. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +38 -141
  229. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
  230. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +16 -84
  231. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
  232. data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +3 -22
  233. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
  234. data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
  235. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
  236. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
  237. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
  238. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
  239. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
  240. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
  241. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +18 -75
  242. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
  243. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
  244. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
  245. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
  246. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
  247. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +14 -115
  248. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
  249. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +127 -554
  250. data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
  251. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
  252. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
  253. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
  254. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
  255. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
  256. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +9 -25
  257. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
  258. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
  259. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
  260. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
  261. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
  262. data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
  263. data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
  264. data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
  265. data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
  266. data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
  267. data/lib/hecks/ports/persistence/state_codec.rb +23 -103
  268. data/lib/hecks/ports/persistence.rb +7 -14
  269. data/lib/hecks/ports/projection.rb +42 -84
  270. data/lib/hecks/ports/query/in_memory.rb +10 -58
  271. data/lib/hecks/ports/query/ordering.rb +11 -32
  272. data/lib/hecks/ports/query.rb +14 -37
  273. data/lib/hecks/ports.rb +2 -8
  274. data/lib/hecks/projections/bootstrap_table.rb +11 -43
  275. data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
  276. data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
  277. data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
  278. data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
  279. data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
  280. data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
  281. data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
  282. data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
  283. data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
  284. data/lib/hecks/projections/deploy/fargate.rb +35 -202
  285. data/lib/hecks/projections/deploy/lambda.rb +150 -678
  286. data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
  287. data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
  288. data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
  289. data/lib/hecks/projections/deploy/preview/script.rb +2 -14
  290. data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
  291. data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
  292. data/lib/hecks/projections/deploy/preview/template.rb +2 -58
  293. data/lib/hecks/projections/deploy/preview.rb +2 -67
  294. data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
  295. data/lib/hecks/projections/deploy/scripts.rb +4 -57
  296. data/lib/hecks/projections/deploy/shared.rb +47 -146
  297. data/lib/hecks/projections/deploy/smoke.rb +4 -61
  298. data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
  299. data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
  300. data/lib/hecks/projections/deploy/template_diff.rb +5 -57
  301. data/lib/hecks/projections/diagrams.rb +20 -582
  302. data/lib/hecks/projections/glossary/html.rb +14 -130
  303. data/lib/hecks/projections/glossary/markdown.rb +8 -69
  304. data/lib/hecks/projections/glossary/mermaid.rb +9 -66
  305. data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
  306. data/lib/hecks/projections/glossary/sentences.rb +14 -159
  307. data/lib/hecks/projections/glossary.rb +30 -222
  308. data/lib/hecks/projections/ir.rb +3 -10
  309. data/lib/hecks/projections/model/deviations.rb +15 -42
  310. data/lib/hecks/projections/model.rb +12 -51
  311. data/lib/hecks/projections/oidc.rb +12 -56
  312. data/lib/hecks/projections/parser_table.rb +9 -28
  313. data/lib/hecks/projections/reference.rb +2 -15
  314. data/lib/hecks/projections/rust_vocabulary.rb +12 -250
  315. data/lib/hecks/projections/shape.rb +3 -29
  316. data/lib/hecks/projections/statements.rb +7 -86
  317. data/lib/hecks/projections/vocabulary.rb +6 -22
  318. data/lib/hecks/projections.rb +2 -16
  319. data/lib/hecks/projector/cli_projector.rb +60 -375
  320. data/lib/hecks/projector/docs_projector.rb +10 -201
  321. data/lib/hecks/projector/exporter.rb +42 -134
  322. data/lib/hecks/projector/ir_projector.rb +2 -9
  323. data/lib/hecks/projector/narrate_projector.rb +15 -189
  324. data/lib/hecks/projector/target.rb +13 -76
  325. data/lib/hecks/projector.rb +30 -121
  326. data/lib/hecks/query_specification/common/comparators.rb +5 -26
  327. data/lib/hecks/query_specification/common/comparison.rb +35 -143
  328. data/lib/hecks/query_specification/common/dsl.rb +8 -24
  329. data/lib/hecks/query_specification/common/null_policy.rb +20 -70
  330. data/lib/hecks/query_specification/common/options.rb +2 -6
  331. data/lib/hecks/query_specification/common/where_clause.rb +2 -10
  332. data/lib/hecks/query_specification/field_path.rb +37 -77
  333. data/lib/hecks/query_specification/hop_path.rb +12 -76
  334. data/lib/hecks/release/gem_pin.rb +2 -26
  335. data/lib/hecks/release/runner/ci_publisher.rb +3 -6
  336. data/lib/hecks/release/runner/commands.rb +2 -4
  337. data/lib/hecks/release/runner/gem_publisher.rb +2 -3
  338. data/lib/hecks/release/runner/npm_publisher.rb +6 -20
  339. data/lib/hecks/release/runner/preflight.rb +4 -19
  340. data/lib/hecks/release/runner/tagger.rb +2 -9
  341. data/lib/hecks/release/runner.rb +3 -32
  342. data/lib/hecks/rendering.rb +4 -26
  343. data/lib/hecks/router/namespace_installer.rb +12 -36
  344. data/lib/hecks/router.rb +4 -8
  345. data/lib/hecks/runtime/aggregate_lock.rb +8 -33
  346. data/lib/hecks/runtime/boot_gates.rb +3 -18
  347. data/lib/hecks/runtime/caller.rb +19 -59
  348. data/lib/hecks/runtime/capability_graph.rb +5 -21
  349. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
  350. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +23 -160
  351. data/lib/hecks/runtime/command_interpreter.rb +124 -306
  352. data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
  353. data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
  354. data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
  355. data/lib/hecks/runtime/command_rules/emission.rb +8 -21
  356. data/lib/hecks/runtime/command_rules/references.rb +23 -202
  357. data/lib/hecks/runtime/dependency_planning.rb +30 -102
  358. data/lib/hecks/runtime/dispatcher.rb +82 -241
  359. data/lib/hecks/runtime/entity_element.rb +40 -462
  360. data/lib/hecks/runtime/entity_interpreter.rb +64 -219
  361. data/lib/hecks/runtime/errors.rb +32 -115
  362. data/lib/hecks/runtime/event.rb +3 -25
  363. data/lib/hecks/runtime/identity.rb +18 -154
  364. data/lib/hecks/runtime/instance.rb +18 -150
  365. data/lib/hecks/runtime/interpreting.rb +11 -70
  366. data/lib/hecks/runtime/invocation.rb +28 -164
  367. data/lib/hecks/runtime/loader.rb +48 -186
  368. data/lib/hecks/runtime/outbox.rb +38 -261
  369. data/lib/hecks/runtime/policy_interpreter.rb +38 -200
  370. data/lib/hecks/runtime/port_operation_interpreter.rb +26 -87
  371. data/lib/hecks/runtime/query_interpreter.rb +45 -187
  372. data/lib/hecks/runtime/reaction_invocation.rb +36 -138
  373. data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
  374. data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
  375. data/lib/hecks/runtime/reference_hop.rb +8 -81
  376. data/lib/hecks/runtime/refusal_wording.rb +8 -89
  377. data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
  378. data/lib/hecks/runtime/registry/verification.rb +52 -225
  379. data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
  380. data/lib/hecks/runtime/registry.rb +99 -244
  381. data/lib/hecks/runtime/remote_dispatcher.rb +37 -152
  382. data/lib/hecks/runtime/routing.rb +4 -15
  383. data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
  384. data/lib/hecks/runtime/saga_interpreter.rb +79 -263
  385. data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
  386. data/lib/hecks/runtime/tenant_check.rb +6 -68
  387. data/lib/hecks/runtime/tenant_scope.rb +3 -28
  388. data/lib/hecks/runtime/value/admission.rb +16 -67
  389. data/lib/hecks/runtime/value/coercion.rb +155 -641
  390. data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
  391. data/lib/hecks/runtime/value.rb +12 -84
  392. data/lib/hecks/runtime.rb +17 -65
  393. data/lib/hecks/storehouse.rb +141 -568
  394. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +8 -32
  395. data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
  396. data/lib/hecks/vendoring/git_environment.rb +2 -8
  397. data/lib/hecks/vendoring/git_source.rb +4 -10
  398. data/lib/hecks/vendoring.rb +7 -46
  399. data/lib/hecks/version.rb +3 -14
  400. data/lib/hecks.rb +26 -81
  401. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
  402. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
  403. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
  404. metadata +3 -2
@@ -7,9 +7,7 @@ Hecks.bluebook "Bluebook" do
7
7
  # Which piece declared it — see Command's entity_id.
8
8
  reference_to Entity, as: :entity_id, optional: true
9
9
 
10
- # THE IMMEDIATE OWNER, AND ITS NAME — the same derivation Command takes
11
- # (see the note there), because an ask sits exactly where a verb does and
12
- # an entity's asks are its own the same way its verbs are.
10
+ # The immediate owner and its name, derived as Command does: an entity's asks are its own.
13
11
  identified_by :owner_id, :name
14
12
 
15
13
  attribute :name, QueryName
@@ -19,18 +17,8 @@ Hecks.bluebook "Bluebook" do
19
17
  attribute :limit, QueryText
20
18
  attribute :wheres, list_of(Filter)
21
19
  attribute :attributes, list_of(AskArgument)
22
- # EVERY OTHER OPTION A QUERY CAN CARRY, as an open map rather than a field
23
- # each. `offset`, `cursor`, `nulls`, `authorize`, `consistency`, `freshness`,
24
- # `inspect_query` and `use_index` are eight more specifications, several of them
25
- # compound — authorize names a policy AND a tenant, freshness a mode AND a max
26
- # age. Eleven more fields would have to be added here one at a time, and the
27
- # ninth option would need a twelfth.
28
- #
29
- # So they ride as rows: the option's NAME, the KEY within it, and the value. The
30
- # language already models an open map exactly this way twice — a member's pairs
31
- # and a world's settings — and both are their own root for the same reason, that
32
- # no value object can hold a map. Held here as a list because an option belongs
33
- # to the ask rather than standing alone.
20
+ # Every other option a query carries, as an open map: rows of option name, key within it, and
21
+ # value. No value object can hold a map, so options ride as a list on the ask.
34
22
  attribute :options, list_of(AskOption)
35
23
 
36
24
  value_object "QueryName" do
@@ -44,11 +32,7 @@ Hecks.bluebook "Bluebook" do
44
32
 
45
33
  value_object "Filter" do
46
34
  attribute :field, String
47
- # THE FIRST USE OF THE WORD. The runtime maps these eight strings
48
- # through a hand-typed comparator table ; the set it is mapping to is
49
- # one the language DECLARES, and until the link between them was
50
- # declared, typing it downstream
51
- # would have been a guess. This declares it.
35
+ # The comparator set is declared by the language (Vocabulary::QueryComparator).
52
36
  attribute :op, String, admits: "Vocabulary::QueryComparator"
53
37
  attribute :value, String
54
38
  end
@@ -59,7 +43,7 @@ Hecks.bluebook "Bluebook" do
59
43
  attribute :list, String
60
44
  attribute :optional, String, optional: true
61
45
  attribute :pattern, String, optional: true
62
- # optional: a declaration with no default has none (C3.7 — a value object's fields arrive or it refuses)
46
+ # optional: a declaration with no default has none
63
47
  attribute :default, String, optional: true
64
48
  # The closed set this value must belong to — see Aggregate::Field.
65
49
  attribute :admits, String, optional: true
@@ -75,18 +59,12 @@ Hecks.bluebook "Bluebook" do
75
59
  attribute :option, String
76
60
  attribute :key, String
77
61
  attribute :value, String
78
- # optional: only a repeated option (an index hint) carries an `at` (C3.7)
62
+ # optional: only a repeated option (an index hint) carries an `at`
79
63
  attribute :at, String, optional: true
80
64
  end
81
65
 
82
- # The way back: everything DECLARED IN the aggregate above. The parent
83
- # reference IS the query.
84
- # WHERE IT SITS AMONG ITS SIBLINGS. Declaration order is a FACT ABOUT THE
85
- # SOURCE — the IR is a contract read straight from this file,
86
- # field for field AND INDEX FOR INDEX. So the language HOLDS it, instead of
87
- # inheriting it from whatever order a store happens to iterate: an ask that
88
- # does not say how it is ordered is answered in identity order, which is
89
- # right for every other ask and fatal for the one that is the SOURCE.
66
+ # Declaration order among siblings. The IR is read index for index, so the language
67
+ # holds it rather than inheriting whatever order a store iterates.
90
68
  value_object "Position" do
91
69
  attribute :value, Integer
92
70
  end
@@ -143,11 +121,8 @@ Hecks.bluebook "Bluebook" do
143
121
 
144
122
  attribute :option, QueryText
145
123
  attribute :key, QueryText
146
- # AN OPTION MAY HAVE NO VALUE. `consistency :snapshot` with no timeout is a
147
- # complete declaration, and an option is judged one key at a time — so the
148
- # `timeout` row arrives carrying nothing. Requiring a value here made every
149
- # such declaration unbuildable, which is a rule about the LANGUAGE, not
150
- # about the one spec that noticed.
124
+ # An option may have no value: `consistency :snapshot` with no timeout is complete, and
125
+ # options are judged one key at a time.
151
126
  attribute :value, QueryText, optional: true
152
127
  attribute :at, QueryText, optional: true
153
128
 
@@ -169,11 +144,7 @@ Hecks.bluebook "Bluebook" do
169
144
  attribute :pattern, QueryText, optional: true
170
145
  attribute :default, QueryText, optional: true
171
146
  attribute :admits, QueryText, optional: true
172
- # See Command.Argument's own :relationship (command.bluebook) — the
173
- # same field, the same reason: an argument minted verbatim from the
174
- # owner's own reference-typed attribute must carry that fact through
175
- # the self-hosted round trip too, or the language cannot say it about
176
- # itself.
147
+ # See Command.Argument's :relationship: keeps reference-typed arguments in the round trip.
177
148
  attribute :relationship, QueryText, optional: true
178
149
 
179
150
  sets :attributes, append: { name: :name, type: :type, list: :list, default: :default, optional: :optional, pattern: :pattern, admits: :admits, relationship: :relationship }
@@ -182,9 +153,7 @@ Hecks.bluebook "Bluebook" do
182
153
  end
183
154
 
184
155
 
185
- # HOW QUERY IS SPELLED. These rows live with the concept
186
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
187
- # Contexts represented here: Query.
156
+ # Keyword and argument rows for queries; SyntaxBoot discovers every aggregate-local seed table.
188
157
  value_object "KeywordSeed" do
189
158
  attribute :word, String
190
159
  attribute :context, String, admits: "Syntax::Context"
@@ -4,19 +4,14 @@ Hecks.bluebook "Bluebook" do
4
4
 
5
5
  reference_to Aggregate
6
6
 
7
- # THE AGGREGATE IT BELONGS TO, AND ITS NAME. A value object belongs to one
8
- # aggregate by rule, and `Name` or `Amount` is spelled in half the chapters
9
- # there are.
7
+ # Identity is the owning aggregate plus the name; `Name` recurs across chapters.
10
8
  identified_by :aggregate, :name
11
9
 
12
10
  attribute :name, ValueObjectName
13
11
  attribute :attributes, list_of(ShapeField)
14
12
  attribute :invariants, list_of(Assertion)
15
13
  attribute :rows, RowCount, optional: true
16
- # S17, ADR 0026 — Member NESTED here, an entity rather than its own
17
- # root aggregate (see `entity "Member"`, below). `list_of(Member)`
18
- # forward-references it the same way banking's own `attribute :ledger,
19
- # list_of(LedgerEntry)` names LedgerEntry before it is declared.
14
+ # Member is nested here as an entity; `list_of(Member)` forward-references it.
20
15
  attribute :members, list_of(Member)
21
16
 
22
17
  value_object "RowCount" do
@@ -34,9 +29,9 @@ Hecks.bluebook "Bluebook" do
34
29
  attribute :list, String, pattern: '[^ \t\n\r]'
35
30
  attribute :optional, String, optional: true
36
31
  attribute :pattern, String, optional: true
37
- # optional: a declaration with no default has none (C3.7 — a value object's fields arrive or it refuses)
32
+ # optional: a declaration with no default has none
38
33
  attribute :default, String, optional: true
39
- # The closed set this value must belong to — see Aggregate::Field.
34
+ # The closed set this value must belong to; see Aggregate::Field.
40
35
  attribute :admits, String, optional: true
41
36
  attribute :relationship, String, optional: true
42
37
  invariant("a field is named") { !name.to_s.empty? }
@@ -51,43 +46,27 @@ Hecks.bluebook "Bluebook" do
51
46
  invariant("an assertion canonical form is present") { !canonical.to_s.empty? }
52
47
  end
53
48
 
54
- # S17, ADR 0026 — MemberPosition/MemberText/Pair, hoisted up from the
55
- # old standalone `aggregate "Member"`. An entity cannot declare its own
56
- # `value_object` (EntityBuilder has no such method — a piece borrows its
57
- # owning aggregate's, the same way LedgerEntry borrows Account's Money),
58
- # so these live here now, one level up, where `entity "Member"` below
59
- # can still reach them.
60
- #
61
- # Named MemberPosition rather than reusing ValueObject's own `Position`
62
- # two lines above — that one orders value objects among an AGGREGATE's
63
- # siblings ; this one orders admitted rows within ONE value object. Same
64
- # shape, different fact, so a shared name would have let one silently
65
- # answer for the other.
49
+ # An entity cannot declare its own value objects, so Member's pieces live here.
50
+ # MemberPosition is distinct from Position: that orders value objects among an
51
+ # aggregate's siblings, this orders admitted rows within one value object.
66
52
  value_object "MemberPosition" do
67
53
  attribute :value, Integer
68
54
  end
69
55
 
70
56
  value_object "MemberText" do
71
57
  attribute :value, String
72
- # MemberText is free-form serialized text from member definitions,
73
- # which can include empty strings and numeric literals — not restricted
58
+ # Free-form text; may be empty or numeric, so unrestricted.
74
59
  end
75
60
 
76
61
  value_object "Pair" do
77
62
  attribute :key, String, pattern: '[^ \t\n\r]'
78
63
  attribute :value, String
79
- # Pair keys must be named, but values can be empty strings or numeric literals
64
+ # Keys must be named; values may be empty or numeric.
80
65
  invariant("a pair key is present") { !key.to_s.empty? }
81
66
  end
82
67
 
83
- # The way back: everything DECLARED IN the aggregate above. The parent
84
- # reference IS the query.
85
- # WHERE IT SITS AMONG ITS SIBLINGS. Declaration order is a FACT ABOUT THE
86
- # SOURCE — the IR is a contract read straight from this file,
87
- # field for field AND INDEX FOR INDEX. So the language HOLDS it, instead of
88
- # inheriting it from whatever order a store happens to iterate: an ask that
89
- # does not say how it is ordered is answered in identity order, which is
90
- # right for every other ask and fatal for the one that is the SOURCE.
68
+ # Declaration order is a fact about the source, so the language holds it rather than
69
+ # inheriting store iteration order; an unordered ask is answered in identity order.
91
70
  value_object "Position" do
92
71
  attribute :value, Integer
93
72
  end
@@ -121,16 +100,11 @@ Hecks.bluebook "Bluebook" do
121
100
  attribute :type, ValueObjectName
122
101
  attribute :list, ValueObjectName
123
102
  attribute :optional, ValueObjectName, optional: true
124
- # FREE TEXT, like `default` beside it and like the pattern every other
125
- # element builder takes. `ValueObjectName` carries the invariant "a value
126
- # object is named", which is not a thing a regex has to be — it happened to
127
- # admit banking's one pattern because that pattern is not empty, and it
128
- # said the wrong thing about why.
103
+ # Free text, like `default`; ValueObjectName's "is named" invariant does not suit a regex.
129
104
  attribute :pattern, ValueObjectText, optional: true
130
105
  attribute :default, ValueObjectText, optional: true
131
106
  attribute :admits, ValueObjectText, optional: true
132
- # See Command.Argument's own :relationship (command.bluebook) — the
133
- # same field, the same reason.
107
+ # Same field as Command.Argument's :relationship (command.bluebook).
134
108
  attribute :relationship, ValueObjectText, optional: true
135
109
 
136
110
  sets :attributes, append: { name: :name, type: :type, list: :list, default: :default, optional: :optional, pattern: :pattern, admits: :admits, relationship: :relationship }
@@ -142,10 +116,8 @@ Hecks.bluebook "Bluebook" do
142
116
  role "Language"
143
117
  goal "Declare that this value object admits a closed set of rows"
144
118
 
145
- # Dispatched only when the bluebook declared a one_of — so an EMPTY closed
146
- # set is visible where it used to be invisible : a shape that is closed
147
- # and admits nothing. Members live in their own root (a row is a list of
148
- # pairs inside a list of rows), so the count is offered rather than read.
119
+ # Dispatched only when a one_of was declared, so an empty closed set is visible.
120
+ # Members live in their own list, so the count is passed in.
149
121
 
150
122
  given("a closed set admits a member") { rows.value > 0 }
151
123
 
@@ -171,20 +143,12 @@ Hecks.bluebook "Bluebook" do
171
143
 
172
144
  value_object "ValueObjectText" do
173
145
  attribute :value, String
174
- # ValueObjectText is free-form serialized text from member definitions,
175
- # which can include empty strings and numeric literals — not restricted
146
+ # Free-form text; may be empty or numeric, so unrestricted.
176
147
  end
177
148
 
178
- # THE MEMBER'S OWN CREATION. S17, ADR 0026 — Member is a genuine ENTITY
179
- # now (`entity "Member"`, below), and an entity is never created through
180
- # its own dotted verb — banking's own LedgerEntry is created by
181
- # `Account.LogEntry`, an ordinary append on the OWNER, never by a
182
- # `LedgerEntry.Declare` of its own (EntityInterpreter#element_of only
183
- # LOCATES an element already on the list — see entity_interpreter.rb —
184
- # it has no path that creates one). So Member's creation moved here,
185
- # onto ValueObject, mirroring `Field`/`Close`/`Assert` beside it :
186
- # a bare, aggregate-level append. What it creates is empty — pairs fill
187
- # in afterward, one at a time, through the entity's own `Pair`.
149
+ # An entity is only located by its own dotted verb, never created (see
150
+ # EntityInterpreter#element_of), so Member is created by an append here.
151
+ # Pairs are added afterward through the entity's own `Pair`.
188
152
  command "Member" do
189
153
  role "Language"
190
154
  goal "Open one admitted row on a value object"
@@ -196,24 +160,12 @@ Hecks.bluebook "Bluebook" do
196
160
  emits MemberDeclared
197
161
  end
198
162
 
199
- # S17, ADR 0026 — ONE ADMITTED ROW, nested rather than its own root
200
- # aggregate. A member has no other distinguishing fact : its pairs are
201
- # an OPEN MAP, which is the whole reason it used to need a root of its
202
- # own, and a map cannot be a path — but that was always a reason it
203
- # could not be a VALUE OBJECT, never a reason it could not be an
204
- # ENTITY, which is what it structurally always was: a nested, ordered,
205
- # separately-mutated element of ValueObject's own list. `ValueObject.
206
- # Member` (above) creates it ; `Pair` (below) fills it in, one field
207
- # at a time, exactly the way `Command.Rule` fills in a precondition.
163
+ # One admitted row, nested because its pairs are an open map, which a value
164
+ # object cannot hold. `ValueObject.Member` creates it; `Pair` fills it in.
208
165
  entity "Member" do
209
166
  description "One admitted row of a value object's one_of — a whole combination of field values, not a per-field choice. Nested under the value object because a row is a list of pairs inside a list of rows."
210
167
 
211
- # Position is not a mint — it is read straight out of the source
212
- # file, the same fact the language already holds deliberately so
213
- # that an ask ordered any other way cannot take declaration order
214
- # away. `ValueObject.Member` mints it as the walk index at creation
215
- # (the same way `declare`'s own `position` field always has), and
216
- # every later `Pair` locates the element by it.
168
+ # Position is read from the source; `ValueObject.Member` mints it as the walk index.
217
169
  identified_by MemberPosition, as: :position
218
170
 
219
171
  attribute :pairs, list_of(Pair)
@@ -233,9 +185,7 @@ Hecks.bluebook "Bluebook" do
233
185
  end
234
186
  end
235
187
 
236
- # HOW VALUEOBJECT IS SPELLED. These rows live with the concept
237
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
238
- # Contexts represented here: ValueObject, OneOf, Type.
188
+ # Spelling rows for ValueObject, OneOf and Type; SyntaxBoot discovers each seed table.
239
189
  value_object "KeywordSeed" do
240
190
  attribute :word, String
241
191
  attribute :context, String, admits: "Syntax::Context"