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
@@ -4,30 +4,14 @@ require_relative "../ir"
4
4
 
5
5
  module Hecks
6
6
  module Bluebook
7
- # The chapter, which is not the namespace it lives in.
8
- #
9
- # `Hecks::Bluebook` was briefly a class, because dropping the
10
- # old `IR::` segment would otherwise have produced
11
- # `Bluebook::Bluebook` — a class shadowing its own enclosing module.
12
- # Naming the construct what the code already called it everywhere
13
- # (a chapter; this file was already chapter.rb) removes the clash
14
- # at the source, so the namespace goes back to being a module.
15
- #
16
- # Measured before changing: `Bluebook` was used as a class in five
17
- # places and as a namespace in seventy-seven files.
7
+ # The chapter, distinct from the `Bluebook` namespace it lives in.
18
8
  class Chapter
19
9
  include Construct
20
10
  include Behaviour::Chapter
21
11
  include Hecks::IR
22
12
 
23
- # **The schema's own version** — not a domain's `version:` (Banking's
24
- # "v1", a business fact the author chose), but the shape `to_h`
25
- # itself emits. A consumer reading exported IR with no Ruby DSL to
26
- # cross-check against (a build-time generator, a stored snapshot)
27
- # needs to know which shape it's holding before it can safely
28
- # interpret any of the rest of it. Bump this when `to_h`'s own
29
- # shape changes in a way a consumer would need to know about —
30
- # not when a domain's own declarations change.
13
+ # The IR shape's own version — bump only when `to_h`'s shape changes,
14
+ # not when a domain's declared `version:` does.
31
15
  IR_VERSION = 1
32
16
 
33
17
  emits_ir(
@@ -36,32 +20,23 @@ module Hecks
36
20
  version: :version,
37
21
  vision: :vision,
38
22
  classification: :classification,
39
- # M10 — a domain rename (`formerly_known_as "OldName"`) drives a
40
- # real Postgres schema rename at boot (EraResolver reads
41
- # `bluebook.formerly_known_as` off the live Ruby object) and the
42
- # meta-validator's cache key is `SHA256(JSON(bluebook.to_h))` — so
43
- # a fact this method didn't spell was a fact two chapters
44
- # differing only by their old name could hash identically on,
45
- # same as read-model filters before them. Spelled here for the
46
- # same reason `version`/`vision` are: a plain field, present
47
- # (possibly nil) rather than silently absent.
23
+ # Present (possibly nil) rather than silently absent, so two chapters
24
+ # differing only by their old name can't hash identically at the
25
+ # meta-validator's cache key (`SHA256(JSON(bluebook.to_h))`).
48
26
  formerly_known_as: :formerly_known_as,
49
27
  aggregates: many(:aggregates),
50
28
  read_models: many(:read_models),
51
29
  policies: many(:policies),
52
30
  process_managers: many(:process_managers),
53
31
  attaches_to: :attaches_to,
54
- # A capability this chapter answers (`provides "authorization",
55
- # grant: "RoleAssignment.Assign", ...`), one row per key, in the
56
- # order written. Present (possibly empty) on every chapter, the
57
- # same reading `attaches_to` beside it gives.
32
+ # One row per declared `provides` capability, in declaration order;
33
+ # present (possibly empty) like `attaches_to`.
58
34
  provides: -> { provides.map(&:to_h) },
59
35
  canonical_form: -> { Expression::CanonicalForm.table }
60
36
  )
61
37
 
62
- # **One row of a declared capability** — `verb` is chapter-local
63
- # ("RoleAssignment.Assign"); `Behaviour::Chapter#provided_verb`
64
- # qualifies it with the chapter's own name.
38
+ # One row of a declared capability — `verb` is chapter-local;
39
+ # `Behaviour::Chapter#provided_verb` qualifies it with the chapter's own name.
65
40
  Provision = Struct.new(:capability, :key, :verb, keyword_init: true) do
66
41
  # Coerces one declared or reconstructed `provides` row into a `Provision`.
67
42
  #
@@ -80,23 +55,10 @@ module Hecks
80
55
  attr_reader :name, :version, :vision, :aggregates, :policies, :process_managers,
81
56
  :classification, :read_models, :ports, :formerly_known_as, :attaches_to, :provides
82
57
 
83
- # @param name [String, Symbol] the chapter's declared name
84
- # @param version [String, Symbol, nil] the chapter's declared business version,
85
- # such as `"v1"`, or `nil` if it declares none
86
- # @param vision [String, nil] the chapter's declared vision statement
87
- # @param aggregates [Array<Bluebook::Aggregate>] the chapter's declared aggregates
88
58
  # @param policies [Array<Bluebook::Policy>] every reaction declared across the
89
59
  # chapter's own aggregates, hoisted here
90
- # @param process_managers [Array<Bluebook::ProcessManager>] the chapter's declared
91
- # process managers
92
60
  # @param classification [String, Symbol, nil] whether this chapter is central to
93
61
  # its project's own domain model, or `nil` if undeclared
94
- # @param read_models [Array<Bluebook::ReadModel>] the chapter's declared read models
95
- # @param formerly_known_as [String, Symbol, nil] an earlier name this domain was
96
- # known under, or `nil` if it was never renamed
97
- # @param attaches_to [Array<String, Symbol>] the contexts this chapter attaches to
98
- # @param provides [Array<Bluebook::Chapter::Provision, Hash>] the capabilities this
99
- # chapter declares it provides
100
62
  def initialize(name:, version: nil, vision: nil, aggregates: [], policies: [],
101
63
  process_managers: [], classification: nil, read_models: [], formerly_known_as: nil,
102
64
  attaches_to: [], provides: [])
@@ -10,19 +10,8 @@ module Hecks
10
10
  include Hecks::IR
11
11
  include Behaviour::Mutation
12
12
 
13
- # `sign:` — item #5 of the whole-project table-unification survey:
14
- # `increment`/`decrement`'s own +1/-1 comes from `Vocabulary::MutationOp`
15
- # here, the same table `Runtime::CommandRules::Arithmetic::MUTATION_OPS`
16
- # already reads on the Ruby runtime side, rather than a ternary on the op
17
- # name re-deriving it independently in each of two Rust codegen scripts
18
- # (rust/project/mutations.rb, rust/codegen/src/mutations.rs).
19
- # Reads `Vocabulary::MutationOp` directly (plain data, no framework
20
- # dependency — safe during parsing, same reason `RuleReference`'s
21
- # own bootstrap concerns don't apply here) rather than requiring
22
- # Runtime::CommandRules from the bluebook/IR layer, which would be a
23
- # real layering inversion (runtime depends on bluebook, not the
24
- # reverse). "" (not nil) for ops with no sign, matching every other
25
- # optional IR text field's own absent-is-empty-string convention.
13
+ # Reads `Vocabulary::MutationOp` directly: runtime depends on bluebook, not the reverse.
14
+ # Answers "" rather than nil, like every optional IR text field.
26
15
  #
27
16
  # @param oper [String, Symbol] the mutation's operation name, such as
28
17
  # `"increment"` or `"decrement"`
@@ -34,14 +23,9 @@ module Hecks
34
23
 
35
24
  emits_ir(target: :target, op: :op, sign: -> { Mutation.sign_for(op) })
36
25
 
37
- # The one genuinely branching emission in the model: an append (or a
38
- # delegate — `CommandBuilder#delegates_to`'s own comment gives the
39
- # full reasoning for reusing this exact wire shape rather than
40
- # inventing a parallel one) binds several fields at once and carries
41
- # `fields:`, everything else carries a single `source:`. Declared
42
- # emission covers the fixed head; `super` supplies it and this adds
43
- # the tail, which is why a construct with a variable shape needs no
44
- # new mixin API.
26
+ # An append, delegate or correction binds several fields and carries `fields:`;
27
+ # every other op carries a single `source:`.
28
+ #
45
29
  # @return [Hash{Symbol => Object}] the declared emission — `super`'s fixed
46
30
  # head, plus `fields:` (a Hash of bound field values) for an
47
31
  # append-shaped op, or `source:` (`classified_source`'s own result) for
@@ -53,24 +37,10 @@ module Hecks
53
37
  end
54
38
  end
55
39
 
56
- # A command, as a Ruby class.
57
- #
58
- # Not nested as a constant, and that is a finding rather than a shortcut. A
59
- # command and a value object may legitimately share a name inside one
60
- # aggregate — the language does it six times, and means it: the command
61
- # `Argument` is the verb that appends to the `arguments` list whose element
62
- # type is the value object `Argument`, and `Plan` reads exactly that pairing.
63
- # So `Bluebook::Command::Argument` cannot be both, and a single constant
64
- # namespace cannot index a kind-ambiguous name. The same follows for
65
- # `hecks_fqn` : `Bluebook::Command.Argument` names both, which is why the judge's
66
- # ids only work per-category, each in its own repository. Identity is
67
- # (kind, FQN), not fqn.
40
+ # A declared command, minted as its own anonymous class.
68
41
  #
69
- # It is a declaration holder anyway, because that is where the edges live.
70
- # `acts_on` answers with the owning construct itself — the Aggregate,
71
- # or the entity holder for a piece's verb — rather than the name of one.
72
- # The invocation door (`pizza.add_topping`) is the facade's business, a
73
- # per-boot projection ; no verb method is defined here.
42
+ # Not a nested constant: a command and a value object may share a name in one aggregate,
43
+ # so identity is (kind, FQN), not the name alone.
74
44
  class Command
75
45
  extend Construct
76
46
  extend Hecks::IR
@@ -86,14 +56,7 @@ module Hecks
86
56
  ensures: -> { ensures.map { |rule| Expression::AstJson.rule_row(rule) } },
87
57
  mutations: many(:mutations),
88
58
  emits: :emits,
89
- # The lifecycle state this command is admissible from (S10, ADR
90
- # 0025 — "lifecycle state becomes a command guard") — a guard,
91
- # not a transition: `command "Debit", from: "open"` replaces
92
- # `given("account is open") { status == "open" }`, checked
93
- # against the owning construct's own lifecycle field the same
94
- # way `admissible_transition` already checks a real state
95
- # change, but names no target state and moves nothing. Nil for
96
- # a command with no such guard — most commands.
59
+ # The lifecycle state this command is admissible from: a guard, not a transition.
97
60
  from: -> { from },
98
61
  provenance: :provenance
99
62
  )
@@ -102,29 +65,18 @@ module Hecks
102
65
  attr_reader :role, :goal, :attributes, :givens, :ensures, :mutations, :emits, :references,
103
66
  :from, :provenance
104
67
 
105
- # Mints one command as its own anonymous class, a subclass of whichever
106
- # `Command`-descended class `declare` is called on.
68
+ # Mints one command as its own anonymous subclass of the class `declare` is called on.
107
69
  #
108
70
  # @param name [String, Symbol] the command's declared name
109
- # @param role [String, nil] the command's declared role text
110
- # @param goal [String, nil] the command's declared goal text
111
- # @param attributes [Array<Bluebook::Attribute>] the command's declared
112
- # arguments
113
- # @param givens [Array<Bluebook::Given>] the command's declared
114
- # preconditions
115
- # @param ensures [Array<Bluebook::Given>] the command's declared
116
- # postconditions
117
- # @param mutations [Array<Bluebook::Mutation>] the state changes this
118
- # command applies
119
- # @param emits [Array<String>] the event names this command may emit
120
- # @param references [String, Symbol, nil] the aggregate name this verb's
121
- # `reference_to` addresses, or `nil` for a verb declared on the
122
- # aggregate it acts on
123
- # @param from [String, Array<String>, nil] the lifecycle state(s) this
124
- # command is admissible from, or `nil` for no such guard
125
- # @param provenance [Object, nil] the command's declared canonical
126
- # source, captured exactly as written, or `nil` if it declares none
127
- # @return [Class] the new command class
71
+ # @param role [String, nil] the declared role text; `goal` is the goal text
72
+ # @param attributes [Array<Bluebook::Attribute>] the declared arguments
73
+ # @param givens [Array<Bluebook::Given>] the declared preconditions
74
+ # @param ensures [Array<Bluebook::Given>] the declared postconditions
75
+ # @param mutations [Array<Bluebook::Mutation>] the state changes it applies
76
+ # @param emits [Array<String>] the event names it may emit
77
+ # @param references [String, Symbol, nil] the aggregate its `reference_to` addresses
78
+ # @param from [String, Array<String>, nil] the lifecycle states it is admissible from
79
+ # @param provenance [Object, nil] the declared canonical source, as written
128
80
  def declare(name:, role: nil, goal: nil, attributes: [], givens: [], ensures: [],
129
81
  mutations: [], emits: [], references: nil, from: nil, provenance: nil)
130
82
  verb = Class.new(self)
@@ -135,21 +87,11 @@ module Hecks
135
87
  verb
136
88
  end
137
89
 
138
- # Assigns what the language declares, then hands off to the behaviour's
139
- # own `settle` — indexing attributes, the one thing not derivable from
140
- # the declaration.
90
+ # Assigns what the language declares, then `settle` indexes the attributes.
91
+ #
92
+ # Takes the keywords `declare` takes, minus `name`.
141
93
  #
142
- # @param role [String, nil] see `declare`
143
- # @param goal [String, nil] see `declare`
144
- # @param attributes [Array<Bluebook::Attribute>] see `declare`
145
- # @param givens [Array<Bluebook::Given>] see `declare`
146
- # @param ensures [Array<Bluebook::Given>] see `declare`
147
- # @param mutations [Array<Bluebook::Mutation>] see `declare`
148
- # @param emits [Array<String>] see `declare`
149
- # @param references [String, nil] see `declare`
150
- # @param from [String, Array<String>, nil] see `declare`
151
- # @param provenance [Object, nil] see `declare`
152
- # @return [Class] self, once attributes are indexed
94
+ # @return [Class] self
153
95
  def absorb(role:, goal:, attributes:, givens:, ensures:, mutations:, emits:, references:,
154
96
  from: nil, provenance: nil)
155
97
  @role = role
@@ -2,17 +2,9 @@ require_relative "behaviour/domain_port"
2
2
 
3
3
  module Hecks
4
4
  module Bluebook
5
- # The primary/driving half of hexagonal architecture (Cockburn) — called
6
- # by an adapter living outside the bluebook entirely, never by the
7
- # domain calling out. That is already `Hecks.port` (persistence,
8
- # projection, extraction, loading) plus `Ports::*` : the secondary/
9
- # driven half, unchanged by this.
5
+ # One operation on a driving port: an external call turned into an event in this domain.
10
6
  #
11
- # An operation carries no `given`/`ensures`/`then_set` — a port is the
12
- # anti-corruption boundary that turns an external call into a fact in
13
- # this domain's own vocabulary, not a second place business rules live.
14
- # Those stay on whatever command a `policy` triggers in reaction to the
15
- # event an operation emits.
7
+ # Carries no `given`/`ensures`/`then_set`; those stay on the command a `policy` triggers.
16
8
  class PortOperation
17
9
  include Hecks::IR
18
10
  include Behaviour::PortOperation
@@ -21,31 +13,17 @@ module Hecks
21
13
 
22
14
  attr_reader :hecks_name, :attributes, :emits, :direction, :answers, :refuses, :to
23
15
 
24
- # Two directions through one door.
25
- #
26
- # `:inbound` is what this class has always been — `tells`, spelled
27
- # `operation` before it had a twin: an external fact arriving, turned
28
- # into this domain's own event. It emits and that is all; there is no
29
- # channel back to whoever called.
30
- #
31
- # `:outbound` is `asks` — the domain wanting something from outside
32
- # and having to live with either answer. It names both: `answers` for
33
- # what the adapter came back with, `refuses` for what it said instead.
34
- # Naming only the happy one would put the failure somewhere the model
35
- # cannot see, which is the whole reason a boundary is worth modelling.
16
+ # `:inbound` (`tells`) is an external fact arriving as an event; it emits and nothing more.
17
+ # `:outbound` (`asks`) is the domain wanting something from outside, naming both
18
+ # `answers` and `refuses` so the failure is visible to the model.
36
19
  #
37
20
  # @param name [String, Symbol] the operation's declared name
38
- # @param attributes [Array<Bluebook::Attribute>] the operation's declared payload
39
- # fields
40
- # @param emits [Array<String>] the events an inbound operation declares it records
41
- # @param direction [Symbol, String] `:inbound` for a `tells`/`operation`, `:outbound`
42
- # for an `asks`
43
- # @param answers [String, nil] an outbound operation's declared event for what the
44
- # adapter came back with
45
- # @param refuses [String, nil] an outbound operation's declared event for what the
46
- # adapter said instead
47
- # @param to [String, nil] the aggregate this operation routes to, or `nil` if it
48
- # declares no routing target
21
+ # @param attributes [Array<Bluebook::Attribute>] the declared payload fields
22
+ # @param emits [Array<String>] the events an inbound operation records
23
+ # @param direction [Symbol, String] `:inbound` or `:outbound`
24
+ # @param answers [String, nil] an outbound operation's event for the adapter's answer
25
+ # @param refuses [String, nil] an outbound operation's event for the adapter's refusal
26
+ # @param to [String, nil] the aggregate this operation routes to, if any
49
27
  def initialize(name:, attributes: [], emits: [], direction: :inbound, answers: nil, refuses: nil, to: nil)
50
28
  @hecks_name = name.to_s
51
29
  @attributes = attributes
@@ -67,31 +45,8 @@ module Hecks
67
45
  # @return [Boolean] whether this operation is a `tells`/`operation`
68
46
  def inbound? = @direction == :inbound
69
47
 
70
- # No root reference of its own — unlike a command, every attribute
71
- # equally describes the payload, including whichever one identifies
72
- # the record its emitted event belongs to. Kept only so
73
- # CommandInterpreter::ArgumentGate's `reference_key` can ask for it
74
- # without learning this isn't a command.
75
-
76
- # `direction`/`answers`/`refuses` are deliberately outside `emits_ir`'s
77
- # declared shape and added here only for an outbound operation — an
78
- # ordinary inbound one (`tells`, still spelled `operation` everywhere
79
- # in the existing corpus) keeps the exact prior IR shape, byte for
80
- # byte. Pizzas' `PaymentGateway` port is inbound-only and is checked
81
- # against `hecks-parse`'s own Rust output for byte-identity
82
- # (parser_parity_spec.rb) — the Rust side has no notion of `asks` yet,
83
- # so an unconditional new key here would break that parity for a
84
- # domain that never asked for the feature. Only a chapter that
85
- # actually declares `asks` (this extraction's own QualityControl
86
- # ledger, not yet in any Rust-parity corpus) pays for it.
87
- # `to` — same "deliberately outside emits_ir, merged in only when
88
- # present" treatment as direction/answers/refuses just above, and
89
- # for the identical reason: an operation still spelled the old way
90
- # (`reference_to` inside the block, shadow-parsing only — see
91
- # reference_to_impl's own comment) or one that simply hasn't
92
- # migrated yet keeps the exact prior IR shape, byte for byte,
93
- # instead of an unconditional new key breaking parser_parity_spec
94
- # for every domain that never touched this.
48
+ # `direction`/`answers`/`refuses`/`to` are merged in only when set: the Rust parser
49
+ # emits none of them, so an unconditional key would break parser_parity_spec.
95
50
  #
96
51
  # @return [Hash] the declared emission, plus `direction`/`answers`/`refuses` for an
97
52
  # outbound operation and `to` when a routing target is declared
@@ -103,11 +58,7 @@ module Hecks
103
58
  end
104
59
  end
105
60
 
106
- # A named group of operations an aggregate (or, later, a chapter)
107
- # exposes to whatever adapter calls in — the contract that today lives
108
- # only as a bare `verb`/`signal` pair in a standalone `.port` file.
109
- # Superseding those is the goal ; for now they keep working untouched,
110
- # and this is additive.
61
+ # A named group of operations an aggregate exposes to whatever adapter calls in.
111
62
  class DomainPort
112
63
  include Hecks::IR
113
64
  include Behaviour::DomainPort