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
@@ -5,7 +5,7 @@ require_relative "../../hecks"
5
5
  require_relative "persistence_notice"
6
6
 
7
7
  module Hecks
8
- module CLI
8
+ module Tools
9
9
  # The command behind `hecks history` and `hecks history`: every journal entry a domain's
10
10
  # append-only adapters hold, as JSON, the full write history rather than the current head.
11
11
  module History
@@ -2,7 +2,7 @@ require_relative "../runtime/registry"
2
2
  require_relative "../ports/agent"
3
3
 
4
4
  module Hecks
5
- module CLI
5
+ module Tools
6
6
  # The interviewer an interview session talks to: the agent port, resolved against a registry
7
7
  # that holds one adapter (ADR 0088). The session never sees the adapter, only validated
8
8
  # questions and proposals, so a spec can stand a scripted adapter in for the real one.
@@ -2,7 +2,7 @@ require_relative "../naming"
2
2
  require_relative "interview_shape"
3
3
 
4
4
  module Hecks
5
- module CLI
5
+ module Tools
6
6
  # The bluebook text of one accepted thing: its aggregate, with its value objects, commands and
7
7
  # lifecycle. `InterviewDraft` extends it, and supplies the naming and citing helpers it calls.
8
8
  module InterviewAggregate
@@ -5,7 +5,7 @@ require_relative "interview_record"
5
5
  require_relative "interview_aggregate"
6
6
 
7
7
  module Hecks
8
- module CLI
8
+ module Tools
9
9
  # Turns an interview's accepted findings into the files of a first domain (ADR 0088).
10
10
  #
11
11
  # Pure: it answers the text of each file and writes none, so the command that runs an interview
@@ -1,7 +1,7 @@
1
1
  require_relative "../text"
2
2
 
3
3
  module Hecks
4
- module CLI
4
+ module Tools
5
5
  # The Markdown record of an interview, and the plain interview read out of a booted record.
6
6
  # `InterviewDraft` extends it.
7
7
  module InterviewRecord
@@ -5,7 +5,7 @@ require_relative "interview_agent"
5
5
  require_relative "interview_session"
6
6
 
7
7
  module Hecks
8
- module CLI
8
+ module Tools
9
9
  # The command behind `hecks interview <Name>` (ADR 0088): boots the SME bluebook on demand,
10
10
  # holds the interview at the terminal, then writes the first domain, or the next interview's
11
11
  # proposed additions, and says what to type next. Nothing is written unless the interview
@@ -26,7 +26,7 @@ module Hecks
26
26
  # @param runtime [Runtime, nil] a booted SME bluebook to use instead of booting one
27
27
  # @return [String] the report that was printed, or "" when nothing was written
28
28
  # @raise [ArgumentError] when the name or adapter is refused, or a file would be replaced
29
- def call(name:, adapter: nil, dir: nil, expert: nil, use_ai: true, input: $stdin, output: $stdout, agent: nil, # rubocop:disable Metrics/ParameterLists -- one keyword per setting the command takes
29
+ def call(name:, adapter: nil, dir: nil, expert: nil, use_ai: true, input: $stdin, output: $stdout, agent: nil,
30
30
  runtime: nil)
31
31
  DomainStub.support_files(name: name, adapter: adapter)
32
32
  target = File.expand_path(dir || DomainStub.directory(name), Dir.pwd)
@@ -1,5 +1,5 @@
1
1
  module Hecks
2
- module CLI
2
+ module Tools
3
3
  class InterviewSession
4
4
  # What the session tells the agent: the interview so far, what was accepted, and the gaps.
5
5
  module AgentState
@@ -1,5 +1,5 @@
1
1
  module Hecks
2
- module CLI
2
+ module Tools
3
3
  class InterviewSession
4
4
  NOTICE = "Your answers are sent to a model through your own `claude` login. " \
5
5
  "Run with --no-ai to leave it out.".freeze
@@ -1,5 +1,5 @@
1
1
  module Hecks
2
- module CLI
2
+ module Tools
3
3
  class InterviewSession
4
4
  # The plain prompt: findings typed by the developer, accepted as they are entered.
5
5
  module ManualFindings
@@ -1,5 +1,5 @@
1
1
  module Hecks
2
- module CLI
2
+ module Tools
3
3
  class InterviewSession
4
4
  # Putting an agent's proposed finding to the developer: reading its fields, proposing it to
5
5
  # the SME bluebook, describing it, and recording the decision.
@@ -6,7 +6,7 @@ require_relative "interview_session/manual_findings"
6
6
  require_relative "interview_session/agent_state"
7
7
 
8
8
  module Hecks
9
- module CLI
9
+ module Tools
10
10
  # One interview, held at a terminal (ADR 0088).
11
11
  #
12
12
  # hecks drives: it asks the agent for a question, shows it, reads the answer the developer typed
@@ -28,7 +28,7 @@ module Hecks
28
28
  # @param reference [String] the interview's reference, such as `INT-1`
29
29
  # @param subject [String] the domain being discovered, as its bluebook will spell it
30
30
  # @param expert [String] who is being interviewed
31
- def initialize(runtime:, agent:, input:, output:, reference:, subject:, expert:) # rubocop:disable Metrics/ParameterLists -- one keyword per collaborator and setting
31
+ def initialize(runtime:, agent:, input:, output:, reference:, subject:, expert:)
32
32
  @runtime = runtime
33
33
  @agent = agent
34
34
  @input = input
@@ -1,7 +1,7 @@
1
1
  require_relative "../../text"
2
2
 
3
3
  module Hecks
4
- module CLI
4
+ module Tools
5
5
  module InterviewShape
6
6
  # The lifecycle an interview's accepted transitions describe, and the state words it is
7
7
  # written in. `InterviewShape` extends it, so each method answers on `InterviewShape`.
@@ -3,7 +3,7 @@ require_relative "../text"
3
3
  require_relative "interview_shape/lifecycle"
4
4
 
5
5
  module Hecks
6
- module CLI
6
+ module Tools
7
7
  # What an interview's fields, command inputs and state changes become in a drafted aggregate
8
8
  # (ADR 0088): its attributes and their value objects, the fields a command is told, a note of
9
9
  # who does it, and the lifecycle.
@@ -4,7 +4,7 @@ require_relative "../../hecks"
4
4
  require_relative "../ports/persistence/plugins/era"
5
5
 
6
6
  module Hecks
7
- module CLI
7
+ module Tools
8
8
  # The command behind `hecks ir`: a booted domain's IR as JSON, the
9
9
  # same `to_h` the golden specs pin and `StorageShape` hashes into an era.
10
10
  module Ir
@@ -77,7 +77,7 @@ module Hecks
77
77
  end
78
78
 
79
79
  warn "lanes: out of date: #{out_of_date.map { |path| relative(path) }.join(", ")} " \
80
- "(run hecks regeneration_run.project_lanes)"
80
+ "(run hecks regeneration_run.project_lanes!)"
81
81
  1
82
82
  end
83
83
 
@@ -5,8 +5,8 @@ module Hecks
5
5
  module Lanes
6
6
  # The workflow that watches each lane with an alert threshold: every hour it asks
7
7
  # `PromotionRun` whether the lane has stood behind the lane it follows for longer than its
8
- # `Lane` row allows. A late lane faults the run, and the fault files a finding, one a day: the
9
- # alert key carries the date, and the journal in Postgres lets the next hour see it.
8
+ # `Lane` row allows. A late lane faults the run, and GitHub's failed-run status
9
+ # and email say so.
10
10
  module WatchWorkflow
11
11
  HEADER = <<~YAML.chomp
12
12
  name: Watch lanes
@@ -15,7 +15,7 @@ module Hecks
15
15
  #
16
16
  # Every hour, asks `PromotionRun` whether a lane has stood behind the lane it follows for
17
17
  # longer than its Lane row allows (`alert_after`, in hours). The rule is decided there, not
18
- # here. A late lane fails the run, files a finding (one a day) and asks Promote to try
18
+ # here. A late lane fails the run and asks Promote to try
19
19
  # again: a promotion that was dropped is picked up within the hour, and one that still
20
20
  # cannot go says why in its own run.
21
21
  on:
@@ -31,7 +31,6 @@ module Hecks
31
31
  permissions:
32
32
  contents: read
33
33
  checks: read
34
- issues: write
35
34
  actions: write
36
35
 
37
36
  jobs:
@@ -71,10 +70,9 @@ module Hecks
71
70
 
72
71
  def watch_step(name)
73
72
  [" - name: Watch #{name}", " env:", " GH_TOKEN: ${{ github.token }}",
74
- " HECKS_FINDINGS_REPO: ${{ github.repository }}", " run: >-",
75
- " bundle exec exe/hecks promotion_run.watch lane=#{name}",
76
- " run=watch-#{name}-${{ github.run_id }}-${{ github.run_attempt }}",
77
- " alert_key=#{name}-lag-$(date -u +%Y-%m-%d) --wait"]
73
+ " run: >-",
74
+ " bundle exec exe/hecks promotion_run.watch! lane=#{name}",
75
+ " run=watch-#{name}-${{ github.run_id }}-${{ github.run_attempt }} --wait"]
78
76
  end
79
77
  end
80
78
  end
@@ -70,7 +70,7 @@ module Hecks
70
70
  def promote_step(name)
71
71
  [" - name: Promote #{name}", " env:", " GH_TOKEN: ${{ github.token }}",
72
72
  " run: >-",
73
- " bundle exec exe/hecks promotion_run.promote lane=#{name}",
73
+ " bundle exec exe/hecks promotion_run.promote! lane=#{name}",
74
74
  " run=#{name}-${{ github.event.workflow_run.head_sha || github.run_id }} --confirm --wait"]
75
75
  end
76
76
  end
@@ -10,7 +10,7 @@ module Hecks
10
10
  # ruleset for each guarded lane (`.github/rulesets/<lane>.json`), one for the tag such a lane
11
11
  # feeds (`.github/rulesets/tag-<tag>.json`), and the workflow that promotes
12
12
  # each lane that follows another (`.github/workflows/promote.yml`). The workflow only runs
13
- # `hecks promotion_run.promote`; the rule that decides a promotion is `PromotionRun.Accept`.
13
+ # `hecks promotion_run.promote!`; the rule that decides a promotion is `PromotionRun.Accept`.
14
14
  #
15
15
  # Without a flag the files are written. `--check` writes nothing and answers 1 for each file
16
16
  # that differs, which is the drift gate. `--live` compares the rulesets GitHub holds with the
@@ -1,7 +1,7 @@
1
1
  require_relative "../mcp_stdio_guard"
2
2
 
3
3
  module Hecks
4
- module CLI
4
+ module Tools
5
5
  # The command behind `hecks mcp`: the MCP server onto the
6
6
  # storehouse bus, over stdio only.
7
7
  #
@@ -1,7 +1,7 @@
1
1
  require_relative "../../projections/context_relationships"
2
2
 
3
3
  module Hecks
4
- module CLI
4
+ module Tools
5
5
  module ModelCheck
6
6
  # Examining booted domains: each one's findings against the allowlist, then the language's
7
7
  # own bluebooks, printed as the check goes. `ModelCheck` extends it.
@@ -1,5 +1,5 @@
1
1
  module Hecks
2
- module CLI
2
+ module Tools
3
3
  module ModelCheck
4
4
  # Boots a domain's source into a registry of its own, so the checks read IR and nothing runs.
5
5
  # `ModelCheck` extends it.
@@ -4,7 +4,7 @@ require_relative "model_check/sources"
4
4
  require_relative "model_check/examination"
5
5
 
6
6
  module Hecks
7
- module CLI
7
+ module Tools
8
8
  # The command behind `hecks model_check`: static analysis
9
9
  # over the IR, printed per domain, exiting non-zero when any error-severity
10
10
  # finding is left — unreachable lifecycle states, dead transitions, unreached
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hecks
4
+ module Tools
5
+ module MoveDisables
6
+ # Why each cop is departed from, written once in the config. A cop moved without an entry here
7
+ # refuses the move, so a reason is never left out.
8
+ REASONS = {
9
+ "Metrics/AbcSize" => "spec boot helpers wire a whole runtime; splitting them hides the wiring",
10
+ "Metrics/MethodLength" => "spec boot helpers wire a whole runtime; splitting them hides the wiring",
11
+ "Metrics/CyclomaticComplexity" => "spec boot helpers wire a whole runtime; splitting them hides the wiring",
12
+ "Metrics/PerceivedComplexity" => "spec boot helpers wire a whole runtime; splitting them hides the wiring",
13
+ "Metrics/ParameterLists" => "keyword and positional signatures callers spell out; a parameter object hides them",
14
+ "Naming/PredicateMethod" => "returns the operation's outcome, a row, value or verdict; the name is the verb",
15
+ "Naming/PredicatePrefix" => "the DSL verb is the name a bluebook author writes",
16
+ "Style/MutableConstant" => "registries and caches are mutable by design (see the ThreadSafety override)",
17
+ "Style/GlobalStdStream" => "a forked child reopens the standard streams to capture its output",
18
+ "Style/FormatStringToken" => "the text is curl's own token or table row text, not a Ruby format string",
19
+ "Style/EvalWithLocation" => "deliberately without file and line: exercises the untraceable-source refusal",
20
+ "Style/ComparableBetween" => "the bluebook expression language refuses between?; the spelling is under test",
21
+ "Lint/UnusedBlockArgument" => "the block parameter's name is read by reflection",
22
+ "Lint/RescueException" => "rolls back, then re-raises",
23
+ "Lint/InheritException" => "deliberately escapes `rescue => e`, which catches StandardError only",
24
+ "Lint/IneffectiveAccessModifier" => "`private` does not reach `def self.`; the entry point is public on purpose",
25
+ "Lint/StructNewOverride" => "the member shadows a Struct or Enumerable method on purpose; the file says which",
26
+ "RSpec/Output" => "the spec exercises console output",
27
+ "RSpec/RemoveConst" => "the probe constant must not outlive the example",
28
+ "RSpec/ExampleLength" => "a scenario example carries its whole bluebook fixture",
29
+ "Security/MarshalLoad" => "reads our own cache or the gem's own file, never external input",
30
+ "Layout/LineLength" => "characterization tables with one long row per line",
31
+ "Layout/HashAlignment" => "the multi-line procs overrun LineLength under table alignment"
32
+ }.freeze
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,211 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hecks"
4
+ require_relative "../tools"
5
+ require_relative "move_disables/reasons"
6
+
7
+ module Hecks
8
+ module Tools
9
+ # Moves justified inline RuboCop disables into `.rubocop.yml`, one entry per cop, each carrying
10
+ # its reason once. A file in `SKIP` keeps its inline disables until someone decides or refactors
11
+ # it; the move does not touch them.
12
+ #
13
+ # hecks ScriptRun.plan_script! script=move_disables # what would move, writing nothing
14
+ # hecks ScriptRun.apply_script! script=move_disables confirm=true
15
+ module MoveDisables
16
+ CONFIG = ".rubocop.yml"
17
+
18
+ CONFIG_HEADING = "# Overrides moved from inline `rubocop:disable` comments; each cop states its reason once."
19
+
20
+ # Files whose disables need a decision or a refactor first.
21
+ SKIP = %w[
22
+ lib/hecks/runtime/registry.rb
23
+ lib/hecks/runtime/registry/context_maps.rb
24
+ lib/hecks/adapters/driving/ruby/aggregate_module.rb
25
+ lib/hecks/bluebook/dsl/generic_dispatch.rb
26
+ lib/hecks/query_ir/touchpoints.rb
27
+ spec/adapters/driven/postgres_era/era_resolver_role_spec.rb
28
+ ].freeze
29
+
30
+ DIRECTIVE = /^\s*#\s*rubocop:(disable-next|disable)\s+(.+)$/
31
+ TRAILING = /\s+#\s*rubocop:disable(?:-next)?\s+(.+)$/
32
+ TRAILING_COMMENT = /\s+#\s*rubocop:disable.*$/
33
+ ENABLE = /^\s*#\s*rubocop:enable\s+(.+)$/
34
+
35
+ # A cop that would move has no reason written in `REASONS`.
36
+ class MissingReason < StandardError; end
37
+
38
+ module_function
39
+
40
+ # Runs from a checkout's root, as a script: `hecks ... move_disables [--apply]`.
41
+ #
42
+ # @param argv [Array<String>] `--apply` writes the files; without it, the plan only
43
+ # @param root [String] the checkout to work on
44
+ # @return [Integer] 0
45
+ def main(argv, root: ROOT)
46
+ puts transform(root: root, apply: argv.include?("--apply"))
47
+ 0
48
+ end
49
+
50
+ # Plans the move, and writes it when `apply` is true.
51
+ #
52
+ # @param root [String] the checkout to work on
53
+ # @param apply [Boolean] whether to write the files and the config
54
+ # @return [String] the plan: each cop with the files it moves from, and what was written
55
+ # @raise [MissingReason] when a cop that would move has no reason in `REASONS`
56
+ def transform(root:, apply:)
57
+ edits, moves = scan(root)
58
+ refuse_missing_reasons(moves)
59
+
60
+ config, merged, blocks = config_with(root, moves)
61
+ report = plan_report(edits, moves, merged)
62
+ return "#{report}\ndry run; apply with confirm=true" unless apply
63
+
64
+ write(root, edits, written_config(config, blocks))
65
+ "#{report}\napplied"
66
+ end
67
+
68
+ # @param moves [Hash{String => Array<String>}] the files each cop moves from
69
+ # @raise [MissingReason] when a cop that would move has no reason in `REASONS`
70
+ def refuse_missing_reasons(moves)
71
+ missing = moves.keys - REASONS.keys
72
+ raise MissingReason, "no reason written for: #{missing.join(", ")}" unless missing.empty?
73
+ end
74
+
75
+ # @param root [String] the checkout
76
+ # @param edits [Hash{String => String}] the new text of each file that changes
77
+ # @param config [String] the config's new text
78
+ # @return [void]
79
+ def write(root, edits, config)
80
+ edits.each { |path, text| File.write(File.join(root, path), text) }
81
+ File.write(File.join(root, CONFIG), config)
82
+ end
83
+
84
+ # @param edits [Hash{String => String}] the new text of each file that changes
85
+ # @param moves [Hash{String => Array<String>}] the files each cop moves from
86
+ # @param merged [Array<String>] the cops merged into blocks already in the config
87
+ # @return [String] one line per cop, with its file count
88
+ def plan_report(edits, moves, merged)
89
+ lines = ["files to edit: #{edits.size}"]
90
+ moves.keys.sort.each do |cop|
91
+ lines << format(" %<cop>-32s %<count>2d file(s)", cop: cop, count: moves[cop].uniq.size)
92
+ end
93
+ lines << "merged into existing blocks: #{merged.join(", ")}" unless merged.empty?
94
+ lines.join("\n")
95
+ end
96
+
97
+ # Each Ruby file under lib and spec with a directive to move, with the text it becomes.
98
+ #
99
+ # @param root [String] the checkout
100
+ # @return [Array(Hash{String => String}, Hash{String => Array<String>})] the new text of each
101
+ # file, and the files each cop moves from
102
+ def scan(root)
103
+ moves = Hash.new { |hash, cop| hash[cop] = [] }
104
+ edits = {}
105
+ scanned_paths(root).each do |path|
106
+ touched, text = strip(File.readlines(File.join(root, path), chomp: true))
107
+ next if touched.empty?
108
+
109
+ touched.uniq.each { |cop| moves[cop] << path }
110
+ edits[path] = text
111
+ end
112
+ [edits, moves]
113
+ end
114
+
115
+ # @param root [String] the checkout
116
+ # @return [Array<String>] the Ruby files under lib and spec, in order, outside `SKIP`
117
+ def scanned_paths(root)
118
+ Dir.glob(%w[lib/**/*.rb spec/**/*.rb], base: root).sort.reject { |path| SKIP.include?(path) }
119
+ end
120
+
121
+ # Removes the directives from one file's lines.
122
+ #
123
+ # @param lines [Array<String>] the file's lines, without their newlines
124
+ # @return [Array(Array<String>, String)] the cops the directives named, and the file's new text
125
+ def strip(lines)
126
+ touched = []
127
+ out = lines.filter_map { |line| keep_line(line, touched) }
128
+ out = out.reject { |line| closes_removed?(line, touched) }
129
+ [touched, "#{out.join("\n")}\n"]
130
+ end
131
+
132
+ # @param line [String] one line of the file
133
+ # @param touched [Array<String>] the cops removed so far; this line's cops are added to it
134
+ # @return [String, nil] the line without its directive, or nil when the line is a directive
135
+ def keep_line(line, touched)
136
+ if (match = DIRECTIVE.match(line))
137
+ touched.concat(cops_from(match[2]))
138
+ return nil
139
+ end
140
+ return line unless (match = TRAILING.match(line))
141
+
142
+ touched.concat(cops_from(match[1]))
143
+ line.sub(TRAILING_COMMENT, "")
144
+ end
145
+
146
+ # A block-form enable is closed by a disable that was removed; it goes once its cops are gone.
147
+ #
148
+ # @param line [String] one line of the file
149
+ # @param touched [Array<String>] the cops the file's removed directives named
150
+ # @return [Boolean] whether the line is an enable whose cops were all removed
151
+ def closes_removed?(line, touched)
152
+ match = ENABLE.match(line)
153
+ match && (cops_from(match[1]) - touched).empty?
154
+ end
155
+
156
+ # @param text [String] the cops of one directive, possibly followed by a ` -- reason`
157
+ # @return [Array<String>] the cop names
158
+ def cops_from(text)
159
+ reason_free = text.split(" -- ").first
160
+ reason_free.split(",").map(&:strip).reject(&:empty?)
161
+ end
162
+
163
+ # Adds each moved cop to the config: a new block, or an `Exclude` under an existing one.
164
+ #
165
+ # @param root [String] the checkout
166
+ # @param moves [Hash{String => Array<String>}] the files each cop moves from
167
+ # @return [Array(String, Array<String>, Array<String>)] the config text with the existing
168
+ # blocks filled, the cops merged into existing blocks, and the new blocks to append
169
+ def config_with(root, moves)
170
+ config = File.read(File.join(root, CONFIG))
171
+ merged, added = moves.keys.sort.partition { |cop| config.match?(header_line(cop)) }
172
+ [fill_blocks(config, merged, moves), merged, added.map { |cop| new_block(cop, excluded_paths(moves[cop])) }]
173
+ end
174
+
175
+ # @param config [String] the config's text
176
+ # @param merged [Array<String>] the cops whose blocks already exist in the config
177
+ # @param moves [Hash{String => Array<String>}] the files each cop moves from
178
+ # @return [String] the config with each existing block given its `Exclude`
179
+ def fill_blocks(config, merged, moves)
180
+ merged.inject(config) { |text, cop| text.sub(header_line(cop)) { merged_block(cop, excluded_paths(moves[cop])) } }
181
+ end
182
+
183
+ # @param cop [String] a cop name
184
+ # @return [Regexp] the config line that opens the cop's block
185
+ def header_line(cop) = /^#{Regexp.escape("#{cop}:")}$/
186
+
187
+ # @param files [Array<String>] the files a cop moves from
188
+ # @return [Array<String>] the `Exclude` entries, sorted and unique
189
+ def excluded_paths(files) = files.uniq.sort.map { |path| %( - "#{path}") }
190
+
191
+ # @param cop [String] a cop name
192
+ # @param paths [Array<String>] the `Exclude` entries
193
+ # @return [String] the cop's header, its reason, and its `Exclude`, to replace an existing header
194
+ def merged_block(cop, paths) = ["#{cop}:", " # #{REASONS.fetch(cop)}", " Exclude:", *paths].join("\n")
195
+
196
+ # @param cop [String] a cop name
197
+ # @param paths [Array<String>] the `Exclude` entries
198
+ # @return [String] a new block for the cop, with its reason above it
199
+ def new_block(cop, paths) = ["# #{REASONS.fetch(cop)}", "#{cop}:", " Exclude:", *paths].join("\n")
200
+
201
+ # @param config [String] the config as it stands, with existing blocks filled
202
+ # @param blocks [Array<String>] the new blocks to append
203
+ # @return [String] the config with the new blocks appended under a heading
204
+ def written_config(config, blocks)
205
+ return config if blocks.empty?
206
+
207
+ "#{config.rstrip}\n\n#{CONFIG_HEADING}\n#{blocks.join("\n\n")}\n"
208
+ end
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../tools"
4
+ require_relative "../naming"
5
+
6
+ module Hecks
7
+ module Tools
8
+ # Moves an aggregate's `formerly_known_as "Old"` out of the bluebook and into the world that
9
+ # names the domain, as `stored_as Name: "old"`: the physical name an aggregate's rows are
10
+ # stored under is a storage fact, so the world says it. The bluebook line is removed, the world
11
+ # line is added (the world file is created beside the bluebook when the domain has none), and
12
+ # nothing else changes: a translation edge already carries the rename for the data.
13
+ #
14
+ # hecks move_former_name [--dry-run]
15
+ module MoveFormerName
16
+ # One aggregate-level `formerly_known_as` found in a bluebook.
17
+ Candidate = Struct.new(:file, :domain, :aggregate, :former, keyword_init: true)
18
+
19
+ SKIPPED = %r{(^|/)(\.claude|\.git|node_modules|rust|spec|tmp|vendor)/}
20
+ DOMAIN_LINE = /^\s*Hecks\.bluebook\s+"([^"]+)"/
21
+ AGGREGATE_LINE = /^\s*aggregate\s+"([^"]+)"/
22
+ FORMERLY_LINE = /^\s*formerly_known_as\s+"([^"]+)"\s*$/
23
+ WORLD_LINE_START = /^(\s*Hecks\.world\s+"%<domain>s"\s+do\n)/
24
+ BLUEBOOK_EXT = /\.bluebook\z/
25
+
26
+ module_function
27
+
28
+ # @param argv [Array<String>] `--dry-run` to print what would change and write nothing
29
+ # @param root [String] the checkout whose bluebooks are read
30
+ # @return [Integer] 0
31
+ def main(argv, root: Tools::ROOT)
32
+ dry_run = argv.include?("--dry-run")
33
+ found = candidates(root)
34
+ puts "no aggregate-level formerly_known_as found" if found.empty?
35
+ found.group_by(&:file).each { |file, group| move(file, group, root, dry_run) }
36
+ 0
37
+ end
38
+
39
+ # @param root [String] the checkout
40
+ # @return [Array<Candidate>] every aggregate-level `formerly_known_as` under the root
41
+ def candidates(root) = files_under(root, "bluebook").flat_map { |file| in_file(file) }
42
+
43
+ # @param root [String] the checkout
44
+ # @param extension [String] `bluebook` or `world`
45
+ # @return [Array<String>] the files with that extension, outside the folders left alone
46
+ def files_under(root, extension)
47
+ Dir.glob(File.join(root, "**/*.#{extension}")).reject { |file| file.delete_prefix("#{root}/").match?(SKIPPED) }
48
+ end
49
+
50
+ # @param file [String] a bluebook
51
+ # @return [Array<Candidate>] its aggregates that carry the word
52
+ def in_file(file)
53
+ text = File.read(file)
54
+ domain = text[DOMAIN_LINE, 1]
55
+ return [] unless domain
56
+
57
+ owner = nil
58
+ text.each_line.filter_map do |line|
59
+ owner = Regexp.last_match(1) if line =~ AGGREGATE_LINE
60
+ next unless owner && line =~ FORMERLY_LINE
61
+
62
+ Candidate.new(file: file, domain: domain, aggregate: owner, former: Regexp.last_match(1))
63
+ end
64
+ end
65
+
66
+ # Rewrites one bluebook and writes or prints the world lines that replace its words.
67
+ def move(file, group, root, dry_run)
68
+ world = world_file_for(file, group.first.domain, root)
69
+ lines = group.map { |c| "#{c.aggregate}: #{Naming.snake(c.former).inspect}" }
70
+ puts "#{rel(file, root)}: remove #{group.size} formerly_known_as line(s)"
71
+ puts "#{rel(world, root)}: add `stored_as #{lines.join(", ")}`"
72
+ write(file, world, group, lines) unless dry_run
73
+ end
74
+
75
+ def write(file, world, group, lines)
76
+ File.write(file, strip(File.read(file), group))
77
+ File.write(world, with_stored_as(world, group.first.domain, lines))
78
+ end
79
+
80
+ def strip(text, group)
81
+ group.reduce(text) { |t, c| t.sub(/^[ \t]*formerly_known_as\s+"#{Regexp.escape(c.former)}"[ \t]*\n/, "") }
82
+ end
83
+
84
+ # The world file that already names the domain, else `<bluebook>.world` beside the bluebook.
85
+ def world_file_for(file, domain, root)
86
+ named = files_under(root, "world").sort.find { |world| names_domain?(world, domain) }
87
+ named || file.sub(BLUEBOOK_EXT, ".world")
88
+ end
89
+
90
+ def names_domain?(world, domain)
91
+ !world.include?(".local.") && File.read(world).match?(/^\s*Hecks\.world\s+"#{Regexp.escape(domain)}"/)
92
+ end
93
+
94
+ def with_stored_as(world, domain, lines)
95
+ statement = " stored_as #{lines.join(", ")}\n"
96
+ return "Hecks.world #{domain.inspect} do\n#{statement}end\n" unless File.exist?(world)
97
+
98
+ start = Regexp.new(format(WORLD_LINE_START.source, domain: Regexp.escape(domain)))
99
+ File.read(world).sub(start) { "#{Regexp.last_match(1)}#{statement}" }
100
+ end
101
+
102
+ def rel(path, root) = path.delete_prefix("#{root}/")
103
+ end
104
+ end
105
+ end
@@ -3,7 +3,7 @@
3
3
  require "json"
4
4
 
5
5
  module Hecks
6
- module CLI
6
+ module Tools
7
7
  # The command behind `hecks record_pattern_cases`: records the expected match results for
8
8
  # `pattern:` cases, which `spec/pattern_subset_spec.rb` reads from
9
9
  # `spec/corpus/fixtures/patterns.json`.
@@ -1,7 +1,7 @@
1
1
  require_relative "../../hecks"
2
2
 
3
3
  module Hecks
4
- module CLI
4
+ module Tools
5
5
  # The notice `hecks stores` and `hecks history` print when nothing is persisted. Hecks is in
6
6
  # Memory unless a local hecksagon opts it in (ADR 0136), so a fresh process holds no records and
7
7
  # no journal, and the plain JSON they print would read as an empty store rather than as a store
@@ -4,7 +4,7 @@ require_relative "../forms"
4
4
  require_relative "../forms/banking_presentation"
5
5
 
6
6
  module Hecks
7
- module CLI
7
+ module Tools
8
8
  # The command behind `hecks present` and `hecks present`: serves the banking example's rendered
9
9
  # forms and views, backed by the in-memory adapter
10
10
  # (docs/command-form-and-query-form-bluebook.md).