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
@@ -7,17 +7,8 @@ Hecks.bluebook "Hecksagon" do
7
7
  attribute :attributes, list_of(PortOperationField)
8
8
  attribute :emits, list_of(EmittedEvent)
9
9
 
10
- # THE TWO ENDINGS OF AN `asks`, held by the language about itself.
11
- #
12
- # `emits` above is what an inbound `tells` says once the fact is in.
13
- # These two are the outbound half: what the adapter came back with, and
14
- # what it said instead. Singular where `emits` is a list, because an ask
15
- # has exactly one of each — a call that could answer two different ways
16
- # is two calls.
17
- #
18
- # Empty on every `tells`, which is why neither carries an invariant
19
- # demanding a value; `PortOperationBuilder` refuses the wrong word for
20
- # the direction long before a record gets here.
10
+ # The two endings of an `asks`: what the adapter answered, or what it refused with.
11
+ # Singular because an ask has exactly one of each; empty on every `tells`, so no invariant.
21
12
  attribute :answers, AnsweringEvent
22
13
  attribute :refuses, RefusingEvent
23
14
 
@@ -44,9 +35,7 @@ Hecks.bluebook "Hecksagon" do
44
35
  attribute :value, String
45
36
  end
46
37
 
47
- # HOW PORTOPERATION IS SPELLED. These rows live with the concept
48
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
49
- # Contexts represented here: PortOperation.
38
+ # Keyword rows for PortOperation; SyntaxBoot discovers every aggregate-local seed table.
50
39
  value_object "KeywordSeed" do
51
40
  attribute :word, String
52
41
  attribute :context, String, admits: "Syntax::Context"
@@ -236,6 +236,21 @@
236
236
  "verb": "Bluebook::Query.Option",
237
237
  "role": "Language"
238
238
  },
239
+ {
240
+ "scope": "bluebook:read_model.all",
241
+ "verb": "Bluebook::ReadModel.All",
242
+ "role": "Language"
243
+ },
244
+ {
245
+ "scope": "bluebook:read_model.any",
246
+ "verb": "Bluebook::ReadModel.Any",
247
+ "role": "Language"
248
+ },
249
+ {
250
+ "scope": "bluebook:read_model.avg",
251
+ "verb": "Bluebook::ReadModel.Avg",
252
+ "role": "Language"
253
+ },
239
254
  {
240
255
  "scope": "bluebook:read_model.count",
241
256
  "verb": "Bluebook::ReadModel.Count",
@@ -256,16 +271,36 @@
256
271
  "verb": "Bluebook::ReadModel.GroupBy",
257
272
  "role": "Language"
258
273
  },
274
+ {
275
+ "scope": "bluebook:read_model.max",
276
+ "verb": "Bluebook::ReadModel.Max",
277
+ "role": "Language"
278
+ },
259
279
  {
260
280
  "scope": "bluebook:read_model.median",
261
281
  "verb": "Bluebook::ReadModel.Median",
262
282
  "role": "Language"
263
283
  },
284
+ {
285
+ "scope": "bluebook:read_model.min",
286
+ "verb": "Bluebook::ReadModel.Min",
287
+ "role": "Language"
288
+ },
264
289
  {
265
290
  "scope": "bluebook:read_model.option",
266
291
  "verb": "Bluebook::ReadModel.Option",
267
292
  "role": "Language"
268
293
  },
294
+ {
295
+ "scope": "bluebook:read_model.percentile",
296
+ "verb": "Bluebook::ReadModel.Percentile",
297
+ "role": "Language"
298
+ },
299
+ {
300
+ "scope": "bluebook:read_model.sum",
301
+ "verb": "Bluebook::ReadModel.Sum",
302
+ "role": "Language"
303
+ },
269
304
  {
270
305
  "scope": "bluebook:syntax.argument",
271
306
  "verb": "Bluebook::Syntax.Argument",
@@ -25,14 +25,8 @@ Hecks.bluebook "Port" do
25
25
  attribute :value, String, one_of: ["reply", "effect"]
26
26
  end
27
27
 
28
- # THE METHOD CONTRACT — what an adapter must actually `respond_to?`
29
- # for a dispatch through this door to reach it, as opposed to `verb`
30
- # and `signal`, which only ever describe the door itself. Optional
31
- # the same way `verb` is (a port declared with none is exactly
32
- # today's pre-existing behavior, unchecked past `verify!`'s existing
33
- # gates), and a plain list of method names rather than a richer
34
- # shape — the same restraint `AdapterField` already takes for
35
- # `field`/`secret`.
28
+ # The method contract: what an adapter must `respond_to?` for a dispatch through this door.
29
+ # A port that declares none is unchecked beyond `verify!`.
36
30
  value_object "PortAnswer" do
37
31
  attribute :value, String
38
32
  invariant("an answer names a real method") { !value.to_s.empty? }
@@ -43,12 +37,7 @@ Hecks.bluebook "Port" do
43
37
  goal "Open a resource door a domain's own aggregates may call by verb"
44
38
 
45
39
  attribute :name, PortName
46
- # OPTIONAL — real, pre-existing PortBuilder behavior (spec/dsl_spec
47
- # .rb's own "signal says whether the domain gets a value back..."
48
- # builds a port with only `signal`, never calling `verb` at all;
49
- # `def verb(value)` has no default, unlike `signal`'s `:reply`).
50
- # Same asymmetry world.bluebook's own Declare command already has
51
- # for `realm`/`latest`.
40
+ # Optional: a port may declare only `signal`; `verb` has no default, unlike `signal`.
52
41
  attribute :verb, PortVerb, optional: true
53
42
  attribute :signal, PortSignal
54
43
 
@@ -71,9 +60,7 @@ Hecks.bluebook "Port" do
71
60
  emits "PortAnswerAdded"
72
61
  end
73
62
 
74
- # HOW PORT IS SPELLED. These rows live with the concept
75
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
76
- # Contexts represented here: File, Port.
63
+ # Keyword rows for File and Port; SyntaxBoot discovers every aggregate-local seed table.
77
64
  value_object "KeywordSeed" do
78
65
  attribute :word, String
79
66
  attribute :context, String, admits: "Syntax::Context"
@@ -24,12 +24,8 @@ Hecks.bluebook "Translation" do
24
24
  invariant("a name says something") { !value.to_s.empty? }
25
25
  end
26
26
 
27
- # ARBITRARY, UNVALIDATED CAPTURE — `convert`'s own `values:` table and
28
- # `backfill`'s own `default:` are open-ended (any literal a real
29
- # migration needs), the same shape `AggregateBuilder#provenance`/
30
- # `CommandBuilder#provenance` already capture as plain, unvalidated
31
- # text (`LiteralText`, aggregate.bluebook) rather than a fixed
32
- # attribute shape a closed self-hosted record could enumerate.
27
+ # `convert` values and `backfill` defaults are open-ended literals, so they are held as
28
+ # unvalidated text, like `provenance` (`LiteralText`, aggregate.bluebook).
33
29
  value_object "TranslationLiteralText" do
34
30
  attribute :value, String
35
31
  end
@@ -60,9 +56,7 @@ Hecks.bluebook "Translation" do
60
56
  emits "TranslationAggregateRetired"
61
57
  end
62
58
 
63
- # HOW TRANSLATION IS SPELLED. These rows live with the concept
64
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
65
- # Contexts represented here: File, Translation.
59
+ # Syntax seed rows for the words this aggregate spells; SyntaxBoot discovers them.
66
60
  value_object "KeywordSeed" do
67
61
  attribute :word, String
68
62
  attribute :context, String, admits: "Syntax::Context"
@@ -6,22 +6,8 @@ Hecks.bluebook "Translation" do
6
6
 
7
7
  identified_by TranslationAggregateName, as: :name
8
8
 
9
- # `TranslationAggregateName` — a DEDICATED type for the identity
10
- # field, not the shared `TranslationName` every non-identity field
11
- # below uses. Found live, not by inspection: reusing one value-
12
- # object type for BOTH an aggregate's own identity field and a
13
- # sibling non-identity field on the same aggregate broke the
14
- # single-field-VO identity-unwrap path — the stored `id` came back
15
- # as a stringified Hash (`"{:value=>\"Account\"}"`) instead of the
16
- # bare scalar (`"Account"`), so a self-reference to this aggregate
17
- # could never find the record `Declare` had just created. Reusing
18
- # the SAME type across MULTIPLE identity fields (Translation's own
19
- # `TranslationEraName`, for both `from` and `to`) is unaffected —
20
- # confirmed directly, not assumed — so the real trigger is identity
21
- # + non-identity sharing, not reuse itself. A genuine framework bug,
22
- # out of scope to fix here; every other self-hosted construct in
23
- # this language already avoids it by convention (a dedicated type
24
- # per identity field), which this now matches too.
9
+ # A dedicated identity type: sharing `TranslationName` with a non-identity field breaks the
10
+ # single-field identity unwrap, storing the id as a stringified Hash instead of a scalar.
25
11
  attribute :was, TranslationName, optional: true
26
12
 
27
13
  value_object "TranslationAggregateName" do
@@ -47,11 +33,8 @@ Hecks.bluebook "Translation" do
47
33
  attribute :rekeys, list_of(TranslationRekey)
48
34
  attribute :backfills, list_of(TranslationBackfill)
49
35
 
50
- # Field names throughout mirror lib/hecks/bluebook/translation.rb
51
- # EXACTLY (`Struct.new(:from, :to)` etc.) — the real Ruby records
52
- # TranslationJudge dispatches from, not the builder's own local
53
- # parameter names (`move(old_path, to:)`'s `old_path` becomes the
54
- # struct's own `from`).
36
+ # Field names mirror the Struct records in lib/hecks/bluebook/translation.rb, not the
37
+ # builder's parameter names (`move(old_path, to:)` stores `old_path` as `from`).
55
38
  value_object "TranslationRename" do
56
39
  attribute :from, TranslationName
57
40
  attribute :to, TranslationName
@@ -199,9 +182,7 @@ Hecks.bluebook "Translation" do
199
182
  emits "TranslationBackfillAdded"
200
183
  end
201
184
 
202
- # HOW TRANSLATIONAGGREGATE IS SPELLED. These rows live with the concept
203
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
204
- # Contexts represented here: TranslationAggregate.
185
+ # Syntax seed rows for the words this aggregate spells; SyntaxBoot discovers them.
205
186
  value_object "KeywordSeed" do
206
187
  attribute :word, String
207
188
  attribute :context, String, admits: "Syntax::Context"
@@ -7,9 +7,7 @@ Hecks.bluebook "World" do
7
7
  # so the bare reference name would collide with it.
8
8
  belongs_to World, as: :world_ref
9
9
 
10
- # THE WORLD IT IS IN, AND THE VERB IT ANSWERS. One world binds one adapter per
11
- # verb — that is what a binding IS — so the verb names the wiring, and the
12
- # world says whose.
10
+ # One world binds one adapter per verb, so the verb names the wiring and the world says whose.
13
11
  identified_by :world, :verb
14
12
 
15
13
  attribute :world, WiringText
@@ -59,9 +59,8 @@ Hecks.bluebook "World" do
59
59
  emits "WorldDeclared"
60
60
  end
61
61
 
62
- # HOW WORLD IS SPELLED. These rows live with the concept
63
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
64
- # Contexts represented here: File, World.
62
+ # Spelling rows for World keywords; SyntaxBoot discovers every
63
+ # aggregate-local seed table like this one.
65
64
  value_object "KeywordSeed" do
66
65
  attribute :word, String
67
66
  attribute :context, String, admits: "Syntax::Context"
@@ -77,10 +76,9 @@ Hecks.bluebook "World" do
77
76
  member word: "world", context: "File", body: "keywords", inner: "World", opens: "World", fills: ""
78
77
  member word: "realm", context: "World", body: "none", inner: "", opens: "", fills: "realm", calls: "realm_impl"
79
78
  member word: "latest", context: "World", body: "none", inner: "", opens: "", fills: "latest", calls: "latest_impl"
80
- # THE TWO CROSS-CHAPTER DEFAULTS — the same connection string and the
81
- # same persistence adapter every chapter of a project repeats, written
82
- # once. A chapter's own world (`persisted_by ... database`) and its own
83
- # hecksagon bind still win; see docs/implemented/reference/world.md.
79
+ # The connection string and persistence adapter every chapter of a
80
+ # project would otherwise repeat, written once here; a chapter's own
81
+ # world or hecksagon bind still wins.
84
82
  member word: "default_database", context: "World", body: "none", inner: "", opens: "", fills: "default_database", calls: "default_database_impl"
85
83
  member word: "default_adapter", context: "World", body: "none", inner: "", opens: "", fills: "default_adapter", calls: "default_adapter_impl"
86
84
 
data/lib/hecks/literal.rb CHANGED
@@ -1,45 +1,13 @@
1
1
  module Hecks
2
- # The one spelling for a captured Ruby literal on the wire.
3
- #
4
- # Several `to_h` fields hold a value the author wrote in a bluebook —
5
- # `where(status: { eq: "open" })`, `then_set append: { direction: { value:
6
- # "credit" } }`, `dispatch ... with: { number: :source }`, an attribute's
7
- # `default:` — as text, because the export has to stand on its own and a
8
- # String field cannot say "this one was a Symbol". Every such field is the
9
- # same question and now gets the same answer.
10
- #
11
- # It was three answers before, and they disagreed on both axes that matter.
12
- # `Mutation#appended_fields` spelled a Symbol bare and everything else
13
- # `inspect`; `QuerySpecification.render_value` spelled a Symbol with a colon
14
- # and everything else `to_s`. So `:amount` crossed as "amount" in a mutation
15
- # and ":amount" in a saga binding — the same value, two spellings, and each
16
- # reader had to know which field it was looking at. Worse, `to_s`/`inspect`
17
- # on a Hash is Ruby's own rendering, which moved under us: 3.3 writes
18
- # `{:value=>"credit"}` and 3.4 writes `{value: "credit"}` for the identical
19
- # Hash, so the wire format was silently pinned to an interpreter version.
20
- #
21
- # Self-describing is the rule, stated once here rather than inherited from
22
- # whatever `inspect` happens to do: a symbol wears its colon, a string wears
23
- # its quotes, a hash wears `{key: value}` braces, a list wears its brackets,
24
- # and a number, a boolean and nil are bare. `read` is the exact inverse, and
25
- # is the only thing that should ever take one of these strings apart.
26
- # A mutation source that reads the record's own state — `sets :positions,
27
- # append: { knights: state(:knights) }`. A bare Symbol in a mutation
28
- # source always names a command argument (and imports it as one when
29
- # the target's own field carries the same name — `CommandBuilder
30
- # #resolve_append_fields!`); before this there was no way to say "the
31
- # value this field already holds", so a command could not snapshot its
32
- # own record — chess's threefold repetition needs exactly that, a
33
- # position copied off the board every ply. Spelled `state(:name)` on
34
- # the wire, read back by `Literal.read`; classified `kind: "state"` in
35
- # a set's own source (`Behaviour::Mutation#classified_source`).
2
+ # A mutation source that reads the record's own state: `append: { knights: state(:knights) }`.
3
+ # A bare Symbol in a mutation source names a command argument, so this is the only way to say it.
36
4
  StateRef = Struct.new(:name) do
37
5
  def to_s = "state(:#{name})"
38
6
  end
39
7
 
40
- # The `render`/`read` pair the header above describes: `render` turns a
41
- # Ruby value into its self-describing wire spelling, `read` is its exact
42
- # inverse.
8
+ # The one wire spelling for a Ruby literal captured from a bluebook: a symbol wears its
9
+ # colon, a string its quotes, a hash `{key: value}`, a list brackets; the rest are bare.
10
+ # Stated here, not left to `inspect`, whose Hash rendering differs between Ruby 3.3 and 3.4.
43
11
  module Literal
44
12
  module_function
45
13
 
@@ -63,16 +31,9 @@ module Hecks
63
31
  end
64
32
  end
65
33
 
66
- # Read one back. Tolerant of a bare word on purpose: the language stores a
67
- # closed set's members and a few hand-written fields as plain text that was
68
- # never rendered, and those must stay the strings they are.
34
+ # Parses a wire spelling back into a Ruby value; the exact inverse of `render`.
35
+ # A bare word stays a String, since some fields are stored as plain text, never rendered.
69
36
  #
70
- # The exact inverse of `render`'s `case`, above — one ordered guard per
71
- # spelling `render` can produce (plus the bare-word tolerance this
72
- # comment already explains). Each guard is a single self-contained
73
- # `return`; splitting them into named predicates would just rename
74
- # each line without changing what it does, and would separate this
75
- # method from the `render` it is the deliberate mirror of.
76
37
  # @param text [String, #to_s] wire spelling produced by `render`, or a bare word
77
38
  # @return [Object] nil, true, false, Integer, Float, Symbol, StateRef, String,
78
39
  # Hash, or Array — or `text` itself, stripped, when it matches no known spelling
@@ -131,10 +92,7 @@ module Hecks
131
92
  # @return [Array<Object>] the parsed values, each read recursively via `read`
132
93
  def read_array(raw) = split_items(raw[1..-2]).map { |item| read(item) }
133
94
 
134
- # Split on the commas that are actually separators — never one inside a
135
- # quoted string or a nested brace/bracket. Scanned rather than
136
- # `String#split(", ")`, which tore `"a, b"` in half and lost the second
137
- # field of anything nested.
95
+ # Splits on separator commas only, never one inside a quoted string or nested brace/bracket.
138
96
  #
139
97
  # @param body [String] the text between a literal's outer braces or brackets
140
98
  # @return [Array<String>] each item's raw text, stripped, with empty items dropped
@@ -1,41 +1,8 @@
1
1
  require "socket"
2
2
 
3
3
  module Hecks
4
- # The startup gate for the stdio MCP servers in `bin/` (`hecks_mcp_door`,
5
- # `hecks_query_ir_mcp`): it refuses to run when the process was set up to
6
- # speak to anything but a local parent, and it says on stderr what the
7
- # process does and does not protect.
8
- #
9
- # ## Why a gate and not a comment
10
- #
11
- # Both servers have no authentication. What keeps a stranger away from
12
- # them is that only a process that can spawn them can write to their
13
- # stdin. That holds until someone wraps one in `socat TCP-LISTEN:... EXEC:`
14
- # or an `inetd`-style listener, which hands the process a network socket
15
- # as stdin/stdout without changing a line of the server. The gate turns
16
- # that setup into a refusal at startup instead of an exposure nobody
17
- # noticed.
18
- #
19
- # ## What it checks
20
- #
21
- # - **Arguments** — none, except `--stdio`. A `--port` or `--http` flag is
22
- # refused rather than ignored, so a caller that believes it started a
23
- # network server finds out immediately.
24
- # - **Environment** — no `HECKS_MCP_*` variable except
25
- # `HECKS_MCP_TRANSPORT=stdio`. The servers take no configuration, so an
26
- # unknown option in that namespace fails closed.
27
- # - **Descriptors** — stdin and stdout must not be internet-protocol sockets
28
- # (`AF_INET` or `AF_INET6`). A pipe, a file, a terminal and a Unix-domain socket all pass;
29
- # the last matters because some MCP clients spawn servers over a
30
- # `socketpair`, which is local to the machine.
31
- #
32
- # ## What it does not do
33
- #
34
- # It does not authenticate anyone and it cannot see a proxy that copies
35
- # bytes from a network socket into an ordinary pipe. It closes the
36
- # configurations that announce themselves; the ADR on MCP authentication
37
- # (`docs/decisions/0062-mcp-servers-need-real-authentication-before-any-network-transport.md`)
38
- # covers what a network transport would need.
4
+ # Startup gate for the stdio MCP servers `hecks mcp` runs: refuses network sockets, extra
5
+ # flags and unknown `HECKS_MCP_*` variables. It is not authentication (ADR 0062).
39
6
  module McpStdioGuard
40
7
  ACCEPTED_ARGS = %w[--stdio].freeze
41
8
  ENV_PREFIX = "HECKS_MCP_".freeze
@@ -71,12 +38,8 @@ module Hecks
71
38
  (COMMON_NOTES + notes).map { |line| "#{server}: #{line}" }
72
39
  end
73
40
 
74
- # Refuses to continue on a non-stdio setup.
75
- #
76
- # A server calls this before it requires anything heavy, so a misconfigured start
77
- # fails in milliseconds and before any protocol byte is answered. Everything goes
78
- # to `stderr`: stdout carries the MCP protocol, and one stray line there corrupts
79
- # the client's framing.
41
+ # Refuses to continue on a non-stdio setup. Everything goes to `stderr`: stdout
42
+ # carries the MCP protocol, and a stray line there corrupts the client's framing.
80
43
  #
81
44
  # @param server [String] the server's name, used as the line prefix
82
45
  # @param argv [Array<String>] the command-line arguments
data/lib/hecks/naming.rb CHANGED
@@ -1,19 +1,9 @@
1
1
  module Hecks
2
- # Every derived-name and identity-joining rule the language relies on —
3
- # pluralisation/singularisation, snake/Pascal casing, dotted-path and verb
4
- # splitting, and the command/event reference rewrites — collected here so
5
- # two readers never invent two different spellings for the same
6
- # derivation.
2
+ # Derived-name and identity-joining rules: casing, pluralisation, dotted-path
3
+ # and verb splitting, command/event reference rewrites.
7
4
  module Naming
8
- # What separates the parts of a derived identity.
9
- #
10
- # An identity of several parts is their join, and the join has to be spelled the
11
- # same everywhere or two readers name two different records off one declaration.
12
- # It was spelled three ways at once here — "::" for an aggregate under a
13
- # chapter, "." for everything under an aggregate, "#" for the three that keyed
14
- # off position — and each was written where it happened to be needed. Once the
15
- # runtime derived the same identity, the runtime made a fourth, and a reference
16
- # that resolved by string comparison found nothing.
5
+ # What separates the parts of a derived identity. Every reader must spell the
6
+ # join the same way, or string-compared references resolve to nothing.
17
7
  IDENTITY_JOIN = ":".freeze
18
8
 
19
9
  module_function
@@ -35,9 +25,8 @@ module Hecks
35
25
  type.to_s.split("::").last.to_s
36
26
  end
37
27
 
38
- # snake_case -> PascalCase. The name a synthesised closed-set value object
39
- # takes when an attribute declares one inline. The derivation is part of
40
- # the IR contract: the same bluebook must always produce the same name.
28
+ # snake_case -> PascalCase. Names a closed-set value object synthesised from an
29
+ # inline attribute; the derivation is part of the IR contract.
41
30
  #
42
31
  # @param text [String, Symbol, #to_s] a snake_case (or already Pascal) name
43
32
  # @return [String] the PascalCase form
@@ -56,15 +45,8 @@ module Hecks
56
45
  .downcase
57
46
  end
58
47
 
59
- # An identifier as a person would say it — `ATMCard` -> "ATM card",
60
- # `AccrueInterest` -> "Accrue interest", `daily_limit` -> "Daily
61
- # limit", `Back office` -> "Back office". The same two word-boundary
62
- # splits `snake` uses, with a space instead of an underscore — plus
63
- # the one thing `snake` cannot give back: an all-caps run stays an
64
- # acronym ("ATM", "KYC") instead of being lowercased into a word
65
- # nobody says ("Atm"). First word capitalized, the rest lowercased,
66
- # so a headword reads as sentence case whatever casing it was
67
- # declared in.
48
+ # An identifier as a sentence-cased phrase: `ATMCard` -> "ATM card",
49
+ # `daily_limit` -> "Daily limit". All-caps runs stay acronyms.
68
50
  #
69
51
  # @param text [String, Symbol, #to_s] a Pascal-, camel-, or snake-case identifier
70
52
  # @return [String] the space-separated, sentence-cased phrase
@@ -81,9 +63,7 @@ module Hecks
81
63
  end.join(" ")
82
64
  end
83
65
 
84
- # Joins items into the Oxford-comma list — "A, B, and C" / "A or B" —
85
- # every English sentence a projection writes wants; lived in
86
- # `NarrateProjector` alone until a second projection needed it.
66
+ # Joins items into an Oxford-comma list: "A, B, and C" / "A or B".
87
67
  #
88
68
  # @param items [Array<#to_s>] the items to join
89
69
  # @param conj [String] the word before the last item, such as `"and"` or `"or"`
@@ -98,9 +78,8 @@ module Hecks
98
78
  end
99
79
  end
100
80
 
101
- # Picks the article for `word` by its first letter — the vowel-letter
102
- # heuristic, safe here for the same reason `Projections::Statements#article`
103
- # gives: a construct name is a plain word, never "hour" or "university".
81
+ # Picks the article for `word` by its first letter. Construct names are plain
82
+ # words, never "hour" or "university", so the vowel-letter heuristic holds.
104
83
  #
105
84
  # @param word [String, Symbol, #to_s] the word the article precedes
106
85
  # @return [String] `"an"` if `word` starts with a vowel letter, `"a"` otherwise
@@ -108,15 +87,8 @@ module Hecks
108
87
  %w[a e i o u].include?(word.to_s[0].to_s.downcase) ? "an" : "a"
109
88
  end
110
89
 
111
- # The name a collection of something takes.
112
- #
113
- # There were two of these and one was wrong. A read model's gathered heads
114
- # derived their name with a bare `"#{snake(target)}s"`, so the meta-domain's
115
- # own whole-bluebook read model handed back `querys`, `entitys`, `policys`
116
- # and `dispatchs` — and every check was green, because the checks compared
117
- # the wrong rule against itself. Agreement is not correctness; it never was.
118
- #
119
- # So: one pluraliser, three rules, and every collection name flows through it.
90
+ # The name a collection of something takes: "y" -> "ies", sibilants take "es",
91
+ # everything else "s". Every collection name must flow through this one rule.
120
92
  #
121
93
  # @param text [String, Symbol, #to_s] a singular name
122
94
  # @return [String] the pluralised name
@@ -128,13 +100,9 @@ module Hecks
128
100
  "#{word}s"
129
101
  end
130
102
 
131
- # `has_many`'s undo — the plural written, back to the singular the target
132
- # aggregate is actually named. Deliberately the crude half of a pair: `plural`
133
- # above earns its precision (three suffix rules) because getting a collection
134
- # name wrong reads as a typo forever ; this only ever recovers a name someone
135
- # already wrote as a real aggregate, so "ies -> y, trailing s dropped" is the
136
- # whole rule — enough for `has_many Invoices` to resolve to the aggregate
137
- # actually named Invoice.
103
+ # Recovers the singular aggregate name from a `has_many` plural. Deliberately
104
+ # crude ("ies" -> "y", sibilant "es" and trailing "s" dropped): it only has to
105
+ # find a name someone already wrote.
138
106
  #
139
107
  # @param text [String, Symbol, #to_s] a plural name
140
108
  # @return [String] the singularised name
@@ -142,15 +110,8 @@ module Hecks
142
110
  word = text.to_s
143
111
  return "#{word[0..-4]}y" if word.length > 3 && word.end_with?("ies")
144
112
 
145
- # `plural`'s own second rule adds "es" (not bare "s") after
146
- # s/x/z/ch/sh — undone here the same way, or a word `plural`
147
- # itself would have suffixed with "es" comes back missing its
148
- # own trailing letter ("Boxes" -> "Boxe", not "Box") once this
149
- # only ever knew how to drop a bare "s". Checked before the
150
- # bare-"s" rule below: stripping "es" first and confirming what
151
- # is left actually ends in one of those five shapes is what
152
- # keeps an ordinary "-es" word (e.g. "Invoices" -> "Invoice")
153
- # from also losing a letter it never doubled.
113
+ # Undo `plural`'s "es" after s/x/z/ch/sh before the bare-"s" rule, so "Boxes"
114
+ # gives "Box" while "Invoices" still gives "Invoice".
154
115
  return word[0..-3] if word.length > 3 && word.end_with?("es") && word[0..-3].match?(/(s|x|z|ch|sh)\z/)
155
116
 
156
117
  return word[0..-2] if word.length > 1 && word.end_with?("s")
@@ -199,29 +160,9 @@ module Hecks
199
160
 
200
161
  # Splits a domain-qualified verb into its domain, aggregate, and command parts.
201
162
  #
202
- # Domain, aggregate, then the REST dot-joined into one command path.
203
- #
204
- # The `::` boundary between domain and aggregate is unambiguous by
205
- # construction — every caller here has already prefixed the domain
206
- # itself (`PolicyInterpreter#deliver`, `SagaInterpreter#qualified`,
207
- # `Router#dispatch`'s own rebuilt string) before this ever runs. A
208
- # third `::` segment can still show up past that boundary: a bare
209
- # `ScopedConstant` naming a port operation (`command_ref`'s own
210
- # comment — `Aggregate::Port::Operation`, three colon-joined
211
- # segments with no `.` of its own) only gets its last `::` rewritten
212
- # to `.` there, at DSL-build time, because nothing at that point
213
- # knows yet whether the constant names a port operation or a
214
- # domain-qualified command (`Domain::Aggregate::Command`, the other
215
- # shape `command_ref` documents) — both are textually identical.
216
- # Here, past the already-resolved domain boundary, any leftover
217
- # `::` is unambiguous: it is that same rewrite artifact, and folding
218
- # it into the dot-joined tail recovers exactly the
219
- # `Aggregate::Port.Operation` shape a working port dispatch already
220
- # expects (`spec/port_operation_interpreter_spec.rb`'s own
221
- # `"Payments::Payment.PaymentGateway.Receive"`). `Outbox::Fanout
222
- # .kind_for` and `ReactionInvocation#resolve_target` both already
223
- # assume this contract on their own end; this is what actually
224
- # delivers it to them.
163
+ # A `::` left after the domain and aggregate is the last-`::`-to-`.` rewrite
164
+ # `command_ref` leaves on a port operation; it folds into the dotted command
165
+ # tail (`Aggregate::Port.Operation`).
225
166
  #
226
167
  # @param verb [String, Symbol, #to_s] a `Domain::Aggregate.command` (or
227
168
  # `.query`) path
@@ -239,26 +180,11 @@ module Hecks
239
180
  [domain, aggregate, command]
240
181
  end
241
182
 
242
- # Rewrites a bare command constant's trailing `::` into `.`, matching a
243
- # command's own FQN separator; a String or Symbol passes through unchanged.
183
+ # Rewrites a bare command constant's last `::` into `.`, matching a command's
184
+ # FQN separator (`Banking::Account::Debit` -> `Banking::Account.Debit`).
244
185
  #
245
- # `trigger Account::Debit` / `dispatch Account::Debit` — a bare
246
- # constant reference (`ConstShim`'s own `ScopedConstant`, S0b), not
247
- # text (ADR 0025, "events and reactions" — command references become
248
- # first-class). Ruby's `::` joins every segment the same way a
249
- # constant path always does, but a command's own `hecks_fqn` joins
250
- # its aggregate with `.` (`Construct#hecks_separator`'s default,
251
- # only an aggregate overrides it to `::`) — so only the last `::`
252
- # becomes a `.`; everything before it (the chapter, when a domain is
253
- # spelled at all: `Banking::Account::Debit`) stays `::`-joined.
254
- #
255
- # A string passes through unchanged, on purpose — legacy era text
256
- # (S0a's own shadow-parsed spelling) already mixes `::` (domain) and
257
- # `.` (command) correctly on its own, e.g. `"Banking::Account.Debit"`,
258
- # and re-splitting that by content rather than by type would corrupt
259
- # it (its own last `::` sits between the domain and the aggregate,
260
- # not the aggregate and the command). Only an actual constant object
261
- # — never seen holding a `.` of its own — needs the rewrite at all.
186
+ # A String or Symbol passes through: era text already mixes `::` and `.`
187
+ # correctly, and re-splitting it by content would corrupt it.
262
188
  #
263
189
  # @param value [Symbol, String, Module] the command, as a bare constant (a
264
190
  # `ScopedConstant` module `ConstShim` resolves) or already-dotted text
@@ -271,18 +197,8 @@ module Hecks
271
197
  path.empty? ? text : "#{path}.#{command}"
272
198
  end
273
199
 
274
- # The event-side twin of `command_ref`, kept as its own name because an
275
- # event name is not a command name that happens to share a format.
276
- #
277
- # `emits Account::AccountFrozen` / `on Account::AccountFrozen` — the
278
- # event-side twin of `command_ref`, above (ADR 0025, S6 — "events
279
- # first-class"). Identical transform (a bare `ScopedConstant`'s last
280
- # `::` becomes `.`, a String passes through unchanged for legacy
281
- # `shadow_parse` text and for corpus sites this pass didn't migrate —
282
- # see that method's own comment for why both rules exist), given its
283
- # own name because the two references mean different things even
284
- # though the rewrite is byte-identical: an event name is not a
285
- # command name that happens to share a format.
200
+ # The event-side twin of `command_ref`. Same rewrite, separate name, because an
201
+ # event reference is not a command reference that happens to share a format.
286
202
  #
287
203
  # @param value [Symbol, String, Module] the event, as a bare constant (a
288
204
  # `ScopedConstant` module `ConstShim` resolves) or already-dotted text
@@ -291,32 +207,8 @@ module Hecks
291
207
 
292
208
  # Strips a process manager's event reference down to its bare event name.
293
209
  #
294
- # `transition Account::AccountDebited => "state"` / `starts_on
295
- # Transfer::TransferRequested` / `ends_on Transfer::TransferSettled`
296
- # — a process manager's own event references (ADR 0025, S6),
297
- # deliberately not `event_ref` — found live, not assumed, wiring a
298
- # real migrated corpus site into `bin/model_check` for the first
299
- # time (2026-08-28): `SagaInterpreter#begin_saga`/`#advance_saga`
300
- # match `pm.starts_on`/`pm.handler_for` against `event.name`, which
301
- # `CommandRules::Emission#emit` stamps bare — a command's own
302
- # `emits AccountDebited` never carries its aggregate's name at all
303
- # (unlike a policy's cross-aggregate `on`, matched instead by
304
- # `Naming.demodulise(event.aggregate)` split apart from the bare
305
- # name — `PolicyInterpreter#policies_for`). Handing a saga's own
306
- # matcher the dotted `event_ref` form ("Account.AccountDebited")
307
- # would silently name an event no command in the domain ever
308
- # actually emits — caught by `bin/model_check`'s own `deaf_handler`/
309
- # `deaf_trigger` findings the moment a real qualified corpus site
310
- # existed to trip them, not by any unit test in isolation.
311
- #
312
- # A qualifier is still worth writing (`Account::`) — the same
313
- # provenance a reader gets from `trigger Account::Debit` — it is
314
- # only not worth keeping: `demodulise` drops everything but the
315
- # final segment, so `Account::AccountDebited` and a bare
316
- # `AccountDebited` resolve to the identical stored string. A String
317
- # passes through unchanged either way, exactly like `command_ref`'s
318
- # own legacy branch — this corpus never spelled one dotted to begin
319
- # with, so there is nothing here to strip.
210
+ # Not `event_ref`: saga matching compares against `event.name`, which is stamped
211
+ # bare, so a dotted "Account.AccountDebited" would name an event nothing emits.
320
212
  #
321
213
  # @param value [Symbol, String, Module] the event, as a bare constant (a
322
214
  # `ScopedConstant` module `ConstShim` resolves) or already-dotted text