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
@@ -1,44 +1,11 @@
1
1
  module Hecks
2
2
  module Bluebook
3
3
  module MetaValidator
4
- # What the language says about itself, read back as something walkable.
5
- #
6
- # ## Why a plan, not a hand-written branch per category
7
- #
8
- # "Which append command belongs to which list is not derivable from a
9
- # name" sounds like a reason to hand-write one branch per category —
10
- # and is beside the point. It is derivable from the language's own IR,
11
- # because every append command declares its target:
12
- #
13
- # command "Argument" do
14
- # reference_to Command
15
- # then_set :arguments, append: { name: :name, type: :type, ... }
16
- # end
17
- #
18
- # That one line says both things a walk needs: `Command.Argument` is the
19
- # appender for the `arguments` list, and the map binds each value-object
20
- # field to the command argument that fills it. Nothing is matched by name.
21
- #
22
- # The same reading recovers the containment tree. A command with no
23
- # self-reference is the creating one, and the `*_id` argument it carries
24
- # names the parent — so Bluebook -> Aggregate -> Command / ValueObject /
25
- # Query / Entity, ValueObject -> Member, ProcessManager -> Handler ->
26
- # Dispatch all fall out of the declarations rather than being restated here.
27
- #
28
- # ## Usage
29
- #
30
- # plan = Plan.for(MetaValidator.grammar_registry)
31
- # plan.category("Command").parent # => "Aggregate"
32
- # plan.category("Command").appends["rules"] # => Append(verb: "Rule", map: {...})
33
- # plan.verbs # every Bluebook:: verb declared
34
- #
35
- # This reads the language. It does not read a bluebook and it dispatches
36
- # nothing — that is the judge's job.
4
+ # The language's own self-description, read back as a walkable structure:
5
+ # which command appends to which list, and how the containment tree nests.
37
6
  class Plan
38
7
  # One append command: the verb, and the value-object-field -> argument map.
39
- # `:map` shadows Enumerable#map on purpose — `spec/plan_spec.rb`
40
- # itself asserts `appends["emits"].map` reads the field (a Hash),
41
- # not an Enumerable#map result. Verified before disabling this cop.
8
+ # `:map` shadows Enumerable#map on purpose; spec/plan_spec.rb asserts on it.
42
9
  # rubocop:disable-next Lint/StructNewOverride
43
10
  Append = Struct.new(:verb, :map, keyword_init: true)
44
11
 
@@ -50,9 +17,8 @@ module Hecks
50
17
  :appends, :alternates, :setters, :sealers, :references,
51
18
  :identity_paths, :entity_owned,
52
19
  keyword_init: true) do
53
- # Every verb this category declares, in declaration order. `alternates`
54
- # matters here: two commands can append to one list, and a verb missing
55
- # from this is a verb the coverage gate stops watching.
20
+ # Every verb this category declares, in declaration order; a verb missing
21
+ # here is one the coverage gate stops watching.
56
22
  #
57
23
  # @return [Array<String>] every command name this category declares
58
24
  # (the creating command, every setter, appender, alternate
@@ -62,10 +28,7 @@ module Hecks
62
28
  *alternates.map(&:verb), *sealers].compact
63
29
  end
64
30
 
65
- # Does this argument carry an ID? A reference is the id of a head, and
66
- # an id is a scalar — so the judge offers it bare, where every other
67
- # field goes as a one-field value object. The language answers this
68
- # about itself, so declaring a new reference needs no change here.
31
+ # Whether `argument` on `verb` carries an ID rather than a value.
69
32
  #
70
33
  # @param verb [String] the command name declaring `argument`
71
34
  # @param argument [String] the argument name to check
@@ -74,11 +37,7 @@ module Hecks
74
37
  Array(references[verb.to_s]).include?(argument.to_s)
75
38
  end
76
39
 
77
- # Reports whether this category is the root of the containment
78
- # tree.
79
- #
80
- # @return [Boolean] whether this category has no parent — the root
81
- # of the containment tree
40
+ # Whether this category has no parent — the root of the containment tree.
82
41
  def root? = parent.nil?
83
42
  end
84
43
 
@@ -105,38 +64,12 @@ module Hecks
105
64
 
106
65
  @categories[aggregate.hecks_name] = read(aggregate)
107
66
 
108
- # S17, ADR 0026 — Member/Handler/Dispatch are entities now
109
- # (`entity "Member" do ... end`, nested under `ValueObject`/
110
- # `ProcessManager`/`Handler`), not their own top-level
111
- # aggregates — so `meta.aggregates` alone no longer finds
112
- # them the way it always found a standalone `aggregate
113
- # "Member"`. Each still needs its own named category here:
114
- # `Assembly::Contracts` keeps a bespoke entry for each
115
- # (Member's own open-map `pairs`, Dispatch's own open-map
116
- # `with_spec`), distinct from the single generic "Entity"
117
- # category every ordinary real-corpus entity (LedgerEntry,
118
- # Withdrawal, ...) is described through instead. Safe to
119
- # walk every meta-domain aggregate's own `.entities`
120
- # unconditionally — `Plan` only ever reads the meta-
121
- # domain's own self-description (`Plan.for(MetaValidator.
122
- # grammar_registry)`), which never declares a generic,
123
- # nameless entity of its own the way a real domain's
124
- # `LedgerEntry` is; the only entities the meta-domain
125
- # itself ever declares are exactly the three this ADR
126
- # names. `entity_owned: true` records why this is a
127
- # category at all — the real runtime has no top-level
128
- # aggregate named "Member" to dispatch a bare verb into
129
- # any more, so the judge has to build a dotted one instead
130
- # (see `Judge#verb_for`).
131
- #
132
- # Recurses — `Dispatch` nests inside `Handler`, which nests
133
- # inside `ProcessManager`, two levels deep, not one. Each
134
- # nested entity's own `parent` names the direct owner it was
135
- # actually found under (Dispatch's is "Handler", not
136
- # "ProcessManager") — `read`'s own `owner:` argument already
137
- # takes whichever name is passed, so walking one level deeper
138
- # each recursive call is the whole change; nothing about
139
- # `read` itself needed to know how deep it was called from.
67
+ # Member, Handler and Dispatch are entities nested under their
68
+ # owning aggregate (ADR 0026), so `meta.aggregates` alone never
69
+ # finds them; `add_nested_entities` walks each aggregate's own
70
+ # `.entities`, recursing (Dispatch nests inside Handler inside
71
+ # ProcessManager), with `entity_owned: true` marking that this
72
+ # category has no top-level aggregate a bare verb can dispatch into.
140
73
  add_nested_entities(aggregate)
141
74
  end
142
75
  @categories.freeze
@@ -156,16 +89,7 @@ module Hecks
156
89
  def names = @categories.keys
157
90
 
158
91
  # Every verb the language declares, spelled as the judge would
159
- # dispatch it. S17, ADR 0026 — an entity-owned category (its
160
- # own `entity_owned` flag) has no real top-level aggregate the
161
- # runtime can route a bare verb into any more, so it is
162
- # spelled dotted here too — `Bluebook::ValueObject.Member.
163
- # Declare`, `Bluebook::ProcessManager.Handler.Dispatch.Bind` —
164
- # matching `Judge#verb_for`/`#dotted_prefix`'s own build
165
- # exactly (recursing the same way, for the same reason: an
166
- # entity-owned category's own parent may itself be entity-
167
- # owned), so this stays what it already is: the judge's own
168
- # coverage promise, not a second guess at it.
92
+ # dispatch it — entity-owned categories dotted to match `Judge#verb_for`.
169
93
  #
170
94
  # @return [Array<String>] every verb the language declares, dotted
171
95
  # and prefixed with `"Bluebook::"`, such as `"Bluebook::Aggregate.
@@ -178,13 +102,8 @@ module Hecks
178
102
 
179
103
  private
180
104
 
181
- # Walks one construct's own `.entities`, recursing into each
182
- # found entity's own `.entities` in turn — S17, ADR 0026's
183
- # two-level chain (`Dispatch`, inside `Handler`, inside
184
- # `ProcessManager`). `owner` is passed down explicitly rather
185
- # than re-derived, because it names whichever construct this
186
- # call actually found the entity under — the direct parent, not
187
- # the root.
105
+ # Recurses to handle ADR 0026's two-level entity chain (Dispatch inside
106
+ # Handler inside ProcessManager).
188
107
  def add_nested_entities(owner)
189
108
  owner.entities.each do |entity|
190
109
  next if entity.commands.empty?
@@ -194,12 +113,7 @@ module Hecks
194
113
  end
195
114
  end
196
115
 
197
- # The full dotted prefix a category's own verbs hang off —
198
- # mirrors `Judge#dotted_prefix` exactly (S17, ADR 0026): the
199
- # plain name for an ordinary category, or its parent's own
200
- # prefix with this category's name appended, for an entity-
201
- # owned one, recursing because the parent may itself be
202
- # entity-owned.
116
+ # Mirrors `Judge#dotted_prefix` exactly; must agree for entity-owned categories.
203
117
  def dotted_prefix(name)
204
118
  found = category(name)
205
119
  return name unless found&.entity_owned
@@ -207,30 +121,11 @@ module Hecks
207
121
  "#{dotted_prefix(found.parent)}.#{name}"
208
122
  end
209
123
 
210
- # `owner:`/`entity_owned:` — S17, ADR 0026. An aggregate-level
211
- # creating command carries its own parent as a `reference_to`
212
- # argument (read via `parent_reference_of` below), the same
213
- # way it always has. An entity-level one never does — `entity
214
- # "Member" do ... end`'s own creating command reaches its
215
- # parent through the dotted call itself (`ValueObject.Member.
216
- # Declare`), the same reason an ordinary entity's own commands
217
- # never declare `reference_to` either (entity.md's own
218
- # reference page states this). So the owning aggregate's name
219
- # is passed in directly here, by the caller who already knows
220
- # it (the same `.entities` walk that found this node), rather
221
- # than derived from an argument that was never going to be
222
- # there.
124
+ # `owner` is passed in explicitly: an entity's own creating command
125
+ # never carries a `reference_to` argument to derive it from.
223
126
  def read(aggregate, owner: nil, entity_owned: false)
224
- # An entity-owned category has no creating command of its own to find.
225
- # `creating_command` tests `command.references.nil?` — the same test
226
- # a real entity's own commands pass too, since `entity "Member" do
227
- # command "Pair" ... end end` never writes `reference_to` (an
228
- # entity's commands never do — banking's own LedgerEntry.Amend
229
- # doesn't either). Calling it here would have it seize on Member's
230
- # own "Pair" and call that the creating command, which it is not:
231
- # a Member is created by `ValueObject.Member`, its owner's own bare
232
- # append command, the same way a real LedgerEntry is created by
233
- # `Account.LogEntry`, never by a dotted verb of its own.
127
+ # entity_owned skips declaration_command: an entity's own commands
128
+ # never carry `reference_to`, so it would misidentify one as creating.
234
129
  declare = entity_owned ? nil : declaration_command(aggregate)
235
130
  parent = parent_relationship_of(aggregate)
236
131
  parent_key = owner ? "aggregate" : parent&.name&.to_s
@@ -249,19 +144,14 @@ module Hecks
249
144
  # Every command, not `rest` — the creating command carries the parent
250
145
  # link, which is the most common reference of all.
251
146
  references: references_in(aggregate.commands),
252
- # How the category names its records, read from the language rather
253
- # than restated. The judge has to know a record's id before it
254
- # dispatches, because the children it walks next carry it as their
255
- # parent — so it derives the same join the runtime will, off the same
256
- # declaration: a hand-written branch per category, disagreeing with
257
- # the runtime by even one separator, would be a broken reference.
147
+ # Read from the language, not restated: a hand-written join here
148
+ # could disagree with the runtime's own by even one separator.
258
149
  identity_paths: aggregate.identity_paths,
259
150
  entity_owned: entity_owned
260
151
  )
261
152
  end
262
153
 
263
- # Which arguments of which verbs carry an ID rather than a value, read
264
- # straight from the language's own IR.
154
+ # Which arguments of which verbs carry an ID, read straight off the IR.
265
155
  def references_in(commands)
266
156
  commands.each_with_object({}) do |command, found|
267
157
  named = command.attributes.select(&:reference?).map { |attribute| attribute.name.to_s }
@@ -269,12 +159,7 @@ module Hecks
269
159
  end
270
160
  end
271
161
 
272
- # The declaration command establishes the record's declared identity.
273
- # Receiver references never carried that meaning; entity-owned categories
274
- # prove it because every one of their commands lacks such a marker. The
275
- # identity-write rule is structural and remains true after routing moves
276
- # entirely into `to:`. `owner_id` is traversal context rather than stored
277
- # state, so the declaration establishes every remaining identity head.
162
+ # `owner_id` is excluded: it's traversal context, not stored identity state.
278
163
  def declaration_command(aggregate)
279
164
  required = aggregate.identity_heads.map(&:to_sym) - [:owner_id]
280
165
  candidates = aggregate.commands.select do |command|
@@ -289,19 +174,13 @@ module Hecks
289
174
  "its identity fields #{required.join(', ')} — found #{candidates.map(&:hecks_name).join(', ')}"
290
175
  end
291
176
 
292
- # Containment belongs to stored aggregate structure. The first declared
293
- # structural relationship is the traversal parent; command arguments may
294
- # carry its identity as an ordinary value object, but do not define it.
177
+ # The first declared reference attribute is the traversal parent.
295
178
  def parent_relationship_of(aggregate)
296
179
  aggregate.attributes.find(&:reference?)
297
180
  end
298
181
 
299
- # What the creating command sets directly. Every reference
300
- # argument is dropped, not just the parent link: a reference is
301
- # not a field. Command.Declare carries `entity_id` as well as
302
- # the parent `aggregate` reference, because an entity declares
303
- # commands too, and offering either as a field would have the
304
- # walk hand it a name instead of a head.
182
+ # Every reference argument is dropped, not just the parent link:
183
+ # a reference is not a field.
305
184
  def declared_fields(declare)
306
185
  return [] unless declare
307
186
 
@@ -314,21 +193,15 @@ module Hecks
314
193
  Array(command.mutations).each do |mutation|
315
194
  next unless mutation.op == :append
316
195
 
317
- # First wins, not last. Two commands can append to the same list —
318
- # Aggregate.Attribute and Aggregate.Reference both extend `attributes`,
319
- # because a reference's type is not a value object and cannot go
320
- # through the same verb. Overwriting would have let the one declared
321
- # later silently displace the other, and the walk would have offered
322
- # every ordinary attribute as a reference.
196
+ # First wins, not last: Aggregate.Attribute and Aggregate.Reference
197
+ # both extend `attributes`; overwriting would displace one silently.
323
198
  found[mutation.target.to_s] ||= Append.new(verb: command.hecks_name, map: mutation.source)
324
199
  end
325
200
  end
326
201
  end
327
202
 
328
- # The appenders displaced by first-wins — Aggregate.Reference behind
329
- # Aggregate.Attribute. The walk reaches them by reading the row, not the
330
- # plan, but they are still verbs the language declares and the coverage
331
- # gate has to see them.
203
+ # The appenders displaced by first-wins in `appends_in`; still verbs
204
+ # the coverage gate must see.
332
205
  def alternates_in(commands)
333
206
  claimed = {}
334
207
  commands.flat_map do |command|
@@ -359,9 +232,7 @@ module Hecks
359
232
  end
360
233
  end
361
234
 
362
- # Commands that change nothing — they exist to be refused. Aggregate.Seal is
363
- # the whole-document check: dispatched once everything is declared, carrying
364
- # only givens. A category with no sealer simply has no such rule.
235
+ # Commands that change nothing — they exist only to be refused.
365
236
  def sealers_in(commands)
366
237
  commands.select { |command| Array(command.mutations).empty? }.map(&:hecks_name)
367
238
  end
@@ -1,13 +1,8 @@
1
1
  module Hecks
2
2
  module Bluebook
3
3
  module MetaValidator
4
- # Offers a built .port to the language that describes ports.
5
- #
6
- # A port is a sibling of a bluebook, the same shape WorldJudge already
7
- # is one level over — its own file, its own door, judged through its
8
- # own self-hosted language (port.bluebook) rather than left as a plain
9
- # Ruby struct nothing checks. Whole-project table-unification survey,
10
- # item #13's remaining builders.
4
+ # Offers a built .port to the self-hosted port language (port.bluebook).
5
+ # Refusals are collected in `refusals`.
11
6
  class PortJudge
12
7
  attr_reader :refusals
13
8