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
@@ -3,16 +3,8 @@ Hecks.bluebook "Paging" do
3
3
  generic
4
4
  attaches_to "Query", "ReadModel"
5
5
 
6
- # A PLACE TO HOLD ROWS, AND NOTHING ELSE — the same shape `Vocabulary`
7
- # (vocabulary.bluebook) already is: no commands, because nothing ever
8
- # dispatches this aggregate for real. `SyntaxBoot`'s own generic
9
- # discovery reads `KeywordSeed`/`ArgumentSeed`'s rows straight off the
10
- # declared IR, the exact way it already reads the core's own — and
11
- # dispatches them through the CORE's `Bluebook::Syntax.Keyword`/
12
- # `.Argument` verbs, which is why these rows need no entity, no
13
- # lifecycle, no creating command of their own here: the verb they ride
14
- # already exists, and a second copy of it would be the core's own
15
- # machinery duplicated for no reason.
6
+ # Holds grammar rows only, like `Vocabulary`: SyntaxBoot reads them off the declared IR and
7
+ # dispatches them through the core's `Syntax.Keyword`/`.Argument` verbs, so no commands here.
16
8
  aggregate "Syntax" do
17
9
  description "The rows this sub-language contributes to the core's own grammar table."
18
10
  identified_by PagingSyntaxName, as: :name
@@ -23,11 +15,7 @@ Hecks.bluebook "Paging" do
23
15
  invariant("a syntax table is named") { !value.to_s.empty? }
24
16
  end
25
17
 
26
- # THE SAME EIGHT ROWS syntax.bluebook held directly until now — moved,
27
- # not rewritten. `limit`/`offset`/`cursor`/`nulls`, on both `Query`
28
- # and `ReadModel`. See syntax.bluebook's own comment at the old site
29
- # for why `limit` fills a dedicated field while the other three land
30
- # on the open `options` map.
18
+ # `limit` fills a dedicated field on Query; the other three land on the open `options` map.
31
19
  value_object "KeywordSeed" do
32
20
  attribute :word, String
33
21
  attribute :context, String
@@ -68,7 +56,10 @@ Hecks.bluebook "Paging" do
68
56
  member keyword: "nulls", context: "Query", at: "1", named: "", kind: "symbol", required: "true", fills: "mode"
69
57
 
70
58
  member keyword: "limit", context: "ReadModel", at: "1", named: "", kind: "number", required: "true", fills: "value"
59
+ # ADR 0055's `on:`; see projection.bluebook's own "where"/"order_by" ReadModel rows.
60
+ member keyword: "limit", context: "ReadModel", at: "", named: "on", kind: "constant", required: "false", fills: "target"
71
61
  member keyword: "offset", context: "ReadModel", at: "1", named: "", kind: "number", required: "true", fills: "value"
62
+ member keyword: "offset", context: "ReadModel", at: "", named: "on", kind: "constant", required: "false", fills: "target"
72
63
  member keyword: "cursor", context: "ReadModel", at: "1", named: "", kind: "symbol", required: "true", fills: "value"
73
64
  member keyword: "nulls", context: "ReadModel", at: "1", named: "", kind: "symbol", required: "true", fills: "mode"
74
65
  end
@@ -2,17 +2,7 @@ Hecks.bluebook "Bluebook", version: "1" do
2
2
  vision "The bluebook language, declared in itself. Loading a domain becomes dispatching commands into this meta-domain ; the IR it stores must equal the IR the DSL builder produces. The floor that stays hand-written is the interpreter — evaluating a predicate held as data — and IO."
3
3
  core
4
4
 
5
- # A WHOLE BLUEBOOK, handed back in one read.
6
- #
7
- # The twelve `DeclaredIn` queries below can walk the tree a level at a time, and
8
- # a caller stitching twelve reads together is a caller reimplementing this. The
9
- # language already knows how to say "gather these heads around that spine" —
10
- # it is what a read model IS — so the reconstruction is DECLARED rather than
11
- # coded, and the shape of what comes back is a fact about the language instead
12
- # of a fact about whoever wrote the reader.
13
- #
14
- # Spined on Bluebook because a bluebook is what you ask for. Everything else
15
- # hangs off it, down to a Member's pairs and a Dispatch's bindings.
5
+ # A whole bluebook in one read: every declaration gathered around the chapter itself.
16
6
  read_model "WholeBluebook" do
17
7
  description "Every declaration of one chapter, gathered around the chapter itself — the way back, in a single read."
18
8
  reference_to Bluebook
@@ -34,54 +24,21 @@ Hecks.bluebook "Bluebook", version: "1" do
34
24
  aggregate "Bluebook" do
35
25
  description "One .bluebook file — the root a domain declaration hangs from."
36
26
 
37
- # A CHAPTER IS KNOWN BY ITS NAME, which is what anyone would have said.
38
- #
39
- # It was not, and the reason it was not is worth keeping : the runtime read the
40
- # identity out of the payload under its head's own name, so a command that both
41
- # REACHED a bluebook and carried a name could not say both, and `Normalise`
42
- # could never name what it acts on. The answer at the time was to duck it —
43
- # keep `name` a plain field and be reached by a minted `id` like nothing else
44
- # in the language.
45
- #
46
- # The duck is what is gone. A command reaches its root through the REFERENCE it
47
- # declares (`bluebook_id`), which is a different key from any argument it
48
- # carries, so the two cannot collide however they are spelled. The fallback was
49
- # hiding a lookup bug ; removing it made the bug visible, and the bug was the
50
- # smaller thing.
27
+ # A chapter is identified by its name; commands reach it through the `bluebook_id` reference.
51
28
  identified_by BluebookName, as: :name
52
29
 
53
30
  attribute :vision, Vision
54
31
  attribute :classification, Classification
55
- # A domain CONTRACT version, pinned per chapter — `Hecks.bluebook "Pizzas",
56
- # version: "v2"`. Held here because the language must hold everything the
57
- # runtime runs on, and this was the one field it did not: the round trip sliced
58
- # its comparison by the reconstruction's own keys, so a version was excluded
59
- # from the check rather than failing it, and a chapter assembled purely from
60
- # these records would have lost it in silence. Most chapters declare none, and
61
- # ABSENT IS NOT EMPTY — an unversioned chapter offers nothing here at all.
32
+ # Contract version pinned per chapter, e.g. `version: "v2"`. Absent is not empty.
62
33
  attribute :version, Version
63
- # A domain's own identity can change — held here so a rename is a
64
- # declared fact the language carries, not just a Ruby-side accessor.
65
- # Most chapters declare none, and ABSENT IS NOT EMPTY, the same
66
- # reading `version` above gives.
34
+ # A rename is a declared fact. Absent is not empty.
67
35
  attribute :formerly_known_as, FormerlyKnownAs
68
36
  attribute :normalisations, list_of(NormalisationRule)
69
- # THE SEAM ADR 0026 ADDS. A sub-language chapter (Paging, so far the
70
- # only one) names the core contexts its own `Syntax` aggregate
71
- # contributes rows for — "Query", "ReadModel" — so SyntaxBoot's own
72
- # discovery can find it without the core ever naming it back. Most
73
- # chapters attach to nothing, and ABSENT IS NOT EMPTY, the same
74
- # reading `version`/`formerly_known_as` above give.
37
+ # Core contexts a sub-language chapter contributes Syntax rows for (ADR 0026).
38
+ # Absent is not empty: most chapters attach to nothing.
75
39
  attribute :attaches_to, list_of(AttachesToContext)
76
- # A CAPABILITY THIS CHAPTER ANSWERS FOR OTHER DOMAINS — declared, so
77
- # nothing downstream has to recognise the chapter BY NAME. One row
78
- # per (capability, key, verb): `provides "authorization", grant:
79
- # "RoleAssignment.Assign"` is the row (authorization, grant,
80
- # RoleAssignment.Assign). The runtime's role check, boot's
81
- # ungoverned-role refusal, the authorization adapter and the fuzzer
82
- # all read the rows rather than the literal "Governance". Most
83
- # chapters provide nothing, and ABSENT IS NOT EMPTY, the same reading
84
- # `attaches_to` above gives.
40
+ # Capabilities this chapter answers for other domains, one row per (capability, key, verb).
41
+ # Absent is not empty: most chapters provide nothing.
85
42
  attribute :provides, list_of(Provision)
86
43
 
87
44
  value_object "Provision" do
@@ -159,11 +116,7 @@ Hecks.bluebook "Bluebook", version: "1" do
159
116
  emits ChapterDeclared
160
117
  end
161
118
 
162
- # ONE CONTEXT THE CHAPTER ATTACHES TO, appended the way one identity
163
- # part is (Aggregate.Identify, above) — `attaches_to "Query",
164
- # "ReadModel"` names any number at once, and a list is filled by a
165
- # verb of its own here the same reason it is everywhere else in this
166
- # language.
119
+ # Appends one context; `attaches_to "Query", "ReadModel"` names several at once.
167
120
  command "Attach" do
168
121
  role "Language"
169
122
  goal "Name one core context this chapter's own Syntax rows attach to"
@@ -171,21 +124,13 @@ Hecks.bluebook "Bluebook", version: "1" do
171
124
  attribute :context, AttachesToContext
172
125
 
173
126
  sets :attaches_to, append: { value: :context }
174
- # S16, ADR 0026 — the language's own self-use gate: an append is
175
- # exactly the shape banking's own ensures already checks ("a
176
- # ledger entry was posted") { ledger.size == old.ledger.size + 1
177
- # } — one more row than before, never fewer, never the same.
127
+ # Appending grows the list by exactly one row.
178
128
  ensures("the list grew by exactly one") { attaches_to.size == old.attaches_to.size + 1 }
179
129
  emits ChapterAttached
180
130
  end
181
131
 
182
- # ONE ROW OF ONE CAPABILITY — `provides "authorization", assignments:
183
- # ..., grant: ..., transitions: ...` offers three, one per key, in the
184
- # order they were written. Membership (`admit`/`grant`/`people`) and
185
- # identity (`register`/`link`/`resolve`) use the same word with their
186
- # own named keys; the argument table admits every key any capability
187
- # declares, and `Capabilities::CONTRACTS` holds which keys a given
188
- # capability must name.
132
+ # One row of one capability: `provides "authorization", grant: ...` offers one row per key.
133
+ # `Capabilities::CONTRACTS` holds which keys a capability must name.
189
134
  command "Provide" do
190
135
  role "Language"
191
136
  goal "Declare one verb this chapter answers a capability with"
@@ -199,19 +144,8 @@ Hecks.bluebook "Bluebook", version: "1" do
199
144
  emits CapabilityProvided
200
145
  end
201
146
 
202
- # THE WAY BACK.
203
- #
204
- # Until these existed the meta-domain was write-only: twelve categories, 34
205
- # verbs, and not one query. A bluebook could be dispatched in and never read
206
- # out, which is exactly as much as JUDGING requires — offer every declaration,
207
- # collect the refusals, throw the records away. It is also why the language
208
- # could only validate. A store you cannot read cannot be the source of
209
- # anything, and "loading a domain becomes dispatching commands into this
210
- # meta-domain" — the vision at the top of this file — needs the records to
211
- # come back out as the IR the runtime runs.
212
- # Named to finish a sentence about the thing, the way every other query in the
213
- # corpus is — pizzas COSTING LESS THAN a ceiling, orders PENDING, cards
214
- # ACTIVE. So: the bluebook CALLED "Pizzas".
147
+ # Reads a bluebook back out, not only in.
148
+ # Named to finish a sentence: the bluebook CALLED "Pizzas".
215
149
  query "Called" do
216
150
  attribute :name, BluebookName
217
151
  where(name: :name)
@@ -235,9 +169,7 @@ Hecks.bluebook "Bluebook", version: "1" do
235
169
  emits NormalisationAttached
236
170
  end
237
171
 
238
- # HOW BLUEBOOK IS SPELLED. These rows live with the concept
239
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
240
- # Contexts represented here: File, Bluebook.
172
+ # Keyword rows for this chapter; SyntaxBoot discovers every aggregate-local seed table.
241
173
  value_object "KeywordSeed" do
242
174
  attribute :word, String
243
175
  attribute :context, String, admits: "Syntax::Context"
@@ -1,19 +1,7 @@
1
- # THE LANGUAGE IS A DOMAIN LIKE ANY OTHER, and this is the line that
2
- # says so. `lib/hecks/language/bluebook/` describes what a bluebook
3
- # IS — nine files, one chapter — and until MetaValidator.defer existed it
4
- # could not be booted the ordinary way at all: each file was judged
5
- # before its siblings had been read, so Aggregate's reference to Bluebook
6
- # dangled and the load refused. It boots now, which means it can also be
7
- # fuzzed, model-checked and inspected exactly like banking or pizzas.
8
- #
9
- # Memory because this chapter is read, never written to a store — nothing
10
- # dispatches a command against the language in production. A binding
11
- # still has to be DECLARED rather than defaulted, so that what answers is
12
- # a stated fact rather than whatever the runtime happened to fall back on.
1
+ # The bluebook language as an ordinary domain, so it can be booted, fuzzed and model-checked.
2
+ # Memory: this chapter is read, never written to a store.
13
3
  Hecks.hecksagon "Bluebook" do
14
- # Several constructs here declare `role "Language"` (Aggregate.Declare,
15
- # Entity.Declare, ...) — only real access control once Governance can
16
- # check it against something (S8).
4
+ # `role "Language"` is real access control only once Governance can check it (S8).
17
5
  uses_framework "Governance"
18
6
  persisted_by "Memory"
19
7
  end
@@ -4,28 +4,12 @@ Hecks.bluebook "Bluebook" do
4
4
 
5
5
  reference_to Aggregate
6
6
 
7
- # WHICH PIECE DECLARED IT, when a piece did. A command argument with no
8
- # attribute to land in does not persist — the same lesson `disputed_by` taught
9
- # on CardPayment — so the field has to exist here for Command.Declare's
10
- # `entity_id` to be held at all.
7
+ # The entity that declared it, when one did; Command.Declare's `entity_id` needs it.
11
8
  reference_to Entity, as: :entity_id, optional: true
12
9
 
13
- # SPELLED AS THE IR SPELLS THEM. The judge walks a built IR and offers each
14
- # field by name, so a field named differently here would need a translation
15
- # table between two vocabularies for the same thing — and a table is a place
16
- # to be wrong quietly. One spelling, and the walk reads straight through.
17
- # THE IMMEDIATE OWNER, AND ITS NAME. Almost every chapter declares a
18
- # `Declare` ; the owner is what tells one from another.
19
- #
20
- # `owner_id` NOT `aggregate_id` : a command declared on an ENTITY is that
21
- # entity's, not its aggregate's — `Banking:Account:LedgerEntry:Amend` is
22
- # LedgerEntry's Amend, and `Banking:Account:LedgerEntry` is what tells it
23
- # apart from a same-named command on some OTHER entity of the same
24
- # aggregate. `aggregate_id` (kept, below, as data) still names the true
25
- # root, for the DeclaredIn walk that gathers every command under a
26
- # chapter’s aggregate whichever piece declared it ; `owner_id` names only
27
- # whichever declared THIS one. `owner_id` is not a declared attribute —
28
- # it is the WALK's immediate parent, read the same way `position` is.
10
+ # Field names match the IR's so the judge can walk it without a translation table.
11
+ # `owner_id` is the walk's immediate parent (an entity's command belongs to the entity);
12
+ # `aggregate_id` still names the true root for the DeclaredIn walk.
29
13
  identified_by :owner_id, :name
30
14
 
31
15
  attribute :name, CommandName
@@ -35,19 +19,11 @@ Hecks.bluebook "Bluebook" do
35
19
  attribute :references, EventName, optional: true
36
20
  attribute :attributes, list_of(Argument)
37
21
  attribute :givens, list_of(Rule)
38
- # THE POSTCONDITIONS — same Rule shape as givens, checked on the other
39
- # side of the mutations: a given says what must hold to begin, an
40
- # ensures says what must hold to have finished. Meyer's third leg.
22
+ # Postconditions: same Rule shape as givens, checked after the mutations.
41
23
  attribute :ensures, list_of(Rule)
42
24
  attribute :mutations, list_of(Change)
43
25
  attribute :provenance, CommandText
44
- # LIFECYCLE STATE AS A COMMAND GUARD (S10, ADR 0025) — a LITERAL,
45
- # the same shape `provenance`/`default:` already carry (`from:
46
- # "open"` or `from: ["open", "frozen"]`, encoded and decoded the
47
- # same way any other Ruby literal on this construct is), not a
48
- # dedicated list-of-value-object the way `givens` is — the guard
49
- # names no target state and moves nothing, so it needs no Rule-
50
- # shaped predicate at all, only the states it admits.
26
+ # Lifecycle guard as a literal (`from: "open"` or `from: ["open", "frozen"]`); ADR 0025.
51
27
  attribute :from, CommandText, optional: true
52
28
 
53
29
  value_object "CommandName" do
@@ -57,15 +33,11 @@ Hecks.bluebook "Bluebook" do
57
33
 
58
34
  value_object "Actor" do
59
35
  attribute :value, String
60
- # RELAXED for the experiment : banking leaves 19 of 40 commands without a
61
- # role, and the hand-written CommandBuilder never required one. Whether
62
- # role/goal are mandatory is a language decision — the meta-domain found
63
- # the drift the moment it enforced uniformly.
36
+ # Optional: many commands declare no role or goal, and the builder never required one.
64
37
  end
65
38
 
66
39
  value_object "Goal" do
67
40
  attribute :value, String
68
- # RELAXED — see Actor above.
69
41
  end
70
42
 
71
43
  value_object "EventName" do
@@ -82,10 +54,9 @@ Hecks.bluebook "Bluebook" do
82
54
  attribute :list, String
83
55
  attribute :optional, String, optional: true
84
56
  attribute :pattern, String, optional: true
85
- # optional: a declaration with no default has none (C3.7 — a value object's fields arrive or it refuses)
57
+ # A declaration with no default has none.
86
58
  attribute :default, String, optional: true
87
- # The closed set this value must belong to — see Aggregate::Field, which is
88
- # the same declaration, spelled for a command's arguments.
59
+ # The closed set this value must belong to (see Aggregate::Field).
89
60
  attribute :admits, String, optional: true
90
61
  attribute :relationship, String, optional: true
91
62
  end
@@ -97,32 +68,17 @@ Hecks.bluebook "Bluebook" do
97
68
 
98
69
  value_object "Change" do
99
70
  attribute :target, String
100
- # The same word, one aggregate over. `OpName` used to carry
101
- # `set || append || increment || decrement` in an invariant — Vocabulary's
102
- # MutationOp written out a second time, one level in, with nothing
103
- # comparing the two. Naming the set is the whole of what that invariant was
104
- # trying to say, and it says it where the set actually lives.
105
71
  attribute :op, String, admits: "Vocabulary::MutationOp"
106
72
  attribute :field, String
107
73
  attribute :kind, String
108
74
  attribute :source, String
109
75
  end
110
76
 
111
- # A plain string holder, for the id of the aggregate above. Command had no
112
- # generic text value object and the alternatives all meant something else —
113
- # RuleText is a predicate, FieldRef is a field, ArgType is a type. Reusing one
114
- # of those would read as a lie, the way `bluebook_id` typed AggregateName did.
77
+ # Plain string holder for an aggregate id; the other text value objects mean something else.
115
78
  value_object "CommandText" do
116
79
  attribute :value, String
117
80
  end
118
- # The way back: everything DECLARED IN the aggregate above. The parent
119
- # reference IS the query.
120
- # WHERE IT SITS AMONG ITS SIBLINGS. Declaration order is a FACT ABOUT THE
121
- # SOURCE — the IR is a contract read straight from this file,
122
- # field for field AND INDEX FOR INDEX. So the language HOLDS it, instead of
123
- # inheriting it from whatever order a store happens to iterate: an ask that
124
- # does not say how it is ordered is answered in identity order, which is
125
- # right for every other ask and fatal for the one that is the SOURCE.
81
+ # Declaration order is a fact about the source, so the language holds it, not the store.
126
82
  value_object "Position" do
127
83
  attribute :value, Integer
128
84
  end
@@ -139,18 +95,12 @@ Hecks.bluebook "Bluebook" do
139
95
  goal "Open a command on an aggregate"
140
96
 
141
97
  reference_to Aggregate
142
- # DECLARED ON AN AGGREGATE, or on one of its ENTITIES. The IR uses the same
143
- # Command for both — an entity's commands are Command objects — so the
144
- # language uses the same Command, and says which piece declared it when a piece
145
- # did. Absent for an aggregate's own commands, and ABSENT is not EMPTY.
98
+ # Declared on an aggregate or one of its entities; absent for an aggregate's own commands.
146
99
  reference_to Entity, as: :entity_id, optional: true
147
100
  attribute :name, CommandName
148
101
  attribute :role, Actor, optional: true
149
102
  attribute :goal, Goal, optional: true
150
- # See Aggregate.Declare's own `provenance` — identical shape, one
151
- # level down.
152
103
  attribute :provenance, CommandText, optional: true
153
- # See this aggregate's own `from` field comment, above.
154
104
  attribute :from, CommandText, optional: true
155
105
 
156
106
  attribute :position, Position, optional: true
@@ -175,18 +125,9 @@ Hecks.bluebook "Bluebook" do
175
125
  attribute :optional, ArgType, optional: true
176
126
  attribute :pattern, ArgType, optional: true
177
127
  attribute :default, ArgType, optional: true
178
- # The closed set this argument's value must belong to — see
179
- # Aggregate.Attribute, which carries the same word for a head's attributes.
128
+ # The closed set this argument's value must belong to (see Aggregate.Attribute).
180
129
  attribute :admits, ArgType, optional: true
181
- # Whether this argument was minted verbatim from the owning aggregate/
182
- # entity's own reference-typed attribute (`sets :field` importing a
183
- # `reference_to`/`has_many`/`has_one`/`belongs_to` field rather than
184
- # retyping it) — see Aggregate.Attribute, which carries the same word
185
- # for a head's own attributes. Missing here, a round trip through the
186
- # self-hosted meta-domain silently dropped it for every command
187
- # argument, even though the live DSL builder set it correctly in
188
- # memory (CommandBuilder#resolve_bare_set!) — the wire just never
189
- # carried it back.
130
+ # Marks an argument minted from the owner's reference-typed attribute.
190
131
  attribute :relationship, ArgType, optional: true
191
132
 
192
133
  sets :attributes, append: { name: :name, type: :type, list: :list, default: :default, optional: :optional, pattern: :pattern, admits: :admits, relationship: :relationship }
@@ -194,32 +135,19 @@ Hecks.bluebook "Bluebook" do
194
135
  emits ArgumentAttached
195
136
  end
196
137
 
197
- # An argument that points at ANOTHER aggregate's head — the same word
198
- # `reference_to`, written on a command instead of on the head.
199
- #
200
- # `Argument` types its type as text, so a reference argument arrived as the
201
- # STRING "Reference<Customer>" and the language held a spelling rather than a
202
- # reference. That left "a reference points at a declared head" enforceable
203
- # only by a `raise Malformed` in the DSL, for three of the four places the
204
- # word can be written. As a reference it is a consequence of the model here
205
- # too, exactly as Aggregate.Reference made it one on a head.
138
+ # An argument pointing at another aggregate's head, typed as a reference, not text.
206
139
  command "Reference" do
207
140
  role "Language"
208
141
  goal "Attach an argument that points at another aggregate's head"
209
142
 
210
143
  reference_to Aggregate, as: :points_at
211
- # No `given` that the name is present : ArgName already carries that
212
- # invariant, and a value object's invariant fires during coercion — before
213
- # any given is reached. A rule that cannot be the one to refuse is
214
- # decoration, and this language has paid for that mistake before.
144
+ # No `given` on the name: ArgName's invariant fires first, during coercion.
215
145
  attribute :name, ArgName
216
146
  attribute :list, ArgType
217
147
  attribute :optional, ArgType, optional: true
218
148
  attribute :pattern, ArgType, optional: true
219
149
  attribute :default, ArgType, optional: true
220
150
  attribute :admits, ArgType, optional: true
221
- # See Argument's own :relationship, just above — the same gap, one
222
- # verb over.
223
151
  attribute :relationship, ArgType, optional: true
224
152
 
225
153
  sets :attributes, append: { name: :name, type: :points_at, list: :list, default: :default, optional: :optional, pattern: :pattern, admits: :admits, relationship: :relationship }
@@ -276,10 +204,7 @@ Hecks.bluebook "Bluebook" do
276
204
  goal "Attach one mutation to the command"
277
205
 
278
206
  attribute :target, FieldRef
279
- # NAMED ON THE ARGUMENT, not only on the Change row it fills. The row is
280
- # what the IR holds ; THIS is what a caller hands in, so this is where a
281
- # bad op has to be refused — `OpName`'s deleted invariant was refusing
282
- # exactly here, and the link has to reach the same door to replace it.
207
+ # Named on the argument: this is what a caller hands in, so a bad op is refused here.
283
208
  attribute :op, OpName, admits: "Vocabulary::MutationOp"
284
209
  attribute :field, FieldRef
285
210
  attribute :kind, FieldRef
@@ -297,11 +222,6 @@ Hecks.bluebook "Bluebook" do
297
222
  attribute :value, String
298
223
  end
299
224
 
300
- # THE SET IT ADMITS IS NAMED, NOT RESTATED. This carried
301
- # `set || append || increment || decrement` — Vocabulary::MutationOp written
302
- # out a second time, one level in, which is exactly the kind of copy
303
- # that drifts. `Change.op` now says `admits:
304
- # Vocabulary::MutationOp`, so there is no second list left to drift.
305
225
  value_object "OpName" do
306
226
  attribute :value, String
307
227
  end
@@ -310,9 +230,7 @@ Hecks.bluebook "Bluebook" do
310
230
  role "Language"
311
231
  goal "Name the aggregate this command reaches through"
312
232
 
313
- # NAMED `root`, not `references` : a command argument SHADOWS the aggregate
314
- # field of the same name inside a given, so a once-only rule cannot read
315
- # the state it guards unless the two differ.
233
+ # Named `root`, not `references`: an argument shadows the aggregate field of that name.
316
234
  attribute :root, EventName
317
235
 
318
236
  given("a command names what it acts on") { !root.value.to_s.empty? }
@@ -336,9 +254,7 @@ Hecks.bluebook "Bluebook" do
336
254
  emits AnnouncementNamed
337
255
  end
338
256
 
339
- # HOW COMMAND IS SPELLED. These rows live with the concept
340
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
341
- # Contexts represented here: Command.
257
+ # Keyword rows for this chapter; SyntaxBoot discovers aggregate-local seed tables.
342
258
  value_object "KeywordSeed" do
343
259
  attribute :word, String
344
260
  attribute :context, String, admits: "Syntax::Context"
@@ -357,37 +273,18 @@ Hecks.bluebook "Bluebook" do
357
273
  member word: "reference_to", context: "Command", body: "none", inner: "", opens: "", fills: "references", calls: "reference_to_impl"
358
274
  member word: "given", context: "Command", body: "source", inner: "", opens: "", fills: "givens", resolves_via: "hash_chain", calls: "given_impl"
359
275
  member word: "sets", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", calls: "sets_impl"
360
- # RENAMED spelling of `sets`, above — its own dedicated, deprecated row
361
- # (not `sets`'s own `was:`, syntax_conformance_spec.rb's own "no
362
- # renamed-away spelling as a row of its own AND a was:" rule), kept
363
- # here refusing live ONLY so `MetaValidator.shadow_parsing?` can still
364
- # read frozen era text that used it (CommandBuilder#then_set_impl's
365
- # own comment).
276
+ # Deprecated spelling of `sets`, still refused live so MetaValidator.shadow_parsing? can
277
+ # read frozen era text that used it.
366
278
  member word: "then_set", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", status: "deprecated", calls: "then_set_impl"
367
- # A command's synchronous handoff into one nested entity command
368
- # (CommandBuilder#delegates_to_impl's own comment gives the full
369
- # reasoning) — a new word, not a migrated one.
279
+ # Synchronous handoff into one nested entity command (CommandBuilder#delegates_to_impl).
370
280
  member word: "delegates_to", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", calls: "delegates_to_impl"
371
281
  member word: "emits", context: "Command", body: "none", inner: "", opens: "", fills: "emits"
372
- # A VALUE, NOT A DECLARATION — `state(:field)` is written INSIDE a
373
- # `sets` (`append: { knights: state(:knights) }`, `to: state(:ply)`)
374
- # and names the record's own field as that mutation's source; it
375
- # fills nothing of its own, the `sets` it sits in fills `mutations`.
282
+ # A value written inside a `sets` (`to: state(:ply)`); it fills nothing of its own.
376
283
  member word: "state", context: "Command", body: "none", inner: "", opens: "", fills: "mutations"
377
284
  member word: "attribute", context: "Command", body: "none", inner: "", opens: "", fills: "attributes", calls: "attribute_impl"
378
285
  member word: "ensures", context: "Command", body: "source", inner: "", opens: "", fills: "ensures"
379
- # RETROACTIVE CORRECTION — a command that amends a specific past
380
- # event rather than acting fresh (see this domain's own ADR on why:
381
- # sagas only compensate their OWN anticipated failures, eras only
382
- # reinterpret stored shape, and the event log stays append-only —
383
- # so nothing existing lets a command say "this is amending a fact
384
- # we already announced, and here is why"). STORED AS A MUTATION,
385
- # not a new Command field — the same reasoning `delegates_to`'s own
386
- # comment gives in full: `mutations:` is ALREADY a fully round-
387
- # tripped part of the self-hosted meta-domain's own contract, and a
388
- # genuinely new top-level Command field is not. `corrects` rides the
389
- # SAME multi-binding wire shape `append`/`delegate` already use
390
- # (CommandBuilder#corrects_impl's own comment has the rest).
286
+ # Amends a specific past event. Stored as a mutation so it round-trips with the other
287
+ # mutation words (CommandBuilder#corrects_impl).
391
288
  member word: "corrects", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", calls: "corrects_impl"
392
289
 
393
290
  end
@@ -436,14 +333,7 @@ Hecks.bluebook "Bluebook" do
436
333
  member keyword: "then_set", context: "Command", at: "", named: "remove", kind: "literal", required: "false", fills: "source", selects: "op=remove"
437
334
  member keyword: "delegates_to", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "target"
438
335
  member keyword: "delegates_to", context: "Command", at: "", named: "with", kind: "literal", required: "false", fills: "source", selects: "op=delegate"
439
- # BARE CONSTANT ACCEPTED (ADR 0025, S6 — "events first-class"),
440
- # `emits Account::AccountFrozen`, same `kind: "constant"` +
441
- # `kind: "text"` pair `on`'s own row in `policy.bluebook` carries
442
- # — both stay admitted, the old spelling not refused, for the
443
- # same reason (event names aren't 100% corpus-migrated the way
444
- # command references are). `CommandBuilder#emits` (hand-written,
445
- # no `calls:` needed — the single-fill path already invokes it by
446
- # its own word name) resolves either shape via `Naming.event_ref`.
336
+ # A bare constant (`emits Account::AccountFrozen`) or text; both go through Naming.event_ref.
447
337
  member keyword: "emits", context: "Command", at: "1", named: "", kind: "constant", required: "true", fills: "emits"
448
338
  member keyword: "emits", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "emits"
449
339
  member keyword: "state", context: "Command", at: "1", named: "", kind: "symbol", required: "true", fills: "source"
@@ -454,14 +344,7 @@ Hecks.bluebook "Bluebook" do
454
344
  member keyword: "attribute", context: "Command", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
455
345
  member keyword: "attribute", context: "Command", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
456
346
  member keyword: "attribute", context: "Command", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
457
- # `corrects` — see the KeywordSeed row's own comment. `event` is the
458
- # only positional and the only required-by-the-grammar argument;
459
- # `reason` is required IN PRACTICE (CommandBuilder#corrects_impl
460
- # refuses its absence by hand, the same way `sets` refuses two ops
461
- # at once — a fact about runtime state, not a pure per-row fill, so
462
- # it stays hand-enforced rather than declared `required: "true"`
463
- # here, which would only gate the row's OWN presence, not a sibling
464
- # kwarg's).
347
+ # `reason` is required in practice; CommandBuilder#corrects_impl refuses its absence.
465
348
  member keyword: "corrects", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "target"
466
349
  member keyword: "corrects", context: "Command", at: "", named: "as", kind: "symbol", required: "false", fills: "source"
467
350
  member keyword: "corrects", context: "Command", at: "", named: "reason", kind: "text", required: "false", fills: "source"