hecks 6.0.0 → 7.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 (754) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +19 -12
  3. data/lib/hecks/adapters/driven/claude_code.rb +2 -2
  4. data/lib/hecks/adapters/driven/folder.rb +10 -1
  5. data/lib/hecks/adapters/driven/folder_overlay.rb +15 -0
  6. data/lib/hecks/adapters/driven/heki.rb +1 -1
  7. data/lib/hecks/adapters/driven/in_process_key_vault.rb +1 -1
  8. data/lib/hecks/adapters/driven/memory/outbox_rows.rb +2 -2
  9. data/lib/hecks/adapters/driven/postgres/name_guard.rb +25 -0
  10. data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -3
  11. data/lib/hecks/adapters/driven/postgres/repository.rb +1 -1
  12. data/lib/hecks/adapters/driven/postgres/shared_connection.rb +1 -1
  13. data/lib/hecks/adapters/driven/postgres.rb +3 -0
  14. data/lib/hecks/adapters/driven/postgres_era/boot.rb +28 -16
  15. data/lib/hecks/adapters/driven/postgres_era/class_methods.rb +27 -7
  16. data/lib/hecks/adapters/driven/postgres_era/dialect.rb +10 -5
  17. data/lib/hecks/adapters/driven/postgres_era/field_cache_provisioner.rb +39 -0
  18. data/lib/hecks/adapters/driven/postgres_era/journal.rb +52 -13
  19. data/lib/hecks/adapters/driven/postgres_era/lineage/chain_sql.rb +29 -49
  20. data/lib/hecks/adapters/driven/postgres_era/lineage/direct_sql.rb +73 -0
  21. data/lib/hecks/adapters/driven/postgres_era/lineage/direct_verified.json +10 -0
  22. data/lib/hecks/adapters/driven/postgres_era/lineage/direct_verified.rb +65 -0
  23. data/lib/hecks/adapters/driven/postgres_era/lineage/domain_rename.rb +77 -25
  24. data/lib/hecks/adapters/driven/postgres_era/lineage/domain_rename_state.rb +108 -0
  25. data/lib/hecks/adapters/driven/postgres_era/lineage/era_integrity.rb +11 -6
  26. data/lib/hecks/adapters/driven/postgres_era/lineage/era_store.rb +63 -5
  27. data/lib/hecks/adapters/driven/postgres_era/lineage/layered_sql.rb +64 -0
  28. data/lib/hecks/adapters/driven/postgres_era/lineage/ledger_reset.rb +150 -0
  29. data/lib/hecks/adapters/driven/postgres_era/lineage/mint_provisioning.rb +85 -0
  30. data/lib/hecks/adapters/driven/postgres_era/lineage/mint_transaction.rb +11 -7
  31. data/lib/hecks/adapters/driven/postgres_era/lineage/provisioning.rb +11 -5
  32. data/lib/hecks/adapters/driven/postgres_era/lineage/split_sql.rb +76 -0
  33. data/lib/hecks/adapters/driven/postgres_era/lineage/sql_templates.rb +9 -0
  34. data/lib/hecks/adapters/driven/postgres_era/lineage.rb +10 -2
  35. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/context.rb +23 -3
  36. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/coverage_check.rb +3 -1
  37. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/disposable_ledger.rb +119 -0
  38. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolution.rb +219 -0
  39. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolver.rb +68 -71
  40. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/held_era.rb +68 -0
  41. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/ledger_change.rb +63 -0
  42. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/merge_coordinator.rb +1 -1
  43. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_decision.rb +163 -0
  44. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_request.rb +24 -0
  45. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/minter.rb +59 -21
  46. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/refusals.rb +24 -11
  47. data/lib/hecks/adapters/driven/postgres_era/lineage_manager.rb +40 -6
  48. data/lib/hecks/adapters/driven/postgres_era/shared_tables.rb +32 -0
  49. data/lib/hecks/adapters/driven/postgres_era.adapter +12 -0
  50. data/lib/hecks/adapters/driven/postgres_era.rb +25 -10
  51. data/lib/hecks/adapters/driven/prism.rb +0 -1
  52. data/lib/hecks/adapters/driven/sql_query_builder.rb +1 -0
  53. data/lib/hecks/adapters/driven/sqlite/dispatch_claims.rb +1 -1
  54. data/lib/hecks/adapters/driven/sqlite/name_guard.rb +25 -0
  55. data/lib/hecks/adapters/driven/sqlite/outbox.rb +2 -2
  56. data/lib/hecks/adapters/driven/sqlite/repository.rb +1 -1
  57. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +20 -0
  58. data/lib/hecks/adapters/driven/sqlite.rb +9 -1
  59. data/lib/hecks/adapters/driven/tenant_provisioner.rb +1 -1
  60. data/lib/hecks/adapters/driven/worktree_overlay.rb +117 -0
  61. data/lib/hecks/adapters/driving/cli/shorthand.rb +5 -1
  62. data/lib/hecks/adapters/driving/cli.rb +1 -1
  63. data/lib/hecks/adapters/driving/cli_runner/answers.rb +77 -22
  64. data/lib/hecks/adapters/driving/cli_runner/bang_rule.rb +35 -0
  65. data/lib/hecks/adapters/driving/cli_runner/completion_words.rb +36 -0
  66. data/lib/hecks/adapters/driving/cli_runner/json_words.rb +55 -0
  67. data/lib/hecks/adapters/driving/cli_runner/name_index.rb +63 -0
  68. data/lib/hecks/adapters/driving/cli_runner/read_context.rb +32 -0
  69. data/lib/hecks/adapters/driving/cli_runner/renamed_names.rb +49 -0
  70. data/lib/hecks/adapters/driving/cli_runner/resolution.rb +43 -17
  71. data/lib/hecks/adapters/driving/cli_runner/resume_words.rb +63 -0
  72. data/lib/hecks/adapters/driving/cli_runner/run_reference.rb +66 -0
  73. data/lib/hecks/adapters/driving/cli_runner/run_replay.rb +118 -0
  74. data/lib/hecks/adapters/driving/cli_runner/search_words.rb +35 -0
  75. data/lib/hecks/adapters/driving/cli_runner/settling.rb +6 -5
  76. data/lib/hecks/adapters/driving/cli_runner/streaming.rb +11 -10
  77. data/lib/hecks/adapters/driving/cli_runner/suggestions.rb +1 -1
  78. data/lib/hecks/adapters/driving/cli_runner/tour_words.rb +77 -0
  79. data/lib/hecks/adapters/driving/cli_runner/verb_names.rb +36 -4
  80. data/lib/hecks/adapters/driving/cli_runner/verbosity.rb +75 -0
  81. data/lib/hecks/adapters/driving/cli_runner.rb +106 -7
  82. data/lib/hecks/adapters/driving/context_line.rb +85 -0
  83. data/lib/hecks/adapters/driving/exit_status.rb +31 -0
  84. data/lib/hecks/adapters/driving/launcher_options.rb +7 -5
  85. data/lib/hecks/adapters/driving/mcp/progress_sink.rb +45 -0
  86. data/lib/hecks/adapters/driving/mcp/tool_calls.rb +7 -5
  87. data/lib/hecks/adapters/driving/mcp.rb +25 -5
  88. data/lib/hecks/adapters/driving/mcp_scope/argument_policy.rb +40 -7
  89. data/lib/hecks/adapters/driving/mcp_scope.rb +8 -7
  90. data/lib/hecks/adapters/driving/ruby/aggregate_module/hooks.rb +154 -0
  91. data/lib/hecks/adapters/driving/ruby/aggregate_module.rb +64 -93
  92. data/lib/hecks/adapters/driving/usage_log.rb +146 -0
  93. data/lib/hecks/adapters/driving/write_guard.rb +55 -0
  94. data/lib/hecks/adapters/driving.rb +0 -1
  95. data/lib/hecks/behaviors/dsl.rb +5 -1
  96. data/lib/hecks/behaviors/expectations/boot.rb +0 -1
  97. data/lib/hecks/bluebook/acknowledgements.rb +1 -1
  98. data/lib/hecks/bluebook/aggregate.rb +21 -18
  99. data/lib/hecks/bluebook/assembly/contracts/sagas.rb +2 -0
  100. data/lib/hecks/bluebook/assembly/contracts/structure.rb +18 -13
  101. data/lib/hecks/bluebook/behaviour/aggregate.rb +27 -3
  102. data/lib/hecks/bluebook/command.rb +16 -5
  103. data/lib/hecks/bluebook/declaration.rb +32 -4
  104. data/lib/hecks/bluebook/domain_port.rb +7 -3
  105. data/lib/hecks/bluebook/dsl/aggregate_builder/relationships.rb +0 -2
  106. data/lib/hecks/bluebook/dsl/aggregate_builder/renaming.rb +25 -0
  107. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +3 -0
  108. data/lib/hecks/bluebook/dsl/attribute_collector.rb +0 -1
  109. data/lib/hecks/bluebook/dsl/audience_word.rb +40 -0
  110. data/lib/hecks/bluebook/dsl/bluebook_builder/metadata.rb +56 -0
  111. data/lib/hecks/bluebook/dsl/bluebook_builder/modules.rb +80 -0
  112. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb +51 -0
  113. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +1 -0
  114. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +17 -34
  115. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +8 -0
  116. data/lib/hecks/bluebook/dsl/command_builder.rb +13 -3
  117. data/lib/hecks/bluebook/dsl/entity_builder.rb +0 -2
  118. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +6 -4
  119. data/lib/hecks/bluebook/dsl/kinds.rb +53 -0
  120. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +9 -2
  121. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +25 -15
  122. data/lib/hecks/bluebook/dsl/translation_builder.rb +16 -1
  123. data/lib/hecks/bluebook/dsl/word_gate.rb +1 -1
  124. data/lib/hecks/bluebook/dsl.rb +1 -0
  125. data/lib/hecks/bluebook/meta_validator/judge/identity.rb +9 -4
  126. data/lib/hecks/bluebook/meta_validator/plan/category.rb +10 -2
  127. data/lib/hecks/bluebook/meta_validator/plan/verbs.rb +9 -0
  128. data/lib/hecks/bluebook/meta_validator/plan.rb +2 -1
  129. data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +3 -1
  130. data/lib/hecks/bluebook/meta_validator/reconstruction/reading.rb +7 -0
  131. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +7 -2
  132. data/lib/hecks/bluebook/meta_validator/shapes.rb +3 -0
  133. data/lib/hecks/bluebook/meta_validator/syntax_boot/disk_cache.rb +1 -1
  134. data/lib/hecks/bluebook/model_check/aggregate_checks.rb +27 -0
  135. data/lib/hecks/bluebook/model_check/ask_checks.rb +25 -0
  136. data/lib/hecks/bluebook/model_check/reaction_chains.rb +114 -0
  137. data/lib/hecks/bluebook/model_check/reaction_cycles.rb +53 -0
  138. data/lib/hecks/bluebook/model_check/reaction_depth_checks.rb +58 -0
  139. data/lib/hecks/bluebook/model_check/reaction_walk.rb +62 -0
  140. data/lib/hecks/bluebook/model_check.rb +5 -27
  141. data/lib/hecks/bluebook/process_manager.rb +20 -3
  142. data/lib/hecks/bluebook/translation.rb +5 -3
  143. data/lib/hecks/bluebook/translation_plan.rb +9 -2
  144. data/lib/hecks/ci_pipeline/adapters/ci_cache.adapter +7 -0
  145. data/lib/hecks/ci_pipeline/adapters/ci_cache.rb +39 -0
  146. data/lib/hecks/ci_pipeline/adapters/ci_runner.adapter +7 -0
  147. data/lib/hecks/ci_pipeline/adapters/ci_runner.rb +55 -0
  148. data/lib/hecks/ci_pipeline/ci_pipeline.behaviors +322 -0
  149. data/lib/hecks/ci_pipeline/ci_pipeline.bluebook +938 -0
  150. data/lib/hecks/ci_pipeline/ci_pipeline.hecksagon +12 -0
  151. data/lib/hecks/ci_pipeline/ci_pipeline.ports.hecksagon +16 -0
  152. data/lib/hecks/ci_speed/adapters/ci_reader.adapter +7 -0
  153. data/lib/hecks/ci_speed/adapters/ci_reader.rb +141 -0
  154. data/lib/hecks/ci_speed/adapters/local_runner/answer.rb +41 -0
  155. data/lib/hecks/ci_speed/adapters/local_runner/catalog.rb +89 -0
  156. data/lib/hecks/ci_speed/adapters/local_runner/checkouts.rb +89 -0
  157. data/lib/hecks/ci_speed/adapters/local_runner/launcher.rb +69 -0
  158. data/lib/hecks/ci_speed/adapters/local_runner/load_average.rb +38 -0
  159. data/lib/hecks/ci_speed/adapters/local_runner/refs.rb +39 -0
  160. data/lib/hecks/ci_speed/adapters/local_runner/refused.rb +11 -0
  161. data/lib/hecks/ci_speed/adapters/local_runner/verdict.rb +71 -0
  162. data/lib/hecks/ci_speed/adapters/local_runner.adapter +7 -0
  163. data/lib/hecks/ci_speed/adapters/local_runner.rb +168 -0
  164. data/lib/hecks/ci_speed/adapters/replayed_runner.rb +39 -0
  165. data/lib/hecks/ci_speed/ci_speed.behaviors +341 -0
  166. data/lib/hecks/ci_speed/ci_speed.bluebook +1073 -0
  167. data/lib/hecks/ci_speed/ci_speed.hecksagon +11 -0
  168. data/lib/hecks/ci_speed/ci_speed.ports.hecksagon +21 -0
  169. data/lib/hecks/ci_workflows/ci_workflows.behaviors +13 -0
  170. data/lib/hecks/ci_workflows/ci_workflows.bluebook +173 -0
  171. data/lib/hecks/ci_workflows/ci_workflows.hecksagon +15 -0
  172. data/lib/hecks/coder/coder.bluebook +385 -0
  173. data/lib/hecks/coder/coder.hecksagon +12 -0
  174. data/lib/hecks/command_names/check.rb +39 -0
  175. data/lib/hecks/command_names/extractor.rb +67 -0
  176. data/lib/hecks/command_names/index.rb +40 -0
  177. data/lib/hecks/command_names/resolution.rb +81 -0
  178. data/lib/hecks/command_names/scan.rb +54 -0
  179. data/lib/hecks/command_names/sources.rb +73 -0
  180. data/lib/hecks/command_names.rb +26 -0
  181. data/lib/hecks/composer/jobs.rb +1 -1
  182. data/lib/hecks/composer/toolbox.rb +8 -1
  183. data/lib/hecks/corpus/generated_key.rb +205 -0
  184. data/lib/hecks/corpus/listing.rb +34 -0
  185. data/lib/hecks/corpus/rust.rb +27 -11
  186. data/lib/hecks/corpus/sources.rb +2 -1
  187. data/lib/hecks/corpus.rb +37 -42
  188. data/lib/hecks/deprecation.rb +23 -0
  189. data/lib/hecks/doc/reference/readme.rb +1 -1
  190. data/lib/hecks/doc/reference/rendering.rb +2 -2
  191. data/lib/hecks/doc/reference.rb +1 -1
  192. data/lib/hecks/embryonaut_bluebook/manifest.rb +1 -1
  193. data/lib/hecks/fixer/fixer.bluebook +240 -0
  194. data/lib/hecks/fixer/fixer.hecksagon +17 -0
  195. data/lib/hecks/framework_bluebooks.rb +32 -7
  196. data/lib/hecks/fuzzing/concurrent_dispatch/world_copy.rb +1 -0
  197. data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +11 -12
  198. data/lib/hecks/fuzzing/isolated_boot/worlds.rb +23 -5
  199. data/lib/hecks/fuzzing/isolated_boot.rb +1 -1
  200. data/lib/hecks/fuzzing/mutation/checks.rb +3 -3
  201. data/lib/hecks/grammar/translation.bluebook +1 -1
  202. data/lib/hecks/grammar/translation_rules.json +64 -0
  203. data/lib/hecks/hecks/adapter_words.json +7 -0
  204. data/lib/hecks/hecks/adapters/area_overlap.rb +156 -0
  205. data/lib/hecks/hecks/adapters/claude_agents.rb +8 -3
  206. data/lib/hecks/hecks/adapters/codebase/batch_runs.rb +60 -0
  207. data/lib/hecks/hecks/adapters/codebase/changed_specs.rb +52 -0
  208. data/lib/hecks/hecks/adapters/codebase/codemods.rb +3 -2
  209. data/lib/hecks/hecks/adapters/codebase/conformance.rb +14 -1
  210. data/lib/hecks/hecks/adapters/codebase/corpus_queries.rb +53 -0
  211. data/lib/hecks/hecks/adapters/codebase/generated_keys.rb +31 -0
  212. data/lib/hecks/hecks/adapters/codebase/impacted_specs.rb +110 -0
  213. data/lib/hecks/hecks/adapters/codebase/language.rb +2 -2
  214. data/lib/hecks/hecks/adapters/codebase/launcher_text.rb +39 -0
  215. data/lib/hecks/hecks/adapters/codebase/minitest_runs.rb +52 -0
  216. data/lib/hecks/hecks/adapters/codebase/regeneration.rb +51 -8
  217. data/lib/hecks/hecks/adapters/codebase/run_options.rb +35 -0
  218. data/lib/hecks/hecks/adapters/codebase/scripting.rb +39 -0
  219. data/lib/hecks/hecks/adapters/codebase/search.rb +1 -1
  220. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +79 -51
  221. data/lib/hecks/hecks/adapters/codebase/spec_files/report.rb +71 -0
  222. data/lib/hecks/hecks/adapters/codebase/spec_files/shared_run.rb +73 -0
  223. data/lib/hecks/hecks/adapters/codebase/spec_files.rb +95 -0
  224. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +53 -4
  225. data/lib/hecks/hecks/adapters/codebase/test_scope.rb +105 -0
  226. data/lib/hecks/hecks/adapters/codebase/test_suite.rb +48 -34
  227. data/lib/hecks/hecks/adapters/console_capture.rb +1 -1
  228. data/lib/hecks/hecks/adapters/cost_explorer.rb +9 -1
  229. data/lib/hecks/hecks/adapters/dispatching/brief_text.rb +51 -0
  230. data/lib/hecks/hecks/adapters/dispatching/launcher.rb +97 -0
  231. data/lib/hecks/hecks/adapters/dispatching/plan.rb +82 -0
  232. data/lib/hecks/hecks/adapters/dispatching/rows.rb +66 -0
  233. data/lib/hecks/hecks/adapters/dispatching/settings.rb +81 -0
  234. data/lib/hecks/hecks/adapters/dispatching/settler.rb +40 -0
  235. data/lib/hecks/hecks/adapters/dispatching.adapter +7 -0
  236. data/lib/hecks/hecks/adapters/dispatching.rb +93 -0
  237. data/lib/hecks/hecks/adapters/doctor_reading/report.rb +27 -0
  238. data/lib/hecks/hecks/adapters/doctor_reading.adapter +7 -0
  239. data/lib/hecks/hecks/adapters/doctor_reading.rb +161 -0
  240. data/lib/hecks/hecks/adapters/git_checkout.rb +1 -1
  241. data/lib/hecks/hecks/adapters/git_commit.adapter +7 -0
  242. data/lib/hecks/hecks/adapters/git_commit.rb +61 -0
  243. data/lib/hecks/hecks/adapters/git_landing/finisher.rb +82 -0
  244. data/lib/hecks/hecks/adapters/git_landing/foreign_hold.rb +111 -0
  245. data/lib/hecks/hecks/adapters/git_landing/line.rb +171 -0
  246. data/lib/hecks/hecks/adapters/git_landing/lineup.rb +98 -0
  247. data/lib/hecks/hecks/adapters/git_landing/merger.rb +1 -1
  248. data/lib/hecks/hecks/adapters/git_landing/numbering.rb +54 -0
  249. data/lib/hecks/hecks/adapters/git_landing/rivals.rb +59 -0
  250. data/lib/hecks/hecks/adapters/git_landing/ticket.rb +156 -0
  251. data/lib/hecks/hecks/adapters/git_landing/tidy.rb +147 -0
  252. data/lib/hecks/hecks/adapters/git_landing/train.rb +104 -0
  253. data/lib/hecks/hecks/adapters/git_landing/verdict.rb +64 -0
  254. data/lib/hecks/hecks/adapters/git_landing/waiting.rb +120 -0
  255. data/lib/hecks/hecks/adapters/git_landing.rb +106 -20
  256. data/lib/hecks/hecks/adapters/git_main_pull.rb +99 -0
  257. data/lib/hecks/hecks/adapters/git_rehearsal/bench.rb +82 -0
  258. data/lib/hecks/hecks/adapters/git_rehearsal/due.rb +84 -0
  259. data/lib/hecks/hecks/adapters/git_rehearsal/impacted/skips.rb +47 -0
  260. data/lib/hecks/hecks/adapters/git_rehearsal/impacted/spec_run.rb +75 -0
  261. data/lib/hecks/hecks/adapters/git_rehearsal/impacted.rb +181 -0
  262. data/lib/hecks/hecks/adapters/git_rehearsal/line.rb +76 -0
  263. data/lib/hecks/hecks/adapters/git_rehearsal/reading.rb +24 -0
  264. data/lib/hecks/hecks/adapters/git_rehearsal/record.rb +146 -0
  265. data/lib/hecks/hecks/adapters/git_rehearsal/spec_map/corpus.rb +25 -0
  266. data/lib/hecks/hecks/adapters/git_rehearsal/spec_map/needles.rb +61 -0
  267. data/lib/hecks/hecks/adapters/git_rehearsal/spec_map.rb +105 -0
  268. data/lib/hecks/hecks/adapters/git_rehearsal/stages.rb +118 -0
  269. data/lib/hecks/hecks/adapters/git_rehearsal.adapter +7 -0
  270. data/lib/hecks/hecks/adapters/git_rehearsal.rb +141 -0
  271. data/lib/hecks/hecks/adapters/git_train/bench.rb +15 -15
  272. data/lib/hecks/hecks/adapters/git_train/branch_guard.rb +62 -0
  273. data/lib/hecks/hecks/adapters/git_train/carriage.rb +27 -28
  274. data/lib/hecks/hecks/adapters/git_train/launcher_shape.rb +75 -0
  275. data/lib/hecks/hecks/adapters/git_train/mint_step.rb +47 -0
  276. data/lib/hecks/hecks/adapters/git_train/settlement.rb +167 -0
  277. data/lib/hecks/hecks/adapters/git_train.rb +73 -15
  278. data/lib/hecks/hecks/adapters/git_worktree_add.adapter +7 -0
  279. data/lib/hecks/hecks/adapters/git_worktree_add.rb +68 -0
  280. data/lib/hecks/hecks/adapters/github_pull_requests.adapter +7 -0
  281. data/lib/hecks/hecks/adapters/github_pull_requests.rb +109 -0
  282. data/lib/hecks/hecks/adapters/host_http.rb +6 -6
  283. data/lib/hecks/hecks/adapters/in_process_boot.rb +10 -8
  284. data/lib/hecks/hecks/adapters/in_process_operations.rb +11 -17
  285. data/lib/hecks/hecks/adapters/in_process_undo.rb +17 -0
  286. data/lib/hecks/hecks/adapters/journal_store/changes.rb +13 -4
  287. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +28 -15
  288. data/lib/hecks/hecks/adapters/journal_store/examination.rb +17 -1
  289. data/lib/hecks/hecks/adapters/journal_store/held_domain/renaming.rb +45 -0
  290. data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +31 -5
  291. data/lib/hecks/hecks/adapters/journal_store/held_mint.rb +128 -0
  292. data/lib/hecks/hecks/adapters/journal_store/readings/attestation.rb +1 -1
  293. data/lib/hecks/hecks/adapters/journal_store/readings/boot_status.rb +58 -0
  294. data/lib/hecks/hecks/adapters/journal_store/readings/composition.rb +39 -0
  295. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/outcomes.rb +76 -0
  296. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/postgres_reader.rb +44 -0
  297. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/reader.rb +64 -0
  298. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/report.rb +102 -0
  299. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/sqlite_reader.rb +43 -0
  300. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/stores.rb +80 -0
  301. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/subscribers.rb +72 -0
  302. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/summary.rb +39 -0
  303. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace.rb +39 -0
  304. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/command_line.rb +57 -0
  305. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/edge_guards.rb +107 -0
  306. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/inspection.rb +94 -0
  307. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/plan.rb +66 -0
  308. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/report.rb +72 -0
  309. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/store.rb +34 -0
  310. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/watermark_guards.rb +86 -0
  311. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/world.rb +66 -0
  312. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan.rb +36 -0
  313. data/lib/hecks/hecks/adapters/journal_store/readings/projection_audit.rb +64 -0
  314. data/lib/hecks/hecks/adapters/journal_store/readings/scaffolding.rb +3 -3
  315. data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status/database_reading.rb +113 -0
  316. data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status/read_only.rb +33 -0
  317. data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status.rb +32 -0
  318. data/lib/hecks/hecks/adapters/journal_store/readings.rb +13 -1
  319. data/lib/hecks/hecks/adapters/journal_store/reconcile_report.rb +60 -0
  320. data/lib/hecks/hecks/adapters/journal_store/reconciliation.rb +121 -0
  321. data/lib/hecks/hecks/adapters/journal_store/translation_write/shape_edge.rb +59 -0
  322. data/lib/hecks/hecks/adapters/journal_store/translation_write.rb +123 -0
  323. data/lib/hecks/hecks/adapters/journal_store.rb +16 -0
  324. data/lib/hecks/hecks/adapters/landed_work.adapter +7 -0
  325. data/lib/hecks/hecks/adapters/landed_work.rb +52 -0
  326. data/lib/hecks/hecks/adapters/local_files.rb +6 -6
  327. data/lib/hecks/hecks/adapters/process_pool.rb +3 -2
  328. data/lib/hecks/hecks/adapters/push_size.rb +57 -0
  329. data/lib/hecks/hecks/adapters/qa_quiescing.adapter +7 -0
  330. data/lib/hecks/hecks/adapters/qa_quiescing.rb +57 -0
  331. data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +30 -3
  332. data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +63 -3
  333. data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +29 -6
  334. data/lib/hecks/hecks/adapters/rehearsal/subject.rb +11 -5
  335. data/lib/hecks/hecks/adapters/rust_toolchain.rb +10 -1
  336. data/lib/hecks/hecks/adapters/rust_workspace.rb +1 -1
  337. data/lib/hecks/hecks/adapters/settings_reading/disposable_ledger.rb +32 -0
  338. data/lib/hecks/hecks/adapters/settings_reading/push_nudge.rb +26 -0
  339. data/lib/hecks/hecks/adapters/settings_reading/stores.rb +76 -0
  340. data/lib/hecks/hecks/adapters/settings_reading/test_scope.rb +28 -0
  341. data/lib/hecks/hecks/adapters/settings_reading.rb +28 -2
  342. data/lib/hecks/hecks/adapters/started_work.rb +42 -0
  343. data/lib/hecks/hecks/adapters/terminal.rb +12 -10
  344. data/lib/hecks/hecks/adapters/where_reading.adapter +7 -0
  345. data/lib/hecks/hecks/adapters/where_reading.rb +64 -0
  346. data/lib/hecks/hecks/adapters/work_areas.rb +57 -0
  347. data/lib/hecks/hecks/adapters/work_limits.rb +57 -0
  348. data/lib/hecks/hecks/build/build.bluebook +576 -0
  349. data/lib/hecks/hecks/check/check.bluebook +966 -0
  350. data/lib/hecks/hecks/codebase.behaviors +61 -5
  351. data/lib/hecks/hecks/composer.behaviors +1 -1
  352. data/lib/hecks/hecks/context_map.hecksagon +1 -1
  353. data/lib/hecks/hecks/custodian.behaviors +33 -7
  354. data/lib/hecks/hecks/delegate/delegate.bluebook +355 -0
  355. data/lib/hecks/hecks/deliver/deliver.bluebook +945 -0
  356. data/lib/hecks/hecks/deploy.behaviors +1 -1
  357. data/lib/hecks/hecks/evolve/evolve.bluebook +788 -0
  358. data/lib/hecks/hecks/find/find.bluebook +81 -0
  359. data/lib/hecks/hecks/hecks.behaviors +1 -1
  360. data/lib/hecks/hecks/hecks.bluebook +0 -133
  361. data/lib/hecks/hecks/hecks.contextmap +2 -0
  362. data/lib/hecks/hecks/hecks.hecksagon +185 -29
  363. data/lib/hecks/hecks/hecks.world +35 -9
  364. data/lib/hecks/hecks/implicit_moves.json +24 -0
  365. data/lib/hecks/hecks/migrate/migrate.bluebook +1066 -0
  366. data/lib/hecks/hecks/operate/operate.bluebook +695 -0
  367. data/lib/hecks/hecks/quiesce/quiesce.bluebook +117 -0
  368. data/lib/hecks/hecks/rehearse/rehearse.bluebook +133 -0
  369. data/lib/hecks/hecks/release/release.bluebook +916 -0
  370. data/lib/hecks/hecks/serve/serve.bluebook +134 -0
  371. data/lib/hecks/hecks/shapes.json +1 -15
  372. data/lib/hecks/hecks/site.behaviors +1 -1
  373. data/lib/hecks/hecks/start/start.bluebook +194 -0
  374. data/lib/hecks/hecks/test/test.bluebook +638 -0
  375. data/lib/hecks/hecks/tickets.world +14 -0
  376. data/lib/hecks/language/bluebook/aggregate.bluebook +22 -0
  377. data/lib/hecks/language/bluebook/bluebook.bluebook +34 -0
  378. data/lib/hecks/language/bluebook/command.bluebook +35 -0
  379. data/lib/hecks/language/bluebook/process_manager.bluebook +14 -1
  380. data/lib/hecks/language/bluebook/vocabulary.bluebook +174 -54
  381. data/lib/hecks/language/hecksagon/domain_port.bluebook +1 -0
  382. data/lib/hecks/language/hecksagon/port_operation.bluebook +14 -0
  383. data/lib/hecks/language/kinds/run.kind +120 -0
  384. data/lib/hecks/language/oidc.json +10 -0
  385. data/lib/hecks/language/translation/translation_aggregate.bluebook +24 -0
  386. data/lib/hecks/module_folders.rb +31 -0
  387. data/lib/hecks/ports/key_vault.rb +1 -1
  388. data/lib/hecks/ports/persistence/append_only.rb +26 -8
  389. data/lib/hecks/ports/persistence/binding_policy.rb +3 -1
  390. data/lib/hecks/ports/persistence/codec_boundary.rb +1 -1
  391. data/lib/hecks/ports/persistence/mint_door.rb +74 -0
  392. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +6 -5
  393. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +5 -1
  394. data/lib/hecks/ports/persistence/plugins/era/era_status.rb +48 -0
  395. data/lib/hecks/ports/persistence/plugins/era/projected_bluebook.rb +127 -0
  396. data/lib/hecks/ports/persistence/plugins/era/translation/additive_shape.rb +107 -0
  397. data/lib/hecks/ports/persistence/plugins/era/translation/compose.rb +155 -0
  398. data/lib/hecks/ports/persistence/plugins/era/translation/compose_render.rb +79 -0
  399. data/lib/hecks/ports/persistence/plugins/era/translation/edge_files.rb +49 -0
  400. data/lib/hecks/ports/persistence/plugins/era/translation/edge_route.rb +61 -0
  401. data/lib/hecks/ports/persistence/plugins/era/translation/implicit_edge.rb +67 -0
  402. data/lib/hecks/ports/persistence/plugins/era/translation/reconcile.rb +130 -0
  403. data/lib/hecks/ports/persistence/plugins/era/translation/reconcile_files.rb +35 -0
  404. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +13 -5
  405. data/lib/hecks/ports/persistence/plugins/era/translation.rb +5 -0
  406. data/lib/hecks/ports/persistence/plugins/era.rb +1 -0
  407. data/lib/hecks/ports/persistence/repository_factory.rb +11 -3
  408. data/lib/hecks/ports/persistence/stored_name_guard.rb +36 -0
  409. data/lib/hecks/ports/persistence.rb +2 -0
  410. data/lib/hecks/projections/ci_pipeline/table/checks.rb +137 -0
  411. data/lib/hecks/projections/ci_pipeline/table/lookup.rb +59 -0
  412. data/lib/hecks/projections/ci_pipeline/table/refusals.rb +58 -0
  413. data/lib/hecks/projections/ci_pipeline/table/rows.rb +119 -0
  414. data/lib/hecks/projections/ci_pipeline/table/tree.rb +30 -0
  415. data/lib/hecks/projections/ci_pipeline/table/typing.rb +92 -0
  416. data/lib/hecks/projections/ci_pipeline/table.rb +112 -0
  417. data/lib/hecks/projections/ci_pipeline/workflows.rb +162 -0
  418. data/lib/hecks/projections/ci_pipeline/yaml_text.rb +104 -0
  419. data/lib/hecks/projections/deploy/box/hosting.rb +1 -1
  420. data/lib/hecks/projections/deploy/box/roll_recipe.rb +1 -1
  421. data/lib/hecks/projections/deploy/box/roll_scripts.rb +1 -1
  422. data/lib/hecks/projections/deploy/box.rb +1 -1
  423. data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +1 -1
  424. data/lib/hecks/projections/deploy/templates/lambda/Makefile.tmpl +3 -3
  425. data/lib/hecks/projections/undo.rb +46 -0
  426. data/lib/hecks/projections.rb +2 -0
  427. data/lib/hecks/projector/cli_projector/claims.rb +11 -0
  428. data/lib/hecks/projector/cli_projector/command_help.rb +6 -1
  429. data/lib/hecks/projector/cli_projector/command_specs.rb +11 -1
  430. data/lib/hecks/projector/cli_projector/completion.rb +87 -0
  431. data/lib/hecks/projector/cli_projector/everyday.rb +40 -0
  432. data/lib/hecks/projector/cli_projector/json_listing.rb +77 -0
  433. data/lib/hecks/projector/cli_projector/listing.rb +1 -1
  434. data/lib/hecks/projector/cli_projector/modules.rb +39 -0
  435. data/lib/hecks/projector/cli_projector/query_specs.rb +1 -0
  436. data/lib/hecks/projector/cli_projector/renames.rb +58 -0
  437. data/lib/hecks/projector/cli_projector/search.rb +74 -0
  438. data/lib/hecks/projector/cli_projector/usage.rb +23 -6
  439. data/lib/hecks/projector/cli_projector.rb +24 -1
  440. data/lib/hecks/quality_control/adapters/ci_head.adapter +8 -0
  441. data/lib/hecks/quality_control/adapters/image_roll.adapter +9 -0
  442. data/lib/hecks/quality_control/adapters/image_roll.rb +158 -0
  443. data/lib/hecks/quality_control/adapters/main_maintenance.adapter +8 -0
  444. data/lib/hecks/quality_control/adapters/main_maintenance.rb +275 -0
  445. data/lib/hecks/quality_control/adapters/pump_tools.adapter +7 -0
  446. data/lib/hecks/quality_control/adapters/pump_tools.rb +18 -0
  447. data/lib/hecks/quality_control/adapters/push_due_reader.adapter +8 -0
  448. data/lib/hecks/quality_control/adapters/push_due_reader.rb +99 -0
  449. data/lib/hecks/quality_control/adapters/qa_auto_mint.rb +183 -0
  450. data/lib/hecks/quality_control/adapters/qa_era_mint.rb +94 -0
  451. data/lib/hecks/quality_control/adapters/qa_quiesce_marker.rb +126 -0
  452. data/lib/hecks/quality_control/adapters/run_keys.rb +36 -0
  453. data/lib/hecks/quality_control/adapters/run_reader.adapter +7 -0
  454. data/lib/hecks/quality_control/adapters/run_reader.rb +188 -0
  455. data/lib/hecks/quality_control/cli/child.rb +1 -0
  456. data/lib/hecks/quality_control/cli/qa_discover_external_domains/scanning.rb +1 -1
  457. data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +3 -3
  458. data/lib/hecks/quality_control/cli/qa_event_pump/attached.rb +67 -0
  459. data/lib/hecks/quality_control/cli/qa_event_pump/consumer.rb +103 -0
  460. data/lib/hecks/quality_control/cli/qa_event_pump/cursors.rb +60 -0
  461. data/lib/hecks/quality_control/cli/qa_event_pump/reactions.rb +46 -0
  462. data/lib/hecks/quality_control/cli/qa_event_pump/reader.rb +30 -0
  463. data/lib/hecks/quality_control/cli/qa_event_pump.rb +76 -0
  464. data/lib/hecks/quality_control/cli/qa_fix_main_bug/publishing.rb +79 -0
  465. data/lib/hecks/quality_control/cli/qa_fix_main_bug.rb +167 -0
  466. data/lib/hecks/quality_control/cli/qa_generated_domains/evaluation.rb +1 -1
  467. data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +3 -3
  468. data/lib/hecks/quality_control/cli/qa_main_gate/gate_run.rb +52 -0
  469. data/lib/hecks/quality_control/cli/qa_main_gate/logging.rb +70 -0
  470. data/lib/hecks/quality_control/cli/qa_main_gate/shell.rb +47 -0
  471. data/lib/hecks/quality_control/cli/qa_main_gate/sweeping.rb +59 -0
  472. data/lib/hecks/quality_control/cli/qa_main_gate/worktree.rb +62 -0
  473. data/lib/hecks/quality_control/cli/qa_main_gate.rb +135 -0
  474. data/lib/hecks/quality_control/cli/qa_postgres_role.rb +1 -1
  475. data/lib/hecks/quality_control/cli/qa_pr_check/checking.rb +2 -3
  476. data/lib/hecks/quality_control/cli/qa_push_nudge.rb +48 -0
  477. data/lib/hecks/quality_control/cli/qa_seed_angles/seed.rb +1 -1
  478. data/lib/hecks/quality_control/cli/qa_sweep/seat.rb +1 -1
  479. data/lib/hecks/quality_control/cli/qa_tick/event_pump_step.rb +34 -0
  480. data/lib/hecks/quality_control/cli/qa_tick/output.rb +16 -1
  481. data/lib/hecks/quality_control/cli/qa_tick/push_nudge_step.rb +28 -0
  482. data/lib/hecks/quality_control/cli/qa_tick/quiesce_guard.rb +51 -0
  483. data/lib/hecks/quality_control/cli/qa_tick.rb +36 -8
  484. data/lib/hecks/quality_control/quality_control.behaviors +65 -0
  485. data/lib/hecks/quality_control/quality_control.bluebook +1131 -11
  486. data/lib/hecks/quality_control/quality_control.hecksagon +11 -0
  487. data/lib/hecks/quality_control/quality_control.ports.hecksagon +138 -0
  488. data/lib/hecks/query_ir/touchpoints.rb +5 -7
  489. data/lib/hecks/refused.rb +21 -0
  490. data/lib/hecks/release/approval.rb +6 -3
  491. data/lib/hecks/release/conditions.rb +46 -0
  492. data/lib/hecks/release/runner/gem_publisher.rb +4 -4
  493. data/lib/hecks/release/version_commit.rb +48 -0
  494. data/lib/hecks/runtime/command_interpreter/hydration.rb +5 -4
  495. data/lib/hecks/runtime/command_interpreter/persisting.rb +11 -3
  496. data/lib/hecks/runtime/command_interpreter.rb +2 -2
  497. data/lib/hecks/runtime/command_rules/admissibility.rb +0 -2
  498. data/lib/hecks/runtime/command_rules/emission.rb +0 -1
  499. data/lib/hecks/runtime/dependency_planning/expression_reads.rb +0 -1
  500. data/lib/hecks/runtime/dispatcher/planning.rb +24 -0
  501. data/lib/hecks/runtime/dispatcher/routing.rb +6 -0
  502. data/lib/hecks/runtime/dispatcher/value_routing.rb +54 -0
  503. data/lib/hecks/runtime/dispatcher.rb +7 -1
  504. data/lib/hecks/runtime/dry_run_plan.rb +60 -0
  505. data/lib/hecks/runtime/entity_element/location.rb +0 -1
  506. data/lib/hecks/runtime/entity_element/mutations.rb +0 -1
  507. data/lib/hecks/runtime/entity_interpreter/locating.rb +5 -0
  508. data/lib/hecks/runtime/entity_interpreter.rb +0 -1
  509. data/lib/hecks/runtime/errors.rb +26 -0
  510. data/lib/hecks/runtime/instance.rb +0 -1
  511. data/lib/hecks/runtime/invocation_builder.rb +0 -1
  512. data/lib/hecks/runtime/outbox/consumer_runner.rb +9 -1
  513. data/lib/hecks/runtime/outbox/relay.rb +25 -4
  514. data/lib/hecks/runtime/outbox/runnable.rb +3 -1
  515. data/lib/hecks/runtime/outbox.rb +6 -2
  516. data/lib/hecks/runtime/policy_interpreter/fan_out.rb +18 -2
  517. data/lib/hecks/runtime/policy_interpreter.rb +17 -9
  518. data/lib/hecks/runtime/port_operation_interpreter.rb +21 -7
  519. data/lib/hecks/runtime/query_interpreter/arguments.rb +6 -5
  520. data/lib/hecks/runtime/reaction_invocation.rb +0 -1
  521. data/lib/hecks/runtime/refusal_wording.rb +12 -1
  522. data/lib/hecks/runtime/registry/context_maps.rb +1 -5
  523. data/lib/hecks/runtime/registry/declarations.rb +34 -4
  524. data/lib/hecks/runtime/registry/hecksagon_rules.rb +15 -1
  525. data/lib/hecks/runtime/registry/runtime_state.rb +10 -0
  526. data/lib/hecks/runtime/registry/world_defaults.rb +24 -2
  527. data/lib/hecks/runtime/registry/world_names.rb +99 -0
  528. data/lib/hecks/runtime/registry.rb +33 -27
  529. data/lib/hecks/runtime/saga_interpreter/compensation.rb +10 -0
  530. data/lib/hecks/runtime/saga_interpreter/correlation.rb +29 -3
  531. data/lib/hecks/runtime/saga_interpreter/delivery.rb +0 -1
  532. data/lib/hecks/runtime/saga_interpreter/lifecycle.rb +1 -1
  533. data/lib/hecks/runtime/saga_interpreter.rb +46 -2
  534. data/lib/hecks/runtime/value/coercion.rb +36 -8
  535. data/lib/hecks/rust_build/conformance.rb +16 -5
  536. data/lib/hecks/rust_build/parser.rb +25 -0
  537. data/lib/hecks/rust_build/project_rust/codegen_run.rb +45 -12
  538. data/lib/hecks/rust_build/project_rust/declared.rb +80 -0
  539. data/lib/hecks/rust_build/project_rust/features_header.rb +22 -0
  540. data/lib/hecks/rust_build/project_rust/manifest.rb +96 -0
  541. data/lib/hecks/rust_build/project_rust/meta.rb +36 -0
  542. data/lib/hecks/rust_build/project_rust.rb +28 -90
  543. data/lib/hecks/rust_build/write_if_changed.rb +19 -4
  544. data/lib/hecks/rust_build.rb +2 -1
  545. data/lib/hecks/rust_format.rb +32 -2
  546. data/lib/hecks/secrets.rb +111 -0
  547. data/lib/hecks/shape_ledger/edge_hygiene.rb +170 -0
  548. data/lib/hecks/shape_ledger/scope.rb +51 -0
  549. data/lib/hecks/shape_ledger/status.rb +89 -0
  550. data/lib/hecks/shape_ledger.rb +78 -33
  551. data/lib/hecks/site/bluebook/site.bluebook +1 -0
  552. data/lib/hecks/storehouse/audit.rb +34 -4
  553. data/lib/hecks/storehouse/callers.rb +8 -0
  554. data/lib/hecks/storehouse/dispatching.rb +14 -3
  555. data/lib/hecks/storehouse/identity.rb +41 -0
  556. data/lib/hecks/storehouse/querying.rb +7 -7
  557. data/lib/hecks/storehouse.rb +28 -10
  558. data/lib/hecks/tickets/bluebook/adapters/work_areas.adapter +7 -0
  559. data/lib/hecks/tickets/bluebook/adapters/work_limits.adapter +7 -0
  560. data/lib/hecks/tickets/bluebook/tickets.behaviors +70 -0
  561. data/lib/hecks/tickets/bluebook/tickets.bluebook +323 -28
  562. data/lib/hecks/tickets/bluebook/tickets.hecksagon +7 -0
  563. data/lib/hecks/tickets/bluebook/tickets.ports.hecksagon +17 -0
  564. data/lib/hecks/{cli → tools}/behaviors.rb +1 -1
  565. data/lib/hecks/{cli → tools}/canonicalise.rb +1 -1
  566. data/lib/hecks/{cli → tools}/check_engine_agreement.rb +1 -1
  567. data/lib/hecks/{cli → tools}/check_era.rb +6 -6
  568. data/lib/hecks/tools/ci_gates.rb +8 -2
  569. data/lib/hecks/tools/ci_workflows.rb +98 -0
  570. data/lib/hecks/{cli → tools}/console.rb +1 -1
  571. data/lib/hecks/{cli → tools}/deploy_template_diff.rb +1 -1
  572. data/lib/hecks/{cli → tools}/doc_coverage.rb +2 -2
  573. data/lib/hecks/{cli → tools}/document.rb +1 -1
  574. data/lib/hecks/{cli → tools}/domain_stub.rb +1 -1
  575. data/lib/hecks/{cli → tools}/domain_writer.rb +1 -1
  576. data/lib/hecks/tools/downstream_model_check.rb +122 -0
  577. data/lib/hecks/tools/evolve_run.rb +2 -2
  578. data/lib/hecks/{cli → tools}/expected_era.rb +1 -1
  579. data/lib/hecks/{cli → tools}/expression_projection.rb +1 -1
  580. data/lib/hecks/{cli → tools}/follow.rb +1 -1
  581. data/lib/hecks/tools/fuzz_sweep/options.rb +40 -5
  582. data/lib/hecks/tools/fuzz_sweep/pool.rb +12 -1
  583. data/lib/hecks/tools/fuzz_sweep/shards.rb +155 -0
  584. data/lib/hecks/tools/fuzz_sweep.rb +11 -5
  585. data/lib/hecks/tools/gate.rb +38 -29
  586. data/lib/hecks/tools/gate_memo/local_files.rb +33 -0
  587. data/lib/hecks/tools/gate_memo/rehearsal.rb +54 -0
  588. data/lib/hecks/tools/gate_memo/ruby_files.rb +152 -0
  589. data/lib/hecks/tools/gate_memo/session.rb +114 -0
  590. data/lib/hecks/tools/gate_memo/standalone.rb +67 -0
  591. data/lib/hecks/tools/gate_memo.rb +196 -0
  592. data/lib/hecks/tools/gate_report.rb +56 -0
  593. data/lib/hecks/{cli → tools}/history.rb +1 -1
  594. data/lib/hecks/{cli → tools}/interview_agent.rb +1 -1
  595. data/lib/hecks/{cli → tools}/interview_aggregate.rb +1 -1
  596. data/lib/hecks/{cli → tools}/interview_draft.rb +1 -1
  597. data/lib/hecks/{cli → tools}/interview_record.rb +1 -1
  598. data/lib/hecks/{cli → tools}/interview_run.rb +2 -2
  599. data/lib/hecks/{cli → tools}/interview_session/agent_state.rb +1 -1
  600. data/lib/hecks/{cli → tools}/interview_session/catalog.rb +1 -1
  601. data/lib/hecks/{cli → tools}/interview_session/manual_findings.rb +1 -1
  602. data/lib/hecks/{cli → tools}/interview_session/proposals.rb +1 -1
  603. data/lib/hecks/{cli → tools}/interview_session.rb +2 -2
  604. data/lib/hecks/{cli → tools}/interview_shape/lifecycle.rb +1 -1
  605. data/lib/hecks/{cli → tools}/interview_shape.rb +1 -1
  606. data/lib/hecks/{cli → tools}/ir.rb +1 -1
  607. data/lib/hecks/tools/lanes/files.rb +1 -1
  608. data/lib/hecks/tools/lanes/watch_workflow.rb +6 -8
  609. data/lib/hecks/tools/lanes/workflow.rb +1 -1
  610. data/lib/hecks/tools/lanes.rb +1 -1
  611. data/lib/hecks/{cli → tools}/mcp.rb +1 -1
  612. data/lib/hecks/{cli → tools}/model_check/examination.rb +1 -1
  613. data/lib/hecks/{cli → tools}/model_check/sources.rb +1 -1
  614. data/lib/hecks/{cli → tools}/model_check.rb +1 -1
  615. data/lib/hecks/tools/move_disables/reasons.rb +35 -0
  616. data/lib/hecks/tools/move_disables.rb +211 -0
  617. data/lib/hecks/tools/move_former_name.rb +105 -0
  618. data/lib/hecks/{cli → tools}/pattern_cases.rb +1 -1
  619. data/lib/hecks/{cli → tools}/persistence_notice.rb +1 -1
  620. data/lib/hecks/{cli → tools}/present.rb +1 -1
  621. data/lib/hecks/{cli → tools}/project_cli/launcher_source.rb +32 -22
  622. data/lib/hecks/{cli → tools}/project_cli/templates.rb +22 -15
  623. data/lib/hecks/{cli → tools}/project_cli.rb +11 -7
  624. data/lib/hecks/{cli → tools}/project_diagrams.rb +3 -3
  625. data/lib/hecks/{cli → tools}/project_glossary.rb +2 -2
  626. data/lib/hecks/{cli → tools}/reference.rb +2 -2
  627. data/lib/hecks/{cli → tools}/refresh_projections.rb +1 -1
  628. data/lib/hecks/{cli → tools}/refresh_rspec_runtime_baseline.rb +1 -1
  629. data/lib/hecks/tools/regeneration_run/pool.rb +148 -0
  630. data/lib/hecks/tools/regeneration_run/scratch.rb +76 -0
  631. data/lib/hecks/tools/regeneration_run.rb +125 -103
  632. data/lib/hecks/{cli → tools}/release.rb +1 -1
  633. data/lib/hecks/{cli → tools}/release_gem.rb +1 -1
  634. data/lib/hecks/{cli → tools}/rspec_io_parallel_files.rb +1 -1
  635. data/lib/hecks/{cli → tools}/rspec_shard_files.rb +1 -1
  636. data/lib/hecks/{cli → tools}/run.rb +9 -2
  637. data/lib/hecks/{cli → tools}/run_expectations.rb +1 -1
  638. data/lib/hecks/{cli → tools}/seed_semantics_corpus.rb +4 -4
  639. data/lib/hecks/{cli → tools}/serve_query_ir_mcp.rb +1 -1
  640. data/lib/hecks/{cli → tools}/shape.rb +3 -2
  641. data/lib/hecks/{cli → tools}/smoke_http/checks.rb +1 -1
  642. data/lib/hecks/{cli → tools}/smoke_http/settings.rb +1 -1
  643. data/lib/hecks/{cli → tools}/smoke_http/transport.rb +1 -1
  644. data/lib/hecks/{cli → tools}/smoke_http.rb +1 -1
  645. data/lib/hecks/{cli → tools}/smoke_test.rb +1 -1
  646. data/lib/hecks/{cli → tools}/spec_example.rb +1 -1
  647. data/lib/hecks/tools/stage_progress.rb +54 -0
  648. data/lib/hecks/{cli → tools}/statements.rb +1 -1
  649. data/lib/hecks/{cli → tools}/stores.rb +1 -1
  650. data/lib/hecks/{cli → tools}/stress_concurrency_specs/reporting.rb +1 -1
  651. data/lib/hecks/{cli → tools}/stress_concurrency_specs/usage.rb +4 -4
  652. data/lib/hecks/{cli → tools}/stress_concurrency_specs.rb +3 -3
  653. data/lib/hecks/tools/tenant_provisioning.rb +23 -0
  654. data/lib/hecks/tools/tools_doc.rb +10 -8
  655. data/lib/hecks/tools/translation_audit/edges.rb +21 -16
  656. data/lib/hecks/tools/translation_audit/verdicts.rb +1 -1
  657. data/lib/hecks/tools/translation_audit.rb +1 -1
  658. data/lib/hecks/tools/translation_scaffold.rb +1 -1
  659. data/lib/hecks/tools.rb +4 -1
  660. data/lib/hecks/version.rb +1 -1
  661. data/lib/hecks/vocabulary.rb +61 -31
  662. data/lib/hecks/workflow_pagination/judge.rb +48 -0
  663. data/lib/hecks/workflow_pagination/statement.rb +50 -0
  664. data/lib/hecks/workflow_pagination.rb +58 -0
  665. data/lib/hecks.rb +2 -0
  666. data/lib/rubocop/cop/hecks/bare_event_and_query_names.rb +58 -0
  667. data/lib/rubocop/cop/hecks/correlates_by_aggregate.rb +39 -0
  668. data/lib/rubocop/cop/hecks/creating_command_sets.rb +75 -0
  669. data/lib/rubocop/cop/hecks/invariant_expression_language.rb +47 -0
  670. data/lib/rubocop/cop/hecks/lifecycle_needs_attribute.rb +58 -0
  671. data/lib/rubocop/cop/hecks/no_id_string_attribute.rb +49 -0
  672. data/lib/rubocop/cop/hecks/one_terminal_mark_per_lifecycle.rb +47 -0
  673. data/lib/rubocop/cop/hecks/value_object_shorthand.rb +56 -0
  674. data/prebuilt/13c04bdc5970295b310f0a980d397ba722232c8da99cc1a0cdb383249921e871.marshal +0 -0
  675. data/prebuilt/e3857b77f47d9ecc1787b2e1f5136364f3cb3444ef4aea5479f3b98167affea2.marshal +0 -0
  676. data/qa/settings.yml +23 -0
  677. data/rust/.gitignore +0 -6
  678. data/rust/Cargo.toml +2 -1
  679. data/rust/build/Cargo.toml +1 -1
  680. data/rust/build/src/binding_pass.rs +57 -4
  681. data/rust/build/src/pipeline.rs +6 -4
  682. data/rust/build/src/resolve.rs +1 -0
  683. data/rust/codegen/Cargo.toml +1 -1
  684. data/rust/codegen/src/domain_generator.rs +3 -0
  685. data/rust/codegen/src/json_codec.rs +182 -23
  686. data/rust/codegen/src/one_of_references.rs +1 -0
  687. data/rust/codegen/src/queries.rs +20 -2
  688. data/rust/codegen/src/registry.rs +21 -5
  689. data/rust/expr/Cargo.toml +1 -1
  690. data/rust/host/Cargo.toml +1 -1
  691. data/rust/host/HECKS_RELEASE +1 -1
  692. data/rust/host/core/Cargo.toml +1 -1
  693. data/rust/host/src/bin/mint_harness.rs +1 -0
  694. data/rust/host/src/boot.rs +1 -0
  695. data/rust/host/src/store/mint.rs +40 -6
  696. data/rust/lsp/Cargo.toml +1 -1
  697. data/rust/parser/Cargo.toml +1 -1
  698. data/rust/parser/src/build/correlation_keys.rs +125 -0
  699. data/rust/parser/src/build/mod.rs +1 -0
  700. data/rust/parser/src/emit.rs +55 -3
  701. data/rust/parser/src/ir.rs +33 -1
  702. data/rust/parser/src/keywords.rs +289 -1
  703. data/rust/parser/src/main.rs +2 -0
  704. data/rust/parser/src/parse/aggregate.rs +10 -1
  705. data/rust/parser/src/parse/audience.rs +65 -0
  706. data/rust/parser/src/parse/command.rs +14 -0
  707. data/rust/parser/src/parse/declaration.rs +97 -0
  708. data/rust/parser/src/parse/domain_port.rs +6 -0
  709. data/rust/parser/src/parse/mod.rs +1 -0
  710. data/rust/parser/src/parse/process_manager.rs +17 -10
  711. data/rust/parser/src/parse/world.rs +12 -8
  712. data/rust/parser/src/render_ruby.rs +9 -0
  713. data/rust/parser/src/sentence/format.rs +3 -0
  714. data/rust/parser/src/sentence/process.rs +6 -2
  715. data/rust/src/exemplar/json.rs +17 -0
  716. data/rust/src/kernel/cli.rs +27 -3
  717. data/rust/src/kernel/dispatch.rs +4 -2
  718. data/rust/src/kernel/json.rs +62 -0
  719. data/rust/src/kernel/orchestrate.rs +28 -3
  720. data/rust/src/kernel/orchestrate_guard_tests.rs +12 -12
  721. data/rust/web/Cargo.toml +1 -1
  722. metadata +389 -96
  723. data/lib/hecks/cli/command_table.rb +0 -72
  724. data/lib/hecks/cli/launcher_words.rb +0 -168
  725. data/lib/hecks/cli.rb +0 -133
  726. data/lib/hecks/hecks/agents.bluebook +0 -246
  727. data/lib/hecks/hecks/codebase.bluebook +0 -3209
  728. data/lib/hecks/hecks/custodian.bluebook +0 -1300
  729. data/lib/hecks/hecks/ledger.bluebook +0 -190
  730. data/lib/hecks/hecks/rehearsal.bluebook +0 -437
  731. data/lib/hecks/hecks/tooling.bluebook +0 -1234
  732. data/lib/hecks/hecks/translations/2-148748.bluebook +0 -2
  733. data/lib/hecks/hecks/translations/2-15a2e4.bluebook +0 -2
  734. data/lib/hecks/hecks/translations/2-1b447c.bluebook +0 -5
  735. data/lib/hecks/hecks/translations/2-240474.bluebook +0 -2
  736. data/lib/hecks/hecks/translations/2-44446d.bluebook +0 -2
  737. data/lib/hecks/hecks/translations/2-46ca26.bluebook +0 -2
  738. data/lib/hecks/hecks/translations/2-473eab.bluebook +0 -2
  739. data/lib/hecks/hecks/translations/2-75cc28.bluebook +0 -2
  740. data/lib/hecks/hecks/translations/2-781c07.bluebook +0 -2
  741. data/lib/hecks/hecks/translations/2-84c18b.bluebook +0 -2
  742. data/lib/hecks/hecks/translations/2-aa5fff.bluebook +0 -2
  743. data/lib/hecks/hecks/translations/2-bfdb48.bluebook +0 -2
  744. data/lib/hecks/hecks/translations/2-cd96d8.bluebook +0 -10
  745. data/lib/hecks/hecks/translations/2-d43f71.bluebook +0 -2
  746. data/lib/hecks/hecks/translations/2-eea577.bluebook +0 -2
  747. data/lib/hecks/hecks/translations/2-f53248.bluebook +0 -2
  748. data/lib/hecks/hecks/translations/2-fbb677.bluebook +0 -2
  749. data/lib/hecks/hecks/translations/2-ffdf12.bluebook +0 -6
  750. data/lib/hecks/quality_control/adapters/clearance_recorder.rb +0 -36
  751. data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +0 -56
  752. data/prebuilt/31cf81e12f16236ad26249be590cfea3799c9db67432e6a4ef54b801c355b6ae.marshal +0 -0
  753. data/prebuilt/68ecb2bd3abb1a221007db4f2b0375834c13aaccac8f2b99778e8517f11aa113.marshal +0 -0
  754. data/prebuilt/verdicts-0328c2403383837d780ad5ed81d1da351c56436b894cf9015b5d56b8f1f1bf10.json +0 -1
@@ -1,25 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "etc"
3
4
  require "fileutils"
4
- require "open3"
5
- require "tmpdir"
6
5
  require_relative "../tools"
7
6
  require_relative "../corpus"
7
+ require_relative "regeneration_run/scratch"
8
+ require_relative "regeneration_run/pool"
8
9
 
9
10
  module Hecks
10
11
  module Tools
11
12
  # Regenerates every corpus domain's Rust output with `hecks project_rust`, or checks that the
12
- # output on disk is what that would write. Only pizzas, `mod.rs` and `Cargo.toml` are committed.
13
+ # output on disk is what that would write. The whole tree and `Cargo.toml` are committed.
13
14
  #
14
- # The domain list comes from `Hecks::Corpus.rust_regen_order`, never a hand-kept list. The
15
- # order is fixed (sorted by relative path): domains that share governance/, identity/,
16
- # Cargo.toml and generated/mod.rs stamp them with whichever ran last, so it must not flap.
17
- # If the domain set or the sort rule changes, re-run and commit what changed.
15
+ # The domain list comes from `Hecks::Corpus.rust_regen_order`, never a hand-kept list, and is
16
+ # handed to every run as the declared domains: a domain's files, `generated/mod.rs` and
17
+ # Cargo's features come out the same in whatever order the domains run. The domains run side
18
+ # by side, one child per core unless `workers=` says otherwise (see `Pool`).
18
19
  #
19
20
  # hecks regenerate_corpus # discover, regenerate, print the plan
20
- # hecks regenerate_corpus --check # regenerate into a scratch crate; fail on any difference
21
- #
22
- # `--check` never writes the working tree: it runs beside the parallel suite.
21
+ # hecks regenerate_corpus --check # a scratch crate, never the tree; fail on any difference
22
+ # hecks regenerate_corpus domains=a,b # only those; `mod.rs` and Cargo's features stay put
23
+ # hecks regenerate_corpus workers=1 # one domain at a time
23
24
  module RegenerationRun
24
25
  # The refusal when no domain is found.
25
26
  NO_DOMAINS = "hecks regenerate_corpus: discovered ZERO domains with committed rust/src/generated/ " \
@@ -27,44 +28,84 @@ module Hecks
27
28
  "wrong directory, or something upstream deleted rust/src/generated/ entirely. Refusing " \
28
29
  "to silently treat that as \"nothing to regenerate.\""
29
30
 
30
- # The refusal when a check finds nothing generated to compare.
31
- NOT_MATERIALIZED = "hecks regenerate_corpus --check: rust/src/generated has no generated output to compare. " \
32
- "Only pizzas, mod.rs and Cargo.toml are committed; run " \
33
- "`hecks regenerate_corpus --confirm` first, then the check."
31
+ # The argument naming the domains to regenerate, comma-separated, as the launcher passes it.
32
+ DOMAINS_ARG = "domains="
33
+
34
+ # The argument saying how many domains are generated at once, as the launcher passes it.
35
+ WORKERS_ARG = "workers="
36
+
37
+ # What a count of workers looks like: a whole number above zero.
38
+ POSITIVE_WHOLE_NUMBER = /\A[1-9][0-9]*\z/
34
39
 
35
- # The `hecks project_rust` flag that leaves the `meta/` module as an earlier domain wrote it.
36
- SKIP_META = "--skip-meta"
40
+ # The job that generates `meta`, the self-hosted language's Rust. It is the same whichever
41
+ # domain is projected, so a run does it once, first and beside the first domains, and tells
42
+ # every domain to skip it. A run of some domains does it too: a fresh workspace needs it.
43
+ META_JOB = "meta"
44
+
45
+ # What a child of the pool does with its arguments: generate `meta` for the `META_JOB`, and
46
+ # otherwise run `hecks project_rust` on the domain. Runs in the child, whose output streams
47
+ # are real descriptors.
48
+ CORPUS_JOB = lambda do |argv|
49
+ next Pool::PROJECT_RUST.call(argv) unless argv.first == META_JOB
50
+
51
+ Hecks::RustBuild::ProjectRust::Meta.generate
52
+ 0
53
+ end
54
+
55
+ # The scratch crate of a check: `scratch_crate`, `verdict` and `matches_scratch?`.
56
+ extend Scratch
37
57
 
38
58
  module_function
39
59
 
40
60
  # Regenerates the corpus, or checks it.
41
61
  #
42
- # @param argv [Array<String>] `--check` to project into a scratch crate and compare
62
+ # @param argv [Array<String>] `--check` to project into a scratch crate and compare, and
63
+ # `domains=a,b` to run only those domains, `workers=n` to generate n at once
43
64
  # @param root [String] the checkout
44
65
  # @return [Integer] 0, or 1 when a check finds a difference
45
- # @raise [SystemExit] when no corpus domain is found or a domain fails to regenerate
66
+ # @raise [SystemExit] when no corpus domain is found, a named domain is not one, the workers
67
+ # are not a positive number, or a domain fails to regenerate
46
68
  def main(argv, root: Tools::ROOT)
47
69
  Dir.chdir(root) do
48
- domains = plan(root)
70
+ names = named(argv)
71
+ workers = workers_in(argv)
72
+ domains = plan(root, names)
49
73
  # A check projects into a scratch copy of the crate; the forked children inherit the
50
74
  # workspace with the process.
51
75
  scratch = argv.include?("--check") && scratch_crate(root)
52
- run_plan(domains, scratch)
76
+ run_plan(domains, scratch, names, workers, root)
53
77
  end
54
78
  end
55
79
 
56
- # Regenerates the domains, then judges the scratch crate when there is one.
80
+ # Regenerates the domains, then judges the scratch crate when there is one. A check of some
81
+ # domains judges only the modules those domains own: the rest, shared bluebooks and the
82
+ # grammar, are what the corpus's last writer left, so they are put back as the tree has them.
57
83
  #
58
84
  # @param domains [Array<String>] the domains, in run order
59
85
  # @param scratch [String, false] the scratch crate of a check, removed here
86
+ # @param names [Array<String>, nil] the features of some of the corpus's domains, nil for all
87
+ # @param workers [Integer] how many domains are generated at once
88
+ # @param root [String] the checkout
60
89
  # @return [Integer] 0, or 1 when a check finds a difference
61
- def run_plan(domains, scratch)
62
- with_rust_dir(scratch) { regenerate(domains) }
90
+ def run_plan(domains, scratch, names, workers, root)
91
+ with_rust_dir(scratch) { regenerate(domains, partial: !names.nil?, workers: workers) }
92
+ restore_shared(scratch, root, names) if scratch && names
63
93
  scratch ? verdict(scratch) : 0
64
94
  ensure
65
95
  FileUtils.rm_rf(scratch) if scratch
66
96
  end
67
97
 
98
+ # @param argv [Array<String>] the arguments of the run
99
+ # @return [Integer] what `workers=` gives, one child per core when it is not given
100
+ # @raise [SystemExit] when it is not a positive whole number
101
+ def workers_in(argv)
102
+ given = argv.find { |arg| arg.start_with?(WORKERS_ARG) }&.delete_prefix(WORKERS_ARG)
103
+ return default_workers unless given
104
+ return Integer(given) if given.match?(POSITIVE_WHOLE_NUMBER)
105
+
106
+ abort "hecks regenerate_corpus: workers=#{given} is not a positive whole number"
107
+ end
108
+
68
109
  # Builds in `scratch` while the block runs; with none, in the workspace already chosen.
69
110
  def with_rust_dir(scratch, &)
70
111
  require "hecks/rust_build"
@@ -73,14 +114,24 @@ module Hecks
73
114
  Hecks::RustBuild.in_workspace(scratch, &)
74
115
  end
75
116
 
117
+ # @param argv [Array<String>] the arguments of the run
118
+ # @return [Array<String>, nil] the feature names `domains=` lists, nil when it is not given
119
+ def named(argv)
120
+ list = argv.find { |arg| arg.start_with?(DOMAINS_ARG) }
121
+ list&.delete_prefix(DOMAINS_ARG)&.split(",")
122
+ end
123
+
76
124
  # `meta` is never in the list: `Hecks::Corpus::RUST_ELSEWHERE` routes it to the check that
77
125
  # owns it instead.
78
126
  #
79
127
  # @param root [String] the checkout
128
+ # @param names [Array<String>, nil] the features to regenerate; nil for every domain
80
129
  # @return [Array<String>] the domains to regenerate, relative to `root`, in run order
81
- # @raise [SystemExit] when there are none
82
- def plan(root)
83
- domains = Hecks::Corpus.rust_regen_order.map { |domain| domain.dir.delete_prefix("#{root}/") }
130
+ # @raise [SystemExit] when there are none, or a name is not a domain: the message lists the
131
+ # valid ones
132
+ def plan(root, names = nil)
133
+ chosen = Hecks::Corpus.rust_domains_named(names, root: root)
134
+ domains = chosen.map { |domain| domain.dir.delete_prefix("#{root}/") }
84
135
 
85
136
  abort NO_DOMAINS if domains.empty?
86
137
 
@@ -88,104 +139,75 @@ module Hecks
88
139
  domains.each { |d| puts " #{d}" }
89
140
  puts
90
141
  domains
142
+ rescue Hecks::Corpus::UnknownDomain => e
143
+ abort "hecks regenerate_corpus: #{e.message}"
91
144
  end
92
145
 
93
- # Builds the memoized grammar registry once and forks for each domain, one at a time and in
94
- # order, because the shared outputs depend on which domain ran last.
146
+ # Builds the memoized grammar registry once, then forks `hecks project_rust` for each domain,
147
+ # `workers` at a time (see `Pool`). Every child is told the declared domains and that it is
148
+ # partial, so none of them writes `mod.rs` or Cargo's features: a whole run writes them once
149
+ # here, after the last domain, from the declared list, so they come out the same however the
150
+ # children interleave. A run of some of the domains leaves them alone. `meta` is generated by
151
+ # the pool's first job, beside the first domains, and every child is told to skip it.
95
152
  #
96
153
  # @param domains [Array<String>] the domains, in run order
154
+ # @param partial [Boolean] whether these are some of the corpus's domains, not all
155
+ # @param workers [Integer] how many domains are generated at once
97
156
  # @return [void]
98
- def regenerate(domains)
157
+ # @raise [SystemExit] when a domain fails
158
+ def regenerate(domains, partial: false, workers: default_workers)
99
159
  require "hecks"
100
160
  require "hecks/bluebook/meta_validator"
101
161
  require "hecks/rust_build"
162
+ require "hecks/rust_build/project_rust"
102
163
  Hecks::Bluebook::MetaValidator.grammar_registry
103
- # Every domain writes the same `meta/` module, so the first one does and the rest skip it.
104
- domains.each_with_index { |domain, index| project_rust_in_fork(domain, skip_meta: index.positive?) }
164
+ run_pool(domains, workers)
165
+ write_manifest unless partial
105
166
  end
106
167
 
107
- # Forks so the child inherits the memoized grammar registry instead of rebuilding it. The
108
- # child's output goes through a pipe and is printed here, so it reaches whoever captures this
109
- # process's stdout.
168
+ # Runs the pool with the generator already built, so no child runs Cargo (see
169
+ # `CodegenRun.prebuilt`).
110
170
  #
111
- # @param domain [String] the domain, relative to the checkout
112
- # @param skip_meta [Boolean] leave the `meta/` module as an earlier domain wrote it
171
+ # @param domains [Array<String>] the domains, in run order
172
+ # @param workers [Integer] how many domains are generated at once
113
173
  # @return [void]
114
- # @raise [SystemExit] when the child fails
115
- def project_rust_in_fork(domain, skip_meta: false)
116
- puts "== hecks project_rust #{domain} =="
117
- reader, writer = IO.pipe
118
- argv = skip_meta ? [domain, SKIP_META] : [domain]
119
- pid = fork { run_child(reader, writer, argv) }
120
- writer.close
121
- $stdout.write(reader.read)
122
- reader.close
123
- _, status = Process.wait2(pid)
124
- abort "hecks regenerate_corpus: hecks project_rust #{domain} failed (#{status.inspect})" unless status.success?
125
- puts
174
+ def run_pool(domains, workers)
175
+ Hecks::RustBuild::ProjectRust::CodegenRun.prebuilt(Hecks::RustBuild.rust_dir) do
176
+ Pool.new([META_JOB, *domains], child_flags, workers, runner: CORPUS_JOB).call
177
+ end
126
178
  end
127
179
 
128
- # @param reader [IO] the parent's end of the pipe, closed here
129
- # @param writer [IO] the child's end, which becomes its stdout and stderr
130
- # @param argv [Array<String>] the domain, and any flag for `hecks project_rust`
131
- # @return [void] never returns: the child leaves without the parent's exit handlers
132
- def run_child(reader, writer, argv)
133
- reader.close
134
- # The real descriptors, not the globals: a caller may have swapped those for a buffer.
135
- STDOUT.reopen(writer) # rubocop:disable Style/GlobalStdStream
136
- STDERR.reopen(writer) # rubocop:disable Style/GlobalStdStream
137
- $stdout = STDOUT
138
- $stderr = STDERR
139
- status = child_status(argv)
140
- $stdout.flush
141
- exit!(status)
142
- end
180
+ # @return [Array<String>] what every child is told: the declared domains, that it is partial,
181
+ # and that `meta` is already generated
182
+ def child_flags = declared(partial: true).flags + [Hecks::RustBuild::ProjectRust::Meta::SKIP_FLAG]
143
183
 
144
- # @return [Integer] the exit status of `hecks project_rust` for the domain
145
- def child_status(argv)
146
- Hecks::RustBuild.run("project_rust", argv, out: STDOUT, err: STDERR) # rubocop:disable Style/GlobalStdStream
147
- rescue SystemExit => e
148
- e.status
149
- rescue StandardError => e
150
- warn "#{e.class}: #{e.message}"
151
- 1
152
- end
184
+ # @return [Integer] how many domains a run generates at once unless told: one per core
185
+ def default_workers = Etc.nprocessors
153
186
 
154
- # A scratch crate: copies of the generated tree and Cargo.toml, all `hecks project_rust`
155
- # writes.
187
+ # `mod.rs` and Cargo's features for the whole corpus, written once in the workspace.
156
188
  #
157
- # @param root [String] the checkout
158
- # @return [String] the scratch directory
159
- def scratch_crate(root)
160
- abort NOT_MATERIALIZED unless File.directory?(File.join(root, "rust/src/generated/meta"))
161
-
162
- scratch = Dir.mktmpdir("regen-codegen-check")
163
- FileUtils.mkdir_p(File.join(scratch, "src"))
164
- FileUtils.cp_r(File.join(root, "rust/src/generated"), File.join(scratch, "src/generated"))
165
- FileUtils.cp(File.join(root, "rust/Cargo.toml"), scratch)
166
- scratch
189
+ # @return [void]
190
+ def write_manifest
191
+ declared = declared(partial: false)
192
+ Hecks::RustBuild::ProjectRust::Manifest.new(Hecks::RustBuild.rust_dir, declared, declared.default).call
167
193
  end
168
194
 
169
- # The gate: the scratch projection must match the generated sources and Cargo.toml on disk.
195
+ # The corpus's declared domains as `hecks project_rust` flags: the domains of the regeneration
196
+ # order, and the features the corpus routes elsewhere (`meta`, which every run generates).
197
+ # Cargo's `default` stays on the feature the tracked `rust/Cargo.toml` names, or on the last
198
+ # declared domain when it names none.
170
199
  #
171
- # @param scratch [String] the scratch crate, removed here
172
- # @return [Integer] 0 when it matches, 1 after printing the difference
173
- def verdict(scratch)
174
- same = matches_scratch?(scratch)
175
- FileUtils.rm_rf(scratch)
176
- same ? 0 : 1
177
- end
178
-
179
- # @param scratch [String] the scratch crate
180
- # @return [Boolean] whether it matches the tree, printing `git diff` output when it does not
181
- def matches_scratch?(scratch)
182
- pairs = [["rust/src/generated", File.join(scratch, "src/generated")],
183
- ["rust/Cargo.toml", File.join(scratch, "Cargo.toml")]]
184
- pairs.map do |on_disk, projected|
185
- out, status = Open3.capture2e("git", "diff", "--no-index", "--exit-code", "--", on_disk, projected)
186
- print out
187
- status.success?
188
- end.all?
200
+ # @param partial [Boolean] whether the run is of some domains: it is told so
201
+ # @return [Array<String>] the flags
202
+ def declared_flags(partial: false) = declared(partial: partial).flags
203
+
204
+ # @param partial [Boolean] whether the run is of some domains
205
+ # @return [Hecks::RustBuild::ProjectRust::Declared] the corpus's declared domains
206
+ def declared(partial: false)
207
+ require "hecks/rust_build/project_rust"
208
+ features = Hecks::Corpus.rust_regen_order.map(&:feature)
209
+ default = Hecks::Corpus.cargo_default || features.last
210
+ Hecks::RustBuild::ProjectRust::Declared.new(features + Hecks::Corpus::RUST_ELSEWHERE.keys, default, partial: partial)
189
211
  end
190
212
  end
191
213
  end
@@ -4,7 +4,7 @@ require "optparse"
4
4
  require_relative "../release/runner"
5
5
 
6
6
  module Hecks
7
- module CLI
7
+ module Tools
8
8
  # The command behind `hecks publish`: tags the merged release commit, publishes the gem, and
9
9
  # gets `@hecks/client` published to npm. See "Releasing" in CONTRIBUTING.md for the release PR.
10
10
  #
@@ -6,7 +6,7 @@ require_relative "../hecks/adapters/codebase/gem_registry"
6
6
  require_relative "../version"
7
7
 
8
8
  module Hecks
9
- module CLI
9
+ module Tools
10
10
  # The command behind `hecks publish_gem` and the release runner's gem step: builds the hecks
11
11
  # gem and pushes it to rubygems.org, using a push-scoped API key from 1Password instead of
12
12
  # `~/.gem/credentials`. It pushes the version it is given, `Hecks::VERSION` by default.
@@ -4,7 +4,7 @@ require "json"
4
4
  require "open3"
5
5
 
6
6
  module Hecks
7
- module CLI
7
+ module Tools
8
8
  # The command behind `hecks list_io_parallel_specs`: prints, one per line, the spec files with
9
9
  # at least one example matching an RSpec tag filter. ci.yml hands the list to `parallel_rspec`
10
10
  # instead of the whole `spec` directory.
@@ -3,7 +3,7 @@
3
3
  require "parallel_tests/test/runner"
4
4
 
5
5
  module Hecks
6
- module CLI
6
+ module Tools
7
7
  # The command behind `hecks shard_specs`: prints the spec files assigned to one group
8
8
  # (1-indexed) of a runtime-balanced N-way split. `rspec_shard` in ci-rspec.yml passes the
9
9
  # committed runtime baseline so every leg agrees.
@@ -6,7 +6,7 @@ require_relative "../ports/persistence/plugins/era"
6
6
  require_relative "run_expectations"
7
7
 
8
8
  module Hecks
9
- module CLI
9
+ module Tools
10
10
  # The command behind `hecks run`: dispatches one verb from the
11
11
  # command line, or executes a JSON step list and reports instances, events,
12
12
  # refusals, reactions, sagas and query rows.
@@ -88,10 +88,17 @@ module Hecks
88
88
  # No fall-through: reached only when the argument is not script-shaped, so a
89
89
  # near miss deserves the runner's "did you mean" rather than the step-list
90
90
  # form's "no such script".
91
+ # A verb always writes, so its word carries the bang the launcher requires.
92
+ def writing(argv)
93
+ return argv if argv.empty? || argv.first.end_with?("!")
94
+
95
+ ["#{argv.first}!", *argv.drop(1)]
96
+ end
97
+
91
98
  def cli_form(domain, argv, program)
92
99
  runtime = Hecks.boot(domain, install_driving: false)
93
100
  Assembly.bind_ported_runtime(runtime)
94
- text, status = Adapters::Driving::CliRunner.call(runtime: runtime, argv: argv, program: program)
101
+ text, status = Adapters::Driving::CliRunner.call(runtime: runtime, argv: writing(argv), program: program)
95
102
  status.zero? ? puts(text) : abort(text)
96
103
  exit 0
97
104
  end
@@ -1,5 +1,5 @@
1
1
  module Hecks
2
- module CLI
2
+ module Tools
3
3
  # Judges a `hecks run` report against the script's `expectations`: the events that must
4
4
  # appear, the refusals that must happen, and the instance fields that must hold.
5
5
  module RunExpectations
@@ -5,16 +5,16 @@ require_relative "../../hecks"
5
5
  require_relative "../fuzzing"
6
6
 
7
7
  module Hecks
8
- module CLI
9
- # The command behind `hecks test_suite_run.seed_semantics_corpus`: seeds (or re-seeds) the
8
+ module Tools
9
+ # The command behind `hecks test_suite_run.seed_semantics_corpus!`: seeds (or re-seeds) the
10
10
  # `expect` block of corpus fixtures from the Ruby runtime. Review the result
11
11
  # against `docs/semantics/bluebook-semantics.md` before committing.
12
12
  #
13
13
  # Seeds `spec/corpus/semantics/` and the conformance corpus ({FULL_SCRIPTS} plus
14
14
  # `spec/corpus/rust_conformance/`, whose `expect` also freezes more).
15
15
  #
16
- # hecks test_suite_run.seed_semantics_corpus # fill what lacks an expect
17
- # SEED=refusal_kind_lifecycle hecks test_suite_run.seed_semantics_corpus # re-seed one
16
+ # hecks test_suite_run.seed_semantics_corpus! # fill what lacks an expect
17
+ # SEED=refusal_kind_lifecycle hecks test_suite_run.seed_semantics_corpus! # re-seed one
18
18
  #
19
19
  # The seeded expectation is the definition, not a recording: both runtimes are compared to it.
20
20
  # `occurred_at` is stripped from events (C7.3/C9.1); refusals keep verb, error and kind (C8.2).
@@ -3,7 +3,7 @@
3
3
  require_relative "../mcp_stdio_guard"
4
4
 
5
5
  module Hecks
6
- module CLI
6
+ module Tools
7
7
  # The command behind `hecks serve_query_ir_mcp` and `hecks serve_query_ir_mcp`: an MCP server
8
8
  # exposing `Hecks::QueryIR`'s queries as tools, over newline-delimited JSON-RPC on stdio.
9
9
  #
@@ -2,12 +2,13 @@
2
2
 
3
3
  require "json"
4
4
  require_relative "../../hecks"
5
+ require_relative "../module_folders"
5
6
  # The `:shape` projection reads `Runtime::StorageShape`, which lives in the era persistence plugin
6
7
  # core does not load by default (ADR 0033).
7
8
  require_relative "../ports/persistence/plugins/era"
8
9
 
9
10
  module Hecks
10
- module CLI
11
+ module Tools
11
12
  # The command behind `hecks shape` and `hecks shape`: a bluebook's storage-shape projection, the
12
13
  # same hash PostgresEra mints an era's label from, so two runs diff to show whether a bluebook
13
14
  # change would bump an era.
@@ -36,7 +37,7 @@ module Hecks
36
37
  raise Runtime::NotFound, "#{target} does not exist" unless File.exist?(target)
37
38
 
38
39
  directory = File.directory?(target)
39
- files = directory ? Dir[File.join(target, "*.bluebook")] : [target]
40
+ files = directory ? ModuleFolders.all(target) : [target]
40
41
  raise Runtime::NotFound, "no *.bluebook files in #{target}" if files.empty?
41
42
 
42
43
  registry = load_files(files)
@@ -1,5 +1,5 @@
1
1
  module Hecks
2
- module CLI
2
+ module Tools
3
3
  class SmokeHttp
4
4
  # The signed-webhook checks a run makes, each reported ok or failed.
5
5
  module Checks
@@ -1,7 +1,7 @@
1
1
  require "optparse"
2
2
 
3
3
  module Hecks
4
- module CLI
4
+ module Tools
5
5
  class SmokeHttp
6
6
  # Reads the command line and environment into the settings a run needs; `SmokeHttp`
7
7
  # extends it, so these are its class methods.
@@ -1,7 +1,7 @@
1
1
  require "net/http"
2
2
 
3
3
  module Hecks
4
- module CLI
4
+ module Tools
5
5
  class SmokeHttp
6
6
  # The HTTP calls a run makes to the service under check, and the status assertions on them.
7
7
  module Transport
@@ -9,7 +9,7 @@ require_relative "smoke_http/checks"
9
9
  require_relative "smoke_http/transport"
10
10
 
11
11
  module Hecks
12
- module CLI
12
+ module Tools
13
13
  # One run of the checks against one service.
14
14
  class SmokeHttp
15
15
  # Raised when a smoke check's request gets an answer other than the one it expects.
@@ -2,7 +2,7 @@ require_relative "../../hecks"
2
2
  require_relative "../bluebook/smoke_test"
3
3
 
4
4
  module Hecks
5
- module CLI
5
+ module Tools
6
6
  # The command behind `hecks smoke_test`: boots a real domain
7
7
  # and dispatches one synthesized call per declared command and report
8
8
  # (`Bluebook::SmokeTest`), printing every failure rather than the first.
@@ -3,7 +3,7 @@
3
3
  require "rspec/core"
4
4
 
5
5
  module Hecks
6
- module CLI
6
+ module Tools
7
7
  # The command behind `hecks run_spec_example`: runs one spec file filtered to one example
8
8
  # through `RSpec::Core::Runner`, so a `hecks quality_control bug.log --demonstration` string
9
9
  # needs no `-e` quoting.
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hecks
4
+ module Tools
5
+ # Streams one line per check as the check starts and as it ends, so a long stage shows its
6
+ # progress before its verdict. Each line is written and flushed as it happens.
7
+ #
8
+ # Lines go to the real standard error by default, not to `$stderr`: a recorded run captures
9
+ # `$stderr` into its journal, and the progress would be swallowed there. The verdict stays on
10
+ # standard output, so a pipe still receives only the result.
11
+ class StageProgress
12
+ class << self
13
+ # Whether the lines are left out, as `-q` asks: set by the launcher for the length of a line.
14
+ # @return [Boolean]
15
+ attr_accessor :quiet
16
+ end
17
+ self.quiet = false
18
+
19
+ # @param io [#puts, #flush] where the lines are written; the process's own standard error
20
+ # (file descriptor 2), whatever `$stderr` is redirected to at the time
21
+ def initialize(io = IO.new(2, "w", autoclose: false))
22
+ @io = io
23
+ @lock = Mutex.new
24
+ end
25
+
26
+ # @param id [String] the check's id
27
+ # @return [void] the line saying the check has started
28
+ def start(id)
29
+ line("start #{id}")
30
+ end
31
+
32
+ # @param id [String] the check's id
33
+ # @param passed [Boolean] whether the check exited 0
34
+ # @param seconds [Float] how long it ran
35
+ # @return [void] the line saying how the check ended
36
+ def finish(id, passed, seconds)
37
+ line("#{passed ? "ok" : "fail"} #{id} #{format("%.1fs", seconds)}")
38
+ end
39
+
40
+ private
41
+
42
+ # @param text [String] one line, written and flushed under a lock so threads do not interleave
43
+ # @return [void]
44
+ def line(text)
45
+ return if self.class.quiet
46
+
47
+ @lock.synchronize do
48
+ @io.puts(text)
49
+ @io.flush
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -3,7 +3,7 @@
3
3
  require_relative "../../hecks"
4
4
 
5
5
  module Hecks
6
- module CLI
6
+ module Tools
7
7
  # The command behind `hecks statements`: prints a booted domain's declared facts as plain
8
8
  # English sentences, through `Projections::Statements`.
9
9
  module Statements
@@ -3,7 +3,7 @@ require_relative "../../hecks"
3
3
  require_relative "persistence_notice"
4
4
 
5
5
  module Hecks
6
- module CLI
6
+ module Tools
7
7
  # The command behind `hecks stores`: every aggregate's current
8
8
  # records as JSON (the head, not the journal — see `hecks history` for that).
9
9
  module Stores
@@ -1,7 +1,7 @@
1
1
  require "fileutils"
2
2
 
3
3
  module Hecks
4
- module CLI
4
+ module Tools
5
5
  module StressConcurrencySpecs
6
6
  # The verdict of a stress run: the clean line, or each failing run's saved log and how to
7
7
  # reproduce it. `StressConcurrencySpecs` extends it.
@@ -1,8 +1,8 @@
1
1
  module Hecks
2
- module CLI
2
+ module Tools
3
3
  module StressConcurrencySpecs
4
4
  USAGE = <<~TEXT.freeze
5
- Usage: hecks stress_concurrency [--runs N] [--parallel N] [--seed-start N]
5
+ Usage: hecks test_suite_run.stress_concurrency! [--runs N] [--parallel N] [--seed-start N]
6
6
 
7
7
  --runs N How many times to run EACH group below. Each run uses
8
8
  a different --seed (seed-start + run index).
@@ -16,8 +16,8 @@ module Hecks
16
16
  --seed-start N First --seed value; runs use seed_start,
17
17
  seed_start + 1, ... seed_start + runs - 1.
18
18
 
19
- `hecks stress_concurrency` fills --runs and --seed-start from the defaults its
20
- bluebook declares (`hecks stress_concurrency --help` shows them).
19
+ `hecks test_suite_run.stress_concurrency!` fills --runs and --seed-start from the defaults its
20
+ bluebook declares (`hecks test_suite_run.stress_concurrency! --help` shows them).
21
21
 
22
22
  Exits 0 if every run's every example passed, 1 if anything failed -
23
23
  failing runs' full output is saved under tmp/stress-failures/
@@ -7,8 +7,8 @@ require_relative "stress_concurrency_specs/usage"
7
7
  require_relative "stress_concurrency_specs/reporting"
8
8
 
9
9
  module Hecks
10
- module CLI
11
- # The command behind `hecks stress_concurrency`: reruns the thread-safety specs under many
10
+ module Tools
11
+ # The command behind `hecks test_suite_run.stress_concurrency!`: reruns the thread-safety specs under many
12
12
  # seeds, several OS processes at a time. A clean run shows only "not in this many tries", never
13
13
  # "impossible".
14
14
  #
@@ -65,7 +65,7 @@ module Hecks
65
65
  return false if missing.empty?
66
66
 
67
67
  warn "missing #{missing.map { |name| "--#{name.to_s.tr("_", "-")}" }.join(", ")}: " \
68
- "`hecks stress_concurrency` supplies the defaults its bluebook declares (--help for usage)"
68
+ "`hecks test_suite_run.stress_concurrency!` supplies the defaults its bluebook declares (--help for usage)"
69
69
  true
70
70
  end
71
71