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,74 @@
1
+ Hecks.behaviors "Deploy" do
2
+ vision "A recipe, a lint, a comparison or a projection is recorded as requested before anything outside is asked."
3
+
4
+ loads "hecks.bluebook", "custodian.bluebook", "codebase.bluebook", "context_map.hecksagon", "hecks.hecksagon", "deploy.world", "environments/memory.world"
5
+
6
+ test "Project keeps a domain that has no world file as a faulted recipe" do
7
+ tests "Project", on: "Recipe"
8
+ input run: { value: "stack" }, domain: { value: "/tmp/hecks-behaviors-absent/domain" }
9
+ expect emits: %w[ProjectionRequested RecipeRefused RecipeFaulted]
10
+ end
11
+
12
+ test "Project refuses a tenant slug that is not lowercase" do
13
+ tests "Project", on: "Recipe"
14
+ input run: { value: "stack" }, domain: { value: "examples/pizzas" }, tenant: { value: "Not A Slug" }
15
+ expect refused: "must match"
16
+ end
17
+
18
+ test "Lint keeps a Makefile that is not there as a flagged lint" do
19
+ tests "Lint", on: "MakefileCheck"
20
+ input run: { value: "recipes" }, makefiles: { value: "/tmp/hecks-behaviors-absent/Makefile" }
21
+ expect emits: %w[LintRequested LintRefused LintFlagged]
22
+ end
23
+
24
+ test "Diff keeps a template that is not there as a refused comparison" do
25
+ tests "Diff", on: "TemplateComparison"
26
+ input run: { value: "stacks" }, before: { value: "/tmp/hecks-behaviors-absent/before.yaml" }, after: { value: "/tmp/hecks-behaviors-absent/after.yaml" }
27
+ expect emits: %w[ComparisonRequested ComparisonUnreadable ComparisonRefused]
28
+ end
29
+
30
+ test "Diff refuses a template with no path" do
31
+ tests "Diff", on: "TemplateComparison"
32
+ input run: { value: "stacks" }, before: { value: "" }, after: { value: "/tmp/hecks-behaviors-absent/after.yaml" }
33
+ expect refused: "must match"
34
+ end
35
+
36
+ test "ProjectOidc keeps a domain it cannot boot out of the manifests and answers" do
37
+ tests "ProjectOidc", on: "OidcManifest"
38
+ input run: { value: "manifests" }, domains: { value: "/tmp/hecks-behaviors-absent/domain" }
39
+ expect emits: %w[OidcProjectionRequested ManifestAnswered OidcProjected]
40
+ end
41
+
42
+ test "Provision refuses a slug that is not lowercase, and writes nothing" do
43
+ tests "Provision", on: "Tenant"
44
+ input directory: { value: "/tmp/hecks-behaviors-absent/domain" }, slug: { value: "Not A Slug" }, domain: { value: "Scratch" },
45
+ realm: { value: "Acme" }, schema: { value: "acme" }, database: { value: "hecks_tenants" }
46
+ expect refused: "must match"
47
+ end
48
+
49
+ test "Provision refuses a tenant with no realm" do
50
+ tests "Provision", on: "Tenant"
51
+ input directory: { value: "/tmp/hecks-behaviors-absent/domain" }, slug: { value: "acme" }, domain: { value: "Scratch" },
52
+ realm: { value: "" }, schema: { value: "acme" }, database: { value: "hecks_tenants" }
53
+ expect refused: "a tenant realm is named"
54
+ end
55
+
56
+ test "Provision on a slug that is already recorded is refused as AlreadyExists" do
57
+ tests "Provision", on: "Tenant"
58
+ setup "Deploy::Tenant.Provision", directory: { value: "/tmp/hecks-behaviors-absent/domain" }, slug: { value: "acme" }, domain: { value: "Scratch" },
59
+ realm: { value: "Acme" }, schema: { value: "acme" }, database: { value: "hecks_tenants" }
60
+ input directory: { value: "/tmp/hecks-behaviors-absent/domain" }, slug: { value: "acme" }, domain: { value: "Scratch" },
61
+ realm: { value: "Acme" }, schema: { value: "acme" }, database: { value: "hecks_tenants" }
62
+ expect refused: "already"
63
+ end
64
+
65
+ # A directory that is not there is refused, so no overlay is written and the test creates
66
+ # nothing; the writing path runs against a real tmpdir in spec/adapters/driven/tenant_provisioner_spec.rb.
67
+ test "Reprovision keeps a directory that is not there as a refused provisioning" do
68
+ tests "Reprovision", on: "Tenant"
69
+ setup "Deploy::Tenant.Provision", directory: { value: "/tmp/hecks-behaviors-absent/domain" }, slug: { value: "acme" }, domain: { value: "Scratch" },
70
+ realm: { value: "Acme" }, schema: { value: "acme" }, database: { value: "hecks_tenants" }
71
+ input tenant: "acme", directory: { value: "/tmp/hecks-behaviors-absent/domain" }, database: { value: "hecks_tenants" }
72
+ expect emits: %w[TenantReprovisionRequested ProvisioningRefused ProvisioningAbandoned]
73
+ end
74
+ end
@@ -0,0 +1,12 @@
1
+ # The Deploy chapter's launcher when the Hecks domain attaches it: `hecks deploy <verb>` reads the
2
+ # world named for the chapter, as `hecks.world` does for the Hecks chapter's own verbs. Its store
3
+ # is not set here: hecks.world's `default_adapter` fills the gap, so the memory overlay swaps it
4
+ # with the rest.
5
+ #
6
+ # `run_keys` mints the `run` key of a recipe, a lint, a comparison or a manifest projection, and
7
+ # `--wait` reports a faulted, flagged, drifted or refused run as exit 1.
8
+ Hecks.world "Deploy" do
9
+ launcher "Launcher", run_keys: true,
10
+ failure_states: %w[flagged failed drifted unreachable refused faulted halted stopped
11
+ abandoned red needs_fix]
12
+ end
@@ -0,0 +1,10 @@
1
+ # The Memory selection for the Hecks domain: nothing is written to a database. Specs and
2
+ # pull-request runs use it (`HECKS_ENVIRONMENT=memory`); a real run keeps the PostgresEra
3
+ # journal named in hecks.world. The overlay's `default_adapter` wins over the base's.
4
+ Hecks.world "Hecks" do
5
+ default_adapter "Memory"
6
+ end
7
+
8
+ Hecks.world "Governance" do
9
+ default_adapter "Memory"
10
+ end
@@ -0,0 +1,7 @@
1
+ # The Governance chapter's connection when the Hecks domain attaches it: boot reads a world
2
+ # named for the chapter, not for the consuming domain. It is the same database hecks.world
3
+ # names, so one journal holds both; environments/memory.world swaps it to Memory too.
4
+ Hecks.world "Governance" do
5
+ default_adapter "PostgresEra"
6
+ default_database ENV.fetch("HECKS_DATABASE", "postgres://hecks@localhost/hecks")
7
+ end
@@ -0,0 +1,62 @@
1
+ Hecks.behaviors "Hecks" do
2
+ vision "A release moves tagged, published, verified; the grammar cache moves fresh, stale, fresh."
3
+
4
+ loads "hecks.bluebook", "custodian.bluebook", "codebase.bluebook", "context_map.hecksagon", "hecks.hecksagon", "environments/memory.world"
5
+
6
+ test "Tag records a version as tagged" do
7
+ tests "Tag", on: "Release"
8
+ input version: { value: "3.0.0" }, ir_version: { value: "1.0.0" }, ships_from: { path: "/work/hecks" }
9
+ expect state: "tagged"
10
+ end
11
+
12
+ test "MarkPublished advances a tagged release" do
13
+ # The setup is spelled in full: the attached QualityControl chapter also has a `Tag` command.
14
+ tests "MarkPublished", on: "Release"
15
+ setup "Hecks::Release.Tag", version: { value: "3.0.0" }, ir_version: { value: "1.0.0" }, ships_from: { path: "/work/hecks" }
16
+ input version: { value: "3.0.0" }
17
+ expect emits: ["Published"]
18
+ end
19
+
20
+ test "Verify advances a published release" do
21
+ tests "Verify", on: "Release"
22
+ setup "Hecks::Release.Tag", version: { value: "3.0.0" }, ir_version: { value: "1.0.0" }, ships_from: { path: "/work/hecks" }
23
+ setup "Hecks::Release.MarkPublished", version: { value: "3.0.0" }
24
+ input version: { value: "3.0.0" }
25
+ expect state: "verified"
26
+ end
27
+
28
+ test "Verify refuses a release that is only tagged" do
29
+ tests "Verify", on: "Release"
30
+ setup "Hecks::Release.Tag", version: { value: "3.0.0" }, ir_version: { value: "1.0.0" }, ships_from: { path: "/work/hecks" }
31
+ input version: { value: "3.0.0" }
32
+ expect refused: "state"
33
+ end
34
+
35
+ test "Record keeps a boot cache as fresh" do
36
+ tests "Record", on: "SyntaxBootCache"
37
+ input digest: { value: "abc123" }
38
+ expect state: "fresh"
39
+ end
40
+
41
+ test "Invalidate marks a fresh grammar cache stale" do
42
+ tests "Invalidate", on: "SyntaxBootCache"
43
+ setup "Hecks::SyntaxBootCache.Record", digest: { value: "abc123" }
44
+ input digest: { value: "abc123" }
45
+ expect state: "stale"
46
+ end
47
+
48
+ test "Rebuild makes a stale grammar cache fresh again" do
49
+ tests "Rebuild", on: "SyntaxBootCache"
50
+ setup "Hecks::SyntaxBootCache.Record", digest: { value: "abc123" }
51
+ setup "Hecks::SyntaxBootCache.Invalidate", digest: { value: "abc123" }
52
+ input digest: { value: "abc123" }
53
+ expect state: "fresh"
54
+ end
55
+
56
+ test "Rebuild refuses a cache that is still fresh" do
57
+ tests "Rebuild", on: "SyntaxBootCache"
58
+ setup "Hecks::SyntaxBootCache.Record", digest: { value: "abc123" }
59
+ input digest: { value: "abc123" }
60
+ expect refused: "state"
61
+ end
62
+ end
@@ -0,0 +1,124 @@
1
+ Hecks.bluebook "Hecks" do
2
+ vision "What this install is, what version it runs, and whether its grammar cache can be trusted."
3
+ namespace "Hecks::Domain"
4
+
5
+ aggregate "Release" do
6
+ description "One gem version: the record of what is running and what was shipped."
7
+
8
+ attribute :version, Version
9
+ attribute :ir_version, Version
10
+ attribute :ships_from, Checkout, optional: true
11
+
12
+ identified_by :version
13
+
14
+ value_object "Version" do
15
+ attribute :value, String, pattern: '^[0-9]+[.][0-9]+[.][0-9]+'
16
+
17
+ invariant("a version is present") { !value.to_s.empty? }
18
+ end
19
+
20
+ value_object "Checkout" do
21
+ attribute :path, String
22
+
23
+ invariant("a checkout is a working tree with hecks.gemspec beside lib/") { !path.to_s.empty? }
24
+ end
25
+
26
+ lifecycle :state, default: "tagged" do
27
+ transition "MarkPublished" => "published", from: "tagged"
28
+ transition "Verify" => "verified", from: %w[published verified]
29
+ end
30
+
31
+ command "Tag" do
32
+ role "Maintainer"
33
+ goal "Record a version as tagged, with the IR version it carries"
34
+
35
+ attribute :version, Version
36
+ attribute :ir_version, Version
37
+ attribute :ships_from, Checkout
38
+
39
+ sets :version
40
+ sets :ir_version
41
+ sets :ships_from
42
+
43
+ emits Tagged
44
+ end
45
+
46
+ command "MarkPublished", from: "tagged" do
47
+ role "Maintainer"
48
+ goal "Record that a tagged version reached the gem registry"
49
+
50
+ reference_to Release
51
+
52
+ emits Published
53
+ end
54
+
55
+ command "Verify", from: %w[published verified] do
56
+ role "Maintainer"
57
+ goal "Record that the published version installs and boots"
58
+
59
+ reference_to Release
60
+
61
+ emits Verified
62
+ end
63
+
64
+ query "Shipped" do
65
+ description "Every version that was tagged, published and verified."
66
+ where(state: "verified")
67
+ order_by :version
68
+ end
69
+ end
70
+
71
+ aggregate "SyntaxBootCache" do
72
+ description "The grammar chapters' on-disk boot cache, keyed by a digest of the chapters it was built from."
73
+
74
+ attribute :digest, Digest
75
+
76
+ identified_by :digest
77
+
78
+ value_object "Digest" do
79
+ attribute :value, String, pattern: '[^ \t\n\r]'
80
+
81
+ invariant("a digest is present") { !value.to_s.empty? }
82
+ end
83
+
84
+ lifecycle :state, default: "fresh" do
85
+ transition "Invalidate" => "stale", from: "fresh"
86
+ transition "Rebuild" => "fresh", from: "stale"
87
+ end
88
+
89
+ command "Record" do
90
+ role "Maintainer"
91
+ goal "Record a boot cache as built from the grammar chapters that hash to this digest"
92
+
93
+ attribute :digest, Digest
94
+
95
+ sets :digest
96
+
97
+ emits CacheRecorded
98
+ end
99
+
100
+ command "Invalidate", from: "fresh" do
101
+ role "Maintainer"
102
+ goal "Record that the grammar changed under the cache"
103
+
104
+ reference_to SyntaxBootCache
105
+
106
+ emits CacheInvalidated
107
+ end
108
+
109
+ command "Rebuild", from: "stale" do
110
+ role "Maintainer"
111
+ goal "Record that the cache was rebuilt from the current grammar"
112
+
113
+ reference_to SyntaxBootCache
114
+
115
+ emits CacheRebuilt
116
+ end
117
+
118
+ query "Stale" do
119
+ description "Every cache whose grammar changed under it and is not yet rebuilt."
120
+ where(state: "stale")
121
+ order_by :digest
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,390 @@
1
+ Hecks.hecksagon "Hecks" do
2
+ uses_framework "Governance"
3
+
4
+ # The chapters the gem carries: the language declared in itself (Paging comes with Bluebook),
5
+ # Expression, Tenancy, Deploy and QualityControl (which brings its own ports and adapters).
6
+ %w[Bluebook Hecksagon World Adapter Port Translation Expression Tenancy Deploy QualityControl]
7
+ .each { |chapter| attaches chapter }
8
+ # Persistence is not bound here: hecks.world's `default_adapter` binds every aggregate, so
9
+ # environments/memory.world can swap the whole domain without a double bind.
10
+
11
+ # The outside a journaled Custodian command reaches: each port names what its adapter does,
12
+ # and every ask is answered with the record's own arguments or refused with a reason.
13
+ Hecks::ModelCheckRun.port "DomainRuntime" do
14
+ asks "Check", to: ModelCheckRun do
15
+ attribute :run, RunKey
16
+ answers "ModelCheckAnswered"
17
+ refuses "ModelCheckRefused"
18
+ end
19
+ end
20
+
21
+ Hecks::Operation.port "DomainRuntime" do
22
+ asks "Execute", to: Operation do
23
+ attribute :run, OperationKey
24
+ answers "OperationAnswered"
25
+ refuses "OperationRefused"
26
+ end
27
+
28
+ asks "Refresh", to: Operation do
29
+ attribute :run, OperationKey
30
+ answers "OperationAnswered"
31
+ refuses "OperationRefused"
32
+ end
33
+
34
+ asks "Verify", to: Operation do
35
+ attribute :run, OperationKey
36
+ answers "OperationAnswered"
37
+ refuses "OperationRefused"
38
+ end
39
+
40
+ asks "Smoke", to: Operation do
41
+ attribute :run, OperationKey
42
+ answers "OperationAnswered"
43
+ refuses "OperationRefused"
44
+ end
45
+
46
+ answers_query "Follow"
47
+ end
48
+
49
+ Hecks::Operation.port "Terminal" do
50
+ asks "Open", to: Operation do
51
+ attribute :run, OperationKey
52
+ answers "OperationAnswered"
53
+ refuses "OperationRefused"
54
+ end
55
+ end
56
+
57
+ Hecks::Host.port "HostHttp" do
58
+ asks "Fetch", to: Host do
59
+ attribute :host, Address
60
+ answers "EraReported"
61
+ refuses "HostRefused"
62
+ end
63
+ end
64
+
65
+ Hecks::Era.port "JournalStore" do
66
+ asks "Examine", to: Era do
67
+ attribute :run, RunKey
68
+ answers "EraExamined"
69
+ refuses "EraRefused"
70
+ end
71
+
72
+ asks "Apply", to: Era do
73
+ attribute :run, RunKey
74
+ answers "EraChanged"
75
+ refuses "EraRefused"
76
+ end
77
+
78
+ answers_query "ScaffoldTranslation"
79
+ answers_query "AuditTranslation"
80
+ answers_query "Attestation"
81
+ answers_query "Compaction"
82
+ end
83
+
84
+ Hecks::Package.port "Git" do
85
+ asks "Pin", to: Package do
86
+ attribute :package, PackageRef
87
+ answers "PackagePinned"
88
+ refuses "PinRefused"
89
+ end
90
+ end
91
+
92
+ Hecks::Door.port "Workspace" do
93
+ asks "Write", to: Door do
94
+ attribute :run, DoorKey
95
+ answers "DoorAnswered"
96
+ refuses "DoorRefused"
97
+ end
98
+ end
99
+
100
+ Hecks::Door.port "Terminal" do
101
+ asks "Serve", to: Door do
102
+ attribute :run, DoorKey
103
+ answers "DoorAnswered"
104
+ refuses "DoorRefused"
105
+ end
106
+ end
107
+
108
+ Hecks::Build.port "RustToolchain" do
109
+ asks "Generate", to: Build do
110
+ attribute :run, BuildKey
111
+ answers "BuildAnswered"
112
+ refuses "BuildRefused"
113
+ end
114
+
115
+ asks "Wasm", to: Build do
116
+ attribute :run, BuildKey
117
+ answers "BuildAnswered"
118
+ refuses "BuildRefused"
119
+ end
120
+
121
+ asks "BrowserWasm", to: Build do
122
+ attribute :run, BuildKey
123
+ answers "BuildAnswered"
124
+ refuses "BuildRefused"
125
+ end
126
+
127
+ asks "Conform", to: Build do
128
+ attribute :run, BuildKey
129
+ answers "BuildAnswered"
130
+ refuses "BuildRefused"
131
+ end
132
+
133
+ asks "Replay", to: Build do
134
+ attribute :run, BuildKey
135
+ answers "BuildAnswered"
136
+ refuses "BuildRefused"
137
+ end
138
+
139
+ asks "Audit", to: Build do
140
+ attribute :run, BuildKey
141
+ answers "BuildAnswered"
142
+ refuses "BuildRefused"
143
+ end
144
+
145
+ answers_query "RustCoverage"
146
+ end
147
+
148
+ Hecks::FuzzRun.port "ProcessPool" do
149
+ asks "Sweep", to: FuzzRun do
150
+ attribute :run, FuzzKey
151
+ answers "FuzzAnswered"
152
+ refuses "FuzzRefused"
153
+ end
154
+ end
155
+
156
+ Hecks::FuzzRun.port "RustToolchain" do
157
+ asks "Measure", to: FuzzRun do
158
+ attribute :run, FuzzKey
159
+ answers "FuzzAnswered"
160
+ refuses "FuzzRefused"
161
+ end
162
+ end
163
+
164
+ Hecks::Operation.port "HostHttp" do
165
+ asks "Probe", to: Operation do
166
+ attribute :run, OperationKey
167
+ answers "OperationAnswered"
168
+ refuses "OperationRefused"
169
+ end
170
+ end
171
+
172
+ # Codebase: every ask goes to the SourceTree port, which examines the working tree before it
173
+ # carries a request out.
174
+ Hecks::LanguageRun.port "SourceTree" do
175
+ asks "Examine", to: LanguageRun do
176
+ attribute :run, RunKey
177
+ answers "LanguageExamined"
178
+ refuses "LanguageRefused"
179
+ end
180
+
181
+ asks "Perform", to: LanguageRun do
182
+ attribute :run, RunKey
183
+ answers "LanguageAnswered"
184
+ refuses "LanguageRefused"
185
+ end
186
+
187
+ answers_query "WordStatus"
188
+ end
189
+
190
+ Hecks::KernelRun.port "SourceTree" do
191
+ asks "Examine", to: KernelRun do
192
+ attribute :run, RunKey
193
+ answers "KernelExamined"
194
+ refuses "KernelRefused"
195
+ end
196
+
197
+ asks "Perform", to: KernelRun do
198
+ attribute :run, RunKey
199
+ answers "KernelAnswered"
200
+ refuses "KernelRefused"
201
+ end
202
+ end
203
+
204
+ Hecks::ConformanceRun.port "SourceTree" do
205
+ asks "Examine", to: ConformanceRun do
206
+ attribute :run, RunKey
207
+ answers "ConformanceExamined"
208
+ refuses "ConformanceRefused"
209
+ end
210
+
211
+ asks "Perform", to: ConformanceRun do
212
+ attribute :run, RunKey
213
+ answers "ConformanceAnswered"
214
+ refuses "ConformanceRefused"
215
+ end
216
+ end
217
+
218
+ Hecks::RegenerationRun.port "SourceTree" do
219
+ asks "Examine", to: RegenerationRun do
220
+ attribute :run, RunKey
221
+ answers "RegenerationExamined"
222
+ refuses "RegenerationRefused"
223
+ end
224
+
225
+ asks "Perform", to: RegenerationRun do
226
+ attribute :run, RunKey
227
+ answers "RegenerationAnswered"
228
+ refuses "RegenerationRefused"
229
+ end
230
+ end
231
+
232
+ Hecks::StyleRun.port "SourceTree" do
233
+ asks "Examine", to: StyleRun do
234
+ attribute :run, RunKey
235
+ answers "StyleExamined"
236
+ refuses "StyleRefused"
237
+ end
238
+
239
+ asks "Perform", to: StyleRun do
240
+ attribute :run, RunKey
241
+ answers "StyleAnswered"
242
+ refuses "StyleRefused"
243
+ end
244
+
245
+ answers_query "ReportComments"
246
+ answers_query "ReportRustComments"
247
+ end
248
+
249
+ Hecks::CodemodRun.port "SourceTree" do
250
+ asks "Examine", to: CodemodRun do
251
+ attribute :run, RunKey
252
+ answers "CodemodExamined"
253
+ refuses "CodemodRefused"
254
+ end
255
+
256
+ asks "Perform", to: CodemodRun do
257
+ attribute :run, RunKey
258
+ answers "CodemodAnswered"
259
+ refuses "CodemodRefused"
260
+ end
261
+ end
262
+
263
+ Hecks::TestSuiteRun.port "SourceTree" do
264
+ asks "Examine", to: TestSuiteRun do
265
+ attribute :run, RunKey
266
+ answers "TestSuiteExamined"
267
+ refuses "TestSuiteRefused"
268
+ end
269
+
270
+ asks "Perform", to: TestSuiteRun do
271
+ attribute :run, RunKey
272
+ answers "TestSuiteAnswered"
273
+ refuses "TestSuiteRefused"
274
+ end
275
+
276
+ answers_query "ShardSpecs"
277
+ answers_query "ListIoParallelSpecs"
278
+ answers_query "RecordPatternCases"
279
+ end
280
+
281
+ Hecks::CorpusRun.port "SourceTree" do
282
+ asks "Examine", to: CorpusRun do
283
+ attribute :run, RunKey
284
+ answers "CorpusExamined"
285
+ refuses "CorpusRefused"
286
+ end
287
+
288
+ asks "Perform", to: CorpusRun do
289
+ attribute :run, RunKey
290
+ answers "CorpusAnswered"
291
+ refuses "CorpusRefused"
292
+ end
293
+
294
+ answers_query "RustDomains"
295
+ answers_query "RegenOrder"
296
+ answers_query "CorpusRustCoverage"
297
+ answers_query "IrConstructs"
298
+ answers_query "IrDuplicates"
299
+ answers_query "IrImpact"
300
+ end
301
+
302
+ Hecks::PublishingRun.port "SourceTree" do
303
+ asks "Examine", to: PublishingRun do
304
+ attribute :run, RunKey
305
+ answers "PublishingExamined"
306
+ refuses "PublishingRefused"
307
+ end
308
+
309
+ asks "Perform", to: PublishingRun do
310
+ attribute :run, RunKey
311
+ answers "PublishingAnswered"
312
+ refuses "PublishingRefused"
313
+ end
314
+ end
315
+
316
+ # Deploy, attached above: its bluebook loads without deploy.hecksagon, so the outside its
317
+ # commands reach is named here as well. TenantProvisioning writes a tenant's overlay world;
318
+ # DeployToolchain generates and checks a recipe and projects the OIDC manifests.
319
+ Deploy::Tenant.port "TenantProvisioning" do
320
+ asks "WriteOverlay", to: Tenant do
321
+ attribute :database, DatabaseName
322
+ attribute :adapter, AdapterName, optional: true
323
+ attribute :directory, DirectoryPath
324
+ answers "TenantProvisioned"
325
+ refuses "ProvisioningRefused"
326
+ end
327
+ end
328
+
329
+ Deploy::Recipe.port "DeployToolchain" do
330
+ asks "Generate", to: Recipe do
331
+ attribute :run, RunKey
332
+ answers "RecipeAnswered"
333
+ refuses "RecipeRefused"
334
+ end
335
+ end
336
+
337
+ Deploy::MakefileCheck.port "DeployToolchain" do
338
+ asks "Scan", to: MakefileCheck do
339
+ attribute :run, RunKey
340
+ answers "LintAnswered"
341
+ refuses "LintRefused"
342
+ end
343
+ end
344
+
345
+ Deploy::TemplateComparison.port "DeployToolchain" do
346
+ asks "Compare", to: TemplateComparison do
347
+ attribute :run, RunKey
348
+ answers "ComparisonAnswered"
349
+ refuses "ComparisonUnreadable"
350
+ end
351
+ end
352
+
353
+ Deploy::OidcManifest.port "DeployToolchain" do
354
+ asks "Manifest", to: OidcManifest do
355
+ attribute :run, RunKey
356
+ answers "ManifestAnswered"
357
+ refuses "ManifestRefused"
358
+ end
359
+ end
360
+
361
+ # Queries answered from outside the domain. The bluebook declares the question and the value
362
+ # object its answer takes (`returns`) and never says who answers it; each `answers_query` here
363
+ # binds it to the port's adapter. The queries on the ports above (Follow, the Era readings,
364
+ # WordStatus and the rest) are bound the same way.
365
+ Hecks::Introspection.port "DomainRuntime" do
366
+ answers_query "Ir"
367
+ answers_query "Shape"
368
+ answers_query "Stores"
369
+ answers_query "History"
370
+ answers_query "Statements"
371
+ answers_query "Narrate"
372
+ answers_query "Docs"
373
+ answers_query "ProjectDiagrams"
374
+ answers_query "Glossary"
375
+ end
376
+
377
+ Hecks::FuzzRun.port "DomainRuntime" do
378
+ answers_query "GenerateSequence"
379
+ end
380
+ end
381
+
382
+ # The one seam where Deploy's "Tenant" (a validated request) becomes Tenancy's "Tenant" (a fact),
383
+ # as tenancy.hecksagon declares it for the chapters booted on their own: `hecks deploy provision`
384
+ # registers the tenant it provisioned. It sits here, after `attaches` has loaded both chapters.
385
+ Hecks.hecksagon "Tenancy" do
386
+ translates "RegisterProvisionedTenant" do
387
+ on Tenant::TenantProvisioned
388
+ trigger Tenant::Register, with: { slug: :slug, domain: :domain, realm: :realm, schema: :schema }
389
+ end
390
+ end