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
@@ -1,24 +1,10 @@
1
1
  Hecks.bluebook "Bluebook" do
2
2
  aggregate "Vocabulary" do
3
- # These are DECLARATIONS, not runtime state — a language's admitted sets are
4
- # fixed when the language is defined, which is what one_of means. They carry
5
- # no commands on purpose : nothing dispatches a vocabulary. They are READ
6
- # from the IR and projected — bin/project_vocabulary writes the Ruby tables
7
- # (lib/hecks/vocabulary.rb) the runtime's constants read, and
8
- # bin/project_rust_vocabulary writes rust/src/kernel/vocab/ — so the
9
- # runtimes carry no hand-typed copies to drift.
10
- #
11
- # Every one of these is a set the runtime must agree with, and every one has
12
- # already drifted or leaked at least once :
13
- # Comparison went disjoint from the grammar chapter's operator table
14
- # NormalisationStrategy is the third, unchecked copy of the canonical-form table
15
- # Primitive is what "primitives live in value objects only" is ABOUT
16
- # DomainRefusal is the boundary three raw Ruby TypeErrors crossed tonight
3
+ # Closed sets the language admits, projected into matching Ruby and Rust
4
+ # tables (hecks project_vocabulary, hecks project_rust_vocabulary) so both runtimes agree.
17
5
  description "The closed sets the language admits — the whole of what any runtime may accept, declared once."
18
6
 
19
- # ITS NAME, and nothing else. A vocabulary hangs under no other thing — the
20
- # closed sets are the language's own, declared once — so one path is the whole
21
- # identity.
7
+ # Named only by itself; a vocabulary hangs under nothing else.
22
8
  identified_by VocabularyName, as: :name
23
9
 
24
10
 
@@ -27,11 +13,9 @@ Hecks.bluebook "Bluebook" do
27
13
  invariant("a vocabulary is named") { !value.to_s.empty? }
28
14
  end
29
15
 
30
- # Expression::Evaluator::COMPARISONS — six operators, all reduced by the
31
- # evaluator to two primitives (less_than, equal) combined with a small boolean
32
- # algebra: compares_less_than and compares_equal choose which primitive(s) OR
33
- # together, negated inverts the result. `compare` reads this table instead of
34
- # hardcoding a six-way case statement — see Evaluator::COMPARISONS.
16
+ # The six comparison operators. `compare` reduces each to two primitives
17
+ # (less_than, equal) combined by compares_less_than/compares_equal/negated,
18
+ # rather than a six-way case statement (Expression::Evaluator::COMPARISONS).
35
19
  value_object "Comparison" do
36
20
  attribute :symbol, String
37
21
  attribute :compares_less_than, String
@@ -46,12 +30,9 @@ Hecks.bluebook "Bluebook" do
46
30
  member symbol: "!=", compares_less_than: "false", compares_equal: "true", negated: "true"
47
31
  end
48
32
 
49
- # Expression::Resolver::SIGN_TESTS
50
- # Each sign test is comparing against the literal 0, using an operator
51
- # Comparison already declares — compares_via names which one, so a sign
52
- # test is sugar for an existing operator rather than a second algebra
53
- # beside it. `positive?` = value > 0, `negative?` = value < 0, `zero?` =
54
- # value == 0.
33
+ # Each sign test compares against 0 using an operator Comparison already
34
+ # declares (compares_via) — sugar for an existing operator, not a second
35
+ # algebra. positive? = value > 0, negative? = value < 0, zero? = value == 0.
55
36
  value_object "SignTest" do
56
37
  attribute :name, String
57
38
  attribute :compares_via, String
@@ -61,11 +42,9 @@ Hecks.bluebook "Bluebook" do
61
42
  member name: "zero?", compares_via: "=="
62
43
  end
63
44
 
64
- # `.include?`'s haystack type decides its behaviour : Array does
65
- # membership (the same equal? primitive Comparison's == uses), String
66
- # does an exact substring match and refuses a non-String needle. Anything
67
- # else is always false — not declared here, since it is the fallback
68
- # every OTHER haystack type shares, not a case of its own.
45
+ # `.include?`'s haystack type decides its behavior: Array does membership,
46
+ # String does substring match. Every other type is always false and is not
47
+ # declared here — that fallback isn't a case of its own.
69
48
  value_object "IncludeHaystack" do
70
49
  attribute :type, String
71
50
  attribute :strategy, String
@@ -74,18 +53,15 @@ Hecks.bluebook "Bluebook" do
74
53
  member type: "String", strategy: "substring"
75
54
  end
76
55
 
77
- # `.to_s` admits exactly these scalar types, and every one of them uses
78
- # the SAME rule (Ruby's own to_s — nil renders "", a bool its name, a
79
- # number its digits, a string itself) — a closed set to admit into, not a
80
- # table of different rules per type.
56
+ # Scalar types `.to_s` admits; every one uses Ruby's own to_s (nil → "",
57
+ # a bool its name, a number its digits) — one rule, not a table per type.
81
58
  value_object "ToStringType" do
82
59
  attribute :type, String, one_of: ["String", "Integer", "Float", "TrueClass", "FalseClass", "NilClass"]
83
60
  end
84
61
 
85
- # `.size` and `.empty?` admit exactly the same closed set — a list, a
86
- # string, or an open map — and each just calls the one Ruby method
87
- # already named for it. One declaration for both, since the set itself is
88
- # the only thing either needed to say.
62
+ # The closed set `.size` and `.empty?` both admit — a list, a string, or
63
+ # an open map — sharing one declaration since both just call Ruby's own
64
+ # method of the same name.
89
65
  value_object "SizedType" do
90
66
  attribute :type, String, one_of: ["Array", "String", "Hash"]
91
67
  end
@@ -100,12 +76,9 @@ Hecks.bluebook "Bluebook" do
100
76
  attribute :name, String, one_of: ["collapse_whitespace", "replace"]
101
77
  end
102
78
 
103
- # the ops Runtime::CommandInterpreter applies. `sign` is the arithmetic
104
- # delta increment/decrement share one primitive by — CommandRules#arithmetic
105
- # applies `current + sign *
106
- # amount`, differing only in which sign. set and append do no arithmetic,
107
- # so they carry no sign — ABSENT IS NOT EMPTY, same reading as elsewhere in
108
- # this file.
79
+ # Ops Runtime::CommandInterpreter applies. `sign` is the arithmetic delta
80
+ # increment/decrement share (current + sign * amount); set and append do
81
+ # no arithmetic, so they carry no sign.
109
82
  value_object "MutationOp" do
110
83
  attribute :name, String
111
84
  attribute :sign, String
@@ -114,46 +87,27 @@ Hecks.bluebook "Bluebook" do
114
87
  member name: "append", sign: ""
115
88
  member name: "increment", sign: "1"
116
89
  member name: "decrement", sign: "-1"
117
- # Vendored addition, not (yet) upstream hecks (migration plan
118
- # task 4, i106 in-DSL math — CommandRules::Arithmetic#multiply/
119
- # #clamp): multiply scales (`current * amount`), clamp bounds
120
- # (`current.clamp(min, max)`) — neither is an add/subtract, so
121
- # neither carries a sign, same reading as set/append above.
90
+ # multiply scales (current * amount), clamp bounds
91
+ # (current.clamp(min, max)) — neither is add/subtract, so neither
92
+ # carries a sign.
122
93
  member name: "multiply", sign: ""
123
94
  member name: "clamp", sign: ""
124
- # Vendored addition, not (yet) upstream hecks (migration plan
125
- # task 4): remove — the list-removal counterpart to append,
126
- # matching an element by value. No sign, same reading as append.
95
+ # remove is append's list-removal counterpart, matching an element
96
+ # by value; no sign, same reading as append.
127
97
  member name: "remove", sign: ""
128
- # Vendored addition, not (yet) upstream hecks — CommandBuilder
129
- # #delegates_to's own comment gives the full reasoning: an
130
- # aggregate-level command's synchronous, single-dispatch handoff
131
- # into one nested entity command, rather than a policy/saga's own
132
- # commit-then-react reentry. Rides the SAME multi-binding wire
133
- # shape append does (`with: {...}` is a field map, same as
134
- # append's own `fields:`), so it carries no sign, same reading.
98
+ # delegate is an aggregate command's synchronous handoff into a nested
99
+ # entity command (see CommandBuilder#delegates_to). Shares append's
100
+ # multi-binding wire shape (`with:` ~ `fields:`), so it carries no sign.
135
101
  member name: "delegate", sign: ""
136
- # CommandBuilder#corrects_impl's own comment gives the full
137
- # reasoning — a command declaring a past event it amends, rather
138
- # than a fresh mutation of its own. Rides the SAME multi-binding
139
- # wire shape append/delegate do (`as:`/`reason:`/`reverses:`,
140
- # assembled into one `source` hash by hand, same as `with:` is),
141
- # so it carries no sign either.
102
+ # corrects declares a past event it amends rather than a fresh
103
+ # mutation (see CommandBuilder#corrects_impl). Shares append/delegate's
104
+ # multi-binding wire shape (as:/reason:/reverses:), so no sign either.
142
105
  member name: "corrects", sign: ""
143
106
  end
144
107
 
145
- # QuerySpecification::Common::Comparators::COMPARATORS — a where-clause's
146
- # admitted operators. Unlike Comparison, these do not reduce to one shared
147
- # boolean algebra (eq/ne compare values, gt/gte/lt/lte order them, in/contains
148
- # test membership in opposite directions), so this stays a flat closed set —
149
- # the same shape MutationOp had before it grew a sign.
150
- # `none_in_state` (the last member) is a vendored addition, not (yet)
151
- # upstream hecks (migration plan task 4) — see
152
- # query_specification/common/comparators.rb's own comment on
153
- # none_in_state. Both closed sets (the Ruby COMPARATORS constant and
154
- # this self-hosted grammar entry) must agree, the same two-places-
155
- # must-agree discipline MutationOp/multiply/clamp already required
156
- # earlier this pass.
108
+ # A where-clause's admitted operators (QuerySpecification::Common::
109
+ # Comparators::COMPARATORS) — flat, not one shared algebra like Comparison,
110
+ # since eq/ne/gt/lt/in/contains differ in kind. Must stay in sync with that constant.
157
111
  value_object "QueryComparator" do
158
112
  attribute :name, String, one_of: ["eq", "ne", "gt", "gte", "lt", "lte", "in", "contains", "none_in_state"]
159
113
  end
@@ -164,24 +118,13 @@ Hecks.bluebook "Bluebook" do
164
118
  one_of: ["*.port", "*.adapter", "*.bluebook", "translations/*.bluebook", "*.hecksagon", "*.world"]
165
119
  end
166
120
 
167
- # CommandInterpreter#call — an aggregate command's
168
- # own interpretation, ending at the events it emits. Reaction (policies,
169
- # sagas) is a structurally separate phase and is not part
170
- # of this : CommandInterpreter#call returns before it runs, in a
171
- # different class — reaction is
172
- # what a command's OWN emitted events cause, not what interpreting
173
- # the command does. Two conditional steps — assign_creation_attributes only
174
- # fires for a creating command, advance_lifecycle only when a transition
175
- # applies — so this is the order a command that does both follows,
176
- # confirmed by tracing a real dispatch, not read off the source.
121
+ # The order CommandInterpreter#call follows, ending at the events it
122
+ # emits — reaction (policies, sagas) is a separate phase that runs after,
123
+ # in a different class. assign_creation_attributes only fires for a
124
+ # creating command; advance_lifecycle only when a transition applies.
177
125
  #
178
- # decode_arguments leads both dispatch orders: turning the caller's raw
179
- # facts into a command's declared arguments, before any argument gate
180
- # judges them. A no-op in Ruby today (routing already hands the
181
- # interpreter a decoded hash) and in the Rust kernel's dispatch loop
182
- # (generated `from_json` still decodes and gates in one pass) — declared
183
- # now so the Rust kernel's step enum has a place for a generated decoder
184
- # to move into, rather than the order being implied by generated code.
126
+ # decode_arguments is a no-op today in both runtimes but is declared here
127
+ # so a future generated decoder has a step to occupy.
185
128
  value_object "AggregateDispatchOrder" do
186
129
  attribute :step, String,
187
130
  one_of: ["decode_arguments", "refuse_unknown_arguments", "refuse_absent_arguments", "normalize_args",
@@ -191,21 +134,12 @@ Hecks.bluebook "Bluebook" do
191
134
  "save", "emit"]
192
135
  end
193
136
 
194
- # EntityInterpreter#call — the same shape
195
- # one level down, on a piece an aggregate holds rather than the aggregate
196
- # itself. `refuse_unknown_arguments`/`refuse_absent_arguments` lead it,
197
- # the same position they hold in AggregateDispatchOrder — bug audit H1
198
- # (docs/audits/2026-08-10-main-bug-audit.md): an entity command used to
199
- # run NEITHER at all, on a since-corrected comment claiming it "inherits
200
- # its aggregate's own gate" — nothing on this path ever ran one, and a
201
- # bogus argument or a silently-nil'd absent one both went straight
202
- # through. The only real difference from AggregateDispatchOrder now is
203
- # that an entity is never CREATED through this path (no
204
- # assign_creation_attributes) — hydrating the parent and locating the
205
- # element replace a single hydrate. resolve_references stayed, though —
206
- # an entity command can declare a reference-typed attribute the same way
207
- # an aggregate command can (CommandRules#resolve_references is shared by
208
- # both interpreters), even though nothing in the real corpus does yet.
137
+ # EntityInterpreter#call — the same shape as AggregateDispatchOrder, one
138
+ # level down on an entity. Differs in that an entity is never created
139
+ # through this path (hydrate_parent + locate_element replace hydrate;
140
+ # no assign_creation_attributes). resolve_references stays: an entity
141
+ # command can declare a reference-typed attribute too, shared via
142
+ # CommandRules#resolve_references.
209
143
  value_object "EntityDispatchOrder" do
210
144
  attribute :step, String,
211
145
  one_of: ["decode_arguments", "refuse_unknown_arguments", "refuse_absent_arguments", "normalize_args",
@@ -224,23 +158,15 @@ Hecks.bluebook "Bluebook" do
224
158
  "RemoteRefusal", "TypeMismatch", "Unauthorized", "UnknownArgument", "UnknownVerb"]
225
159
  end
226
160
 
227
- # THE WORDING ITSELF, for every DomainRefusal site that is not already
228
- # data — `given`/`ensures`/a declared `invariant` already carry their own
229
- # description, read at dispatch time off the command or value object that
230
- # declared them. Everything here is different in kind: a LANGUAGE-LEVEL
231
- # refusal, the same wording for every domain, not authored per-bluebook —
232
- # closer to Comparison/SignTest beside it than to a given. So it follows
233
- # THEIR pattern, not given's: declared here, and projected into the
234
- # generated tables a dispatch actually reads (Runtime::RefusalWording in
235
- # Ruby, kernel::vocab::RefusalSite in Rust) rather than read live off
236
- # this very chapter at every call.
161
+ # The wording for every DomainRefusal site not already carried by data
162
+ # (given/ensures/invariant already describe themselves). Language-level
163
+ # and the same for every domain, so it is declared here and projected
164
+ # into Runtime::RefusalWording (Ruby) / kernel::vocab::RefusalSite (Rust)
165
+ # rather than read live off this chapter at every call.
237
166
  #
238
- # `{name}` markers are placeholders — plain text substitution, not
239
- # expression syntax ; a template is read, never evaluated. Two call
240
- # sites that happen to raise the same sentence share one `site` row
241
- # (entity_interpreter.rb and command_interpreter.rb's own "not found"
242
- # messages, for instance) rather than being declared as two facts that
243
- # would have to be kept identical by hand.
167
+ # `{name}` markers are plain text substitution, not expression syntax —
168
+ # a template is read, never evaluated. Two call sites that raise the
169
+ # same sentence share one `site` row instead of duplicating it.
244
170
  value_object "RefusalTemplate" do
245
171
  attribute :refusal, String, admits: "Vocabulary::DomainRefusal"
246
172
  attribute :site, String
@@ -294,18 +220,8 @@ Hecks.bluebook "Bluebook" do
294
220
  template: "{command} refused — {field} is {current}, and {command} moves it only from {allowed}"
295
221
  member refusal: "TypeMismatch", site: "value_object_shape",
296
222
  template: "{name} is a {type} — pass its fields as an object, not {offered}"
297
- # RENAMED FROM `reference_as_object` (BUG#27, QualityControl ledger) —
298
- # a reference command argument that is an object was never the only
299
- # wrong shape, only the first one anyone noticed: a bare Boolean,
300
- # Array, or `null` used to sail past this refusal entirely, get
301
- # `.to_s`'d into a lookup key by `CommandRules::References#
302
- # reference_key` ("true", "false", "[8, 8]"), and answer NotFound (or,
303
- # for `null`, skip the lookup outright and answer whatever the
304
- # command's own `given` said instead) — a shape error misreading as a
305
- # missing record. `{offered}` now names what actually arrived; the
306
- # Hash/Value case still renders "an object" (Value::Coercion's own
307
- # `reference_shape_description`), so the wording already pinned byte
308
- # for byte in spec/runtime/reference_shape_spec.rb is unchanged.
223
+ # A bare Boolean, Array, or null reference argument is a shape error,
224
+ # not a missing record — {offered} names what arrived.
309
225
  member refusal: "TypeMismatch", site: "reference_wrong_shape",
310
226
  template: "{command} refused — a reference is an id, and {attribute} arrived as {offered}{known_by}"
311
227
  member refusal: "TypeMismatch", site: "multi_field_scalar",
@@ -367,33 +283,17 @@ Hecks.bluebook "Bluebook" do
367
283
  "or read {reference}.{remote_field} directly if this rule cannot wait"
368
284
  end
369
285
 
370
- # THE ARGUMENTS EACH RefusalTemplate TAKES, AND HOW EACH ONE IS WRITTEN.
371
- # A template says WHERE a value goes; this says WHICH values a site
372
- # takes (in the order its placeholders first appear) and how each is
373
- # rendered before it goes there — so a caller hands over the raw value
374
- # (a list of names, a name) rather than a string it formatted itself.
375
- # BUG#134 was exactly the hand-formatted kind: Ruby's `declared_reading`
376
- # fell back to "none" for an empty list, the Rust generators joined
377
- # the list themselves and never did.
378
- #
379
- # Read by Runtime::RefusalWording.render_site (a missing or extra
380
- # argument refuses to render at all) and projected into
381
- # rust/src/kernel/vocab/refusal_template.rs as one typed args struct
382
- # per site (`render_args` — a missing argument does not compile).
286
+ # Which values a RefusalTemplate site takes (in placeholder order) and how
287
+ # each renders, so a caller hands over a raw value rather than a
288
+ # pre-formatted string. Read by Runtime::RefusalWording.render_site and
289
+ # projected into rust/src/kernel/vocab/refusal_template.rs as one typed
290
+ # args struct per site.
383
291
  #
384
- # shape — "scalar" (one value) or "list" (a collection of them)
385
- # quoting — "none" (the value's own text) or "inspect" (Ruby's
386
- # `#inspect`; Rust's `{:?}`), per value or per item
387
- # separator — what a list's items are joined with
388
- # sorted — "true" sorts a list's items first (before quoting)
292
+ # shape — "scalar" or "list"
293
+ # quoting — "none" (raw text) or "inspect" (Ruby #inspect / Rust {:?})
294
+ # separator — what joins a list's items
295
+ # sorted — "true" sorts a list's items before quoting
389
296
  # when_empty — what an empty list renders as
390
- #
391
- # Recorded from what the Ruby call sites did when this table was
392
- # introduced; no wording changed. A value whose rendering depends on
393
- # its runtime type (`Rendering.describe`, `offered.inspect` of an
394
- # arbitrary value) stays a caller-rendered "none" scalar, as do the
395
- # identity readings (`identity`, `heads`, `wants`) the Rust side already
396
- # joins once at codegen time or inside `extract_wants`.
397
297
  value_object "RefusalSiteArgument" do
398
298
  attribute :refusal, String, admits: "Vocabulary::DomainRefusal"
399
299
  attribute :site, String
@@ -674,36 +574,23 @@ Hecks.bluebook "Bluebook" do
674
574
  shape: "scalar", quoting: "none", separator: "", sorted: "false", when_empty: ""
675
575
  end
676
576
 
677
- # SagaInterpreter::REFUSED.
678
- #
679
- # A leg answers an EVENT — `on "AccountDebited"` — or it answers one of these,
680
- # which are not events at all: no aggregate announces that a leg the procedure
681
- # dispatched was declined. `on :refused` is the compensating leg, and without
682
- # this declaration the word lived only as a magic string in the interpreter,
683
- # and a reader of the language could not discover the
684
- # trigger existed.
577
+ # A leg answers an event (`on "AccountDebited"`) or one of these non-event
578
+ # outcomes — `on :refused` is the compensating leg for a dispatch the
579
+ # procedure declined (SagaInterpreter::REFUSED).
685
580
  value_object "Trigger" do
686
581
  attribute :name, String, one_of: ["refused"]
687
582
  end
688
583
 
689
- # Hecks::Forms::FieldShape's own EMAIL_HINT/URL_HINT/
690
- # TEL_HINT/TEXTAREA_HINT (lib/hecks/forms/field_shape.rb)
691
- # — the regexes `text_field` matches a text attribute's own NAME
692
- # against (case-insensitively) to guess an HTML input type or a
693
- # textarea kind, when nothing more specific (a `pattern:`, an
694
- # `admits:`, a closed set) already answered the question. Declared
695
- # here for the same reason RefusalTemplate is: a LANGUAGE-LEVEL
696
- # rendering convention, the same guess for every domain, not
697
- # authored per-bluebook — closer to Comparison/SignTest than to a
698
- # given. `pattern` is the regex SOURCE, no delimiters or flags
699
- # (Ruby's own `Regexp#source`) — FieldShape builds its four constants
700
- # off these rows, and bin/project_field_hints writes the Rust host's
701
- # copy from them, so neither side is typed by hand.
584
+ # Regexes `text_field` matches a text attribute's name against
585
+ # (case-insensitively) to guess an HTML input type or textarea kind, when
586
+ # nothing more specific already answered (Hecks::Forms::FieldShape's
587
+ # EMAIL_HINT/URL_HINT/TEL_HINT/TEXTAREA_HINT). `pattern` is the regex
588
+ # source, no delimiters or flags. hecks project_field_hints writes the Rust
589
+ # host's copy from these rows, so neither side is typed by hand.
702
590
  #
703
- # `resolves_to` names WHICH Field attribute a match sets — `html_type`
704
- # for email/url/tel (three candidates, only one wins, checked in that
705
- # order), `kind` for textarea (checked separately, and only once
706
- # html_type has already fallen through to "text").
591
+ # `resolves_to` names which Field attribute a match sets: html_type for
592
+ # email/url/tel (checked in that order, first match wins), kind for
593
+ # textarea (checked once html_type has fallen through to "text").
707
594
  value_object "FieldHint" do
708
595
  attribute :name, String
709
596
  attribute :pattern, String
@@ -715,13 +602,11 @@ Hecks.bluebook "Bluebook" do
715
602
  member name: "textarea", pattern: '\b(text|body|note|notes|description|message|comment)\b', resolves_to: "kind"
716
603
  end
717
604
 
718
- # The Rust keywords (strict + reserved) a generated identifier must not
719
- # collide with — RustProjection::Projector::RUST_KEYWORDS (rust/project/
720
- # naming.rb) reads this, and bin/project_reserved_names projects it into
721
- # rust/codegen/src/reserved_names.rs, so the Ruby and Rust generators
722
- # escape (a field: `r#type`) or refuse (a module name) the SAME words.
723
- # Declared once here because the two hand-typed copies were held equal
724
- # by nothing but a comment.
605
+ # Rust keywords (strict + reserved) a generated identifier must not
606
+ # collide with. RustProjection::Projector::RUST_KEYWORDS reads this;
607
+ # hecks project_reserved_names projects it into
608
+ # rust/codegen/src/reserved_names.rs, so Ruby and Rust escape or refuse
609
+ # the same words from one declaration instead of two hand-typed copies.
725
610
  value_object "RustReservedWord" do
726
611
  attribute :word, String,
727
612
  one_of: ["as", "break", "const", "continue", "crate", "dyn", "else", "enum", "extern", "false",
@@ -736,7 +621,7 @@ Hecks.bluebook "Bluebook" do
736
621
  # outside `[features]` (`[package]`, `[lib]`, `[[bin]]`) plus `default`,
737
622
  # which Cargo reserves for the auto-enabled feature set. Read by
738
623
  # RustProjection::Projector::CARGO_RESERVED_DOMAIN_NAMES and projected by
739
- # bin/project_reserved_names, same as RustReservedWord above.
624
+ # hecks project_reserved_names, same as RustReservedWord above.
740
625
  value_object "CargoReservedName" do
741
626
  attribute :name, String,
742
627
  one_of: ["name", "version", "edition", "path", "authors", "license", "description", "default",
@@ -2,15 +2,10 @@ Hecks.bluebook "Hecksagon" do
2
2
  aggregate "AdapterBinding" do
3
3
  description "One aggregate-to-adapter binding inside a hecksagon — the verb it answers, the adapter it names. Its own root because a hecksagon's binds are an open set of verbs (one per declared port), which no value object can hold — the same reasoning Wiring carries for a world's settings."
4
4
 
5
- # The retained parent edge is structural state. `hecksagon` below is
6
- # separately the text component of this binding's own compound identity,
7
- # so the relationship keeps the same explicit `_ref` distinction World::
8
- # Wiring uses for its parent edge.
5
+ # The parent edge is `hecksagon_ref`; `hecksagon` below is the text part of the identity.
9
6
  belongs_to Hecksagon, as: :hecksagon_ref
10
7
 
11
- # THE HECKSAGON IT IS IN, THE AGGREGATE IT NAMES, THE VERB IT ANSWERS.
12
- # One hecksagon binds one adapter per (aggregate, verb) pair — that is
13
- # what a binding IS — so the triple identifies it.
8
+ # One adapter per (aggregate, verb) pair within a hecksagon, so the triple identifies it.
14
9
  identified_by :hecksagon, :aggregate, :verb
15
10
 
16
11
  attribute :hecksagon, BindingText
@@ -27,9 +22,7 @@ Hecks.bluebook "Hecksagon" do
27
22
  role "Deployment"
28
23
  goal "Name the adapter one aggregate answers one verb through"
29
24
 
30
- # A creating command receives the parent's identity as an ordinary
31
- # value fact. It does not declare a behavioral relationship or use the
32
- # parent as a hidden receiver.
25
+ # The parent's identity arrives as an ordinary value, not as a receiver.
33
26
  attribute :hecksagon_ref, HecksagonName
34
27
  attribute :aggregate, BindingText
35
28
  attribute :verb, BindingText
@@ -7,6 +7,7 @@ Hecks.bluebook "Hecksagon" do
7
7
  attribute :verb, PortVerb, optional: true
8
8
  attribute :signal, PortSignal, optional: true
9
9
  attribute :answers, list_of(PortAnswer)
10
+ attribute :answered_queries, list_of(QueryBinding)
10
11
 
11
12
  value_object "PortName" do
12
13
  attribute :value, String
@@ -18,27 +19,25 @@ Hecks.bluebook "Hecksagon" do
18
19
  invariant("a verb is named") { !value.to_s.empty? }
19
20
  end
20
21
 
21
- # SAME CLOSED SET port.bluebook's own "Port" aggregate declares —
22
- # kept as its own local value object rather than shared cross-
23
- # chapter, the same way PortVerb already is here.
22
+ # Same closed set as port.bluebook's Port, kept local rather than shared across chapters.
24
23
  value_object "PortSignal" do
25
24
  attribute :value, String, one_of: ["reply", "effect"]
26
25
  end
27
26
 
28
- # `answers` — DomainPortBuilder's own twin of PortBuilder#answers
29
- # (port.bluebook's "Port" aggregate, same shape), added once a real
30
- # `.port` file migrated to parse through this builder (the repoint
31
- # `lib/hecks.rb#port`'s own comment describes) used the word
32
- # (`extraction.port`'s own `answers :canonical`). Local, not shared
33
- # cross-chapter, same reasoning as PortSignal just above.
27
+ # Twin of port.bluebook's PortAnswer, kept local for the same reason as PortSignal.
34
28
  value_object "PortAnswer" do
35
29
  attribute :value, String
36
30
  invariant("an answer names a real method") { !value.to_s.empty? }
37
31
  end
38
32
 
39
- # HOW DOMAINPORT IS SPELLED. These rows live with the concept
40
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
41
- # Contexts represented here: DomainPort.
33
+ # A query this port's adapter answers. The shape of the answer is the query's own `returns`,
34
+ # declared in the bluebook; the hecksagon only says who answers.
35
+ value_object "QueryBinding" do
36
+ attribute :name, String
37
+ invariant("a bound query is named") { !name.to_s.empty? }
38
+ end
39
+
40
+ # Keyword rows for DomainPort; SyntaxBoot discovers every aggregate-local seed table.
42
41
  value_object "KeywordSeed" do
43
42
  attribute :word, String
44
43
  attribute :context, String, admits: "Syntax::Context"
@@ -57,6 +56,7 @@ Hecks.bluebook "Hecksagon" do
57
56
  member word: "verb", context: "DomainPort", body: "none", inner: "", opens: "", fills: "verb"
58
57
  member word: "signal", context: "DomainPort", body: "none", inner: "", opens: "", fills: "signal"
59
58
  member word: "answers", context: "DomainPort", body: "none", inner: "", opens: "", fills: "answers"
59
+ member word: "answers_query", context: "DomainPort", body: "none", inner: "", opens: "", fills: "answered_queries", calls: "answers_query_impl"
60
60
 
61
61
  end
62
62
 
@@ -83,14 +83,9 @@ Hecks.bluebook "Hecksagon" do
83
83
  member keyword: "verb", context: "DomainPort", at: "1", named: "", kind: "text", required: "true", fills: "verb"
84
84
  member keyword: "signal", context: "DomainPort", at: "1", named: "", kind: "symbol", required: "true", fills: "signal"
85
85
  member keyword: "answers", context: "DomainPort", at: "1", named: "", kind: "symbol", required: "true", fills: "answers"
86
+ member keyword: "answers_query", context: "DomainPort", at: "1", named: "", kind: "text", required: "true", fills: "name"
86
87
 
87
- # THE RECEIVING AGGREGATE — PortOperationBuilder's own `reference_to`
88
- # (inside the block) is refused (#335); this is the sanctioned
89
- # replacement, named directly on the word that opens the block
90
- # rather than a statement inside it. `kind: "constant"`, matching
91
- # `reference_to`'s own first positional argument
92
- # (port_operation.bluebook) — same bareword-constant resolution,
93
- # just moved.
88
+ # The receiving aggregate is named on the opening word (`to:`), not by `reference_to` inside.
94
89
  member keyword: "operation", context: "DomainPort", at: "", named: "to", kind: "constant", required: "false", fills: "to"
95
90
  member keyword: "tells", context: "DomainPort", at: "", named: "to", kind: "constant", required: "false", fills: "to"
96
91
  member keyword: "asks", context: "DomainPort", at: "", named: "to", kind: "constant", required: "false", fills: "to"
@@ -7,6 +7,7 @@ Hecks.bluebook "Hecksagon" do
7
7
  attribute :subscriptions, list_of(Subscription)
8
8
  attribute :framework_members, list_of(FrameworkMember)
9
9
  attribute :vendored_bluebooks, list_of(VendoredBluebook)
10
+ attribute :attached_chapters, list_of(AttachedChapter)
10
11
 
11
12
  value_object "HecksagonName" do
12
13
  attribute :value, String
@@ -18,24 +19,24 @@ Hecks.bluebook "Hecksagon" do
18
19
  invariant("a subscription names an event") { !value.to_s.empty? }
19
20
  end
20
21
 
21
- # A `framework/bluebook/` member this hecksagon attaches — Governance,
22
- # Identity, whatever else lands beside them. Same shape as
23
- # `Subscription` beside it, one word over.
22
+ # A `framework/bluebook/` member this hecksagon attaches, such as Governance or Identity.
24
23
  value_object "FrameworkMember" do
25
24
  attribute :value, String
26
25
  invariant("a framework member is named") { !value.to_s.empty? }
27
26
  end
28
27
 
29
- # A vendored, external bluebook this hecksagon attaches — one level
30
- # further out than `FrameworkMember`: not a member shipped inside
31
- # hecks's own lib/, but a separate package vendored into the
32
- # consuming project's own checkout. Same shape as `FrameworkMember`
33
- # beside it, one word over — see EmbryonautBluebook's own header.
28
+ # A separate bluebook package vendored into the consuming project, not shipped in hecks's lib/.
34
29
  value_object "VendoredBluebook" do
35
30
  attribute :value, String
36
31
  invariant("a vendored bluebook is named") { !value.to_s.empty? }
37
32
  end
38
33
 
34
+ # A chapter the gem carries (the language, Expression, Tenancy, Deploy) this hecksagon attaches.
35
+ value_object "AttachedChapter" do
36
+ attribute :value, String
37
+ invariant("an attached chapter is named") { !value.to_s.empty? }
38
+ end
39
+
39
40
  command "Declare" do
40
41
  role "Deployment"
41
42
  goal "Open a hecksagon for a domain"
@@ -80,9 +81,18 @@ Hecks.bluebook "Hecksagon" do
80
81
  emits "VendoredBluebookAttached"
81
82
  end
82
83
 
83
- # HOW HECKSAGON IS SPELLED. These rows live with the concept
84
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
85
- # Contexts represented here: File, Hecksagon.
84
+ command "Attaches" do
85
+ role "Deployment"
86
+ goal "Attach a chapter the gem carries to this hecksagon, by name"
87
+
88
+ attribute :chapter, AttachedChapter
89
+
90
+ sets :attached_chapters, append: { value: :chapter }
91
+
92
+ emits "ChapterAttached"
93
+ end
94
+
95
+ # Keyword rows for File and Hecksagon; SyntaxBoot discovers every aggregate-local seed table.
86
96
  value_object "KeywordSeed" do
87
97
  attribute :word, String
88
98
  attribute :context, String, admits: "Syntax::Context"
@@ -99,22 +109,12 @@ Hecks.bluebook "Hecksagon" do
99
109
  member word: "subscribe", context: "Hecksagon", body: "none", inner: "", opens: "", fills: "subscriptions"
100
110
  member word: "uses_framework", context: "Hecksagon", body: "none", inner: "", opens: "", fills: "framework_members"
101
111
  member word: "uses_embryonaut_bluebook", context: "Hecksagon", body: "none", inner: "", opens: "", fills: "vendored_bluebooks"
112
+ member word: "attaches", context: "Hecksagon", body: "none", inner: "", opens: "", fills: "attached_chapters"
102
113
  member word: "port", context: "Hecksagon", body: "keywords", inner: "DomainPort", opens: "DomainPort", fills: "", calls: "port_impl"
103
- # A CROSS-DOMAIN REACTION, WIRED HERE INSTEAD OF THE BLUEBOOK — same
104
- # underlying `Policy` shape a `policy` block already builds
105
- # (`inner`/`opens: "Policy"` reuses that context's own `on`/`trigger`
106
- # wholesale, zero new inner vocabulary), but declared as a wiring
107
- # decision (which FOREIGN domain's event this chapter conforms to),
108
- # the same kind of decision `port`/`uses_framework` already are.
109
- # No `calls:` — `HecksagonBuilder#translates` is an ordinary method,
110
- # the same shape `subscribe`/`uses_framework` already are, reached
111
- # by Ruby's own method lookup before `word_gate` ever runs.
114
+ # A cross-domain reaction wired here rather than in the bluebook; reuses the Policy context.
115
+ # No `calls:` — HecksagonBuilder#translates is an ordinary method, found before `word_gate`.
112
116
  member word: "translates", context: "Hecksagon", body: "keywords", inner: "Policy", opens: "Policy", fills: ""
113
- # A CONSUMER-OWNED bounded context — framework/vendored packages
114
- # get this mark automatically from uses_framework /
115
- # uses_embryonaut_bluebook and never write it in their own files.
116
- # No `calls:` — `HecksagonBuilder#bounded` is an ordinary method,
117
- # same shape `subscribe` already is.
117
+ # Marks a consumer-owned bounded context; framework and vendored packages get it implicitly.
118
118
  member word: "bounded", context: "Hecksagon", body: "none", inner: "", opens: "", fills: ""
119
119
 
120
120
  end
@@ -140,6 +140,7 @@ Hecks.bluebook "Hecksagon" do
140
140
  member keyword: "subscribe", context: "Hecksagon", at: "1", named: "", kind: "text", required: "true", fills: "subscriptions"
141
141
  member keyword: "uses_framework", context: "Hecksagon", at: "1", named: "", kind: "text", required: "true", fills: "framework_members"
142
142
  member keyword: "uses_embryonaut_bluebook", context: "Hecksagon", at: "1", named: "", kind: "text", required: "true", fills: "vendored_bluebooks"
143
+ member keyword: "attaches", context: "Hecksagon", at: "1", named: "", kind: "text", required: "true", fills: "attached_chapters"
143
144
  member keyword: "port", context: "Hecksagon", at: "1", named: "", kind: "text", required: "true", fills: "name"
144
145
  member keyword: "translates", context: "Hecksagon", at: "1", named: "", kind: "text", required: "true", fills: "name"
145
146