hecks 2.8.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 (404) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +4 -6
  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 +17 -98
  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 +5 -48
  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 +31 -141
  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 +14 -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 +25 -31
  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 +16 -69
  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 -194
  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 -111
  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 +53 -267
  109. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +43 -305
  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 +6 -21
  114. data/lib/hecks/bluebook/model_check.rb +100 -597
  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 +4 -23
  128. data/lib/hecks/cli/document.rb +3 -21
  129. data/lib/hecks/cli/ir.rb +3 -5
  130. data/lib/hecks/cli/mcp.rb +2 -3
  131. data/lib/hecks/cli/mcp_door.rb +19 -114
  132. data/lib/hecks/cli/model_check.rb +18 -85
  133. data/lib/hecks/cli/project_cli.rb +7 -40
  134. data/lib/hecks/cli/project_diagrams.rb +0 -7
  135. data/lib/hecks/cli/run.rb +12 -58
  136. data/lib/hecks/cli/smoke_test.rb +2 -16
  137. data/lib/hecks/cli/stores.rb +1 -2
  138. data/lib/hecks/cli.rb +18 -24
  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 +82 -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 +9 -90
  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 +61 -64
  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 +6 -25
  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 +18 -124
  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 +150 -678
  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 +2 -15
  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 +42 -134
  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 +3 -6
  336. data/lib/hecks/release/runner/commands.rb +2 -4
  337. data/lib/hecks/release/runner/gem_publisher.rb +2 -3
  338. data/lib/hecks/release/runner/npm_publisher.rb +6 -20
  339. data/lib/hecks/release/runner/preflight.rb +4 -19
  340. data/lib/hecks/release/runner/tagger.rb +2 -9
  341. data/lib/hecks/release/runner.rb +3 -32
  342. data/lib/hecks/rendering.rb +4 -26
  343. data/lib/hecks/router/namespace_installer.rb +12 -36
  344. data/lib/hecks/router.rb +4 -8
  345. data/lib/hecks/runtime/aggregate_lock.rb +8 -33
  346. data/lib/hecks/runtime/boot_gates.rb +3 -18
  347. data/lib/hecks/runtime/caller.rb +19 -59
  348. data/lib/hecks/runtime/capability_graph.rb +5 -21
  349. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
  350. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +23 -160
  351. data/lib/hecks/runtime/command_interpreter.rb +124 -306
  352. data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
  353. data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
  354. data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
  355. data/lib/hecks/runtime/command_rules/emission.rb +8 -21
  356. data/lib/hecks/runtime/command_rules/references.rb +23 -202
  357. data/lib/hecks/runtime/dependency_planning.rb +30 -102
  358. data/lib/hecks/runtime/dispatcher.rb +82 -241
  359. data/lib/hecks/runtime/entity_element.rb +40 -462
  360. data/lib/hecks/runtime/entity_interpreter.rb +64 -219
  361. data/lib/hecks/runtime/errors.rb +32 -115
  362. data/lib/hecks/runtime/event.rb +3 -25
  363. data/lib/hecks/runtime/identity.rb +18 -154
  364. data/lib/hecks/runtime/instance.rb +18 -150
  365. data/lib/hecks/runtime/interpreting.rb +11 -70
  366. data/lib/hecks/runtime/invocation.rb +28 -164
  367. data/lib/hecks/runtime/loader.rb +48 -186
  368. data/lib/hecks/runtime/outbox.rb +38 -261
  369. data/lib/hecks/runtime/policy_interpreter.rb +38 -200
  370. data/lib/hecks/runtime/port_operation_interpreter.rb +26 -87
  371. data/lib/hecks/runtime/query_interpreter.rb +45 -187
  372. data/lib/hecks/runtime/reaction_invocation.rb +36 -138
  373. data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
  374. data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
  375. data/lib/hecks/runtime/reference_hop.rb +8 -81
  376. data/lib/hecks/runtime/refusal_wording.rb +8 -89
  377. data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
  378. data/lib/hecks/runtime/registry/verification.rb +52 -225
  379. data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
  380. data/lib/hecks/runtime/registry.rb +99 -244
  381. data/lib/hecks/runtime/remote_dispatcher.rb +37 -152
  382. data/lib/hecks/runtime/routing.rb +4 -15
  383. data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
  384. data/lib/hecks/runtime/saga_interpreter.rb +79 -263
  385. data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
  386. data/lib/hecks/runtime/tenant_check.rb +6 -68
  387. data/lib/hecks/runtime/tenant_scope.rb +3 -28
  388. data/lib/hecks/runtime/value/admission.rb +16 -67
  389. data/lib/hecks/runtime/value/coercion.rb +155 -641
  390. data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
  391. data/lib/hecks/runtime/value.rb +12 -84
  392. data/lib/hecks/runtime.rb +17 -65
  393. data/lib/hecks/storehouse.rb +141 -568
  394. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +8 -32
  395. data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
  396. data/lib/hecks/vendoring/git_environment.rb +2 -8
  397. data/lib/hecks/vendoring/git_source.rb +4 -10
  398. data/lib/hecks/vendoring.rb +7 -46
  399. data/lib/hecks/version.rb +3 -14
  400. data/lib/hecks.rb +26 -81
  401. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
  402. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
  403. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
  404. metadata +3 -2
@@ -3,35 +3,14 @@ require_relative "../projector"
3
3
 
4
4
  module Hecks
5
5
  module Projections
6
- # The model classes, projected from the language that declares them.
7
- #
8
- # A construct's holding half — its readers, its emission, a
9
- # constructor that assigns declared fields and hands off — restates
10
- # what `bluebook.bluebook` already says, three times over in Ruby.
11
- # This renders it instead.
12
- #
13
- # **Only the holding half**. `Behaviour::X` is hand-written and permanent,
14
- # and `settle` is the seam: everything a declaration cannot state
15
- # lives behind it, so regenerating can never be lossy. That property
16
- # was established construct by construct before any of this was
17
- # written — the chapter looked generatable and was not, until its
18
- # `@hecks_root`, ports table and child stamping moved behind `settle`.
19
- #
20
- # The `HOST` manifest is the honest part. The grammar states the fields;
21
- # it does not state which constructs are Ruby classes rather than
22
- # instances, what a constructor's defaults are, or how a value is
23
- # coerced on the way in. Those are facts about Ruby, not about
24
- # bluebooks, so they are declared here rather than pretended into the
25
- # language — and keeping them in one table is what would let a second
26
- # host swap this file rather than edit thirteen.
6
+ # The model classes' holding half (readers, emission, constructor), projected from the
7
+ # language. `Behaviour::X` stays hand-written behind `settle`, so regenerating is never lossy.
27
8
  module Model
28
9
  extend Projector::Target
29
10
 
30
11
  projects_as :model, declares: "Bluebook", emits: :files
31
12
 
32
- # **Per-construct Ruby facts**. `coerce` is the only fiddly column: a
33
- # declared field arrives as whatever the builder handed over, and
34
- # each construct has always normalised its own on the way in.
13
+ # Per-construct Ruby facts the grammar does not state (defaults, coercion, class shape).
35
14
  HOST = {
36
15
  "Policy" => {
37
16
  construct: "Policy",
@@ -42,22 +21,12 @@ module Hecks
42
21
  defaults: { name: nil, on_event: "nil", trigger_command: "nil",
43
22
  target_domain: "nil", expect_undelivered: "false", where: "nil", for_each: "nil",
44
23
  with_spec: "[]", aggregate: "nil" },
45
- # A flag on the wire is a boolean — the language holds it as
46
- # text ("true"), the builder hands over `true`, and a
47
- # reconstruction hands back whichever it read; all three land
48
- # as the same `true`/`false`.
24
+ # The language holds a flag as "true" and the builder as `true`; both become a boolean.
49
25
  coerce: { name: ".to_s", aggregate: "&.to_s", expect_undelivered: ".to_s == \"true\"" },
50
- # A list of bindings is not a scalar on the wire. Every other
51
- # field emits as itself; this one has to render the way
52
- # `DispatchSpec`'s own `with_spec` does — keys to strings, and
53
- # `render_value` keeping the leading colon on a Symbol, because
54
- # a binding that reads an event field and one that supplies a
55
- # literal string are otherwise indistinguishable once written
56
- # down (see `MetaValidator::Readings`' own note on exactly that).
26
+ # Bindings render like `DispatchSpec#with_spec`; `render_value` keeps a Symbol's colon
27
+ # so an event-field read and a literal string stay distinguishable.
57
28
  renders: { with_spec: "-> { with_spec.map { |key, value| [key.to_s, Bluebook.render_value(value)] } }",
58
- # Computed (Deviations::COMPUTED["Policy"]): the structured
59
- # form of `where`, a pure function of that text, the same
60
- # `ast` every rule row carries beside its `canonical`.
29
+ # Computed (Deviations::COMPUTED["Policy"]): derived from `where`.
61
30
  where_ast: "-> { where_ast }" },
62
31
  settles: false
63
32
  }
@@ -109,11 +78,8 @@ module Hecks
109
78
  RUBY
110
79
  end
111
80
 
112
- # The emission, keyed as the model spells it and sourced as the
113
- # language declares it.
114
- # A computed field (Deviations::COMPUTED) is emitted too — it is
115
- # model-only by definition, so it rides after the declared fields
116
- # and must have a `renders` entry, there being nothing to `send`.
81
+ # Renders the `emits_ir` call. A computed field (Deviations::COMPUTED) rides after the
82
+ # declared ones and needs a `renders` entry, since there is nothing to `send`.
117
83
  #
118
84
  # @param bluebook [Bluebook::Chapter] the "Bluebook" chapter the construct's own
119
85
  # attributes are read from
@@ -127,10 +93,8 @@ module Hecks
127
93
  "emits_ir(\n#{fields.map { |f| " #{"#{f}:".ljust(width + 1)} #{renders.fetch(f, ":#{f}")}" }.join(",\n")}\n)"
128
94
  end
129
95
 
130
- # What the construct emits: what the language declares, less every
131
- # deviation the tables account for. The generator and
132
- # spec/model_shape_conformance_spec compute this the same way, from
133
- # the same tables, which is the point of the tables being in lib.
96
+ # What the construct emits: the declared attributes less every `Deviations` entry.
97
+ # spec/model_shape_conformance_spec computes it from the same tables.
134
98
  #
135
99
  # @param bluebook [Bluebook::Chapter] the "Bluebook" chapter the construct's own
136
100
  # attributes are read from
@@ -158,10 +122,7 @@ module Hecks
158
122
  accessors = host.fetch(:accessors, [])
159
123
  return lines.join("\n") if accessors.empty?
160
124
 
161
- # A declared field the model deliberately does not emit still
162
- # needs a reader, and the reason it is off the wire is carried
163
- # here rather than typed in — a comment that survives
164
- # regeneration is one the generator writes.
125
+ # The off-the-wire reason is emitted so the comment survives regeneration.
165
126
  reasons = Deviations::OFF_THE_WIRE.fetch(host.fetch(:construct, ""), {})
166
127
  (lines + accessors.map do |a|
167
128
  why = reasons[a]
@@ -3,42 +3,12 @@ require_relative "../projector"
3
3
 
4
4
  module Hecks
5
5
  module Projections
6
- # An OIDC client/scope manifest derived from a domain's own IR: what
7
- # an identity provider has to know about this domain before it can
8
- # issue a token that means anything here.
6
+ # An OIDC client/scope manifest derived from a domain's IR: the audience, one scope per
7
+ # command, and the roles those commands demand.
9
8
  #
10
- # ## The artifact half of something already half-built
11
- #
12
- # `spec/oidc_projection_spec.rb` covers the integration half — verified
13
- # claims in, `IdentityResolution.resolve` → `Authorization.holds_role?`
14
- # → a dispatch scoped by `Hecks.as_caller(role:)`. That half enforces
15
- # a role per command. It just had no way to say, up front and as data,
16
- # which role each command wants — every answer came from asking the
17
- # live runtime one dispatch at a time.
18
- #
19
- # This is that catalogue, and the two are checked against each other
20
- # rather than merely coexisting: `verb` here is spelled exactly as
21
- # `Runtime::Dispatcher#dispatch` takes it and exactly as
22
- # `Bluebook#verbs` lists it, so a scope can never name a command
23
- # the domain does not have (spec/projections/oidc_projection_spec.rb
24
- # holds the two lists equal), and `role` is the same string
25
- # `Ports::Authorization.holds_role?` compares against a real
26
- # `Governance::RoleAssignment`.
27
- #
28
- # ## Roles come from the commands, not from governance
29
- #
30
- # A command's own `role "Compliance officer"` is in the bluebook IR
31
- # (`Command#role`), whereas `uses_framework "Governance"` is
32
- # declared in the `.hecksagon` — which `call(bluebook:, options:)`
33
- # cannot see at all. Reading the commands is both the only thing
34
- # available here and the more accurate source: it says what each
35
- # command actually demands, not merely which role vocabulary the
36
- # application happened to mount.
37
- #
38
- # A command with no declared role projects `"role" => nil` rather
39
- # than being dropped — an unguarded command is a real fact about the
40
- # domain, and silently omitting it would make the manifest read as
41
- # though the command did not exist.
9
+ # `verb` matches `Bluebook#verbs` and `role` matches what `Ports::Authorization.holds_role?`
10
+ # compares. Roles come from each command's own `role`, since `.hecksagon` is not visible here.
11
+ # A command with no declared role projects `"role" => nil` rather than being dropped.
42
12
  module OIDC
43
13
  extend Projector::Target
44
14
 
@@ -46,9 +16,8 @@ module Hecks
46
16
 
47
17
  module_function
48
18
 
49
- # `audience:` overrides the domain name, for the ordinary case
50
- # where the IdP's registered audience is a URL rather than a bare
51
- # chapter name.
19
+ # Projects the manifest; `audience:` overrides the domain name (an IdP audience is
20
+ # usually a URL).
52
21
  #
53
22
  # @param bluebook [Bluebook::Chapter] the chapter being projected
54
23
  # @param options [Hash{Symbol => Object}] `:audience` (String, Symbol, nil)
@@ -66,16 +35,8 @@ module Hecks
66
35
  }
67
36
  end
68
37
 
69
- # Sorted by scope, not left in declaration order — a manifest is
70
- # something two versions of get diffed, and the same precedent
71
- # `StorageShape.project` sets for its own aggregate list.
72
- #
73
- # Recurses into entities, not just an aggregate's own direct
74
- # commands — the exact same gap `Bluebook#verbs` closed for the
75
- # same reason (`chapter.rb`'s own comment): a command reached
76
- # through `Dispatcher#dispatch`'s dotted `Entity.Command` routing
77
- # is real and callable, so a manifest that never names it can
78
- # never grant a client a scope for it either.
38
+ # Every command's scope entry, entity commands included (they dispatch as `Entity.Command`).
39
+ # Sorted by scope so two manifest versions diff cleanly.
79
40
  #
80
41
  # @param bluebook [Bluebook::Chapter] the chapter being projected
81
42
  # @return [Array<Hash{String => Object}>] every command's scope entry (see
@@ -100,10 +61,7 @@ module Hecks
100
61
  aggregate.entities.flat_map { |entity| entity_scopes(entity, verb_prefix, scope_prefix) }
101
62
  end
102
63
 
103
- # S17, ADR 0026 — an entity can nest further entities (`Dispatch`,
104
- # inside `Handler`), so this recurses the same way `Chapter#verbs`
105
- # now does. The verb and scope prefixes grow in lockstep, each
106
- # `.`-joined the same way its own kind already was.
64
+ # Projects an entity's commands, recursing into nested entities (ADR 0026).
107
65
  #
108
66
  # @param entity [Bluebook::Entity] the entity being projected
109
67
  # @param verb_prefix [String] the enclosing aggregate or entity's own verb
@@ -120,10 +78,8 @@ module Hecks
120
78
  entity.entities.flat_map { |piece| entity_scopes(piece, verb_prefix, scope_prefix) }
121
79
  end
122
80
 
123
- # `banking:account.open` — the shape an OIDC scope is conventionally
124
- # spelled in, and snake_cased through the same `Naming.snake` the
125
- # facade uses to name a command's own door method, so a scope and
126
- # the Ruby call that satisfies it cannot drift apart.
81
+ # One scope entry per command, spelled like `banking:account.open`; snake-cased through
82
+ # `Naming.snake`, as the facade names its door methods.
127
83
  #
128
84
  # @param commands [Array<Bluebook::Command>] the commands to project
129
85
  # @param verb_prefix [String] the owning aggregate or entity's fully-qualified
@@ -2,14 +2,8 @@ require_relative "../projector"
2
2
 
3
3
  module Hecks
4
4
  module Projections
5
- # The Rust parser's keyword table, projected from the chapter's own
6
- # Syntax aggregate — "the parser's grammar knowledge is derived from
7
- # hecks's self-description, not hand-typed a second time", which
8
- # is the anti-drift idea the whole Rust-parser plan rests on.
9
- #
10
- # A registered target now, rather than a module living inside its own
11
- # bin/ script. It was already a projection in everything but call
12
- # shape; this only stops it being a fifth way of spelling one.
5
+ # The Rust parser's keyword table, projected from the chapter's own Syntax aggregate,
6
+ # so the parser's grammar knowledge is derived rather than hand-typed a second time.
13
7
  module ParserTable
14
8
  extend Projector::Target
15
9
  projects_as :parser_table, declares: "Syntax"
@@ -27,10 +21,8 @@ module Hecks
27
21
 
28
22
  module_function
29
23
 
30
- # The chapter is handed over, not reached for — reaching for the grammar
31
- # registry directly would pin the projection to one chapter, the language's
32
- # own, and the projector protocol already hands over the chapter as an
33
- # argument, at no cost.
24
+ # The chapter's `Syntax` aggregate. Taken from the argument, not the grammar registry,
25
+ # so the projection is not pinned to the language's own chapter.
34
26
  #
35
27
  # @param bluebook [Bluebook::Chapter] the chapter to read the Syntax aggregate
36
28
  # from
@@ -38,10 +30,7 @@ module Hecks
38
30
  # it declares none
39
31
  def syntax(bluebook) = bluebook.aggregate("Syntax")
40
32
 
41
- # Every cell as text — exactly spec/syntax_conformance_spec.rb's own
42
- # `rows` helper, reused rather than re-derived: a member's fields decode
43
- # back through typed literal decoding on the way out of reconstruction,
44
- # and this reads it back as what was written.
33
+ # Every cell as text, as spec/syntax_conformance_spec.rb's `rows` helper reads it.
45
34
  #
46
35
  # @param bluebook [Bluebook::Chapter] the chapter to read from
47
36
  # @param name [String] the closed-set value object's name, such as `"Context"`
@@ -63,10 +52,8 @@ module Hecks
63
52
  ARGUMENT_FIELDS = %i[keyword context at named kind required fills selects
64
53
  pair_key_fills pair_value_fills pairs_shape status variadic minimum].freeze
65
54
 
66
- # A Rust string literal for one field's value — every field here is
67
- # plain ASCII (a word, a context name, a digit, "true"/"false"), so this
68
- # only has to be safe against the two characters Rust string literals
69
- # themselves reserve.
55
+ # A Rust string literal for one field's value. Fields are plain ASCII, so only
56
+ # the backslash and double quote need escaping.
70
57
  #
71
58
  # @param value [Object] the field value to render; stringified before escaping
72
59
  # @return [String] a quoted Rust string literal
@@ -100,14 +87,8 @@ module Hecks
100
87
  "pub static #{name}: &[&str] = &[\n#{lines.join("\n")}\n];\n"
101
88
  end
102
89
 
103
- # S14, ADR 0026 — Keyword/Argument are genuine entities of Syntax
104
- # now, dispatched (not merely declared) so their own `status`
105
- # really is a lifecycle. `SyntaxBoot.call` reads the still-static
106
- # seed rows (`KeywordSeed`/`ArgumentSeed`), dispatches each one
107
- # through the real admission/lifecycle door, and hands back rows in
108
- # the same shape `rows` reads for every other closed set here —
109
- # symbol keys, string values, `status` included — so nothing else
110
- # in this file needs to change.
90
+ # Renders the whole Rust source. Keyword and Argument rows come from `SyntaxBoot.call`,
91
+ # which dispatches the seed rows so `status` is a real lifecycle (ADR 0026).
111
92
  #
112
93
  # @param bluebook [Bluebook::Chapter] the chapter to project
113
94
  # @return [String] the rendered `KEYWORDS`/`ARGUMENTS`/closed-set Rust source
@@ -9,21 +9,8 @@ module Hecks
9
9
  end
10
10
 
11
11
  module Projections
12
- # The DSL reference pages, projected from the chapter's own Syntax
13
- # aggregate — the tables come from the declaration, the prose is
14
- # preserved from whatever is already committed.
15
- #
16
- # The first projection that emits a tree. `emits: :files` says so,
17
- # and the framework writes the map rather than inferring one: a Hash
18
- # of path => contents and a Hash that merely holds strings are the
19
- # same object to Ruby, so only the projection can know which it
20
- # meant. This is the case the output contract was designed for and
21
- # deliberately left unimplemented until something real needed it.
22
- #
23
- # Not pure, and it cannot be. `Doc::Reference.pages` reads the
24
- # committed pages to harvest their prose, so the existing directory
25
- # is an input — passed as `from:` rather than assumed, so the
26
- # projection never reaches for a path of its own choosing.
12
+ # The DSL reference pages, projected from the chapter's Syntax aggregate;
13
+ # tables come from the declaration, prose is preserved from what's already committed.
27
14
  module Reference
28
15
  extend Projector::Target
29
16