hecks 2.8.0 → 3.0.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 (886) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +50 -7
  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 +32 -100
  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 +10 -32
  23. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
  24. data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
  25. data/lib/hecks/adapters/driven/postgres.rb +149 -136
  26. data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
  27. data/lib/hecks/adapters/driven/prism.rb +48 -38
  28. data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
  29. data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
  30. data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
  31. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
  32. data/lib/hecks/adapters/driven/sqlite.rb +128 -65
  33. data/lib/hecks/adapters/driven/tenant_provisioner.rb +76 -62
  34. data/lib/hecks/adapters/driven.rb +5 -36
  35. data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
  36. data/lib/hecks/behaviors/dsl.rb +7 -25
  37. data/lib/hecks/behaviors/expectations.rb +32 -142
  38. data/lib/hecks/behaviors/ir.rb +7 -20
  39. data/lib/hecks/behaviors/rspec.rb +6 -17
  40. data/lib/hecks/behaviors/runner.rb +10 -34
  41. data/lib/hecks/behaviors.rb +4 -8
  42. data/lib/hecks/bench/cli.rb +62 -0
  43. data/lib/hecks/bench/environment.rb +71 -0
  44. data/lib/hecks/bench/postgres_probe.rb +30 -0
  45. data/lib/hecks/bench/report.rb +76 -0
  46. data/lib/hecks/bench/ruby_runner.rb +93 -0
  47. data/lib/hecks/bench/run.rb +55 -0
  48. data/lib/hecks/bench/rust_runner.rb +101 -0
  49. data/lib/hecks/bench/stats.rb +46 -0
  50. data/lib/hecks/bench/suite.rb +98 -0
  51. data/lib/hecks/bench/workload.rb +89 -0
  52. data/lib/hecks/bench.rb +17 -0
  53. data/lib/hecks/bluebook/aggregate.rb +9 -75
  54. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
  55. data/lib/hecks/bluebook/assembly/build.rb +4 -15
  56. data/lib/hecks/bluebook/assembly/contract.rb +15 -136
  57. data/lib/hecks/bluebook/assembly/contracts.rb +56 -174
  58. data/lib/hecks/bluebook/assembly/marks.rb +31 -223
  59. data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
  60. data/lib/hecks/bluebook/assembly.rb +6 -45
  61. data/lib/hecks/bluebook/attribute.rb +12 -61
  62. data/lib/hecks/bluebook/behaviour/aggregate.rb +39 -39
  63. data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
  64. data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
  65. data/lib/hecks/bluebook/behaviour/command.rb +14 -66
  66. data/lib/hecks/bluebook/behaviour/domain_port.rb +11 -20
  67. data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
  68. data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
  69. data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
  70. data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
  71. data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
  72. data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
  73. data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
  74. data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
  75. data/lib/hecks/bluebook/capabilities.rb +17 -49
  76. data/lib/hecks/bluebook/chapter.rb +16 -50
  77. data/lib/hecks/bluebook/command.rb +23 -81
  78. data/lib/hecks/bluebook/domain_port.rb +49 -67
  79. data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
  80. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
  81. data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
  82. data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
  83. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +96 -708
  84. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +63 -169
  85. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +3 -1
  86. data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
  87. data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
  88. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +42 -89
  89. data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
  90. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
  91. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +148 -197
  92. data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
  93. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
  94. data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
  95. data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
  96. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
  97. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
  98. data/lib/hecks/bluebook/dsl/query_builder.rb +38 -43
  99. data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
  100. data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
  101. data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
  102. data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
  103. data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
  104. data/lib/hecks/bluebook/dsl/world_builder.rb +46 -111
  105. data/lib/hecks/bluebook/entity.rb +13 -71
  106. data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
  107. data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
  108. data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
  109. data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
  110. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
  111. data/lib/hecks/bluebook/expression/resolver.rb +39 -661
  112. data/lib/hecks/bluebook/hexagon.rb +18 -33
  113. data/lib/hecks/bluebook/lifecycle.rb +5 -16
  114. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
  115. data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
  116. data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
  117. data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
  118. data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
  119. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -176
  120. data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
  121. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -306
  122. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
  123. data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
  124. data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
  125. data/lib/hecks/bluebook/meta_validator.rb +87 -352
  126. data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
  127. data/lib/hecks/bluebook/model_check.rb +122 -596
  128. data/lib/hecks/bluebook/pattern_subset.rb +49 -69
  129. data/lib/hecks/bluebook/process_manager.rb +13 -83
  130. data/lib/hecks/bluebook/project_loader.rb +3 -39
  131. data/lib/hecks/bluebook/project_register.rb +12 -60
  132. data/lib/hecks/bluebook/query.rb +27 -51
  133. data/lib/hecks/bluebook/read_model.rb +57 -81
  134. data/lib/hecks/bluebook/reference.rb +7 -41
  135. data/lib/hecks/bluebook/smoke_test.rb +9 -99
  136. data/lib/hecks/bluebook/synthesizer.rb +13 -62
  137. data/lib/hecks/bluebook/translation.rb +26 -62
  138. data/lib/hecks/bluebook/value_object.rb +11 -36
  139. data/lib/hecks/bluebook.rb +5 -22
  140. data/lib/hecks/cache_dir.rb +4 -23
  141. data/lib/hecks/canonical_json.rb +30 -0
  142. data/lib/hecks/chapters.rb +102 -0
  143. data/lib/hecks/cli/behaviors.rb +61 -0
  144. data/lib/hecks/cli/canonicalise.rb +25 -0
  145. data/lib/hecks/cli/check_engine_agreement.rb +32 -0
  146. data/lib/hecks/cli/check_era.rb +88 -0
  147. data/lib/hecks/cli/console.rb +66 -0
  148. data/lib/hecks/cli/deploy_template_diff.rb +40 -0
  149. data/lib/hecks/cli/doc_coverage.rb +32 -0
  150. data/lib/hecks/cli/document.rb +5 -23
  151. data/lib/hecks/cli/expression_projection.rb +41 -0
  152. data/lib/hecks/cli/follow.rb +88 -0
  153. data/lib/hecks/cli/history.rb +44 -0
  154. data/lib/hecks/cli/ir.rb +4 -6
  155. data/lib/hecks/cli/mcp.rb +5 -6
  156. data/lib/hecks/cli/model_check.rb +24 -88
  157. data/lib/hecks/cli/pattern_cases.rb +47 -0
  158. data/lib/hecks/cli/present.rb +39 -0
  159. data/lib/hecks/cli/project_cli.rb +223 -64
  160. data/lib/hecks/cli/project_diagrams.rb +4 -10
  161. data/lib/hecks/cli/project_glossary.rb +44 -0
  162. data/lib/hecks/cli/reference.rb +46 -0
  163. data/lib/hecks/cli/refresh_projections.rb +44 -0
  164. data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +150 -0
  165. data/lib/hecks/cli/release.rb +70 -0
  166. data/lib/hecks/cli/release_gem.rb +59 -0
  167. data/lib/hecks/cli/rspec_io_parallel_files.rb +137 -0
  168. data/lib/hecks/cli/rspec_shard_files.rb +66 -0
  169. data/lib/hecks/cli/run.rb +15 -61
  170. data/lib/hecks/cli/seed_semantics_corpus.rb +71 -0
  171. data/lib/hecks/cli/serve_query_ir_mcp.rb +30 -0
  172. data/lib/hecks/cli/shape.rb +70 -0
  173. data/lib/hecks/cli/smoke_http.rb +230 -0
  174. data/lib/hecks/cli/smoke_test.rb +7 -19
  175. data/lib/hecks/cli/spec_example.rb +27 -0
  176. data/lib/hecks/cli/statements.rb +32 -0
  177. data/lib/hecks/cli/stores.rb +4 -6
  178. data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
  179. data/lib/hecks/cli.rb +216 -73
  180. data/lib/hecks/codemod.rb +324 -0
  181. data/lib/hecks/construct.rb +8 -34
  182. data/lib/hecks/corpus.rb +423 -0
  183. data/lib/hecks/deploy/bluebook/deploy.bluebook +617 -158
  184. data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -11
  185. data/lib/hecks/deploy/oidc.json +82 -2
  186. data/lib/hecks/doc/reference.rb +351 -0
  187. data/lib/hecks/doors/cli_door.rb +196 -0
  188. data/lib/hecks/doors/cli_runner.rb +297 -0
  189. data/lib/hecks/{facade → doors}/command_request.rb +14 -34
  190. data/lib/hecks/doors/handle.rb +206 -0
  191. data/lib/hecks/doors/json_door.rb +132 -0
  192. data/lib/hecks/doors/launcher_options.rb +129 -0
  193. data/lib/hecks/{cli → doors}/mcp_door.rb +25 -120
  194. data/lib/hecks/doors/mcp_door_scope.rb +97 -0
  195. data/lib/hecks/doors/ruby_door/aggregate_door.rb +162 -0
  196. data/lib/hecks/doors/ruby_door/chapter.rb +72 -0
  197. data/lib/hecks/doors/ruby_door.rb +77 -0
  198. data/lib/hecks/doors.rb +61 -0
  199. data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
  200. data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
  201. data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
  202. data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
  203. data/lib/hecks/embryonaut_bluebook.rb +5 -72
  204. data/lib/hecks/engine_agreement.rb +156 -0
  205. data/lib/hecks/facade.rb +23 -51
  206. data/lib/hecks/forms/app.rb +21 -76
  207. data/lib/hecks/forms/banking_presentation.rb +50 -0
  208. data/lib/hecks/forms/command_form_renderer.rb +10 -29
  209. data/lib/hecks/forms/field_renderer.rb +17 -156
  210. data/lib/hecks/forms/field_shape.rb +31 -222
  211. data/lib/hecks/forms/html.rb +12 -47
  212. data/lib/hecks/forms/index_renderer.rb +1 -4
  213. data/lib/hecks/forms/page.rb +3 -9
  214. data/lib/hecks/forms/params.rb +14 -60
  215. data/lib/hecks/forms/port_argument.rb +2 -19
  216. data/lib/hecks/forms/query_form_renderer.rb +4 -79
  217. data/lib/hecks/forms/record_renderer.rb +8 -75
  218. data/lib/hecks/forms/record_table.rb +7 -50
  219. data/lib/hecks/forms/reference_options.rb +3 -30
  220. data/lib/hecks/forms/value_object_shape.rb +8 -35
  221. data/lib/hecks/forms.rb +5 -33
  222. data/lib/hecks/fqn.rb +5 -12
  223. data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
  224. data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
  225. data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
  226. data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
  227. data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
  228. data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
  229. data/lib/hecks/framework.rb +11 -80
  230. data/lib/hecks/freezer.rb +5 -39
  231. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +393 -0
  232. data/lib/hecks/fuzzing/combination_miner.rb +86 -0
  233. data/lib/hecks/fuzzing/concurrent_dispatch.rb +214 -0
  234. data/lib/hecks/fuzzing/coverage_campaign.rb +143 -0
  235. data/lib/hecks/fuzzing/differential.rb +156 -0
  236. data/lib/hecks/fuzzing/domain_generator.rb +615 -0
  237. data/lib/hecks/fuzzing/era_boundary.rb +71 -0
  238. data/lib/hecks/fuzzing/form_census.rb +136 -0
  239. data/lib/hecks/fuzzing/generated_domain_check.rb +93 -0
  240. data/lib/hecks/fuzzing/invalid_value_generator.rb +64 -0
  241. data/lib/hecks/fuzzing/isolated_boot.rb +301 -0
  242. data/lib/hecks/fuzzing/nondeterministic.rb +51 -0
  243. data/lib/hecks/fuzzing/outside_world.rb +45 -0
  244. data/lib/hecks/fuzzing/persistence_parity.rb +102 -0
  245. data/lib/hecks/fuzzing/properties/corrections.rb +88 -0
  246. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +314 -0
  247. data/lib/hecks/fuzzing/properties/guards.rb +190 -0
  248. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +300 -0
  249. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +93 -0
  250. data/lib/hecks/fuzzing/properties/outbox.rb +89 -0
  251. data/lib/hecks/fuzzing/properties/querying.rb +175 -0
  252. data/lib/hecks/fuzzing/properties.rb +162 -0
  253. data/lib/hecks/fuzzing/qa_settings.rb +123 -0
  254. data/lib/hecks/fuzzing/replay.rb +505 -0
  255. data/lib/hecks/fuzzing/rotation_priority.rb +48 -0
  256. data/lib/hecks/fuzzing/rust_gap_manifest.rb +108 -0
  257. data/lib/hecks/fuzzing/self_consistency.rb +339 -0
  258. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +385 -0
  259. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +132 -0
  260. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +95 -0
  261. data/lib/hecks/fuzzing/sequence_generator/picker.rb +77 -0
  262. data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +109 -0
  263. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +237 -0
  264. data/lib/hecks/fuzzing/sequence_generator.rb +189 -0
  265. data/lib/hecks/fuzzing/shrinker.rb +166 -0
  266. data/lib/hecks/fuzzing/structural_skips.rb +33 -0
  267. data/lib/hecks/fuzzing/sweep_depth.rb +43 -0
  268. data/lib/hecks/fuzzing/target_capabilities.rb +163 -0
  269. data/lib/hecks/fuzzing/value_generator.rb +216 -0
  270. data/lib/hecks/fuzzing.rb +23 -0
  271. data/lib/hecks/grammar/evolve.rb +336 -0
  272. data/lib/hecks/grammar/expression.bluebook +15 -40
  273. data/lib/hecks/grammar/translation.bluebook +3 -6
  274. data/lib/hecks/grammar.rb +16 -41
  275. data/lib/hecks/hecks/adapters/codebase/codemods.rb +45 -0
  276. data/lib/hecks/hecks/adapters/codebase/conformance.rb +71 -0
  277. data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +202 -0
  278. data/lib/hecks/hecks/adapters/codebase/gem_registry.rb +80 -0
  279. data/lib/hecks/hecks/adapters/codebase/kernel_tables.rb +54 -0
  280. data/lib/hecks/hecks/adapters/codebase/language.rb +240 -0
  281. data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +102 -0
  282. data/lib/hecks/hecks/adapters/codebase/publishing.rb +142 -0
  283. data/lib/hecks/hecks/adapters/codebase/regeneration.rb +67 -0
  284. data/lib/hecks/hecks/adapters/codebase/release_facts.rb +90 -0
  285. data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +83 -0
  286. data/lib/hecks/hecks/adapters/codebase/secret_vault.rb +36 -0
  287. data/lib/hecks/hecks/adapters/codebase/source_tree.adapter +7 -0
  288. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +189 -0
  289. data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +71 -0
  290. data/lib/hecks/hecks/adapters/codebase/style.rb +171 -0
  291. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +55 -0
  292. data/lib/hecks/hecks/adapters/codebase/test_suite.rb +165 -0
  293. data/lib/hecks/hecks/adapters/codebase/tree.rb +111 -0
  294. data/lib/hecks/hecks/adapters/console_capture.rb +79 -0
  295. data/lib/hecks/hecks/adapters/deploy_toolchain.adapter +7 -0
  296. data/lib/hecks/hecks/adapters/deploy_toolchain.rb +108 -0
  297. data/lib/hecks/hecks/adapters/git.adapter +7 -0
  298. data/lib/hecks/hecks/adapters/git.rb +102 -0
  299. data/lib/hecks/hecks/adapters/host_http.adapter +7 -0
  300. data/lib/hecks/hecks/adapters/host_http.rb +65 -0
  301. data/lib/hecks/hecks/adapters/in_process_boot.adapter +7 -0
  302. data/lib/hecks/hecks/adapters/in_process_boot.rb +197 -0
  303. data/lib/hecks/hecks/adapters/in_process_operations.rb +202 -0
  304. data/lib/hecks/hecks/adapters/journal_store/changes.rb +143 -0
  305. data/lib/hecks/hecks/adapters/journal_store/compaction.rb +145 -0
  306. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +132 -0
  307. data/lib/hecks/hecks/adapters/journal_store/examination.rb +135 -0
  308. data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +163 -0
  309. data/lib/hecks/hecks/adapters/journal_store/readings.rb +187 -0
  310. data/lib/hecks/hecks/adapters/journal_store.adapter +7 -0
  311. data/lib/hecks/hecks/adapters/journal_store.rb +64 -0
  312. data/lib/hecks/hecks/adapters/local_files.adapter +7 -0
  313. data/lib/hecks/hecks/adapters/local_files.rb +46 -0
  314. data/lib/hecks/hecks/adapters/pg_admin.adapter +7 -0
  315. data/lib/hecks/hecks/adapters/pg_admin.rb +245 -0
  316. data/lib/hecks/hecks/adapters/process_pool.adapter +7 -0
  317. data/lib/hecks/hecks/adapters/process_pool.rb +119 -0
  318. data/lib/hecks/hecks/adapters/rust_toolchain.adapter +7 -0
  319. data/lib/hecks/hecks/adapters/rust_toolchain.rb +179 -0
  320. data/lib/hecks/hecks/adapters/rust_workspace.rb +150 -0
  321. data/lib/hecks/hecks/adapters/shell.adapter +7 -0
  322. data/lib/hecks/hecks/adapters/shell.rb +49 -0
  323. data/lib/hecks/hecks/adapters/terminal.adapter +7 -0
  324. data/lib/hecks/hecks/adapters/terminal.rb +74 -0
  325. data/lib/hecks/hecks/codebase.behaviors +172 -0
  326. data/lib/hecks/hecks/codebase.bluebook +2453 -0
  327. data/lib/hecks/hecks/context_map.hecksagon +13 -0
  328. data/lib/hecks/hecks/custodian.behaviors +179 -0
  329. data/lib/hecks/hecks/custodian.bluebook +1847 -0
  330. data/lib/hecks/hecks/deploy.behaviors +74 -0
  331. data/lib/hecks/hecks/deploy.world +12 -0
  332. data/lib/hecks/hecks/environments/memory.world +10 -0
  333. data/lib/hecks/hecks/governance.world +7 -0
  334. data/lib/hecks/hecks/hecks.behaviors +62 -0
  335. data/lib/hecks/hecks/hecks.bluebook +124 -0
  336. data/lib/hecks/hecks/hecks.hecksagon +390 -0
  337. data/lib/hecks/hecks/hecks.world +42 -0
  338. data/lib/hecks/ir.rb +14 -83
  339. data/lib/hecks/kernel_capabilities.rb +194 -0
  340. data/lib/hecks/language/adapter.bluebook +2 -7
  341. data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
  342. data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
  343. data/lib/hecks/language/bluebook/bluebook.bluebook +26 -83
  344. data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
  345. data/lib/hecks/language/bluebook/command.bluebook +27 -144
  346. data/lib/hecks/language/bluebook/entity.bluebook +24 -97
  347. data/lib/hecks/language/bluebook/policy.bluebook +16 -67
  348. data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
  349. data/lib/hecks/language/bluebook/projection.bluebook +126 -60
  350. data/lib/hecks/language/bluebook/query.bluebook +19 -43
  351. data/lib/hecks/language/bluebook/shape.bluebook +23 -73
  352. data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
  353. data/lib/hecks/language/bluebook/vocabulary.bluebook +83 -198
  354. data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
  355. data/lib/hecks/language/hecksagon/domain_port.bluebook +14 -19
  356. data/lib/hecks/language/hecksagon/hecksagon.bluebook +26 -25
  357. data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
  358. data/lib/hecks/language/oidc.json +35 -0
  359. data/lib/hecks/language/port.bluebook +4 -17
  360. data/lib/hecks/language/translation/translation.bluebook +3 -9
  361. data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
  362. data/lib/hecks/language/world/wiring.bluebook +1 -3
  363. data/lib/hecks/language/world/world.bluebook +5 -7
  364. data/lib/hecks/literal.rb +8 -50
  365. data/lib/hecks/mcp_stdio_guard.rb +4 -41
  366. data/lib/hecks/naming.rb +29 -137
  367. data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
  368. data/lib/hecks/persistence_legacy_fixture.rb +113 -0
  369. data/lib/hecks/ports/access_control.rb +7 -23
  370. data/lib/hecks/ports/agent/answers.rb +5 -23
  371. data/lib/hecks/ports/agent.rb +47 -172
  372. data/lib/hecks/ports/authentication.rb +12 -39
  373. data/lib/hecks/ports/authorization.rb +16 -43
  374. data/lib/hecks/ports/clock.rb +5 -45
  375. data/lib/hecks/ports/extraction.rb +7 -12
  376. data/lib/hecks/ports/identity_assignment.rb +8 -29
  377. data/lib/hecks/ports/identity_generation.rb +6 -29
  378. data/lib/hecks/ports/identity_resolution.rb +2 -10
  379. data/lib/hecks/ports/key_vault.rb +9 -45
  380. data/lib/hecks/ports/persistence/append_only.rb +61 -64
  381. data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
  382. data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
  383. data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
  384. data/lib/hecks/ports/persistence/plugin.rb +13 -42
  385. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +44 -144
  386. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
  387. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +20 -85
  388. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
  389. data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +18 -24
  390. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
  391. data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
  392. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
  393. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
  394. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
  395. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
  396. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
  397. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
  398. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +19 -76
  399. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
  400. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
  401. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
  402. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
  403. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
  404. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +43 -127
  405. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
  406. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +131 -555
  407. data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
  408. data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +227 -0
  409. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
  410. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
  411. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
  412. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
  413. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
  414. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +50 -47
  415. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
  416. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
  417. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
  418. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
  419. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
  420. data/lib/hecks/ports/persistence/plugins/era/translation.rb +1 -0
  421. data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
  422. data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
  423. data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
  424. data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
  425. data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
  426. data/lib/hecks/ports/persistence/state_codec.rb +47 -108
  427. data/lib/hecks/ports/persistence.rb +7 -14
  428. data/lib/hecks/ports/projection.rb +42 -84
  429. data/lib/hecks/ports/query/in_memory.rb +10 -58
  430. data/lib/hecks/ports/query/ordering.rb +11 -32
  431. data/lib/hecks/ports/query.rb +14 -37
  432. data/lib/hecks/ports.rb +2 -8
  433. data/lib/hecks/projection_files.rb +285 -0
  434. data/lib/hecks/projections/bootstrap_table.rb +12 -44
  435. data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
  436. data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
  437. data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
  438. data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
  439. data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
  440. data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
  441. data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
  442. data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
  443. data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
  444. data/lib/hecks/projections/deploy/fargate.rb +40 -207
  445. data/lib/hecks/projections/deploy/lambda.rb +191 -708
  446. data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
  447. data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
  448. data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
  449. data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
  450. data/lib/hecks/projections/deploy/preview/script.rb +2 -14
  451. data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
  452. data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
  453. data/lib/hecks/projections/deploy/preview/template.rb +3 -59
  454. data/lib/hecks/projections/deploy/preview.rb +2 -67
  455. data/lib/hecks/projections/deploy/scripts/deploy-service.sh.tmpl +1 -1
  456. data/lib/hecks/projections/deploy/scripts/expected-era.header +1 -1
  457. data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +3 -3
  458. data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
  459. data/lib/hecks/projections/deploy/scripts/smoke-after-deploy.sh.tmpl +1 -1
  460. data/lib/hecks/projections/deploy/scripts.rb +4 -57
  461. data/lib/hecks/projections/deploy/shared.rb +48 -147
  462. data/lib/hecks/projections/deploy/smoke.rb +4 -61
  463. data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
  464. data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
  465. data/lib/hecks/projections/deploy/template_diff.rb +5 -57
  466. data/lib/hecks/projections/diagrams.rb +22 -584
  467. data/lib/hecks/projections/glossary/html.rb +14 -130
  468. data/lib/hecks/projections/glossary/markdown.rb +8 -69
  469. data/lib/hecks/projections/glossary/mermaid.rb +9 -66
  470. data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
  471. data/lib/hecks/projections/glossary/sentences.rb +14 -159
  472. data/lib/hecks/projections/glossary.rb +30 -222
  473. data/lib/hecks/projections/ir.rb +3 -10
  474. data/lib/hecks/projections/model/deviations.rb +16 -43
  475. data/lib/hecks/projections/model.rb +12 -51
  476. data/lib/hecks/projections/oidc.rb +12 -56
  477. data/lib/hecks/projections/parser_table.rb +13 -32
  478. data/lib/hecks/projections/reference.rb +4 -18
  479. data/lib/hecks/projections/rust_vocabulary.rb +13 -251
  480. data/lib/hecks/projections/shape.rb +3 -29
  481. data/lib/hecks/projections/statements.rb +7 -86
  482. data/lib/hecks/projections/vocabulary.rb +6 -22
  483. data/lib/hecks/projections.rb +2 -16
  484. data/lib/hecks/projector/cli_projector.rb +154 -400
  485. data/lib/hecks/projector/docs_projector.rb +10 -201
  486. data/lib/hecks/projector/exporter.rb +42 -134
  487. data/lib/hecks/projector/ir_projector.rb +2 -9
  488. data/lib/hecks/projector/narrate_projector.rb +15 -189
  489. data/lib/hecks/projector/target.rb +13 -76
  490. data/lib/hecks/projector.rb +30 -121
  491. data/lib/hecks/quality_control/adapters/agent.adapter +7 -0
  492. data/lib/hecks/quality_control/adapters/agent.rb +58 -0
  493. data/lib/hecks/quality_control/adapters/angle_tools.adapter +7 -0
  494. data/lib/hecks/quality_control/adapters/angle_tools.rb +15 -0
  495. data/lib/hecks/quality_control/adapters/clearance_recorder.rb +36 -0
  496. data/lib/hecks/quality_control/adapters/clearance_tools.adapter +7 -0
  497. data/lib/hecks/quality_control/adapters/clearance_tools.rb +17 -0
  498. data/lib/hecks/quality_control/adapters/git_pr.adapter +7 -0
  499. data/lib/hecks/quality_control/adapters/git_pr.rb +226 -0
  500. data/lib/hecks/quality_control/adapters/github_checks.adapter +9 -0
  501. data/lib/hecks/quality_control/adapters/github_checks.rb +83 -0
  502. data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +56 -0
  503. data/lib/hecks/quality_control/adapters/github_issues.adapter +7 -0
  504. data/lib/hecks/quality_control/adapters/github_issues.rb +49 -0
  505. data/lib/hecks/quality_control/adapters/qa_tool.rb +59 -0
  506. data/lib/hecks/quality_control/adapters/sweep_tools.adapter +7 -0
  507. data/lib/hecks/quality_control/adapters/sweep_tools.rb +51 -0
  508. data/lib/hecks/quality_control/adapters/target_tools.adapter +7 -0
  509. data/lib/hecks/quality_control/adapters/target_tools.rb +43 -0
  510. data/lib/hecks/quality_control/cli/child.rb +45 -0
  511. data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +45 -0
  512. data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +248 -0
  513. data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +163 -0
  514. data/lib/hecks/quality_control/cli/qa_generated_domains.rb +450 -0
  515. data/lib/hecks/quality_control/cli/qa_log_bug.rb +195 -0
  516. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +220 -0
  517. data/lib/hecks/quality_control/cli/qa_open_pr.rb +305 -0
  518. data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +154 -0
  519. data/lib/hecks/quality_control/cli/qa_postgres_role.rb +159 -0
  520. data/lib/hecks/quality_control/cli/qa_pr_check.rb +232 -0
  521. data/lib/hecks/quality_control/cli/qa_seed_angles.rb +142 -0
  522. data/lib/hecks/quality_control/cli/qa_seed_targets.rb +69 -0
  523. data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +280 -0
  524. data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +329 -0
  525. data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +92 -0
  526. data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +117 -0
  527. data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +175 -0
  528. data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +60 -0
  529. data/lib/hecks/quality_control/cli/qa_sweep.rb +611 -0
  530. data/lib/hecks/quality_control/cli/qa_tick.rb +274 -0
  531. data/lib/hecks/quality_control/quality_control.bluebook +2224 -0
  532. data/lib/hecks/quality_control/quality_control.hecksagon +13 -0
  533. data/lib/hecks/quality_control/quality_control.ports.hecksagon +54 -0
  534. data/lib/hecks/query_ir.rb +346 -0
  535. data/lib/hecks/query_ir_mcp.rb +198 -0
  536. data/lib/hecks/query_specification/common/comparators.rb +5 -26
  537. data/lib/hecks/query_specification/common/comparison.rb +35 -143
  538. data/lib/hecks/query_specification/common/dsl.rb +8 -24
  539. data/lib/hecks/query_specification/common/null_policy.rb +20 -70
  540. data/lib/hecks/query_specification/common/options.rb +2 -6
  541. data/lib/hecks/query_specification/common/where_clause.rb +2 -10
  542. data/lib/hecks/query_specification/field_path.rb +37 -77
  543. data/lib/hecks/query_specification/hop_path.rb +12 -76
  544. data/lib/hecks/release/gem_pin.rb +2 -26
  545. data/lib/hecks/release/runner/ci_publisher.rb +5 -8
  546. data/lib/hecks/release/runner/clean_tree.rb +42 -0
  547. data/lib/hecks/release/runner/commands.rb +2 -4
  548. data/lib/hecks/release/runner/console.rb +6 -0
  549. data/lib/hecks/release/runner/gem_publisher.rb +15 -9
  550. data/lib/hecks/release/runner/npm_publisher.rb +9 -53
  551. data/lib/hecks/release/runner/preflight.rb +29 -20
  552. data/lib/hecks/release/runner/published.rb +8 -26
  553. data/lib/hecks/release/runner/tagger.rb +31 -23
  554. data/lib/hecks/release/runner.rb +60 -38
  555. data/lib/hecks/rendering.rb +4 -26
  556. data/lib/hecks/router/namespace_installer.rb +15 -39
  557. data/lib/hecks/router.rb +4 -8
  558. data/lib/hecks/runtime/adapter_lookup.rb +124 -0
  559. data/lib/hecks/runtime/aggregate_lock.rb +8 -33
  560. data/lib/hecks/runtime/boot_gates.rb +3 -18
  561. data/lib/hecks/runtime/caller.rb +19 -59
  562. data/lib/hecks/runtime/capability_graph.rb +5 -21
  563. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
  564. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +27 -160
  565. data/lib/hecks/runtime/command_interpreter.rb +124 -306
  566. data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
  567. data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
  568. data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
  569. data/lib/hecks/runtime/command_rules/emission.rb +8 -21
  570. data/lib/hecks/runtime/command_rules/references.rb +23 -202
  571. data/lib/hecks/runtime/dependency_planning.rb +50 -104
  572. data/lib/hecks/runtime/dispatcher.rb +134 -243
  573. data/lib/hecks/runtime/entity_element.rb +40 -462
  574. data/lib/hecks/runtime/entity_interpreter.rb +64 -219
  575. data/lib/hecks/runtime/errors.rb +32 -115
  576. data/lib/hecks/runtime/event.rb +3 -25
  577. data/lib/hecks/runtime/identity.rb +18 -154
  578. data/lib/hecks/runtime/instance.rb +18 -150
  579. data/lib/hecks/runtime/interpreting.rb +14 -70
  580. data/lib/hecks/runtime/invocation.rb +28 -164
  581. data/lib/hecks/runtime/loader.rb +109 -194
  582. data/lib/hecks/runtime/outbox.rb +39 -262
  583. data/lib/hecks/runtime/policy_interpreter.rb +43 -202
  584. data/lib/hecks/runtime/port_operation_interpreter.rb +28 -97
  585. data/lib/hecks/runtime/query_interpreter.rb +122 -187
  586. data/lib/hecks/runtime/reaction_invocation.rb +36 -138
  587. data/lib/hecks/runtime/reaction_outcome.rb +89 -0
  588. data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
  589. data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
  590. data/lib/hecks/runtime/reference_hop.rb +8 -81
  591. data/lib/hecks/runtime/refusal_wording.rb +28 -87
  592. data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
  593. data/lib/hecks/runtime/registry/verification.rb +213 -227
  594. data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
  595. data/lib/hecks/runtime/registry.rb +156 -247
  596. data/lib/hecks/runtime/remote_dispatcher.rb +68 -154
  597. data/lib/hecks/runtime/routing.rb +4 -15
  598. data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
  599. data/lib/hecks/runtime/saga_interpreter.rb +79 -263
  600. data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
  601. data/lib/hecks/runtime/tenant_check.rb +6 -68
  602. data/lib/hecks/runtime/tenant_scope.rb +3 -28
  603. data/lib/hecks/runtime/value/admission.rb +16 -67
  604. data/lib/hecks/runtime/value/coercion.rb +162 -760
  605. data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
  606. data/lib/hecks/runtime/value/field_checks.rb +172 -0
  607. data/lib/hecks/runtime/value.rb +15 -84
  608. data/lib/hecks/runtime.rb +35 -69
  609. data/lib/hecks/rust_build/conformance.rb +158 -0
  610. data/lib/hecks/rust_build/conformance_fuzz.rb +71 -0
  611. data/lib/hecks/rust_build/coverage.rb +218 -0
  612. data/lib/hecks/rust_build/native_build.rb +124 -0
  613. data/lib/hecks/rust_build/project_rust/root_mod.rb +120 -0
  614. data/lib/hecks/rust_build/project_rust.rb +332 -0
  615. data/lib/hecks/rust_build/wasm.rb +105 -0
  616. data/lib/hecks/rust_build/wasm_browser.rb +113 -0
  617. data/lib/hecks/rust_build.rb +144 -0
  618. data/lib/hecks/storehouse.rb +155 -582
  619. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +10 -34
  620. data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
  621. data/lib/hecks/three_zero/forms.yml +127 -0
  622. data/lib/hecks/three_zero.rb +12 -0
  623. data/lib/hecks/tools/argument_gate_matrix.rb +316 -0
  624. data/lib/hecks/tools/comment_style.rb +1070 -0
  625. data/lib/hecks/tools/corpus_report.rb +87 -0
  626. data/lib/hecks/tools/deploy_recipe.rb +255 -0
  627. data/lib/hecks/tools/deploy_recipe_lint.rb +282 -0
  628. data/lib/hecks/tools/drop_implicit_append_fields.rb +95 -0
  629. data/lib/hecks/tools/era_projection_backfill.rb +94 -0
  630. data/lib/hecks/tools/era_reattest.rb +146 -0
  631. data/lib/hecks/tools/evolve_run.rb +189 -0
  632. data/lib/hecks/tools/fuzz_sweep.rb +373 -0
  633. data/lib/hecks/tools/heki_compaction.rb +100 -0
  634. data/lib/hecks/tools/hoist_local_givens.rb +246 -0
  635. data/lib/hecks/tools/journal_compaction.rb +89 -0
  636. data/lib/hecks/tools/oidc_manifests.rb +70 -0
  637. data/lib/hecks/tools/query_ir_run.rb +81 -0
  638. data/lib/hecks/tools/regeneration_run.rb +166 -0
  639. data/lib/hecks/tools/rust_comment_style.rb +642 -0
  640. data/lib/hecks/tools/sequence_script.rb +62 -0
  641. data/lib/hecks/tools/tail_merge.rb +117 -0
  642. data/lib/hecks/tools/tenant_provisioning.rb +142 -0
  643. data/lib/hecks/tools/translation_audit.rb +208 -0
  644. data/lib/hecks/tools/translation_scaffold.rb +131 -0
  645. data/lib/hecks/tools.rb +86 -0
  646. data/lib/hecks/vendoring/git_environment.rb +2 -8
  647. data/lib/hecks/vendoring/git_source.rb +4 -10
  648. data/lib/hecks/vendoring.rb +7 -46
  649. data/lib/hecks/version.rb +3 -14
  650. data/lib/hecks.rb +52 -90
  651. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
  652. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
  653. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
  654. data/qa/settings.yml +66 -0
  655. data/rust/.cargo/config.toml +6 -0
  656. data/rust/.gitignore +2 -0
  657. data/rust/Cargo.lock +54 -0
  658. data/rust/Cargo.toml +61 -0
  659. data/rust/build/.cargo/config.toml +3 -0
  660. data/rust/build/.gitignore +1 -0
  661. data/rust/build/Cargo.lock +7 -0
  662. data/rust/build/Cargo.toml +19 -0
  663. data/rust/build/src/build_artifact.rs +47 -0
  664. data/rust/build/src/cargo_sync.rs +248 -0
  665. data/rust/build/src/json.rs +421 -0
  666. data/rust/build/src/lineage_pass.rs +285 -0
  667. data/rust/build/src/main.rs +51 -0
  668. data/rust/build/src/optional_pass.rs +150 -0
  669. data/rust/build/src/pipeline.rs +264 -0
  670. data/rust/build/src/reserved_names.rs +76 -0
  671. data/rust/build/src/resolve.rs +124 -0
  672. data/rust/build/src/root.rs +25 -0
  673. data/rust/build/src/sidecars.rs +73 -0
  674. data/rust/build/src/subprocess.rs +51 -0
  675. data/rust/build/src/tmp.rs +31 -0
  676. data/rust/codegen/.cargo/config.toml +3 -0
  677. data/rust/codegen/.gitignore +1 -0
  678. data/rust/codegen/Cargo.lock +7 -0
  679. data/rust/codegen/Cargo.toml +20 -0
  680. data/rust/codegen/src/attr.rs +32 -0
  681. data/rust/codegen/src/bridging.rs +481 -0
  682. data/rust/codegen/src/commands.rs +1226 -0
  683. data/rust/codegen/src/constraints.rs +109 -0
  684. data/rust/codegen/src/dependency_planning.rs +209 -0
  685. data/rust/codegen/src/domain_generator.rs +1288 -0
  686. data/rust/codegen/src/exemplar.rs +230 -0
  687. data/rust/codegen/src/expr_emitter.rs +87 -0
  688. data/rust/codegen/src/fielded.rs +192 -0
  689. data/rust/codegen/src/hecks_naming.rs +33 -0
  690. data/rust/codegen/src/json.rs +335 -0
  691. data/rust/codegen/src/json_codec.rs +697 -0
  692. data/rust/codegen/src/literal.rs +207 -0
  693. data/rust/codegen/src/main.rs +290 -0
  694. data/rust/codegen/src/manifest.rs +227 -0
  695. data/rust/codegen/src/mutations.rs +784 -0
  696. data/rust/codegen/src/naming.rs +286 -0
  697. data/rust/codegen/src/ports.rs +208 -0
  698. data/rust/codegen/src/prelude.rs +116 -0
  699. data/rust/codegen/src/queries.rs +786 -0
  700. data/rust/codegen/src/reactions.rs +532 -0
  701. data/rust/codegen/src/read_models.rs +697 -0
  702. data/rust/codegen/src/reference_specs.rs +40 -0
  703. data/rust/codegen/src/registry.rs +966 -0
  704. data/rust/codegen/src/reserved_names.rs +76 -0
  705. data/rust/codegen/src/shared.rs +93 -0
  706. data/rust/codegen/src/skip_reason.rs +25 -0
  707. data/rust/codegen/src/types.rs +362 -0
  708. data/rust/host/.cargo/config.toml +3 -0
  709. data/rust/host/.gitignore +1 -0
  710. data/rust/host/Cargo.lock +4297 -0
  711. data/rust/host/Cargo.toml +61 -0
  712. data/rust/host/HECKS_RELEASE +1 -0
  713. data/rust/host/rds-ca-bundle.pem +2736 -0
  714. data/rust/host/src/api.rs +1596 -0
  715. data/rust/host/src/approval.rs +652 -0
  716. data/rust/host/src/auth.rs +1287 -0
  717. data/rust/host/src/bin/expr_harness.rs +46 -0
  718. data/rust/host/src/bin/lineage_harness.rs +119 -0
  719. data/rust/host/src/bin/mint_harness.rs +135 -0
  720. data/rust/host/src/checkout.rs +265 -0
  721. data/rust/host/src/dispatch.rs +1443 -0
  722. data/rust/host/src/expr_json.rs +1117 -0
  723. data/rust/host/src/field_hints.rs +52 -0
  724. data/rust/host/src/ir.rs +733 -0
  725. data/rust/host/src/journal.rs +874 -0
  726. data/rust/host/src/lambda_client.rs +378 -0
  727. data/rust/host/src/log.rs +147 -0
  728. data/rust/host/src/main.rs +474 -0
  729. data/rust/host/src/mint.rs +1865 -0
  730. data/rust/host/src/payments/keystore.rs +330 -0
  731. data/rust/host/src/payments/tests.rs +1400 -0
  732. data/rust/host/src/payments.rs +767 -0
  733. data/rust/host/src/presentation.rs +698 -0
  734. data/rust/host/src/presentation_write.rs +1431 -0
  735. data/rust/host/src/query_step.rs +149 -0
  736. data/rust/host/src/rate_limit.rs +904 -0
  737. data/rust/host/src/reference_transform.rs +241 -0
  738. data/rust/host/src/reference_validate.rs +338 -0
  739. data/rust/host/src/resend.rs +296 -0
  740. data/rust/host/src/secrets.rs +106 -0
  741. data/rust/host/src/server.rs +663 -0
  742. data/rust/host/src/storage_shape.rs +175 -0
  743. data/rust/host/src/test_pg.rs +40 -0
  744. data/rust/host/src/ui_schema.rs +1351 -0
  745. data/rust/host/src/wasm_runner.rs +191 -0
  746. data/rust/host/src/web/newsletter/cooldown.rs +126 -0
  747. data/rust/host/src/web/newsletter/tests.rs +104 -0
  748. data/rust/host/src/web/newsletter.rs +310 -0
  749. data/rust/host/src/web/newsletter_send.rs +357 -0
  750. data/rust/host/src/web/registrations.rs +1505 -0
  751. data/rust/host/src/web.rs +2937 -0
  752. data/rust/lsp/.gitignore +1 -0
  753. data/rust/lsp/Cargo.lock +7 -0
  754. data/rust/lsp/Cargo.toml +16 -0
  755. data/rust/lsp/README.md +133 -0
  756. data/rust/lsp/src/diagnostics.rs +165 -0
  757. data/rust/lsp/src/json.rs +385 -0
  758. data/rust/lsp/src/main.rs +399 -0
  759. data/rust/lsp/src/outline.rs +177 -0
  760. data/rust/lsp/src/rpc.rs +67 -0
  761. data/rust/parser/.cargo/config.toml +5 -0
  762. data/rust/parser/.gitignore +1 -0
  763. data/rust/parser/Cargo.lock +7 -0
  764. data/rust/parser/Cargo.toml +21 -0
  765. data/rust/parser/src/build/closed_sets.rs +27 -0
  766. data/rust/parser/src/build/identity.rs +276 -0
  767. data/rust/parser/src/build/mod.rs +12 -0
  768. data/rust/parser/src/build/naming.rs +141 -0
  769. data/rust/parser/src/build/pattern_subset.rs +161 -0
  770. data/rust/parser/src/build/query_derive.rs +72 -0
  771. data/rust/parser/src/build/query_inference.rs +269 -0
  772. data/rust/parser/src/build/query_options.rs +100 -0
  773. data/rust/parser/src/build/read_model.rs +94 -0
  774. data/rust/parser/src/build/references.rs +32 -0
  775. data/rust/parser/src/canonical.rs +114 -0
  776. data/rust/parser/src/diag.rs +55 -0
  777. data/rust/parser/src/emit.rs +953 -0
  778. data/rust/parser/src/expr/ast_json.rs +147 -0
  779. data/rust/parser/src/expr/evaluator.rs +81 -0
  780. data/rust/parser/src/expr/mod.rs +84 -0
  781. data/rust/parser/src/expr/resolver.rs +497 -0
  782. data/rust/parser/src/ir.rs +387 -0
  783. data/rust/parser/src/keywords.rs +585 -0
  784. data/rust/parser/src/lex.rs +662 -0
  785. data/rust/parser/src/main.rs +252 -0
  786. data/rust/parser/src/parse/aggregate.rs +612 -0
  787. data/rust/parser/src/parse/chapter.rs +517 -0
  788. data/rust/parser/src/parse/command.rs +637 -0
  789. data/rust/parser/src/parse/domain_port.rs +127 -0
  790. data/rust/parser/src/parse/entity.rs +527 -0
  791. data/rust/parser/src/parse/file.rs +67 -0
  792. data/rust/parser/src/parse/hecksagon.rs +231 -0
  793. data/rust/parser/src/parse/lifecycle.rs +162 -0
  794. data/rust/parser/src/parse/mod.rs +1262 -0
  795. data/rust/parser/src/parse/policy.rs +87 -0
  796. data/rust/parser/src/parse/process_manager.rs +305 -0
  797. data/rust/parser/src/parse/query.rs +100 -0
  798. data/rust/parser/src/parse/read_model.rs +214 -0
  799. data/rust/parser/src/parse/value_object.rs +250 -0
  800. data/rust/parser/src/ruby_value.rs +422 -0
  801. data/rust/project/bridging.rb +257 -0
  802. data/rust/project/commands.rb +877 -0
  803. data/rust/project/constraints.rb +86 -0
  804. data/rust/project/dependency_planning.rb +178 -0
  805. data/rust/project/domain_generator.rb +980 -0
  806. data/rust/project/exemplar.rb +148 -0
  807. data/rust/project/expr_emitter.rb +72 -0
  808. data/rust/project/fielded.rb +141 -0
  809. data/rust/project/json_codec.rb +641 -0
  810. data/rust/project/mutations.rb +721 -0
  811. data/rust/project/naming.rb +205 -0
  812. data/rust/project/ports.rb +65 -0
  813. data/rust/project/queries.rb +493 -0
  814. data/rust/project/reactions.rb +317 -0
  815. data/rust/project/read_models.rb +690 -0
  816. data/rust/project/reference_specs.rb +27 -0
  817. data/rust/project/registry.rb +396 -0
  818. data/rust/project/skip_reason.rb +29 -0
  819. data/rust/project/types.rb +225 -0
  820. data/rust/project/write_if_changed.rb +83 -0
  821. data/rust/project.rb +30 -0
  822. data/rust/project_rust_pipeline.rb +383 -0
  823. data/rust/src/exemplar/commands.rs +279 -0
  824. data/rust/src/exemplar/constraints.rs +18 -0
  825. data/rust/src/exemplar/fielded.rs +280 -0
  826. data/rust/src/exemplar/json.rs +277 -0
  827. data/rust/src/exemplar/mod.rs +17 -0
  828. data/rust/src/exemplar/mutations.rs +80 -0
  829. data/rust/src/exemplar/queries.rs +33 -0
  830. data/rust/src/exemplar/reactions.rs +88 -0
  831. data/rust/src/exemplar/read_models.rs +48 -0
  832. data/rust/src/exemplar/registry.rs +166 -0
  833. data/rust/src/exemplar/types.rs +44 -0
  834. data/rust/src/kernel/attribute_shapes/composite.rs +88 -0
  835. data/rust/src/kernel/attribute_shapes/list.rs +18 -0
  836. data/rust/src/kernel/attribute_shapes/mod.rs +44 -0
  837. data/rust/src/kernel/attribute_shapes/optional.rs +9 -0
  838. data/rust/src/kernel/attribute_shapes/scalar.rs +39 -0
  839. data/rust/src/kernel/cli.rs +585 -0
  840. data/rust/src/kernel/dispatch.rs +1090 -0
  841. data/rust/src/kernel/expr.rs +458 -0
  842. data/rust/src/kernel/expression_operators/arithmetic.rs +128 -0
  843. data/rust/src/kernel/expression_operators/comparison.rs +48 -0
  844. data/rust/src/kernel/expression_operators/enumeration.rs +232 -0
  845. data/rust/src/kernel/expression_operators/logical.rs +13 -0
  846. data/rust/src/kernel/expression_operators/membership.rs +18 -0
  847. data/rust/src/kernel/expression_operators/mod.rs +68 -0
  848. data/rust/src/kernel/expression_operators/pattern_match.rs +73 -0
  849. data/rust/src/kernel/expression_operators/positional.rs +126 -0
  850. data/rust/src/kernel/expression_operators/presence.rs +101 -0
  851. data/rust/src/kernel/expression_operators/sign_test.rs +16 -0
  852. data/rust/src/kernel/expression_operators/sized.rs +35 -0
  853. data/rust/src/kernel/expression_operators/text.rs +79 -0
  854. data/rust/src/kernel/expression_operators/to_string.rs +18 -0
  855. data/rust/src/kernel/json.rs +779 -0
  856. data/rust/src/kernel/mod.rs +133 -0
  857. data/rust/src/kernel/named_query.rs +219 -0
  858. data/rust/src/kernel/orchestrate.rs +1810 -0
  859. data/rust/src/kernel/pattern.rs +307 -0
  860. data/rust/src/kernel/query_comparators.rs +206 -0
  861. data/rust/src/kernel/query_ordering.rs +103 -0
  862. data/rust/src/kernel/read_model.rs +914 -0
  863. data/rust/src/kernel/reference_lookup.rs +149 -0
  864. data/rust/src/kernel/repository.rs +468 -0
  865. data/rust/src/kernel/routing.rs +612 -0
  866. data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +118 -0
  867. data/rust/src/kernel/vocab/entity_dispatch_order.rs +114 -0
  868. data/rust/src/kernel/vocab/field_hint.rs +70 -0
  869. data/rust/src/kernel/vocab/mod.rs +20 -0
  870. data/rust/src/kernel/vocab/query_comparator.rs +65 -0
  871. data/rust/src/kernel/vocab/refusal_template.rs +1592 -0
  872. data/rust/src/lib.rs +8 -0
  873. data/rust/src/main.rs +16 -0
  874. data/rust/web/.gitignore +1 -0
  875. data/rust/web/Cargo.lock +119 -0
  876. data/rust/web/Cargo.toml +18 -0
  877. data/rust/web/src/lib.rs +8 -0
  878. metadata +478 -12
  879. data/lib/hecks/facade/cli_door.rb +0 -178
  880. data/lib/hecks/facade/cli_runner.rb +0 -271
  881. data/lib/hecks/facade/handle.rb +0 -293
  882. data/lib/hecks/facade/json_door.rb +0 -247
  883. data/lib/hecks/facade/surface/aggregate_door.rb +0 -222
  884. data/lib/hecks/facade/surface/chapter.rb +0 -116
  885. data/lib/hecks/facade/surface.rb +0 -61
  886. data/lib/hecks/mcp_door_scope.rb +0 -176
@@ -3,15 +3,8 @@ require_relative "aggregate_builder/sealing"
3
3
  module Hecks
4
4
  module Bluebook
5
5
  module DSL
6
- # The `aggregate "Name" do ... end` receiver — the largest DSL builder
7
- # in the language, collecting everything an aggregate declares
8
- # (attributes, value objects, entities, commands, queries, policies,
9
- # invariants, preconditions, projected fields, its lifecycle and
10
- # identity) and assembling the final `Aggregate` IR in `#build`.
11
- # `entity`/`command`/`query` only queue a descriptor during
12
- # `instance_eval` (`#drain_pending!` builds them, in order, once the
13
- # whole block has run) so a later-declared piece can still be
14
- # referenced by an earlier line — see `#drain_pending!`'s own header.
6
+ # The `aggregate "Name" do ... end` receiver: collects an aggregate's attributes,
7
+ # entities, commands, queries, policies and rules, and assembles the `Aggregate` IR.
15
8
  class AggregateBuilder
16
9
  GRAMMAR_CONTEXT = "Aggregate".freeze
17
10
 
@@ -43,33 +36,18 @@ module Hecks
43
36
  @queries = []
44
37
  @policies = []
45
38
  @reference_targets = []
46
- # The root of the cross-entity given pool — see `#entity`'s own
47
- # comment. One hash for the whole aggregate, threaded unchanged
48
- # into every piece nested under it, however deep.
39
+ # Shared unchanged with every entity/command this aggregate builds (see `#entity_impl`).
49
40
  @entity_named_givens = {}
50
- # **One level wider still** — the chapter's own pool, threaded in
51
- # from `BluebookBuilder#aggregate`, shared with every other
52
- # aggregate the same chapter builds. See `#given`'s own
53
- # comment for what this closes.
41
+ # Threaded in from `BluebookBuilder#aggregate`; shared chapter-wide across aggregates.
54
42
  @chapter_named_givens = chapter_named_givens
55
- # A chapter may be split across files — threaded in the same
56
- # way as `@chapter_named_givens`, one Array shared chapter-wide.
57
- # See `#pending_chapter_given`'s own comment for what queues
58
- # here and `BluebookBuilder#resolve_pending_chapter_givens!`
59
- # for where it drains.
43
+ # Threaded chapter-wide; a chapter may span multiple files (see `#pending_chapter_given`)
60
44
  @chapter_pending_givens = chapter_pending_givens
61
- # One level wider still, past the chapter's own aggregate-level
62
- # pool — the chapter's own entity-scoped pool, threaded from
63
- # `BluebookBuilder#aggregate_impl` the same way
64
- # `@chapter_named_givens` is, and passed straight through
65
- # (unchanged) to every top-level piece this aggregate builds
66
- # (`#drain_pending!`). See `EntityBuilder#given_impl`'s own
67
- # comment for what this closes.
45
+ # One level wider than `@chapter_named_givens`: the chapter's entity-scoped pool,
46
+ # passed through unchanged to every entity this aggregate builds.
68
47
  @chapter_entity_named_givens = chapter_entity_named_givens
69
48
  @chapter_entity_pending_givens = chapter_entity_pending_givens
70
- # **Deferred construction** — `entity`/`command`/`query` push a
71
- # pending descriptor here instead of building immediately; see
72
- # `#drain_pending!`'s own comment for why.
49
+ # `entity`/`command`/`query` queue a descriptor here instead of building eagerly
50
+ # (see `#drain_pending!`).
73
51
  @pending_entities = []
74
52
  @pending_commands = []
75
53
  @pending_queries = []
@@ -80,28 +58,11 @@ module Hecks
80
58
  # @param value [String] the description text
81
59
  # @return [String] the description as stored
82
60
  def description(value)
83
- # moved to the language: Description invariant, on Root.Declare
84
-
85
61
  @description = value
86
62
  end
87
63
 
88
64
  # Names where a concept adopted from a canonical source came from.
89
65
  #
90
- # Origin, not runtime identity — a concept adopted from a canonical
91
- # source (§28) names where it came from without that fact ever
92
- # touching `hecks_fqn`/dispatch. Captured raw, the same way
93
- # `attribute ..., default: { value: "small" }` captures a literal
94
- # Hash untouched — no re-parsing, no structure imposed beyond
95
- # "whatever the author wrote."
96
- #
97
- # Answers the `provenance` word (and, via the same table rows,
98
- # its siblings `projects`/`lifecycle`/`entity`/
99
- # `query`/`policy`/`command` below) through the table's `calls:`
100
- # column — item #13's full
101
- # metaprogrammed dispatch (slice 4c). All bootstrap-reachable
102
- # (used throughout the core/attached chapters), all in
103
- # `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK`.
104
- #
105
66
  # @param from [Object] the canonical source, captured exactly as written
106
67
  # @return [Object] `from` as stored
107
68
  def provenance_impl(from:)
@@ -110,24 +71,6 @@ module Hecks
110
71
 
111
72
  # Declares a reference from this aggregate's own head to another aggregate's identity.
112
73
  #
113
- # `optional:` — matching `CommandBuilder#reference_to`'s own
114
- # signature, which already had it, and forwarded here to
115
- # `attribute_impl()`/`relationship_attribute` (`optional: optional`, below). A real
116
- # need: an aggregate that can point at one
117
- # of several targets (Item's own `personal_list_id`/
118
- # `camping_list_id`, never both) needs each reference optional
119
- # on the aggregate's own persisted schema, not just as a
120
- # command's input — real corpus use:
121
- # `spec/fixtures/hop_chain.bluebook`'s own `Proposal` aggregate
122
- # declares `reference_to Engagement, optional: true` at the
123
- # aggregate head.
124
- #
125
- # Answers the `reference_to` word through the table's `calls:`
126
- # column — item #13's full metaprogrammed
127
- # dispatch (slice 4b). Bootstrap-reachable (every core/attached
128
- # grammar chapter uses reference_to to describe itself), so also
129
- # named in `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK`.
130
- #
131
74
  # @param type [Module, Symbol, String] the referenced aggregate, written as a bare
132
75
  # constant
133
76
  # @param as [Symbol, nil] the attribute's name; nil derives it from `type`
@@ -144,34 +87,10 @@ module Hecks
144
87
  # Declares that this aggregate holds its own kept-fresh copy of a field reached through
145
88
  # a reference, so a rule can read it locally instead of reaching across the boundary.
146
89
  #
147
- # A rule may only read within its own aggregate boundary (S12,
148
- # ADR 0025 — "Consistency across aggregate boundaries"). Reaching through a
149
- # `reference_to` at rule-evaluation time (`References#
150
- # dereference`, a live query against another aggregate's own
151
- # repository) would be unbounded and inconsistent with the "a rule reads
152
- # only this record" model everywhere else — `projects` is what
153
- # replaces that: `projects :customer_status, from: :"customer.
154
- # status"` declares that this aggregate holds its own copy of
155
- # `Customer`'s own `:status`, kept fresh by a rebuild sweep
156
- # (`Runtime::ProjectionRebuild`) rather than read live. A rule
157
- # then reads `customer_status` the same way it reads any other
158
- # local field — no dot, no reference walk.
159
- #
160
- # `from:` names the local reference, not the target aggregate —
161
- # `customer`, the attribute this aggregate's own `reference_to
162
- # Customer` already minted, not `Customer` the type — so two
163
- # references to the same aggregate (aliased differently) can
164
- # each carry their own projection without ambiguity. The target
165
- # field's own existence cannot be checked here: the target
166
- # aggregate does not exist yet while this one is still being
167
- # declared (the same reason a query's own hop tail is checked
168
- # by `BluebookBuilder#validate_query_hops!`, once every
169
- # aggregate in the chapter is real, not by `AggregateBuilder`
170
- # itself) — `validate_projected_fields!` is where that half
171
- # happens.
90
+ # `from:` names the local reference, not the target aggregate, so two references to the
91
+ # same aggregate can each carry their own projection.
172
92
  #
173
- # @param name [Symbol, String] the local field's name this aggregate projects the
174
- # remote value into
93
+ # @param name [Symbol, String] the local field receiving the projected remote value
175
94
  # @param from [Symbol, String] the local reference and remote field, dotted, such as
176
95
  # `:"customer.status"`
177
96
  # @return [Array<Bluebook::ProjectedField>] every projected field declared so far, this
@@ -191,41 +110,18 @@ module Hecks
191
110
  remote_field: remote_field.to_sym)
192
111
  end
193
112
 
194
- # `has_many`/`has_one`/`belongs_to` were legacy (ADR 0025,
195
- # "References") — sugar over `reference_to` that collapsed to an
196
- # anonymous reference and, for `has_many`, lied (singularised its
197
- # target and minted one scalar, so `film.backers` read `nil` and
198
- # never `[]`). Wave 6 (identity-and-relationships arc) un-deprecates
199
- # all three for real: a relationship word now retains the author's
200
- # domain concept in IR — still stored as one or more target
201
- # identities, but not collapsed to a bare `reference_to`
202
- # during assembly. `MetaValidator.shadow_parsing?` still routes to
203
- # `legacy_has_many`/`legacy_has_one` so frozen era text written
204
- # under the old (lying/collapsing) meaning still parses the way it
205
- # did when it was written — real, if rare corpus: "Combined corpus
206
- # uses: one."
207
- #
208
113
  # Declares a list-typed relationship to another aggregate, referenced by its plural name.
209
114
  #
210
- # Answers the `has_many` word (and, via the same table rows, its
211
- # siblings `has_one`/`belongs_to` below) through the table's
212
- # `calls:` column — item #13's full metaprogrammed dispatch
213
- # (slice 4). Each Keyword row's own `calls:` names the matching
214
- # `_impl`, so all three are carried in
215
- # `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK` like every other
216
- # `calls:`-routed word, but never actually exercised during real
217
- # bootstrap (no core/attached chapter uses one of these to
218
- # describe itself), unlike `attribute`/`role`.
115
+ # Under `MetaValidator.shadow_parsing?`, routes to the collapsing single-reference
116
+ # form instead, so frozen era text keeps its original meaning.
219
117
  #
220
- # @param type [Module, Symbol, String] the related aggregate's plural name, a bare
221
- # constant
118
+ # @param type [Module, Symbol, String] the related aggregate's plural name, a bare constant
222
119
  # @param as [Symbol, nil] the attribute's name; nil derives it from `type`
223
120
  # @param legacy_options [Hash] must be empty outside shadow-parsing; under
224
121
  # shadow-parsing, `:optional` is read for the legacy single-reference form
225
122
  # @return [void]
226
- # @raise [Bluebook::DSL::Malformed] outside shadow-parsing, if `legacy_options` is
227
- # non-empty; may also raise from `relationship_attribute` if the derived name is
228
- # already declared
123
+ # @raise [Bluebook::DSL::Malformed] outside shadow-parsing, if non-empty, or if the
124
+ # derived name is already declared
229
125
  def has_many_impl(type, as: nil, **legacy_options)
230
126
  return legacy_has_many(type, as: as, optional: legacy_options.fetch(:optional, false)) if MetaValidator.shadow_parsing?
231
127
 
@@ -284,28 +180,6 @@ module Hecks
284
180
 
285
181
  # Queues a piece nested in this aggregate, built later once every sibling has been seen.
286
182
  #
287
- # A piece is declared in this aggregate — its owner is stamped by
288
- # `Aggregate#initialize`, once the aggregate exists. Its own
289
- # commands were given the piece as their owner when it was declared,
290
- # so the chain closes as chapter -> aggregate -> entity -> command.
291
- # Not built here — see `#drain_pending!`'s own comment for why
292
- # this only queues a descriptor.
293
- #
294
- # A precondition shared across sibling pieces, declared once — one
295
- # level wider than round 4's own `EntityBuilder#given` (shared
296
- # across one piece's own commands): `@entity_named_givens` is the
297
- # same hash threaded into every piece this aggregate builds, so a
298
- # piece's own entity-level `given(desc) { block }` write-throughs
299
- # into it, and any other piece's own command can reference it back
300
- # bare, the identical description/canonical, evaluated in its own
301
- # `parent`-relative context. Real, live corpus this closes:
302
- # `SafeDepositBox`'s `Visit`/`KeyIssuance` — two different pieces
303
- # under one head, each independently typing `given("customer is
304
- # active") { parent.customer.status == "active" }` byte for byte,
305
- # which neither the aggregate's own "customer is active" (a
306
- # different canonical — bare `customer.status`, not
307
- # `parent.customer.status`, wrong scope for a piece's own command
308
- # to evaluate) nor round 4's single-piece `given` could reach.
309
183
  # @param name [String] the nested piece's name
310
184
  # @yield the piece body, evaluated against an `EntityBuilder` once drained
311
185
  # @return [Array<Array>] every pending piece queued so far, this one last
@@ -334,53 +208,14 @@ module Hecks
334
208
  @policies << reaction
335
209
  end
336
210
 
337
- # Declares a value object on this aggregate, either as a block of `attribute` lines or
338
- # (the `type` shorthand) as a single `:value` attribute.
339
- #
340
- # `builder.closed_sets` too, not only `builder.build` — a real
341
- # gap this exact fix closes: a
342
- # value_object's own inline `attribute :x, one_of(...)` (legal
343
- # since S3, ADR 0025 removed the wrong-arity collision that would
344
- # otherwise crash it) synthesises its own
345
- # anonymous value object via the same `AttributeCollector#closed_
346
- # sets` mechanism an aggregate's own attributes already use — and
347
- # nothing installed it anywhere. `Box.attributes` said `size:
348
- # "Size"` while no "Size" value object existed in the whole
349
- # domain: a dangling type name, not a working closed set. Flattened
350
- # into this aggregate's own `@value_objects`, the identical move
351
- # `@value_objects + closed_sets` already makes for the aggregate's
352
- # own direct attributes (see this file's other 5 call sites).
353
- # `type` — the bare shorthand (single-attribute value objects):
354
- # `value_object :Price, Integer` declares a value object with
355
- # exactly one attribute, named `value`, of that type — pure sugar
356
- # for `value_object("Price") { attribute :value, Integer }`,
357
- # routed through the same `attribute_impl` the block form's own
358
- # `attribute` line reaches (so the quoted-text-type refusal,
359
- # `one_of(...)`/`list_of(...)` synthesis, everything an attribute
360
- # line already does, applies unchanged rather than being
361
- # re-derived here). The name `value` is not arbitrary: a
362
- # single-attribute value object is a name for a scalar, not a
363
- # genuine group ([[feedback_name_the_scalar_field]], `Behaviour::
364
- # ValueObject#sole_attribute`), and `value` is what the language
365
- # guarantees every sole field answers to at runtime regardless of
366
- # its declared name (`Runtime::Value#method_missing`'s alias) —
367
- # so the shorthand simply declares it under the canonical name
368
- # directly. Type and block together are refused: the block exists
369
- # to say what the fields are, and the type just said it — two
370
- # answers to one question is an authoring error, never a merge.
371
- # Neither type nor block keeps its historical behavior untouched
372
- # (an empty attribute list — judged, or not, by the language
373
- # downstream, the same as before this parameter existed).
211
+ # Declares a value object: a block of `attribute` lines, or (the `type` shorthand) a
212
+ # single `:value` attribute.
374
213
  #
375
214
  # @param name [String] the value object's name
376
- # @param type [Module, nil] the bare shorthand's single attribute type; mutually
377
- # exclusive with `block`
378
- # @yield the value object body of `attribute`/`invariant`/`one_of` lines; mutually
379
- # exclusive with `type`
380
- # @return [Array<Bluebook::ValueObject>] this aggregate's own value objects, including
381
- # this one and any closed sets its attributes synthesised
382
- # @raise [Bluebook::DSL::Malformed] if both `type` and a block are given, or the body
383
- # fails any check the value object language or its builder raises
215
+ # @param type [Module, nil] the bare shorthand's attribute type; exclusive with `block`
216
+ # @yield the `attribute`/`invariant`/`one_of` body; exclusive with `type`
217
+ # @return [Array<Bluebook::ValueObject>] this one, plus any closed sets synthesised
218
+ # @raise [Bluebook::DSL::Malformed] if both `type` and a block are given, or the body fails
384
219
  def value_object(name, type = nil, &block)
385
220
  if type && block
386
221
  raise Malformed,
@@ -399,15 +234,8 @@ module Hecks
399
234
  # Queues a command declared on this aggregate, built later once every sibling has been
400
235
  # seen.
401
236
  #
402
- # `from:` — lifecycle state becomes a command guard (S10, ADR
403
- # 0025) — `command "Debit", from: "open"` replaces `given
404
- # ("account is open") { status == "open" }`, written 35 times
405
- # in two wordings across the corpus. Checked against this
406
- # aggregate's own lifecycle field (`Admissibility#enforce_
407
- # lifecycle_guard`) — never a target state, never a transition:
408
- # the lifecycle already declares which states exist, so naming
409
- # the legal ones is checkable against it, where a free-text
410
- # given could drift out of sync with the state machine and did.
237
+ # `from:` is checked against this aggregate's own lifecycle field, never a target
238
+ # state or transition, so a guard can't drift out of sync with the state machine.
411
239
  #
412
240
  # @param name [String] the command's name
413
241
  # @param from [String, Symbol, Array<String, Symbol>, nil] the lifecycle state(s) this
@@ -415,108 +243,37 @@ module Hecks
415
243
  # @yield the command body, evaluated against a `CommandBuilder` once drained
416
244
  # @return [Array<Array>] every pending command queued so far, this one last
417
245
  def command_impl(name, from: nil, &block)
418
- # The verb is declared on this aggregate — the owner `acts_on` answers
419
- # with — stamped by `Aggregate#initialize` once the aggregate
420
- # exists. An entity's commands take the entity as their owner instead,
421
- # at the entity's own declaration. Not built here — see
422
- # `#drain_pending!`'s own comment for why this only queues a
423
- # descriptor.
246
+ # Owner is stamped once `Aggregate#initialize` runs; an entity's own commands are
247
+ # owned by the entity instead.
424
248
  @pending_commands << [name, from, block]
425
249
  end
426
250
 
427
- # Declares a rule this aggregate's own commands must satisfy, or references one a
428
- # sibling aggregate in the chapter already declared.
429
- #
430
- # A precondition shared across commands, declared once (S10, ADR
431
- # 0025) — an aggregate-level `given`, block required, stored by
432
- # its own description rather than appended anywhere: a command
433
- # names it back (`given("customer is active")`, no block of its
434
- # own) rather than re-typing the predicate, so there is one
435
- # description and therefore one refusal message no matter which
436
- # command a caller hits. Declare before the commands that
437
- # reference it — resolution happens at the referencing command's
438
- # own build time (`CommandBuilder#given`), against whatever this
439
- # aggregate has declared so far, the one ordering constraint this
440
- # word carries that `identified_by`/`attribute` do not.
441
- # Bare — no block — references a sibling aggregate's own
442
- # already-declared precondition, one level wider than the
443
- # existing bare-command-references-its-own-aggregate shape
444
- # (`CommandBuilder#reference_named_given`): `SafeDepositBox`/
445
- # `OnboardingCase` both name back `Account`'s own "customer is
446
- # active" rather than retyping `customer.status == "active"` a
447
- # third and fourth time. Resolved against `@chapter_named_givens`
448
- # — see `BluebookBuilder#aggregate`'s own comment for how that
449
- # pool is threaded, and `docs/implemented/resolution-rules/chapter-given.md`
450
- # for the full algorithm and its known limitations (a bare
451
- # reference trusts its own author to have verified the same
452
- # canonical predicate applies — this mechanism does not, and
453
- # cannot, check that itself; see that doc for which real corpus
454
- # cases do and do not qualify).
251
+ # Declares a rule this aggregate's own commands must satisfy, or references a sibling's.
252
+ # `declared_by:` disambiguates a bare reference when two aggregates share a description.
455
253
  #
456
- # `declared_by:` disambiguates the same description meaning two
457
- # genuinely different predicates chapter-wide — real, live:
458
- # `Account`'s own "customer is active" reads bare
459
- # `customer.status` (a direct `reference_to Customer`); `ATMCard`'s
460
- # own (shared onward with `CardPayment`/`ExternalTransfer`/
461
- # `ScheduledPayment`/`Statement`) reads `account.customer.status`
462
- # (reached through `Account`) — the identical business fact, a
463
- # genuinely different runtime path, correctly kept as the same
464
- # domain wording rather than invented a second spelling for "the
465
- # same idea, one more hop away" (S10, ADR 0025's own "one idea,
466
- # one spelling"). Omit it when the description is unambiguous
467
- # chapter-wide (the common case, and the only case this took
468
- # before this parameter existed) — required only once a second,
469
- # textually-different canonical registers under the same
470
- # description; see `reference_named_chapter_given`'s own
471
- # ambiguity error for how that surfaces.
472
- # Answers the `given` word through the table's `calls:` column —
473
- # item #13's full metaprogrammed dispatch
474
- # (slice 4b), same reasoning as `reference_to_impl` above:
475
- # bootstrap-reachable, in `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK`.
476
- #
477
- # @param description [String] the rule's description; also the name a sibling aggregate
478
- # references it by when no block is given
479
- # @param declared_by [Module, Symbol, String, nil] disambiguates which aggregate's own
480
- # rule to reference, a bare constant, when more than one shares `description`; only
481
- # meaningful with no block
254
+ # @param description [String] the rule's description; also its name for a sibling reference
255
+ # @param declared_by [Module, Symbol, String, nil] which aggregate's rule; only meaningful
256
+ # with no block
482
257
  # @yield the predicate body; evaluated for its extracted source, never called directly
483
258
  # @return [void]
484
- # @raise [Bluebook::DSL::Malformed] if given a block whose source cannot be extracted;
485
- # given no block, the description is immediately ambiguous between more than one
486
- # already-loaded aggregate with no `declared_by` to disambiguate; an unresolved
487
- # reference defers instead, and may still raise once the whole chapter has loaded, if
488
- # it then resolves to none or more than one candidate
259
+ # @raise [Bluebook::DSL::Malformed] if the source can't be extracted, or a bare reference
260
+ # resolves to none or more than one candidate once the chapter has loaded
489
261
  def given_impl(description, declared_by: nil, &predicate)
490
262
  return reference_named_chapter_given(description, declared_by: declared_by) unless predicate
491
263
 
492
264
  named = build_rule(Given, description, predicate, owner_name: @name, word: "given",
493
265
  extraction_failure: "its source could not be read, so no other runtime could ever evaluate it")
494
266
  @named_givens[description] = named
495
- # Write-through, first-declared-wins per owner — keyed by
496
- # [description, this aggregate's own name], not description
497
- # alone: two different aggregates independently declaring the
498
- # same description are two distinct candidates a later bare
499
- # reference chooses between (via `declared_by:` once there is
500
- # more than one), never silently merged into one slot the way
501
- # a bare description-only key would.
267
+ # Keyed by [description, this aggregate's name] so two aggregates sharing a
268
+ # description are distinct candidates, never merged into one slot.
502
269
  @chapter_named_givens[description] ||= {}
503
270
  @chapter_named_givens[description][@name] ||= named
504
271
  end
505
272
 
506
273
  private
507
274
 
508
- # Primitive 2 (RuleReference#resolve_owner_keyed) — see that
509
- # method's own comment for the pool shape; the three branches
510
- # below (exact owner / unambiguous single candidate / ambiguous)
511
- # are this construct's own refusal wording, not shared, since
512
- # `declared_by:` only exists here so far. Unresolved (no
513
- # candidate yet, or `declared_by:` naming an aggregate that
514
- # hasn't declared it yet) is not a fourth branch that
515
- # raises here — see `#pending_chapter_given`, below, for why:
516
- # a chapter split across files can genuinely reference a
517
- # precondition a later file declares, and "not found among
518
- # what's loaded so far" cannot tell that apart from "genuinely
519
- # never declared" until every file has.
275
+ # Unresolved (no candidate yet) doesn't raise here — a chapter split across files
276
+ # may still declare this precondition in a later file (see `#pending_chapter_given`).
520
277
  def reference_named_chapter_given(description, declared_by:)
521
278
  verify_resolves_via!("given", "Aggregate", "owner_keyed")
522
279
  candidates = resolve_owner_keyed(@chapter_named_givens, description)
@@ -540,34 +297,9 @@ module Hecks
540
297
  @named_givens[description] = named
541
298
  end
542
299
 
543
- # A chapter may be split across files — the same reason a query
544
- # hop's own cross-file target, a correlation key's own emitting
545
- # command, and an event's own declared shape are all resolved
546
- # once the whole chapter is assembled rather than refused the
547
- # moment one file's own bare reference outruns what's loaded so
548
- # far (`BluebookBuilder.validate_assembled!`'s own comment).
549
- #
550
- # Unlike those, though, a chapter-given's resolved value is not
551
- # a pass/fail check on an already-built IR — it is part of the
552
- # referencing aggregate's own IR (`preconditions:` below), built
553
- # and handed off the moment this aggregate's own file finishes
554
- # loading, long before a later file might declare the real
555
- # thing. So this hands back a placeholder `Given` — embedded
556
- # exactly where the resolved one would be, by Ruby object
557
- # reference, in this aggregate's own `preconditions` and in any
558
- # command in this same aggregate that separately bare-references
559
- # the same description (`CommandBuilder#given`'s own hash-chain
560
- # read of this aggregate's `@named_givens`, the identical key) —
561
- # and queues the request in `@chapter_pending_givens`.
562
- # `BluebookBuilder#resolve_pending_chapter_givens!` mutates this
563
- # exact object in place, once every file has loaded, so every
564
- # existing reference to it (there is only ever the one object,
565
- # never a copy) sees the resolved fields simultaneously. Safe
566
- # because every real reader of a `Given` — refusal wording at
567
- # dispatch, `Aggregate`'s own lazy `-> { preconditions.map { ... } }`
568
- # IR accessor, docs — runs strictly after boot completes, never
569
- # mid-load; `judge_deferred!` resolves every pending chapter-given
570
- # before anything else touches this chapter's assembled IR.
300
+ # Returns a placeholder `Given`, embedded by reference in this aggregate's IR;
301
+ # `BluebookBuilder#resolve_pending_chapter_givens!` mutates it in place once the
302
+ # whole chapter loads, so every existing reference sees the resolved fields together.
571
303
  def pending_chapter_given(description, declared_by:)
572
304
  placeholder = Given.new(description: description, canonical: nil, predicate: nil)
573
305
  @chapter_pending_givens << { aggregate: @name, description: description,
@@ -580,19 +312,6 @@ module Hecks
580
312
  # Declares a rule the whole aggregate must satisfy, checked after every command, before
581
313
  # save.
582
314
  #
583
- # The aggregate boundary is what an invariant defines (S10, ADR
584
- # 0025 — "Rules") — the same check a value object's already gets
585
- # (`ValueObjectBuilder#invariant`, whose own shape this mirrors
586
- # exactly). Without an aggregate-level rule, "the balance
587
- # never goes negative" was three different `given`/`ensures`
588
- # texts across banking's six balance-moving commands, and the
589
- # four that only increase it said nothing at all — completeness
590
- # depended on someone noticing which commands could decrease it.
591
- #
592
- # Answers the `invariant` word through the table's `calls:`
593
- # column — item #13's full metaprogrammed
594
- # dispatch (slice 4b), same reasoning as `given_impl` above.
595
- #
596
315
  # @param description [String] the rule's description
597
316
  # @yield the predicate body; evaluated for its extracted source, never called directly
598
317
  # @return [void]
@@ -638,24 +357,15 @@ module Hecks
638
357
  provenance: @provenance
639
358
  )
640
359
 
641
- # After the IR exists, on purpose : a reference is declared in the
642
- # aggregate, and the aggregate the IR graph knows is `ir`, not the
643
- # builder.
360
+ # On purpose, after the IR exists: the object the IR graph should know is `ir`,
361
+ # not this builder.
644
362
  stamp_references(ir)
645
363
  ir
646
364
  end
647
365
 
648
366
  # Evaluates an `aggregate` block against a fresh builder and returns the built aggregate.
367
+ # The `chapter_*` params thread the chapter-wide and entity-scoped given pools through.
649
368
  #
650
- # @param name [String] the aggregate's name
651
- # @param chapter_named_givens [Hash{String => Hash{String => Bluebook::Given}}] the
652
- # chapter-wide given pool
653
- # @param chapter_pending_givens [Array<Hash>] unresolved chapter-wide bare given
654
- # references
655
- # @param chapter_entity_named_givens [Hash{String => Hash{String => Bluebook::Given}}]
656
- # the chapter-wide, entity-scoped given pool
657
- # @param chapter_entity_pending_givens [Array<Hash>] unresolved chapter-wide,
658
- # entity-scoped bare given references
659
369
  # @yield the aggregate body, evaluated with the builder as `self`; may be omitted
660
370
  # @return [Bluebook::Aggregate] the built aggregate
661
371
  # @raise [Bluebook::DSL::Malformed] if the body fails any check `#build` raises
@@ -670,43 +380,9 @@ module Hecks
670
380
 
671
381
  private
672
382
 
673
- # Deferred construction — `entity`/`command`/`query` queue a descriptor rather than
674
- # building immediately, inline, the moment their own DSL line runs during
675
- # `instance_eval`. Building immediately would mean a command's own resolution (`sets
676
- # :field` importing the owner's own attribute, `given("desc")`
677
- # referencing an aggregate-level precondition, a query's own
678
- # positional-param resolution) only ever saw whatever `@entities`/
679
- # `attributes`/`@named_givens`/`@value_objects` held as of that
680
- # exact textual line — never what the aggregate's block would go
681
- # on to declare after it. Three real, confirmed cases in the
682
- # self-hosted meta-domain violate the "declare before you
683
- # reference" convention every other resolution rule relies on
684
- # (`command "Handler"` before `entity "Handler"`, same for
685
- # Member/Dispatch — see docs/resolution-rules/
686
- # implicit-append-fields.md's own "Known limitations").
687
- #
688
- # This is the same move `BluebookBuilder` already makes one level
689
- # up, at the chapter level — build every aggregate first, then run
690
- # cross-referential validation (`validate_query_hops!`,
691
- # `validate_projected_fields!`, `validate_no_bidirectional_
692
- # references!`) once `@aggregates` is fully populated — extended
693
- # one level down: `entity`/`command`/`query` now only queue a
694
- # descriptor (`@pending_entities`/`@pending_commands`/
695
- # `@pending_queries`, each preserving its own declared order),
696
- # and `#build` drains them here, in this exact order, before any
697
- # of the existing `seal_*` validations (which already assume
698
- # `@commands`/`@entities`/`@queries` are the real, final, built
699
- # objects) — entities first and fully, since a command's own
700
- # `sets :list, append: {...}` needs a list's element entity
701
- # already built (`.attributes` populated) to resolve against, not
702
- # just named.
703
- #
704
- # `attribute`/`value_object`/`identified_by`/`given` (block form)
705
- # are not deferred — they still build eagerly during
706
- # `instance_eval`, unchanged. Nothing reads `@entities`/
707
- # `@commands`/`@queries` from anywhere other than `#build` and its
708
- # own private helpers (checked directly), so nothing else in this
709
- # file needed to change for this to be safe.
383
+ # Deferred: entity/command/query queue a descriptor instead of building eagerly, so a
384
+ # later-declared piece can still be referenced from an earlier line. Entities drain
385
+ # first and fully — a command's own `sets` may need an entity's attributes already built.
710
386
  def drain_pending!
711
387
  @entities = @pending_entities.map do |name, block|
712
388
  EntityBuilder.build(name, owner_value_objects: @value_objects + closed_sets,
@@ -730,10 +406,8 @@ module Hecks
730
406
  end
731
407
  end
732
408
 
733
- # `identified_by`'s own resolution pool (AttributeCollector#resolve_
734
- # pending_identity!'s hook, S9) — an aggregate resolves a bare
735
- # field's own value-object type against everything it declares
736
- # itself, own inline closed sets included.
409
+ # `identified_by`'s resolution pool: an aggregate resolves a bare field's value-object
410
+ # type against its own attributes and inline closed sets.
737
411
  def identity_pool = @value_objects + closed_sets
738
412
 
739
413
  def identity_value_object_name = "#{Naming.demodulise(@name)}Identity"
@@ -742,8 +416,7 @@ module Hecks
742
416
  @value_objects << value_object
743
417
  end
744
418
 
745
- # Legacy — see `has_many`/`has_one`/`belongs_to`'s own comment;
746
- # byte-identical to what those three did before this slice.
419
+ # Shadow-parsing's collapsing behavior for has_many/has_one/belongs_to.
747
420
  def legacy_has_many(type, as:, optional: false)
748
421
  plural = Naming.demodulise(type)
749
422
  reference_to_impl(Naming.singularize(plural), as: as || Naming.snake(plural).to_sym, optional: optional)