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,945 @@
1
+ Hecks.bluebook "Hecks" do
2
+ domain_module "Deliver" do
3
+ vision "Take finished work into the shared line."
4
+
5
+ # A checkout's state, read and never written: nothing needs a raw `git status`, `git diff` or
6
+ # `git log`. The `Reading` port's adapter answers each query; the aggregate keeps no record.
7
+ aggregate "Workspace" do
8
+ description "A look at a checkout: its branch, what it changed and what it committed."
9
+ acknowledges :no_command_surface, "a look at a checkout: it answers the state of a checkout and changes nothing"
10
+
11
+ attribute :checkout, Place
12
+ identified_by :checkout
13
+
14
+ # A directory inside the repository; the current directory when a query names none.
15
+ value_object "Place" do
16
+ attribute :value, String, matches: :present
17
+ end
18
+
19
+ value_object "Word" do
20
+ attribute :value, String, matches: :present
21
+ end
22
+
23
+ value_object "Document" do
24
+ attribute :text, String
25
+ end
26
+
27
+ query "Status" do
28
+ description "The checkout's branch, whether it is a linked worktree, where it stands against main and origin/main, and what is changed or untracked."
29
+ attribute :checkout, Place, optional: true
30
+ returns Document
31
+ end
32
+
33
+ query "Changes" do
34
+ description "What the checkout changed since a ref (main by default): the diffstat, or the paths alone."
35
+ attribute :checkout, Place, optional: true
36
+ attribute :since, Word, optional: true
37
+ attribute :names_only, Boolean, optional: true
38
+ returns Document
39
+ end
40
+
41
+ query "History" do
42
+ description "The commits in a range, newest first (the last 20 when none is named)."
43
+ attribute :checkout, Place, optional: true
44
+ attribute :range, Word, optional: true
45
+ returns Document
46
+ end
47
+
48
+ query "Settings" do
49
+ description "What this copy resolves for each setting that can come from a variable, its own world or a default, and which one supplied it."
50
+ attribute :domain, Place, optional: true
51
+ returns Document
52
+ end
53
+
54
+ query "Doctor" do
55
+ description "Whether this checkout can run Hecks here: overlay files parse, the stores answer, the toolchain pin matches, and what this worktree cannot see."
56
+ attribute :domain, Place, optional: true
57
+ returns Document
58
+ end
59
+
60
+ query "Where" do
61
+ description "Where this checkout's domain resolves: the store each bluebook uses and why, the audience and environment with their reasons, and any overlay file this worktree lacks."
62
+ attribute :domain, Place, optional: true
63
+ returns Document
64
+ end
65
+ end
66
+
67
+ # A commit made in a checkout under a message: asked of the git port, then recorded or declined. It commits
68
+ # what is staged, or the named paths, and never pushes, amends, forces, or commits onto main. Those go
69
+ # through `Landing` and `SendTrain`.
70
+ aggregate "Revision" do
71
+ description "One commit made in a checkout, or declined with the reason: what it says and what it is on."
72
+
73
+ attribute :run, RunKey
74
+ attribute :checkout, Word, optional: true
75
+ attribute :message, Text, optional: true
76
+ attribute :paths, Text, optional: true
77
+ attribute :sha, Word, optional: true
78
+ attribute :report, Report, optional: true
79
+ attribute :refusal, Report, optional: true
80
+ identified_by :run
81
+
82
+ value_object "RunKey" do
83
+ attribute :value, String, matches: :present
84
+ end
85
+
86
+ # A directory or a commit.
87
+ value_object "Word" do
88
+ attribute :value, String, matches: :present
89
+ end
90
+
91
+ # What a commit says, and which paths it stages first, separated by spaces.
92
+ value_object "Text" do
93
+ attribute :value, String
94
+ end
95
+
96
+ value_object "Report" do
97
+ attribute :value, String
98
+ end
99
+
100
+ lifecycle :status, default: "requested" do
101
+ mark :failure, "declined"
102
+ transition "Record" => "committed", from: "requested"
103
+ transition "Decline" => "declined", from: "requested"
104
+ mark :terminal, "committed", "declined"
105
+ end
106
+
107
+ command "Make" do
108
+ role "Operator"
109
+ goal "Commit what is staged in a checkout under a message: never pushed, never amended, never onto main"
110
+
111
+ attribute :run, RunKey, sets: true
112
+ attribute :checkout, Word, optional: true, sets: true
113
+ attribute :message, Text, sets: true
114
+ attribute :paths, Text, optional: true, sets: true
115
+
116
+ given("a commit says what it commits") do
117
+ message.value.to_s.strip != ""
118
+ end
119
+
120
+ emits CommitRequested
121
+ end
122
+
123
+ command "Record" do
124
+ role "System"
125
+ goal "Record the commit a checkout made, by the sha it has"
126
+
127
+ reference_to Revision
128
+ attribute :sha, Word, sets: true
129
+ attribute :report, Report, sets: true
130
+
131
+ emits CommitRecorded
132
+ end
133
+
134
+ command "Decline" do
135
+ role "System"
136
+ goal "Record why a commit could not be made"
137
+
138
+ reference_to Revision
139
+ attribute :refusal, Report, sets: true
140
+
141
+ emits CommitDeclined
142
+ end
143
+ end
144
+
145
+ # A linked worktree opened on a new branch from main: asked of the git port, then recorded or declined. The
146
+ # path is the one the caller names, or a directory under the checkout's `.claude/worktrees`. `Landing` and
147
+ # `Landing.retire!` take it from there, so a session that cannot run `git worktree add` itself can still open one.
148
+ aggregate "LinkedTree" do
149
+ description "A linked worktree opened on a new branch from main, or declined with the reason."
150
+
151
+ attribute :run, RunKey
152
+ attribute :checkout, Word, optional: true
153
+ attribute :branch, Word, optional: true
154
+ attribute :path, Word, optional: true
155
+ attribute :sha, Word, optional: true
156
+ attribute :report, Report, optional: true
157
+ attribute :refusal, Report, optional: true
158
+ identified_by :run
159
+
160
+ value_object "RunKey" do
161
+ attribute :value, String, matches: :present
162
+ end
163
+
164
+ # A directory or a branch name.
165
+ value_object "Word" do
166
+ attribute :value, String, matches: :present
167
+ end
168
+
169
+ value_object "Report" do
170
+ attribute :value, String
171
+ end
172
+
173
+ lifecycle :status, default: "requested" do
174
+ mark :failure, "declined"
175
+ transition "Record" => "opened", from: "requested"
176
+ transition "Decline" => "declined", from: "requested"
177
+ transition "Pulled" => "pulled", from: "requested"
178
+ transition "PullDeclined" => "declined", from: "requested"
179
+ mark :terminal, "opened", "declined", "pulled"
180
+ end
181
+
182
+ command "Add" do
183
+ role "Operator"
184
+ goal "Open a linked worktree on a new branch from main, never on main itself"
185
+
186
+ attribute :run, RunKey, sets: true
187
+ attribute :checkout, Word, optional: true, sets: true
188
+ attribute :branch, Word, sets: true
189
+ attribute :path, Word, optional: true, sets: true
190
+
191
+ given("a worktree is opened on a branch other than main") do
192
+ branch.value.to_s.strip != "" && branch.value.to_s.strip != "main"
193
+ end
194
+
195
+ emits AddRequested
196
+ end
197
+
198
+ command "PullMain" do
199
+ role "Operator"
200
+ goal "Bring local main up to date with origin/main: fetch, fast-forward when behind, rebase its unpushed commits when diverged, refusing a dirty or mid-rebase checkout"
201
+
202
+ attribute :run, RunKey, sets: true
203
+ attribute :checkout, Word, optional: true, sets: true
204
+
205
+ emits PullRequested
206
+ end
207
+
208
+ command "Pulled" do
209
+ role "System"
210
+ goal "Record where main stands once it is up to date with origin/main"
211
+
212
+ reference_to LinkedTree
213
+ attribute :sha, Word, sets: true
214
+ attribute :report, Report, sets: true
215
+
216
+ emits MainPulled
217
+ end
218
+
219
+ command "PullDeclined" do
220
+ role "System"
221
+ goal "Record why main could not be pulled"
222
+
223
+ reference_to LinkedTree
224
+ attribute :refusal, Report, sets: true
225
+
226
+ emits PullDeclinedRecorded
227
+ end
228
+
229
+ command "Record" do
230
+ role "System"
231
+ goal "Record the worktree a checkout opened, by the sha it stands on"
232
+
233
+ reference_to LinkedTree
234
+ attribute :path, Word, optional: true, sets: true
235
+ attribute :sha, Word, sets: true
236
+ attribute :report, Report, sets: true
237
+
238
+ emits AddRecorded
239
+ end
240
+
241
+ command "Decline" do
242
+ role "System"
243
+ goal "Record why a worktree could not be opened"
244
+
245
+ reference_to LinkedTree
246
+ attribute :refusal, Report, sets: true
247
+
248
+ emits AddDeclined
249
+ end
250
+ end
251
+
252
+ policy "AddWorktreeWhenRequested" do
253
+ on "LinkedTree.AddRequested"
254
+ ask :create, with: { run: :run }
255
+ end
256
+
257
+ policy "PullMainWhenRequested" do
258
+ on "LinkedTree.PullRequested"
259
+ ask :pull, with: { run: :run }
260
+ end
261
+
262
+ policy "RecordThePull" do
263
+ on "LinkedTree.PullAnswered"
264
+ trigger LinkedTree::Pulled, with: { sha: :sha, report: :report }
265
+ end
266
+
267
+ policy "DeclineThePull" do
268
+ on "LinkedTree.PullRefused"
269
+ trigger LinkedTree::PullDeclined, with: { refusal: :refusal }
270
+ end
271
+
272
+ policy "RecordTheWorktree" do
273
+ on "LinkedTree.CreateAnswered"
274
+ trigger LinkedTree::Record, with: { path: :path, sha: :sha, report: :report }
275
+ end
276
+
277
+ policy "DeclineTheWorktree" do
278
+ on "LinkedTree.CreateRefused"
279
+ trigger LinkedTree::Decline, with: { refusal: :refusal }
280
+ end
281
+
282
+ # Lands a branch on main after its mechanical gate work: comment style is fixed, the shape
283
+ # ledger is checked, the quick gate runs, then the branch lands and boards the push train. Rubocop
284
+ # autocorrect is not a step yet (no command), so offenses it would fix still stop the gate. A
285
+ # refusal parks the instance in needs_human; a person confirms the ledger and starts it again.
286
+ # A saga cannot dispatch when it starts, so a policy starts the fix. It hears ShipStarted, emitted
287
+ # after ShipRequested is handled, because policies run before sagas for one event: on ShipRequested
288
+ # the fix would finish before the saga exists to hear it.
289
+ policy "StartTheCommentFix" do
290
+ on "Shipment.ShipStarted"
291
+ trigger StyleRun::FixComments, with: { run: :run, paths: :paths, confirm: :confirm }
292
+ end
293
+
294
+ process_manager "GateAndBoard" do
295
+ correlates_by :"run.value"
296
+ starts_on Shipment::ShipRequested
297
+
298
+ # The command a caller dispatches to resume each stage of a faulted run (`hecks resume`).
299
+ resumes "gated=GateRun.Gate"
300
+ resumes "checking=ConformanceRun.CheckShapeLedger"
301
+ resumes "landing=Landing.Land"
302
+ resumes "boarding=SendTrain.Board"
303
+
304
+ # Each step records itself and waits. The caller dispatches the next command at top level:
305
+ # ConformanceRun.CheckShapeLedger, then GateRun.Gate, then Landing.Land, then SendTrain.Board.
306
+ # A dispatch made from inside this saga would run past the reaction depth bound.
307
+ transition StyleRun::StyleCompleted => "checking", from: "fixing"
308
+ transition ConformanceRun::ConformanceAccepted => "gated", from: %w[checking needs_human]
309
+ transition GateRun::GateCompleted => "landing", from: "gated"
310
+ transition Landing::BranchLanded => "boarding", from: "landing"
311
+
312
+ transition SendTrain::BranchPushed => "boarded", from: "boarding"
313
+ transition SendTrain::CarriedByEarlierPush => "boarded", from: "boarding"
314
+
315
+ transition StyleRun::StyleFaulted => "needs_human", from: "fixing"
316
+ transition ConformanceRun::ConformanceFaulted => "needs_human", from: "checking"
317
+ transition GateRun::GateFaulted => "needs_human", from: "gated"
318
+ transition Landing::LandingRefused => "needs_human", from: "landing"
319
+ transition SendTrain::PushFaulted => "needs_human", from: "boarding"
320
+ end
321
+
322
+ # Agents merge straight to local main and clean up what they merged. A landing merges a worktree's
323
+ # branch onto main, fast-forward first and as a merge commit when main moved; a conflict is
324
+ # reported and never settled, and nothing is forced or pushed. A retirement removes the worktree
325
+ # and its branch once the branch is on main, and refuses while it holds uncommitted work or
326
+ # commits main lacks, so no unpushed work is deleted. Landings queue: each takes a ticket in a line kept in
327
+ # the main checkout's git directory and waits its turn, first come first served, for up to the world's
328
+ # `landing` wait window, saying its place and the holder. The holder beats a heartbeat while it works; a
329
+ # ticket silent for the stale window is abandoned and removed, which the next landing's report says. A
330
+ # train holds the front place and lands every ready branch behind it in order, skipping one that
331
+ # conflicts, fails the quick gate or overlaps a started row, and telling its waiting landing why.
332
+ aggregate "Landing" do
333
+ description "One branch landed on local main, or one worktree retired: done, or refused with the reason."
334
+ acknowledges :key_by_value, "the run id of the LinkedTree this landing takes its checkout and branch from, and a landing whose id names no recorded tree falls back to the explicit checkout and branch, so a reference that refused an unknown tree would break the fallback",
335
+ of: :from
336
+ created_by "Landing.land!"
337
+
338
+ attribute :run, RunKey
339
+ attribute :confirm, Switch, optional: true
340
+ attribute :checkout, Word, optional: true
341
+ attribute :branch, Word, optional: true
342
+ attribute :onto, Word, optional: true
343
+ attribute :from, RunKey, optional: true
344
+ attribute :landed, Word, optional: true
345
+ attribute :report, Report, optional: true
346
+ attribute :refusal, Report, optional: true
347
+ identified_by :run
348
+
349
+ value_object "RunKey" do
350
+ attribute :value, String, matches: :present
351
+ end
352
+
353
+ # A branch, a directory or a commit.
354
+ value_object "Word" do
355
+ attribute :value, String, matches: :present
356
+ end
357
+
358
+ value_object "Report" do
359
+ attribute :value, String
360
+ end
361
+
362
+ value_object "Document" do
363
+ attribute :text, String
364
+ end
365
+
366
+ lifecycle :status, default: "requested" do
367
+ mark :failure, "refused"
368
+ transition "Record" => "landed", from: "requested"
369
+ transition "Clear" => "retired", from: "requested"
370
+ transition "Refuse" => "refused", from: "requested"
371
+ transition "Decline" => "refused", from: "requested"
372
+ transition "Convoy" => "convoyed", from: "requested"
373
+ mark :terminal, "landed", "refused", "retired", "convoyed"
374
+ end
375
+
376
+ command "Land" do
377
+ role "Operator"
378
+ goal "Merge a worktree's branch onto local main: fast-forward when it can be, a merge commit when main moved, never forced, never pushed"
379
+
380
+ attribute :run, RunKey, sets: true
381
+ attribute :checkout, Word, optional: true, sets: true
382
+ attribute :branch, Word, optional: true, sets: true
383
+ attribute :from, RunKey, optional: true, sets: true
384
+ attribute :onto, Word, default: "main", sets: true
385
+ attribute :confirm, Switch, optional: true, sets: true
386
+
387
+ given("merges the branch onto local main needs --confirm; without it this only reports") { confirm.value == true }
388
+
389
+ emits LandingRequested
390
+ end
391
+
392
+ command "Finish" do
393
+ role "Operator"
394
+ goal "Rebase a worktree's branch onto local main, run the quick gate, land it through the queue and tidy, refusing by name at the first failure"
395
+
396
+ attribute :run, RunKey, sets: true
397
+ attribute :checkout, Word, optional: true, sets: true
398
+ attribute :branch, Word, optional: true, sets: true
399
+ attribute :onto, Word, default: "main", sets: true
400
+ attribute :confirm, Switch, optional: true, sets: true
401
+
402
+ given("rebases, lands and tidies needs --confirm; without it this only reports") { confirm.value == true }
403
+
404
+ emits FinishRequested
405
+ end
406
+
407
+ command "Train" do
408
+ role "Operator"
409
+ goal "Hold the front place in the landing line and land every ready branch behind it, in ticket order"
410
+
411
+ attribute :run, RunKey, sets: true
412
+ attribute :checkout, Word, optional: true, sets: true
413
+ attribute :onto, Word, default: "main", sets: true
414
+ attribute :confirm, Switch, optional: true, sets: true
415
+
416
+ given("lands every ready branch onto local main needs --confirm; without it this only reports") { confirm.value == true }
417
+
418
+ emits TrainRequested
419
+ end
420
+
421
+ command "Convoy" do
422
+ role "System"
423
+ goal "Record which branches the train landed and which it skipped, with the reasons"
424
+
425
+ reference_to Landing
426
+ attribute :report, Report, sets: true
427
+
428
+ emits TrainRan
429
+ end
430
+
431
+ command "Record" do
432
+ role "System"
433
+ goal "Record the commit main names once the branch is on it"
434
+
435
+ reference_to Landing
436
+ attribute :branch, Word, sets: true
437
+ attribute :landed, Word, sets: true
438
+ attribute :report, Report, sets: true
439
+ attribute :checkout, Word, optional: true, sets: true
440
+
441
+ emits BranchLanded
442
+ end
443
+
444
+ command "Refuse" do
445
+ role "System"
446
+ goal "Record why a branch could not be landed"
447
+
448
+ reference_to Landing
449
+ attribute :refusal, Report, sets: true
450
+
451
+
452
+ emits LandingRefused
453
+ end
454
+
455
+ command "Retire" do
456
+ role "Operator"
457
+ goal "Remove a merged worktree and delete its branch, unless it holds uncommitted work or commits main lacks"
458
+
459
+ attribute :run, RunKey, sets: true
460
+ attribute :checkout, Word, optional: true, sets: true
461
+ attribute :branch, Word, optional: true, sets: true
462
+ attribute :onto, Word, default: "main", sets: true
463
+ attribute :confirm, Switch, optional: true, sets: true
464
+
465
+ given("removes the worktree and deletes its branch needs --confirm; without it this only reports") { confirm.value == true }
466
+
467
+ emits RetirementRequested
468
+ end
469
+
470
+ command "Clear" do
471
+ role "System"
472
+ goal "Record that the worktree and its branch are gone"
473
+
474
+ reference_to Landing
475
+ attribute :branch, Word, sets: true
476
+ attribute :report, Report, sets: true
477
+
478
+
479
+ emits WorktreeRetired
480
+ end
481
+
482
+ command "Decline" do
483
+ role "System"
484
+ goal "Record why a worktree was kept"
485
+
486
+ reference_to Landing
487
+ attribute :refusal, Report, sets: true
488
+
489
+
490
+ emits RetirementDeclined
491
+ end
492
+
493
+ query "Outcome" do
494
+ description "How one landing or retirement ended: the commit main names, or why it was refused."
495
+ attribute :run, RunKey
496
+ where(run: :run)
497
+ order_by :run
498
+ end
499
+
500
+ query "Unlanded" do
501
+ description "Every branch with commits that are not on main, or with uncommitted work, and where its worktree is."
502
+ attribute :checkout, Word, optional: true
503
+ attribute :onto, Word, optional: true
504
+ returns Document
505
+ end
506
+ end
507
+
508
+ policy "MergeWhenLanding" do
509
+ on "Landing.LandingRequested"
510
+ ask :merge, with: { run: :run }
511
+ end
512
+
513
+ policy "FinishWhenFinishing" do
514
+ on "Landing.FinishRequested"
515
+ ask :finish_branch, with: { run: :run }
516
+ end
517
+
518
+ policy "RecordTheLanding" do
519
+ on "Landing.MergeAnswered"
520
+ trigger Landing::Record, with: { branch: :branch, landed: :landed, report: :report, checkout: :checkout }
521
+ end
522
+
523
+ policy "RunTheTrain" do
524
+ on "Landing.TrainRequested"
525
+ ask :convene, with: { run: :run }
526
+ end
527
+
528
+ policy "RecordTheTrain" do
529
+ on "Landing.ConveneAnswered"
530
+ trigger Landing::Convoy, with: { report: :report }
531
+ end
532
+
533
+ policy "RecordTheRefusedTrain" do
534
+ on "Landing.ConveneRefused"
535
+ trigger Landing::Refuse, with: { refusal: :refusal }
536
+ end
537
+
538
+ policy "RecordTheRefusedLanding" do
539
+ on "Landing.MergeRefused"
540
+ trigger Landing::Refuse, with: { refusal: :refusal }
541
+ end
542
+
543
+ # A landed branch finishes the Work row it was cut for. The LandedWork port finds the open row the
544
+ # branch names (the whole branch name, else the name without a leading `qa/`) and answers its key;
545
+ # a branch with no open row is refused by the port and nothing follows. The Tickets bluebook finishes
546
+ # the row that was found (FinishWorkWhenBranchLanded).
547
+ policy "FindWorkWhenBranchLanded" do
548
+ on "Landing.BranchLanded"
549
+ ask :find_landed_work, with: { branch: :branch }
550
+ end
551
+
552
+ policy "RemoveWhenRetiring" do
553
+ on "Landing.RetirementRequested"
554
+ ask :remove, with: { run: :run }
555
+ end
556
+
557
+ policy "RecordTheRetirement" do
558
+ on "Landing.RemovalAnswered"
559
+ trigger Landing::Clear, with: { branch: :branch, report: :report }
560
+ end
561
+
562
+ policy "RecordTheKeptWorktree" do
563
+ on "Landing.RemovalRefused"
564
+ trigger Landing::Decline, with: { refusal: :refusal }
565
+ end
566
+
567
+ # A commit that was asked for is made by the git port, which answers with its sha or refuses with why.
568
+ policy "CommitWhenMade" do
569
+ on "Revision.CommitRequested"
570
+ ask :commit, with: { run: :run }
571
+ end
572
+
573
+ policy "RecordTheCommit" do
574
+ on "Revision.CommitAnswered"
575
+ trigger Revision::Record, with: { sha: :sha, report: :report }
576
+ end
577
+
578
+ policy "DeclineTheCommit" do
579
+ on "Revision.CommitRefused"
580
+ trigger Revision::Decline, with: { refusal: :refusal }
581
+ end
582
+
583
+ # The copy of Hecks that runs the train follows what it pushed, so the next boarding and the
584
+ # records it keeps run the code that landed, not the code that was there when it was set up.
585
+ # It reacts to the recorded push and takes the pushed commit from it.
586
+ policy "KeepTheLauncherCurrent" do
587
+ on "SendTrain.BranchPushed"
588
+ ask :refresh, with: { run: :run, pushed: :pushed }
589
+ end
590
+
591
+ # Many agents finish together and each would push, running every pre-push check at once. A
592
+ # boarding waits its turn behind the push in flight from the same repository, then pushes the
593
+ # local branch with whatever else has landed on it, or finds an earlier push already carried it.
594
+ aggregate "SendTrain" do
595
+ description "One push of a checkout's branch, taken in turn: carried by an earlier push, pushed, or refused."
596
+
597
+ attribute :run, RunKey
598
+ attribute :confirm, Switch, optional: true
599
+ attribute :branch, Word, optional: true
600
+ attribute :remote, Word, optional: true
601
+ attribute :checkout, Word, optional: true
602
+ attribute :full_gate, Switch, optional: true
603
+ attribute :boarded, Word, optional: true
604
+ attribute :pushed, Word, optional: true
605
+ attribute :report, Report, optional: true
606
+ attribute :refusal, Report, optional: true
607
+ identified_by :run
608
+
609
+ value_object "RunKey" do
610
+ attribute :value, String, matches: :present
611
+ end
612
+
613
+ # A branch, a remote, a directory or a commit.
614
+ value_object "Word" do
615
+ attribute :value, String, matches: :present
616
+ end
617
+
618
+ value_object "Report" do
619
+ attribute :value, String
620
+ end
621
+
622
+ value_object "Switch" do
623
+ attribute :value, Boolean
624
+ end
625
+
626
+ lifecycle :status, default: "requested" do
627
+ mark :failure, "faulted"
628
+ transition "Send" => "pushed", from: "requested"
629
+ transition "Ride" => "carried", from: "requested"
630
+ transition "Fault" => "faulted", from: "requested"
631
+ transition "Summarize" => "surveyed", from: "requested"
632
+ mark :terminal, "carried", "faulted", "pushed", "surveyed"
633
+ end
634
+
635
+ command "Board" do
636
+ role "Operator"
637
+ goal "Push this checkout's branch once the push ahead of it lands, unless that push already carried it"
638
+
639
+ attribute :run, RunKey, sets: true
640
+ attribute :branch, Word, default: "main", sets: true
641
+ attribute :remote, Word, default: "origin", sets: true
642
+ attribute :checkout, Word, optional: true, sets: true
643
+ # Run the whole `pre_push` stage, the suite included, which also writes the CI attestation
644
+ # note; without it the push runs only the `quick` stage.
645
+ attribute :full_gate, Switch, optional: true, sets: true
646
+ attribute :confirm, Switch, optional: true, sets: true
647
+
648
+ given("pushes the branch to the remote needs --confirm; without it this only reports") { confirm.value == true }
649
+
650
+ emits BoardingRequested
651
+ end
652
+
653
+ # A survey pushes nothing: it lists every checkout under a directory (`checkout`) whose branch
654
+ # has commits its remote does not, so what waits to board is known before anything boards.
655
+ command "Survey" do
656
+ role "Operator"
657
+ goal "List every checkout under a directory whose branch has commits its remote does not"
658
+
659
+ attribute :run, RunKey, sets: true
660
+ attribute :remote, Word, default: "origin", sets: true
661
+ attribute :checkout, Word, optional: true, sets: true
662
+
663
+
664
+ emits SurveyRequested
665
+ end
666
+
667
+ command "Summarize" do
668
+ role "System"
669
+ goal "Record what a survey found waiting to push"
670
+
671
+ reference_to SendTrain
672
+ attribute :report, Report, sets: true
673
+
674
+
675
+ emits CheckoutsSurveyed
676
+ end
677
+
678
+ # The branch was pushed: every commit on it reached the remote, what this boarding carried and
679
+ # whatever landed on it while it waited.
680
+ command "Send" do
681
+ role "System"
682
+ goal "Record the commit a boarding pushed"
683
+
684
+ reference_to SendTrain
685
+ attribute :checkout, Word, sets: true
686
+ attribute :boarded, Word, sets: true
687
+ attribute :pushed, Word, sets: true
688
+ attribute :report, Report, sets: true
689
+
690
+
691
+ emits BranchPushed
692
+ end
693
+
694
+ # An earlier push already took the boarded commit to the remote, so this one pushed nothing.
695
+ command "Ride" do
696
+ role "System"
697
+ goal "Record that an earlier push already carried the boarded commit"
698
+
699
+ reference_to SendTrain
700
+ attribute :checkout, Word, sets: true
701
+ attribute :boarded, Word, sets: true
702
+ attribute :report, Report, sets: true
703
+
704
+
705
+ emits CarriedByEarlierPush
706
+ end
707
+
708
+ command "Fault" do
709
+ role "System"
710
+ goal "Record why a boarding could not push"
711
+
712
+ reference_to SendTrain
713
+ attribute :refusal, Report, sets: true
714
+
715
+
716
+ emits PushFaulted
717
+ end
718
+
719
+ query "Outcome" do
720
+ description "How one boarding ended: pushed, carried by an earlier push, or why it failed."
721
+ attribute :run, RunKey
722
+ where(run: :run)
723
+ order_by :run
724
+ end
725
+ end
726
+
727
+ # A boarding is carried by the train, which runs its steps in order while it holds the line: the
728
+ # Hecks domain's mint, then the settlement and the push. A shape that did not move passes straight
729
+ # through; a refused mint is the train's refusal, named, and nothing is pushed.
730
+ policy "CarryWhenBoarded" do
731
+ on "SendTrain.BoardingRequested"
732
+ ask :carry, with: { run: :run }
733
+ end
734
+
735
+ policy "RecordThePush" do
736
+ on "SendTrain.TrainAnswered"
737
+ where { outcome.value == "pushed" }
738
+ trigger SendTrain::Send, with: { checkout: :checkout, boarded: :boarded, pushed: :pushed, report: :report }
739
+ end
740
+
741
+ policy "RecordTheRide" do
742
+ on "SendTrain.TrainAnswered"
743
+ where { outcome.value == "carried" }
744
+ trigger SendTrain::Ride, with: { checkout: :checkout, boarded: :boarded, report: :report }
745
+ end
746
+
747
+ policy "RecordTheRefusedPush" do
748
+ on "SendTrain.TrainRefused"
749
+ trigger SendTrain::Fault, with: { refusal: :refusal }
750
+ end
751
+
752
+ policy "SurveyWhenAsked" do
753
+ on "SendTrain.SurveyRequested"
754
+ ask :tally, with: { run: :run }
755
+ end
756
+
757
+ policy "RecordTheSurvey" do
758
+ on "SendTrain.SurveyAnswered"
759
+ trigger SendTrain::Summarize, with: { report: :report }
760
+ end
761
+
762
+ policy "RecordTheRefusedSurvey" do
763
+ on "SendTrain.SurveyRefused"
764
+ trigger SendTrain::Fault, with: { refusal: :refusal }
765
+ end
766
+
767
+ # Deploys stay by hand: a push that reached the remote says a deploy is ready, and nothing more.
768
+ # Like KeepTheLauncherCurrent, it reacts to the recorded push and takes the pushed commit from it.
769
+ policy "AnnounceWhenPushed" do
770
+ on "SendTrain.BranchPushed"
771
+ ask :announce, with: { run: :run, pushed: :pushed }
772
+ end
773
+
774
+ # The request that starts GateAndBoard, under its own identity so the Landing record it leads to
775
+ # is a separate one: Land creates a Landing under the same run key, and that would collide.
776
+ aggregate "Shipment" do
777
+ description "One request to fix, gate, land and board a branch: the gate-and-board saga starts on it."
778
+
779
+ attribute :run, RunKey
780
+ attribute :confirm, Switch, optional: true
781
+ attribute :branch, Word
782
+ identified_by :run
783
+
784
+ value_object "RunKey" do
785
+ attribute :value, String, matches: :present
786
+ end
787
+
788
+ # A branch, a directory or a commit.
789
+ value_object "Word" do
790
+ attribute :value, String, matches: :present
791
+ end
792
+
793
+ command "Ship" do
794
+ role "Operator"
795
+ goal "Start the gate-and-board saga for a branch: fix comment style, check the ledger, gate, land on main, board the push train"
796
+
797
+ attribute :run, RunKey, sets: true
798
+ attribute :branch, Word, sets: true
799
+ attribute :checkout, Word
800
+ attribute :paths, Word, default: "lib/hecks,spec"
801
+ attribute :confirm, Switch, optional: true, sets: true
802
+
803
+ given("lands the branch and pushes it to the remote needs --confirm; without it this only reports") { confirm.value == true }
804
+
805
+ emits ShipRequested
806
+ emits ShipStarted
807
+ end
808
+ end
809
+
810
+ aggregate "ReviewRequest" do
811
+ description "One pull request opened or squash-merged on GitHub, and what GitHub answered."
812
+
813
+ attribute :run, RunKey
814
+ attribute :confirm, Switch, optional: true
815
+ attribute :branch, Word, optional: true
816
+ attribute :base, Word, optional: true
817
+ attribute :number, Word, optional: true
818
+ attribute :url, Word, optional: true
819
+ attribute :report, Report, optional: true
820
+ attribute :refusal, Report, optional: true
821
+ identified_by :run
822
+
823
+ value_object "RunKey" do
824
+ attribute :value, String, matches: :present
825
+ end
826
+
827
+ # A branch, a number or a URL.
828
+ value_object "Word" do
829
+ attribute :value, String, matches: :present
830
+ end
831
+
832
+ value_object "Report" do
833
+ attribute :value, String
834
+ end
835
+
836
+ value_object "Document" do
837
+ attribute :text, String
838
+ end
839
+
840
+ lifecycle :status, default: "requested" do
841
+ mark :failure, "refused"
842
+ transition "Record" => "opened", from: "requested"
843
+ transition "Confirm" => "merged", from: "requested"
844
+ transition "Refuse" => "refused", from: "requested"
845
+ mark :terminal, "opened", "merged", "refused"
846
+ end
847
+
848
+ command "Open" do
849
+ role "Operator"
850
+ goal "Open a pull request from a branch onto a base, and keep the number and URL GitHub gives it"
851
+
852
+ attribute :run, RunKey, sets: true
853
+ attribute :branch, Word, sets: true
854
+ attribute :base, Word, default: "main", sets: true
855
+ attribute :confirm, Switch, optional: true, sets: true
856
+
857
+ given("opens a pull request on GitHub needs --confirm; without it this only reports") { confirm.value == true }
858
+
859
+ emits "PullRequestRequested"
860
+ end
861
+
862
+ command "Take" do
863
+ role "Operator"
864
+ goal "Squash-merge an open pull request by its number; never with an admin override"
865
+
866
+ attribute :run, RunKey, sets: true
867
+ attribute :number, Word, sets: true
868
+ attribute :confirm, Switch, optional: true, sets: true
869
+
870
+ given("squash-merges the pull request on GitHub needs --confirm; without it this only reports") { confirm.value == true }
871
+
872
+ emits "PullRequestMergeRequested"
873
+ end
874
+
875
+ command "Record" do
876
+ role "System"
877
+ goal "Record the number and URL GitHub gave an opened pull request"
878
+
879
+ reference_to ReviewRequest
880
+ attribute :number, Word, sets: true
881
+ attribute :url, Word, sets: true
882
+ attribute :report, Report, sets: true
883
+
884
+ emits "PullRequestOpened"
885
+ end
886
+
887
+ command "Confirm" do
888
+ role "System"
889
+ goal "Record that GitHub squash-merged a pull request"
890
+
891
+ reference_to ReviewRequest
892
+ attribute :number, Word, sets: true
893
+ attribute :report, Report, sets: true
894
+
895
+ emits "PullRequestMerged"
896
+ end
897
+
898
+ command "Refuse" do
899
+ role "System"
900
+ goal "Record why GitHub refused a pull request"
901
+
902
+ reference_to ReviewRequest
903
+ attribute :refusal, Report, sets: true
904
+
905
+ emits "PullRequestRefused"
906
+ end
907
+
908
+ query "Status" do
909
+ description "The state of one pull request on GitHub: its number, state, URL and checks, as text."
910
+ attribute :number, Word
911
+ returns Document
912
+ end
913
+ end
914
+
915
+ policy "CreatePullRequestWhenRequested" do
916
+ on "ReviewRequest.PullRequestRequested"
917
+ ask :create, with: { run: :run }
918
+ end
919
+
920
+ policy "RecordTheOpenedPullRequest" do
921
+ on "ReviewRequest.OpenAnswered"
922
+ trigger ReviewRequest::Record, with: { number: :number, url: :url, report: :report }
923
+ end
924
+
925
+ policy "RecordTheRefusedOpen" do
926
+ on "ReviewRequest.OpenRefused"
927
+ trigger ReviewRequest::Refuse, with: { refusal: :refusal }
928
+ end
929
+
930
+ policy "SquashWhenMergeRequested" do
931
+ on "ReviewRequest.PullRequestMergeRequested"
932
+ ask :squash, with: { run: :run }
933
+ end
934
+
935
+ policy "RecordTheMergedPullRequest" do
936
+ on "ReviewRequest.SquashAnswered"
937
+ trigger ReviewRequest::Confirm, with: { number: :number, report: :report }
938
+ end
939
+
940
+ policy "RecordTheRefusedMerge" do
941
+ on "ReviewRequest.SquashRefused"
942
+ trigger ReviewRequest::Refuse, with: { refusal: :refusal }
943
+ end
944
+ end
945
+ end