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,14 +3,8 @@ require_relative "bluebook_builder/validation"
3
3
  module Hecks
4
4
  module Bluebook
5
5
  module DSL
6
- # The `Hecks.bluebook "Name" do ... end` receiver — the chapter-level
7
- # builder collecting every `aggregate`/`read_model`/`policy`/
8
- # `process_manager` a chapter declares, plus the chapter-wide named-
9
- # given pools those thread down into (see `#aggregate_impl`'s own
10
- # comment). `.build` reuses the same open builder instance across
11
- # several files sharing one chapter name (`self.build`'s own comment),
12
- # so a chapter split across files accumulates rather than each file
13
- # silently replacing the last.
6
+ # The `Hecks.bluebook "Name" do ... end` receiver, collecting every aggregate,
7
+ # read model, policy and process manager a chapter declares.
14
8
  class BluebookBuilder
15
9
  GRAMMAR_CONTEXT = "Bluebook".freeze
16
10
 
@@ -28,31 +22,23 @@ module Hecks
28
22
  @read_models = []
29
23
  @policies = []
30
24
  @process_managers = []
31
- # The root of the chapter-wide given pool — one level wider
32
- # than `AggregateBuilder`'s own `@entity_named_givens` (S10
33
- # extended across an aggregate's whole entity tree, earlier
34
- # this arc). See `#given`'s own comment for what this closes.
25
+ # The root of the chapter-wide given pool, one level wider than
26
+ # `AggregateBuilder`'s `@entity_named_givens` (S10). See `#given` for
27
+ # what this closes.
35
28
  @chapter_named_givens = {}
36
- # Every bare chapter-given reference this chapter's own files
37
- # left unresolved so far — threaded into every aggregate the
38
- # same way `@chapter_named_givens` is. See
39
- # `AggregateBuilder#pending_chapter_given`'s own comment for
40
- # what queues here and `#resolve_pending_chapter_givens!`,
41
- # below, for where it drains.
29
+ # Every bare chapter-given reference left unresolved so far, threaded into
30
+ # every aggregate like `@chapter_named_givens`. See
31
+ # `AggregateBuilder#pending_chapter_given` for what queues here.
42
32
  @chapter_pending_givens = []
43
- # **One level wider still** — the chapter-wide, entity-scoped pool
44
- # (the piece analogue of `@chapter_named_givens`, above). See
45
- # `EntityBuilder#given_impl`'s own comment for what this
46
- # closes; `docs/implemented/resolution-rules/
47
- # chapter-entity-given.md` for the full algorithm.
33
+ # One level wider still — the chapter-wide, entity-scoped pool, the piece
34
+ # analogue of `@chapter_named_givens`. See `EntityBuilder#given_impl` and
35
+ # docs/implemented/resolution-rules/chapter-entity-given.md for the algorithm.
48
36
  @chapter_entity_named_givens = {}
49
37
  @chapter_entity_pending_givens = []
50
38
  end
51
39
 
52
- # Chapter metadata belongs to the composed folder, not whichever file
53
- # happened to sort first. A later concept file may be the one carrying
54
- # the version header; adopt it into the already-open chapter builder.
55
- # Two different versions are a real contradiction, not load order.
40
+ # Chapter metadata belongs to the composed builder, not whichever file sorts
41
+ # first; two different versions for one chapter is a real contradiction.
56
42
  def adopt_version(version)
57
43
  return if version.nil?
58
44
  if @version && @version.to_s != version.to_s
@@ -69,47 +55,29 @@ module Hecks
69
55
  # @param value [String] the vision text, as given to `vision "..."`
70
56
  # @return [void]
71
57
  def vision(value)
72
- # moved to the language: Vision invariant, on Chapter.Declare
73
-
74
58
  @vision = value
75
59
  end
76
60
 
77
- # Records the chapter's earlier name, so the storage layer recognizes its own history
78
- # under that old name instead of minting a brand-new lineage from nothing — a chapter's
79
- # identity can change, and this is where the new declaration says what it was.
61
+ # Records the chapter's earlier name, so the storage layer recognizes its history
62
+ # under it instead of minting a new lineage — a chapter's identity can change.
80
63
  #
81
64
  # @param value [String, Symbol] the chapter's earlier name
82
65
  # @return [String] `value`, stringified, as stored
83
66
  def formerly_known_as(value) = @formerly_known_as = value.to_s
84
67
 
85
- # Names a core grammar context this chapter's sub-language extends.
86
- #
87
- # **A sub-language names where it lands**. ADR 0026's own seam: the core
88
- # grammar does not name its extension points, so this chapter names
89
- # itself onto them instead — the core contexts (e.g. "Query",
90
- # "ReadModel") whose own admitted words this chapter's `Syntax`
91
- # aggregate contributes rows for. Variadic, and accumulating across
92
- # calls the same reason `identified_by`/`group_by` are: nothing here
93
- # requires one call to name every context at once.
68
+ # Names a core grammar context this chapter's sub-language extends (ADR 0026).
69
+ # Variadic and accumulates across calls, like `identified_by`/`group_by`.
94
70
  #
95
- # Reached through `calls: "attaches_to_impl"` rather than `GenericDispatch`'s default —
96
- # not bootstrap-reachable, since only sub-language chapters like Paging use it, never a
97
- # core chapter.
71
+ # Reached through `calls: "attaches_to_impl"`, not bootstrap-reachable — only
72
+ # sub-language chapters like Paging call it, never a core chapter.
98
73
  #
99
74
  # @param contexts [Array<String>] one or more core grammar context names, such as
100
75
  # `"Query"`/`"ReadModel"`
101
76
  # @return [Array<String>] every context named so far, this call's included
102
77
  def attaches_to_impl(*contexts) = (@attaches_to ||= []).concat(contexts.map(&:to_s))
103
78
 
104
- # Records a capability this chapter answers for other domains.
105
- #
106
- # A capability this chapter answers for other domains, declared so
107
- # nothing has to recognise the chapter by name — Governance's
108
- # `provides "authorization", assignments: ..., grant: ...,
109
- # transitions: ...`. One row per key, in the order written; what
110
- # each capability requires is checked once the chapter is whole
111
- # (`Validation#validate_provisions!`), since the verbs it names may
112
- # be declared further down the file.
79
+ # Records a capability this chapter answers for other domains, one row per key —
80
+ # checked once the chapter is whole, since verbs may be declared later in the file.
113
81
  #
114
82
  # @param capability [String] the capability's own name, such as `"authorization"`
115
83
  # @param verbs [Hash{Symbol => String}] one command/query reference per capability
@@ -143,20 +111,11 @@ module Hecks
143
111
  # @return [Symbol] `:generic`
144
112
  def generic = @classification = :generic
145
113
 
146
- # Declares an aggregate belonging to this chapter.
147
- #
148
- # `@chapter_named_givens` is threaded into every aggregate this
149
- # chapter builds — see `AggregateBuilder#given`'s own comment
150
- # for the sharing this enables; not a new top-level DSL word
151
- # itself (an aggregate's own existing `given` already both
152
- # declares locally and write-throughs here as a side effect,
153
- # the identical shape `EntityBuilder#given`'s own write-through
154
- # to its owner aggregate's pool already takes — no new spelling
155
- # for "declare a precondition," one level wider, same word).
114
+ # Declares an aggregate belonging to this chapter. `@chapter_named_givens` is
115
+ # threaded into it — see `AggregateBuilder#given` for the sharing this enables.
156
116
  #
157
- # Reached through `calls: "aggregate_impl"`, not `GenericDispatch`'s default —
158
- # bootstrap-reachable (every core/attached chapter's own top-level shape is written
159
- # with it), so also named in `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK`.
117
+ # Bootstrap-reachable (every core chapter's top-level shape uses it), so also
118
+ # named in `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK`.
160
119
  #
161
120
  # @param name [String] the aggregate's own name
162
121
  # @yield the aggregate body, evaluated against a new `AggregateBuilder`; may be omitted
@@ -172,15 +131,6 @@ module Hecks
172
131
 
173
132
  # Declares a read model belonging to this chapter.
174
133
  #
175
- # `read_model` is the word (ADR 0025 reverts `report` — the IR
176
- # construct, the registry API, and the docs filename all said
177
- # `read_model` the whole time; no era was ever minted under
178
- # `report`, so this is history and source agreeing again). `report`
179
- # stays answered under `MetaValidator.shadow_parsing?` (S0a's own
180
- # bridge) for the same reason `has_many` does — frozen era text
181
- # that used it must keep booting; live source refuses it, naming
182
- # the replacement.
183
- #
184
134
  # @param name [String] the read model's own name
185
135
  # @yield the read model body, evaluated against a new `ReadModelBuilder`
186
136
  # @return [Array<Bluebook::ReadModel>] every read model declared so far, this one last
@@ -193,14 +143,14 @@ module Hecks
193
143
  @read_models << ReadModelBuilder.build(name, &)
194
144
  end
195
145
 
196
- # The retired spelling of `read_model`, still answered under shadow-parsing so frozen
197
- # era text keeps booting; live source refuses it and names the replacement.
146
+ # Answered only under shadow-parsing, so frozen era text spelled `report` keeps
147
+ # booting; live source refuses it and names `read_model` as the replacement.
198
148
  #
199
149
  # @param name [String] the read model's own name
200
150
  # @yield the read model body, evaluated against a new `ReadModelBuilder`
201
151
  # @return [Array<Bluebook::ReadModel>] every read model declared so far, this one last,
202
152
  # under shadow-parsing
203
- # @raise [Bluebook::DSL::Malformed] always, outside shadow-parsing — `report` is retired
153
+ # @raise [Bluebook::DSL::Malformed] always, outside shadow-parsing
204
154
  def report(name, &)
205
155
  return read_model(name, &) if MetaValidator.shadow_parsing?
206
156
 
@@ -237,12 +187,9 @@ module Hecks
237
187
  # @raise [Bluebook::DSL::ProcessManagerBuilder::InvalidProcessManager] if a process
238
188
  # manager's own structural check fails
239
189
  def build
240
- # The chapter is the top of the construct chain — `Bluebook` is a
241
- # root, and its constructor stamps every aggregate and read model with
242
- # itself as owner, so every `hecks_fqn` below resolves by walking up
243
- # to it. No constants are installed at load time : the public door is
244
- # a per-boot projection, installed by `Loader.bind_runtime` once a
245
- # dispatcher exists to close over (facade/surface.rb).
190
+ # The chapter is the top of the construct chain — its constructor stamps every
191
+ # aggregate and read model with itself as owner, so `hecks_fqn` resolves by
192
+ # walking up to it.
246
193
  bluebook = Bluebook::Chapter.new(name: @name, version: @version, vision: @vision,
247
194
  aggregates: @aggregates,
248
195
  read_models: @read_models,
@@ -253,60 +200,28 @@ module Hecks
253
200
  attaches_to: @attaches_to || [],
254
201
  provides: @provides || [])
255
202
 
256
- # **Same reason, same gate** — a bare chapter-given may still be
257
- # pending (see `AggregateBuilder#pending_chapter_given`) if a
258
- # file that would resolve it hasn't loaded yet; resolving now
259
- # would see the same incomplete `@chapter_named_givens`
260
- # `validate_assembled!` below would. Deferred to
261
- # `MetaValidator.judge_deferred!` the same way, and before
262
- # `validate_assembled!` there — nothing downstream should ever
263
- # read an unresolved placeholder's fields.
203
+ # A bare chapter-given may still be pending if a file that would resolve it
204
+ # hasn't loaded yet; deferred to `MetaValidator.judge_deferred!`, before
205
+ # `validate_assembled!`, so nothing downstream reads an unresolved placeholder.
264
206
  resolve_pending_chapter_givens! unless MetaValidator.deferring?
265
207
  resolve_pending_chapter_entity_givens! unless MetaValidator.deferring?
266
208
 
267
- # A chapter may be split across files (see `self.build`'s own
268
- # comment). Every check below needs the whole chapter present —
269
- # a hop, a projection, a correlation key or an event shape can
270
- # equally name a construct declared in a file that has not
271
- # loaded yet, and `@aggregates`/`@process_managers` here are
272
- # only ever as complete as whatever has loaded so far. So,
273
- # exactly like `MetaValidator.call` below, this is skipped
274
- # while `MetaValidator.defer` is loading the chapter's files
275
- # and run once instead — by `MetaValidator.judge_deferred!`,
276
- # against the fully assembled chapter — after the last one
277
- # loads. A single-file chapter (still the common case) never
278
- # sees `deferring?` true here at all, so its own checks still
279
- # run inline, exactly as before.
209
+ # A chapter may span several files; a hop/projection/event can name a construct
210
+ # not yet loaded, so this is skipped while `MetaValidator.defer` loads the
211
+ # chapter's files and run once by `judge_deferred!` against the whole chapter.
280
212
  self.class.validate_assembled!(bluebook) unless MetaValidator.deferring?
281
213
 
282
- # The language judges the bluebook, in the language. Last, so the
283
- # meta-domain sees a fully built IR — the whole-document rules need
284
- # every declaration present, which is why they cannot be givens fired
285
- # at declaration time.
214
+ # The language judges the bluebook last, so the meta-domain sees a fully built
215
+ # IR — whole-document rules need every declaration present, so they can't be
216
+ # per-declaration givens.
286
217
  MetaValidator.call(bluebook)
287
218
  end
288
219
 
289
- # The other half of a chapter-wide `given` reference —
290
- # `AggregateBuilder#pending_chapter_given` recognised an
291
- # unresolved bare reference and deferred it here, unable to
292
- # check further: a later file in this same chapter might still
293
- # declare the real thing. Runs once every file has loaded,
294
- # against the now-complete `@chapter_named_givens` pool — the
295
- # identical lookup `reference_named_chapter_given` already does,
296
- # just late enough to see every aggregate's own declarations,
297
- # not only the ones loaded before the referencing one.
220
+ # The other half of a chapter-wide `given` reference — resolves every reference
221
+ # `AggregateBuilder#pending_chapter_given` deferred, once the chapter's files are loaded.
298
222
  #
299
- # Mutates each placeholder `Given` in place rather than
300
- # replacing it — it is already embedded, by Ruby object
301
- # reference, in the referencing aggregate's own `preconditions`
302
- # and in any command (same aggregate) that separately
303
- # bare-referenced the same description, so there is nothing
304
- # downstream holding a second, now-stale copy to update.
305
- # Instance-level (not `self.`, unlike `validate_assembled!`) —
306
- # unlike that battery, this needs `@chapter_named_givens` itself,
307
- # which only exists on the builder instance still open for this
308
- # chapter (`MetaValidator.judge_deferred!` reaches it via
309
- # `registry.bluebook_builder(name)`, guaranteed already present).
223
+ # Mutates each placeholder `Given` in place, since it's already embedded by Ruby
224
+ # object reference in the referencing preconditions and commands.
310
225
  #
311
226
  # @return [void]
312
227
  # @raise [Bluebook::DSL::Malformed] if a pending reference's own `description` names no
@@ -352,9 +267,8 @@ module Hecks
352
267
  end
353
268
  private :resolve_pending_chapter_given
354
269
 
355
- # The entity-scoped analogue, one level down — see
356
- # `#resolve_pending_chapter_givens!`'s own comment; identical
357
- # shape, resolved against `@chapter_entity_named_givens` instead.
270
+ # The entity-scoped analogue of `#resolve_pending_chapter_givens!`, resolved
271
+ # against `@chapter_entity_named_givens` instead.
358
272
  #
359
273
  # @return [void]
360
274
  # @raise [Bluebook::DSL::Malformed] if a pending reference's own `description` names no
@@ -400,56 +314,28 @@ module Hecks
400
314
  end
401
315
  private :resolve_pending_chapter_entity_given
402
316
 
403
- # Builds a `Chapter` from a `Hecks.bluebook "Name" do ... end` block, reusing the same
404
- # open builder across several files that share one chapter name.
405
- #
406
- # A chapter may be declared in several files, meant to merge into one
407
- # domain — `lib/hecks/language/bluebook/*.bluebook` all open
408
- # `Hecks.bluebook "Bluebook" do ... end`. The registry holds the builder open across
409
- # calls — the first file for a name creates it, every later file for the same name
410
- # reuses the same instance — rather than minting a fresh builder per call, which would
411
- # let a second file with the same chapter name silently replace the first's aggregates
412
- # instead of adding to them.
413
- #
414
- # `@aggregates`/`@read_models` accumulate across calls on the reused instance. `#build`
415
- # is safe to call once per file on the same builder — it constructs a fresh
416
- # `Bluebook` from whatever is currently held and re-`Namespace.install`s
417
- # over the previous one, so the last file's call leaves every aggregate
418
- # seen so far reachable, and each call's IR is a strict superset of the
419
- # one before. `Registry#add_bluebook` still simply stores by name — with
420
- # this in place, "last write wins" is the cumulative, correct write.
317
+ # Builds a `Chapter` from a `Hecks.bluebook "Name" do ... end` block, reusing one open
318
+ # builder per chapter name so several files accumulate into it rather than replacing it.
421
319
  #
422
320
  # @param name [String] the chapter's declared name
423
321
  # @param version [String, nil] the chapter's pinned version, or nil for unversioned
424
- # @yield the chapter's body, `instance_eval`'d against the builder, with a `const_missing`
425
- # resolver installed so a bare constant resolves to a `ConstShim::ScopedConstant`
322
+ # @yield the chapter body; a bare constant resolves to a `ConstShim::ScopedConstant`
426
323
  # @return [Bluebook::Chapter] the built, judged chapter
427
- # @raise [Bluebook::DSL::Malformed] if this call's `version` conflicts with a version
428
- # already adopted for this chapter name, or if the built chapter fails any check
429
- # `#build` raises
324
+ # @raise [Bluebook::DSL::Malformed] if `version` conflicts with an already-adopted
325
+ # version, or the built chapter fails validation
430
326
  # @raise [Bluebook::DSL::ProcessManagerBuilder::InvalidProcessManager] if a process
431
- # manager's own structural check fails
327
+ # manager's structural check fails
432
328
  def self.build(name, version: nil, &block)
433
329
  registry = Hecks.current_registry
434
- # WHICH FILE CALLED `Hecks.bluebook`, recorded for
435
- # `Registry#record_bluebook_source` — two frames up: this
436
- # method's own caller is `Hecks.bluebook` (hecks.rb), and ITS
330
+ # Two frames up: this method's caller is `Hecks.bluebook` (hecks.rb), whose
437
331
  # caller is the real `.bluebook` file's own top-level call site.
438
332
  caller_location = caller_locations(2, 1)&.first
439
333
  registry&.record_bluebook_source(name, caller_location&.path)
440
334
  builder = registry ? registry.bluebook_builder(name) { new(name, version: version) } : new(name, version: version)
441
335
  builder.__send__(:adopt_version, version)
442
- # A bare constant in a bluebook — `attribute :name, PizzaName` — is a name,
443
- # not a reference to something Ruby has heard of. `const_missing` hands
444
- # over a `ConstShim::ScopedConstant` (S0b, const_shim.rb's own comment),
445
- # and that is still the whole answer for a bare name: `Attribute` spells
446
- # it with `to_s`, so the concept never needed a `TypeName` wrapper class
447
- # of its own — any such wrapper would exist only long enough to be
448
- # stringified. The concept still has a home — the
449
- # language declares `value_object "TypeName"` — it just needed no Ruby
450
- # class of its own. A Module rather than a Symbol is what also lets
451
- # `Account::Debit`/`admits: Account::LedgerDirection` answer their own
452
- # `::` — a plain Symbol cannot.
336
+ # A bare constant like `PizzaName` is a name, not a Ruby reference —
337
+ # `const_missing` hands over a `ConstShim::ScopedConstant`. A Module rather
338
+ # than a Symbol is what lets `Account::Debit` answer its own `::`.
453
339
  resolver = ->(const) { ConstShim::ScopedConstant.for(const) }
454
340
  ConstShim.with(resolver) { builder.instance_eval(&block) } if block
455
341
  builder.build
@@ -65,6 +65,7 @@ module Hecks
65
65
  ["ReadModel", "reference_to"] => :reference_to_impl,
66
66
  ["ReadModel", "include"] => :include_impl,
67
67
  ["ReadModel", "group_by"] => :group_by_impl,
68
+ ["ReadModel", "percentile"] => :percentile_impl,
68
69
  ["ReadModel", "where"] => :where_impl,
69
70
  ["ReadModel", "order_by"] => :order_by_impl,
70
71
  ["ReadModel", "authorize"] => :authorize_impl,