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
@@ -11,12 +11,14 @@
11
11
  # or not GitHub answers: each lifecycle event asks the port, and a refused ask is recorded on the
12
12
  # finding as a sync failure that a later run retries.
13
13
  #
14
- # An Adr is a decision record with its own lifecycle, linked to the finding it settles.
14
+ # An Adr is a decision record with its own lifecycle, linked to the finding it settles. A Work is a
15
+ # step of the plan a decision carries, and stays inside Hecks.
15
16
  Hecks.bluebook "Tickets" do
16
17
  vision "Track what Hecks needs, decide it, ship it, and drive GitHub from the record."
17
18
 
18
19
  aggregate "Finding" do
19
20
  description "One thing observed about Hecks that needs a decision or a fix: reported, triaged, then resolved or dismissed."
21
+ created_by "Finding.report!"
20
22
 
21
23
  attribute :finding, FindingKey
22
24
  attribute :title, Title
@@ -109,22 +111,6 @@ Hecks.bluebook "Tickets" do
109
111
  emits "RunFindingReported"
110
112
  end
111
113
 
112
- # A lane that stood behind the lane it follows for longer than its Lane row allows reports
113
- # itself. The alert key names the finding and carries the day, so a lane that stays late files
114
- # one finding a day: the same key again is the same finding.
115
- command "ReportLag" do
116
- goal "Record a lane that has stood behind the lane it follows too long as a finding"
117
-
118
- attribute :finding, FindingKey, sets: true
119
- attribute :body, Body, sets: true
120
-
121
- sets :fingerprint, to: "lane-lag"
122
- sets :title, to: "A lane is behind the lane it follows"
123
- sets :source, to: "qa_loop"
124
-
125
- emits "LagFindingReported"
126
- end
127
-
128
114
  command "Triage" do
129
115
  role "Maintainer"
130
116
  goal "Give a finding its kind and severity"
@@ -179,6 +165,7 @@ Hecks.bluebook "Tickets" do
179
165
 
180
166
  command "RecordIssue" do
181
167
  goal "Record the GitHub issue number once the issue is opened"
168
+ audience :record
182
169
 
183
170
  reference_to Finding
184
171
  attribute :issue_number, Number, sets: true
@@ -189,6 +176,7 @@ Hecks.bluebook "Tickets" do
189
176
 
190
177
  command "RecordSyncFailure" do
191
178
  goal "Record that GitHub could not be driven, so a later run retries"
179
+ audience :record
192
180
 
193
181
  reference_to Finding
194
182
  attribute :sync_failure, Body, sets: true
@@ -206,6 +194,7 @@ Hecks.bluebook "Tickets" do
206
194
 
207
195
  aggregate "Adr" do
208
196
  description "A decision record: drafted, accepted, and possibly superseded, linked to the tickets it settles."
197
+ created_by "Adr.draft!"
209
198
 
210
199
  attribute :adr, AdrNumber
211
200
  attribute :title, AdrTitle
@@ -269,6 +258,237 @@ Hecks.bluebook "Tickets" do
269
258
  end
270
259
  end
271
260
 
261
+ # A step of a plan, held under the decision it carries out. It drives nothing outside: planned
262
+ # work is the maintainer's own list, not an issue.
263
+ aggregate "Work" do
264
+ description "One step of a plan: planned, started, then done or dropped, under the decision it carries out."
265
+ created_by "Work.plan!"
266
+
267
+ attribute :work, WorkKey
268
+ attribute :title, WorkTitle
269
+ attribute :detail, WorkText, optional: true
270
+ attribute :step, Step, optional: true
271
+ attribute :reason, WorkText, optional: true
272
+ attribute :claimed_by, Claimant, optional: true
273
+ attribute :claimed_at, ClaimedAt, optional: true
274
+ attribute :area, list_of(Word), optional: true
275
+ attribute :budget_minutes, Minutes, optional: true
276
+ reference_to Adr, as: :decision, optional: true
277
+ identified_by :work
278
+
279
+ # A path prefix or glob a claim covers. Two areas overlap by `Hecks::Adapters::AreaOverlap`;
280
+ # a row with no area claims nothing.
281
+ value_object "Word" do
282
+ attribute :value, String, matches: :present
283
+ end
284
+
285
+ # The session that claimed a started step, named as the session names itself. A step back in the
286
+ # plan holds the empty claimant; `Start` refuses one that names nobody.
287
+ value_object "Claimant" do
288
+ attribute :value, String, default: ""
289
+ end
290
+
291
+ # When the claim was taken, as the caller reads the clock: an ISO 8601 instant. Empty while the
292
+ # step is unclaimed.
293
+ value_object "ClaimedAt" do
294
+ attribute :value, String, default: ""
295
+ end
296
+
297
+ # How long a claim may run, in whole minutes. A row with none, or zero, has no budget; a step
298
+ # back in the plan holds zero.
299
+ value_object "Minutes" do
300
+ attribute :value, Integer
301
+
302
+ invariant("a time budget is not negative") { !value.negative? }
303
+ end
304
+
305
+ # What a query answered from outside the domain returns: its lines.
306
+ value_object "Document" do
307
+ attribute :text, String
308
+ end
309
+
310
+ value_object "WorkKey" do
311
+ attribute :value, String, matches: :present
312
+
313
+ invariant("a piece of work is named") { !value.to_s.empty? }
314
+ end
315
+
316
+ value_object "WorkTitle" do
317
+ attribute :value, String
318
+
319
+ invariant("a piece of work has a title") { !value.to_s.empty? }
320
+ end
321
+
322
+ value_object "WorkText" do
323
+ attribute :value, String
324
+ end
325
+
326
+ # Where the work stands in its plan: step 0 comes first.
327
+ value_object "Step" do
328
+ attribute :value, Integer
329
+
330
+ invariant("a step is not negative") { !value.negative? }
331
+ end
332
+
333
+ lifecycle :status, default: "planned" do
334
+ transition "Start" => "started", from: "planned"
335
+ transition "Release" => "planned", from: "started"
336
+ transition "Yield" => "planned", from: "started"
337
+ transition "Finish" => "done", from: %w[planned started]
338
+ transition "Drop" => "dropped", from: %w[planned started]
339
+ transition "Lapse" => "dropped", from: %w[planned started]
340
+ transition "Reopen" => "planned", from: %w[done dropped]
341
+ end
342
+
343
+ command "Plan" do
344
+ role "Maintainer"
345
+ goal "Enter a step of a plan, optionally under the decision it carries out"
346
+
347
+ attribute :work, WorkKey, sets: true
348
+ attribute :title, WorkTitle, sets: true
349
+ # The detail and area default to none, so the event always carries them and
350
+ # ComposeBriefWhenPlanned in Coder can read them from any plan.
351
+ attribute :detail, WorkText, optional: true, sets: true, default: { value: "" }
352
+ attribute :step, Step, optional: true, sets: true
353
+ attribute :area, list_of(Word), optional: true, sets: true, default: []
354
+ reference_to Adr, as: :decision, optional: true
355
+
356
+ sets :decision
357
+
358
+ emits "WorkPlanned"
359
+ end
360
+
361
+ # A step still open takes what a later look at it found: the row stays one, its title and
362
+ # detail move.
363
+ command "Revise" do
364
+ goal "Replace an open step's title and detail with what a later look found"
365
+
366
+ reference_to Work
367
+ attribute :title, WorkTitle, sets: true
368
+ attribute :detail, WorkText, sets: true
369
+
370
+ emits "WorkRevised"
371
+ end
372
+
373
+ # A started step is claimed: the second Start on it is refused, since only a planned step starts.
374
+ command "Start" do
375
+ role "Maintainer"
376
+ goal "Claim a planned step for one session, recording who claimed it and when"
377
+
378
+ reference_to Work
379
+ attribute :claimed_by, Claimant, sets: true
380
+ attribute :claimed_at, ClaimedAt, sets: true
381
+ attribute :area, list_of(Word), optional: true, sets: true
382
+ attribute :budget_minutes, Minutes, optional: true, sets: true
383
+
384
+ given("a claim names its claimant") { !claimed_by.value.to_s.empty? }
385
+ given("a claim records when it was taken") { !claimed_at.value.to_s.empty? }
386
+
387
+ emits "WorkStarted"
388
+ end
389
+
390
+ # The claim's area overlapped another started step's, or it would start more steps than the
391
+ # cap allows: the WorkAreas or WorkLimits port refuses it by name, and the step goes back to
392
+ # the plan with the refusal as its reason.
393
+ command "Yield" do
394
+ goal "Return a step whose area another started step holds, with the refusal"
395
+
396
+ reference_to Work
397
+ attribute :reason, WorkText, sets: true
398
+
399
+ sets :claimed_by, to: ""
400
+ sets :claimed_at, to: ""
401
+ sets :area, to: []
402
+ sets :budget_minutes, to: 0
403
+
404
+ emits "WorkYielded"
405
+ end
406
+
407
+ # A claim gone stale returns its step to the plan, so the next session can claim it.
408
+ command "Release" do
409
+ goal "Return a started step to planned, releasing its claim"
410
+
411
+ reference_to Work
412
+
413
+ sets :claimed_by, to: ""
414
+ sets :claimed_at, to: ""
415
+ sets :area, to: []
416
+ sets :budget_minutes, to: 0
417
+
418
+ emits "WorkReleased"
419
+ end
420
+
421
+ command "Finish" do
422
+ role "Maintainer"
423
+ goal "Record that a step is done"
424
+
425
+ reference_to Work
426
+
427
+ emits "WorkFinished"
428
+ end
429
+
430
+ command "Drop" do
431
+ role "Maintainer"
432
+ goal "Set a step aside without doing it, with the reason"
433
+
434
+ reference_to Work
435
+ attribute :reason, WorkText, sets: true
436
+
437
+ emits "WorkDropped"
438
+ end
439
+
440
+ # A step whose cause came back (a spec red again after it was cleared) is planned again, with
441
+ # the new title and detail.
442
+ command "Reopen" do
443
+ goal "Return a finished or dropped step to planned because its cause returned"
444
+
445
+ reference_to Work
446
+ attribute :title, WorkTitle, sets: true
447
+ attribute :detail, WorkText, optional: true, sets: true
448
+
449
+ emits "WorkReopened"
450
+ end
451
+
452
+ # A superseded decision's plan no longer stands, so its undone steps are dropped with it.
453
+ command "Lapse" do
454
+ goal "Drop a step whose decision was superseded"
455
+
456
+ reference_to Work
457
+
458
+ sets :reason, to: "its decision was superseded"
459
+
460
+ emits "WorkLapsed"
461
+ end
462
+
463
+ query "Undone" do
464
+ description "Every step not yet done or dropped, in plan order."
465
+ where(status: { in: "planned,started" })
466
+ order_by :step
467
+ end
468
+
469
+ # The first step still planned in plan order: the next one a coder session claims.
470
+ query "NextPlanned" do
471
+ description "The oldest step not yet claimed, in plan order: the brief a coder session reads next."
472
+ where(status: "planned")
473
+ order_by :step
474
+ limit 1
475
+ end
476
+
477
+ query "Under" do
478
+ description "Every step of the plan one decision carries, in plan order."
479
+ attribute :adr, String
480
+ where(decision: :adr)
481
+ order_by :step
482
+ end
483
+
484
+ query "UndoneUnder" do
485
+ description "The steps of one decision's plan not yet done or dropped: the ones its superseding drops."
486
+ attribute :adr, String
487
+ where(decision: :adr, status: { in: "planned,started" })
488
+ order_by :step
489
+ end
490
+ end
491
+
272
492
  # Each lifecycle event drives GitHub. A finding's own state never waits on the answer.
273
493
  policy "OpenIssueWhenReported" do
274
494
  on "Finding.FindingReported"
@@ -280,11 +500,6 @@ Hecks.bluebook "Tickets" do
280
500
  ask :open_issue, with: { finding: :finding }
281
501
  end
282
502
 
283
- policy "OpenIssueWhenLagReported" do
284
- on "Finding.LagFindingReported"
285
- ask :open_issue, with: { finding: :finding }
286
- end
287
-
288
503
  policy "LabelIssueWhenTriaged" do
289
504
  on "Finding.FindingTriaged"
290
505
  ask :label_issue, with: { finding: :finding }
@@ -310,23 +525,103 @@ Hecks.bluebook "Tickets" do
310
525
  ask :reopen_issue, with: { finding: :finding }
311
526
  end
312
527
 
528
+ # A started step with an area asks the WorkAreas port whether another started step holds any of it.
529
+ policy "CheckAreaWhenStarted" do
530
+ on "Work.WorkStarted"
531
+ ask :check_area, with: { work: :work }
532
+ end
533
+
534
+ policy "YieldWhenAreaTaken" do
535
+ on "Work.AreaRefused"
536
+ trigger Work::Yield, with: { reason: :refusal }
537
+ end
538
+
539
+ # A started step asks the WorkLimits port whether it is one too many for the concurrency cap. It is
540
+ # declared after the area check, so a step that clashes is already back in the plan when the cap
541
+ # looks, and the cap yields only a step still started.
542
+ policy "CheckCapWhenStarted" do
543
+ on "Work.WorkStarted"
544
+ ask :check_cap, with: { work: :work }
545
+ end
546
+
547
+ policy "YieldWhenCapReached" do
548
+ on "Work.CapRefused"
549
+ trigger Work::Yield, with: { reason: :refusal }
550
+ end
551
+
552
+ # A superseded decision takes its undone steps with it.
553
+ policy "LapseWorkWhenSuperseded" do
554
+ on "Adr.AdrSuperseded"
555
+ for_each "Work.UndoneUnder"
556
+ trigger Work::Lapse, with: { work: :work }
557
+ end
558
+
559
+ # A coder's submitted branch is named for its work step, so the branch is the step's key and the
560
+ # policy routes it with no parsing (`with:` only routes fields). A branch naming no step is refused
561
+ # by the Finish command: the refusal names Work.
562
+ policy "FinishWhenWorkSubmitted" do
563
+ on "Submission.WorkSubmitted"
564
+ trigger Work::Finish, with: { work: :branch }
565
+ end
566
+
567
+ # A branch that landed on local main finishes the step it was cut for. The Landing's LandedWork
568
+ # port found the open step the branch names (the whole branch name, else the name without a leading
569
+ # `qa/`) and answered its key; a branch with no open step is refused there and never reaches here.
570
+ policy "FinishWorkWhenBranchLanded" do
571
+ on "Landing.LandedWorkFound"
572
+ trigger Work::Finish, with: { work: :branch }
573
+ end
574
+
313
575
  # A conformance or gate run that faults files its own finding.
314
576
  policy "ReportWhenConformanceFaulted" do
315
577
  on "ConformanceRun.ConformanceFaulted"
316
578
  trigger Finding::ReportFailedRun, with: { finding: :run, body: :refusal }
317
579
  end
318
580
 
319
- # A watch that finds a lane late faults it, and the fault files its finding.
320
- policy "ReportWhenLaneLags" do
321
- on "PromotionRun.LaneLagged"
322
- trigger Finding::ReportLag, with: { finding: :alert_key, body: :refusal }
323
- end
324
-
325
581
  policy "ReportWhenGateFaulted" do
326
582
  on "GateRun.GateFaulted"
327
583
  trigger Finding::ReportFailedRun, with: { finding: :run, body: :refusal }
328
584
  end
329
585
 
586
+ # A spec file that went red on main is a step QA picks up: `Work.undone` lists it. The spec's own key is
587
+ # the step's key, so a second red run, which only updates the spec, plans nothing twice.
588
+ policy "PlanWorkWhenSpecWentRed" do
589
+ on "RedSpec.SpecWentRed"
590
+ trigger Work::Plan, with: { work: :spec, title: :title, detail: :detail }
591
+ end
592
+
593
+ # A file that fails again after it was cleared plans its finished step again.
594
+ policy "ReopenWorkWhenSpecWentRedAgain" do
595
+ on "RedSpec.SpecWentRedAgain"
596
+ trigger Work::Reopen, with: { work: :spec, title: :title, detail: :detail }
597
+ end
598
+
599
+ # The run that no longer fails the file closes its step.
600
+ policy "FinishWorkWhenSpecWentGreen" do
601
+ on "RedSpec.SpecWentGreen"
602
+ trigger Work::Finish, with: { work: :spec }
603
+ end
604
+
605
+ # QA's push check: a push that is due beyond the world's thresholds is one step, `push-due`. A look
606
+ # that finds it already open revises its detail; a look that finds it no longer due finishes it.
607
+ policy "PlanWorkWhenPushDue" do
608
+ on "PushNudge.PushDueRead"
609
+ where { due.value == "yes" && raised.value == "no" }
610
+ trigger Work::Plan, with: { work: :work, title: :title, detail: :detail }
611
+ end
612
+
613
+ policy "ReviseWorkWhenPushStillDue" do
614
+ on "PushNudge.PushDueRead"
615
+ where { due.value == "yes" && raised.value == "yes" }
616
+ trigger Work::Revise, with: { work: :work, title: :title, detail: :detail }
617
+ end
618
+
619
+ policy "FinishWorkWhenPushSettled" do
620
+ on "PushNudge.PushDueRead"
621
+ where { due.value == "no" && raised.value == "yes" }
622
+ trigger Work::Finish, with: { work: :work }
623
+ end
624
+
330
625
  policy "RecordTheIssue" do
331
626
  on "Finding.IssueOpened"
332
627
  trigger Finding::RecordIssue, with: { issue_number: :issue_number }
@@ -3,6 +3,13 @@
3
3
  Hecks.hecksagon "Tickets" do
4
4
  attaches "Governance"
5
5
  persisted_by "Memory"
6
+
7
+ # The coder's submitted branch, which finishes its work step. Declarative: the Coder domain
8
+ # emits it, and the FinishWhenWorkSubmitted policy reacts.
9
+ subscribe "Coder.WorkSubmitted"
10
+
11
+ # The Hecks domain's landing found the step a landed branch was cut for: FinishWorkWhenBranchLanded reacts.
12
+ subscribe "Hecks.LandedWorkFound"
6
13
  end
7
14
 
8
15
  # The anti-corruption layer for Governance, which the bluebook's roles are checked against.
@@ -23,4 +23,21 @@ Hecks.hecksagon "Tickets" do
23
23
  end
24
24
  end
25
25
  end
26
+ Tickets::Work.port "WorkAreas" do
27
+ asks "CheckArea", to: Work do
28
+ attribute :work, WorkKey
29
+ answers "AreaCleared"
30
+ refuses "AreaRefused"
31
+ end
32
+ end
33
+
34
+ # The cap on started rows, which reads the other rows, as a bluebook rule cannot. The cap is the
35
+ # world's `work_limit` setting.
36
+ Tickets::Work.port "WorkLimits" do
37
+ asks "CheckCap", to: Work do
38
+ attribute :work, WorkKey
39
+ answers "CapCleared"
40
+ refuses "CapRefused"
41
+ end
42
+ end
26
43
  end
@@ -2,7 +2,7 @@ require_relative "../../hecks"
2
2
  require_relative "../behaviors"
3
3
 
4
4
  module Hecks
5
- module CLI
5
+ module Tools
6
6
  # The command behind `hecks run_behaviors` and Custodian's `Operation.RunBehaviors`: runs
7
7
  # `.behaviors` files and reports pass, fail or error per test (docs/guides/behaviors.md).
8
8
  module Behaviors
@@ -3,7 +3,7 @@
3
3
  require_relative "../canonical_json"
4
4
 
5
5
  module Hecks
6
- module CLI
6
+ module Tools
7
7
  # The command behind `hecks canonicalise`: prints a JSON document with every object's keys
8
8
  # sorted, recursively. Key order is not semantics, so a diff a person reads should not have
9
9
  # to notice it moved.
@@ -4,7 +4,7 @@ require_relative "../../hecks"
4
4
  require_relative "../engine_agreement"
5
5
 
6
6
  module Hecks
7
- module CLI
7
+ module Tools
8
8
  # The command behind `hecks check_engine_agreement`: fails when a query engine re-grows its
9
9
  # own comparator dispatch, or when a declared comparator lacks a shared `Comparison` case or
10
10
  # a cross-engine agreement spec. Grep-based.
@@ -1,14 +1,14 @@
1
1
  require_relative "expected_era"
2
2
 
3
3
  module Hecks
4
- module CLI
4
+ module Tools
5
5
  # The check behind Custodian's `Host.CheckEra`: asks a running host which era it reports and
6
6
  # compares it with an allow-list file. Read-only: one GET, no writes.
7
7
  module CheckEra
8
8
  # What a check found.
9
9
  #
10
10
  # @!attribute [r] verdict
11
- # @return [CLI::ExpectedEra::Verdict] the era compared with the list
11
+ # @return [Tools::ExpectedEra::Verdict] the era compared with the list
12
12
  # @!attribute [r] version
13
13
  # @return [String] the gem version the host reports, empty when it reports none
14
14
  # @!attribute [r] line
@@ -24,17 +24,17 @@ module Hecks
24
24
  # @param timeout [Numeric] seconds allowed for connecting and for reading
25
25
  # @return [Finding] the comparison, whether or not the era is listed
26
26
  # @raise [Errno::ENOENT, Errno::EACCES] if the file cannot be read
27
- # @raise [CLI::ExpectedEra::Unreachable] if the host cannot be reached
28
- # @raise [CLI::ExpectedEra::BadResponse] if it answers no era
27
+ # @raise [Tools::ExpectedEra::Unreachable] if the host cannot be reached
28
+ # @raise [Tools::ExpectedEra::BadResponse] if it answers no era
29
29
  def assess(url, file, timeout:)
30
- expected = CLI::ExpectedEra
30
+ expected = Tools::ExpectedEra
31
31
  allowed = expected.parse(File.read(file))
32
32
  document = expected.fetch_version(url, timeout: timeout)
33
33
  verdict = expected.verdict(document.fetch("era"), allowed)
34
34
  Finding.new(verdict, document.fetch("version"), sentence(verdict, file))
35
35
  end
36
36
 
37
- # @param verdict [CLI::ExpectedEra::Verdict] the comparison
37
+ # @param verdict [Tools::ExpectedEra::Verdict] the comparison
38
38
  # @param file [String] the allow-list file, named in the sentence
39
39
  # @return [String] the one line that says what the comparison found
40
40
  def sentence(verdict, file)
@@ -91,7 +91,9 @@ module Hecks
91
91
  [*job_header(gate, name), *JOB_BODY, *job_footer(gate, name)].join("\n")
92
92
  end
93
93
 
94
- # The job's static middle: its outputs and the steps up to the one that decides.
94
+ # The job's static middle: its outputs and the steps up to the one that decides. Every job
95
+ # in the run waits on a detector, so it installs only what it uses (Ruby, no Rust toolchain)
96
+ # and starts `hecks` warm when an earlier run saved the boot caches for this `lib/`.
95
97
  JOB_BODY = [
96
98
  " outputs:",
97
99
  " touched: ${{ steps.diff.outputs.touched }}",
@@ -101,6 +103,10 @@ module Hecks
101
103
  " # Full history: the diff needs both endpoints present as real objects.",
102
104
  " fetch-depth: 0",
103
105
  " - uses: ./.github/actions/setup-ruby",
106
+ " with:",
107
+ " # The decision diffs files and calls an API; it formats and builds no Rust.",
108
+ " rust-toolchain: \"false\"",
109
+ " - uses: ./.github/actions/hecks-boot-cache",
104
110
  " - uses: ./.github/actions/hecks-environment",
105
111
  " - id: diff"
106
112
  ].freeze
@@ -119,7 +125,7 @@ module Hecks
119
125
  def job_footer(gate, name)
120
126
  [" name: #{quoted(gate.fetch("label"))}",
121
127
  *job_env(gate),
122
- " run: bundle exec exe/hecks regeneration_run.decide_ci_gate gate=#{name} --wait",
128
+ " run: bundle exec exe/hecks regeneration_run.decide_ci_gate! gate=#{name} --wait",
123
129
  " # END GENERATED ci_gate #{name}"]
124
130
  end
125
131
 
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hecks"
4
+ require "fileutils"
5
+ require_relative "../tools"
6
+ require_relative "../projections/ci_pipeline/workflows"
7
+
8
+ module Hecks
9
+ module Tools
10
+ # Projects the workflow rows of the CiWorkflows bluebook into the workflow files under
11
+ # `.github/workflows`: each `Workflow` row becomes one file, written whole from its rows
12
+ # (`Projections::CiPipeline::Workflows`, the `:ci_workflows` projection).
13
+ #
14
+ # hecks regeneration_run.project_ci_pipeline! [--confirm]
15
+ #
16
+ # A workflow with no row is hand-written and left alone. With `--check` nothing is written: the
17
+ # tool answers 1 and names each file that differs from its rows.
18
+ module CiWorkflows
19
+ # The directory of the bluebook that declares the rows, which attaches the CiPipeline bluebook.
20
+ BLUEBOOK_DIRECTORY = File.expand_path("../ci_workflows", __dir__)
21
+
22
+ # The directory `ports/` and `adapters/` live under, loaded before the rows are.
23
+ LIB_HECKS = File.expand_path("..", __dir__)
24
+
25
+ # What a hecksagon that binds a store loads first.
26
+ WIRING = %w[ports/persistence.port ports/extraction.port adapters/driven/memory.adapter
27
+ adapters/driven/prism.adapter].freeze
28
+
29
+ module_function
30
+
31
+ # Projects the rows, writes what differs and prints a line for each file written.
32
+ #
33
+ # @param argv [Array<String>] `--check` to compare without writing
34
+ # @param root [String] the checkout the files are written under
35
+ # @return [Integer] 0, or 1 when `--check` finds a file out of date
36
+ # @raise [SystemExit] with the reason on stderr when the rows are refused
37
+ def main(argv, root: Tools::ROOT)
38
+ files = projection(root)
39
+ stale = files.reject { |path, text| File.file?(path) && File.read(path) == text }.keys
40
+ return report(stale, root) if argv.include?("--check")
41
+
42
+ write(files, stale, root)
43
+ 0
44
+ end
45
+
46
+ # @param root [String] the checkout the files belong under
47
+ # @return [Hash{String => String}] each workflow's absolute path to the text it should hold
48
+ # @raise [SystemExit] when the rows are refused
49
+ def projection(root)
50
+ registry = registry_for
51
+ bluebook = Projections::CiPipeline::Table.bluebook(registry)
52
+ table = Projections::CiPipeline::Table.read(bluebook, registry: registry)
53
+ files = Projector.call(:ci_workflows, bluebook: bluebook, options: { table: table })
54
+ files.transform_keys { |path| File.join(root, path) }
55
+ rescue Projections::CiPipeline::Table::Invalid => e
56
+ abort "project_ci_pipeline: #{e.message}"
57
+ end
58
+
59
+ # Loads the bluebook that declares the rows the way a deploy loads a project: the bluebooks,
60
+ # then the hecksagons that attach the bluebooks they need.
61
+ #
62
+ # @return [Hecks::Runtime::Registry] the registry
63
+ def registry_for
64
+ registry = Hecks::Runtime::Registry.new(root: BLUEBOOK_DIRECTORY)
65
+ Hecks.with_registry(registry) do
66
+ WIRING.each { |file| Kernel.load(File.join(LIB_HECKS, file)) }
67
+ Dir.glob(File.join(BLUEBOOK_DIRECTORY, "*.bluebook")).each { |file| Kernel.load(file) }
68
+ Dir.glob(File.join(BLUEBOOK_DIRECTORY, "*.hecksagon")).each { |file| Kernel.load(file) }
69
+ end
70
+ registry
71
+ end
72
+
73
+ # Writes each stale file and prints a line for it.
74
+ def write(files, stale, root)
75
+ stale.each do |path|
76
+ FileUtils.mkdir_p(File.dirname(path))
77
+ File.write(path, files.fetch(path))
78
+ puts "wrote #{path.delete_prefix("#{root}/")}"
79
+ end
80
+ puts "ci_pipeline: every workflow current" if stale.empty?
81
+ end
82
+
83
+ # @param stale [Array<String>] absolute paths whose text differs from the rows
84
+ # @param root [String] the checkout
85
+ # @return [Integer] 0 when current, else 1 with the stale workflows on stderr
86
+ def report(stale, root)
87
+ if stale.empty?
88
+ puts "ci_pipeline: every workflow current"
89
+ return 0
90
+ end
91
+
92
+ warn "ci_pipeline: out of date: #{stale.map { |path| path.delete_prefix("#{root}/") }.join(", ")} " \
93
+ "(run hecks regeneration_run.project_ci_pipeline! --confirm)"
94
+ 1
95
+ end
96
+ end
97
+ end
98
+ end
@@ -5,7 +5,7 @@ require "irb"
5
5
  require_relative "../ports/persistence/plugins/era"
6
6
 
7
7
  module Hecks
8
- module CLI
8
+ module Tools
9
9
  # The command behind `hecks console` and Custodian's `Operation.OpenConsole`: boots a domain
10
10
  # (pizzas on Memory by default) and drops into IRB with its Ruby adapter installed, for
11
11
  # dispatching a
@@ -4,7 +4,7 @@ require "optparse"
4
4
  require_relative "../projections/deploy/template_diff"
5
5
 
6
6
  module Hecks
7
- module CLI
7
+ module Tools
8
8
  # The command behind `hecks deploy template_comparison.diff`: compares two
9
9
  # CloudFormation templates offline and reports differences by logical id; `--strict` also
10
10
  # counts cosmetic differences (comments, key order).