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
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hecks/corpus"
4
+ require_relative "tree"
5
+ require_relative "../console_capture"
6
+
7
+ module Hecks
8
+ module Adapters
9
+ module Codebase
10
+ # What Codebase's `GeneratedKey` query asks of the working tree: the hash of everything
11
+ # regenerating some domains' Rust reads, which a cache of the generated tree is keyed on.
12
+ #
13
+ # The hash is `Hecks::Corpus::GeneratedKey`'s; this answers it in this process and turns a
14
+ # refusal of a domain name into the failure a query raises.
15
+ module GeneratedKeys
16
+ module_function
17
+
18
+ # @param args [Hash] the query's plain arguments: `domains` (feature names), `files`
19
+ # @param tree [Tree] the working tree, already known to be a hecks checkout
20
+ # @return [String] the hash, with each file hashed above it when `files` is true
21
+ # @raise [ConsoleCapture::Failure] when a name is not a domain, listing the valid ones
22
+ def report(args, tree)
23
+ names = args[:domains]&.split(",")
24
+ Corpus::GeneratedKey.report(names, files: args[:files] == true, root: tree.root)
25
+ rescue Corpus::UnknownDomain => e
26
+ raise ConsoleCapture::Failure, e.message
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+ require_relative "tree"
5
+ require_relative "spec_files"
6
+ require_relative "changed_specs"
7
+ require_relative "../git_rehearsal/spec_map"
8
+ require_relative "../git_rehearsal/impacted"
9
+ require_relative "../git_rehearsal/impacted/skips"
10
+
11
+ module Hecks
12
+ module Adapters
13
+ module Codebase
14
+ # The specs a branch's changes touch, found by the push rehearsal's own map and run in one
15
+ # launcher boot.
16
+ #
17
+ # The changed files are those between the merge base with the base ref and the working tree
18
+ # (uncommitted and untracked files included). `GitRehearsal::SpecMap` names the specs, and
19
+ # `GitRehearsal::Impacted::Skips` leaves out those that need `cargo`, `gh` or the network, and
20
+ # the `:io` ones when no scratch Postgres answers, exactly as the rehearsal's stage does.
21
+ class ImpactedSpecs
22
+ # The most spec files a run takes, as the rehearsal's stage does.
23
+ DEFAULT_CAP = GitRehearsal::Impacted::DEFAULT_LIMIT
24
+
25
+ DIGITS = /\d+/
26
+ TOTALS = /\d+ examples?, \d+ failures?\z/
27
+
28
+ # @param tree [Tree] the checkout
29
+ # @param scratch [#call, nil] says whether a scratch Postgres answers; `pg_isready` when nil
30
+ # @param files [SpecFiles, nil] runs the mapped specs
31
+ def initialize(tree, scratch: nil, files: nil)
32
+ @tree = tree
33
+ @scratch = scratch || -> { scratch_answers? }
34
+ @files = files || SpecFiles.new(tree)
35
+ end
36
+
37
+ # @param base [String] the ref the branch is compared with
38
+ # @param cap [Integer] the most spec files to run
39
+ # @param dry [Boolean] list the mapped specs and run none
40
+ # @param run_options [Hash] `isolation`, `example`, `env` and `tags`, as `SpecFiles#run`
41
+ # takes them
42
+ # @return [String] the changed files, the mapped, skipped and run specs and how each ended
43
+ # @raise [ConsoleCapture::Failure] when git refuses or a spec fails
44
+ def call(base:, cap: DEFAULT_CAP, dry: false, **run_options)
45
+ changed = changed_files(base)
46
+ skips = GitRehearsal::Impacted::Skips.new(@tree.root, scratch: @scratch)
47
+ mapping = GitRehearsal::SpecMap.new(@tree.root).map(changed, limit: cap, skip: skips)
48
+ head = describe(base, changed, mapping)
49
+ return "#{head}\nnothing impacted; nothing run" if mapping.specs.empty?
50
+ return "#{head}\ndry run: no spec run" if dry
51
+
52
+ [head, run(mapping.specs, skips, run_options)].join("\n\n")
53
+ end
54
+
55
+ private
56
+
57
+ def changed_files(base)
58
+ merge, status = Open3.capture2e("git", "-C", @tree.root, "merge-base", "HEAD", base)
59
+ ChangedSpecs.changed_files(@tree, status.success? ? merge.strip : base)
60
+ end
61
+
62
+ def describe(base, changed, mapping)
63
+ lines = ["changed since #{base}: #{changed.size} file(s)", *changed.map { |file| " #{file}" },
64
+ "impacted specs: #{mapping.specs.size}", *mapping.specs.map { |spec| " #{spec}" }]
65
+ lines << mapping.cap_note unless mapping.cap_note.empty?
66
+ (lines + mapping.skipped.map { |spec, why| "skipped: #{spec} (#{why})" }).join("\n")
67
+ end
68
+
69
+ # The `:io` specs run as CI does (`CI=true`), the rest as they are; with both, the report
70
+ # ends with the counts of both runs together.
71
+ def run(specs, skips, options)
72
+ io, plain = specs.partition { |spec| skips.io?(spec) }
73
+ env = options.fetch(:env, {})
74
+ groups = [[plain, env], [io, env.merge("CI" => "true")]].reject { |group, _env| group.empty? }
75
+ reports = groups.map { |group, group_env| batch(group, options.merge(env: group_env)) }
76
+ answer(reports)
77
+ end
78
+
79
+ def answer(reports)
80
+ text = (reports.map(&:text) + [(combined(reports) if reports.size > 1)]).compact.join("\n\n")
81
+ raise ConsoleCapture::Failure, text if reports.any?(&:failed)
82
+
83
+ text
84
+ end
85
+
86
+ # What a batch said, and whether a file of it failed.
87
+ Batch = Struct.new(:text, :failed)
88
+
89
+ def batch(group, options)
90
+ Batch.new(@files.run(files: group, **options), false)
91
+ rescue ConsoleCapture::Failure => e
92
+ Batch.new(e.message, true)
93
+ end
94
+
95
+ def combined(reports)
96
+ counts = reports.map { |report| final_counts(report.text) }
97
+ "#{counts.sum(&:first)} examples, #{counts.sum(&:last)} failures"
98
+ end
99
+
100
+ def final_counts(text) = text[TOTALS].scan(DIGITS).map(&:to_i)
101
+
102
+ def scratch_answers?
103
+ Open3.capture2e("pg_isready").last.success?
104
+ rescue SystemCallError
105
+ false
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -49,14 +49,14 @@ module Hecks
49
49
 
50
50
  # What the tool says after a proposal or a rename, which still needs hand work.
51
51
  FOLLOW_UP = {
52
- "propose" => "Proposed. It reaches no projection until admitted. Before `hecks admit`:\n " \
52
+ "propose" => "Proposed. It reaches no projection until admitted. Before `hecks language_run.admit!`:\n " \
53
53
  "1. teach the %<context>s builder the word (and its spec/dsl_spec example)",
54
54
  "rename" => "Renamed. The old spelling keeps parsing — that is the point. Before this holds:\n " \
55
55
  "1. alias the new word to the old in the %<context>s builder " \
56
56
  "(alias_method :%<new_name>s, :%<word>s)\n " \
57
57
  "2. add the identical-IR example to spec/dsl_spec.rb",
58
58
  "propose_argument" => "Proposed. It reaches no projection until admitted. Before " \
59
- "`hecks admit_argument`:\n " \
59
+ "`hecks language_run.admit_argument!`:\n " \
60
60
  "1. teach the %<context>s builder's %<word>s method the argument"
61
61
  }.freeze
62
62
 
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hecks/command_names"
4
+ require "hecks/workflow_pagination"
5
+
6
+ module Hecks
7
+ module Adapters
8
+ module Codebase
9
+ # What Codebase's `ConformanceRun` asks of the text that drives the launcher and GitHub: the
10
+ # workflows, hooks, gate rows, specs and guides.
11
+ #
12
+ # Both checks read files in this process and write nothing. They look for the two ways such
13
+ # text goes quietly wrong: a command name the launcher does not accept, and a count of
14
+ # GitHub list items taken from the first page only.
15
+ module LauncherText
16
+ module_function
17
+
18
+ # @param tree [Tree] the working tree, already known to be a hecks checkout
19
+ # @return [String] the clean verdict
20
+ # @raise [ConsoleCapture::Failure] with each invocation the launcher would refuse
21
+ def command_names(tree)
22
+ runtime = Hecks.describe(tree.path("lib/hecks/hecks"))
23
+ CommandNames.check(root: tree.root, runtime: runtime)
24
+ rescue CommandNames::Failure => e
25
+ raise ConsoleCapture::Failure, e.message
26
+ end
27
+
28
+ # @param tree [Tree] the working tree
29
+ # @return [String] the clean verdict
30
+ # @raise [ConsoleCapture::Failure] with each list call that counts one page
31
+ def workflow_pagination(tree)
32
+ WorkflowPagination.check(root: tree.root)
33
+ rescue WorkflowPagination::Failure => e
34
+ raise ConsoleCapture::Failure, e.message
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+
5
+ module Hecks
6
+ module Adapters
7
+ module Codebase
8
+ # The minitest files of a spec directory. RSpec does not run them, so each one runs in its own Ruby
9
+ # process, and its run summary is reported beside the RSpec output.
10
+ module MinitestRuns
11
+ # The summary line minitest prints, such as "3 runs, 5 assertions".
12
+ SUMMARY = /\d+ runs?, /
13
+
14
+ module_function
15
+
16
+ # @param tree [Tree] the folder whose specs are listed
17
+ # @return [Array<String>] their paths, relative to the folder, sorted
18
+ def files(tree)
19
+ Dir.glob("#{TestSuite::SPEC_DIRECTORY}/**/*_test.rb", base: tree.root).sort
20
+ end
21
+
22
+ # Runs each file in its own Ruby process, from the folder, outside this process's bundle so the
23
+ # folder's own gems are the ones it loads.
24
+ #
25
+ # @param tree [Tree] the folder the files run in
26
+ # @param files [Array<String>] the minitest files
27
+ # @return [Array<String>] one line per file: its path and its run summary
28
+ # @raise [ConsoleCapture::Failure] with the output of the first file that fails
29
+ def reports(tree, files)
30
+ files.map do |file|
31
+ out, status = unbundled { Open3.capture2e(RbConfig.ruby, file, chdir: tree.root) }
32
+ raise ConsoleCapture::Failure, "#{file} failed\n#{out.strip}" unless status.success?
33
+
34
+ "#{file}: #{summary(out)}"
35
+ end
36
+ end
37
+
38
+ # @param out [String] what a minitest file printed
39
+ # @return [String] its last run summary line, or nothing when it printed none
40
+ def summary(out)
41
+ matches = out.lines.grep(SUMMARY)
42
+ matches.last.to_s.strip
43
+ end
44
+
45
+ # Runs the block without the bundle this process was started under, when Bundler is loaded.
46
+ def unbundled(&)
47
+ defined?(Bundler) ? Bundler.with_unbundled_env(&) : yield
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative "tree"
4
4
  require_relative "ruby_child"
5
+ require "hecks/tools/gate_memo/standalone"
5
6
 
6
7
  module Hecks
7
8
  module Adapters
@@ -10,13 +11,16 @@ module Hecks
10
11
  # domain's committed Rust output, and projecting the CI path gates into the workflows.
11
12
  #
12
13
  # It runs `Hecks::Tools::RegenerationRun` in this process: the run forks once for each
13
- # domain, in a fixed order, because the domains share the files they stamp. With `check` it
14
- # projects into a scratch copy of the crate and compares, and never writes the tree. Without
15
- # `confirm` the run is that same check, so a regeneration that would rewrite tracked generated
16
- # files reports drift and writes only when it is confirmed.
14
+ # domain, a few at a time (`workers`, one per core unless told), and prints their output in
15
+ # a fixed domain order. The domains share the bluebooks they attach, and each writes the same
16
+ # bytes to them whichever runs first. With `check` it projects into a scratch copy of the
17
+ # crate and compares, and never writes the tree. Without `confirm` the run is that same
18
+ # check, so a regeneration that would rewrite tracked generated files reports drift and
19
+ # writes only when it is confirmed.
17
20
  module Regeneration
18
21
  # Every operation this family carries out.
19
- OPERATIONS = %w[regenerate_corpus project_ci_gates project_lanes project_tools_doc decide_ci_gate].freeze
22
+ OPERATIONS = %w[regenerate_corpus project_ci_gates project_ci_pipeline project_lanes project_tools_doc
23
+ decide_ci_gate].freeze
20
24
 
21
25
  # How many lines of a script's output a refusal keeps.
22
26
  KEPT_LINES = 60
@@ -40,13 +44,42 @@ module Hecks
40
44
  child = RubyChild.new(tree)
41
45
  case operation
42
46
  when "project_ci_gates" then project_ci_gates(child, check)
47
+ when "project_ci_pipeline" then project_ci_pipeline(child, check)
43
48
  when "project_lanes" then project_lanes(child, check, set?(held, :live), set?(held, :confirm))
44
49
  when "project_tools_doc" then project_tools_doc(child, check)
45
50
  when "decide_ci_gate" then decide_ci_gate(child, held)
46
- else regenerate(child, check)
51
+ else regenerate_remembered(child, tree, held, check)
47
52
  end
48
53
  end
49
54
 
55
+ # A check of the whole corpus that is not confirmed is skipped when the gate or an earlier
56
+ # check passed on the same files. A run that writes, or checks only some domains, always
57
+ # runs.
58
+ #
59
+ # @return [String] the verdict, or that the check was skipped as unchanged
60
+ def regenerate_remembered(child, tree, held, check)
61
+ args = [*domains(held), *workers(held)]
62
+ whole = check && args.empty? && !set?(held, :confirm)
63
+ return regenerate(child, check, args) unless whole
64
+
65
+ Tools::GateMemo::Standalone.guard(tree.root, "codegen_drift") { regenerate(child, check, args) }
66
+ end
67
+
68
+ # @param held [Hash] the `RegenerationRun` record's fields: `domains`
69
+ # @return [Array<String>] the tool's argument naming the domains to run, empty for every one
70
+ def domains(held)
71
+ named = held[:domains].is_a?(Hash) ? held[:domains][:value] : held[:domains]
72
+ named.to_s.empty? ? [] : ["domains=#{named}"]
73
+ end
74
+
75
+ # @param held [Hash] the `RegenerationRun` record's fields: `workers`
76
+ # @return [Array<String>] the tool's argument saying how many domains run at once, empty to
77
+ # leave it to the tool's default
78
+ def workers(held)
79
+ count = held[:workers].is_a?(Hash) ? held[:workers][:value] : held[:workers]
80
+ count.to_s.empty? ? [] : ["workers=#{count}"]
81
+ end
82
+
50
83
  # @param held [Hash] the record's fields: `check`, `confirm`
51
84
  # @return [Boolean] whether the run only compares: asked for, or not confirmed
52
85
  def check_only?(held)
@@ -62,10 +95,12 @@ module Hecks
62
95
 
63
96
  # @param child [RubyChild] the checkout's tool runner
64
97
  # @param check [Boolean] whether to only compare
98
+ # @param domains [Array<String>] `domains=a,b` when only those are to run and `workers=n`
99
+ # when told how many at once, else empty
65
100
  # @return [String] how many domains were checked or regenerated
66
101
  # @raise [ConsoleCapture::Failure] with the difference, or with what the script printed
67
- def regenerate(child, check)
68
- result = child.capture("regen_codegen_domains", *("--check" if check))
102
+ def regenerate(child, check, domains = [])
103
+ result = child.capture("regen_codegen_domains", *("--check" if check), *domains)
69
104
  raise ConsoleCapture::Failure, refusal(result) unless result.ok?
70
105
 
71
106
  summary(result.out, check)
@@ -79,6 +114,14 @@ module Hecks
79
114
  child.answer("project_ci_gates", *("--check" if check))
80
115
  end
81
116
 
117
+ # @param child [RubyChild] the checkout's tool runner
118
+ # @param check [Boolean] whether to only compare
119
+ # @return [String] what the tool printed
120
+ # @raise [ConsoleCapture::Failure] with the stale workflows, when a check finds drift
121
+ def project_ci_pipeline(child, check)
122
+ child.answer("project_ci_pipeline", *("--check" if check))
123
+ end
124
+
82
125
  # Projects the `Lane` rows, or with `live` compares GitHub's rulesets with them. Only a live
83
126
  # run that is confirmed changes GitHub, so without `confirm` a live run is a comparison.
84
127
  #
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hecks
4
+ module Adapters
5
+ module Codebase
6
+ # What a spec run's arguments become: the variables the specs read, and the flags a stress run takes.
7
+ # A person names them in a request, so they never set them in a shell.
8
+ module RunOptions
9
+ module_function
10
+
11
+ # The variables the specs read, set for one example only.
12
+ #
13
+ # @param args [Hash] `strict`, `seeds`, `environment` and `declaration_cache`, each
14
+ # perhaps absent
15
+ # @return [Hash{String => String}] only those the run named
16
+ def spec_env(args)
17
+ { "CI" => ("true" if args[:strict] == true), "PROPERTY_SEEDS" => args[:seeds]&.to_s,
18
+ "HECKS_ENVIRONMENT" => args[:environment],
19
+ "HECKS_NO_DECLARATION_CACHE" => ("1" if args[:declaration_cache] == false) }.compact
20
+ end
21
+
22
+ # @param args [Hash] `runs`, `parallel` and `seed_start`
23
+ # @return [Array<String>] the script's flags for those that are named
24
+ def stress_flags(args)
25
+ { "--runs" => :runs, "--parallel" => :parallel, "--seed-start" => :seed_start }
26
+ .filter_map { |flag, name| [flag, args[name].to_s] if args[name] }.flatten
27
+ end
28
+
29
+ # @param args [Hash] `fixture`, perhaps absent
30
+ # @return [Hash{String => String}] the variable that names the one fixture to re-seed
31
+ def seed_env(args) = args[:fixture] ? { "SEED" => args[:fixture] } : {}
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../../tools/move_disables"
4
+
5
+ module Hecks
6
+ module Adapters
7
+ module Codebase
8
+ # What Codebase's `ScriptRun` asks of the working tree: one named one-off script, planned, or
9
+ # applied once confirmed. A script's body is a tool under `lib/hecks/tools`; `SCRIPTS` names
10
+ # the ones this family may run, so a record cannot reach a tool it does not list.
11
+ module Scripting
12
+ # Every operation this family carries out.
13
+ OPERATIONS = %w[plan_script apply_script].freeze
14
+
15
+ # Each script a record may name, with the tool that carries it out.
16
+ SCRIPTS = { "move_disables" => Hecks::Tools::MoveDisables }.freeze
17
+
18
+ module_function
19
+
20
+ # Carries out one operation on the named script.
21
+ #
22
+ # @param operation [String] one of `OPERATIONS`
23
+ # @param held [Hash] the `ScriptRun` record's fields
24
+ # @param tree [Tree] the working tree, already known to be a hecks checkout
25
+ # @param shell [#capture, nil] unused: the tool runs in this process
26
+ # @return [String] the tool's plan, or the plan and what it wrote
27
+ # @raise [ConsoleCapture::Failure] when the record names no script this family runs
28
+ def call(operation, held, tree, shell: nil)
29
+ args = held.transform_values { |value| value.is_a?(Hash) ? value[:value] : value }
30
+ name = args[:script].to_s
31
+ tool = SCRIPTS.fetch(name) do
32
+ raise ConsoleCapture::Failure, "no script named #{name.inspect}; the scripts are #{SCRIPTS.keys.join(", ")}"
33
+ end
34
+ tool.transform(root: tree.root, apply: operation == "apply_script")
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -14,7 +14,7 @@ module Hecks
14
14
  # byte in its first block, which is how a binary announces itself.
15
15
  module Search
16
16
  # Directory names that are never walked.
17
- SKIPPED = %w[.git .jj target node_modules tmp vendor worktrees].freeze
17
+ SKIPPED = %w[.git target node_modules tmp vendor worktrees].freeze
18
18
 
19
19
  # The rows kept when `top` is not named.
20
20
  DEFAULT_TOP = 200
@@ -10,17 +10,44 @@ require_relative "style"
10
10
  require_relative "inspection"
11
11
  require_relative "search"
12
12
  require_relative "reading"
13
+ require_relative "corpus_queries"
14
+ require_relative "generated_keys"
13
15
  require_relative "codemods"
14
16
  require_relative "test_suite"
17
+ require_relative "test_scope"
15
18
  require_relative "corpus_tasks"
16
19
  require_relative "composing"
17
20
  require_relative "previewing"
18
21
  require_relative "publishing"
19
22
  require_relative "promotion"
23
+ require_relative "scripting"
20
24
  require_relative "../git"
21
25
 
22
26
  module Hecks
23
27
  module Adapters
28
+ # The lookup and working tree a perform runs against, kept out of the class body.
29
+ module Performing
30
+ # @param operation [String] the operation the request names
31
+ # @return [Module] the family that carries it out
32
+ # @raise [ConsoleCapture::Failure] when no family carries the operation out
33
+ def family_for(operation)
34
+ SourceTree::FAMILIES.find { |candidate| candidate::OPERATIONS.include?(operation) } ||
35
+ raise(ConsoleCapture::Failure, "no task carries out #{operation.inspect}")
36
+ end
37
+
38
+ # @param operation [String] the operation the request names
39
+ # @param held [Hash] the record, whose folder argument a folder operation reads
40
+ # @return [Object] the tree the operation runs against
41
+ def working_tree(operation, held)
42
+ Codebase::TestSuite::FOLDER_OPERATIONS.include?(operation) ? folder_tree(held) : checkout_tree
43
+ end
44
+
45
+ # @return [Object] the shell the family runs commands through
46
+ def shell
47
+ self.class.shell || Shell.new
48
+ end
49
+ end
50
+
24
51
  # The `SourceTree` port's adapter: everything Codebase does to the working tree of this
25
52
  # repository.
26
53
  #
@@ -31,6 +58,9 @@ module Hecks
31
58
  # `perform` finds the task family that carries an operation out; a family lives beside this
32
59
  # file and does the work with the existing generators, linters and tools.
33
60
  class SourceTree
61
+ include CorpusQueries
62
+ include Performing
63
+
34
64
  class << self
35
65
  # @return [#capture, nil] starts each child process; a `Shell` when nil. A spec replaces it
36
66
  # so no gate has to run to test what is asked of it.
@@ -42,7 +72,10 @@ module Hecks
42
72
  # @param aggregate [Object, nil] unused
43
73
  # @param settings [Hash] unused
44
74
  # @param root [String, nil] unused
45
- def initialize(aggregate: nil, settings: {}, root: nil); end
75
+ # @param registry [Runtime::Registry, nil] whose Hecks world declares the `test_scope` limit
76
+ def initialize(aggregate: nil, settings: {}, root: nil, registry: nil)
77
+ @registry = registry
78
+ end
46
79
 
47
80
  # Reports whether the working tree is a hecks checkout. For a release it also reports the
48
81
  # facts the Git adapter surveys, since a release's rules are judged with the checkout rule.
@@ -51,8 +84,10 @@ module Hecks
51
84
  # @return [Hash{Symbol => Hash}] `checkout:` whether hecks.gemspec stands beside lib/, and for
52
85
  # a release the facts to judge
53
86
  def examine(**held)
54
- answer = { checkout: { value: tree.checkout? } }
55
87
  operation = plain(held[:operation])
88
+ return { checkout: { value: folder_specs?(held) } } if Codebase::TestSuite::FOLDER_OPERATIONS.include?(operation)
89
+
90
+ answer = { checkout: { value: tree.checkout? } }
56
91
  return answer.merge(promotion_facts(held)) if Codebase::Promotion::OPERATIONS.include?(operation)
57
92
  return answer unless Codebase::Publishing::OPERATIONS.include?(operation)
58
93
 
@@ -68,13 +103,13 @@ module Hecks
68
103
  # @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
69
104
  # @raise [ConsoleCapture::Failure] when no family carries the operation out, or it refuses
70
105
  def perform(**held)
71
- tree.require_checkout!
72
106
  operation = plain(held[:operation])
73
- family = FAMILIES.find { |candidate| candidate::OPERATIONS.include?(operation) }
74
- raise ConsoleCapture::Failure, "no task carries out #{operation.inspect}" unless family
107
+ return handed_off(operation) if HANDED_OFF.include?(operation)
75
108
 
76
- args = held.except(:operation)
77
- done = family.call(operation, args, tree, shell: self.class.shell || Shell.new)
109
+ family = family_for(operation)
110
+ folder = working_tree(operation, held)
111
+ allowed = Codebase::TestScope.new(@registry).admit(operation, held.except(:operation), folder)
112
+ done = family.call(operation, allowed, folder, shell: shell)
78
113
  done.is_a?(Hash) ? done : { report: { value: done } }
79
114
  end
80
115
 
@@ -150,46 +185,26 @@ module Hecks
150
185
  { text: test_suite("record_pattern_cases", {}) }
151
186
  end
152
187
 
153
- # @return [Hash] `text:` the feature and directory of every domain with a Rust feature
154
- # @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
155
- def rust_domains(**)
156
- { text: corpus("rust_domains", {}) }
157
- end
158
-
159
- # @return [Hash] `text:` the directories regeneration walks, in the order it walks them
160
- # @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
161
- def regen_order(**)
162
- { text: corpus("regen_order", {}) }
163
- end
164
-
165
- # @return [Hash] `text:` whether each generated Rust module is covered
166
- # @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
167
- # @raise [ConsoleCapture::Failure] when a module is not covered
168
- def corpus_rust_coverage(**)
169
- { text: corpus("corpus_rust_coverage", {}) }
170
- end
171
-
172
- # @param args [Hash] the query's arguments: `names`
173
- # @return [Hash] `text:` each IR construct's diff from its meta-domain
188
+ # @param args [Hash] the query's arguments: `domains` (feature names), `files`
189
+ # @return [Hash] `text:` the hash of what regenerating those domains reads, with `files` each
190
+ # file hashed above it
174
191
  # @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
175
- def ir_constructs(**args)
176
- { text: corpus("ir_constructs", args) }
192
+ # @raise [ConsoleCapture::Failure] when a name is not a domain, listing the valid ones
193
+ def generated_key(**args)
194
+ tree.require_checkout!
195
+ { text: Codebase::GeneratedKeys.report(args.transform_values { |value| plain(value) }, tree) }
177
196
  end
178
197
 
179
- # @param args [Hash] the query's arguments: `domains`, `meta`
180
- # @return [Hash] `text:` the rules declared more than once
181
- # @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
182
- def ir_duplicates(**args)
183
- { text: corpus("ir_duplicates", args) }
184
- end
198
+ # Operations the Terminal adapter carries out itself: the run records that the server was
199
+ # started and answers when the process hands back, so nothing here runs them.
200
+ HANDED_OFF = %w[serve_mcp].freeze
201
+ private_constant :HANDED_OFF
185
202
 
186
- # @param args [Hash] the query's arguments: `name`, `field`
187
- # @return [Hash] `text:` which propagation touchpoints already show the field
188
- # @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
189
- # @raise [ConsoleCapture::Failure] when the construct is not one
190
- def ir_impact(**args)
191
- { text: corpus("ir_impact", args) }
192
- end
203
+ # The task families, each carrying out the operations it lists.
204
+ FAMILIES = [Codebase::Language, Codebase::KernelTables, Codebase::Conformance, Codebase::Regeneration,
205
+ Codebase::Gate, Codebase::Style, Codebase::Inspection, Codebase::Codemods, Codebase::TestSuite,
206
+ Codebase::CorpusTasks, Codebase::Composing, Codebase::Previewing,
207
+ Codebase::Publishing, Codebase::Promotion, Codebase::Scripting].freeze
193
208
 
194
209
  private
195
210
 
@@ -216,21 +231,34 @@ module Hecks
216
231
  Codebase::Style.report(operation, plain_args, tree, shell: self.class.shell)
217
232
  end
218
233
 
219
- # The task families, each carrying out the operations it lists.
220
- FAMILIES = [Codebase::Language, Codebase::KernelTables, Codebase::Conformance, Codebase::Regeneration,
221
- Codebase::Gate, Codebase::Style, Codebase::Inspection, Codebase::Codemods, Codebase::TestSuite,
222
- Codebase::CorpusTasks, Codebase::Composing, Codebase::Previewing,
223
- Codebase::Publishing, Codebase::Promotion].freeze
224
- private_constant :FAMILIES
225
-
226
234
  # The facts of a promotion or a watch, naming the operation so policies can tell them apart.
227
235
  def promotion_facts(held)
228
236
  facts = tree.checkout? ? Codebase::Promotion.facts(held, tree) : Codebase::Promotion.no_facts
229
- { operation: held[:operation], alert_key: held[:alert_key] }.compact.merge(facts)
237
+ { operation: held[:operation] }.compact.merge(facts)
238
+ end
239
+
240
+ # @return [Hash{Symbol => Hash}] `report:` the note that the terminal carries the operation
241
+ def handed_off(operation)
242
+ note = { value: "#{operation} handed to the terminal" }
243
+ { report: note, output: note }
230
244
  end
231
245
 
232
246
  def tree = Codebase::Tree.new
233
247
 
248
+ # The checkout this repository's own tooling works on, which must be a hecks checkout.
249
+ def checkout_tree
250
+ tree.require_checkout!
251
+ tree
252
+ end
253
+
254
+ # The folder a spec run works in: the one the request names, this checkout when none is.
255
+ def folder_tree(held) = Codebase::Tree.new(root: plain(held[:root]))
256
+
257
+ # Whether the folder a spec run names holds a spec directory, so any project's suite can run.
258
+ def folder_specs?(held)
259
+ File.directory?(File.join(folder_tree(held).root, Codebase::TestSuite::SPEC_DIRECTORY))
260
+ end
261
+
234
262
  def plain(argument) = argument.is_a?(Hash) ? argument[:value] : argument
235
263
  end
236
264
  end