hecks 2.7.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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +11 -0
  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 +18 -99
  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 +15 -37
  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 +32 -142
  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 +17 -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 +38 -26
  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 +17 -65
  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 -189
  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 -106
  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 +54 -268
  109. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -308
  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 +10 -91
  114. data/lib/hecks/bluebook/model_check.rb +102 -600
  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 +84 -0
  128. data/lib/hecks/cli/document.rb +86 -0
  129. data/lib/hecks/cli/ir.rb +45 -0
  130. data/lib/hecks/cli/mcp.rb +31 -0
  131. data/lib/hecks/cli/mcp_door.rb +366 -0
  132. data/lib/hecks/cli/model_check.rb +203 -0
  133. data/lib/hecks/cli/project_cli.rb +90 -0
  134. data/lib/hecks/cli/project_diagrams.rb +36 -0
  135. data/lib/hecks/cli/run.rb +173 -0
  136. data/lib/hecks/cli/smoke_test.rb +45 -0
  137. data/lib/hecks/cli/stores.rb +53 -0
  138. data/lib/hecks/cli.rb +160 -0
  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 +98 -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 +95 -0
  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 +62 -65
  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 +7 -26
  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 +22 -122
  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 +151 -679
  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 +9 -16
  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 +46 -138
  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 +93 -0
  336. data/lib/hecks/release/runner/commands.rb +66 -0
  337. data/lib/hecks/release/runner/console.rb +52 -0
  338. data/lib/hecks/release/runner/gem_publisher.rb +43 -0
  339. data/lib/hecks/release/runner/git.rb +48 -0
  340. data/lib/hecks/release/runner/npm_publisher.rb +75 -0
  341. data/lib/hecks/release/runner/preflight.rb +104 -0
  342. data/lib/hecks/release/runner/published.rb +55 -0
  343. data/lib/hecks/release/runner/tagger.rb +80 -0
  344. data/lib/hecks/release/runner.rb +215 -0
  345. data/lib/hecks/rendering.rb +4 -26
  346. data/lib/hecks/router/namespace_installer.rb +12 -36
  347. data/lib/hecks/router.rb +4 -8
  348. data/lib/hecks/runtime/aggregate_lock.rb +8 -33
  349. data/lib/hecks/runtime/boot_gates.rb +3 -18
  350. data/lib/hecks/runtime/caller.rb +19 -59
  351. data/lib/hecks/runtime/capability_graph.rb +5 -21
  352. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
  353. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +23 -160
  354. data/lib/hecks/runtime/command_interpreter.rb +125 -307
  355. data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
  356. data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
  357. data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
  358. data/lib/hecks/runtime/command_rules/emission.rb +8 -21
  359. data/lib/hecks/runtime/command_rules/references.rb +23 -202
  360. data/lib/hecks/runtime/dependency_planning.rb +30 -102
  361. data/lib/hecks/runtime/dispatcher.rb +82 -241
  362. data/lib/hecks/runtime/entity_element.rb +40 -462
  363. data/lib/hecks/runtime/entity_interpreter.rb +65 -220
  364. data/lib/hecks/runtime/errors.rb +32 -115
  365. data/lib/hecks/runtime/event.rb +3 -25
  366. data/lib/hecks/runtime/identity.rb +18 -154
  367. data/lib/hecks/runtime/instance.rb +18 -150
  368. data/lib/hecks/runtime/interpreting.rb +11 -70
  369. data/lib/hecks/runtime/invocation.rb +28 -164
  370. data/lib/hecks/runtime/loader.rb +48 -186
  371. data/lib/hecks/runtime/outbox.rb +38 -261
  372. data/lib/hecks/runtime/policy_interpreter.rb +38 -200
  373. data/lib/hecks/runtime/port_operation_interpreter.rb +26 -87
  374. data/lib/hecks/runtime/query_interpreter.rb +45 -187
  375. data/lib/hecks/runtime/reaction_invocation.rb +36 -138
  376. data/lib/hecks/runtime/read_model_interpreter.rb +139 -208
  377. data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
  378. data/lib/hecks/runtime/reference_hop.rb +8 -81
  379. data/lib/hecks/runtime/refusal_wording.rb +8 -89
  380. data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
  381. data/lib/hecks/runtime/registry/verification.rb +52 -225
  382. data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
  383. data/lib/hecks/runtime/registry.rb +103 -244
  384. data/lib/hecks/runtime/remote_dispatcher.rb +37 -152
  385. data/lib/hecks/runtime/routing.rb +4 -15
  386. data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
  387. data/lib/hecks/runtime/saga_interpreter.rb +79 -263
  388. data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
  389. data/lib/hecks/runtime/tenant_check.rb +6 -68
  390. data/lib/hecks/runtime/tenant_scope.rb +3 -28
  391. data/lib/hecks/runtime/value/admission.rb +16 -67
  392. data/lib/hecks/runtime/value/coercion.rb +155 -641
  393. data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
  394. data/lib/hecks/runtime/value.rb +12 -84
  395. data/lib/hecks/runtime.rb +17 -65
  396. data/lib/hecks/storehouse.rb +146 -567
  397. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +8 -32
  398. data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
  399. data/lib/hecks/vendoring/git_environment.rb +2 -8
  400. data/lib/hecks/vendoring/git_source.rb +4 -10
  401. data/lib/hecks/vendoring.rb +7 -46
  402. data/lib/hecks/version.rb +3 -14
  403. data/lib/hecks/vocabulary.rb +5 -0
  404. data/lib/hecks.rb +32 -82
  405. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
  406. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
  407. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
  408. metadata +30 -59
  409. data/lib/hecks/bench/cli.rb +0 -74
  410. data/lib/hecks/bench/environment.rb +0 -100
  411. data/lib/hecks/bench/postgres_probe.rb +0 -41
  412. data/lib/hecks/bench/report.rb +0 -116
  413. data/lib/hecks/bench/ruby_runner.rb +0 -151
  414. data/lib/hecks/bench/run.rb +0 -55
  415. data/lib/hecks/bench/rust_runner.rb +0 -165
  416. data/lib/hecks/bench/stats.rb +0 -75
  417. data/lib/hecks/bench/suite.rb +0 -172
  418. data/lib/hecks/bench/workload.rb +0 -137
  419. data/lib/hecks/bench.rb +0 -28
  420. data/lib/hecks/codemod.rb +0 -443
  421. data/lib/hecks/corpus.rb +0 -479
  422. data/lib/hecks/doc/reference.rb +0 -585
  423. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +0 -684
  424. data/lib/hecks/fuzzing/combination_miner.rb +0 -178
  425. data/lib/hecks/fuzzing/concurrent_dispatch.rb +0 -469
  426. data/lib/hecks/fuzzing/coverage_campaign.rb +0 -161
  427. data/lib/hecks/fuzzing/differential.rb +0 -192
  428. data/lib/hecks/fuzzing/domain_generator.rb +0 -871
  429. data/lib/hecks/fuzzing/era_boundary.rb +0 -154
  430. data/lib/hecks/fuzzing/form_census.rb +0 -285
  431. data/lib/hecks/fuzzing/generated_domain_check.rb +0 -171
  432. data/lib/hecks/fuzzing/invalid_value_generator.rb +0 -125
  433. data/lib/hecks/fuzzing/isolated_boot.rb +0 -658
  434. data/lib/hecks/fuzzing/nondeterministic.rb +0 -79
  435. data/lib/hecks/fuzzing/persistence_parity.rb +0 -253
  436. data/lib/hecks/fuzzing/properties/corrections.rb +0 -125
  437. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +0 -688
  438. data/lib/hecks/fuzzing/properties/guards.rb +0 -398
  439. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +0 -399
  440. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +0 -137
  441. data/lib/hecks/fuzzing/properties/outbox.rb +0 -180
  442. data/lib/hecks/fuzzing/properties/querying.rb +0 -260
  443. data/lib/hecks/fuzzing/properties.rb +0 -267
  444. data/lib/hecks/fuzzing/qa_settings.rb +0 -164
  445. data/lib/hecks/fuzzing/replay.rb +0 -930
  446. data/lib/hecks/fuzzing/rotation_priority.rb +0 -114
  447. data/lib/hecks/fuzzing/rust_gap_manifest.rb +0 -139
  448. data/lib/hecks/fuzzing/self_consistency.rb +0 -825
  449. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +0 -532
  450. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +0 -171
  451. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +0 -127
  452. data/lib/hecks/fuzzing/sequence_generator/picker.rb +0 -116
  453. data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +0 -138
  454. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +0 -344
  455. data/lib/hecks/fuzzing/sequence_generator.rb +0 -311
  456. data/lib/hecks/fuzzing/shrinker.rb +0 -309
  457. data/lib/hecks/fuzzing/structural_skips.rb +0 -53
  458. data/lib/hecks/fuzzing/sweep_depth.rb +0 -61
  459. data/lib/hecks/fuzzing/target_capabilities.rb +0 -255
  460. data/lib/hecks/fuzzing/value_generator.rb +0 -340
  461. data/lib/hecks/fuzzing.rb +0 -23
  462. data/lib/hecks/grammar/evolve.rb +0 -524
  463. data/lib/hecks/query_ir.rb +0 -482
@@ -4,28 +4,18 @@ Hecks.bluebook "Bluebook" do
4
4
 
5
5
  reference_to Aggregate
6
6
 
7
- # THE AGGREGATE IT IS IN, AND ITS NAME. Note this is the identity of the RECORD
8
- # describing a piece, which is a different thing from the identity that piece
9
- # itself declares (`identified_by`, the list below).
7
+ # The identity of the record describing a piece, not the identity the piece declares.
10
8
  identified_by :aggregate, :name
11
9
 
12
10
  attribute :owner, EntityText
13
11
  attribute :name, EntityName
14
12
  attribute :description, EntityName
15
- # SEVERAL PATHS, joined — a piece spells an identity exactly as a head does,
16
- # which is the whole point of it being its own root.
13
+ # Several paths, joined, exactly as a head spells an identity.
17
14
  attribute :identified_by, list_of(IdentityPath)
18
15
  attribute :attributes, list_of(PieceField)
19
- # ADR 0028 — A PRECONDITION SHARED ACROSS THIS PIECE'S OWN COMMANDS,
20
- # DECLARED ONCE — the SAME Rule shape Aggregate's own `preconditions`
21
- # already carries (that file's own comment on why it's declared
22
- # again here rather than shared: a value object is aggregate-scoped
23
- # in this self-hosting domain).
16
+ # A precondition shared across this piece's commands, declared once (ADR 0028).
24
17
  attribute :preconditions, list_of(Rule)
25
- # A PIECE'S OWN SHAPE RULE — the SAME Rule shape, checked (round 7)
26
- # against EVERY INSTANCE this piece's own aggregate holds, not the
27
- # aggregate's own flat state — `ValueObject#invariants`'s own
28
- # relationship to ITS OWN instances, one construct over.
18
+ # The piece's own shape rule, checked against every instance its aggregate holds.
29
19
  attribute :invariants, list_of(Rule)
30
20
  attribute :state_field, EntityText, optional: true
31
21
  attribute :state_start, EntityText, optional: true
@@ -40,17 +30,13 @@ Hecks.bluebook "Bluebook" do
40
30
  attribute :value, String
41
31
  end
42
32
 
43
- # See Aggregate's own "Rule" value object — the identical shape,
44
- # declared again here rather than shared (that file's own comment
45
- # on why).
33
+ # Same shape as Aggregate's "Rule"; a value object is aggregate-scoped, so it is repeated.
46
34
  value_object "Rule" do
47
35
  attribute :description, String
48
36
  attribute :canonical, String
49
37
  end
50
38
 
51
- # A piece's identity is made of parts the same way a head's is, so it holds
52
- # the same shape. Declared here rather than shared because a value object
53
- # belongs to the aggregate that uses it.
39
+ # Declared here, not shared: a value object belongs to the aggregate that uses it.
54
40
  value_object "IdentityPath" do
55
41
  attribute :value, String
56
42
  end
@@ -61,9 +47,9 @@ Hecks.bluebook "Bluebook" do
61
47
  attribute :list, String
62
48
  attribute :optional, String, optional: true
63
49
  attribute :pattern, String, optional: true
64
- # optional: a declaration with no default has none (C3.7 — a value object's fields arrive or it refuses)
50
+ # A declaration with no default has none.
65
51
  attribute :default, String, optional: true
66
- # The closed set this value must belong to — see Aggregate::Field.
52
+ # The closed set this value must belong to (see Aggregate::Field).
67
53
  attribute :admits, String, optional: true
68
54
  attribute :relationship, String, optional: true
69
55
  end
@@ -74,14 +60,7 @@ Hecks.bluebook "Bluebook" do
74
60
  attribute :to_state, String
75
61
  end
76
62
 
77
- # The way back: everything DECLARED IN the aggregate above. The parent
78
- # reference IS the query.
79
- # WHERE IT SITS AMONG ITS SIBLINGS. Declaration order is a FACT ABOUT THE
80
- # SOURCE — the IR is a contract read straight from this file,
81
- # field for field AND INDEX FOR INDEX. So the language HOLDS it, instead of
82
- # inheriting it from whatever order a store happens to iterate: an ask that
83
- # does not say how it is ordered is answered in identity order, which is
84
- # right for every other ask and fatal for the one that is the SOURCE.
63
+ # Declaration order is a fact about the source, so the language holds it, not the store.
85
64
  value_object "Position" do
86
65
  attribute :value, Integer
87
66
  end
@@ -111,27 +90,15 @@ Hecks.bluebook "Bluebook" do
111
90
  emits PieceDeclared
112
91
  end
113
92
 
114
- # ONE PART OF THE PIECE'S IDENTITY, attached exactly as an aggregate's is.
115
- #
116
- # A PIECE MUST SAY WHAT IT IS KNOWN BY — the rule, where the language keeps
117
- # its rules. An entity is an element with an identity of ITS OWN ; that is
118
- # the whole difference between a piece and a value object, so a command
119
- # acting on one must be able to say which one. Undeclared, every reader
120
- # has to invent its own answer — fall through to nothing, or assume
121
- # `id` — and inventions agree only because every entity in the corpus happened
122
- # to declare it: a divergence the
123
- # declaration was masking. Requiring it removes the default there was to
124
- # disagree about. That requirement now sits on Seal, where a whole-document
125
- # rule belongs ; what stays here is the shape of each part.
93
+ # One part of the piece's identity, attached as an aggregate's is. A piece must say what
94
+ # it is known by, so readers need not guess a default; Seal holds the whole-document check.
126
95
  command "Identify" do
127
96
  role "Language"
128
97
  goal "Attach one part of the entity's identity"
129
98
 
130
99
  attribute :path, IdentityPath
131
100
 
132
- # See Aggregate.Identify, where the same rule is written out in full —
133
- # the builder resolves the real shape (dotted-unwrap, reference, or
134
- # bare scalar) before a part ever reaches here.
101
+ # See Aggregate.Identify; the builder resolves the real shape before a part reaches here.
135
102
  given("an identity part names something") { !path.value.to_s.empty? }
136
103
 
137
104
  sets :identified_by, append: { value: :path }
@@ -142,8 +109,7 @@ Hecks.bluebook "Bluebook" do
142
109
  role "Language"
143
110
  goal "Close an entity — the checks that need every declaration present"
144
111
 
145
- # A piece gets the whole-document shape a head has, for the same reason :
146
- # "it said SOMETHING" cannot be asked while the parts are still arriving.
112
+ # The whole-document check waits for Seal: "it said something" cannot be asked earlier.
147
113
 
148
114
  given("an entity says what it is known by") { !identified_by.empty? }
149
115
 
@@ -154,14 +120,8 @@ Hecks.bluebook "Bluebook" do
154
120
  role "Language"
155
121
  goal "Attach one attribute to the entity"
156
122
 
157
- # THE TYPE IS A REFERENCE TO THE VALUE OBJECT IT NAMES — the same rule
158
- # Aggregate.Attribute enforces one construct over (see that command's own
159
- # comment). An entity declares no value objects of its own (Entity never
160
- # answers `value_object` — entity.rb's own comment says why); its
161
- # attributes read the SAME pool its enclosing aggregate declares, so this
162
- # still resolves as a reference, not free text. An entity attribute naming
163
- # an undeclared value object failed to fail: `type` rode as plain text, so
164
- # reference resolution never ran and a typo'd or invented type boots clean.
123
+ # The type is a reference to the value object it names. An entity declares none itself,
124
+ # so it reads the enclosing aggregate's pool; otherwise a typo'd type would boot clean.
165
125
  reference_to ValueObject, as: :type
166
126
  attribute :name, EntityText
167
127
  attribute :list, EntityText
@@ -176,18 +136,8 @@ Hecks.bluebook "Bluebook" do
176
136
  emits PieceAttributeAttached
177
137
  end
178
138
 
179
- # An attribute that points at ANOTHER AGGREGATE'S HEAD — the SAME
180
- # construct Aggregate.Reference is, one level down (see that
181
- # command's own comment for why the type cannot be text): `belongs_to`/
182
- # `has_one`/`has_many`/`reference_to` are declared on an entity by the
183
- # same DSL (`EntityBuilder`/`AttributeCollector`) an aggregate uses,
184
- # and a real fixture already exercises it (`spec/relationship_
185
- # declaration_spec.rb`'s "uses the same relationship declarations on
186
- # an entity", `docs/reference/entity.md`). Without this verb such an
187
- # attribute fell to the SAME `Attribute` verb above, which reads
188
- # `type` as a value-object reference — so a cross-aggregate reference
189
- # declared on a piece failed reference resolution against the wrong
190
- # pool the moment entity attributes started being checked at all.
139
+ # An attribute pointing at another aggregate's head, as Aggregate.Reference is one level up.
140
+ # Without its own verb, `Attribute` would resolve the type against the wrong pool.
191
141
  command "Reference" do
192
142
  role "Language"
193
143
  goal "Attach an attribute that points at another aggregate's head"
@@ -206,17 +156,8 @@ Hecks.bluebook "Bluebook" do
206
156
  emits PieceReferenceAttached
207
157
  end
208
158
 
209
- # An attribute whose type names a PIECE NESTED INSIDE THIS ONE — the
210
- # SAME construct Aggregate.Holds is, one level down (see that
211
- # command's own comment): `attribute :dispatches, list_of(Dispatch)`
212
- # inside `entity "Handler"` (S17, ADR 0026's own two-level chain) is
213
- # exactly `Account#ledger` one level further in. Without this verb
214
- # such an attribute fell to the SAME `Attribute` verb above, which
215
- # reads `type` as a value-object reference — so a piece nested inside
216
- # a piece failed reference resolution against the wrong pool the
217
- # moment entity attributes started being checked at all (found live:
218
- # the meta-grammar's own `Handler.dispatches` naming `Dispatch`,
219
- # nested inside Handler itself).
159
+ # An attribute whose type is a piece nested in this one, as Aggregate.Holds is one level up.
160
+ # Without its own verb, reference resolution would check the type against the wrong pool.
220
161
  command "Holds" do
221
162
  role "Language"
222
163
  goal "Attach an attribute whose type is a piece nested inside this one"
@@ -236,10 +177,7 @@ Hecks.bluebook "Bluebook" do
236
177
  end
237
178
 
238
179
 
239
- # A PRECONDITION SHARED ACROSS THIS PIECE'S OWN COMMANDS, DECLARED
240
- # ONCE (ADR 0028) — see Aggregate.Precondition, the identical shape
241
- # one level down: the piece's own named `given`, referenced back by
242
- # one of its own commands rather than re-typed.
180
+ # A precondition shared across this piece's commands, declared once (ADR 0028).
243
181
  command "Precondition" do
244
182
  role "Language"
245
183
  goal "Declare one precondition this piece's own commands can reference by name"
@@ -255,10 +193,7 @@ Hecks.bluebook "Bluebook" do
255
193
  emits PiecePreconditionAttached
256
194
  end
257
195
 
258
- # A PIECE'S OWN SHAPE RULE, DECLARED ONCE (round 7) — see
259
- # Aggregate.Invariant, the identical shape one level down: checked
260
- # against every instance of this piece, not this ONE aggregate's
261
- # own flat state.
196
+ # A piece's own shape rule, checked against every instance of the piece.
262
197
  command "Invariant" do
263
198
  role "Language"
264
199
  goal "Attach one shape rule this piece's own instances must hold"
@@ -298,9 +233,7 @@ Hecks.bluebook "Bluebook" do
298
233
  emits PieceTransitionAttached
299
234
  end
300
235
 
301
- # HOW ENTITY IS SPELLED. These rows live with the concept
302
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
303
- # Contexts represented here: Entity.
236
+ # Keyword rows for this chapter; SyntaxBoot discovers aggregate-local seed tables.
304
237
  value_object "KeywordSeed" do
305
238
  attribute :word, String
306
239
  attribute :context, String, admits: "Syntax::Context"
@@ -350,14 +283,8 @@ Hecks.bluebook "Bluebook" do
350
283
 
351
284
  member keyword: "description", context: "Entity", at: "1", named: "", kind: "text", required: "true", fills: "description", coerce: "false"
352
285
  member keyword: "given", context: "Entity", at: "1", named: "", kind: "text", required: "true", fills: "description"
353
- # PLAIN TEXT, not `kind: "constant"` — unlike `Aggregate`'s own
354
- # `declared_by:` (which names a real aggregate constant), a piece
355
- # has no first-class, independently-addressable reference anywhere
356
- # in this language. "AggregateName.EntityName" ships as a string,
357
- # the same way `admits:` shipped textual before its own
358
- # constant-bridge existed — see `EntityBuilder#given_impl`'s own
359
- # comment for why this is a deliberate, not temporary-by-oversight,
360
- # divergence.
286
+ # Plain text, not a constant: a piece has no independently addressable reference, so
287
+ # "AggregateName.EntityName" ships as a string (see `EntityBuilder#given_impl`).
361
288
  member keyword: "given", context: "Entity", at: "", named: "declared_by", kind: "text", required: "false", fills: "declared_by"
362
289
  member keyword: "invariant", context: "Entity", at: "1", named: "", kind: "text", required: "true", fills: "description"
363
290
  member keyword: "identified_by", context: "Entity", at: "1", named: "", kind: "symbol", required: "false", fills: "identified_by", variadic: "true", minimum: "2"
@@ -4,53 +4,27 @@ Hecks.bluebook "Bluebook" do
4
4
 
5
5
  reference_to Bluebook
6
6
 
7
- # THE CHAPTER IT IS IN, AND ITS NAME. A policy hangs off the chapter rather
8
- # than an aggregate, so the chapter is the part above it.
7
+ # The chapter it belongs to, and its name; a policy hangs off the chapter, not an aggregate.
9
8
  identified_by :bluebook, :name
10
9
 
11
10
  attribute :name, PolicyName
12
- # WHICH HEAD DECLARED IT, empty for a reaction the chapter owns.
13
- #
14
- # A policy written inside an aggregate is hoisted onto the chapter by the
15
- # builder, and the chapter is where the runtime reads it — so nothing was ever
16
- # lost at runtime. What was lost is where it was WRITTEN, which is a fact about
17
- # the source, and facts about the source are what this language holds.
18
- # `Aggregate#to_h` does not carry it and does not need to: the wire format is
19
- # a contract, and the language may hold more than it.
11
+ # The head that declared it, empty for a reaction the chapter owns. Where it was written is a
12
+ # fact about the source, which the language holds; Aggregate#to_h does not carry it.
20
13
  attribute :aggregate, PolicyText
21
14
  attribute :on_event, PolicyText
22
15
  attribute :trigger_command, PolicyText
23
16
  attribute :target_domain, PolicyText
24
- # AN `across` TARGET THIS DOMAIN EXPECTS NEVER TO REACH — declared on
25
- # the policy that owns the expectation, not held in a core allowlist
26
- # keyed by domain name. `ModelCheck` honours it both ways: the
27
- # unknown-target and unacknowledged-relationship findings it would
28
- # otherwise raise are expected, and a declaration whose target turns
29
- # out to be known or acknowledged after all is STALE and fails.
17
+ # An `across` target this domain expects never to reach. ModelCheck treats the related findings
18
+ # as expected, and fails a declaration whose target turns out to be known after all.
30
19
  attribute :expect_undelivered, PolicyText
31
- # THE GUARD, CARRIED AS TEXT — same discipline `Command.givens`
32
- # already holds: the block that wrote it is never called at
33
- # runtime, only its EXTRACTED SOURCE is (Ports::Extraction), so
34
- # what the language holds is the string, not a live Proc no wire
35
- # format could carry. Optional — most policies fire unconditionally.
20
+ # The guard as text: only its extracted source runs (Ports::Extraction), never a live Proc.
21
+ # Optional; most policies fire unconditionally.
36
22
  attribute :where, PolicyText, optional: true
37
- # THE FAN-OUT SOURCE — a query verb ("Aggregate.query_name" or
38
- # "Domain::Aggregate.query_name"), same text shape as
39
- # `trigger_command`/`target_domain` beside it. Optional — most
40
- # policies fire once, not once per row.
23
+ # The fan-out source, a query verb ("Aggregate.query_name" or "Domain::Aggregate.query_name").
24
+ # Optional; most policies fire once, not once per row.
41
25
  attribute :for_each, PolicyText, optional: true
42
- # WHAT THE TRIGGER IS GIVEN, when the event's own shape is not it.
43
- # Empty means the whole payload forwards verbatim — what every policy
44
- # did before this existed, and still the right default for a trigger
45
- # shaped like its event.
46
- #
47
- # The same `Binding` list a saga's own `Dispatch` carries, for the
48
- # same reason: a reaction crosses an aggregate boundary, and the
49
- # event on one side is under no obligation to be shaped like the
50
- # command on the other. Without it the target has to declare every
51
- # field the event happens to carry — banking's own `FreezeAccount`
52
- # grew an attribute it never reads, and Account grew two duplicated
53
- # value objects to type it, before this word existed.
26
+ # What the trigger is given when the event's shape is not it; empty forwards the payload.
27
+ # The same Binding list a saga's Dispatch carries: the event need not match the command.
54
28
  attribute :with_spec, list_of(Binding)
55
29
 
56
30
  value_object "PolicyName" do
@@ -62,22 +36,14 @@ Hecks.bluebook "Bluebook" do
62
36
  attribute :value, String
63
37
  end
64
38
 
65
- # DECLARED HERE RATHER THAN SHARED WITH `Dispatch`'s own — a value
66
- # object belongs to the aggregate that uses it, and everything that
67
- # walks an aggregate's own scope has nowhere else to look.
39
+ # Declared here rather than shared with Dispatch's: a value object belongs to its aggregate.
68
40
  value_object "Binding" do
69
41
  attribute :key, String
70
42
  attribute :value, String
71
43
  end
72
44
 
73
- # The way back: everything DECLARED IN the chapter above. The parent
74
- # reference IS the query.
75
- # WHERE IT SITS AMONG ITS SIBLINGS. Declaration order is a FACT ABOUT THE
76
- # SOURCE — the IR is a contract read straight from this file,
77
- # field for field AND INDEX FOR INDEX. So the language HOLDS it, instead of
78
- # inheriting it from whatever order a store happens to iterate: an ask that
79
- # does not say how it is ordered is answered in identity order, which is
80
- # right for every other ask and fatal for the one that is the SOURCE.
45
+ # Declaration order among siblings. The IR is read index for index, so the language
46
+ # holds it rather than inheriting whatever order a store iterates.
81
47
  value_object "Position" do
82
48
  attribute :value, Integer
83
49
  end
@@ -129,25 +95,8 @@ Hecks.bluebook "Bluebook" do
129
95
  emits TriggerBindingAttached
130
96
  end
131
97
 
132
- # HOW POLICY IS SPELLED. These rows live with the concept
133
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
134
- # Contexts represented here: Policy.
135
- #
136
- # `on`'s ArgumentSeed gained a `kind: "constant"` row alongside its
137
- # existing `kind: "text"` one (ADR 0025, S6 — "events first-class"),
138
- # same shape `trigger`'s own pair already carries — `on
139
- # Account::AccountFrozen`, a bare constant, now parses the same way
140
- # `trigger Account::Debit` does. `calls: "on_impl"` routes the word
141
- # through a hand-written method (`PolicyBuilder#on_impl`) instead of
142
- # the generic single-fill coercion, mirroring `trigger`'s own
143
- # `calls: "trigger_impl"` on the row below. UNLIKE `trigger`,
144
- # `on_impl` does NOT refuse the quoted-text form outside
145
- # `shadow_parse` — command references were safe to refuse that way
146
- # only because they're 100% migrated across the live corpus; event
147
- # names (`emits`/`on`) are not (only Account's `AccountFrozen` is,
148
- # this pass), so refusing the old spelling here would break every
149
- # live `.bluebook` site this pass didn't touch. Both forms stay
150
- # admitted until a full corpus migration lands.
98
+ # Keyword and argument rows for the policy words; SyntaxBoot discovers every seed table.
99
+ # `on_impl` still admits quoted text: event names are not yet migrated to constants everywhere.
151
100
  value_object "KeywordSeed" do
152
101
  attribute :word, String
153
102
  attribute :context, String, admits: "Syntax::Context"