hecks 2.9.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 (600) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +51 -6
  3. data/lib/hecks/adapters/driven/heki/journal.rb +1 -1
  4. data/lib/hecks/adapters/driven/lambda/client.rb +1 -1
  5. data/lib/hecks/adapters/driven/lambda.rb +1 -1
  6. data/lib/hecks/adapters/driven/memory.rb +16 -3
  7. data/lib/hecks/adapters/driven/postgres/reconnect.rb +6 -2
  8. data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
  9. data/lib/hecks/adapters/driven/postgres.rb +4 -2
  10. data/lib/hecks/adapters/driven/prism.rb +41 -8
  11. data/lib/hecks/adapters/driven/tenant_provisioner.rb +73 -16
  12. data/lib/hecks/behaviors/expectations.rb +1 -1
  13. data/lib/hecks/behaviors.rb +1 -1
  14. data/lib/hecks/bench/cli.rb +62 -0
  15. data/lib/hecks/bench/environment.rb +71 -0
  16. data/lib/hecks/bench/postgres_probe.rb +30 -0
  17. data/lib/hecks/bench/report.rb +76 -0
  18. data/lib/hecks/bench/ruby_runner.rb +93 -0
  19. data/lib/hecks/bench/run.rb +55 -0
  20. data/lib/hecks/bench/rust_runner.rb +101 -0
  21. data/lib/hecks/bench/stats.rb +46 -0
  22. data/lib/hecks/bench/suite.rb +98 -0
  23. data/lib/hecks/bench/workload.rb +89 -0
  24. data/lib/hecks/bench.rb +17 -0
  25. data/lib/hecks/bluebook/assembly/contracts.rb +2 -0
  26. data/lib/hecks/bluebook/attribute.rb +1 -1
  27. data/lib/hecks/bluebook/behaviour/aggregate.rb +30 -1
  28. data/lib/hecks/bluebook/behaviour/domain_port.rb +7 -0
  29. data/lib/hecks/bluebook/chapter.rb +6 -2
  30. data/lib/hecks/bluebook/domain_port.rb +36 -5
  31. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +10 -0
  32. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +8 -0
  33. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -1
  34. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +31 -3
  35. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +122 -3
  36. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +1 -1
  37. data/lib/hecks/bluebook/dsl/query_builder.rb +27 -1
  38. data/lib/hecks/bluebook/dsl/rule_reference.rb +1 -1
  39. data/lib/hecks/bluebook/dsl/world_builder.rb +29 -2
  40. data/lib/hecks/bluebook/expression/canonical_form.rb +1 -1
  41. data/lib/hecks/bluebook/expression/resolver.rb +3 -2
  42. data/lib/hecks/bluebook/hexagon.rb +13 -5
  43. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +1 -0
  44. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +4 -1
  45. data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
  46. data/lib/hecks/bluebook/meta_validator.rb +9 -4
  47. data/lib/hecks/bluebook/model_check.rb +23 -0
  48. data/lib/hecks/bluebook/pattern_subset.rb +38 -0
  49. data/lib/hecks/bluebook/query.rb +20 -5
  50. data/lib/hecks/bluebook/smoke_test.rb +1 -1
  51. data/lib/hecks/canonical_json.rb +30 -0
  52. data/lib/hecks/chapters.rb +102 -0
  53. data/lib/hecks/cli/behaviors.rb +61 -0
  54. data/lib/hecks/cli/canonicalise.rb +25 -0
  55. data/lib/hecks/cli/check_engine_agreement.rb +32 -0
  56. data/lib/hecks/cli/check_era.rb +88 -0
  57. data/lib/hecks/cli/console.rb +66 -0
  58. data/lib/hecks/cli/deploy_template_diff.rb +40 -0
  59. data/lib/hecks/cli/doc_coverage.rb +32 -0
  60. data/lib/hecks/cli/document.rb +2 -2
  61. data/lib/hecks/cli/expression_projection.rb +41 -0
  62. data/lib/hecks/cli/follow.rb +88 -0
  63. data/lib/hecks/cli/history.rb +44 -0
  64. data/lib/hecks/cli/ir.rb +1 -1
  65. data/lib/hecks/cli/mcp.rb +3 -3
  66. data/lib/hecks/cli/model_check.rb +7 -4
  67. data/lib/hecks/cli/pattern_cases.rb +47 -0
  68. data/lib/hecks/cli/present.rb +39 -0
  69. data/lib/hecks/cli/project_cli.rb +224 -32
  70. data/lib/hecks/cli/project_diagrams.rb +4 -3
  71. data/lib/hecks/cli/project_glossary.rb +44 -0
  72. data/lib/hecks/cli/reference.rb +46 -0
  73. data/lib/hecks/cli/refresh_projections.rb +44 -0
  74. data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +150 -0
  75. data/lib/hecks/cli/release.rb +70 -0
  76. data/lib/hecks/cli/release_gem.rb +59 -0
  77. data/lib/hecks/cli/rspec_io_parallel_files.rb +137 -0
  78. data/lib/hecks/cli/rspec_shard_files.rb +66 -0
  79. data/lib/hecks/cli/run.rb +3 -3
  80. data/lib/hecks/cli/seed_semantics_corpus.rb +71 -0
  81. data/lib/hecks/cli/serve_query_ir_mcp.rb +30 -0
  82. data/lib/hecks/cli/shape.rb +70 -0
  83. data/lib/hecks/cli/smoke_http.rb +230 -0
  84. data/lib/hecks/cli/smoke_test.rb +5 -3
  85. data/lib/hecks/cli/spec_example.rb +27 -0
  86. data/lib/hecks/cli/statements.rb +32 -0
  87. data/lib/hecks/cli/stores.rb +4 -5
  88. data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
  89. data/lib/hecks/cli.rb +201 -52
  90. data/lib/hecks/codemod.rb +324 -0
  91. data/lib/hecks/corpus.rb +423 -0
  92. data/lib/hecks/deploy/bluebook/deploy.bluebook +591 -23
  93. data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -4
  94. data/lib/hecks/deploy/oidc.json +82 -2
  95. data/lib/hecks/doc/reference.rb +351 -0
  96. data/lib/hecks/doors/cli_door.rb +196 -0
  97. data/lib/hecks/doors/cli_runner.rb +297 -0
  98. data/lib/hecks/{facade → doors}/command_request.rb +1 -1
  99. data/lib/hecks/{facade → doors}/handle.rb +2 -2
  100. data/lib/hecks/{facade → doors}/json_door.rb +4 -4
  101. data/lib/hecks/doors/launcher_options.rb +129 -0
  102. data/lib/hecks/{cli → doors}/mcp_door.rb +7 -7
  103. data/lib/hecks/doors/mcp_door_scope.rb +97 -0
  104. data/lib/hecks/{facade/surface → doors/ruby_door}/aggregate_door.rb +8 -3
  105. data/lib/hecks/{facade/surface → doors/ruby_door}/chapter.rb +3 -3
  106. data/lib/hecks/{facade/surface.rb → doors/ruby_door.rb} +36 -5
  107. data/lib/hecks/doors.rb +61 -0
  108. data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +1 -1
  109. data/lib/hecks/embryonaut_bluebook.rb +1 -1
  110. data/lib/hecks/engine_agreement.rb +156 -0
  111. data/lib/hecks/facade.rb +24 -37
  112. data/lib/hecks/forms/app.rb +6 -6
  113. data/lib/hecks/forms/banking_presentation.rb +50 -0
  114. data/lib/hecks/forms/field_shape.rb +2 -1
  115. data/lib/hecks/forms/port_argument.rb +1 -1
  116. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +393 -0
  117. data/lib/hecks/fuzzing/combination_miner.rb +86 -0
  118. data/lib/hecks/fuzzing/concurrent_dispatch.rb +214 -0
  119. data/lib/hecks/fuzzing/coverage_campaign.rb +143 -0
  120. data/lib/hecks/fuzzing/differential.rb +156 -0
  121. data/lib/hecks/fuzzing/domain_generator.rb +615 -0
  122. data/lib/hecks/fuzzing/era_boundary.rb +71 -0
  123. data/lib/hecks/fuzzing/form_census.rb +136 -0
  124. data/lib/hecks/fuzzing/generated_domain_check.rb +93 -0
  125. data/lib/hecks/fuzzing/invalid_value_generator.rb +64 -0
  126. data/lib/hecks/fuzzing/isolated_boot.rb +301 -0
  127. data/lib/hecks/fuzzing/nondeterministic.rb +51 -0
  128. data/lib/hecks/fuzzing/outside_world.rb +45 -0
  129. data/lib/hecks/fuzzing/persistence_parity.rb +102 -0
  130. data/lib/hecks/fuzzing/properties/corrections.rb +88 -0
  131. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +314 -0
  132. data/lib/hecks/fuzzing/properties/guards.rb +190 -0
  133. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +300 -0
  134. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +93 -0
  135. data/lib/hecks/fuzzing/properties/outbox.rb +89 -0
  136. data/lib/hecks/fuzzing/properties/querying.rb +175 -0
  137. data/lib/hecks/fuzzing/properties.rb +162 -0
  138. data/lib/hecks/fuzzing/qa_settings.rb +123 -0
  139. data/lib/hecks/fuzzing/replay.rb +505 -0
  140. data/lib/hecks/fuzzing/rotation_priority.rb +48 -0
  141. data/lib/hecks/fuzzing/rust_gap_manifest.rb +108 -0
  142. data/lib/hecks/fuzzing/self_consistency.rb +339 -0
  143. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +385 -0
  144. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +132 -0
  145. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +95 -0
  146. data/lib/hecks/fuzzing/sequence_generator/picker.rb +77 -0
  147. data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +109 -0
  148. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +237 -0
  149. data/lib/hecks/fuzzing/sequence_generator.rb +189 -0
  150. data/lib/hecks/fuzzing/shrinker.rb +166 -0
  151. data/lib/hecks/fuzzing/structural_skips.rb +33 -0
  152. data/lib/hecks/fuzzing/sweep_depth.rb +43 -0
  153. data/lib/hecks/fuzzing/target_capabilities.rb +163 -0
  154. data/lib/hecks/fuzzing/value_generator.rb +216 -0
  155. data/lib/hecks/fuzzing.rb +23 -0
  156. data/lib/hecks/grammar/evolve.rb +336 -0
  157. data/lib/hecks/hecks/adapters/codebase/codemods.rb +45 -0
  158. data/lib/hecks/hecks/adapters/codebase/conformance.rb +71 -0
  159. data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +202 -0
  160. data/lib/hecks/hecks/adapters/codebase/gem_registry.rb +80 -0
  161. data/lib/hecks/hecks/adapters/codebase/kernel_tables.rb +54 -0
  162. data/lib/hecks/hecks/adapters/codebase/language.rb +240 -0
  163. data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +102 -0
  164. data/lib/hecks/hecks/adapters/codebase/publishing.rb +142 -0
  165. data/lib/hecks/hecks/adapters/codebase/regeneration.rb +67 -0
  166. data/lib/hecks/hecks/adapters/codebase/release_facts.rb +90 -0
  167. data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +83 -0
  168. data/lib/hecks/hecks/adapters/codebase/secret_vault.rb +36 -0
  169. data/lib/hecks/hecks/adapters/codebase/source_tree.adapter +7 -0
  170. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +189 -0
  171. data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +71 -0
  172. data/lib/hecks/hecks/adapters/codebase/style.rb +171 -0
  173. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +55 -0
  174. data/lib/hecks/hecks/adapters/codebase/test_suite.rb +165 -0
  175. data/lib/hecks/hecks/adapters/codebase/tree.rb +111 -0
  176. data/lib/hecks/hecks/adapters/console_capture.rb +79 -0
  177. data/lib/hecks/hecks/adapters/deploy_toolchain.adapter +7 -0
  178. data/lib/hecks/hecks/adapters/deploy_toolchain.rb +108 -0
  179. data/lib/hecks/hecks/adapters/git.adapter +7 -0
  180. data/lib/hecks/hecks/adapters/git.rb +102 -0
  181. data/lib/hecks/hecks/adapters/host_http.adapter +7 -0
  182. data/lib/hecks/hecks/adapters/host_http.rb +65 -0
  183. data/lib/hecks/hecks/adapters/in_process_boot.adapter +7 -0
  184. data/lib/hecks/hecks/adapters/in_process_boot.rb +197 -0
  185. data/lib/hecks/hecks/adapters/in_process_operations.rb +202 -0
  186. data/lib/hecks/hecks/adapters/journal_store/changes.rb +143 -0
  187. data/lib/hecks/hecks/adapters/journal_store/compaction.rb +145 -0
  188. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +132 -0
  189. data/lib/hecks/hecks/adapters/journal_store/examination.rb +135 -0
  190. data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +163 -0
  191. data/lib/hecks/hecks/adapters/journal_store/readings.rb +187 -0
  192. data/lib/hecks/hecks/adapters/journal_store.adapter +7 -0
  193. data/lib/hecks/hecks/adapters/journal_store.rb +64 -0
  194. data/lib/hecks/hecks/adapters/local_files.adapter +7 -0
  195. data/lib/hecks/hecks/adapters/local_files.rb +46 -0
  196. data/lib/hecks/hecks/adapters/pg_admin.adapter +7 -0
  197. data/lib/hecks/hecks/adapters/pg_admin.rb +245 -0
  198. data/lib/hecks/hecks/adapters/process_pool.adapter +7 -0
  199. data/lib/hecks/hecks/adapters/process_pool.rb +119 -0
  200. data/lib/hecks/hecks/adapters/rust_toolchain.adapter +7 -0
  201. data/lib/hecks/hecks/adapters/rust_toolchain.rb +179 -0
  202. data/lib/hecks/hecks/adapters/rust_workspace.rb +150 -0
  203. data/lib/hecks/hecks/adapters/shell.adapter +7 -0
  204. data/lib/hecks/hecks/adapters/shell.rb +49 -0
  205. data/lib/hecks/hecks/adapters/terminal.adapter +7 -0
  206. data/lib/hecks/hecks/adapters/terminal.rb +74 -0
  207. data/lib/hecks/hecks/codebase.behaviors +172 -0
  208. data/lib/hecks/hecks/codebase.bluebook +2453 -0
  209. data/lib/hecks/hecks/context_map.hecksagon +13 -0
  210. data/lib/hecks/hecks/custodian.behaviors +179 -0
  211. data/lib/hecks/hecks/custodian.bluebook +1847 -0
  212. data/lib/hecks/hecks/deploy.behaviors +74 -0
  213. data/lib/hecks/hecks/deploy.world +12 -0
  214. data/lib/hecks/hecks/environments/memory.world +10 -0
  215. data/lib/hecks/hecks/governance.world +7 -0
  216. data/lib/hecks/hecks/hecks.behaviors +62 -0
  217. data/lib/hecks/hecks/hecks.bluebook +124 -0
  218. data/lib/hecks/hecks/hecks.hecksagon +390 -0
  219. data/lib/hecks/hecks/hecks.world +42 -0
  220. data/lib/hecks/kernel_capabilities.rb +194 -0
  221. data/lib/hecks/language/bluebook/bluebook.bluebook +11 -0
  222. data/lib/hecks/language/bluebook/query.bluebook +7 -0
  223. data/lib/hecks/language/bluebook/vocabulary.bluebook +4 -4
  224. data/lib/hecks/language/hecksagon/domain_port.bluebook +10 -0
  225. data/lib/hecks/language/hecksagon/hecksagon.bluebook +20 -0
  226. data/lib/hecks/mcp_stdio_guard.rb +2 -2
  227. data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
  228. data/lib/hecks/persistence_legacy_fixture.rb +113 -0
  229. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +8 -5
  230. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +4 -1
  231. data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +15 -2
  232. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +1 -1
  233. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +1 -1
  234. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +1 -1
  235. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +32 -15
  236. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +6 -3
  237. data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +227 -0
  238. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +1 -1
  239. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +43 -24
  240. data/lib/hecks/ports/persistence/plugins/era/translation.rb +1 -0
  241. data/lib/hecks/ports/persistence/state_codec.rb +24 -5
  242. data/lib/hecks/projection_files.rb +285 -0
  243. data/lib/hecks/projections/bootstrap_table.rb +1 -1
  244. data/lib/hecks/projections/deploy/fargate.rb +5 -5
  245. data/lib/hecks/projections/deploy/lambda.rb +43 -32
  246. data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
  247. data/lib/hecks/projections/deploy/preview/template.rb +1 -1
  248. data/lib/hecks/projections/deploy/scripts/deploy-service.sh.tmpl +1 -1
  249. data/lib/hecks/projections/deploy/scripts/expected-era.header +1 -1
  250. data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +3 -3
  251. data/lib/hecks/projections/deploy/scripts/smoke-after-deploy.sh.tmpl +1 -1
  252. data/lib/hecks/projections/deploy/shared.rb +1 -1
  253. data/lib/hecks/projections/diagrams.rb +3 -3
  254. data/lib/hecks/projections/model/deviations.rb +1 -1
  255. data/lib/hecks/projections/parser_table.rb +4 -4
  256. data/lib/hecks/projections/reference.rb +2 -3
  257. data/lib/hecks/projections/rust_vocabulary.rb +1 -1
  258. data/lib/hecks/projector/cli_projector.rb +106 -37
  259. data/lib/hecks/projector.rb +1 -1
  260. data/lib/hecks/quality_control/adapters/agent.adapter +7 -0
  261. data/lib/hecks/quality_control/adapters/agent.rb +58 -0
  262. data/lib/hecks/quality_control/adapters/angle_tools.adapter +7 -0
  263. data/lib/hecks/quality_control/adapters/angle_tools.rb +15 -0
  264. data/lib/hecks/quality_control/adapters/clearance_recorder.rb +36 -0
  265. data/lib/hecks/quality_control/adapters/clearance_tools.adapter +7 -0
  266. data/lib/hecks/quality_control/adapters/clearance_tools.rb +17 -0
  267. data/lib/hecks/quality_control/adapters/git_pr.adapter +7 -0
  268. data/lib/hecks/quality_control/adapters/git_pr.rb +226 -0
  269. data/lib/hecks/quality_control/adapters/github_checks.adapter +9 -0
  270. data/lib/hecks/quality_control/adapters/github_checks.rb +83 -0
  271. data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +56 -0
  272. data/lib/hecks/quality_control/adapters/github_issues.adapter +7 -0
  273. data/lib/hecks/quality_control/adapters/github_issues.rb +49 -0
  274. data/lib/hecks/quality_control/adapters/qa_tool.rb +59 -0
  275. data/lib/hecks/quality_control/adapters/sweep_tools.adapter +7 -0
  276. data/lib/hecks/quality_control/adapters/sweep_tools.rb +51 -0
  277. data/lib/hecks/quality_control/adapters/target_tools.adapter +7 -0
  278. data/lib/hecks/quality_control/adapters/target_tools.rb +43 -0
  279. data/lib/hecks/quality_control/cli/child.rb +45 -0
  280. data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +45 -0
  281. data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +248 -0
  282. data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +163 -0
  283. data/lib/hecks/quality_control/cli/qa_generated_domains.rb +450 -0
  284. data/lib/hecks/quality_control/cli/qa_log_bug.rb +195 -0
  285. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +220 -0
  286. data/lib/hecks/quality_control/cli/qa_open_pr.rb +305 -0
  287. data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +154 -0
  288. data/lib/hecks/quality_control/cli/qa_postgres_role.rb +159 -0
  289. data/lib/hecks/quality_control/cli/qa_pr_check.rb +232 -0
  290. data/lib/hecks/quality_control/cli/qa_seed_angles.rb +142 -0
  291. data/lib/hecks/quality_control/cli/qa_seed_targets.rb +69 -0
  292. data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +280 -0
  293. data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +329 -0
  294. data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +92 -0
  295. data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +117 -0
  296. data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +175 -0
  297. data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +60 -0
  298. data/lib/hecks/quality_control/cli/qa_sweep.rb +611 -0
  299. data/lib/hecks/quality_control/cli/qa_tick.rb +274 -0
  300. data/lib/hecks/quality_control/quality_control.bluebook +2224 -0
  301. data/lib/hecks/quality_control/quality_control.hecksagon +13 -0
  302. data/lib/hecks/quality_control/quality_control.ports.hecksagon +54 -0
  303. data/lib/hecks/query_ir.rb +346 -0
  304. data/lib/hecks/query_ir_mcp.rb +198 -0
  305. data/lib/hecks/release/runner/ci_publisher.rb +2 -2
  306. data/lib/hecks/release/runner/clean_tree.rb +42 -0
  307. data/lib/hecks/release/runner/console.rb +6 -0
  308. data/lib/hecks/release/runner/gem_publisher.rb +14 -7
  309. data/lib/hecks/release/runner/npm_publisher.rb +6 -36
  310. data/lib/hecks/release/runner/preflight.rb +26 -2
  311. data/lib/hecks/release/runner/published.rb +8 -26
  312. data/lib/hecks/release/runner/tagger.rb +30 -15
  313. data/lib/hecks/release/runner.rb +57 -6
  314. data/lib/hecks/router/namespace_installer.rb +3 -3
  315. data/lib/hecks/runtime/adapter_lookup.rb +124 -0
  316. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +4 -0
  317. data/lib/hecks/runtime/dependency_planning.rb +20 -2
  318. data/lib/hecks/runtime/dispatcher.rb +53 -3
  319. data/lib/hecks/runtime/interpreting.rb +3 -0
  320. data/lib/hecks/runtime/loader.rb +65 -12
  321. data/lib/hecks/runtime/outbox.rb +1 -1
  322. data/lib/hecks/runtime/policy_interpreter.rb +5 -2
  323. data/lib/hecks/runtime/port_operation_interpreter.rb +2 -10
  324. data/lib/hecks/runtime/query_interpreter.rb +77 -0
  325. data/lib/hecks/runtime/reaction_outcome.rb +89 -0
  326. data/lib/hecks/runtime/refusal_wording.rb +23 -1
  327. data/lib/hecks/runtime/registry/verification.rb +163 -4
  328. data/lib/hecks/runtime/registry.rb +57 -3
  329. data/lib/hecks/runtime/remote_dispatcher.rb +31 -2
  330. data/lib/hecks/runtime/value/coercion.rb +23 -135
  331. data/lib/hecks/runtime/value/field_checks.rb +172 -0
  332. data/lib/hecks/runtime/value.rb +4 -1
  333. data/lib/hecks/runtime.rb +20 -6
  334. data/lib/hecks/rust_build/conformance.rb +158 -0
  335. data/lib/hecks/rust_build/conformance_fuzz.rb +71 -0
  336. data/lib/hecks/rust_build/coverage.rb +218 -0
  337. data/lib/hecks/rust_build/native_build.rb +124 -0
  338. data/lib/hecks/rust_build/project_rust/root_mod.rb +120 -0
  339. data/lib/hecks/rust_build/project_rust.rb +332 -0
  340. data/lib/hecks/rust_build/wasm.rb +105 -0
  341. data/lib/hecks/rust_build/wasm_browser.rb +113 -0
  342. data/lib/hecks/rust_build.rb +144 -0
  343. data/lib/hecks/storehouse.rb +16 -16
  344. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +2 -2
  345. data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +1 -1
  346. data/lib/hecks/three_zero/forms.yml +127 -0
  347. data/lib/hecks/three_zero.rb +12 -0
  348. data/lib/hecks/tools/argument_gate_matrix.rb +316 -0
  349. data/lib/hecks/tools/comment_style.rb +1070 -0
  350. data/lib/hecks/tools/corpus_report.rb +87 -0
  351. data/lib/hecks/tools/deploy_recipe.rb +255 -0
  352. data/lib/hecks/tools/deploy_recipe_lint.rb +282 -0
  353. data/lib/hecks/tools/drop_implicit_append_fields.rb +95 -0
  354. data/lib/hecks/tools/era_projection_backfill.rb +94 -0
  355. data/lib/hecks/tools/era_reattest.rb +146 -0
  356. data/lib/hecks/tools/evolve_run.rb +189 -0
  357. data/lib/hecks/tools/fuzz_sweep.rb +373 -0
  358. data/lib/hecks/tools/heki_compaction.rb +100 -0
  359. data/lib/hecks/tools/hoist_local_givens.rb +246 -0
  360. data/lib/hecks/tools/journal_compaction.rb +89 -0
  361. data/lib/hecks/tools/oidc_manifests.rb +70 -0
  362. data/lib/hecks/tools/query_ir_run.rb +81 -0
  363. data/lib/hecks/tools/regeneration_run.rb +166 -0
  364. data/lib/hecks/tools/rust_comment_style.rb +642 -0
  365. data/lib/hecks/tools/sequence_script.rb +62 -0
  366. data/lib/hecks/tools/tail_merge.rb +117 -0
  367. data/lib/hecks/tools/tenant_provisioning.rb +142 -0
  368. data/lib/hecks/tools/translation_audit.rb +208 -0
  369. data/lib/hecks/tools/translation_scaffold.rb +131 -0
  370. data/lib/hecks/tools.rb +86 -0
  371. data/lib/hecks/version.rb +1 -1
  372. data/lib/hecks.rb +32 -15
  373. data/qa/settings.yml +66 -0
  374. data/rust/.cargo/config.toml +6 -0
  375. data/rust/.gitignore +2 -0
  376. data/rust/Cargo.lock +54 -0
  377. data/rust/Cargo.toml +61 -0
  378. data/rust/build/.cargo/config.toml +3 -0
  379. data/rust/build/.gitignore +1 -0
  380. data/rust/build/Cargo.lock +7 -0
  381. data/rust/build/Cargo.toml +19 -0
  382. data/rust/build/src/build_artifact.rs +47 -0
  383. data/rust/build/src/cargo_sync.rs +248 -0
  384. data/rust/build/src/json.rs +421 -0
  385. data/rust/build/src/lineage_pass.rs +285 -0
  386. data/rust/build/src/main.rs +51 -0
  387. data/rust/build/src/optional_pass.rs +150 -0
  388. data/rust/build/src/pipeline.rs +264 -0
  389. data/rust/build/src/reserved_names.rs +76 -0
  390. data/rust/build/src/resolve.rs +124 -0
  391. data/rust/build/src/root.rs +25 -0
  392. data/rust/build/src/sidecars.rs +73 -0
  393. data/rust/build/src/subprocess.rs +51 -0
  394. data/rust/build/src/tmp.rs +31 -0
  395. data/rust/codegen/.cargo/config.toml +3 -0
  396. data/rust/codegen/.gitignore +1 -0
  397. data/rust/codegen/Cargo.lock +7 -0
  398. data/rust/codegen/Cargo.toml +20 -0
  399. data/rust/codegen/src/attr.rs +32 -0
  400. data/rust/codegen/src/bridging.rs +481 -0
  401. data/rust/codegen/src/commands.rs +1226 -0
  402. data/rust/codegen/src/constraints.rs +109 -0
  403. data/rust/codegen/src/dependency_planning.rs +209 -0
  404. data/rust/codegen/src/domain_generator.rs +1288 -0
  405. data/rust/codegen/src/exemplar.rs +230 -0
  406. data/rust/codegen/src/expr_emitter.rs +87 -0
  407. data/rust/codegen/src/fielded.rs +192 -0
  408. data/rust/codegen/src/hecks_naming.rs +33 -0
  409. data/rust/codegen/src/json.rs +335 -0
  410. data/rust/codegen/src/json_codec.rs +697 -0
  411. data/rust/codegen/src/literal.rs +207 -0
  412. data/rust/codegen/src/main.rs +290 -0
  413. data/rust/codegen/src/manifest.rs +227 -0
  414. data/rust/codegen/src/mutations.rs +784 -0
  415. data/rust/codegen/src/naming.rs +286 -0
  416. data/rust/codegen/src/ports.rs +208 -0
  417. data/rust/codegen/src/prelude.rs +116 -0
  418. data/rust/codegen/src/queries.rs +786 -0
  419. data/rust/codegen/src/reactions.rs +532 -0
  420. data/rust/codegen/src/read_models.rs +697 -0
  421. data/rust/codegen/src/reference_specs.rs +40 -0
  422. data/rust/codegen/src/registry.rs +966 -0
  423. data/rust/codegen/src/reserved_names.rs +76 -0
  424. data/rust/codegen/src/shared.rs +93 -0
  425. data/rust/codegen/src/skip_reason.rs +25 -0
  426. data/rust/codegen/src/types.rs +362 -0
  427. data/rust/host/.cargo/config.toml +3 -0
  428. data/rust/host/.gitignore +1 -0
  429. data/rust/host/Cargo.lock +4297 -0
  430. data/rust/host/Cargo.toml +61 -0
  431. data/rust/host/HECKS_RELEASE +1 -0
  432. data/rust/host/rds-ca-bundle.pem +2736 -0
  433. data/rust/host/src/api.rs +1596 -0
  434. data/rust/host/src/approval.rs +652 -0
  435. data/rust/host/src/auth.rs +1287 -0
  436. data/rust/host/src/bin/expr_harness.rs +46 -0
  437. data/rust/host/src/bin/lineage_harness.rs +119 -0
  438. data/rust/host/src/bin/mint_harness.rs +135 -0
  439. data/rust/host/src/checkout.rs +265 -0
  440. data/rust/host/src/dispatch.rs +1443 -0
  441. data/rust/host/src/expr_json.rs +1117 -0
  442. data/rust/host/src/field_hints.rs +52 -0
  443. data/rust/host/src/ir.rs +733 -0
  444. data/rust/host/src/journal.rs +874 -0
  445. data/rust/host/src/lambda_client.rs +378 -0
  446. data/rust/host/src/log.rs +147 -0
  447. data/rust/host/src/main.rs +474 -0
  448. data/rust/host/src/mint.rs +1865 -0
  449. data/rust/host/src/payments/keystore.rs +330 -0
  450. data/rust/host/src/payments/tests.rs +1400 -0
  451. data/rust/host/src/payments.rs +767 -0
  452. data/rust/host/src/presentation.rs +698 -0
  453. data/rust/host/src/presentation_write.rs +1431 -0
  454. data/rust/host/src/query_step.rs +149 -0
  455. data/rust/host/src/rate_limit.rs +904 -0
  456. data/rust/host/src/reference_transform.rs +241 -0
  457. data/rust/host/src/reference_validate.rs +338 -0
  458. data/rust/host/src/resend.rs +296 -0
  459. data/rust/host/src/secrets.rs +106 -0
  460. data/rust/host/src/server.rs +663 -0
  461. data/rust/host/src/storage_shape.rs +175 -0
  462. data/rust/host/src/test_pg.rs +40 -0
  463. data/rust/host/src/ui_schema.rs +1351 -0
  464. data/rust/host/src/wasm_runner.rs +191 -0
  465. data/rust/host/src/web/newsletter/cooldown.rs +126 -0
  466. data/rust/host/src/web/newsletter/tests.rs +104 -0
  467. data/rust/host/src/web/newsletter.rs +310 -0
  468. data/rust/host/src/web/newsletter_send.rs +357 -0
  469. data/rust/host/src/web/registrations.rs +1505 -0
  470. data/rust/host/src/web.rs +2937 -0
  471. data/rust/lsp/.gitignore +1 -0
  472. data/rust/lsp/Cargo.lock +7 -0
  473. data/rust/lsp/Cargo.toml +16 -0
  474. data/rust/lsp/README.md +133 -0
  475. data/rust/lsp/src/diagnostics.rs +165 -0
  476. data/rust/lsp/src/json.rs +385 -0
  477. data/rust/lsp/src/main.rs +399 -0
  478. data/rust/lsp/src/outline.rs +177 -0
  479. data/rust/lsp/src/rpc.rs +67 -0
  480. data/rust/parser/.cargo/config.toml +5 -0
  481. data/rust/parser/.gitignore +1 -0
  482. data/rust/parser/Cargo.lock +7 -0
  483. data/rust/parser/Cargo.toml +21 -0
  484. data/rust/parser/src/build/closed_sets.rs +27 -0
  485. data/rust/parser/src/build/identity.rs +276 -0
  486. data/rust/parser/src/build/mod.rs +12 -0
  487. data/rust/parser/src/build/naming.rs +141 -0
  488. data/rust/parser/src/build/pattern_subset.rs +161 -0
  489. data/rust/parser/src/build/query_derive.rs +72 -0
  490. data/rust/parser/src/build/query_inference.rs +269 -0
  491. data/rust/parser/src/build/query_options.rs +100 -0
  492. data/rust/parser/src/build/read_model.rs +94 -0
  493. data/rust/parser/src/build/references.rs +32 -0
  494. data/rust/parser/src/canonical.rs +114 -0
  495. data/rust/parser/src/diag.rs +55 -0
  496. data/rust/parser/src/emit.rs +953 -0
  497. data/rust/parser/src/expr/ast_json.rs +147 -0
  498. data/rust/parser/src/expr/evaluator.rs +81 -0
  499. data/rust/parser/src/expr/mod.rs +84 -0
  500. data/rust/parser/src/expr/resolver.rs +497 -0
  501. data/rust/parser/src/ir.rs +387 -0
  502. data/rust/parser/src/keywords.rs +585 -0
  503. data/rust/parser/src/lex.rs +662 -0
  504. data/rust/parser/src/main.rs +252 -0
  505. data/rust/parser/src/parse/aggregate.rs +612 -0
  506. data/rust/parser/src/parse/chapter.rs +517 -0
  507. data/rust/parser/src/parse/command.rs +637 -0
  508. data/rust/parser/src/parse/domain_port.rs +127 -0
  509. data/rust/parser/src/parse/entity.rs +527 -0
  510. data/rust/parser/src/parse/file.rs +67 -0
  511. data/rust/parser/src/parse/hecksagon.rs +231 -0
  512. data/rust/parser/src/parse/lifecycle.rs +162 -0
  513. data/rust/parser/src/parse/mod.rs +1262 -0
  514. data/rust/parser/src/parse/policy.rs +87 -0
  515. data/rust/parser/src/parse/process_manager.rs +305 -0
  516. data/rust/parser/src/parse/query.rs +100 -0
  517. data/rust/parser/src/parse/read_model.rs +214 -0
  518. data/rust/parser/src/parse/value_object.rs +250 -0
  519. data/rust/parser/src/ruby_value.rs +422 -0
  520. data/rust/project/bridging.rb +257 -0
  521. data/rust/project/commands.rb +877 -0
  522. data/rust/project/constraints.rb +86 -0
  523. data/rust/project/dependency_planning.rb +178 -0
  524. data/rust/project/domain_generator.rb +980 -0
  525. data/rust/project/exemplar.rb +148 -0
  526. data/rust/project/expr_emitter.rb +72 -0
  527. data/rust/project/fielded.rb +141 -0
  528. data/rust/project/json_codec.rb +641 -0
  529. data/rust/project/mutations.rb +721 -0
  530. data/rust/project/naming.rb +205 -0
  531. data/rust/project/ports.rb +65 -0
  532. data/rust/project/queries.rb +493 -0
  533. data/rust/project/reactions.rb +317 -0
  534. data/rust/project/read_models.rb +690 -0
  535. data/rust/project/reference_specs.rb +27 -0
  536. data/rust/project/registry.rb +396 -0
  537. data/rust/project/skip_reason.rb +29 -0
  538. data/rust/project/types.rb +225 -0
  539. data/rust/project/write_if_changed.rb +83 -0
  540. data/rust/project.rb +30 -0
  541. data/rust/project_rust_pipeline.rb +383 -0
  542. data/rust/src/exemplar/commands.rs +279 -0
  543. data/rust/src/exemplar/constraints.rs +18 -0
  544. data/rust/src/exemplar/fielded.rs +280 -0
  545. data/rust/src/exemplar/json.rs +277 -0
  546. data/rust/src/exemplar/mod.rs +17 -0
  547. data/rust/src/exemplar/mutations.rs +80 -0
  548. data/rust/src/exemplar/queries.rs +33 -0
  549. data/rust/src/exemplar/reactions.rs +88 -0
  550. data/rust/src/exemplar/read_models.rs +48 -0
  551. data/rust/src/exemplar/registry.rs +166 -0
  552. data/rust/src/exemplar/types.rs +44 -0
  553. data/rust/src/kernel/attribute_shapes/composite.rs +88 -0
  554. data/rust/src/kernel/attribute_shapes/list.rs +18 -0
  555. data/rust/src/kernel/attribute_shapes/mod.rs +44 -0
  556. data/rust/src/kernel/attribute_shapes/optional.rs +9 -0
  557. data/rust/src/kernel/attribute_shapes/scalar.rs +39 -0
  558. data/rust/src/kernel/cli.rs +585 -0
  559. data/rust/src/kernel/dispatch.rs +1090 -0
  560. data/rust/src/kernel/expr.rs +458 -0
  561. data/rust/src/kernel/expression_operators/arithmetic.rs +128 -0
  562. data/rust/src/kernel/expression_operators/comparison.rs +48 -0
  563. data/rust/src/kernel/expression_operators/enumeration.rs +232 -0
  564. data/rust/src/kernel/expression_operators/logical.rs +13 -0
  565. data/rust/src/kernel/expression_operators/membership.rs +18 -0
  566. data/rust/src/kernel/expression_operators/mod.rs +68 -0
  567. data/rust/src/kernel/expression_operators/pattern_match.rs +73 -0
  568. data/rust/src/kernel/expression_operators/positional.rs +126 -0
  569. data/rust/src/kernel/expression_operators/presence.rs +101 -0
  570. data/rust/src/kernel/expression_operators/sign_test.rs +16 -0
  571. data/rust/src/kernel/expression_operators/sized.rs +35 -0
  572. data/rust/src/kernel/expression_operators/text.rs +79 -0
  573. data/rust/src/kernel/expression_operators/to_string.rs +18 -0
  574. data/rust/src/kernel/json.rs +779 -0
  575. data/rust/src/kernel/mod.rs +133 -0
  576. data/rust/src/kernel/named_query.rs +219 -0
  577. data/rust/src/kernel/orchestrate.rs +1810 -0
  578. data/rust/src/kernel/pattern.rs +307 -0
  579. data/rust/src/kernel/query_comparators.rs +206 -0
  580. data/rust/src/kernel/query_ordering.rs +103 -0
  581. data/rust/src/kernel/read_model.rs +914 -0
  582. data/rust/src/kernel/reference_lookup.rs +149 -0
  583. data/rust/src/kernel/repository.rs +468 -0
  584. data/rust/src/kernel/routing.rs +612 -0
  585. data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +118 -0
  586. data/rust/src/kernel/vocab/entity_dispatch_order.rs +114 -0
  587. data/rust/src/kernel/vocab/field_hint.rs +70 -0
  588. data/rust/src/kernel/vocab/mod.rs +20 -0
  589. data/rust/src/kernel/vocab/query_comparator.rs +65 -0
  590. data/rust/src/kernel/vocab/refusal_template.rs +1592 -0
  591. data/rust/src/lib.rs +8 -0
  592. data/rust/src/main.rs +16 -0
  593. data/rust/web/.gitignore +1 -0
  594. data/rust/web/Cargo.lock +119 -0
  595. data/rust/web/Cargo.toml +18 -0
  596. data/rust/web/src/lib.rs +8 -0
  597. metadata +477 -12
  598. data/lib/hecks/facade/cli_door.rb +0 -96
  599. data/lib/hecks/facade/cli_runner.rb +0 -127
  600. data/lib/hecks/mcp_door_scope.rb +0 -95
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "monitor"
4
+ require "tempfile"
5
+ require_relative "hecks/adapters/console_capture"
6
+
7
+ module Hecks
8
+ # The tools that generate a domain's Rust source, compile it and check the build against the Ruby
9
+ # engine, carried in the gem so a caller reaches them in this process.
10
+ #
11
+ # Each tool is a module with `call(argv) -> Integer`: it reads its arguments as a command line
12
+ # would give them, prints its report to `$stdout` and its complaints to `$stderr`, reads
13
+ # `ENV` for its settings, and answers an exit status. `run` and `capture` are the entry points:
14
+ # they hand a tool the streams and environment it is asked to use for the length of one call,
15
+ # and turn a refusal (`Failure`, `abort`, an unexpected error) into a status and a message. The
16
+ # `hecks project_rust` family of verbs runs them through `run`.
17
+ module RustBuild
18
+ # The gem's root directory, where `lib/` and `rust/` live.
19
+ ROOT = File.expand_path("../..", __dir__)
20
+
21
+ # Raised by a tool to refuse, with the reason as the message.
22
+ class Failure < StandardError; end
23
+
24
+ # What one captured call did: `out` and `err` (what the tool printed) and its exit `status`.
25
+ Result = Struct.new(:out, :err, :status) do
26
+ # @return [Boolean] whether the tool succeeded
27
+ def ok? = status.zero?
28
+ end
29
+
30
+ # Tool name to the file that defines it and the constant it defines.
31
+ TOOLS = {
32
+ "project_rust" => ["rust_build/project_rust", :ProjectRust],
33
+ "project_wasm" => ["rust_build/wasm", :Wasm],
34
+ "project_wasm_browser" => ["rust_build/wasm_browser", :WasmBrowser],
35
+ "rust_conformance" => ["rust_build/conformance", :Conformance],
36
+ "rust_conformance_fuzz" => ["rust_build/conformance_fuzz", :ConformanceFuzz],
37
+ "rust_coverage" => ["rust_build/coverage", :Coverage]
38
+ }.freeze
39
+
40
+ # The process-wide lock a call holds while it swaps `ENV`, `$stdout` and `$stderr`; the same
41
+ # lock `ConsoleCapture` holds, so a build and a capture never interleave.
42
+ LOCK = Hecks::Adapters::ConsoleCapture::LOCK
43
+ private_constant :LOCK
44
+
45
+ class << self
46
+ # The workspace tools build in: `HECKS_RUST_DIR`, or the gem's own `rust/`.
47
+ #
48
+ # @return [String] the directory
49
+ def rust_dir = ENV.fetch("HECKS_RUST_DIR", File.join(ROOT, "rust"))
50
+
51
+ # Runs a tool with the given environment, writing to the given streams.
52
+ #
53
+ # The process's `ENV`, `$stdout` and `$stderr` are replaced for the length of the call, so
54
+ # calls are serialized.
55
+ #
56
+ # @param tool [String] a key of `TOOLS`
57
+ # @param argv [Array<String>] the tool's arguments
58
+ # @param env [Hash{String => String, nil}] variables to set for the call (nil removes one)
59
+ # @param out [IO] where the tool's stdout goes; must be a real IO (a file or the terminal)
60
+ # @param err [IO] where the tool's stderr goes
61
+ # @return [Integer] the exit status
62
+ def run(tool, argv, env: {}, out: $stdout, err: $stderr)
63
+ LOCK.synchronize do
64
+ with_env(env) do
65
+ with_streams(out, err) { finish(tool, argv) }
66
+ end
67
+ end
68
+ end
69
+
70
+ # Runs a program, its output going where the running tool's output goes.
71
+ #
72
+ # @param command [Array<String>] the program and its arguments
73
+ # @param chdir [String, nil] the directory to run it in
74
+ # @param env [Hash{String => String}] variables to set for it
75
+ # @return [void]
76
+ # @raise [Failure] when it cannot start or ends non-zero
77
+ def command!(*command, chdir: nil, env: {})
78
+ options = { out: $stdout, err: $stderr }
79
+ options[:chdir] = chdir if chdir
80
+ return if system(env, *command, **options)
81
+
82
+ raise Failure, "`#{command.join(' ')}` failed#{" in #{chdir}" if chdir}"
83
+ end
84
+
85
+ # Runs a tool and holds what it printed.
86
+ #
87
+ # @param tool [String] a key of `TOOLS`
88
+ # @param argv [Array<String>] the tool's arguments
89
+ # @param env [Hash{String => String, nil}] variables to set for the call
90
+ # @return [Result] what it printed, and how it ended
91
+ def capture(tool, argv, env: {})
92
+ Tempfile.create("rust_build_out") do |out|
93
+ Tempfile.create("rust_build_err") do |err|
94
+ status = run(tool, argv, env: env, out: out, err: err)
95
+ [out, err].each(&:flush)
96
+ Result.new(File.read(out.path), File.read(err.path), status)
97
+ end
98
+ end
99
+ end
100
+
101
+ # Sets variables for the block and puts them back after, for a nested tool call.
102
+ #
103
+ # @param env [Hash{String => String, nil}] variables to set (nil removes one)
104
+ # @yield the work to do under those variables
105
+ # @return [Object] the block's value
106
+ def with_env(env)
107
+ LOCK.synchronize do
108
+ saved = env.keys.to_h { |key| [key, ENV.fetch(key, nil)] }
109
+ begin
110
+ env.each { |key, value| ENV[key] = value }
111
+ yield
112
+ ensure
113
+ saved.each { |key, value| ENV[key] = value }
114
+ end
115
+ end
116
+ end
117
+
118
+ private
119
+
120
+ def with_streams(out, err)
121
+ saved = [$stdout, $stderr]
122
+ $stdout = out
123
+ $stderr = err
124
+ yield
125
+ ensure
126
+ $stdout, $stderr = saved
127
+ end
128
+
129
+ def finish(tool, argv)
130
+ file, constant = TOOLS.fetch(tool)
131
+ require_relative file
132
+ RustBuild.const_get(constant).call(argv)
133
+ rescue Failure => e
134
+ warn e.message
135
+ 1
136
+ rescue SystemExit => e
137
+ e.status
138
+ rescue StandardError, ScriptError => e
139
+ warn "#{tool}: #{e.class}: #{e.message}"
140
+ 1
141
+ end
142
+ end
143
+ end
144
+ end
@@ -2,8 +2,8 @@ require "json"
2
2
  require "fileutils"
3
3
  require "time"
4
4
  require_relative "cache_dir"
5
- require_relative "facade/command_request"
6
- require_relative "facade/json_door"
5
+ require_relative "doors/command_request"
6
+ require_relative "doors/json_door"
7
7
  require_relative "naming"
8
8
  require_relative "projector"
9
9
  require_relative "runtime/errors"
@@ -56,7 +56,7 @@ module Hecks
56
56
  end
57
57
 
58
58
  # The same alias table CliRunner resolves against, kept here so dispatch
59
- # and query never drift from what a human typing bin/run sees.
59
+ # and query never drift from what a human typing hecks run sees.
60
60
  # :nodoc:
61
61
  def resolve!(cli, name, asking:)
62
62
  pool = asking ? cli[:questions] : cli[:verbs]
@@ -185,9 +185,9 @@ module Hecks
185
185
  cli = Projector.call(:cli, bluebook: bluebook, options: { program: "mcp" })
186
186
  spec = resolve!(cli, command, asking: false)
187
187
  require_caller_for_role_gated!(spec, role)
188
- envelope = Facade::CommandRequest.normalize(Facade::JsonDoor.deep_symbolize(args),
189
- receiver: spec[:receiver],
190
- legacy_receiver: spec[:legacy_receiver])
188
+ envelope = Doors::CommandRequest.normalize(Doors::JsonDoor.deep_symbolize(args),
189
+ receiver: spec[:receiver],
190
+ legacy_receiver: spec[:legacy_receiver])
191
191
 
192
192
  result = with_caller(role, actor_id) do
193
193
  dry_run ? dry_run_outcome(runtime, spec, envelope, summary: summary) : real_dispatch(runtime, spec, envelope, summary)
@@ -200,8 +200,8 @@ module Hecks
200
200
  result = runtime.dispatch_flat(spec[:verb], envelope)
201
201
  ok(summary: summary,
202
202
  id: result.id,
203
- state: result.state.nil? ? nil : Facade::JsonDoor.materialize(result.state),
204
- events: result.events.map { |event| { name: event.name, payload: Facade::JsonDoor.materialize(event.payload) } })
203
+ state: result.state.nil? ? nil : Doors::JsonDoor.materialize(result.state),
204
+ events: result.events.map { |event| { name: event.name, payload: Doors::JsonDoor.materialize(event.payload) } })
205
205
  end
206
206
 
207
207
  # :nodoc:
@@ -228,7 +228,7 @@ module Hecks
228
228
  def dispatch_batch(runtime:, steps:, summary:, source: nil, role: nil, actor_id: nil)
229
229
  require_summary!(summary)
230
230
  results = Array(steps).map do |raw|
231
- step = Facade::JsonDoor.deep_symbolize(raw)
231
+ step = Doors::JsonDoor.deep_symbolize(raw)
232
232
  dispatch(runtime: runtime, command: step[:command], args: step[:args] || {},
233
233
  summary: summary, source: source, role: role, actor_id: actor_id)
234
234
  end
@@ -268,9 +268,9 @@ module Hecks
268
268
  valid_caller!(role, actor_id)
269
269
  cli = Projector.call(:cli, bluebook: bluebook, options: { program: "mcp" })
270
270
  spec = resolve!(cli, question, asking: true)
271
- rows = with_caller(role, actor_id) { runtime.query(spec[:verb], **Facade::JsonDoor.deep_symbolize(args)) }
271
+ rows = with_caller(role, actor_id) { runtime.query(spec[:verb], **Doors::JsonDoor.deep_symbolize(args)) }
272
272
 
273
- ok(summary: summary, rows: rows.map { |row| Facade::JsonDoor.materialize(row) }).merge(verb: spec[:verb])
273
+ ok(summary: summary, rows: rows.map { |row| Doors::JsonDoor.materialize(row) }).merge(verb: spec[:verb])
274
274
  end
275
275
 
276
276
  # Reads one aggregate's stored records directly, bypassing any declared
@@ -303,9 +303,9 @@ module Hecks
303
303
  if id
304
304
  instance = repository.find(id) or
305
305
  raise Runtime::NotFound, "no #{ir.hecks_name} found for id #{id.inspect}"
306
- ok(summary: summary, record: Facade::JsonDoor.materialize(instance.to_h))
306
+ ok(summary: summary, record: Doors::JsonDoor.materialize(instance.to_h))
307
307
  else
308
- records = repository.all.map { |instance| Facade::JsonDoor.materialize(instance.to_h) }
308
+ records = repository.all.map { |instance| Doors::JsonDoor.materialize(instance.to_h) }
309
309
  ok(summary: summary, count: records.length, records: records)
310
310
  end
311
311
  end
@@ -346,7 +346,7 @@ module Hecks
346
346
  end
347
347
 
348
348
  # One aggregate's (or the whole chapter's) full usage documentation — the
349
- # same document bin/docs renders for a human.
349
+ # same document hecks docs renders for a human.
350
350
  #
351
351
  # @param runtime [Runtime::Registry] the booted domain to describe
352
352
  # @param aggregate [String, Symbol, nil] one aggregate's name, or nil for the
@@ -373,7 +373,7 @@ module Hecks
373
373
  # @return [Hash] {ok: true, domain:, valid: true} plus :findings when deep;
374
374
  # {ok: false, domain:, valid: false, error:} if the boot itself failed
375
375
  def validate(domain:, deep: false)
376
- runtime = Hecks.boot(confine!(domain, "domain"), install_facade: false)
376
+ runtime = Hecks.boot(confine!(domain, "domain"), install_doors: false)
377
377
  result = { ok: true, domain: domain, valid: true }
378
378
 
379
379
  if deep
@@ -407,7 +407,7 @@ module Hecks
407
407
 
408
408
  # :nodoc:
409
409
  def journal_entries(repository)
410
- repository.entries.map { |entry| { operation: entry.operation, id: entry.id, state: Facade::JsonDoor.materialize(entry.state) } }
410
+ repository.entries.map { |entry| { operation: entry.operation, id: entry.id, state: Doors::JsonDoor.materialize(entry.state) } }
411
411
  end
412
412
 
413
413
  # Runs a domain's hand-curated .behaviors examples and reports the results.
@@ -17,7 +17,7 @@ Hecks.bluebook "Tenancy" do
17
17
  attribute :status, Status, default: { value: "Active" }
18
18
 
19
19
  value_object "Slug" do
20
- attribute :value, String, pattern: '^[a-z][a-z0-9_]*$'
20
+ attribute :value, String, pattern: '\A[a-z][a-z0-9_]*\z'
21
21
  invariant("a tenant slug is named") { !value.to_s.empty? }
22
22
  end
23
23
 
@@ -32,7 +32,7 @@ Hecks.bluebook "Tenancy" do
32
32
  end
33
33
 
34
34
  value_object "Schema" do
35
- attribute :value, String, pattern: '^[a-z][a-z0-9_]*$'
35
+ attribute :value, String, pattern: '\A[a-z][a-z0-9_]*\z'
36
36
  invariant("a schema is named") { !value.to_s.empty? }
37
37
  end
38
38
 
@@ -6,7 +6,7 @@ Hecks.hecksagon "Tenancy" do
6
6
  # `with:` is required: the event payload also carries the port's dispatch-time args, which
7
7
  # `Register` does not declare and would refuse.
8
8
  #
9
- # Check with `bin/model_check lib/hecks/deploy lib/hecks/tenancy` in one run; alone, the
9
+ # Check with `hecks model_check lib/hecks/deploy lib/hecks/tenancy` in one run; alone, the
10
10
  # reaction to a foreign event reads as a deaf policy.
11
11
  translates "RegisterProvisionedTenant" do
12
12
  on Tenant::TenantProvisioned
@@ -0,0 +1,127 @@
1
+ # Each bin/ script and exe/hecks route, and the hecks 3.0 form that replaces it: the verb spelling the
2
+ # 3.0 launcher answers to (ADR 0080, section 7), with QualityControl verbs after `hecks quality_control`.
3
+ ---
4
+ argument_gate_matrix: hecks argument_gate_matrix [--confirm] (writes only with --confirm)
5
+ backfill_era_projections: hecks backfill_projections <domain>
6
+ behaviors: hecks run_behaviors subject=<path>
7
+ bench: hecks bench [domains=pizzas,banking] [targets=] [iterations=1000] [warmup=200]
8
+ [runs=3] [rust_binary=] [format=markdown] [output=]
9
+ canonicalise: hecks canonicalise <file.json>
10
+ check_engine_agreement: hecks check_engine_agreement
11
+ check_era: hecks check_era <url> expected=era-file [timeout=10]
12
+ codemod_hoist_local_givens: hecks hoist_local_givens --confirm
13
+ codemod_implicit_append_fields: hecks drop_implicit_append_fields --confirm
14
+ compact: hecks compact <domain> [aggregates=A,B] --confirm
15
+ console: hecks console [subject=<domain>]
16
+ corpus: hecks rust_domains; hecks regen_order; hecks corpus_rust_coverage
17
+ deploy_template_diff: hecks deploy diff before=a.yaml after=b.yaml [--json] [--strict]
18
+ doc_coverage: hecks measure_doc_coverage
19
+ docs: hecks docs [domain-path] [aggregate]
20
+ evolve: hecks word_status; hecks propose <word> context=X [body=none] [inner=] [opens=]
21
+ [fills=]; hecks admit|deprecate|retire <word> context=X; hecks rename <word> context=X
22
+ new_name=Y; hecks propose_argument <word> context=X kind=K [required=false] [at=N]
23
+ [named=] [fills=] [pairs_shape=]; hecks admit_argument|deprecate_argument|retire_argument
24
+ <word> context=X [at=N] [named=]
25
+ expression_projection: hecks project_expression_tables [--stdout]
26
+ follow: hecks follow <domain> [aggregate=Name] [since=N] [interval=0.5] [wait=N] [--from-now]
27
+ fuzz: hecks fuzz [domain] [seeds=20] [steps=30] [workers=] [adapter=memory]
28
+ generate: hecks generate_sequence <domain> [seed=1] [steps=30] [adversarial=0.0]
29
+ hecks_mcp_door: hecks mcp [--stdio]
30
+ hecks_query_ir_mcp: hecks serve_query_ir_mcp
31
+ heki_compact: hecks compact_heki <domain> [aggregates=A,B] --confirm
32
+ history: hecks history <domain>
33
+ ir: hecks ir <domain> [--translations] | hecks ir --meta
34
+ lint_deploy_recipes: hecks deploy lint [makefiles=a,b]
35
+ merge_tail: hecks merge_tail <domain> winners=id:old,id:new --confirm
36
+ model_check: hecks model_check [--strict] [--profile client] [<domain> …]
37
+ narrate: hecks narrate [domain-path] [aggregate]
38
+ pattern-cases: hecks record_pattern_cases
39
+ present: hecks present [port=4567]
40
+ project: hecks refresh_projections subject=<domain>
41
+ project_bootstrap_table: hecks project_bootstrap_table
42
+ project_cli: hecks project_cli [domain-path …]
43
+ project_deploy: hecks deploy project <domain> [tenant=] [schema=] [out=] [environment=]
44
+ project_diagrams: hecks project_diagrams <domain-path> <ChapterName>
45
+ project_field_hints: hecks project_field_hints
46
+ project_glossary: hecks glossary <domain> chapter=Name
47
+ project_kernel_capabilities: hecks project_kernel_capabilities
48
+ project_model: hecks project_model
49
+ project_oidc: hecks deploy project_oidc [domains=a,b]
50
+ project_parser_table: hecks project_parser_table
51
+ project_refusal_wording: hecks project_refusal_wording
52
+ project_reserved_names: hecks project_reserved_names
53
+ project_rust: hecks project_rust <domain>
54
+ project_rust_vocabulary: hecks project_rust_vocabulary
55
+ project_tenant: hecks deploy provision <domain_dir> slug=s domain= realm= schema=
56
+ database= [adapter=PostgresEra]; hecks deploy reprovision <tenant> directory= database=
57
+ [adapter=PostgresEra]
58
+ project_vocabulary: hecks project_vocabulary
59
+ project_wasm: hecks build_wasm <domain>
60
+ project_wasm_browser: hecks build_browser_wasm <domain>
61
+ qa_concurrency_racer: not user-facing; ProcessPool starts it as hecks quality_control
62
+ race domain= database= schema= verb= step_arguments=
63
+ qa_discover_external_domains: hecks quality_control discover_external_domains [arguments="--projects-dir
64
+ ~/Projects --max-depth 3 --known-path PATH …"]
65
+ qa_domain_novelty: hecks quality_control judge_novelty <domain> [arguments="--against
66
+ PATH …"]
67
+ qa_generated_domains: hecks quality_control check_generated_domains [arguments="--domains
68
+ 3 --start N --forms a,b --seeds 5 --steps 25 --adversarial 0.3 --rust --shrink-budget
69
+ 200 --domain-shrink-budget 40 --promote dir --name N --from-dials --blueprint F
70
+ --source F"]
71
+ qa_log_bug: hecks quality_control log sweep=<sweep id> reference= sequence=N title=
72
+ demonstration= symptom= expectation= submitter= [tags=a,b] [name=] [reproduced=yes|no]
73
+ qa_mine_combinations: hecks quality_control mine_combinations [arguments="--candidates
74
+ 3 --rust --seeds 5 --steps 25 --adversarial 0.3 --repair-rounds 1 --agent CMD --from
75
+ DIR --against PATH --brief"]
76
+ qa_open_pr: hecks quality_control patch.open bug=BUG#n number=N url=… branch=… commit=SHA
77
+ title=… [now=]; hecks quality_control improvement.open [angle=ANGLE-n] number=N
78
+ url=… branch=… title=… [now=]
79
+ qa_postgres_migrate: hecks quality_control migrate_ledger_from_heki domain=<domain_dir>
80
+ data=<heki_dir> [arguments="[aggregate …] --force"] (a dry run without --force)
81
+ qa_postgres_role: hecks quality_control create_ledger_role <database> [role=hecks_qa]
82
+ qa_pr_check: hecks quality_control check_pull_requests
83
+ qa_seed_angles: hecks quality_control angle.seed
84
+ qa_seed_targets: hecks quality_control target.seed
85
+ qa_sweep: hecks quality_control ask run [target=] [arguments="--all --seeds N --steps
86
+ N --adversarial F --role-draw F --dry-run F --self-consistency BOOL --modes a,b
87
+ --persistence-parity --no-parity"]; hecks quality_control release <target> [now=]
88
+ [next_streak=] [capabilities=] [yield_score=]
89
+ qa_tick: hecks quality_control tick
90
+ query_ir: hecks ir_constructs [names=a,b]; hecks ir_duplicates [domains=a,b] [--meta];
91
+ hecks ir_impact name=N field=F
92
+ reattest_era: hecks reattest <domain> era=N --confirm
93
+ reference: hecks project_reference
94
+ refresh_rspec_runtime_baseline: hecks refresh_runtime_baseline [workers=6] [from_run=ID]
95
+ regen_codegen_domains: hecks regenerate_corpus [--check]
96
+ regenerate_persistence_legacy_fixtures: hecks regenerate_legacy_fixtures --confirm
97
+ release: hecks publish [--gem-only] [--npm-only] [--npm-local] [--no-wait] --confirm
98
+ (without --confirm, the old --dry-run)
99
+ release_gem: hecks publish_gem --confirm
100
+ rspec_io_parallel_files: hecks list_io_parallel_specs exclude=REGEX [tags=] [check=file];
101
+ hecks write_io_parallel_spec_list exclude=REGEX [tags=] write=file --confirm
102
+ rspec_shard_files: hecks shard_specs group=1 groups=N [runtime_log=]
103
+ run: hecks run [domain] <verb [name=value …] | script.json | - | '{"steps":[…]}'>
104
+ rust_conformance: hecks check_conformance <domain> script=steps.json [artifact=native]
105
+ rust_conformance_fuzz: hecks fuzz_conformance <domain> artifact=native [seeds=10]
106
+ [steps=25]
107
+ rust_coverage: hecks rust_coverage <module> [codegen=ruby]; hecks check_coverage_allowlist
108
+ rust_kernel_coverage: hecks measure_kernel_coverage
109
+ scaffold_translation: hecks scaffold_translation <domain>
110
+ seed_semantics_corpus: hecks seed_semantics_corpus [fixture=name]
111
+ shape: hecks shape <domain>
112
+ smoke_http: hecks smoke_http path=/p [url=] [header=] [scheme=timestamped]
113
+ [payload=] [payload_file=] [health_path=] [state_path=]
114
+ smoke_test: hecks smoke_test [domain]
115
+ spec_example: hecks run_spec_example file=path example=text
116
+ standardize_comments: hecks report_comments paths=a,b [only=] [--json] [top=20]; hecks
117
+ check_comments paths=…; hecks fix_comments paths=… --confirm; hecks write_comment_baseline
118
+ --confirm; hecks check_comments_unchanged ref=REF
119
+ standardize_comments_rust: hecks report_rust_comments paths=a,b [only=] [--json] [top=N];
120
+ hecks check_rust_comments paths=… [only=]; hecks fix_rust_comments paths=… [only=]
121
+ --confirm
122
+ statements: hecks statements <domain> chapter=Name
123
+ stores: hecks stores <domain>
124
+ stress_concurrency_specs: hecks stress_concurrency [runs=30] [parallel=] [seed_start=1]
125
+ translation_audit: hecks audit_translation <domain>; hecks approve_translation <domain>
126
+ [snapshot=] [host_version=] [rehearsal=pass|fail] [rehearsed_at=] --confirm
127
+ vendor_bluebook: hecks vendor <package[@version]> [from=path] [root=path]
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+
5
+ module Hecks
6
+ # The table of what each retired `bin/` script became in hecks 3.0.0 (ADR 0080): a command on
7
+ # the Hecks domain, run through `exe/hecks`. `docs/tools.md` is pinned to it.
8
+ module ThreeZero
9
+ # Each retired script's name mapped to the 3.0 form that replaced it.
10
+ FORMS = YAML.safe_load_file(File.join(__dir__, "three_zero/forms.yml")).freeze
11
+ end
12
+ end