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,70 +1,15 @@
1
1
  module Hecks
2
2
  module Bluebook
3
3
  module MetaValidator
4
- # A bluebook rebuilt from the meta-domain, in the shape the builder produces.
5
- #
6
- # This is the second half of the claim at the top of bluebook.bluebook —
7
- # "loading a domain becomes dispatching commands into this meta-domain ; the
8
- # IR it stores must equal the IR the DSL builder produces". The judge is the
9
- # first half. This reads the records back and assembles `to_h`.
10
- #
11
- # ## One table, both directions
12
- #
13
- # It is the inverse of the walk and shares its plan: the walk reads a node's
14
- # lists through the command that appends to each, and this reads them back out
15
- # of the rows those commands wrote. The retired `experiment/replay.rb` needed
16
- # 420 hand-written lines because the dispatch half was hand-written too; there
17
- # is nothing to hand-write when both directions are one table.
18
- #
19
- # This file is the traversal. The hashes at its tips, and the encodings they
20
- # undo, are in Shapes.
21
- #
22
- # The parent key of every level is read from the language's own plan, the same
23
- # Plan the walk dispatches from — so the two directions really are one table,
24
- # which is what the header above has always claimed.
25
- #
26
- # ## Reads level by level, not through the read model
27
- #
28
- # It reads level by level, through `DeclaredIn`, and not through the read
29
- # model — which is the difference between a reconstruction that can be the
30
- # source and one that can only be a check.
31
- #
32
- # `Meta.whole_bluebook` gathers a chapter in a single read, and it sorts:
33
- # `ReadModelInterpreter#matching` ends `.sort_by(&:id)` deliberately, because
34
- # a store's iteration order is an accident, and a read model returning store
35
- # order would let that accident leak into an answer.
36
- # Right for a read model, fatal here — the order a bluebook declares its
37
- # commands in is a fact about the source, and the IR is a contract field for
38
- # field and index for index ; the export carries that order verbatim.
39
- # `DeclaredIn` preserves it (spec/executes_spec says so), so this asks each
40
- # level for its own children rather than filtering one sorted gather.
41
- #
42
- # ## What it cannot rebuild
43
- #
44
- # What it cannot rebuild matters as much as what it can, and
45
- # spec/round_trip_spec pins the difference as an exact set: a field the language
46
- # does not hold appears there as a named gap, and a field it stops holding
47
- # appears as a failure.
4
+ # A bluebook rebuilt from the meta-domain, in the shape the DSL builder's `to_h` produces.
5
+ # Reads level by level through `DeclaredIn`, not the read model, to preserve declared order.
48
6
  class Reconstruction
49
7
  include Readings
50
8
  include Shapes
51
9
 
52
10
  # Reads one judged chapter back out of `runtime` and assembles it.
53
- #
54
- # @param runtime [Runtime::Dispatcher] the dispatcher holding the
55
- # judge's own records
56
- # @param chapter [String] the chapter's own `hecks_name`
57
- # @return [Hash{Symbol => Object}] the reconstructed IR, in the
58
- # shape the DSL builder's own `to_h` produces
59
- # @raise [Runtime::NotFound] if `runtime` holds no bluebook named
60
- # `chapter`
61
11
  def self.of(runtime, chapter) = new(runtime, chapter).to_h
62
12
 
63
- # @param runtime [Runtime::Dispatcher] the dispatcher holding the
64
- # judge's own records
65
- # @param chapter [String] the chapter's own `hecks_name`
66
- # @raise [Runtime::NotFound] if `runtime` holds no bluebook named
67
- # `chapter`
68
13
  def initialize(runtime, chapter)
69
14
  @runtime = runtime
70
15
  @plan = Plan.for(MetaValidator.grammar_registry)
@@ -99,17 +44,8 @@ module Hecks
99
44
  @runtime.query("Bluebook::#{category}.DeclaredIn", key.to_sym => { value: parent_id.to_s })
100
45
  end
101
46
 
102
- # One declaration, built from the contract.
103
- #
104
- # There were eleven methods here, one per category, each spelling out the same
105
- # keys `Assembly::Contracts` already names — which is the shape the judge used
106
- # to have and paid fourteen unoffered verbs for. The keys come from the table
107
- # now, and the exceptions come from its `reads:` column: a list needs a reader
108
- # per element, a folded field is gathered rather than fetched, and everything
109
- # else is one cell.
110
- #
111
- # `extra` is what the containment supplies — children, and the folded objects
112
- # a row cannot hold on its own.
47
+ # One declaration, built from the contract's field table. `extra` supplies
48
+ # children and folded objects a row cannot hold on its own.
113
49
  def declaration(category, row, extra = {})
114
50
  contract = Assembly.contract(category)
115
51
 
@@ -130,10 +66,8 @@ module Hecks
130
66
  end
131
67
  end
132
68
 
133
- # The readers are the ones `Shapes` already has, called by name — no wrappers,
134
- # so nothing shadows them. `:each_with_id` is the single exception that needs
135
- # more than the element: an attribute's type came in as the ID of whatever it
136
- # names, so reading it back needs the row it belongs to.
69
+ # `Shapes`'s own readers, called by name. `:each_with_id` also passes the
70
+ # row, since an attribute's type arrives as the ID of what it names.
137
71
  def read_shaped(spec, key, row)
138
72
  shape, named = spec
139
73
 
@@ -170,20 +104,14 @@ module Hecks
170
104
  cell
171
105
  end
172
106
 
173
- # An aggregate's own verbs and asks — the ones no entity declared. Both carry
174
- # the parent link either way, because that is the head the reference resolves
175
- # against, so the entity ones have to be told apart by `entity_id`. Rejecting
176
- # from an ordered read keeps the order.
107
+ # An aggregate's own verbs/asks, told apart from an entity's by `entity_id`;
108
+ # both carry the same parent link. Selecting from an ordered read keeps order.
177
109
  def own(category, aggregate_id)
178
110
  declared(category, aggregate_id).select { |row| text(row[:entity_id]).to_s == "" }
179
111
  end
180
112
 
181
- # A piece's own verbs and asks. There is no `DeclaredIn` keyed by entity, so
182
- # this reads the aggregate's — in declaration order — and keeps the ones that
183
- # name this piece. `row[:aggregate]` — an entity row's own `reference_to
184
- # Aggregate` (bare, no `_id` since ADR 0025) — not `entity_id`, which
185
- # stays suffixed below : that one is Command/Query's own explicit `as:`,
186
- # never touched by the rename.
113
+ # A piece's own verbs/asks: no `DeclaredIn` is keyed by entity, so this
114
+ # queries by `row[:aggregate]` and filters the results by `entity_id`.
187
115
  def within(category, row)
188
116
  declared(category, text(row[:aggregate]))
189
117
  .select { |held| text(held[:entity_id]).to_s == row[:id].to_s }
@@ -199,16 +127,10 @@ module Hecks
199
127
  attributes: Array(row[:attributes]).map { |field| attribute(field, id) },
200
128
  value_objects: declared("ValueObject", id).map { |shape| value_object(shape) },
201
129
  commands: own("Command", id).map { |verb| command(verb) },
202
- # The aggregate boundary, and the precondition a command may
203
- # reference by name (S10, ADR 0025 — "Rules") — the same
204
- # `rule` reader `command`'s own givens/ensures already use
205
- # (Assembly::Contracts' generic `declaration()` path), read
206
- # here by hand because `aggregate(row)` itself is hand-typed,
207
- # unlike `command`/`value_object`/`query` below.
130
+ # Read by hand, not via `declaration()`, since this method builds its
131
+ # hash directly; `rule` is the same reader `command`'s own uses.
208
132
  invariants: Array(row[:invariants]).map { |held| rule(held) },
209
133
  preconditions: Array(row[:preconditions]).map { |held| rule(held) },
210
- # S12, ADR 0025 — same reason invariants/preconditions are
211
- # read by hand two lines up: `aggregate(row)` is hand-typed.
212
134
  projected_fields: Array(row[:projected_fields]).map { |held| projected_field(held) },
213
135
  lifecycle: lifecycle(row),
214
136
  entities: direct_entities(id, id).map { |piece| entity(piece) },
@@ -221,32 +143,12 @@ module Hecks
221
143
 
222
144
  def closed_set_of(row) = !text(row[:rows]).nil?
223
145
 
224
- # A closed set's admitted rows. S17, ADR 0026 — Member is a genuine
225
- # entity now (`entity "Member" do ... end`, nested under
226
- # ValueObject), created by `ValueObject.Member` (an ordinary append,
227
- # the same way `Account.LogEntry` creates a LedgerEntry) and mutated
228
- # by its own dotted `ValueObject.Member.Pair`. Its data therefore
229
- # lives inline on the value object's own dispatched state — same as
230
- # any other entity list — not behind a separate `DeclaredIn` query:
231
- # there is no such query any more, because there is no top-level
232
- # "Member" aggregate left to hold one. Pairs are still an open map,
233
- # which no value object can hold, so they still come back one pair
234
- # at a time.
146
+ # A closed set's admitted rows live inline on the value object's own
147
+ # dispatched state, one member at a time, not behind a `DeclaredIn` query.
235
148
  def members_row(row) = members_of(row)
236
149
 
237
- # The key is stringified, never the value — the same split
238
- # `Bluebook::ValueObject#to_h`'s own `members:` emission makes
239
- # (lib/hecks/bluebook/value_object.rb, L7 docs/audits/
240
- # 2026-08-11-bug-triage.md). `Pair.value` is declared `String`
241
- # (shape.bluebook), but a real pair can hold whatever native Ruby
242
- # type the source member line actually wrote (`StatementFrequency`'s
243
- # own `retention_months: 84`, examples/banking/bluebook/
244
- # statements.bluebook) — `text` already unwraps the stored Value to
245
- # that real type, so calling `.to_s` here erased it a second time,
246
- # on the side spec/round_trip_spec.rb compares straight against a
247
- # fresh raw load (`Reconstruction.of` directly, no Assembly in
248
- # between): `declared 84, read back "84"` the moment `to_h` stopped
249
- # erasing it on the other side and this one kept erasing it alone.
150
+ # The key is stringified, never the value: a pair's value keeps whatever
151
+ # native Ruby type the source line actually wrote.
250
152
  def members_of(value_object_row)
251
153
  Array(value_object_row[:members]).map do |member|
252
154
  Array(member[:pairs]).map { |pair| [text(pair[:key]).to_s, text(pair[:value])] }
@@ -257,15 +159,8 @@ module Hecks
257
159
 
258
160
  def query(row) = declaration("Query", row).merge(options_of(row))
259
161
 
260
- # Every direct entity of one owner — S17, ADR 0026. `declared
261
- # ("Entity", root_id)` returns every entity sharing the same
262
- # root aggregate, nested or not (Dispatch and Handler both carry
263
- # `aggregate: process_manager_id`) — `owner` is the field that
264
- # actually tells them apart : `Judge#nest_entities`'s own
265
- # comment explains why it is the one to repurpose. Called with
266
- # `owner_id == root_id` for an aggregate's own direct entities
267
- # (Handler), and with `owner_id == some entity's own id` for
268
- # that entity's own nested ones (Dispatch, owned by Handler).
162
+ # Every entity sharing one root aggregate; `owner` (not the root id) tells
163
+ # a direct entity apart from one nested further in.
269
164
  def direct_entities(root_id, owner_id)
270
165
  declared("Entity", root_id).select { |held| text(held[:owner]).to_s == owner_id.to_s }
271
166
  end
@@ -274,42 +169,19 @@ module Hecks
274
169
  {
275
170
  name: text(row[:name]),
276
171
  description: text(row[:description]),
277
- # The same shape as an aggregate's now. It was a String here and a
278
- # Symbol there — the IR was not uniform about it, and only a round trip
279
- # ever said so.
280
172
  identified_by: identity_paths(row),
281
- # `text(row[:aggregate])` — the owning aggregate, the same one
282
- # `Judge#owning_aggregate_ref` resolved this piece's own
283
- # attribute types against on the way in, so reconstruction reads
284
- # a value-object-typed attribute back the identical way an
285
- # aggregate's own is (`Shapes#shape_field`'s own comment).
286
173
  attributes: Array(row[:attributes]).map { |field| shape_field(field, text(row[:aggregate])) },
287
- # ADR 0028 — the same shape `aggregate(row)`'s own
288
- # `preconditions:` reads two hand-typed methods up, read by
289
- # hand for the identical reason: `entity(row)` is hand-typed
290
- # too, unlike `command`/`value_object`/`query`.
291
174
  preconditions: Array(row[:preconditions]).map { |held| rule(held) },
292
- # Round 7 — the same shape `aggregate(row)`'s own
293
- # `invariants:` reads, one level down: a piece's own shape
294
- # rule, checked against every instance of this piece.
295
175
  invariants: Array(row[:invariants]).map { |held| rule(held) },
296
176
  commands: within("Command", row).map { |verb| command(verb) },
297
177
  queries: within("Query", row).map { |ask| query(ask) },
298
- # S17, ADR 0026 — Dispatch, inside Handler : an entity's own
299
- # nested entities, found the same way its own direct ones
300
- # were one level up.
301
178
  entities: direct_entities(text(row[:aggregate]), row[:id]).map { |piece| entity(piece) },
302
- # An entity has its own state machine, and the language has held it all
303
- # along — Entity.Lifecycle and Entity.Transition were two of the fourteen
304
- # verbs that started firing when the judge became a walk. Only the
305
- # reconstruction had never asked for them.
306
179
  lifecycle: lifecycle(row)
307
180
  }
308
181
  end
309
182
 
310
183
  # Assembled from three fields, because the IR keeps one object where the
311
- # language keeps the parts — the same difference Readings holds for the walk,
312
- # in the other direction.
184
+ # language keeps the parts.
313
185
  def lifecycle(row)
314
186
  field = text(row[:state_field])
315
187
  return nil if field.to_s.empty?
@@ -323,45 +195,21 @@ module Hecks
323
195
 
324
196
  def policy(row) = declaration("Policy", row)
325
197
 
326
- # S17, ADR 0026 — Handler is a genuine entity now, nested under
327
- # ProcessManager, created by `ProcessManager.Handler` (an
328
- # ordinary append, the same way `Account.LogEntry` creates a
329
- # LedgerEntry) and mutated by its own dotted `ProcessManager.
330
- # Handler.Dispatch`/`...Dispatch.Bind`. Its data therefore lives
331
- # inline on the process manager's own dispatched state — same as
332
- # any other entity list — not behind a separate `DeclaredIn`
333
- # query : there is no such query any more, the same fix
334
- # `Reconstruction#members_of` already made for Member.
198
+ # A process manager's handlers live inline on its own dispatched state,
199
+ # not behind a `DeclaredIn` query.
335
200
  def process_manager(row)
336
201
  declaration("ProcessManager", row,
337
202
  handlers: Array(row[:handlers]).map { |leg| handler(leg) })
338
203
  end
339
204
 
340
- # S17, ADR 0026 — Dispatch, one level further in : nested under
341
- # Handler, its data lives inline on the handler row this method
342
- # was just handed (`row` here is one element of `handlers`,
343
- # above), not behind any query either.
205
+ # A handler's dispatches, nested one level further in, the same way.
344
206
  def handler(row)
345
207
  declaration("Handler", row,
346
208
  dispatches: Array(row[:dispatches]).map { |leg| dispatch(leg) })
347
209
  end
348
210
 
349
- # `compensates` — two flat fields on this same row
350
- # (`process_manager.bluebook`'s own comment on `Dispatch` for
351
- # why), assembled by hand into the shape its own field actually
352
- # is — `declaration()`'s generic per-field hash-build has no
353
- # way to turn two cells into a second object, so this reads
354
- # them directly and passes the result through `extra:`, the
355
- # same seam `handler`/`process_manager` already use for a
356
- # `:children` shape a flat Contract cannot describe.
357
- # `compensates_command_name` absent means no compensation at
358
- # all — a plain dispatch with nothing to undo. A plain hash, the
359
- # same declaration shape `to_h` spells for everything else in
360
- # this file (this file's own top comment) — never a real
361
- # `DispatchSpec` here; `Assembly#dispatch` is the one place a
362
- # declaration hash becomes the real object, and building it
363
- # twice, in two different shapes, is exactly the kind of drift
364
- # this whole arc exists to remove.
211
+ # `compensates` folds two flat fields on this row into one object; an
212
+ # absent `compensates_command_name` means a plain dispatch with nothing to undo.
365
213
  def dispatch(row)
366
214
  name = text(row[:compensates_command_name])
367
215
  compensates = name && { command_name: name, with_spec: pairs(row[:compensates_with_spec]) }