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,916 @@
1
+ Hecks.bluebook "Hecks" do
2
+ domain_module "Release" do
3
+ vision "Certify, publish and pin versions."
4
+
5
+ aggregate "Release" do
6
+ description "One gem version: the record of what is running and what was shipped."
7
+
8
+ attribute :version, Version
9
+ attribute :ir_version, Version
10
+ attribute :ships_from, Checkout, optional: true
11
+ # The findings the version settled, by the key the Tickets bluebook gives them.
12
+ attribute :closes, list_of(FindingKey), optional: true
13
+
14
+ identified_by :version
15
+
16
+ value_object "FindingKey" do
17
+ attribute :value, String, matches: :present
18
+ end
19
+
20
+ value_object "Version" do
21
+ attribute :value, String, matches: :version
22
+
23
+ invariant("a version is present") { !value.to_s.empty? }
24
+ end
25
+
26
+ value_object "Checkout" do
27
+ attribute :path, String
28
+
29
+ invariant("a checkout is a working tree with hecks.gemspec beside lib/") { !path.to_s.empty? }
30
+ end
31
+
32
+ lifecycle :state, default: "tagged" do
33
+ transition "MarkPublished" => "published", from: "tagged"
34
+ transition "Verify" => "verified", from: %w[published verified]
35
+ end
36
+
37
+ command "Tag" do
38
+ role "Maintainer"
39
+ goal "Record a version as tagged, with the IR version it carries"
40
+ audience :record
41
+
42
+ attribute :version, Version, sets: true
43
+ attribute :ir_version, Version, sets: true
44
+ attribute :ships_from, Checkout, sets: true
45
+
46
+
47
+ emits Tagged
48
+ end
49
+
50
+ command "MarkPublished", from: "tagged" do
51
+ role "Maintainer"
52
+ goal "Record that a tagged version reached the gem registry"
53
+ audience :record
54
+
55
+ reference_to Release
56
+
57
+ emits Published
58
+ end
59
+
60
+ command "Verify", from: %w[published verified] do
61
+ role "Maintainer"
62
+ goal "Record that the published version installs and boots"
63
+ audience :record
64
+
65
+ reference_to Release
66
+
67
+ emits Verified
68
+ end
69
+
70
+ command "CloseFindings" do
71
+ role "Maintainer"
72
+ goal "Record the findings this version settled"
73
+ audience :record
74
+
75
+ reference_to Release
76
+ attribute :closes, list_of(FindingKey), sets: true
77
+
78
+
79
+ emits FindingsClosed
80
+ end
81
+
82
+ query "Shipped" do
83
+ description "Every version that was tagged, published and verified."
84
+ where(state: "verified")
85
+ order_by :version
86
+ end
87
+ end
88
+
89
+ # Publishing: cutting a release of this gem. The run holds the facts the Git adapter surveyed
90
+ # (branch, tree, versions, changelog, tag), and `Accept` holds the rules that let a release go
91
+ # ahead: the adapter supplies the facts and the givens decide. Only an accepted run is carried
92
+ # out, and without --confirm it is the old dry run: every check and build, nothing tagged,
93
+ # pushed or published. A real run advances the root Release: tagged, published, verified.
94
+ aggregate "PublishingRun" do
95
+ description "One release of the gem, or the rehearsal of it: judged by the facts, then carried out."
96
+
97
+ acknowledges :key_by_value, "the version this run tags; its Release is made by the run's own Tag, so a reference would require the record the command exists to make",
98
+ of: :version
99
+ acknowledges :key_by_value, "the client package's version, not a gem Release",
100
+ of: :client_version
101
+ acknowledges :key_by_value, "the IR format's version, not a gem Release",
102
+ of: :ir_version
103
+
104
+ attribute :run, RunKey
105
+ attribute :operation, Operation, optional: true
106
+ attribute :confirm, Switch, optional: true
107
+ attribute :gem_only, Switch, optional: true
108
+ attribute :npm_only, Switch, optional: true
109
+ attribute :npm_local, Switch, optional: true
110
+ attribute :no_wait, Switch, optional: true
111
+ attribute :checkout, Switch, optional: true
112
+ attribute :branch, Word, optional: true
113
+ attribute :release_lane, Word, optional: true
114
+ attribute :on_origin, Switch, optional: true
115
+ attribute :clean, Switch, optional: true
116
+ attribute :version, Version, optional: true
117
+ attribute :client_version, Version, optional: true
118
+ attribute :changelog, Switch, optional: true
119
+ attribute :approved, Switch, optional: true
120
+ attribute :tag_state, Word, optional: true
121
+ attribute :head, Word, optional: true
122
+ attribute :ir_version, Version, optional: true
123
+ attribute :ships_from, Checkout, optional: true
124
+ attribute :tagged, Switch, optional: true
125
+ attribute :published, Switch, optional: true
126
+ attribute :verified, Switch, optional: true
127
+ attribute :report, Report, optional: true
128
+ attribute :refusal, Report, optional: true
129
+ identified_by :run
130
+
131
+ value_object "RunKey" do
132
+ attribute :value, String, matches: :present
133
+
134
+ invariant("a run is named") { !value.to_s.empty? }
135
+ end
136
+
137
+ value_object "Operation" do
138
+ attribute :value, String, matches: :present
139
+ end
140
+
141
+ value_object "Switch" do
142
+ attribute :value, Boolean
143
+ end
144
+
145
+ value_object "Report" do
146
+ attribute :value, String
147
+ end
148
+
149
+ # One word of a fact: a branch, a commit, whether a tag stands.
150
+ value_object "Word" do
151
+ attribute :value, String, matches: :present
152
+ end
153
+
154
+ value_object "Version" do
155
+ attribute :value, String, matches: :version
156
+ end
157
+
158
+ # The working tree the release is cut from.
159
+ value_object "Checkout" do
160
+ attribute :path, String
161
+ end
162
+
163
+ lifecycle :status, default: "requested" do
164
+ mark :failure, "faulted"
165
+ transition "Accept" => "accepted", from: "requested"
166
+ transition "AcceptGem" => "accepted", from: "requested"
167
+ transition "Complete" => "completed", from: "accepted"
168
+ transition "Fault" => "faulted", from: %w[requested accepted]
169
+ mark :terminal, "completed", "faulted"
170
+ end
171
+
172
+ command "Publish" do
173
+ role "Maintainer"
174
+ goal "Tag the merged release commit, publish the gem, and get the client package published"
175
+
176
+ attribute :gem_only, Switch, optional: true, sets: true
177
+ attribute :npm_only, Switch, optional: true, sets: true
178
+ attribute :npm_local, Switch, optional: true, sets: true
179
+ attribute :no_wait, Switch, optional: true, sets: true
180
+ attribute :run, RunKey, sets: true
181
+ attribute :confirm, Switch, optional: true, sets: true
182
+
183
+ sets :operation, to: "publish"
184
+
185
+ emits PublishRequested
186
+ end
187
+
188
+ command "PublishGem" do
189
+ role "Maintainer"
190
+ goal "Build the gem and push it to the gem registry, with the key the vault holds"
191
+
192
+ attribute :run, RunKey, sets: true
193
+ attribute :confirm, Switch, optional: true, sets: true
194
+
195
+ sets :operation, to: "publish_gem"
196
+
197
+ emits PublishGemRequested
198
+ end
199
+
200
+ # What the tree reported about itself, and the facts the Git adapter surveyed, held against the
201
+ # rules of a release. Nothing here runs outside a hecks checkout (hecks.gemspec beside lib/).
202
+ command "Accept" do
203
+ role "System"
204
+ goal "Let a release go ahead only in a hecks checkout, and only when the facts satisfy every rule"
205
+
206
+ reference_to PublishingRun
207
+ attribute :checkout, Switch, sets: true
208
+ attribute :branch, Word, sets: true
209
+ attribute :release_lane, Word, sets: true
210
+ attribute :on_origin, Switch, sets: true
211
+ attribute :clean, Switch, sets: true
212
+ attribute :version, Version, sets: true
213
+ attribute :client_version, Version, sets: true
214
+ attribute :changelog, Switch, sets: true
215
+ attribute :approved, Switch, sets: true
216
+ attribute :tag_state, Word, sets: true
217
+ attribute :head, Word, sets: true
218
+ attribute :ir_version, Version, sets: true
219
+ attribute :ships_from, Checkout, sets: true
220
+
221
+ given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
222
+ given("a release is cut from the release lane (the Lane row that feeds a tag): switch to it first") do
223
+ branch.value == release_lane.value
224
+ end
225
+ given("the release lane is its origin: wait for the release commit to be promoted, then pull") { on_origin.value }
226
+ given("the working tree is clean: commit or discard changes first") { clean.value }
227
+ given("the client package is at the gem's version: bump the package first") do
228
+ client_version.value == version.value
229
+ end
230
+ given("CHANGELOG.md has a heading for the version: add the release entry") { changelog.value }
231
+ given("the commit that set the version carries a Release-Approved-By line: the owner decides when a release happens") do
232
+ approved.value || tag_state.value == "at_release_commit"
233
+ end
234
+ given("a tag for the version points at the release commit, not elsewhere") do
235
+ tag_state.value != "elsewhere"
236
+ end
237
+
238
+
239
+ emits PublishingAccepted
240
+ end
241
+
242
+ # release_gem's one rule: the client package is released beside the gem at the same version.
243
+ command "AcceptGem" do
244
+ role "System"
245
+ goal "Let a gem push go ahead only in a hecks checkout, with the client package at the gem's version"
246
+
247
+ reference_to PublishingRun
248
+ attribute :checkout, Switch, sets: true
249
+ attribute :version, Version, sets: true
250
+ attribute :client_version, Version, sets: true
251
+ attribute :ir_version, Version, sets: true
252
+ attribute :ships_from, Checkout, sets: true
253
+
254
+ given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
255
+ given("the client package is at the gem's version: bump the package first") do
256
+ client_version.value == version.value
257
+ end
258
+
259
+
260
+ emits GemAccepted
261
+ end
262
+
263
+ command "Complete" do
264
+ role "System"
265
+ goal "Record that the release was carried out, what it did, and what it reported"
266
+
267
+ reference_to PublishingRun
268
+ attribute :report, Report, sets: true
269
+ attribute :tagged, Switch, sets: true
270
+ attribute :published, Switch, sets: true
271
+ attribute :verified, Switch, sets: true
272
+
273
+
274
+ emits PublishingCompleted
275
+ end
276
+
277
+ command "Fault" do
278
+ role "System"
279
+ goal "Record that the request was refused or could not be carried out, and why"
280
+
281
+ reference_to PublishingRun
282
+ attribute :refusal, Report, sets: true
283
+
284
+
285
+ emits PublishingFaulted
286
+ end
287
+
288
+ query "PublishingOutcome" do
289
+ description "How one request ended: its status, and what it reported or why it failed."
290
+ attribute :run, RunKey
291
+ where(run: :run)
292
+ order_by :run
293
+ end
294
+
295
+ query "PublishingFaulted" do
296
+ description "Every request that was refused or could not be carried out."
297
+ where(status: "faulted")
298
+ order_by :run
299
+ end
300
+ end
301
+
302
+ policy "ExaminePublishingWhenPublishRequested" do
303
+ on "PublishingRun.PublishRequested"
304
+ ask :examine, with: { run: :run }
305
+ end
306
+
307
+ policy "ExaminePublishingWhenPublishGemRequested" do
308
+ on "PublishingRun.PublishGemRequested"
309
+ ask :examine, with: { run: :run }
310
+ end
311
+
312
+ policy "AcceptTheReleaseWhenExamined" do
313
+ on "PublishingRun.PublishingExamined"
314
+ where { operation.value == "publish" }
315
+ trigger PublishingRun::Accept, with: { checkout: :checkout, branch: :branch, release_lane: :release_lane,
316
+ on_origin: :on_origin, clean: :clean, version: :version,
317
+ client_version: :client_version,
318
+ changelog: :changelog, approved: :approved, tag_state: :tag_state,
319
+ head: :head, ir_version: :ir_version, ships_from: :ships_from }
320
+ end
321
+
322
+ policy "AcceptTheGemWhenExamined" do
323
+ on "PublishingRun.PublishingExamined"
324
+ where { operation.value == "publish_gem" }
325
+ trigger PublishingRun::AcceptGem, with: { checkout: :checkout, version: :version,
326
+ client_version: :client_version, ir_version: :ir_version,
327
+ ships_from: :ships_from }
328
+ end
329
+
330
+ policy "FaultTheReleaseWhenNotAccepted" do
331
+ on "PublishingRun.PublishingExamined"
332
+ where do
333
+ operation.value == "publish" &&
334
+ (!checkout.value || branch.value != release_lane.value || !on_origin.value || !clean.value ||
335
+ client_version.value != version.value || !changelog.value || tag_state.value == "elsewhere" ||
336
+ (!approved.value && tag_state.value != "at_release_commit"))
337
+ end
338
+ trigger PublishingRun::Fault, with: { refusal: "a release rule is not met: check the branch, tree, versions, CHANGELOG, tag and the Release-Approved-By line" }
339
+ end
340
+
341
+ policy "FaultTheGemWhenNotAccepted" do
342
+ on "PublishingRun.PublishingExamined"
343
+ where do
344
+ operation.value == "publish_gem" && (!checkout.value || client_version.value != version.value)
345
+ end
346
+ trigger PublishingRun::Fault, with: { refusal: "a gem push rule is not met: needs a checkout and the client at the gem's version" }
347
+ end
348
+
349
+ policy "PerformPublishingWhenAccepted" do
350
+ on "PublishingRun.PublishingAccepted"
351
+ ask :perform, with: { run: :run }
352
+ end
353
+
354
+ policy "PerformPublishingWhenGemAccepted" do
355
+ on "PublishingRun.GemAccepted"
356
+ ask :perform, with: { run: :run }
357
+ end
358
+
359
+ # A real run advances the root Release: tagged when the tag was made, published when a registry
360
+ # took the gem, verified when every registry in scope lists the version.
361
+ policy "RecordTheTagWhenPublished" do
362
+ on "PublishingRun.PublishingAnswered"
363
+ where { tagged.value }
364
+ trigger Release::Tag, with: { version: :version, ir_version: :ir_version, ships_from: :ships_from }
365
+ end
366
+
367
+ policy "RecordThePublishingWhenPublished" do
368
+ on "PublishingRun.PublishingAnswered"
369
+ where { published.value }
370
+ trigger Release::MarkPublished, with: { version: :version }
371
+ end
372
+
373
+ policy "RecordTheVerificationWhenPublished" do
374
+ on "PublishingRun.PublishingAnswered"
375
+ where { verified.value }
376
+ trigger Release::Verify, with: { version: :version }
377
+ end
378
+
379
+ # A release that stopped after a real step (the tag pushed, the gem published) still records the
380
+ # steps it took on the root Release, then ends as a fault carrying what the release said.
381
+ policy "RecordPublishingOutcome" do
382
+ on "PublishingRun.PublishingAnswered"
383
+ where { succeeded.value }
384
+ trigger PublishingRun::Complete, with: { report: :report, tagged: :tagged, published: :published,
385
+ verified: :verified }
386
+ end
387
+
388
+ policy "RecordPublishingShortfall" do
389
+ on "PublishingRun.PublishingAnswered"
390
+ where { succeeded.value == false }
391
+ trigger PublishingRun::Fault, with: { refusal: :report }
392
+ end
393
+
394
+ policy "RecordPublishingFault" do
395
+ on "PublishingRun.PublishingRefused"
396
+ trigger PublishingRun::Fault, with: { refusal: :refusal }
397
+ end
398
+
399
+ # Promotion: moving a lane forward onto a commit that has passed every `RequiredCheck`. The
400
+ # adapter reads the facts (does the lane exist, where its head stands, where each check stands
401
+ # against the commit) and `Accept` holds the rules, so what makes a commit fit for the lane is
402
+ # decided here and in the Lane and RequiredCheck rows, never by the workflow that runs
403
+ # `hecks promotion_run.promote!`. Without --confirm the run is a rehearsal: it names the move it
404
+ # would make and makes none. A real run fast-forwards the lane (never forces it) and moves the
405
+ # tag the lane `feeds`, forward only; a lane that already holds the commit still has its tag
406
+ # brought up to the lane's head, so a half-finished run is finished by the next.
407
+ #
408
+ # A commit is certified by the checks of that exact commit. With `commit` named, that commit is
409
+ # the one judged, and no other is ever put in its place. Without it, the commit is the newest
410
+ # one of the followed lane (first-parent, a bounded way back) that every `RequiredCheck` passed
411
+ # on and that fast-forwards the lane, so the outcome never depends on which push's CI run
412
+ # started the promotion; when none qualifies the refusal names what the lane's head is
413
+ # waiting on.
414
+ aggregate "PromotionRun" do
415
+ description "One move of a lane onto a commit, or the rehearsal of it: judged by the facts, then carried out."
416
+
417
+ attribute :run, RunKey
418
+ attribute :operation, Operation, optional: true
419
+ attribute :confirm, Switch, optional: true
420
+ attribute :lane, Word
421
+ attribute :commit, Word, optional: true
422
+ attribute :checkout, Switch, optional: true
423
+ attribute :lane_known, Switch, optional: true
424
+ attribute :green, Switch, optional: true
425
+ attribute :descends, Switch, optional: true
426
+ attribute :head, Word, optional: true
427
+ attribute :behind_hours, Hours, optional: true
428
+ attribute :limit_hours, Hours, optional: true
429
+ attribute :promoted, Switch, optional: true
430
+ attribute :reason, Report, optional: true
431
+ attribute :report, Report, optional: true
432
+ attribute :refusal, Report, optional: true
433
+ identified_by :run
434
+
435
+ value_object "RunKey" do
436
+ attribute :value, String, matches: :present
437
+
438
+ invariant("a run is named") { !value.to_s.empty? }
439
+ end
440
+
441
+ value_object "Operation" do
442
+ attribute :value, String, matches: :present
443
+ end
444
+
445
+ value_object "Switch" do
446
+ attribute :value, Boolean
447
+ end
448
+
449
+ value_object "Report" do
450
+ attribute :value, String
451
+ end
452
+
453
+ # A branch name, or a commit.
454
+ value_object "Word" do
455
+ attribute :value, String, matches: :present
456
+ end
457
+
458
+ # How long a lane has stood behind the lane it follows, or how long its row lets it.
459
+ value_object "Hours" do
460
+ attribute :value, Integer
461
+ end
462
+
463
+ lifecycle :status, default: "requested" do
464
+ mark :failure, "faulted"
465
+ transition "Accept" => "accepted", from: "requested"
466
+ transition "Observe" => "observed", from: "requested"
467
+ transition "Complete" => "completed", from: %w[accepted observed]
468
+ transition "Fault" => "faulted", from: %w[requested accepted]
469
+ transition "Lag" => "faulted", from: "observed"
470
+ mark :terminal, "completed", "faulted"
471
+ end
472
+
473
+ # Looks at a lane and moves nothing: faults when it has stood behind the lane it follows for
474
+ # longer than its `Lane` row allows. A lane whose row allows no lag is
475
+ # never late.
476
+ command "Watch" do
477
+ role "Maintainer"
478
+ goal "Fault when a lane has stood behind the lane it follows for longer than its Lane row allows"
479
+
480
+ attribute :lane, Word, sets: true
481
+ attribute :run, RunKey, sets: true
482
+
483
+ sets :operation, to: "watch"
484
+
485
+ emits WatchRequested
486
+ end
487
+
488
+ command "Promote" do
489
+ role "Maintainer"
490
+ goal "Move a lane onto a commit that has passed every required check, or with no --confirm rehearse the move"
491
+
492
+ attribute :lane, Word, sets: true
493
+ attribute :commit, Word, optional: true, sets: true
494
+ attribute :run, RunKey, sets: true
495
+ attribute :confirm, Switch, optional: true, sets: true
496
+
497
+ sets :operation, to: "promote"
498
+
499
+ emits PromoteRequested
500
+ end
501
+
502
+ # What the tree and the remote reported, held against the rules of a promotion: the adapter
503
+ # supplies the facts and the givens decide.
504
+ command "Accept" do
505
+ role "System"
506
+ goal "Let a lane move only in a hecks checkout, onto a commit that is green on every required check and contains the lane's head"
507
+
508
+ reference_to PromotionRun
509
+ attribute :checkout, Switch, sets: true
510
+ attribute :lane_known, Switch, sets: true
511
+ attribute :green, Switch, sets: true
512
+ attribute :descends, Switch, sets: true
513
+ attribute :commit, Word, sets: true
514
+ attribute :head, Word, optional: true, sets: true
515
+
516
+ given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
517
+ given("the lane is one of the Lane rows, and follows another lane") { lane_known.value }
518
+ given("every RequiredCheck is green on the commit: wait for the checks, or fix the red one") { green.value }
519
+ given("the commit is on the lane it follows and contains the lane's head: a lane only moves forward") { descends.value }
520
+
521
+
522
+ emits PromotionAccepted
523
+ end
524
+
525
+ # What the tree and the remote reported about a watched lane, held against the rules of a
526
+ # watch: it needs a hecks checkout and a lane that follows another.
527
+ command "Observe" do
528
+ role "System"
529
+ goal "Let a lane be judged late or on time only in a hecks checkout, for a lane that follows another"
530
+
531
+ reference_to PromotionRun
532
+ attribute :checkout, Switch, sets: true
533
+ attribute :lane_known, Switch, sets: true
534
+ attribute :behind_hours, Hours, sets: true
535
+ attribute :limit_hours, Hours, sets: true
536
+ attribute :promoted, Switch, sets: true
537
+ attribute :reason, Report, sets: true
538
+
539
+ given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
540
+ given("the lane is one of the Lane rows, and follows another lane") { lane_known.value }
541
+
542
+
543
+ emits LaneObserved
544
+ end
545
+
546
+ command "Complete" do
547
+ role "System"
548
+ goal "Record that the promotion was carried out or rehearsed, or the lane was on time, and what it reported"
549
+
550
+ reference_to PromotionRun
551
+ attribute :report, Report, sets: true
552
+ attribute :promoted, Switch, sets: true
553
+
554
+
555
+ emits PromotionCompleted
556
+ end
557
+
558
+ # A lane that has stood behind the lane it follows for longer than its Lane row allows.
559
+ command "Lag" do
560
+ role "System"
561
+ goal "Record that a lane is late, and what it is waiting on"
562
+
563
+ reference_to PromotionRun
564
+ attribute :refusal, Report, sets: true
565
+
566
+
567
+ emits LaneLagged
568
+ end
569
+
570
+ command "Fault" do
571
+ role "System"
572
+ goal "Record that the promotion was refused or could not be carried out, and why"
573
+
574
+ reference_to PromotionRun
575
+ attribute :refusal, Report, sets: true
576
+
577
+
578
+ emits PromotionFaulted
579
+ end
580
+
581
+ query "PromotionOutcome" do
582
+ description "How one promotion ended: its status, and what it reported or why it failed."
583
+ attribute :run, RunKey
584
+ where(run: :run)
585
+ order_by :run
586
+ end
587
+
588
+ query "PromotionFaulted" do
589
+ description "Every promotion that was refused or could not be carried out."
590
+ where(status: "faulted")
591
+ order_by :run
592
+ end
593
+ end
594
+
595
+ policy "ExamineWhenPromoteRequested" do
596
+ on "PromotionRun.PromoteRequested"
597
+ ask :examine, with: { run: :run }
598
+ end
599
+
600
+ policy "ExamineWhenWatchRequested" do
601
+ on "PromotionRun.WatchRequested"
602
+ ask :examine, with: { run: :run }
603
+ end
604
+
605
+ policy "ObserveWhenWatchExamined" do
606
+ on "PromotionRun.PromotionExamined"
607
+ where { operation.value == "watch" }
608
+ trigger PromotionRun::Observe, with: { checkout: :checkout, lane_known: :lane_known, behind_hours: :behind_hours,
609
+ limit_hours: :limit_hours, promoted: :promoted,
610
+ reason: :reason }
611
+ end
612
+
613
+ policy "FaultWhenWatchCannotBeJudged" do
614
+ on "PromotionRun.PromotionExamined"
615
+ where { operation.value == "watch" && (!checkout.value || !lane_known.value) }
616
+ trigger PromotionRun::Fault, with: { refusal: :reason }
617
+ end
618
+
619
+ policy "LagWhenLaneLate" do
620
+ on "PromotionRun.LaneObserved"
621
+ where { behind_hours.value > limit_hours.value }
622
+ trigger PromotionRun::Lag, with: { refusal: :reason }
623
+ end
624
+
625
+ policy "CompleteWhenLaneOnTime" do
626
+ on "PromotionRun.LaneObserved"
627
+ where { behind_hours.value <= limit_hours.value }
628
+ trigger PromotionRun::Complete, with: { report: :reason, promoted: :promoted }
629
+ end
630
+
631
+ policy "AcceptPromotionWhenExamined" do
632
+ on "PromotionRun.PromotionExamined"
633
+ where { operation.value == "promote" }
634
+ trigger PromotionRun::Accept, with: { checkout: :checkout, lane_known: :lane_known, green: :green,
635
+ descends: :descends, commit: :commit, head: :head }
636
+ end
637
+
638
+ policy "FaultPromotionWhenNotAccepted" do
639
+ on "PromotionRun.PromotionExamined"
640
+ where { operation.value == "promote" && (!checkout.value || !lane_known.value || !green.value || !descends.value) }
641
+ trigger PromotionRun::Fault, with: { refusal: :reason }
642
+ end
643
+
644
+ policy "PerformPromotionWhenAccepted" do
645
+ on "PromotionRun.PromotionAccepted"
646
+ ask :perform, with: { run: :run }
647
+ end
648
+
649
+ policy "RecordPromotionOutcome" do
650
+ on "PromotionRun.PromotionAnswered"
651
+ trigger PromotionRun::Complete, with: { report: :report, promoted: :promoted }
652
+ end
653
+
654
+ policy "RecordPromotionFault" do
655
+ on "PromotionRun.PromotionRefused"
656
+ trigger PromotionRun::Fault, with: { refusal: :refusal }
657
+ end
658
+
659
+ aggregate "Registry" do
660
+ description "A bluebook registry repository: packages versioned in it and released as tags."
661
+
662
+ attribute :run, RegistryKey
663
+ attribute :package, PackageName, optional: true
664
+ attribute :root, Location, optional: true
665
+ attribute :report, Report, optional: true
666
+ attribute :refusal, Report, optional: true
667
+ identified_by :run
668
+
669
+ value_object "RegistryKey" do
670
+ attribute :value, String, matches: :present
671
+
672
+ invariant("a release is named") { !value.to_s.empty? }
673
+ end
674
+
675
+ value_object "PackageName" do
676
+ attribute :value, String, matches: :snake_name
677
+ end
678
+
679
+ # The registry repository: the current directory when absent.
680
+ value_object "Location" do
681
+ attribute :value, String, matches: :not_empty
682
+ end
683
+
684
+ value_object "Report" do
685
+ attribute :value, String
686
+ end
687
+
688
+ # An answer that is one document of text, exactly as the tool that produced it wrote it.
689
+ value_object "Document" do
690
+ attribute :text, String
691
+ end
692
+
693
+ lifecycle :status, default: "requested" do
694
+ mark :failure, "refused"
695
+ transition "Complete" => "tagged", from: "requested"
696
+ transition "Abandon" => "refused", from: "requested"
697
+ mark :terminal, "refused", "tagged"
698
+ end
699
+
700
+ # `hecks package.release <package> [root=path]`. Tags the package's current version as
701
+ # `<package>-vX.Y.Z` in the local repository and never pushes; the report ends in the command
702
+ # that does. A refusal says which rule the package broke.
703
+ command "Release" do
704
+ role "Operator"
705
+ goal "Tag a package of this registry at the version its bluebook.yml carries"
706
+
707
+ attribute :run, RegistryKey, sets: true
708
+ attribute :package, PackageName, sets: true
709
+ attribute :root, Location, optional: true, sets: true
710
+
711
+
712
+ emits ReleaseRequested
713
+ end
714
+
715
+ command "Complete" do
716
+ role "System"
717
+ goal "Record that the release was tagged, and the command that publishes it"
718
+
719
+ reference_to Registry
720
+ attribute :report, Report, sets: true
721
+
722
+
723
+ emits ReleaseRecorded
724
+ end
725
+
726
+ command "Abandon" do
727
+ role "System"
728
+ goal "Record that the release was refused, and why"
729
+
730
+ reference_to Registry
731
+ attribute :refusal, Report, sets: true
732
+
733
+
734
+ emits ReleaseAbandoned
735
+ end
736
+
737
+ # `hecks package.check [root=path]`: a read of the repository's files and tags, so it keeps no
738
+ # record. A package that changed since its latest release without a version bump and a changelog
739
+ # entry refuses it, naming each one.
740
+ query "Check" do
741
+ description "Judge every package against its latest release: a changed package needs a newer version and a changelog entry."
742
+ attribute :root, Location, optional: true
743
+ returns Document
744
+ end
745
+
746
+ # `hecks package.digest <package> [root=path]`: a read of the package's files, so it keeps no
747
+ # record. The digest is `Lock.digest_of` over `<package>/bluebook/*.bluebook` only (the
748
+ # `bluebook.lock` digest line), then the package's shape labels; `root` is the registry, or a
749
+ # project that vendors the package.
750
+ query "Digest" do
751
+ description "Print a package's content digest and shape labels, as its bluebook.lock records them."
752
+ attribute :package, PackageName
753
+ attribute :root, Location, optional: true
754
+ returns Document
755
+ end
756
+
757
+ query "Releasing" do
758
+ description "What releasing one run did: its status, and the report or the refusal."
759
+ attribute :run, RegistryKey
760
+ where(run: :run)
761
+ order_by :run
762
+ end
763
+
764
+ query "Refused" do
765
+ description "Every release that was refused."
766
+ where(status: "refused")
767
+ order_by :run
768
+ end
769
+ end
770
+
771
+ policy "TagWhenReleased" do
772
+ on "Registry.ReleaseRequested"
773
+ ask :tag, with: { run: :run }
774
+ end
775
+
776
+ policy "RecordTheTag" do
777
+ on "Registry.ReleaseTagged"
778
+ trigger Registry::Complete, with: { report: :report }
779
+ end
780
+
781
+ policy "RecordTheRefusedTag" do
782
+ on "Registry.ReleaseRefused"
783
+ trigger Registry::Abandon, with: { refusal: :refusal }
784
+ end
785
+
786
+ aggregate "Package" do
787
+ description "One package of the bluebook registry, vendored into a project and pinned."
788
+
789
+ attribute :package, PackageRef
790
+ attribute :from, Location, optional: true
791
+ attribute :root, Location, optional: true
792
+ attribute :report, Report, optional: true
793
+ attribute :refusal, Report, optional: true
794
+ identified_by :package
795
+
796
+ # `name` for the newest release, `name@1.2.0` for one release, `name@9f2c1ab` for a commit.
797
+ value_object "PackageRef" do
798
+ attribute :value, String, pattern: '^[a-z][a-z0-9_]*(@[^ \t\n\r]+)?$'
799
+
800
+ invariant("a package is named") { !value.to_s.empty? }
801
+ end
802
+
803
+ # A directory: the source repository (`from`), or the project the files land in (`root`).
804
+ value_object "Location" do
805
+ attribute :value, String, matches: :not_empty
806
+ end
807
+
808
+ value_object "Report" do
809
+ attribute :value, String
810
+ end
811
+
812
+ # An answer that is one document of text, exactly as the tool that produced it wrote it.
813
+ value_object "Document" do
814
+ attribute :text, String
815
+ end
816
+
817
+ lifecycle :status, default: "requested" do
818
+ mark :failure, "refused"
819
+ transition "Revendor" => "requested", from: %w[vendored refused]
820
+ transition "Complete" => "vendored", from: "requested"
821
+ transition "Abandon" => "refused", from: "requested"
822
+ end
823
+
824
+ # `hecks vendor <package[@version]> [from=path] [root=path]`. The record is named by what was
825
+ # asked for, so a release is one record; vendoring the same spelling again is `hecks revendor`.
826
+ # `from` defaults to $EMBRYONAUT_BLUEBOOKS_SRC and `root` to the current directory, both read by
827
+ # the adapter.
828
+ command "Vendor" do
829
+ role "Operator"
830
+ goal "Pin a package of the bluebook registry into this project, at a release or a commit"
831
+
832
+ attribute :package, PackageRef, sets: true
833
+ attribute :from, Location, optional: true, sets: true
834
+ attribute :root, Location, optional: true, sets: true
835
+
836
+
837
+ emits VendorRequested
838
+ end
839
+
840
+ command "Revendor" do
841
+ role "Operator"
842
+ goal "Pin a package that was vendored before again, for the newest release or the same one"
843
+
844
+ reference_to Package
845
+ attribute :from, Location, optional: true, sets: true
846
+ attribute :root, Location, optional: true, sets: true
847
+
848
+
849
+ emits RevendorRequested
850
+ end
851
+
852
+ command "Complete" do
853
+ role "System"
854
+ goal "Record that the package was pinned, and what changed"
855
+
856
+ reference_to Package
857
+ attribute :report, Report, sets: true
858
+
859
+
860
+ emits PackageVendored
861
+ end
862
+
863
+ command "Abandon" do
864
+ role "System"
865
+ goal "Record that the package could not be pinned, and why"
866
+
867
+ reference_to Package
868
+ attribute :refusal, Report, sets: true
869
+
870
+
871
+ emits VendoringRefused
872
+ end
873
+
874
+ query "Pinning" do
875
+ description "What vendoring one package did: its status, and the report or the refusal."
876
+ attribute :package, PackageRef
877
+ where(package: :package)
878
+ order_by :package
879
+ end
880
+
881
+ query "Unpinned" do
882
+ description "Every package the last vendoring of which was refused."
883
+ where(status: "refused")
884
+ order_by :package
885
+ end
886
+
887
+ # `hecks package.verify [root=path]`: a read of the files, so it keeps no record. The manifest
888
+ # is the answer; a package that disagrees with its lock refuses it, naming each one.
889
+ query "Verify" do
890
+ description "Check every vendored package against its bluebook.lock, then describe them as the manifest a client image carries."
891
+ attribute :root, Location, optional: true
892
+ returns Document
893
+ end
894
+ end
895
+
896
+ policy "PinWhenVendored" do
897
+ on "Package.VendorRequested"
898
+ ask :pin, with: { package: :package }
899
+ end
900
+
901
+ policy "PinWhenRevendored" do
902
+ on "Package.RevendorRequested"
903
+ ask :pin, with: { package: :package }
904
+ end
905
+
906
+ policy "RecordThePinning" do
907
+ on "Package.PackagePinned"
908
+ trigger Package::Complete, with: { report: :report }
909
+ end
910
+
911
+ policy "RecordTheRefusedPin" do
912
+ on "Package.PinRefused"
913
+ trigger Package::Abandon, with: { refusal: :refusal }
914
+ end
915
+ end
916
+ end