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,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hecks
4
+ # The repository's command-line tools as library code: the comment linters, the regeneration
5
+ # run, the deploy generators and the conformance matrix.
6
+ #
7
+ # Each tool is a module with `main(argv, root:)` that prints to `$stdout` and `$stderr` and
8
+ # refuses with `abort` or `exit`, as the script it replaced did, and answers an exit status. An
9
+ # adapter runs a tool in this process under `Adapters::ConsoleCapture`; `script` runs one as a
10
+ # child's whole program. `require "hecks"` loads none of them: each is required by the command
11
+ # that needs it.
12
+ module Tools
13
+ # The checkout this file lives in, which a tool works on when it is given no other.
14
+ ROOT = File.expand_path("../..", __dir__)
15
+
16
+ # Each tool by the name of the retired script it replaced: the file that defines it, and its
17
+ # constant.
18
+ REGISTRY = {
19
+ "standardize_comments" => ["tools/comment_style", "CommentStyle"],
20
+ "standardize_comments_rust" => ["tools/rust_comment_style", "RustCommentStyle"],
21
+ "regen_codegen_domains" => ["tools/regeneration_run", "RegenerationRun"],
22
+ "argument_gate_matrix" => ["tools/argument_gate_matrix", "ArgumentGateMatrix"],
23
+ "project_deploy" => ["tools/deploy_recipe", "DeployRecipe"],
24
+ "lint_deploy_recipes" => ["tools/deploy_recipe_lint", "DeployRecipeLint"],
25
+ "project_oidc" => ["tools/oidc_manifests", "OidcManifests"],
26
+ "project_tenant" => ["tools/tenant_provisioning", "TenantProvisioning"],
27
+ "translation_audit" => ["tools/translation_audit", "TranslationAudit"],
28
+ "scaffold_translation" => ["tools/translation_scaffold", "TranslationScaffold"],
29
+ "reattest_era" => ["tools/era_reattest", "EraReattest"],
30
+ "merge_tail" => ["tools/tail_merge", "TailMerge"],
31
+ "backfill_era_projections" => ["tools/era_projection_backfill", "EraProjectionBackfill"],
32
+ "compact" => ["tools/journal_compaction", "JournalCompaction"],
33
+ "heki_compact" => ["tools/heki_compaction", "HekiCompaction"],
34
+ "fuzz" => ["tools/fuzz_sweep", "FuzzSweep"],
35
+ "generate" => ["tools/sequence_script", "SequenceScript"],
36
+ "corpus" => ["tools/corpus_report", "CorpusReport"],
37
+ "evolve" => ["tools/evolve_run", "EvolveRun"],
38
+ "query_ir" => ["tools/query_ir_run", "QueryIrRun"],
39
+ "codemod_hoist_local_givens" => ["tools/hoist_local_givens", "HoistLocalGivens"],
40
+ "codemod_implicit_append_fields" => ["tools/drop_implicit_append_fields", "DropImplicitAppendFields"]
41
+ }.freeze
42
+
43
+ module_function
44
+
45
+ # @param name [String] a tool's name, as in `REGISTRY`
46
+ # @return [Boolean] whether the script's body lives here
47
+ def tool?(name) = REGISTRY.key?(name)
48
+
49
+ # Loads a tool and returns it.
50
+ #
51
+ # @param name [String] a tool's name, as in `REGISTRY`
52
+ # @return [Module] the tool, which answers `main(argv, root:)`
53
+ # @raise [KeyError] when no tool replaced a script of that name
54
+ def fetch(name)
55
+ file, constant = REGISTRY.fetch(name)
56
+ require File.join(__dir__, file)
57
+ const_get(constant)
58
+ end
59
+
60
+ # Runs a tool as a program's whole body and exits with its status. Paths in `argv` are read
61
+ # from the directory the caller stands in.
62
+ #
63
+ # @param name [String] a tool's name, as in `REGISTRY`
64
+ # @param argv [Array<String>] the arguments the script took
65
+ # @return [void]
66
+ def script(name, argv)
67
+ exit(fetch(name).main(argv) || 0)
68
+ end
69
+
70
+ # Runs a tool from a checkout's root in this process.
71
+ #
72
+ # @param name [String] a tool's name, as in `REGISTRY`
73
+ # @param argv [Array<String>] the arguments the script took
74
+ # @param root [String] the checkout to work on
75
+ # @return [Integer] the exit status: 0 when the tool ends normally; 1, with the error's class
76
+ # and message on `$stderr`, when the tool raises
77
+ def run(name, argv, root: ROOT)
78
+ Dir.chdir(root) { fetch(name).main(argv, root: root) || 0 }
79
+ rescue SystemExit => e
80
+ e.status
81
+ rescue StandardError, ScriptError => e
82
+ warn "#{name}: #{e.class}: #{e.message}"
83
+ 1
84
+ end
85
+ end
86
+ end
data/lib/hecks/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Hecks
2
2
  # Read directly by the gemspec, so this file must never require the
3
3
  # rest of the gem (its dependencies aren't resolved yet at that point).
4
- VERSION = "2.9.0".freeze
4
+ VERSION = "3.0.0".freeze
5
5
  end
data/lib/hecks.rb CHANGED
@@ -12,6 +12,7 @@ require_relative "hecks/construct"
12
12
  # extends this to declare what it emits.
13
13
  require_relative "hecks/ir"
14
14
  require_relative "hecks/literal"
15
+ require_relative "hecks/doors"
15
16
  require_relative "hecks/facade"
16
17
  require_relative "hecks/query_specification"
17
18
 
@@ -28,20 +29,22 @@ require_relative "hecks/projector"
28
29
  require_relative "hecks/projections"
29
30
  # After `Projector` (dispatches against the `:cli` projection) and
30
31
  # `Ports::Clock` (fills a staleness rule's `now` at the door) both exist.
31
- require_relative "hecks/facade/cli_door"
32
- require_relative "hecks/facade/cli_runner"
32
+ require_relative "hecks/doors/cli_door"
33
+ require_relative "hecks/doors/cli_runner"
33
34
  require_relative "hecks/storehouse"
34
35
  require_relative "hecks/mcp_stdio_guard"
35
- require_relative "hecks/mcp_door_scope"
36
+ require_relative "hecks/doors/mcp_door_scope"
36
37
  require_relative "hecks/framework"
37
38
  require_relative "hecks/vendoring"
38
39
  require_relative "hecks/embryonaut_bluebook"
39
40
 
40
- # Repository-only tooling: the corpus table walks `examples/`, `qa/` and
41
- # `spec/`, which only a checkout has, so it loads on first use and the
42
- # packaged gem leaves it out (ADR 0066).
41
+ # The corpus table walks `examples/`, `qa/` and `spec/`, which only a checkout
42
+ # has, so it loads on first use.
43
43
  Hecks.autoload(:Corpus, File.expand_path("hecks/corpus", __dir__))
44
44
 
45
+ # The chapters a hecksagon can `attaches` by name (ADR 0080); loads on first use.
46
+ Hecks.autoload(:Chapters, File.expand_path("hecks/chapters", __dir__))
47
+
45
48
  # Root namespace and public facade of the DSL/runtime: `Hecks.boot`/`.boot_files`
46
49
  # assemble a running domain from `.bluebook`/`.hecksagon`/`.world` files.
47
50
  module Hecks
@@ -49,16 +52,28 @@ module Hecks
49
52
 
50
53
  class << self
51
54
  # Boots a domain from `path`, assembling a running dispatcher from its
52
- # `.bluebook`/`.hecksagon`/`.world` files. hecks never reads ENV itself —
53
- # a caller resolves its own env var name and passes it as `environment`.
55
+ # `.bluebook`/`.hecksagon`/`.world` files. `environment` defaults to
56
+ # the `HECKS_ENVIRONMENT` variable; pass a name to choose one, or `nil` for none.
54
57
  # @param path [String] path to a domain directory, or a file inside one
55
58
  # @param shared [String, nil] a shared-root override; see `Runtime::Loader.boot`
56
- # @param install_facade [Boolean] install the `Widget::Item.Add`-style facade
59
+ # @param install_doors [Boolean] install the `Widget::Item.Add`-style facade
60
+ # @param install_facade [Boolean, nil] the deprecated spelling of `install_doors`; warns
57
61
  # @param environment [String, nil] env name; its `.hecksagon`/`.world` overlay,
58
- # if present, loads after the domain's own
62
+ # if present, loads after the domain's own. Defaults to `HECKS_ENVIRONMENT`; nil loads none
59
63
  # @return [Runtime::Dispatcher, Runtime::RemoteDispatcher] dispatcher bound to the domain
60
- def boot(path, shared: nil, install_facade: true, environment: nil)
61
- Runtime.boot(path, shared: shared, install_facade: install_facade, environment: environment)
64
+ def boot(path, shared: nil, install_doors: true, install_facade: nil, environment: Runtime::Loader::FROM_ENV)
65
+ Runtime.boot(path, shared: shared, install_doors: install_doors, environment: environment,
66
+ install_facade: install_facade)
67
+ end
68
+
69
+ # Loads a domain's declarations without binding any adapter or opening any store.
70
+ #
71
+ # @param path [String] path to a domain directory, or a file inside one
72
+ # @param shared [String, nil] a shared-root override; see `Runtime::Loader.describe`
73
+ # @param environment [String, nil] env overlay; defaults to `HECKS_ENVIRONMENT`
74
+ # @return [Runtime::Loader::Described] the loaded registry, answering `registry`
75
+ def describe(path, shared: nil, environment: Runtime::Loader::FROM_ENV)
76
+ Runtime.describe(path, shared: shared, environment: environment)
62
77
  end
63
78
 
64
79
  # Boots a domain from an explicit list of files (a `.bluebook`, its
@@ -66,11 +81,13 @@ module Hecks
66
81
  # see `Runtime::Loader.boot_files` for why this exists beside `boot`.
67
82
  # @param paths [String, Array<String>] one or more file paths within the domain
68
83
  # @param shared [String, nil] a shared-root override; see `Runtime::Loader.boot_files`
69
- # @param install_facade [Boolean] install the `Widget::Item.Add`-style facade
84
+ # @param install_doors [Boolean] install the `Widget::Item.Add`-style facade
85
+ # @param install_facade [Boolean, nil] the deprecated spelling of `install_doors`; warns
70
86
  # @param environment [String, nil] environment name passed to the selected-file loader
71
87
  # @return [Runtime::Dispatcher, Runtime::RemoteDispatcher] dispatcher bound to the domain
72
- def boot_files(paths, shared: nil, install_facade: true, environment: nil)
73
- Runtime.boot_files(paths, shared: shared, install_facade: install_facade, environment: environment)
88
+ def boot_files(paths, shared: nil, install_doors: true, install_facade: nil, environment: Runtime::Loader::FROM_ENV)
89
+ Runtime.boot_files(paths, shared: shared, install_doors: install_doors, environment: environment,
90
+ install_facade: install_facade)
74
91
  end
75
92
 
76
93
  # Binds the ambient registry for the duration of the block.
data/qa/settings.yml ADDED
@@ -0,0 +1,66 @@
1
+ # Dials for the hecks_qa practice; edit values here and review the diff.
2
+ # Meaning and rationale per key live in lib/hecks/quality_control/quality_control.bluebook;
3
+ # loaded by Hecks::Fuzzing::QaSettings, which rejects missing, extra, or mistyped keys.
4
+ #
5
+ # automated_engineer stays a literal in the bluebook: spec/quality_control_spec.rb pins it.
6
+
7
+ cadence_seconds: 0
8
+ pr_cap_per_day: 0
9
+
10
+ widening_tiers:
11
+ - { upto: 4, seeds: 10, steps: 25 }
12
+ - { upto: 19, seeds: 25, steps: 50 }
13
+ - { upto: .inf, seeds: 50, steps: 100 }
14
+
15
+ sweep_max_parallel: 4
16
+ liveness_fallback_seconds: 1500
17
+
18
+ draft_only: false
19
+ auto_merge: true
20
+ branch_prefix: "qa/"
21
+
22
+ adversarial_fraction: 0.3
23
+ guided_generation: true
24
+ corpus_splice_probability: 0.0
25
+ favor_rare_verbs: 3
26
+ self_consistency_checks: true
27
+ shrink_budget: 200
28
+
29
+ yield_weight_seconds: 1800
30
+ yield_decay_percent: 50
31
+ rotation_stale_floor_seconds: 21600
32
+
33
+ persistence_parity_seed_cap: 5
34
+ concurrency_seed_cap: 3
35
+
36
+ adapter_parity_pairs:
37
+ persistence_parity:
38
+ left: memory
39
+ right: postgres_era
40
+ adapter_parity_sqlite:
41
+ left: memory
42
+ right: sqlite
43
+
44
+ modes:
45
+ differential: true
46
+ ruby_only: true
47
+ self_consistency: true
48
+ properties_in_differential: true
49
+ structural_skip_report: true
50
+ adapter_parity_sqlite: false
51
+ persistence_parity: true
52
+ adapter_parity_postgres: false
53
+ era_boundary: false
54
+ concurrency: false
55
+ wasm_front: false
56
+
57
+ role_draw_probability: 0.25
58
+ dry_run_fraction: 0.10
59
+
60
+ generated_domains_per_tick: 2
61
+ generated_domains_rust: true
62
+ generated_domain_seeds: 5
63
+
64
+ # Construct families a sweep may skip. Shrink-only: spec/fuzzing/rust_gap_manifest_spec.rb fails
65
+ # when a family here is not declared `generated: false` by a committed manifest.
66
+ structural_refusal_boundary: []
@@ -0,0 +1,6 @@
1
+ # Links the main crate (rust/src/generated/, built by most ci.yml jobs) with lld.
2
+ # It has no native C dependencies, so lld has nothing to trip over.
3
+ #
4
+ # Applies only when building for the linux target; a local macOS build never matches.
5
+ [target.x86_64-unknown-linux-gnu]
6
+ rustflags = ["-C", "link-arg=-fuse-ld=lld"]
data/rust/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ /target
2
+ /dist
data/rust/Cargo.lock ADDED
@@ -0,0 +1,54 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "aho-corasick"
7
+ version = "1.1.5"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba"
10
+ dependencies = [
11
+ "memchr",
12
+ ]
13
+
14
+ [[package]]
15
+ name = "memchr"
16
+ version = "2.8.3"
17
+ source = "registry+https://github.com/rust-lang/crates.io-index"
18
+ checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
19
+
20
+ [[package]]
21
+ name = "regex"
22
+ version = "1.13.1"
23
+ source = "registry+https://github.com/rust-lang/crates.io-index"
24
+ checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
25
+ dependencies = [
26
+ "aho-corasick",
27
+ "memchr",
28
+ "regex-automata",
29
+ "regex-syntax",
30
+ ]
31
+
32
+ [[package]]
33
+ name = "regex-automata"
34
+ version = "0.4.18"
35
+ source = "registry+https://github.com/rust-lang/crates.io-index"
36
+ checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
37
+ dependencies = [
38
+ "aho-corasick",
39
+ "memchr",
40
+ "regex-syntax",
41
+ ]
42
+
43
+ [[package]]
44
+ name = "regex-syntax"
45
+ version = "0.8.11"
46
+ source = "registry+https://github.com/rust-lang/crates.io-index"
47
+ checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
48
+
49
+ [[package]]
50
+ name = "rust"
51
+ version = "0.1.0"
52
+ dependencies = [
53
+ "regex",
54
+ ]
data/rust/Cargo.toml ADDED
@@ -0,0 +1,61 @@
1
+ # Selects which domain's generated module `generated::active` re-exports
2
+ # (rust/src/generated/mod.rs); hecks project_rust adds an entry per generated
3
+ # domain and never removes one, since a domain's own directory is the
4
+ # source of truth for whether it still exists. `default` tracks whichever
5
+ # domain was generated most recently; any other stays reachable via
6
+ # `--no-default-features --features <name>`.
7
+ [features]
8
+ default = ["read_model_on_target_fixture"]
9
+ composite_line_ledger = []
10
+ read_model_on_target_fixture = []
11
+ group_by_collision_fixture = []
12
+ compliance = []
13
+ checkout_fixture = []
14
+ embryonaut_vendoring_demo = []
15
+ generated_route_append = []
16
+ generated_entity_no_identity = []
17
+ generated_revalued_shape = []
18
+ generated_reaction_wording = []
19
+ bug28_existence_fixture = []
20
+ lease_clock = []
21
+ referral_chain = []
22
+ tenant_ledger = []
23
+ corrections = []
24
+ has_many_fixture = []
25
+ ledger_ordering = []
26
+ waybill = []
27
+ nested_pieces = []
28
+ chess = []
29
+ roster = []
30
+ meta = []
31
+ pizzas = []
32
+ banking = []
33
+
34
+ [package]
35
+ name = "rust"
36
+ version = "0.1.0"
37
+ edition = "2021"
38
+
39
+ # The one dependency exception to this crate's zero-Cargo-dependency
40
+ # discipline (ADR 0012): `expression_operators/pattern_match.rs`'s `.match?`
41
+ # needs a real, audited regex engine. `default-features = false` keeps out
42
+ # the SIMD-driven `perf` feature; `std`/`unicode` alone cover the Ruby-
43
+ # Regexp-style `\d`/`\w`/case-insensitive matching this grammar's own
44
+ # predicates use.
45
+ [dependencies]
46
+ regex = { version = "1", default-features = false, features = ["std", "unicode"] }
47
+
48
+ [lib]
49
+ name = "rust"
50
+ path = "src/lib.rs"
51
+
52
+ [[bin]]
53
+ name = "rust"
54
+ path = "src/main.rs"
55
+
56
+ # CI runs every binary this crate produces once and throws it away, never
57
+ # attaching a debugger, so the debuginfo a plain `cargo build`/`cargo test`
58
+ # normally embeds is pure build time and disk cost with nothing reading it.
59
+ # Only this dev profile is affected; release builds are unchanged.
60
+ [profile.dev]
61
+ debug = 0
@@ -0,0 +1,3 @@
1
+ # Link with lld; this crate has no native C library dependencies.
2
+ [target.x86_64-unknown-linux-gnu]
3
+ rustflags = ["-C", "link-arg=-fuse-ld=lld"]
@@ -0,0 +1 @@
1
+ /target
@@ -0,0 +1,7 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "hecks_build"
7
+ version = "0.1.0"
@@ -0,0 +1,19 @@
1
+ [package]
2
+ name = "hecks_build"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+
6
+ # Empty table makes this crate its own workspace root (own target/ and Cargo.lock).
7
+ # Kept out of rust/src/ so this build-time orchestrator does not inflate the shipped artifacts.
8
+ [workspace]
9
+
10
+ [[bin]]
11
+ name = "hecks-build"
12
+ path = "src/main.rs"
13
+
14
+ # No dependencies beyond std: this crate only shells out and never ships in a deployed artifact.
15
+ [dependencies]
16
+
17
+ # Debug info is off: CI binaries are run once and never attached to a debugger.
18
+ [profile.dev]
19
+ debug = 0
@@ -0,0 +1,47 @@
1
+ //! Runs `cargo build` for the generated domain crate, native or WASM.
2
+
3
+ use std::path::Path;
4
+
5
+ use crate::subprocess;
6
+
7
+ /// Runs `cargo build --release` in `rust_dir`, building the `default` feature that
8
+ /// `cargo_sync::run` just set.
9
+ pub fn build_native(rust_dir: &Path) -> Result<(), String> {
10
+ println!("== cargo build --release (native) ==");
11
+ subprocess::run_in(rust_dir, "cargo", &["build", "--release"])
12
+ }
13
+
14
+ /// Cross-compiles to `wasm32-wasip1` and copies the `.wasm` plus its `ir.json` sidecar
15
+ /// into `rust/dist/`.
16
+ ///
17
+ /// Builds through `rustup run stable cargo`: a Homebrew `cargo` earlier on the path never
18
+ /// saw `rustup target add` and fails opaquely.
19
+ pub fn build_wasm(root: &Path, rust_dir: &Path, target_mod_name: &str) -> Result<(), String> {
20
+ let installed = subprocess::run_capture("rustup", &["target", "list", "--installed"])
21
+ .map_err(|e| format!("checking installed rustup targets: {e}"))?;
22
+ if !installed.lines().any(|l| l.trim() == "wasm32-wasip1") {
23
+ return Err(
24
+ "wasm32-wasip1 isn't installed for this toolchain (environment limitation, not a code bug) — install it once with:\n\n rustup target add wasm32-wasip1\n\nthen re-run hecks-build --wasm.".to_string(),
25
+ );
26
+ }
27
+
28
+ println!("== cargo build --release --target wasm32-wasip1 (via rustup run stable) ==");
29
+ subprocess::run_in(rust_dir, "rustup", &["run", "stable", "cargo", "build", "--release", "--target", "wasm32-wasip1"])?;
30
+
31
+ let dist_dir = root.join("rust/dist");
32
+ std::fs::create_dir_all(&dist_dir).map_err(|e| format!("creating {}: {e}", dist_dir.display()))?;
33
+
34
+ let built = rust_dir.join("target/wasm32-wasip1/release/rust.wasm");
35
+ let out = dist_dir.join(format!("{target_mod_name}.wasm"));
36
+ std::fs::copy(&built, &out).map_err(|e| format!("copying {} to {}: {e}", built.display(), out.display()))?;
37
+ println!("wrote {}", out.display());
38
+
39
+ let ir_json = root.join("rust/src/generated").join(target_mod_name).join("ir.json");
40
+ if ir_json.is_file() {
41
+ let ir_out = dist_dir.join(format!("{target_mod_name}.ir.json"));
42
+ std::fs::copy(&ir_json, &ir_out).map_err(|e| format!("copying {} to {}: {e}", ir_json.display(), ir_out.display()))?;
43
+ println!("wrote {}", ir_out.display());
44
+ }
45
+
46
+ Ok(())
47
+ }