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
@@ -23,13 +23,11 @@ module Hecks
23
23
  RUST_COVERAGE_PENDING = {}.freeze
24
24
 
25
25
  # The stamp hecks project_rust writes into metadata.rs, e.g.
26
- # `examples/pizzas` or `the self-hosted language (...)`, with any
27
- # ` (attaches "X")`/` (attaches "x", from: :vendor)` suffix stripped.
28
- SOURCE_STAMP = /
29
- GENERATED\ by\ hecks\ project_rust\ —\ (.+?)
30
- (?:\ \(attaches\ "\w+"(?:,\ from:\ :vendor)?\))?
31
- 's\ own\ canonical\ IR,
32
- /x
26
+ # `examples/pizzas` or `the self-hosted language (...)`; a bluebook's is its own name.
27
+ SOURCE_STAMP = /GENERATED\ by\ hecks\ project_rust\ —\ (.+?)'s\ own\ canonical\ IR,/
28
+
29
+ # Raised when a name is not a domain the corpus regenerates; the message lists the valid ones.
30
+ class UnknownDomain < ArgumentError; end
33
31
 
34
32
  # The Rust-facing lists: which domains and bluebooks `rust/` carries, read off Cargo's
35
33
  # `[features]` and the generated modules rather than typed out by hand. Extended onto
@@ -48,7 +46,7 @@ module Hecks
48
46
  BLUEBOOK_NAME = /^\s*Hecks\.bluebook\s+"([^"]+)"/
49
47
 
50
48
  # The corpus kinds holding bluebooks the gem carries and a hecksagon attaches by name.
51
- GEM_BLUEBOOK_KINDS = %i[qa deploy site tickets composer tenancy sme bulk].freeze
49
+ GEM_BLUEBOOK_KINDS = %i[qa deploy site tickets composer tenancy sme bulk ci_pipeline].freeze
52
50
 
53
51
  # Every place a Rust-facing domain's own `attaches` attachment could be declared.
54
52
  #
@@ -75,7 +73,7 @@ module Hecks
75
73
  cargo_features_table(root: root).scan(EMPTY_FEATURE).flatten
76
74
  end
77
75
 
78
- # The feature `hecks project_rust` last wrote as Cargo's `default`.
76
+ # The feature Cargo's `default` names: the one a corpus run keeps it on.
79
77
  #
80
78
  # @param root [String] repository root to search under
81
79
  # @return [String, nil] the default feature's name, or nil when Cargo.toml
@@ -215,8 +213,8 @@ module Hecks
215
213
  members(*GEM_BLUEBOOK_KINDS, root: root).filter_map { |member| File.read(member.path)[BLUEBOOK_NAME, 1] }.uniq
216
214
  end
217
215
 
218
- # The regeneration order the drift check runs, sorted by path — so which
219
- # domain wins Cargo's `default` is derived, not hand-picked.
216
+ # The regeneration order the drift check runs, sorted by path, and the domains a corpus
217
+ # run declares to `hecks project_rust`.
220
218
  #
221
219
  # @param root [String] repository root to search under
222
220
  # @return [Array<RustDomain>] every Rust domain with a Cargo feature, in regeneration order:
@@ -224,6 +222,24 @@ module Hecks
224
222
  def rust_regen_order(root: ROOT)
225
223
  rust_domains(root: root)
226
224
  end
225
+
226
+ # The named domains of the regeneration order, in that order whatever order they are named in.
227
+ #
228
+ # @param names [Array<String>, nil] feature names; nil names every domain
229
+ # @param root [String] repository root to search under
230
+ # @return [Array<RustDomain>] the named domains, in regeneration order
231
+ # @raise [UnknownDomain] when a name is not a domain's feature, listing the valid ones
232
+ def rust_domains_named(names, root: ROOT)
233
+ order = rust_regen_order(root: root)
234
+ return order if names.nil?
235
+
236
+ unknown = names - order.map(&:feature)
237
+ unless unknown.empty?
238
+ raise UnknownDomain, "unknown domain(s) #{unknown.join(", ")}; valid: #{order.map(&:feature).sort.join(", ")}"
239
+ end
240
+
241
+ order.select { |domain| names.include?(domain.feature) }
242
+ end
227
243
  end
228
244
  end
229
245
  end
@@ -1,3 +1,4 @@
1
+ require_relative "../module_folders"
1
2
  module Hecks
2
3
  module Corpus
3
4
  # How a domain's hecksagon names a bluebook the gem carries and loads by name, as the QA
@@ -15,7 +16,7 @@ module Hecks
15
16
  # @return [Array<String>, nil] `.bluebook` file paths found, or nil when none
16
17
  def bluebook_files(domain_path)
17
18
  [File.join(domain_path, "bluebook"), domain_path].each do |dir|
18
- files = Dir[File.join(dir, "*.bluebook")]
19
+ files = ModuleFolders.all(dir)
19
20
  return files unless files.empty?
20
21
  end
21
22
  attached_bluebook_files(domain_path)
data/lib/hecks/corpus.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require_relative "fuzzing/target_capabilities"
2
2
  require_relative "corpus/adapters"
3
+ require_relative "corpus/generated_key"
4
+ require_relative "corpus/listing"
3
5
  require_relative "corpus/routes"
4
6
  require_relative "corpus/rust"
5
7
  require_relative "corpus/sources"
@@ -23,6 +25,9 @@ module Hecks
23
25
  # The Hecks domain (ADR 0080): its bluebooks share one namespace and one hecksagon, so
24
26
  # they load together, as a directory, never file by file.
25
27
  hecks: "lib/hecks/hecks",
28
+ # The Coder and Fixer domains keep their bluebook beside their hecksagon in their own folder.
29
+ coder: "lib/hecks/coder",
30
+ fixer: "lib/hecks/fixer",
26
31
  # A package vendored via `attaches ... from: :vendor` — nested inside the
27
32
  # consuming example's own checkout, not this gem's own framework/bluebook/.
28
33
  vendored: "examples/*/vendor/embryonaut_bluebooks/*"
@@ -32,24 +37,31 @@ module Hecks
32
37
  # prefix, so a nested fixture keeps its subdirectory (`eras/base`)
33
38
  # and never collides with a same-named file elsewhere in the kind.
34
39
  FILE_KINDS = {
35
- grammar: "lib/hecks/grammar/*.bluebook",
36
- framework: "lib/hecks/framework/bluebook/*.bluebook",
37
- qa: "lib/hecks/quality_control/*.bluebook",
38
- language: "lib/hecks/language/**/*.bluebook",
39
- deploy: "lib/hecks/deploy/bluebook/*.bluebook",
40
- site: "lib/hecks/site/bluebook/*.bluebook",
41
- rails_app: "lib/hecks/rails_app/bluebook/*.bluebook",
42
- tickets: "lib/hecks/tickets/bluebook/*.bluebook",
43
- composer: "lib/hecks/composer/bluebook/*.bluebook",
44
- tenancy: "lib/hecks/tenancy/bluebook/*.bluebook",
45
- bulk: "lib/hecks/bulk/bluebook/*.bluebook",
46
- sme: "lib/hecks/sme/bluebook/*.bluebook",
47
- fixture: "spec/fixtures/**/*.bluebook"
40
+ grammar: "lib/hecks/grammar/*.bluebook",
41
+ framework: "lib/hecks/framework/bluebook/*.bluebook",
42
+ qa: "lib/hecks/quality_control/*.bluebook",
43
+ language: "lib/hecks/language/**/*.bluebook",
44
+ deploy: "lib/hecks/deploy/bluebook/*.bluebook",
45
+ site: "lib/hecks/site/bluebook/*.bluebook",
46
+ rails_app: "lib/hecks/rails_app/bluebook/*.bluebook",
47
+ tickets: "lib/hecks/tickets/bluebook/*.bluebook",
48
+ composer: "lib/hecks/composer/bluebook/*.bluebook",
49
+ tenancy: "lib/hecks/tenancy/bluebook/*.bluebook",
50
+ bulk: "lib/hecks/bulk/bluebook/*.bluebook",
51
+ sme: "lib/hecks/sme/bluebook/*.bluebook",
52
+ # The CI bluebooks keep their bluebook beside their hecksagon, not under a `bluebook/` folder.
53
+ # CiPipeline is attachable; CiSpeed boots from its own directory; CiWorkflows is the client
54
+ # whose rows project into .github/workflows.
55
+ ci_pipeline: "lib/hecks/ci_pipeline/*.bluebook",
56
+ ci_speed: "lib/hecks/ci_speed/*.bluebook",
57
+ ci_workflows: "lib/hecks/ci_workflows/*.bluebook",
58
+ fixture: "spec/fixtures/**/*.bluebook"
48
59
  }.freeze
49
60
 
50
61
  KINDS = (DIRECTORY_KINDS.keys + FILE_KINDS.keys).freeze
51
62
 
52
63
  extend Adapters
64
+ extend Listing
53
65
  extend Rust
54
66
  extend Sources
55
67
  extend Worlds
@@ -68,33 +80,6 @@ module Hecks
68
80
  kinds.flat_map { |kind| kind_members(kind, root) }
69
81
  end
70
82
 
71
- # @return [Array<Member>] the members of one kind: a directory each, or a file each
72
- # @raise [ArgumentError] if `kind` is not in `KINDS`
73
- def kind_members(kind, root)
74
- if (glob = DIRECTORY_KINDS[kind])
75
- directory_members(kind, root, glob)
76
- elsif (glob = FILE_KINDS[kind])
77
- file_members(kind, root, glob)
78
- else
79
- raise ArgumentError, "unknown corpus kind #{kind.inspect} — known: #{KINDS.join(", ")}"
80
- end
81
- end
82
-
83
- def directory_members(kind, root, glob)
84
- directories(root, glob).map { |dir| Member.new(File.basename(dir), kind, dir) }
85
- end
86
-
87
- def directories(root, glob) = Dir.glob(File.join(root, glob)).select { |path| File.directory?(path) }.sort
88
-
89
- # The part of a glob before its first wildcard.
90
- GLOB_FIXED_PREFIX = /\A[^*]*/
91
-
92
- def file_members(kind, root, glob)
93
- prefix = File.join(root, glob[GLOB_FIXED_PREFIX].chomp("/"))
94
- Dir.glob(File.join(root, glob))
95
- .map { |file| Member.new(file.delete_prefix("#{prefix}/").delete_suffix(".bluebook"), kind, file) }
96
- end
97
-
98
83
  # What a boot loads for a member — a directory kind's bluebook
99
84
  # directory, or a file kind's own file.
100
85
  #
@@ -144,13 +129,14 @@ module Hecks
144
129
  end
145
130
 
146
131
  # Every bootable domain in the project — any directory holding a
147
- # `.bluebook` no route sends elsewhere (a `bluebook/` folder stands for its parent).
132
+ # `.bluebook` no route sends elsewhere (a `bluebook/` folder stands for its parent),
133
+ # less module folders, which their parent's bluebook stands for.
148
134
  #
149
135
  # @param root [String] repository root to search under
150
136
  # @return [Array<String>] absolute paths of every sweepable domain directory
151
137
  def sweepable_domains(root = ROOT)
152
138
  Dir.chdir(root) do
153
- swept = Dir.glob("**/*.bluebook").reject { |path| route_for(path) }
139
+ swept = Dir.glob("**/*.bluebook").reject { |path| route_for(path) || module_bluebook?(path) }
154
140
  dirs = swept.map { |path| owning_dir(File.dirname(path)) }
155
141
  dirs.uniq.sort.map { |dir| File.join(root, dir) }
156
142
  end
@@ -159,6 +145,15 @@ module Hecks
159
145
  # The domain directory a bluebook directory stands for: a `bluebook/` folder is its parent.
160
146
  def owning_dir(dir) = File.basename(dir) == "bluebook" ? File.dirname(dir) : dir
161
147
 
148
+ # A bluebook line that opens a `domain_module`.
149
+ MODULE_OPENING = /^\s*domain_module\b/
150
+
151
+ # Whether a bluebook is a module folder's (ADR 0163): it opens a `domain_module` of the parent's
152
+ # bluebook, so its folder is no domain on its own and cannot boot alone.
153
+ def module_bluebook?(path)
154
+ File.basename(path, ".bluebook") == File.basename(File.dirname(path)) && File.read(path).match?(MODULE_OPENING)
155
+ end
156
+
162
157
  # Sweepable domains a fuzz cannot boot from its copy, by repo-relative directory, each with
163
158
  # the reason. A fuzz boots a tmpdir copy of a domain to isolate its state.
164
159
  FUZZ_UNBOOTABLE = {
@@ -0,0 +1,23 @@
1
+ module Hecks
2
+ # Says a deprecation once per process, so a boot that checks twice is not noisy. A bluebook's
3
+ # `formerly_known_as` is the first: the notice names the world line that replaces it.
4
+ module Deprecation
5
+ module_function
6
+
7
+ # @param key [Array<String>] what the notice is about, such as the domain and aggregate
8
+ # @param text [String] the warning
9
+ # @param err [#puts] where it goes
10
+ # @return [String, nil] the text when it was said now, nil when it had been said already
11
+ def once(key, text, err: $stderr)
12
+ @seen ||= {}
13
+ return if @seen[key]
14
+
15
+ @seen[key] = true
16
+ err.puts(text)
17
+ text
18
+ end
19
+
20
+ # Forgets what was said, so a spec can hear a notice again.
21
+ def forget! = @seen = {}
22
+ end
23
+ end
@@ -44,7 +44,7 @@ module Hecks
44
44
  def diagram_showcase(root)
45
45
  lifecycle = File.read(File.join(root, "docs/generated/diagrams/pizzas/Order_lifecycle.mmd")).strip
46
46
  <<~MARKDOWN.strip
47
- `hecks project_diagrams` reads a booted domain's own declaration and draws it as Mermaid — `<Name>_lifecycle.mmd`, `relationships.mmd`, `dispatch.mmd`, `roles.mmd`, `ports.mmd`, `read_models.mmd`, `<Name>_surface.mmd` (what a command does, and what it writes), `<Name>_saga.mmd`, and `frameworks.mmd`. Nothing hand-drawn — the same reason a domain is data at all. Order's own lifecycle, straight off the bluebook above:
47
+ `hecks query introspection.project_diagrams` reads a booted domain's own declaration and draws it as Mermaid — `<Name>_lifecycle.mmd`, `relationships.mmd`, `dispatch.mmd`, `roles.mmd`, `ports.mmd`, `read_models.mmd`, `<Name>_surface.mmd` (what a command does, and what it writes), `<Name>_saga.mmd`, and `frameworks.mmd`. Nothing hand-drawn — the same reason a domain is data at all. Order's own lifecycle, straight off the bluebook above:
48
48
 
49
49
  ```mermaid
50
50
  #{lifecycle}
@@ -36,7 +36,7 @@ module Hecks
36
36
 
37
37
  *The tables on this page are generated from the language's own
38
38
  aggregate-local syntax tables (`lib/hecks/language/**/*.bluebook`)
39
- by `hecks language_run.project_reference` — do not edit inside the markers. The prose
39
+ by `hecks language_run.project_reference!` — do not edit inside the markers. The prose
40
40
  between them is hand-written and survives regeneration.*
41
41
  #{GENERATED_END}
42
42
  #{"\n#{preamble}\n" unless preamble.empty?}
@@ -145,7 +145,7 @@ module Hecks
145
145
  # The DSL reference
146
146
 
147
147
  One page per context — the place in a file where a word may be
148
- typed. Generated by `hecks language_run.project_reference` from the Syntax declaration;
148
+ typed. Generated by `hecks language_run.project_reference!` from the Syntax declaration;
149
149
  the prose between the generated markers is hand-written and
150
150
  survives regeneration.
151
151
 
@@ -10,7 +10,7 @@ module Hecks
10
10
  module Doc
11
11
  # The DSL reference, projected from the language's own Syntax bluebook so
12
12
  # its tables can never drift from the live builders. Regenerate with
13
- # `hecks language_run.project_reference`.
13
+ # `hecks language_run.project_reference!`.
14
14
  #
15
15
  # README's regions are in `Readme` and the coverage gates in `Coverage`, both extended onto
16
16
  # this module; `Harvester` reads committed prose back.
@@ -74,7 +74,7 @@ module Hecks
74
74
  dir = File.join(vendor_dir, name)
75
75
  path = File.join(dir, "bluebook.lock")
76
76
  unless File.exist?(path)
77
- problems << "#{name}: no bluebook.lock (hecks package.vendor #{name}@<version>)"
77
+ problems << "#{name}: no bluebook.lock (hecks package.vendor! #{name}@<version>)"
78
78
  return nil
79
79
  end
80
80
 
@@ -0,0 +1,240 @@
1
+ # The fixer: the work of taking a logged bug to a verified fix. QualityControl finds and records
2
+ # bugs; this domain holds the attempts at them, and says what happened through its events.
3
+ # A bug is never written here. QualityControl records each step from the events below.
4
+
5
+ Hecks.bluebook "Fixer" do
6
+ vision "A logged bug gets one attempt at a time, each claimed, investigated, fixed and verified on the record, and the bug itself is only ever written by the quality ledger."
7
+
8
+ # One attempt at one logged bug. The attempt is keyed by the bug's reference, so there is at most
9
+ # one attempt for each bug the ledger has logged.
10
+ aggregate "Attempt" do
11
+ description "One attempt at one logged bug: who holds it, where the fault is, the commit that fixes it, and what verified it."
12
+
13
+ identified_by :reference
14
+
15
+ attribute :reference, BugReference
16
+ attribute :held_by, Engineer
17
+ attribute :claimed_at, Instant
18
+ attribute :window, StaleAfter
19
+ attribute :site, BugSite, optional: true
20
+ attribute :cause, BugCause, optional: true
21
+ attribute :commit, CommitRef, optional: true
22
+ attribute :verification, Verification, optional: true
23
+ attribute :reproduction, ReproductionCommand, optional: true
24
+ attribute :observed, ReproductionObserved, optional: true
25
+ attribute :reproduced, ReproductionResult, optional: true
26
+ attribute :merged_commit, CommitRef, optional: true
27
+ attribute :merge_pending, MergePending, optional: true
28
+
29
+ value_object "BugReference" do
30
+ attribute :value, String, matches: :present
31
+ invariant("a bug is referenced") { !value.to_s.empty? }
32
+ end
33
+
34
+ value_object "BugSite" do
35
+ attribute :value, String, matches: :present
36
+ invariant("an investigation names where the bug lives") { !value.to_s.empty? }
37
+ end
38
+
39
+ value_object "BugCause" do
40
+ attribute :value, String, matches: :present
41
+ invariant("an investigation says why the code is wrong") { !value.to_s.empty? }
42
+ end
43
+
44
+ # 7 to 40 hex: a fix that lives only in a working tree is not a fix.
45
+ value_object "CommitRef" do
46
+ attribute :value, String, matches: :git_sha
47
+ end
48
+
49
+ # What was actually run, e.g. "rspec --order random, 1335 examples, 0 failures, seed 12345":
50
+ # a count and a seed are checkable, "tests pass" is not.
51
+ value_object "Verification" do
52
+ attribute :value, String, matches: :present
53
+ invariant("a verification says what was actually run") { !value.to_s.empty? }
54
+ end
55
+
56
+ # The exact command or entry point that was run, from the real path a user or caller takes.
57
+ # Verification must re-run this same text, so a fix that passes only new tests is not verified.
58
+ value_object "ReproductionCommand" do
59
+ attribute :value, String, matches: :present
60
+ invariant("a reproduction names the exact command run") { !value.to_s.empty? }
61
+ end
62
+
63
+ # A short fingerprint or the failing line the real path printed.
64
+ value_object "ReproductionObserved" do
65
+ attribute :value, String, matches: :present
66
+ invariant("a reproduction records what the real path printed") { !value.to_s.empty? }
67
+ end
68
+
69
+ value_object "ReproductionResult" do
70
+ attribute :value, String, matches: :present
71
+ invariant("a reproduction either failed or passed") { value == "failed" || value == "passed" }
72
+ end
73
+
74
+ # "yes" while a merged patch is on the record for an attempt that cannot yet record its fix.
75
+ value_object "MergePending" do
76
+ attribute :value, String, default: ""
77
+ end
78
+
79
+ value_object "Engineer" do
80
+ attribute :value, String, default: "nobody"
81
+ end
82
+
83
+ value_object "Instant" do
84
+ attribute :value, Integer, default: 0
85
+ invariant("an instant is not before the epoch") { !value.negative? }
86
+ end
87
+
88
+ value_object "StaleAfter" do
89
+ attribute :value, Integer, default: 900
90
+ invariant("a staleness window is positive") { value.positive? }
91
+ end
92
+
93
+ # A bug is born logged; each step moves the attempt along the same edges QualityControl uses.
94
+ lifecycle :status, default: "logged" do
95
+ transition "Investigate" => "investigating", from: %w[logged investigating]
96
+ transition "Fix" => "fixed", from: "investigating"
97
+ transition "Verify" => "verified", from: "fixed"
98
+ mark :terminal, "verified"
99
+ end
100
+
101
+ # The attempt is opened by the ledger's `BugLogged`, and nothing else creates one.
102
+ command "Open" do
103
+ role "Fixer"
104
+ goal "Start an attempt at a bug the ledger has logged, so it can be claimed"
105
+
106
+ attribute :reference, BugReference
107
+
108
+ emits "AttemptOpened"
109
+ end
110
+
111
+ # Same rule as QualityControl's `Bug.Claim`: held by nobody, or stale.
112
+ command "Claim" do
113
+ role "Fixer"
114
+ goal "Take the attempt, or one whose holder has gone quiet"
115
+
116
+ reference_to Attempt
117
+ attribute :reference, BugReference
118
+ attribute :held_by, Engineer, sets: true
119
+ attribute :now, Instant
120
+ needs :now
121
+
122
+ given("a live claim is not taken from the agent holding it") do
123
+ held_by.value == "nobody" || claimed_at.value + window.value <= now.value
124
+ end
125
+
126
+ sets :claimed_at, to: :now
127
+
128
+ emits "AttemptClaimed"
129
+ end
130
+
131
+ # An investigation starts from the real entry point: the command run, what it printed, and
132
+ # whether it failed. `Fix` is refused until a failing reproduction is on the record. An
133
+ # attempt already investigating can be investigated again, to record the reproduction it lacks
134
+ # or to replace one that did not fail.
135
+ command "Investigate" do
136
+ role "Fixer"
137
+ goal "Run the real entry point, record its failure, name the code that is wrong and say why"
138
+
139
+ reference_to Attempt
140
+ attribute :reference, BugReference
141
+ attribute :site, BugSite, sets: true
142
+ attribute :cause, BugCause, sets: true
143
+ attribute :reproduction, ReproductionCommand, sets: true
144
+ attribute :observed, ReproductionObserved, sets: true
145
+ attribute :reproduced, ReproductionResult, sets: true
146
+
147
+ emits "AttemptInvestigated"
148
+ end
149
+
150
+ # `FixReady` carries the commit that makes the bug stop happening. The ledger records the fixed
151
+ # state from it, and the commit is what the Clearance check and the saga correlate on.
152
+ command "Fix" do
153
+ role "Fixer"
154
+ goal "Record the commit that makes it stop happening"
155
+
156
+ reference_to Attempt
157
+ attribute :reference, BugReference
158
+ attribute :commit, CommitRef, sets: true
159
+
160
+ given("no failing reproduction recorded: run the real entry point first") do
161
+ !reproduction.nil? && !reproduced.nil? && reproduced.value == "failed"
162
+ end
163
+
164
+ emits "FixReady"
165
+ end
166
+
167
+ # A merged patch the attempt cannot yet record as its fix (no failing reproduction on the
168
+ # record) is kept on the attempt and announced, so it is neither dropped nor silent: the
169
+ # attempt lists under `AwaitingReproduction` until it is investigated and fixed.
170
+ command "NoteMerge" do
171
+ role "Fixer"
172
+ goal "Keep a merged patch that the attempt cannot yet record as its fix"
173
+
174
+ reference_to Attempt
175
+ attribute :reference, BugReference
176
+ attribute :commit, CommitRef
177
+
178
+ given("a patch the attempt already recorded as its fix is not pending") do
179
+ reproduction.nil? || reproduced.nil? || reproduced.value != "failed"
180
+ end
181
+
182
+ sets :merged_commit, to: :commit
183
+ sets :merge_pending, to: "yes"
184
+
185
+ emits "MergeAwaitsReproduction"
186
+ end
187
+
188
+ # The attempts holding a merged patch they could not record: the QA tick reads these, investigates
189
+ # with a failing reproduction, then records the fix with `merged_commit`.
190
+ query "AwaitingReproduction" do
191
+ description "Every attempt with a merged patch it could not record as its fix because no failing reproduction is on the record."
192
+ where(status: { in: "logged,investigating" }, merge_pending: "yes")
193
+ order_by :claimed_at
194
+ end
195
+
196
+ # `FixVerified` restates the reference and commit so the ledger can record the verified state
197
+ # against the bug it names.
198
+ command "Verify" do
199
+ role "Fixer"
200
+ goal "Record that the fix was actually verified, and exactly how"
201
+
202
+ reference_to Attempt
203
+ attribute :reference, BugReference
204
+ attribute :commit, CommitRef
205
+ attribute :evidence, Verification
206
+ attribute :rerun, ReproductionCommand
207
+ attribute :rerun_result, ReproductionResult
208
+
209
+ given("the reproduction re-run is not the one recorded: run the recorded command") do
210
+ !reproduction.nil? && rerun.value == reproduction.value
211
+ end
212
+
213
+ given("the recorded reproduction still fails: a fix that passes only new tests is not verified") do
214
+ rerun_result.value == "passed"
215
+ end
216
+
217
+ sets :verification, to: :evidence
218
+
219
+ emits "FixVerified"
220
+ end
221
+ end
222
+
223
+ # The ledger logged a bug: the attempt at it is opened, ready to be claimed.
224
+ policy "OpenOnBugLogged" do
225
+ on "Bug.BugLogged"
226
+ trigger Attempt::Open, with: { reference: :reference }
227
+ end
228
+
229
+ # A merged patch is the commit that makes a bug's fix true, so the attempt at it records the fix.
230
+ policy "FixOnPatchMerged" do
231
+ on "Patch.PatchMerged"
232
+ trigger Attempt::Fix, with: { reference: :bug, commit: :commit }
233
+ end
234
+
235
+ # Declared after the fix: an attempt that could not record it keeps the commit and says so.
236
+ policy "NoteMergeWhenPatchMerged" do
237
+ on "Patch.PatchMerged"
238
+ trigger Attempt::NoteMerge, with: { reference: :bug, commit: :commit }
239
+ end
240
+ end
@@ -0,0 +1,17 @@
1
+ # The Fixer domain, bound so it boots standing alone (a fuzz or model_check boot of this
2
+ # directory). The attempts are held in Memory here; the ledger's own store is wired by the
3
+ # QualityControl hecksagon.
4
+ Hecks.hecksagon "Fixer" do
5
+ attaches "Governance"
6
+ persisted_by "Memory"
7
+
8
+ # The ledger's bug being logged, which opens the attempt at it, and a merged patch, which records
9
+ # the fix. Declarative: QualityControl emits both, and the policies above react.
10
+ subscribe "QualityControl.BugLogged"
11
+ subscribe "QualityControl.PatchMerged"
12
+ end
13
+
14
+ # The anti-corruption layer for Governance, which the bluebook's roles are checked against.
15
+ Hecks.hecksagon "Governance" do
16
+ persisted_by "Memory"
17
+ end
@@ -6,8 +6,8 @@ require_relative "sentence_form"
6
6
 
7
7
  module Hecks
8
8
  # The bluebooks the gem carries that a hecksagon can attach by name (ADR 0080): the language
9
- # declared in itself, Expression, Tenancy, Deploy, Site, Tickets, Composer, QualityControl and
10
- # Bulk.
9
+ # declared in itself, Expression, Tenancy, Deploy, Site, Tickets, Composer, QualityControl,
10
+ # Fixer, Coder, Bulk and CiPipeline.
11
11
  # Framework members stay in `Framework`; `table` and `attach!` find a name across both.
12
12
  #
13
13
  # A bluebook is named by the `Hecks.bluebook "Name"` header of its files, and may span several.
@@ -18,7 +18,8 @@ module Hecks
18
18
  # Where attachable bluebooks live, relative to `lib/hecks/`.
19
19
  GLOBS = %w[language/**/*.bluebook grammar/expression.bluebook tenancy/bluebook/*.bluebook
20
20
  deploy/bluebook/*.bluebook site/bluebook/*.bluebook rails_app/bluebook/*.bluebook tickets/bluebook/*.bluebook
21
- composer/bluebook/*.bluebook quality_control/*.bluebook bulk/bluebook/*.bluebook].freeze
21
+ composer/bluebook/*.bluebook quality_control/*.bluebook fixer/*.bluebook coder/*.bluebook
22
+ bulk/bluebook/*.bluebook ci_pipeline/*.bluebook].freeze
22
23
 
23
24
  # A `Hecks.bluebook "Name"` header line, capturing the bluebook's name.
24
25
  BLUEBOOK_HEADER = /\A\s*Hecks\.bluebook\s+"([^"]+)"/
@@ -106,7 +107,7 @@ module Hecks
106
107
  Bluebook::MetaValidator.defer { paths.each { |path| SentenceForm.load_file(path) } }
107
108
  Bluebook::MetaValidator.judge_deferred!(registry)
108
109
  load_wiring(name, paths)
109
- rescue Exception # rubocop:disable Lint/RescueException -- rolls back, then re-raises
110
+ rescue Exception
110
111
  roll_back(registry, name, before)
111
112
  raise
112
113
  end
@@ -140,12 +141,36 @@ module Hecks
140
141
  # @param paths [Array<String>] the bluebook's bluebook files
141
142
  # @return [void]
142
143
  def self.load_wiring(name, paths)
144
+ wiring_files(name, paths).each { |file| Kernel.load(file) }
145
+ end
146
+ private_class_method :load_wiring
147
+
148
+ # The files `load_wiring` loads, in the order it loads them: the ports file, then the adapters.
149
+ #
150
+ # @param name [String] the bluebook's name
151
+ # @param paths [Array<String>] the bluebook's bluebook files
152
+ # @return [Array<String>] the ports file when there is one, then each adapter file
153
+ def self.wiring_files(name, paths)
143
154
  directory = File.dirname(paths.first)
144
155
  ports = File.join(directory, "#{Naming.snake(name)}.ports.hecksagon")
145
- Kernel.load(ports) if File.file?(ports)
146
- Dir.glob(File.join(directory, "adapters", "*.adapter")).each { |adapter| Kernel.load(adapter) }
156
+ [*(ports if File.file?(ports)), *Dir.glob(File.join(directory, "adapters", "*.adapter"))]
157
+ end
158
+ private_class_method :wiring_files
159
+
160
+ # Every file attaching the named bluebook reads: a framework member's one file, or an
161
+ # attachable bluebook's files with the ports file and adapters it ships. What a cache of a
162
+ # generated tree hashes to know when attaching the bluebook would write something else.
163
+ #
164
+ # @param name [String, Symbol] the bluebook's name, such as `"Governance"`
165
+ # @return [Array<String>] the files' absolute paths
166
+ # @raise [Runtime::WiringError] if the gem carries no bluebook of that name
167
+ def self.files_of(name)
168
+ key = name.to_s
169
+ return [Framework.members.fetch(key)] if Framework.members.key?(key)
170
+
171
+ paths = bluebook_paths(key)
172
+ [*paths, *wiring_files(key, paths)]
147
173
  end
148
- private_class_method :load_wiring
149
174
 
150
175
  # The name a file's `Hecks.bluebook "Name"` header declares, or nil for a file without one.
151
176
  def self.declaration_name(path)
@@ -58,6 +58,7 @@ module Hecks
58
58
  database "#{database}"
59
59
  schema "#{schema}"
60
60
  allow_superuser true
61
+ disposable_ledger true
61
62
  end
62
63
  end
63
64
  WORLD