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,966 @@
1
+ Hecks.bluebook "Hecks" do
2
+ domain_module "Check" do
3
+ vision "Is it right? Gate, model check, style, inspection and audit."
4
+
5
+ # Gate: the checks a stage holds a change against before it is let through. The checks are data
6
+ # (the Vocabulary gate rows), run together, and a red one faults the run, so `--wait` fails the
7
+ # push or the build that asked, and the journal keeps when the gate went red.
8
+ #
9
+ # Reuse rule (enforced by Tools::GateMemo): a check is skipped only when its inputs hash the
10
+ # same as the inputs of its last green run, and the skip is reported as "skipped", never as
11
+ # passed. The inputs are the files the check reads (GateMemo::INPUTS, by content hash), its
12
+ # command and its environment. A red result is never reused, and an unreadable or unwritable
13
+ # memo runs every check in full and says so. RuboCop reuses per file: the run is skipped only
14
+ # when the Ruby files and their hashes match the last green run; otherwise it lints the
15
+ # changed files and the files that require them, and runs in full when that set cannot be
16
+ # worked out (GateMemo::RubyFiles).
17
+ #
18
+ # The memo is kept outside the checkout, in the file `HECKS_GATE_MEMO` names, or else in
19
+ # gate_memo.json under the hecks-dev directory of the user's Claude directory.
20
+ aggregate "GateRun" do
21
+ description "One run of a stage's checks: every check of the stage, or the ones named."
22
+
23
+ attribute :run, RunKey
24
+ attribute :operation, Operation, optional: true
25
+ attribute :stage, Stage
26
+ attribute :only, CheckList, optional: true
27
+ attribute :checkout, Switch, optional: true
28
+ attribute :report, Report, optional: true
29
+ attribute :refusal, Report, optional: true
30
+ identified_by :run
31
+
32
+ value_object "RunKey" do
33
+ attribute :value, String, matches: :present
34
+
35
+ invariant("a run is named") { !value.to_s.empty? }
36
+ end
37
+
38
+ value_object "Operation" do
39
+ attribute :value, String, matches: :present
40
+ end
41
+
42
+ value_object "Stage" do
43
+ attribute :value, String, matches: :snake_name
44
+
45
+ invariant("a stage is named") { !value.to_s.empty? }
46
+ end
47
+
48
+ value_object "CheckList" do
49
+ attribute :value, String, pattern: '^[a-z][a-z0-9_]*(,[a-z][a-z0-9_]*)*$'
50
+ end
51
+
52
+ value_object "Switch" do
53
+ attribute :value, Boolean
54
+ end
55
+
56
+ value_object "Report" do
57
+ attribute :value, String
58
+ end
59
+
60
+ lifecycle :status, default: "requested" do
61
+ mark :failure, "faulted"
62
+ transition "Accept" => "accepted", from: "requested"
63
+ transition "Complete" => "completed", from: "accepted"
64
+ transition "Fault" => "faulted", from: %w[requested accepted]
65
+ mark :terminal, "completed", "faulted"
66
+ end
67
+
68
+ command "Gate" do
69
+ role "Maintainer"
70
+ goal "Run every check of a stage, or the ones named, and keep whether the gate is green"
71
+
72
+ attribute :stage, Stage, sets: true
73
+ attribute :only, CheckList, optional: true, sets: true
74
+ attribute :run, RunKey, sets: true
75
+
76
+ sets :operation, to: "gate"
77
+
78
+ emits GateRequested
79
+ end
80
+
81
+ command "Accept" do
82
+ role "System"
83
+ goal "Let a request through only when the working tree is a hecks checkout"
84
+
85
+ reference_to GateRun
86
+ attribute :checkout, Switch, sets: true
87
+
88
+ given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
89
+
90
+
91
+ emits GateAccepted
92
+ end
93
+
94
+ command "Complete" do
95
+ role "System"
96
+ goal "Record that every check passed, and which"
97
+
98
+ reference_to GateRun
99
+ attribute :report, Report, sets: true
100
+
101
+
102
+ emits GateCompleted
103
+ end
104
+
105
+ command "Fault" do
106
+ role "System"
107
+ goal "Record that a check was red or the run could not be made, and why"
108
+
109
+ reference_to GateRun
110
+ attribute :refusal, Report, sets: true
111
+
112
+
113
+ emits GateFaulted
114
+ end
115
+
116
+ query "GateOutcome" do
117
+ description "How one run ended: its status, and what it reported or why it failed."
118
+ attribute :run, RunKey
119
+ where(run: :run)
120
+ order_by :run
121
+ end
122
+
123
+ query "GateFaulted" do
124
+ description "Every run that went red or could not be made."
125
+ where(status: "faulted")
126
+ order_by :run
127
+ end
128
+ end
129
+
130
+ policy "ExamineWhenGateRequested" do
131
+ on "GateRun.GateRequested"
132
+ ask :examine, with: { run: :run }
133
+ end
134
+
135
+ policy "AcceptGateWhenExamined" do
136
+ on "GateRun.GateExamined"
137
+ trigger GateRun::Accept, with: { checkout: :checkout }
138
+ end
139
+
140
+ policy "FaultGateWhenNotAccepted" do
141
+ on "GateRun.GateExamined"
142
+ where { !checkout.value }
143
+ trigger GateRun::Fault, with: { refusal: "needs a hecks checkout: hecks.gemspec stands beside lib/" }
144
+ end
145
+
146
+ policy "PerformGateWhenAccepted" do
147
+ on "GateRun.GateAccepted"
148
+ ask :perform, with: { run: :run }
149
+ end
150
+
151
+ policy "RecordGateOutcome" do
152
+ on "GateRun.GateAnswered"
153
+ trigger GateRun::Complete, with: { report: :report }
154
+ end
155
+
156
+ policy "RecordGateFault" do
157
+ on "GateRun.GateRefused"
158
+ trigger GateRun::Fault, with: { refusal: :refusal }
159
+ end
160
+
161
+ # A journaled command whose work happens outside the runtime (ADR 0080, section 11). Every
162
+ # command below that runs something follows this one shape, so later aggregates copy it:
163
+ #
164
+ # 1. A creating command records the request as a record in state "requested" and emits.
165
+ # 2. A policy on that event asks for the work by name (`ask :check`); the hecksagon says which
166
+ # port answers. The runtime hands the port's adapter the whole record, so the adapter does
167
+ # all the IO, and only there.
168
+ # 3. The adapter answers (a hash named like a command's arguments) or raises (its message
169
+ # is the refusal). One policy per outcome re-enters the record with a command that stores it.
170
+ #
171
+ # The ports are declared in hecks.hecksagon; each adapter is in adapters/.
172
+
173
+ aggregate "ModelCheckRun" do
174
+ description "One static analysis over domains' models, and what it found: a check's history."
175
+
176
+ attribute :run, RunKey
177
+ attribute :domains, DomainList, optional: true
178
+ attribute :profile, ProfileName, optional: true
179
+ attribute :strict, Switch, optional: true
180
+ attribute :report, Report, optional: true
181
+ attribute :checked, Checked, optional: true
182
+ attribute :refusal, Report, optional: true
183
+ identified_by :run
184
+
185
+ value_object "RunKey" do
186
+ attribute :value, String, matches: :present
187
+
188
+ invariant("a run is named") { !value.to_s.empty? }
189
+ end
190
+
191
+ value_object "DomainList" do
192
+ attribute :value, String, matches: :not_empty
193
+ end
194
+
195
+ value_object "ProfileName" do
196
+ attribute :value, String, pattern: '^client$'
197
+ end
198
+
199
+ value_object "Switch" do
200
+ attribute :value, Boolean
201
+ end
202
+
203
+ value_object "Report" do
204
+ attribute :value, String
205
+ end
206
+
207
+ # How many domains the report examined, counted from its headers so a reader need not.
208
+ value_object "Checked" do
209
+ attribute :value, Integer
210
+
211
+ invariant("a count is not negative") { value >= 0 }
212
+ end
213
+
214
+ lifecycle :status, default: "requested" do
215
+ mark :failure, "flagged"
216
+ transition "Pass" => "clean", from: "requested"
217
+ transition "Flag" => "flagged", from: "requested"
218
+ mark :terminal, "clean", "flagged"
219
+ end
220
+
221
+ command "ModelCheck" do
222
+ role "Operator"
223
+ goal "Check domains for dead states and unreachable steps, and keep the verdict"
224
+
225
+ attribute :run, RunKey, sets: true
226
+ attribute :domains, DomainList, optional: true, sets: true
227
+ attribute :profile, ProfileName, optional: true, sets: true
228
+ attribute :strict, Switch, optional: true, sets: true
229
+
230
+
231
+ emits ModelCheckRequested
232
+ end
233
+
234
+ command "Pass" do
235
+ role "System"
236
+ goal "Record that the analysis left no error"
237
+
238
+ reference_to ModelCheckRun
239
+ attribute :report, Report, sets: true
240
+ attribute :checked, Checked, sets: true
241
+
242
+
243
+ emits ModelCheckPassed
244
+ end
245
+
246
+ command "Flag" do
247
+ role "System"
248
+ goal "Record that the analysis found something, or could not run, and what it said"
249
+
250
+ reference_to ModelCheckRun
251
+ attribute :refusal, Report, sets: true
252
+
253
+
254
+ emits ModelCheckFlagged
255
+ end
256
+
257
+ # `hecks model_check` answers once the request is recorded, so the verdict is read here.
258
+ query "Verdict" do
259
+ description "What one check found: its status, and the report or the reason it could not run."
260
+ attribute :run, RunKey
261
+ where(run: :run)
262
+ order_by :run
263
+ end
264
+
265
+ query "Flagged" do
266
+ description "Every check that left a finding or could not run."
267
+ where(status: "flagged")
268
+ order_by :run
269
+ end
270
+ end
271
+
272
+ policy "AnalyseWhenRequested" do
273
+ on "ModelCheckRun.ModelCheckRequested"
274
+ ask :check, with: { run: :run }
275
+ end
276
+
277
+ policy "RecordTheClean" do
278
+ on "ModelCheckRun.ModelCheckAnswered"
279
+ trigger ModelCheckRun::Pass, with: { report: :report, checked: :checked }
280
+ end
281
+
282
+ policy "RecordTheFlag" do
283
+ on "ModelCheckRun.ModelCheckRefused"
284
+ trigger ModelCheckRun::Flag, with: { refusal: :refusal }
285
+ end
286
+
287
+ # Conformance: the checks on the language itself. Each finds every disagreement and refuses with
288
+ # them all, so a check that fails is recorded as faulted with what it found. The argument-gate
289
+ # matrix rewrites a committed matrix and its fixtures, so it only reports unless it is confirmed.
290
+ aggregate "ConformanceRun", kind: "Run" do
291
+ description "One check that the engines, the reference docs and the argument gates agree with the language."
292
+
293
+ attribute :confirm, Switch, optional: true
294
+ attribute :additive, Switch, optional: true
295
+
296
+ command "CheckEngineAgreement" do
297
+ role "Maintainer"
298
+ goal "Check that the query engines route every comparator through the one shared implementation"
299
+
300
+ attribute :run, RunKey, sets: true
301
+
302
+ sets :operation, to: "check_engine_agreement"
303
+
304
+ emits CheckEngineAgreementRequested
305
+ end
306
+
307
+ command "MeasureDocCoverage" do
308
+ role "Maintainer"
309
+ goal "Check that every live word of the language has prose and a running example in the reference"
310
+
311
+ attribute :run, RunKey, sets: true
312
+
313
+ sets :operation, to: "measure_doc_coverage"
314
+
315
+ emits MeasureDocCoverageRequested
316
+ end
317
+
318
+ command "CheckShapeLedger" do
319
+ role "Maintainer"
320
+ goal "Check that no bluebook's storage shape moved without a translation edge, and rewrite the ledger when confirmed"
321
+
322
+ attribute :run, RunKey, sets: true
323
+ attribute :confirm, Switch, optional: true, sets: true
324
+ # With `confirm`: write the empty edge for a shape that moved with none, for a change that only adds.
325
+ attribute :additive, Switch, optional: true, sets: true
326
+
327
+ sets :operation, to: "check_shape_ledger"
328
+
329
+ emits CheckShapeLedgerRequested
330
+ end
331
+
332
+ command "CheckCommandNames" do
333
+ role "Maintainer"
334
+ goal "Check that every launcher name a workflow, hook, gate row, spec or guide invokes is one the launcher accepts"
335
+
336
+ attribute :run, RunKey, sets: true
337
+
338
+ sets :operation, to: "check_command_names"
339
+
340
+ emits CheckCommandNamesRequested
341
+ end
342
+
343
+ command "CheckWorkflowPagination" do
344
+ role "Maintainer"
345
+ goal "Check that no workflow counts or waits on the items of a GitHub list call that returns only its first page"
346
+
347
+ attribute :run, RunKey, sets: true
348
+
349
+ sets :operation, to: "check_workflow_pagination"
350
+
351
+ emits CheckWorkflowPaginationRequested
352
+ end
353
+
354
+ command "ArgumentGateMatrix" do
355
+ role "Maintainer"
356
+ goal "Generate the argument-gate ordering matrix; rewrite it and its fixtures only when confirmed"
357
+
358
+ attribute :run, RunKey, sets: true
359
+ attribute :confirm, Switch, optional: true, sets: true
360
+
361
+ sets :operation, to: "argument_gate_matrix"
362
+
363
+ emits ArgumentGateMatrixRequested
364
+ end
365
+ end
366
+
367
+ policy "ExamineWhenCheckEngineAgreementRequested" do
368
+ on "ConformanceRun.CheckEngineAgreementRequested"
369
+ ask :examine, with: { run: :run }
370
+ end
371
+
372
+ policy "ExamineWhenMeasureDocCoverageRequested" do
373
+ on "ConformanceRun.MeasureDocCoverageRequested"
374
+ ask :examine, with: { run: :run }
375
+ end
376
+
377
+ policy "ExamineWhenCheckShapeLedgerRequested" do
378
+ on "ConformanceRun.CheckShapeLedgerRequested"
379
+ ask :examine, with: { run: :run }
380
+ end
381
+
382
+ policy "ExamineWhenCheckCommandNamesRequested" do
383
+ on "ConformanceRun.CheckCommandNamesRequested"
384
+ ask :examine, with: { run: :run }
385
+ end
386
+
387
+ policy "ExamineWhenCheckWorkflowPaginationRequested" do
388
+ on "ConformanceRun.CheckWorkflowPaginationRequested"
389
+ ask :examine, with: { run: :run }
390
+ end
391
+
392
+ policy "ExamineWhenArgumentGateMatrixRequested" do
393
+ on "ConformanceRun.ArgumentGateMatrixRequested"
394
+ ask :examine, with: { run: :run }
395
+ end
396
+
397
+ # Style: the comment style guides (Ruby and Rust) and the canonical form of a JSON document. A
398
+ # check finds every violation; a fix rewrites files, so it lists what it would rewrite unless
399
+ # it is confirmed. The baseline of tolerated long blocks is written only when confirmed.
400
+ aggregate "StyleRun" do
401
+ description "One check or fix of comment style, or one document written with its keys in order."
402
+
403
+ attribute :run, RunKey
404
+ attribute :operation, Operation, optional: true
405
+ attribute :confirm, Switch, optional: true
406
+ attribute :paths, PathList, optional: true
407
+ attribute :only, CategoryList, optional: true
408
+ attribute :json, Switch, optional: true
409
+ attribute :top, Top, optional: true
410
+ attribute :ref, Ref, optional: true
411
+ attribute :file, FilePath, optional: true
412
+ attribute :checkout, Switch, optional: true
413
+ attribute :report, Report, optional: true
414
+ attribute :refusal, Report, optional: true
415
+ identified_by :run
416
+
417
+ value_object "RunKey" do
418
+ attribute :value, String, matches: :present
419
+
420
+ invariant("a run is named") { !value.to_s.empty? }
421
+ end
422
+
423
+ value_object "Operation" do
424
+ attribute :value, String, matches: :present
425
+ end
426
+
427
+ value_object "Switch" do
428
+ attribute :value, Boolean
429
+ end
430
+
431
+ value_object "Report" do
432
+ attribute :value, String
433
+ end
434
+
435
+ # Files or directories, comma separated.
436
+ value_object "PathList" do
437
+ attribute :value, String, matches: :csv_list
438
+ end
439
+
440
+ # Violation categories, comma separated.
441
+ value_object "CategoryList" do
442
+ attribute :value, String, pattern: '^[a-z_]+(,[a-z_]+)*$'
443
+ end
444
+
445
+ # How many rows a report lists.
446
+ value_object "Top" do
447
+ attribute :value, Integer
448
+
449
+ invariant("a count is positive") { value > 0 }
450
+ end
451
+
452
+ # A revision a code comparison is made against.
453
+ value_object "Ref" do
454
+ attribute :value, String, matches: :no_whitespace
455
+ end
456
+
457
+ # A JSON file.
458
+ value_object "FilePath" do
459
+ attribute :value, String, matches: :not_empty
460
+
461
+ invariant("a file is named") { !value.to_s.empty? }
462
+ end
463
+
464
+ lifecycle :status, default: "requested" do
465
+ mark :failure, "faulted"
466
+ transition "Accept" => "accepted", from: "requested"
467
+ transition "Complete" => "completed", from: "accepted"
468
+ transition "Fault" => "faulted", from: %w[requested accepted]
469
+ mark :terminal, "completed", "faulted"
470
+ end
471
+
472
+ command "CheckComments" do
473
+ role "Maintainer"
474
+ goal "List every comment that breaks the Ruby style guide"
475
+
476
+ attribute :paths, PathList, sets: true
477
+ attribute :only, CategoryList, optional: true, sets: true
478
+ attribute :run, RunKey, sets: true
479
+
480
+ sets :operation, to: "check_comments"
481
+
482
+ emits CheckCommentsRequested
483
+ end
484
+
485
+ command "FixComments" do
486
+ role "Maintainer"
487
+ goal "Rewrite the mechanical Ruby comment violations"
488
+
489
+ attribute :paths, PathList, sets: true
490
+ attribute :only, CategoryList, optional: true, sets: true
491
+ attribute :run, RunKey, sets: true
492
+ attribute :confirm, Switch, optional: true, sets: true
493
+
494
+ sets :operation, to: "fix_comments"
495
+
496
+ emits FixCommentsRequested
497
+ end
498
+
499
+ command "WriteCommentBaseline" do
500
+ role "Maintainer"
501
+ goal "Record every long comment block as tolerated, for lib/hecks unless paths are named"
502
+
503
+ attribute :paths, PathList, optional: true, sets: true
504
+ attribute :run, RunKey, sets: true
505
+ attribute :confirm, Switch, optional: true, sets: true
506
+
507
+ sets :operation, to: "write_comment_baseline"
508
+
509
+ emits WriteCommentBaselineRequested
510
+ end
511
+
512
+ command "CheckCommentsUnchanged" do
513
+ role "Maintainer"
514
+ goal "Prove an edit was comment-only: no file's code differs from the ref"
515
+
516
+ attribute :ref, Ref, sets: true
517
+ attribute :paths, PathList, optional: true, sets: true
518
+ attribute :run, RunKey, sets: true
519
+
520
+ sets :operation, to: "check_comments_unchanged"
521
+
522
+ emits CheckCommentsUnchangedRequested
523
+ end
524
+
525
+ command "CheckRustComments" do
526
+ role "Maintainer"
527
+ goal "List every comment that breaks the Rust style guide"
528
+
529
+ attribute :paths, PathList, sets: true
530
+ attribute :only, CategoryList, optional: true, sets: true
531
+ attribute :run, RunKey, sets: true
532
+
533
+ sets :operation, to: "check_rust_comments"
534
+
535
+ emits CheckRustCommentsRequested
536
+ end
537
+
538
+ command "FixRustComments" do
539
+ role "Maintainer"
540
+ goal "Rewrite the mechanical Rust comment violations"
541
+
542
+ attribute :paths, PathList, sets: true
543
+ attribute :only, CategoryList, optional: true, sets: true
544
+ attribute :run, RunKey, sets: true
545
+ attribute :confirm, Switch, optional: true, sets: true
546
+
547
+ sets :operation, to: "fix_rust_comments"
548
+
549
+ emits FixRustCommentsRequested
550
+ end
551
+
552
+ command "Canonicalise" do
553
+ role "Maintainer"
554
+ goal "Write a JSON document with every object's keys sorted"
555
+
556
+ attribute :file, FilePath, sets: true
557
+ attribute :run, RunKey, sets: true
558
+
559
+ sets :operation, to: "canonicalise"
560
+
561
+ emits CanonicaliseRequested
562
+ end
563
+
564
+ # What the tree reported about itself, held against every request: nothing here runs
565
+ # outside a hecks checkout (hecks.gemspec beside lib/).
566
+ command "Accept" do
567
+ role "System"
568
+ goal "Let a request through only when the working tree is a hecks checkout"
569
+
570
+ reference_to StyleRun
571
+ attribute :checkout, Switch, sets: true
572
+
573
+ given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
574
+
575
+
576
+ emits StyleAccepted
577
+ end
578
+
579
+ command "Complete" do
580
+ role "System"
581
+ goal "Record that the request was carried out, and what it reported"
582
+
583
+ reference_to StyleRun
584
+ attribute :run, RunKey
585
+ attribute :report, Report, sets: true
586
+
587
+
588
+ emits StyleCompleted
589
+ end
590
+
591
+ command "Fault" do
592
+ role "System"
593
+ goal "Record that the request was refused or could not be carried out, and why"
594
+
595
+ reference_to StyleRun
596
+ attribute :refusal, Report, sets: true
597
+
598
+
599
+ emits StyleFaulted
600
+ end
601
+
602
+ query "StyleOutcome" do
603
+ description "How one request ended: its status, and what it reported or why it failed."
604
+ attribute :run, RunKey
605
+ where(run: :run)
606
+ order_by :run
607
+ end
608
+
609
+ query "StyleFaulted" do
610
+ description "Every request that was refused or could not be carried out."
611
+ where(status: "faulted")
612
+ order_by :run
613
+ end
614
+
615
+ # An answer that is one document of text, exactly as the tool that produced it wrote it.
616
+ value_object "Document" do
617
+ attribute :text, String
618
+ end
619
+
620
+ query "ReportComments" do
621
+ description "The Ruby comment violations, as summary tables, a list or JSON."
622
+ attribute :paths, PathList
623
+ attribute :only, CategoryList, optional: true
624
+ attribute :json, Switch, optional: true
625
+ attribute :top, Top, optional: true
626
+ returns Document
627
+ end
628
+
629
+ query "ReportRustComments" do
630
+ description "The Rust comment violations, as summary tables, a list or JSON."
631
+ attribute :paths, PathList
632
+ attribute :only, CategoryList, optional: true
633
+ attribute :json, Switch, optional: true
634
+ attribute :top, Top, optional: true
635
+ returns Document
636
+ end
637
+ end
638
+
639
+ # Inspection: ranking the Ruby by complexity, finding copied code, listing design smells and
640
+ # writing the combined report. A read of the tree: nothing is rewritten. The files the style
641
+ # config excludes (generated output, vendored code) are left out of every tool.
642
+ aggregate "InspectionRun" do
643
+ description "One inspection of the Ruby by flog, flay, reek or rubycritic."
644
+
645
+ attribute :run, RunKey
646
+ attribute :operation, Operation, optional: true
647
+ attribute :paths, PathList, optional: true
648
+ attribute :top, Top, optional: true
649
+ attribute :checkout, Switch, optional: true
650
+ attribute :report, Report, optional: true
651
+ attribute :refusal, Report, optional: true
652
+ identified_by :run
653
+
654
+ value_object "RunKey" do
655
+ attribute :value, String, matches: :present
656
+
657
+ invariant("a run is named") { !value.to_s.empty? }
658
+ end
659
+
660
+ value_object "Operation" do
661
+ attribute :value, String, matches: :present
662
+ end
663
+
664
+ value_object "Switch" do
665
+ attribute :value, Boolean
666
+ end
667
+
668
+ value_object "Report" do
669
+ attribute :value, String
670
+ end
671
+
672
+ # Files or directories, comma separated; lib when none is named.
673
+ value_object "PathList" do
674
+ attribute :value, String, matches: :csv_list
675
+ end
676
+
677
+ # How many lines of the report are kept.
678
+ value_object "Top" do
679
+ attribute :value, Integer
680
+
681
+ invariant("a count is positive") { value > 0 }
682
+ end
683
+
684
+ lifecycle :status, default: "requested" do
685
+ mark :failure, "faulted"
686
+ transition "Accept" => "accepted", from: "requested"
687
+ transition "Complete" => "completed", from: "accepted"
688
+ transition "Fault" => "faulted", from: %w[requested accepted]
689
+ mark :terminal, "completed", "faulted"
690
+ end
691
+
692
+ command "Flog" do
693
+ role "Maintainer"
694
+ goal "Rank the Ruby methods by complexity, worst first"
695
+
696
+ attribute :paths, PathList, optional: true, sets: true
697
+ attribute :top, Top, optional: true, sets: true
698
+ attribute :run, RunKey, sets: true
699
+
700
+ sets :operation, to: "flog"
701
+
702
+ emits FlogRequested
703
+ end
704
+
705
+ command "Flay" do
706
+ role "Maintainer"
707
+ goal "Find Ruby code that is copied or nearly copied"
708
+
709
+ attribute :paths, PathList, optional: true, sets: true
710
+ attribute :top, Top, optional: true, sets: true
711
+ attribute :run, RunKey, sets: true
712
+
713
+ sets :operation, to: "flay"
714
+
715
+ emits FlayRequested
716
+ end
717
+
718
+ command "Reek" do
719
+ role "Maintainer"
720
+ goal "List the design smells in the Ruby"
721
+
722
+ attribute :paths, PathList, optional: true, sets: true
723
+ attribute :top, Top, optional: true, sets: true
724
+ attribute :run, RunKey, sets: true
725
+
726
+ sets :operation, to: "reek"
727
+
728
+ emits ReekRequested
729
+ end
730
+
731
+ command "Rubycritic" do
732
+ role "Maintainer"
733
+ goal "Write the combined quality report, with git churn"
734
+
735
+ attribute :paths, PathList, optional: true, sets: true
736
+ attribute :top, Top, optional: true, sets: true
737
+ attribute :run, RunKey, sets: true
738
+
739
+ sets :operation, to: "rubycritic"
740
+
741
+ emits RubycriticRequested
742
+ end
743
+
744
+ # What the tree reported about itself, held against every request: nothing here runs
745
+ # outside a hecks checkout (hecks.gemspec beside lib/).
746
+ command "Accept" do
747
+ role "System"
748
+ goal "Let a request through only when the working tree is a hecks checkout"
749
+
750
+ reference_to InspectionRun
751
+ attribute :checkout, Switch, sets: true
752
+
753
+ given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
754
+
755
+
756
+ emits InspectionAccepted
757
+ end
758
+
759
+ command "Complete" do
760
+ role "System"
761
+ goal "Record that the inspection was carried out, and what it reported"
762
+
763
+ reference_to InspectionRun
764
+ attribute :report, Report, sets: true
765
+
766
+
767
+ emits InspectionCompleted
768
+ end
769
+
770
+ command "Fault" do
771
+ role "System"
772
+ goal "Record that the inspection was refused or could not be carried out, and why"
773
+
774
+ reference_to InspectionRun
775
+ attribute :refusal, Report, sets: true
776
+
777
+
778
+ emits InspectionFaulted
779
+ end
780
+
781
+ query "InspectionOutcome" do
782
+ description "How one inspection ended: its status, and what it reported or why it failed."
783
+ attribute :run, RunKey
784
+ where(run: :run)
785
+ order_by :run
786
+ end
787
+
788
+ query "InspectionsFaulted" do
789
+ description "Every inspection that was refused or could not be carried out."
790
+ where(status: "faulted")
791
+ order_by :run
792
+ end
793
+ end
794
+
795
+ policy "ExamineWhenFlogRequested" do
796
+ on "InspectionRun.FlogRequested"
797
+ ask :examine, with: { run: :run }
798
+ end
799
+
800
+ policy "ExamineWhenFlayRequested" do
801
+ on "InspectionRun.FlayRequested"
802
+ ask :examine, with: { run: :run }
803
+ end
804
+
805
+ policy "ExamineWhenReekRequested" do
806
+ on "InspectionRun.ReekRequested"
807
+ ask :examine, with: { run: :run }
808
+ end
809
+
810
+ policy "ExamineWhenRubycriticRequested" do
811
+ on "InspectionRun.RubycriticRequested"
812
+ ask :examine, with: { run: :run }
813
+ end
814
+
815
+ policy "AcceptInspectionWhenExamined" do
816
+ on "InspectionRun.InspectionExamined"
817
+ trigger InspectionRun::Accept, with: { checkout: :checkout }
818
+ end
819
+
820
+ policy "FaultInspectionWhenNotAccepted" do
821
+ on "InspectionRun.InspectionExamined"
822
+ where { !checkout.value }
823
+ trigger InspectionRun::Fault, with: { refusal: "needs a hecks checkout: hecks.gemspec stands beside lib/" }
824
+ end
825
+
826
+ policy "PerformInspectionWhenAccepted" do
827
+ on "InspectionRun.InspectionAccepted"
828
+ ask :perform, with: { run: :run }
829
+ end
830
+
831
+ policy "RecordInspectionOutcome" do
832
+ on "InspectionRun.InspectionAnswered"
833
+ trigger InspectionRun::Complete, with: { report: :report }
834
+ end
835
+
836
+ policy "RecordInspectionFault" do
837
+ on "InspectionRun.InspectionRefused"
838
+ trigger InspectionRun::Fault, with: { refusal: :refusal }
839
+ end
840
+
841
+ aggregate "Audit" do
842
+ description "One walk of a domain's journal chain from its latest seal, and whether every digest held."
843
+
844
+ attribute :run, AuditKey
845
+ attribute :domain, AuditedDomain
846
+ attribute :checked, Count, optional: true
847
+ attribute :report, Finding, optional: true
848
+ identified_by :run
849
+
850
+ value_object "AuditKey" do
851
+ attribute :value, String, matches: :present
852
+
853
+ invariant("an audit is named") { !value.to_s.empty? }
854
+ end
855
+
856
+ value_object "AuditedDomain" do
857
+ attribute :value, String, matches: :not_empty
858
+ end
859
+
860
+ value_object "Count" do
861
+ attribute :value, Integer
862
+ end
863
+
864
+ value_object "Finding" do
865
+ attribute :value, String
866
+ end
867
+
868
+ lifecycle :status, default: "requested" do
869
+ mark :failure, "unproven"
870
+ transition "Confirm" => "verified", from: "requested"
871
+ transition "Fail" => "unproven", from: "requested"
872
+ mark :terminal, "unproven", "verified"
873
+ end
874
+
875
+ command "Verify" do
876
+ role "Auditor"
877
+ goal "Walk a domain's journal chain from its latest seal and say whether it was altered"
878
+
879
+ attribute :domain, AuditedDomain, sets: true
880
+ attribute :run, AuditKey, sets: true
881
+
882
+
883
+ emits VerificationRequested
884
+ end
885
+
886
+ command "Confirm" do
887
+ role "System"
888
+ goal "Record that every row's digest held, and how many were checked"
889
+
890
+ reference_to Audit
891
+ attribute :checked, Count, sets: true
892
+ attribute :report, Finding, sets: true
893
+
894
+ given("the walk checked a row") { checked.value > 0 }
895
+
896
+
897
+ emits ChainConfirmed
898
+ end
899
+
900
+ # A chain that cannot be shown intact is unproven, whether a digest failed or the walk could not
901
+ # run; the report names the row or the reason.
902
+ command "Fail" do
903
+ role "System"
904
+ goal "Record that the chain could not be shown intact, and why"
905
+
906
+ reference_to Audit
907
+ attribute :report, Finding, sets: true
908
+
909
+
910
+ emits ChainUnproven
911
+ end
912
+
913
+ query "Verdict" do
914
+ description "What one audit found."
915
+ attribute :run, AuditKey
916
+ where(run: :run)
917
+ order_by :run
918
+ end
919
+
920
+ query "Unproven" do
921
+ description "Every audit that could not show the chain intact."
922
+ where(status: "unproven")
923
+ order_by :run
924
+ end
925
+ end
926
+
927
+ # A compaction is applied only once the head it would erase is sealed.
928
+ policy "CaptureWhenCompactionPermitted" do
929
+ on "Era.EraPermitted"
930
+ where do
931
+ operation.value == "compact" || operation.value == "compact_heki"
932
+ end
933
+ ask :capture, with: { run: :run }
934
+ end
935
+
936
+ policy "RecordTheSeal" do
937
+ on "Era.HeadCaptured"
938
+ trigger Seal::Record, with: { run: :run, domain: :domain, through: :through, head: :head, previous: :previous }
939
+ end
940
+
941
+ policy "CompactWhenSealed" do
942
+ on "Era.HeadCaptured"
943
+ ask :apply, with: { run: :run }
944
+ end
945
+
946
+ policy "AbandonWhenNotSealed" do
947
+ on "Era.CaptureRefused"
948
+ trigger Era::Abandon, with: { refusal: :refusal }
949
+ end
950
+
951
+ policy "WalkWhenVerificationRequested" do
952
+ on "Audit.VerificationRequested"
953
+ ask :walk, with: { run: :run }
954
+ end
955
+
956
+ policy "ConfirmWhenChainWalked" do
957
+ on "Audit.ChainWalked"
958
+ trigger Audit::Confirm, with: { checked: :checked, report: :report }
959
+ end
960
+
961
+ policy "FailWhenWalkRefused" do
962
+ on "Audit.WalkRefused"
963
+ trigger Audit::Fail, with: { report: :refusal }
964
+ end
965
+ end
966
+ end