hecks 6.0.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (754) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +19 -12
  3. data/lib/hecks/adapters/driven/claude_code.rb +2 -2
  4. data/lib/hecks/adapters/driven/folder.rb +10 -1
  5. data/lib/hecks/adapters/driven/folder_overlay.rb +15 -0
  6. data/lib/hecks/adapters/driven/heki.rb +1 -1
  7. data/lib/hecks/adapters/driven/in_process_key_vault.rb +1 -1
  8. data/lib/hecks/adapters/driven/memory/outbox_rows.rb +2 -2
  9. data/lib/hecks/adapters/driven/postgres/name_guard.rb +25 -0
  10. data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -3
  11. data/lib/hecks/adapters/driven/postgres/repository.rb +1 -1
  12. data/lib/hecks/adapters/driven/postgres/shared_connection.rb +1 -1
  13. data/lib/hecks/adapters/driven/postgres.rb +3 -0
  14. data/lib/hecks/adapters/driven/postgres_era/boot.rb +28 -16
  15. data/lib/hecks/adapters/driven/postgres_era/class_methods.rb +27 -7
  16. data/lib/hecks/adapters/driven/postgres_era/dialect.rb +10 -5
  17. data/lib/hecks/adapters/driven/postgres_era/field_cache_provisioner.rb +39 -0
  18. data/lib/hecks/adapters/driven/postgres_era/journal.rb +52 -13
  19. data/lib/hecks/adapters/driven/postgres_era/lineage/chain_sql.rb +29 -49
  20. data/lib/hecks/adapters/driven/postgres_era/lineage/direct_sql.rb +73 -0
  21. data/lib/hecks/adapters/driven/postgres_era/lineage/direct_verified.json +10 -0
  22. data/lib/hecks/adapters/driven/postgres_era/lineage/direct_verified.rb +65 -0
  23. data/lib/hecks/adapters/driven/postgres_era/lineage/domain_rename.rb +77 -25
  24. data/lib/hecks/adapters/driven/postgres_era/lineage/domain_rename_state.rb +108 -0
  25. data/lib/hecks/adapters/driven/postgres_era/lineage/era_integrity.rb +11 -6
  26. data/lib/hecks/adapters/driven/postgres_era/lineage/era_store.rb +63 -5
  27. data/lib/hecks/adapters/driven/postgres_era/lineage/layered_sql.rb +64 -0
  28. data/lib/hecks/adapters/driven/postgres_era/lineage/ledger_reset.rb +150 -0
  29. data/lib/hecks/adapters/driven/postgres_era/lineage/mint_provisioning.rb +85 -0
  30. data/lib/hecks/adapters/driven/postgres_era/lineage/mint_transaction.rb +11 -7
  31. data/lib/hecks/adapters/driven/postgres_era/lineage/provisioning.rb +11 -5
  32. data/lib/hecks/adapters/driven/postgres_era/lineage/split_sql.rb +76 -0
  33. data/lib/hecks/adapters/driven/postgres_era/lineage/sql_templates.rb +9 -0
  34. data/lib/hecks/adapters/driven/postgres_era/lineage.rb +10 -2
  35. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/context.rb +23 -3
  36. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/coverage_check.rb +3 -1
  37. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/disposable_ledger.rb +119 -0
  38. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolution.rb +219 -0
  39. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolver.rb +68 -71
  40. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/held_era.rb +68 -0
  41. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/ledger_change.rb +63 -0
  42. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/merge_coordinator.rb +1 -1
  43. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_decision.rb +163 -0
  44. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_request.rb +24 -0
  45. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/minter.rb +59 -21
  46. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/refusals.rb +24 -11
  47. data/lib/hecks/adapters/driven/postgres_era/lineage_manager.rb +40 -6
  48. data/lib/hecks/adapters/driven/postgres_era/shared_tables.rb +32 -0
  49. data/lib/hecks/adapters/driven/postgres_era.adapter +12 -0
  50. data/lib/hecks/adapters/driven/postgres_era.rb +25 -10
  51. data/lib/hecks/adapters/driven/prism.rb +0 -1
  52. data/lib/hecks/adapters/driven/sql_query_builder.rb +1 -0
  53. data/lib/hecks/adapters/driven/sqlite/dispatch_claims.rb +1 -1
  54. data/lib/hecks/adapters/driven/sqlite/name_guard.rb +25 -0
  55. data/lib/hecks/adapters/driven/sqlite/outbox.rb +2 -2
  56. data/lib/hecks/adapters/driven/sqlite/repository.rb +1 -1
  57. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +20 -0
  58. data/lib/hecks/adapters/driven/sqlite.rb +9 -1
  59. data/lib/hecks/adapters/driven/tenant_provisioner.rb +1 -1
  60. data/lib/hecks/adapters/driven/worktree_overlay.rb +117 -0
  61. data/lib/hecks/adapters/driving/cli/shorthand.rb +5 -1
  62. data/lib/hecks/adapters/driving/cli.rb +1 -1
  63. data/lib/hecks/adapters/driving/cli_runner/answers.rb +77 -22
  64. data/lib/hecks/adapters/driving/cli_runner/bang_rule.rb +35 -0
  65. data/lib/hecks/adapters/driving/cli_runner/completion_words.rb +36 -0
  66. data/lib/hecks/adapters/driving/cli_runner/json_words.rb +55 -0
  67. data/lib/hecks/adapters/driving/cli_runner/name_index.rb +63 -0
  68. data/lib/hecks/adapters/driving/cli_runner/read_context.rb +32 -0
  69. data/lib/hecks/adapters/driving/cli_runner/renamed_names.rb +49 -0
  70. data/lib/hecks/adapters/driving/cli_runner/resolution.rb +43 -17
  71. data/lib/hecks/adapters/driving/cli_runner/resume_words.rb +63 -0
  72. data/lib/hecks/adapters/driving/cli_runner/run_reference.rb +66 -0
  73. data/lib/hecks/adapters/driving/cli_runner/run_replay.rb +118 -0
  74. data/lib/hecks/adapters/driving/cli_runner/search_words.rb +35 -0
  75. data/lib/hecks/adapters/driving/cli_runner/settling.rb +6 -5
  76. data/lib/hecks/adapters/driving/cli_runner/streaming.rb +11 -10
  77. data/lib/hecks/adapters/driving/cli_runner/suggestions.rb +1 -1
  78. data/lib/hecks/adapters/driving/cli_runner/tour_words.rb +77 -0
  79. data/lib/hecks/adapters/driving/cli_runner/verb_names.rb +36 -4
  80. data/lib/hecks/adapters/driving/cli_runner/verbosity.rb +75 -0
  81. data/lib/hecks/adapters/driving/cli_runner.rb +106 -7
  82. data/lib/hecks/adapters/driving/context_line.rb +85 -0
  83. data/lib/hecks/adapters/driving/exit_status.rb +31 -0
  84. data/lib/hecks/adapters/driving/launcher_options.rb +7 -5
  85. data/lib/hecks/adapters/driving/mcp/progress_sink.rb +45 -0
  86. data/lib/hecks/adapters/driving/mcp/tool_calls.rb +7 -5
  87. data/lib/hecks/adapters/driving/mcp.rb +25 -5
  88. data/lib/hecks/adapters/driving/mcp_scope/argument_policy.rb +40 -7
  89. data/lib/hecks/adapters/driving/mcp_scope.rb +8 -7
  90. data/lib/hecks/adapters/driving/ruby/aggregate_module/hooks.rb +154 -0
  91. data/lib/hecks/adapters/driving/ruby/aggregate_module.rb +64 -93
  92. data/lib/hecks/adapters/driving/usage_log.rb +146 -0
  93. data/lib/hecks/adapters/driving/write_guard.rb +55 -0
  94. data/lib/hecks/adapters/driving.rb +0 -1
  95. data/lib/hecks/behaviors/dsl.rb +5 -1
  96. data/lib/hecks/behaviors/expectations/boot.rb +0 -1
  97. data/lib/hecks/bluebook/acknowledgements.rb +1 -1
  98. data/lib/hecks/bluebook/aggregate.rb +21 -18
  99. data/lib/hecks/bluebook/assembly/contracts/sagas.rb +2 -0
  100. data/lib/hecks/bluebook/assembly/contracts/structure.rb +18 -13
  101. data/lib/hecks/bluebook/behaviour/aggregate.rb +27 -3
  102. data/lib/hecks/bluebook/command.rb +16 -5
  103. data/lib/hecks/bluebook/declaration.rb +32 -4
  104. data/lib/hecks/bluebook/domain_port.rb +7 -3
  105. data/lib/hecks/bluebook/dsl/aggregate_builder/relationships.rb +0 -2
  106. data/lib/hecks/bluebook/dsl/aggregate_builder/renaming.rb +25 -0
  107. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +3 -0
  108. data/lib/hecks/bluebook/dsl/attribute_collector.rb +0 -1
  109. data/lib/hecks/bluebook/dsl/audience_word.rb +40 -0
  110. data/lib/hecks/bluebook/dsl/bluebook_builder/metadata.rb +56 -0
  111. data/lib/hecks/bluebook/dsl/bluebook_builder/modules.rb +80 -0
  112. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb +51 -0
  113. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +1 -0
  114. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +17 -34
  115. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +8 -0
  116. data/lib/hecks/bluebook/dsl/command_builder.rb +13 -3
  117. data/lib/hecks/bluebook/dsl/entity_builder.rb +0 -2
  118. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +6 -4
  119. data/lib/hecks/bluebook/dsl/kinds.rb +53 -0
  120. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +9 -2
  121. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +25 -15
  122. data/lib/hecks/bluebook/dsl/translation_builder.rb +16 -1
  123. data/lib/hecks/bluebook/dsl/word_gate.rb +1 -1
  124. data/lib/hecks/bluebook/dsl.rb +1 -0
  125. data/lib/hecks/bluebook/meta_validator/judge/identity.rb +9 -4
  126. data/lib/hecks/bluebook/meta_validator/plan/category.rb +10 -2
  127. data/lib/hecks/bluebook/meta_validator/plan/verbs.rb +9 -0
  128. data/lib/hecks/bluebook/meta_validator/plan.rb +2 -1
  129. data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +3 -1
  130. data/lib/hecks/bluebook/meta_validator/reconstruction/reading.rb +7 -0
  131. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +7 -2
  132. data/lib/hecks/bluebook/meta_validator/shapes.rb +3 -0
  133. data/lib/hecks/bluebook/meta_validator/syntax_boot/disk_cache.rb +1 -1
  134. data/lib/hecks/bluebook/model_check/aggregate_checks.rb +27 -0
  135. data/lib/hecks/bluebook/model_check/ask_checks.rb +25 -0
  136. data/lib/hecks/bluebook/model_check/reaction_chains.rb +114 -0
  137. data/lib/hecks/bluebook/model_check/reaction_cycles.rb +53 -0
  138. data/lib/hecks/bluebook/model_check/reaction_depth_checks.rb +58 -0
  139. data/lib/hecks/bluebook/model_check/reaction_walk.rb +62 -0
  140. data/lib/hecks/bluebook/model_check.rb +5 -27
  141. data/lib/hecks/bluebook/process_manager.rb +20 -3
  142. data/lib/hecks/bluebook/translation.rb +5 -3
  143. data/lib/hecks/bluebook/translation_plan.rb +9 -2
  144. data/lib/hecks/ci_pipeline/adapters/ci_cache.adapter +7 -0
  145. data/lib/hecks/ci_pipeline/adapters/ci_cache.rb +39 -0
  146. data/lib/hecks/ci_pipeline/adapters/ci_runner.adapter +7 -0
  147. data/lib/hecks/ci_pipeline/adapters/ci_runner.rb +55 -0
  148. data/lib/hecks/ci_pipeline/ci_pipeline.behaviors +322 -0
  149. data/lib/hecks/ci_pipeline/ci_pipeline.bluebook +938 -0
  150. data/lib/hecks/ci_pipeline/ci_pipeline.hecksagon +12 -0
  151. data/lib/hecks/ci_pipeline/ci_pipeline.ports.hecksagon +16 -0
  152. data/lib/hecks/ci_speed/adapters/ci_reader.adapter +7 -0
  153. data/lib/hecks/ci_speed/adapters/ci_reader.rb +141 -0
  154. data/lib/hecks/ci_speed/adapters/local_runner/answer.rb +41 -0
  155. data/lib/hecks/ci_speed/adapters/local_runner/catalog.rb +89 -0
  156. data/lib/hecks/ci_speed/adapters/local_runner/checkouts.rb +89 -0
  157. data/lib/hecks/ci_speed/adapters/local_runner/launcher.rb +69 -0
  158. data/lib/hecks/ci_speed/adapters/local_runner/load_average.rb +38 -0
  159. data/lib/hecks/ci_speed/adapters/local_runner/refs.rb +39 -0
  160. data/lib/hecks/ci_speed/adapters/local_runner/refused.rb +11 -0
  161. data/lib/hecks/ci_speed/adapters/local_runner/verdict.rb +71 -0
  162. data/lib/hecks/ci_speed/adapters/local_runner.adapter +7 -0
  163. data/lib/hecks/ci_speed/adapters/local_runner.rb +168 -0
  164. data/lib/hecks/ci_speed/adapters/replayed_runner.rb +39 -0
  165. data/lib/hecks/ci_speed/ci_speed.behaviors +341 -0
  166. data/lib/hecks/ci_speed/ci_speed.bluebook +1073 -0
  167. data/lib/hecks/ci_speed/ci_speed.hecksagon +11 -0
  168. data/lib/hecks/ci_speed/ci_speed.ports.hecksagon +21 -0
  169. data/lib/hecks/ci_workflows/ci_workflows.behaviors +13 -0
  170. data/lib/hecks/ci_workflows/ci_workflows.bluebook +173 -0
  171. data/lib/hecks/ci_workflows/ci_workflows.hecksagon +15 -0
  172. data/lib/hecks/coder/coder.bluebook +385 -0
  173. data/lib/hecks/coder/coder.hecksagon +12 -0
  174. data/lib/hecks/command_names/check.rb +39 -0
  175. data/lib/hecks/command_names/extractor.rb +67 -0
  176. data/lib/hecks/command_names/index.rb +40 -0
  177. data/lib/hecks/command_names/resolution.rb +81 -0
  178. data/lib/hecks/command_names/scan.rb +54 -0
  179. data/lib/hecks/command_names/sources.rb +73 -0
  180. data/lib/hecks/command_names.rb +26 -0
  181. data/lib/hecks/composer/jobs.rb +1 -1
  182. data/lib/hecks/composer/toolbox.rb +8 -1
  183. data/lib/hecks/corpus/generated_key.rb +205 -0
  184. data/lib/hecks/corpus/listing.rb +34 -0
  185. data/lib/hecks/corpus/rust.rb +27 -11
  186. data/lib/hecks/corpus/sources.rb +2 -1
  187. data/lib/hecks/corpus.rb +37 -42
  188. data/lib/hecks/deprecation.rb +23 -0
  189. data/lib/hecks/doc/reference/readme.rb +1 -1
  190. data/lib/hecks/doc/reference/rendering.rb +2 -2
  191. data/lib/hecks/doc/reference.rb +1 -1
  192. data/lib/hecks/embryonaut_bluebook/manifest.rb +1 -1
  193. data/lib/hecks/fixer/fixer.bluebook +240 -0
  194. data/lib/hecks/fixer/fixer.hecksagon +17 -0
  195. data/lib/hecks/framework_bluebooks.rb +32 -7
  196. data/lib/hecks/fuzzing/concurrent_dispatch/world_copy.rb +1 -0
  197. data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +11 -12
  198. data/lib/hecks/fuzzing/isolated_boot/worlds.rb +23 -5
  199. data/lib/hecks/fuzzing/isolated_boot.rb +1 -1
  200. data/lib/hecks/fuzzing/mutation/checks.rb +3 -3
  201. data/lib/hecks/grammar/translation.bluebook +1 -1
  202. data/lib/hecks/grammar/translation_rules.json +64 -0
  203. data/lib/hecks/hecks/adapter_words.json +7 -0
  204. data/lib/hecks/hecks/adapters/area_overlap.rb +156 -0
  205. data/lib/hecks/hecks/adapters/claude_agents.rb +8 -3
  206. data/lib/hecks/hecks/adapters/codebase/batch_runs.rb +60 -0
  207. data/lib/hecks/hecks/adapters/codebase/changed_specs.rb +52 -0
  208. data/lib/hecks/hecks/adapters/codebase/codemods.rb +3 -2
  209. data/lib/hecks/hecks/adapters/codebase/conformance.rb +14 -1
  210. data/lib/hecks/hecks/adapters/codebase/corpus_queries.rb +53 -0
  211. data/lib/hecks/hecks/adapters/codebase/generated_keys.rb +31 -0
  212. data/lib/hecks/hecks/adapters/codebase/impacted_specs.rb +110 -0
  213. data/lib/hecks/hecks/adapters/codebase/language.rb +2 -2
  214. data/lib/hecks/hecks/adapters/codebase/launcher_text.rb +39 -0
  215. data/lib/hecks/hecks/adapters/codebase/minitest_runs.rb +52 -0
  216. data/lib/hecks/hecks/adapters/codebase/regeneration.rb +51 -8
  217. data/lib/hecks/hecks/adapters/codebase/run_options.rb +35 -0
  218. data/lib/hecks/hecks/adapters/codebase/scripting.rb +39 -0
  219. data/lib/hecks/hecks/adapters/codebase/search.rb +1 -1
  220. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +79 -51
  221. data/lib/hecks/hecks/adapters/codebase/spec_files/report.rb +71 -0
  222. data/lib/hecks/hecks/adapters/codebase/spec_files/shared_run.rb +73 -0
  223. data/lib/hecks/hecks/adapters/codebase/spec_files.rb +95 -0
  224. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +53 -4
  225. data/lib/hecks/hecks/adapters/codebase/test_scope.rb +105 -0
  226. data/lib/hecks/hecks/adapters/codebase/test_suite.rb +48 -34
  227. data/lib/hecks/hecks/adapters/console_capture.rb +1 -1
  228. data/lib/hecks/hecks/adapters/cost_explorer.rb +9 -1
  229. data/lib/hecks/hecks/adapters/dispatching/brief_text.rb +51 -0
  230. data/lib/hecks/hecks/adapters/dispatching/launcher.rb +97 -0
  231. data/lib/hecks/hecks/adapters/dispatching/plan.rb +82 -0
  232. data/lib/hecks/hecks/adapters/dispatching/rows.rb +66 -0
  233. data/lib/hecks/hecks/adapters/dispatching/settings.rb +81 -0
  234. data/lib/hecks/hecks/adapters/dispatching/settler.rb +40 -0
  235. data/lib/hecks/hecks/adapters/dispatching.adapter +7 -0
  236. data/lib/hecks/hecks/adapters/dispatching.rb +93 -0
  237. data/lib/hecks/hecks/adapters/doctor_reading/report.rb +27 -0
  238. data/lib/hecks/hecks/adapters/doctor_reading.adapter +7 -0
  239. data/lib/hecks/hecks/adapters/doctor_reading.rb +161 -0
  240. data/lib/hecks/hecks/adapters/git_checkout.rb +1 -1
  241. data/lib/hecks/hecks/adapters/git_commit.adapter +7 -0
  242. data/lib/hecks/hecks/adapters/git_commit.rb +61 -0
  243. data/lib/hecks/hecks/adapters/git_landing/finisher.rb +82 -0
  244. data/lib/hecks/hecks/adapters/git_landing/foreign_hold.rb +111 -0
  245. data/lib/hecks/hecks/adapters/git_landing/line.rb +171 -0
  246. data/lib/hecks/hecks/adapters/git_landing/lineup.rb +98 -0
  247. data/lib/hecks/hecks/adapters/git_landing/merger.rb +1 -1
  248. data/lib/hecks/hecks/adapters/git_landing/numbering.rb +54 -0
  249. data/lib/hecks/hecks/adapters/git_landing/rivals.rb +59 -0
  250. data/lib/hecks/hecks/adapters/git_landing/ticket.rb +156 -0
  251. data/lib/hecks/hecks/adapters/git_landing/tidy.rb +147 -0
  252. data/lib/hecks/hecks/adapters/git_landing/train.rb +104 -0
  253. data/lib/hecks/hecks/adapters/git_landing/verdict.rb +64 -0
  254. data/lib/hecks/hecks/adapters/git_landing/waiting.rb +120 -0
  255. data/lib/hecks/hecks/adapters/git_landing.rb +106 -20
  256. data/lib/hecks/hecks/adapters/git_main_pull.rb +99 -0
  257. data/lib/hecks/hecks/adapters/git_rehearsal/bench.rb +82 -0
  258. data/lib/hecks/hecks/adapters/git_rehearsal/due.rb +84 -0
  259. data/lib/hecks/hecks/adapters/git_rehearsal/impacted/skips.rb +47 -0
  260. data/lib/hecks/hecks/adapters/git_rehearsal/impacted/spec_run.rb +75 -0
  261. data/lib/hecks/hecks/adapters/git_rehearsal/impacted.rb +181 -0
  262. data/lib/hecks/hecks/adapters/git_rehearsal/line.rb +76 -0
  263. data/lib/hecks/hecks/adapters/git_rehearsal/reading.rb +24 -0
  264. data/lib/hecks/hecks/adapters/git_rehearsal/record.rb +146 -0
  265. data/lib/hecks/hecks/adapters/git_rehearsal/spec_map/corpus.rb +25 -0
  266. data/lib/hecks/hecks/adapters/git_rehearsal/spec_map/needles.rb +61 -0
  267. data/lib/hecks/hecks/adapters/git_rehearsal/spec_map.rb +105 -0
  268. data/lib/hecks/hecks/adapters/git_rehearsal/stages.rb +118 -0
  269. data/lib/hecks/hecks/adapters/git_rehearsal.adapter +7 -0
  270. data/lib/hecks/hecks/adapters/git_rehearsal.rb +141 -0
  271. data/lib/hecks/hecks/adapters/git_train/bench.rb +15 -15
  272. data/lib/hecks/hecks/adapters/git_train/branch_guard.rb +62 -0
  273. data/lib/hecks/hecks/adapters/git_train/carriage.rb +27 -28
  274. data/lib/hecks/hecks/adapters/git_train/launcher_shape.rb +75 -0
  275. data/lib/hecks/hecks/adapters/git_train/mint_step.rb +47 -0
  276. data/lib/hecks/hecks/adapters/git_train/settlement.rb +167 -0
  277. data/lib/hecks/hecks/adapters/git_train.rb +73 -15
  278. data/lib/hecks/hecks/adapters/git_worktree_add.adapter +7 -0
  279. data/lib/hecks/hecks/adapters/git_worktree_add.rb +68 -0
  280. data/lib/hecks/hecks/adapters/github_pull_requests.adapter +7 -0
  281. data/lib/hecks/hecks/adapters/github_pull_requests.rb +109 -0
  282. data/lib/hecks/hecks/adapters/host_http.rb +6 -6
  283. data/lib/hecks/hecks/adapters/in_process_boot.rb +10 -8
  284. data/lib/hecks/hecks/adapters/in_process_operations.rb +11 -17
  285. data/lib/hecks/hecks/adapters/in_process_undo.rb +17 -0
  286. data/lib/hecks/hecks/adapters/journal_store/changes.rb +13 -4
  287. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +28 -15
  288. data/lib/hecks/hecks/adapters/journal_store/examination.rb +17 -1
  289. data/lib/hecks/hecks/adapters/journal_store/held_domain/renaming.rb +45 -0
  290. data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +31 -5
  291. data/lib/hecks/hecks/adapters/journal_store/held_mint.rb +128 -0
  292. data/lib/hecks/hecks/adapters/journal_store/readings/attestation.rb +1 -1
  293. data/lib/hecks/hecks/adapters/journal_store/readings/boot_status.rb +58 -0
  294. data/lib/hecks/hecks/adapters/journal_store/readings/composition.rb +39 -0
  295. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/outcomes.rb +76 -0
  296. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/postgres_reader.rb +44 -0
  297. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/reader.rb +64 -0
  298. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/report.rb +102 -0
  299. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/sqlite_reader.rb +43 -0
  300. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/stores.rb +80 -0
  301. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/subscribers.rb +72 -0
  302. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/summary.rb +39 -0
  303. data/lib/hecks/hecks/adapters/journal_store/readings/event_trace.rb +39 -0
  304. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/command_line.rb +57 -0
  305. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/edge_guards.rb +107 -0
  306. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/inspection.rb +94 -0
  307. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/plan.rb +66 -0
  308. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/report.rb +72 -0
  309. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/store.rb +34 -0
  310. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/watermark_guards.rb +86 -0
  311. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/world.rb +66 -0
  312. data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan.rb +36 -0
  313. data/lib/hecks/hecks/adapters/journal_store/readings/projection_audit.rb +64 -0
  314. data/lib/hecks/hecks/adapters/journal_store/readings/scaffolding.rb +3 -3
  315. data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status/database_reading.rb +113 -0
  316. data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status/read_only.rb +33 -0
  317. data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status.rb +32 -0
  318. data/lib/hecks/hecks/adapters/journal_store/readings.rb +13 -1
  319. data/lib/hecks/hecks/adapters/journal_store/reconcile_report.rb +60 -0
  320. data/lib/hecks/hecks/adapters/journal_store/reconciliation.rb +121 -0
  321. data/lib/hecks/hecks/adapters/journal_store/translation_write/shape_edge.rb +59 -0
  322. data/lib/hecks/hecks/adapters/journal_store/translation_write.rb +123 -0
  323. data/lib/hecks/hecks/adapters/journal_store.rb +16 -0
  324. data/lib/hecks/hecks/adapters/landed_work.adapter +7 -0
  325. data/lib/hecks/hecks/adapters/landed_work.rb +52 -0
  326. data/lib/hecks/hecks/adapters/local_files.rb +6 -6
  327. data/lib/hecks/hecks/adapters/process_pool.rb +3 -2
  328. data/lib/hecks/hecks/adapters/push_size.rb +57 -0
  329. data/lib/hecks/hecks/adapters/qa_quiescing.adapter +7 -0
  330. data/lib/hecks/hecks/adapters/qa_quiescing.rb +57 -0
  331. data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +30 -3
  332. data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +63 -3
  333. data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +29 -6
  334. data/lib/hecks/hecks/adapters/rehearsal/subject.rb +11 -5
  335. data/lib/hecks/hecks/adapters/rust_toolchain.rb +10 -1
  336. data/lib/hecks/hecks/adapters/rust_workspace.rb +1 -1
  337. data/lib/hecks/hecks/adapters/settings_reading/disposable_ledger.rb +32 -0
  338. data/lib/hecks/hecks/adapters/settings_reading/push_nudge.rb +26 -0
  339. data/lib/hecks/hecks/adapters/settings_reading/stores.rb +76 -0
  340. data/lib/hecks/hecks/adapters/settings_reading/test_scope.rb +28 -0
  341. data/lib/hecks/hecks/adapters/settings_reading.rb +28 -2
  342. data/lib/hecks/hecks/adapters/started_work.rb +42 -0
  343. data/lib/hecks/hecks/adapters/terminal.rb +12 -10
  344. data/lib/hecks/hecks/adapters/where_reading.adapter +7 -0
  345. data/lib/hecks/hecks/adapters/where_reading.rb +64 -0
  346. data/lib/hecks/hecks/adapters/work_areas.rb +57 -0
  347. data/lib/hecks/hecks/adapters/work_limits.rb +57 -0
  348. data/lib/hecks/hecks/build/build.bluebook +576 -0
  349. data/lib/hecks/hecks/check/check.bluebook +966 -0
  350. data/lib/hecks/hecks/codebase.behaviors +61 -5
  351. data/lib/hecks/hecks/composer.behaviors +1 -1
  352. data/lib/hecks/hecks/context_map.hecksagon +1 -1
  353. data/lib/hecks/hecks/custodian.behaviors +33 -7
  354. data/lib/hecks/hecks/delegate/delegate.bluebook +355 -0
  355. data/lib/hecks/hecks/deliver/deliver.bluebook +945 -0
  356. data/lib/hecks/hecks/deploy.behaviors +1 -1
  357. data/lib/hecks/hecks/evolve/evolve.bluebook +788 -0
  358. data/lib/hecks/hecks/find/find.bluebook +81 -0
  359. data/lib/hecks/hecks/hecks.behaviors +1 -1
  360. data/lib/hecks/hecks/hecks.bluebook +0 -133
  361. data/lib/hecks/hecks/hecks.contextmap +2 -0
  362. data/lib/hecks/hecks/hecks.hecksagon +185 -29
  363. data/lib/hecks/hecks/hecks.world +35 -9
  364. data/lib/hecks/hecks/implicit_moves.json +24 -0
  365. data/lib/hecks/hecks/migrate/migrate.bluebook +1066 -0
  366. data/lib/hecks/hecks/operate/operate.bluebook +695 -0
  367. data/lib/hecks/hecks/quiesce/quiesce.bluebook +117 -0
  368. data/lib/hecks/hecks/rehearse/rehearse.bluebook +133 -0
  369. data/lib/hecks/hecks/release/release.bluebook +916 -0
  370. data/lib/hecks/hecks/serve/serve.bluebook +134 -0
  371. data/lib/hecks/hecks/shapes.json +1 -15
  372. data/lib/hecks/hecks/site.behaviors +1 -1
  373. data/lib/hecks/hecks/start/start.bluebook +194 -0
  374. data/lib/hecks/hecks/test/test.bluebook +638 -0
  375. data/lib/hecks/hecks/tickets.world +14 -0
  376. data/lib/hecks/language/bluebook/aggregate.bluebook +22 -0
  377. data/lib/hecks/language/bluebook/bluebook.bluebook +34 -0
  378. data/lib/hecks/language/bluebook/command.bluebook +35 -0
  379. data/lib/hecks/language/bluebook/process_manager.bluebook +14 -1
  380. data/lib/hecks/language/bluebook/vocabulary.bluebook +174 -54
  381. data/lib/hecks/language/hecksagon/domain_port.bluebook +1 -0
  382. data/lib/hecks/language/hecksagon/port_operation.bluebook +14 -0
  383. data/lib/hecks/language/kinds/run.kind +120 -0
  384. data/lib/hecks/language/oidc.json +10 -0
  385. data/lib/hecks/language/translation/translation_aggregate.bluebook +24 -0
  386. data/lib/hecks/module_folders.rb +31 -0
  387. data/lib/hecks/ports/key_vault.rb +1 -1
  388. data/lib/hecks/ports/persistence/append_only.rb +26 -8
  389. data/lib/hecks/ports/persistence/binding_policy.rb +3 -1
  390. data/lib/hecks/ports/persistence/codec_boundary.rb +1 -1
  391. data/lib/hecks/ports/persistence/mint_door.rb +74 -0
  392. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +6 -5
  393. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +5 -1
  394. data/lib/hecks/ports/persistence/plugins/era/era_status.rb +48 -0
  395. data/lib/hecks/ports/persistence/plugins/era/projected_bluebook.rb +127 -0
  396. data/lib/hecks/ports/persistence/plugins/era/translation/additive_shape.rb +107 -0
  397. data/lib/hecks/ports/persistence/plugins/era/translation/compose.rb +155 -0
  398. data/lib/hecks/ports/persistence/plugins/era/translation/compose_render.rb +79 -0
  399. data/lib/hecks/ports/persistence/plugins/era/translation/edge_files.rb +49 -0
  400. data/lib/hecks/ports/persistence/plugins/era/translation/edge_route.rb +61 -0
  401. data/lib/hecks/ports/persistence/plugins/era/translation/implicit_edge.rb +67 -0
  402. data/lib/hecks/ports/persistence/plugins/era/translation/reconcile.rb +130 -0
  403. data/lib/hecks/ports/persistence/plugins/era/translation/reconcile_files.rb +35 -0
  404. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +13 -5
  405. data/lib/hecks/ports/persistence/plugins/era/translation.rb +5 -0
  406. data/lib/hecks/ports/persistence/plugins/era.rb +1 -0
  407. data/lib/hecks/ports/persistence/repository_factory.rb +11 -3
  408. data/lib/hecks/ports/persistence/stored_name_guard.rb +36 -0
  409. data/lib/hecks/ports/persistence.rb +2 -0
  410. data/lib/hecks/projections/ci_pipeline/table/checks.rb +137 -0
  411. data/lib/hecks/projections/ci_pipeline/table/lookup.rb +59 -0
  412. data/lib/hecks/projections/ci_pipeline/table/refusals.rb +58 -0
  413. data/lib/hecks/projections/ci_pipeline/table/rows.rb +119 -0
  414. data/lib/hecks/projections/ci_pipeline/table/tree.rb +30 -0
  415. data/lib/hecks/projections/ci_pipeline/table/typing.rb +92 -0
  416. data/lib/hecks/projections/ci_pipeline/table.rb +112 -0
  417. data/lib/hecks/projections/ci_pipeline/workflows.rb +162 -0
  418. data/lib/hecks/projections/ci_pipeline/yaml_text.rb +104 -0
  419. data/lib/hecks/projections/deploy/box/hosting.rb +1 -1
  420. data/lib/hecks/projections/deploy/box/roll_recipe.rb +1 -1
  421. data/lib/hecks/projections/deploy/box/roll_scripts.rb +1 -1
  422. data/lib/hecks/projections/deploy/box.rb +1 -1
  423. data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +1 -1
  424. data/lib/hecks/projections/deploy/templates/lambda/Makefile.tmpl +3 -3
  425. data/lib/hecks/projections/undo.rb +46 -0
  426. data/lib/hecks/projections.rb +2 -0
  427. data/lib/hecks/projector/cli_projector/claims.rb +11 -0
  428. data/lib/hecks/projector/cli_projector/command_help.rb +6 -1
  429. data/lib/hecks/projector/cli_projector/command_specs.rb +11 -1
  430. data/lib/hecks/projector/cli_projector/completion.rb +87 -0
  431. data/lib/hecks/projector/cli_projector/everyday.rb +40 -0
  432. data/lib/hecks/projector/cli_projector/json_listing.rb +77 -0
  433. data/lib/hecks/projector/cli_projector/listing.rb +1 -1
  434. data/lib/hecks/projector/cli_projector/modules.rb +39 -0
  435. data/lib/hecks/projector/cli_projector/query_specs.rb +1 -0
  436. data/lib/hecks/projector/cli_projector/renames.rb +58 -0
  437. data/lib/hecks/projector/cli_projector/search.rb +74 -0
  438. data/lib/hecks/projector/cli_projector/usage.rb +23 -6
  439. data/lib/hecks/projector/cli_projector.rb +24 -1
  440. data/lib/hecks/quality_control/adapters/ci_head.adapter +8 -0
  441. data/lib/hecks/quality_control/adapters/image_roll.adapter +9 -0
  442. data/lib/hecks/quality_control/adapters/image_roll.rb +158 -0
  443. data/lib/hecks/quality_control/adapters/main_maintenance.adapter +8 -0
  444. data/lib/hecks/quality_control/adapters/main_maintenance.rb +275 -0
  445. data/lib/hecks/quality_control/adapters/pump_tools.adapter +7 -0
  446. data/lib/hecks/quality_control/adapters/pump_tools.rb +18 -0
  447. data/lib/hecks/quality_control/adapters/push_due_reader.adapter +8 -0
  448. data/lib/hecks/quality_control/adapters/push_due_reader.rb +99 -0
  449. data/lib/hecks/quality_control/adapters/qa_auto_mint.rb +183 -0
  450. data/lib/hecks/quality_control/adapters/qa_era_mint.rb +94 -0
  451. data/lib/hecks/quality_control/adapters/qa_quiesce_marker.rb +126 -0
  452. data/lib/hecks/quality_control/adapters/run_keys.rb +36 -0
  453. data/lib/hecks/quality_control/adapters/run_reader.adapter +7 -0
  454. data/lib/hecks/quality_control/adapters/run_reader.rb +188 -0
  455. data/lib/hecks/quality_control/cli/child.rb +1 -0
  456. data/lib/hecks/quality_control/cli/qa_discover_external_domains/scanning.rb +1 -1
  457. data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +3 -3
  458. data/lib/hecks/quality_control/cli/qa_event_pump/attached.rb +67 -0
  459. data/lib/hecks/quality_control/cli/qa_event_pump/consumer.rb +103 -0
  460. data/lib/hecks/quality_control/cli/qa_event_pump/cursors.rb +60 -0
  461. data/lib/hecks/quality_control/cli/qa_event_pump/reactions.rb +46 -0
  462. data/lib/hecks/quality_control/cli/qa_event_pump/reader.rb +30 -0
  463. data/lib/hecks/quality_control/cli/qa_event_pump.rb +76 -0
  464. data/lib/hecks/quality_control/cli/qa_fix_main_bug/publishing.rb +79 -0
  465. data/lib/hecks/quality_control/cli/qa_fix_main_bug.rb +167 -0
  466. data/lib/hecks/quality_control/cli/qa_generated_domains/evaluation.rb +1 -1
  467. data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +3 -3
  468. data/lib/hecks/quality_control/cli/qa_main_gate/gate_run.rb +52 -0
  469. data/lib/hecks/quality_control/cli/qa_main_gate/logging.rb +70 -0
  470. data/lib/hecks/quality_control/cli/qa_main_gate/shell.rb +47 -0
  471. data/lib/hecks/quality_control/cli/qa_main_gate/sweeping.rb +59 -0
  472. data/lib/hecks/quality_control/cli/qa_main_gate/worktree.rb +62 -0
  473. data/lib/hecks/quality_control/cli/qa_main_gate.rb +135 -0
  474. data/lib/hecks/quality_control/cli/qa_postgres_role.rb +1 -1
  475. data/lib/hecks/quality_control/cli/qa_pr_check/checking.rb +2 -3
  476. data/lib/hecks/quality_control/cli/qa_push_nudge.rb +48 -0
  477. data/lib/hecks/quality_control/cli/qa_seed_angles/seed.rb +1 -1
  478. data/lib/hecks/quality_control/cli/qa_sweep/seat.rb +1 -1
  479. data/lib/hecks/quality_control/cli/qa_tick/event_pump_step.rb +34 -0
  480. data/lib/hecks/quality_control/cli/qa_tick/output.rb +16 -1
  481. data/lib/hecks/quality_control/cli/qa_tick/push_nudge_step.rb +28 -0
  482. data/lib/hecks/quality_control/cli/qa_tick/quiesce_guard.rb +51 -0
  483. data/lib/hecks/quality_control/cli/qa_tick.rb +36 -8
  484. data/lib/hecks/quality_control/quality_control.behaviors +65 -0
  485. data/lib/hecks/quality_control/quality_control.bluebook +1131 -11
  486. data/lib/hecks/quality_control/quality_control.hecksagon +11 -0
  487. data/lib/hecks/quality_control/quality_control.ports.hecksagon +138 -0
  488. data/lib/hecks/query_ir/touchpoints.rb +5 -7
  489. data/lib/hecks/refused.rb +21 -0
  490. data/lib/hecks/release/approval.rb +6 -3
  491. data/lib/hecks/release/conditions.rb +46 -0
  492. data/lib/hecks/release/runner/gem_publisher.rb +4 -4
  493. data/lib/hecks/release/version_commit.rb +48 -0
  494. data/lib/hecks/runtime/command_interpreter/hydration.rb +5 -4
  495. data/lib/hecks/runtime/command_interpreter/persisting.rb +11 -3
  496. data/lib/hecks/runtime/command_interpreter.rb +2 -2
  497. data/lib/hecks/runtime/command_rules/admissibility.rb +0 -2
  498. data/lib/hecks/runtime/command_rules/emission.rb +0 -1
  499. data/lib/hecks/runtime/dependency_planning/expression_reads.rb +0 -1
  500. data/lib/hecks/runtime/dispatcher/planning.rb +24 -0
  501. data/lib/hecks/runtime/dispatcher/routing.rb +6 -0
  502. data/lib/hecks/runtime/dispatcher/value_routing.rb +54 -0
  503. data/lib/hecks/runtime/dispatcher.rb +7 -1
  504. data/lib/hecks/runtime/dry_run_plan.rb +60 -0
  505. data/lib/hecks/runtime/entity_element/location.rb +0 -1
  506. data/lib/hecks/runtime/entity_element/mutations.rb +0 -1
  507. data/lib/hecks/runtime/entity_interpreter/locating.rb +5 -0
  508. data/lib/hecks/runtime/entity_interpreter.rb +0 -1
  509. data/lib/hecks/runtime/errors.rb +26 -0
  510. data/lib/hecks/runtime/instance.rb +0 -1
  511. data/lib/hecks/runtime/invocation_builder.rb +0 -1
  512. data/lib/hecks/runtime/outbox/consumer_runner.rb +9 -1
  513. data/lib/hecks/runtime/outbox/relay.rb +25 -4
  514. data/lib/hecks/runtime/outbox/runnable.rb +3 -1
  515. data/lib/hecks/runtime/outbox.rb +6 -2
  516. data/lib/hecks/runtime/policy_interpreter/fan_out.rb +18 -2
  517. data/lib/hecks/runtime/policy_interpreter.rb +17 -9
  518. data/lib/hecks/runtime/port_operation_interpreter.rb +21 -7
  519. data/lib/hecks/runtime/query_interpreter/arguments.rb +6 -5
  520. data/lib/hecks/runtime/reaction_invocation.rb +0 -1
  521. data/lib/hecks/runtime/refusal_wording.rb +12 -1
  522. data/lib/hecks/runtime/registry/context_maps.rb +1 -5
  523. data/lib/hecks/runtime/registry/declarations.rb +34 -4
  524. data/lib/hecks/runtime/registry/hecksagon_rules.rb +15 -1
  525. data/lib/hecks/runtime/registry/runtime_state.rb +10 -0
  526. data/lib/hecks/runtime/registry/world_defaults.rb +24 -2
  527. data/lib/hecks/runtime/registry/world_names.rb +99 -0
  528. data/lib/hecks/runtime/registry.rb +33 -27
  529. data/lib/hecks/runtime/saga_interpreter/compensation.rb +10 -0
  530. data/lib/hecks/runtime/saga_interpreter/correlation.rb +29 -3
  531. data/lib/hecks/runtime/saga_interpreter/delivery.rb +0 -1
  532. data/lib/hecks/runtime/saga_interpreter/lifecycle.rb +1 -1
  533. data/lib/hecks/runtime/saga_interpreter.rb +46 -2
  534. data/lib/hecks/runtime/value/coercion.rb +36 -8
  535. data/lib/hecks/rust_build/conformance.rb +16 -5
  536. data/lib/hecks/rust_build/parser.rb +25 -0
  537. data/lib/hecks/rust_build/project_rust/codegen_run.rb +45 -12
  538. data/lib/hecks/rust_build/project_rust/declared.rb +80 -0
  539. data/lib/hecks/rust_build/project_rust/features_header.rb +22 -0
  540. data/lib/hecks/rust_build/project_rust/manifest.rb +96 -0
  541. data/lib/hecks/rust_build/project_rust/meta.rb +36 -0
  542. data/lib/hecks/rust_build/project_rust.rb +28 -90
  543. data/lib/hecks/rust_build/write_if_changed.rb +19 -4
  544. data/lib/hecks/rust_build.rb +2 -1
  545. data/lib/hecks/rust_format.rb +32 -2
  546. data/lib/hecks/secrets.rb +111 -0
  547. data/lib/hecks/shape_ledger/edge_hygiene.rb +170 -0
  548. data/lib/hecks/shape_ledger/scope.rb +51 -0
  549. data/lib/hecks/shape_ledger/status.rb +89 -0
  550. data/lib/hecks/shape_ledger.rb +78 -33
  551. data/lib/hecks/site/bluebook/site.bluebook +1 -0
  552. data/lib/hecks/storehouse/audit.rb +34 -4
  553. data/lib/hecks/storehouse/callers.rb +8 -0
  554. data/lib/hecks/storehouse/dispatching.rb +14 -3
  555. data/lib/hecks/storehouse/identity.rb +41 -0
  556. data/lib/hecks/storehouse/querying.rb +7 -7
  557. data/lib/hecks/storehouse.rb +28 -10
  558. data/lib/hecks/tickets/bluebook/adapters/work_areas.adapter +7 -0
  559. data/lib/hecks/tickets/bluebook/adapters/work_limits.adapter +7 -0
  560. data/lib/hecks/tickets/bluebook/tickets.behaviors +70 -0
  561. data/lib/hecks/tickets/bluebook/tickets.bluebook +323 -28
  562. data/lib/hecks/tickets/bluebook/tickets.hecksagon +7 -0
  563. data/lib/hecks/tickets/bluebook/tickets.ports.hecksagon +17 -0
  564. data/lib/hecks/{cli → tools}/behaviors.rb +1 -1
  565. data/lib/hecks/{cli → tools}/canonicalise.rb +1 -1
  566. data/lib/hecks/{cli → tools}/check_engine_agreement.rb +1 -1
  567. data/lib/hecks/{cli → tools}/check_era.rb +6 -6
  568. data/lib/hecks/tools/ci_gates.rb +8 -2
  569. data/lib/hecks/tools/ci_workflows.rb +98 -0
  570. data/lib/hecks/{cli → tools}/console.rb +1 -1
  571. data/lib/hecks/{cli → tools}/deploy_template_diff.rb +1 -1
  572. data/lib/hecks/{cli → tools}/doc_coverage.rb +2 -2
  573. data/lib/hecks/{cli → tools}/document.rb +1 -1
  574. data/lib/hecks/{cli → tools}/domain_stub.rb +1 -1
  575. data/lib/hecks/{cli → tools}/domain_writer.rb +1 -1
  576. data/lib/hecks/tools/downstream_model_check.rb +122 -0
  577. data/lib/hecks/tools/evolve_run.rb +2 -2
  578. data/lib/hecks/{cli → tools}/expected_era.rb +1 -1
  579. data/lib/hecks/{cli → tools}/expression_projection.rb +1 -1
  580. data/lib/hecks/{cli → tools}/follow.rb +1 -1
  581. data/lib/hecks/tools/fuzz_sweep/options.rb +40 -5
  582. data/lib/hecks/tools/fuzz_sweep/pool.rb +12 -1
  583. data/lib/hecks/tools/fuzz_sweep/shards.rb +155 -0
  584. data/lib/hecks/tools/fuzz_sweep.rb +11 -5
  585. data/lib/hecks/tools/gate.rb +38 -29
  586. data/lib/hecks/tools/gate_memo/local_files.rb +33 -0
  587. data/lib/hecks/tools/gate_memo/rehearsal.rb +54 -0
  588. data/lib/hecks/tools/gate_memo/ruby_files.rb +152 -0
  589. data/lib/hecks/tools/gate_memo/session.rb +114 -0
  590. data/lib/hecks/tools/gate_memo/standalone.rb +67 -0
  591. data/lib/hecks/tools/gate_memo.rb +196 -0
  592. data/lib/hecks/tools/gate_report.rb +56 -0
  593. data/lib/hecks/{cli → tools}/history.rb +1 -1
  594. data/lib/hecks/{cli → tools}/interview_agent.rb +1 -1
  595. data/lib/hecks/{cli → tools}/interview_aggregate.rb +1 -1
  596. data/lib/hecks/{cli → tools}/interview_draft.rb +1 -1
  597. data/lib/hecks/{cli → tools}/interview_record.rb +1 -1
  598. data/lib/hecks/{cli → tools}/interview_run.rb +2 -2
  599. data/lib/hecks/{cli → tools}/interview_session/agent_state.rb +1 -1
  600. data/lib/hecks/{cli → tools}/interview_session/catalog.rb +1 -1
  601. data/lib/hecks/{cli → tools}/interview_session/manual_findings.rb +1 -1
  602. data/lib/hecks/{cli → tools}/interview_session/proposals.rb +1 -1
  603. data/lib/hecks/{cli → tools}/interview_session.rb +2 -2
  604. data/lib/hecks/{cli → tools}/interview_shape/lifecycle.rb +1 -1
  605. data/lib/hecks/{cli → tools}/interview_shape.rb +1 -1
  606. data/lib/hecks/{cli → tools}/ir.rb +1 -1
  607. data/lib/hecks/tools/lanes/files.rb +1 -1
  608. data/lib/hecks/tools/lanes/watch_workflow.rb +6 -8
  609. data/lib/hecks/tools/lanes/workflow.rb +1 -1
  610. data/lib/hecks/tools/lanes.rb +1 -1
  611. data/lib/hecks/{cli → tools}/mcp.rb +1 -1
  612. data/lib/hecks/{cli → tools}/model_check/examination.rb +1 -1
  613. data/lib/hecks/{cli → tools}/model_check/sources.rb +1 -1
  614. data/lib/hecks/{cli → tools}/model_check.rb +1 -1
  615. data/lib/hecks/tools/move_disables/reasons.rb +35 -0
  616. data/lib/hecks/tools/move_disables.rb +211 -0
  617. data/lib/hecks/tools/move_former_name.rb +105 -0
  618. data/lib/hecks/{cli → tools}/pattern_cases.rb +1 -1
  619. data/lib/hecks/{cli → tools}/persistence_notice.rb +1 -1
  620. data/lib/hecks/{cli → tools}/present.rb +1 -1
  621. data/lib/hecks/{cli → tools}/project_cli/launcher_source.rb +32 -22
  622. data/lib/hecks/{cli → tools}/project_cli/templates.rb +22 -15
  623. data/lib/hecks/{cli → tools}/project_cli.rb +11 -7
  624. data/lib/hecks/{cli → tools}/project_diagrams.rb +3 -3
  625. data/lib/hecks/{cli → tools}/project_glossary.rb +2 -2
  626. data/lib/hecks/{cli → tools}/reference.rb +2 -2
  627. data/lib/hecks/{cli → tools}/refresh_projections.rb +1 -1
  628. data/lib/hecks/{cli → tools}/refresh_rspec_runtime_baseline.rb +1 -1
  629. data/lib/hecks/tools/regeneration_run/pool.rb +148 -0
  630. data/lib/hecks/tools/regeneration_run/scratch.rb +76 -0
  631. data/lib/hecks/tools/regeneration_run.rb +125 -103
  632. data/lib/hecks/{cli → tools}/release.rb +1 -1
  633. data/lib/hecks/{cli → tools}/release_gem.rb +1 -1
  634. data/lib/hecks/{cli → tools}/rspec_io_parallel_files.rb +1 -1
  635. data/lib/hecks/{cli → tools}/rspec_shard_files.rb +1 -1
  636. data/lib/hecks/{cli → tools}/run.rb +9 -2
  637. data/lib/hecks/{cli → tools}/run_expectations.rb +1 -1
  638. data/lib/hecks/{cli → tools}/seed_semantics_corpus.rb +4 -4
  639. data/lib/hecks/{cli → tools}/serve_query_ir_mcp.rb +1 -1
  640. data/lib/hecks/{cli → tools}/shape.rb +3 -2
  641. data/lib/hecks/{cli → tools}/smoke_http/checks.rb +1 -1
  642. data/lib/hecks/{cli → tools}/smoke_http/settings.rb +1 -1
  643. data/lib/hecks/{cli → tools}/smoke_http/transport.rb +1 -1
  644. data/lib/hecks/{cli → tools}/smoke_http.rb +1 -1
  645. data/lib/hecks/{cli → tools}/smoke_test.rb +1 -1
  646. data/lib/hecks/{cli → tools}/spec_example.rb +1 -1
  647. data/lib/hecks/tools/stage_progress.rb +54 -0
  648. data/lib/hecks/{cli → tools}/statements.rb +1 -1
  649. data/lib/hecks/{cli → tools}/stores.rb +1 -1
  650. data/lib/hecks/{cli → tools}/stress_concurrency_specs/reporting.rb +1 -1
  651. data/lib/hecks/{cli → tools}/stress_concurrency_specs/usage.rb +4 -4
  652. data/lib/hecks/{cli → tools}/stress_concurrency_specs.rb +3 -3
  653. data/lib/hecks/tools/tenant_provisioning.rb +23 -0
  654. data/lib/hecks/tools/tools_doc.rb +10 -8
  655. data/lib/hecks/tools/translation_audit/edges.rb +21 -16
  656. data/lib/hecks/tools/translation_audit/verdicts.rb +1 -1
  657. data/lib/hecks/tools/translation_audit.rb +1 -1
  658. data/lib/hecks/tools/translation_scaffold.rb +1 -1
  659. data/lib/hecks/tools.rb +4 -1
  660. data/lib/hecks/version.rb +1 -1
  661. data/lib/hecks/vocabulary.rb +61 -31
  662. data/lib/hecks/workflow_pagination/judge.rb +48 -0
  663. data/lib/hecks/workflow_pagination/statement.rb +50 -0
  664. data/lib/hecks/workflow_pagination.rb +58 -0
  665. data/lib/hecks.rb +2 -0
  666. data/lib/rubocop/cop/hecks/bare_event_and_query_names.rb +58 -0
  667. data/lib/rubocop/cop/hecks/correlates_by_aggregate.rb +39 -0
  668. data/lib/rubocop/cop/hecks/creating_command_sets.rb +75 -0
  669. data/lib/rubocop/cop/hecks/invariant_expression_language.rb +47 -0
  670. data/lib/rubocop/cop/hecks/lifecycle_needs_attribute.rb +58 -0
  671. data/lib/rubocop/cop/hecks/no_id_string_attribute.rb +49 -0
  672. data/lib/rubocop/cop/hecks/one_terminal_mark_per_lifecycle.rb +47 -0
  673. data/lib/rubocop/cop/hecks/value_object_shorthand.rb +56 -0
  674. data/prebuilt/13c04bdc5970295b310f0a980d397ba722232c8da99cc1a0cdb383249921e871.marshal +0 -0
  675. data/prebuilt/e3857b77f47d9ecc1787b2e1f5136364f3cb3444ef4aea5479f3b98167affea2.marshal +0 -0
  676. data/qa/settings.yml +23 -0
  677. data/rust/.gitignore +0 -6
  678. data/rust/Cargo.toml +2 -1
  679. data/rust/build/Cargo.toml +1 -1
  680. data/rust/build/src/binding_pass.rs +57 -4
  681. data/rust/build/src/pipeline.rs +6 -4
  682. data/rust/build/src/resolve.rs +1 -0
  683. data/rust/codegen/Cargo.toml +1 -1
  684. data/rust/codegen/src/domain_generator.rs +3 -0
  685. data/rust/codegen/src/json_codec.rs +182 -23
  686. data/rust/codegen/src/one_of_references.rs +1 -0
  687. data/rust/codegen/src/queries.rs +20 -2
  688. data/rust/codegen/src/registry.rs +21 -5
  689. data/rust/expr/Cargo.toml +1 -1
  690. data/rust/host/Cargo.toml +1 -1
  691. data/rust/host/HECKS_RELEASE +1 -1
  692. data/rust/host/core/Cargo.toml +1 -1
  693. data/rust/host/src/bin/mint_harness.rs +1 -0
  694. data/rust/host/src/boot.rs +1 -0
  695. data/rust/host/src/store/mint.rs +40 -6
  696. data/rust/lsp/Cargo.toml +1 -1
  697. data/rust/parser/Cargo.toml +1 -1
  698. data/rust/parser/src/build/correlation_keys.rs +125 -0
  699. data/rust/parser/src/build/mod.rs +1 -0
  700. data/rust/parser/src/emit.rs +55 -3
  701. data/rust/parser/src/ir.rs +33 -1
  702. data/rust/parser/src/keywords.rs +289 -1
  703. data/rust/parser/src/main.rs +2 -0
  704. data/rust/parser/src/parse/aggregate.rs +10 -1
  705. data/rust/parser/src/parse/audience.rs +65 -0
  706. data/rust/parser/src/parse/command.rs +14 -0
  707. data/rust/parser/src/parse/declaration.rs +97 -0
  708. data/rust/parser/src/parse/domain_port.rs +6 -0
  709. data/rust/parser/src/parse/mod.rs +1 -0
  710. data/rust/parser/src/parse/process_manager.rs +17 -10
  711. data/rust/parser/src/parse/world.rs +12 -8
  712. data/rust/parser/src/render_ruby.rs +9 -0
  713. data/rust/parser/src/sentence/format.rs +3 -0
  714. data/rust/parser/src/sentence/process.rs +6 -2
  715. data/rust/src/exemplar/json.rs +17 -0
  716. data/rust/src/kernel/cli.rs +27 -3
  717. data/rust/src/kernel/dispatch.rs +4 -2
  718. data/rust/src/kernel/json.rs +62 -0
  719. data/rust/src/kernel/orchestrate.rs +28 -3
  720. data/rust/src/kernel/orchestrate_guard_tests.rs +12 -12
  721. data/rust/web/Cargo.toml +1 -1
  722. metadata +389 -96
  723. data/lib/hecks/cli/command_table.rb +0 -72
  724. data/lib/hecks/cli/launcher_words.rb +0 -168
  725. data/lib/hecks/cli.rb +0 -133
  726. data/lib/hecks/hecks/agents.bluebook +0 -246
  727. data/lib/hecks/hecks/codebase.bluebook +0 -3209
  728. data/lib/hecks/hecks/custodian.bluebook +0 -1300
  729. data/lib/hecks/hecks/ledger.bluebook +0 -190
  730. data/lib/hecks/hecks/rehearsal.bluebook +0 -437
  731. data/lib/hecks/hecks/tooling.bluebook +0 -1234
  732. data/lib/hecks/hecks/translations/2-148748.bluebook +0 -2
  733. data/lib/hecks/hecks/translations/2-15a2e4.bluebook +0 -2
  734. data/lib/hecks/hecks/translations/2-1b447c.bluebook +0 -5
  735. data/lib/hecks/hecks/translations/2-240474.bluebook +0 -2
  736. data/lib/hecks/hecks/translations/2-44446d.bluebook +0 -2
  737. data/lib/hecks/hecks/translations/2-46ca26.bluebook +0 -2
  738. data/lib/hecks/hecks/translations/2-473eab.bluebook +0 -2
  739. data/lib/hecks/hecks/translations/2-75cc28.bluebook +0 -2
  740. data/lib/hecks/hecks/translations/2-781c07.bluebook +0 -2
  741. data/lib/hecks/hecks/translations/2-84c18b.bluebook +0 -2
  742. data/lib/hecks/hecks/translations/2-aa5fff.bluebook +0 -2
  743. data/lib/hecks/hecks/translations/2-bfdb48.bluebook +0 -2
  744. data/lib/hecks/hecks/translations/2-cd96d8.bluebook +0 -10
  745. data/lib/hecks/hecks/translations/2-d43f71.bluebook +0 -2
  746. data/lib/hecks/hecks/translations/2-eea577.bluebook +0 -2
  747. data/lib/hecks/hecks/translations/2-f53248.bluebook +0 -2
  748. data/lib/hecks/hecks/translations/2-fbb677.bluebook +0 -2
  749. data/lib/hecks/hecks/translations/2-ffdf12.bluebook +0 -6
  750. data/lib/hecks/quality_control/adapters/clearance_recorder.rb +0 -36
  751. data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +0 -56
  752. data/prebuilt/31cf81e12f16236ad26249be590cfea3799c9db67432e6a4ef54b801c355b6ae.marshal +0 -0
  753. data/prebuilt/68ecb2bd3abb1a221007db4f2b0375834c13aaccac8f2b99778e8517f11aa113.marshal +0 -0
  754. data/prebuilt/verdicts-0328c2403383837d780ad5ed81d1da351c56436b894cf9015b5d56b8f1f1bf10.json +0 -1
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "context_line"
4
+ require_relative "../driven/worktree_overlay"
5
+
6
+ module Hecks
7
+ module Adapters
8
+ module Driving
9
+ # Refuses a write from a linked worktree whose bluebook would store in Memory there while the
10
+ # main checkout stores it elsewhere. It asks the same overlay question the worktree warning
11
+ # asks (WorktreeOverlay.gap), and reads stores the way `hecks config` does, so the refusal
12
+ # and the warning cannot disagree about what is missing.
13
+ module WriteGuard
14
+ module_function
15
+
16
+ # @param directory [String] the checkout the command runs in
17
+ # @param bluebook [String, nil] the bluebook the command belongs to
18
+ # @param stores [#call] answers the store rows of a directory
19
+ # @return [String, nil] the refusal, or nil when the write may proceed
20
+ def refusal(directory, bluebook, stores: STORES)
21
+ return unless bluebook
22
+
23
+ main, files = WorktreeOverlay.gap(directory)
24
+ return if files.empty?
25
+
26
+ main_kind = kind_in(stores.call(main), bluebook)
27
+ return if main_kind == ContextLine::MEMORY || main_kind == kind_in(stores.call(directory), bluebook)
28
+
29
+ message(bluebook, main_kind, files)
30
+ end
31
+
32
+ # @param rows [Array<Array(String, String, String)>] store rows
33
+ # @param bluebook [String]
34
+ # @return [String] the kind of store the bluebook uses, Memory when it has none of its own
35
+ def kind_in(rows, bluebook)
36
+ row = rows.find { |label, _value, _source| label == "store #{bluebook}" }
37
+ ContextLine.kind(row ? row[1] : ContextLine::MEMORY)
38
+ end
39
+
40
+ # @return [String] the refusal naming the bluebook, the store and the missing files
41
+ def message(bluebook, main_kind, files)
42
+ "hecks: refused: #{bluebook} stores in #{main_kind} in the main checkout, and this worktree " \
43
+ "lacks #{files.join(", ")}, so the write would land in Memory here. " \
44
+ "Run the command from the main checkout."
45
+ end
46
+
47
+ # Answers the store rows of a directory, through the adapter `hecks config` uses.
48
+ STORES = lambda do |directory|
49
+ require_relative "../../hecks/adapters/settings_reading"
50
+ Hecks::Adapters::SettingsReading.new.stores(directory)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -10,7 +10,6 @@ module Hecks
10
10
  # A constant owned by user code or the stdlib is left alone with a warning.
11
11
  module Namespace
12
12
  # A live registry, mutated by `install`, so it cannot be frozen.
13
- # rubocop:disable-next Style/MutableConstant
14
13
  GENERATED = {}
15
14
 
16
15
  module_function
@@ -1,4 +1,5 @@
1
1
  require_relative "ir"
2
+ require_relative "../module_folders"
2
3
 
3
4
  # The authoring surface for `Hecks.behaviors "Name" do ... end`, built with `instance_eval`.
4
5
  module Hecks
@@ -132,9 +133,12 @@ module Hecks
132
133
  #
133
134
  # @param paths [Array<String>] paths to the files this suite's domain boots
134
135
  # from, relative to the `.behaviors` file
136
+ # @param modules [Symbol, nil] `:all` adds the bluebook of every module folder beside the
137
+ # `.behaviors` file (see ModuleFolders)
135
138
  # @return [void]
136
- def loads(*paths)
139
+ def loads(*paths, modules: nil)
137
140
  @loads = paths.map { |path| File.expand_path(path, @source_dir) }
141
+ @loads.concat(ModuleFolders.bluebooks(@source_dir)) if modules == :all
138
142
  end
139
143
 
140
144
  # Builds and records one test case.
@@ -12,7 +12,6 @@ module Hecks
12
12
  # Cached per suite, keyed by `loads`' file paths and mtimes, so a boot is
13
13
  # reused across tests but an edited bluebook boots fresh on the next one.
14
14
  # Mutated in place (`RUNTIMES[key] ||= boot_and_guard(files)`).
15
- # rubocop:disable-next Style/MutableConstant
16
15
  RUNTIMES = {}
17
16
  RUNTIMES_LOCK = Mutex.new
18
17
  private_constant :RUNTIMES, :RUNTIMES_LOCK
@@ -4,7 +4,7 @@ module Hecks
4
4
  # reason, and a kind the check really emits (ADR 0150).
5
5
  module Acknowledgements
6
6
  # The finding kinds an aggregate may acknowledge.
7
- AGGREGATE_KINDS = %i[large_aggregate key_by_value orphaned_reference].freeze
7
+ AGGREGATE_KINDS = %i[large_aggregate key_by_value orphaned_reference no_command_surface].freeze
8
8
 
9
9
  # The kinds that are reported once per attribute or per referenced aggregate, so an
10
10
  # acknowledgement of one names which (`of:`): the attribute for `key_by_value`, the
@@ -20,44 +20,47 @@ module Hecks
20
20
  include Behaviour::Aggregate
21
21
 
22
22
  emits_ir(
23
- name: :name,
24
- description: :description,
25
- identified_by: :identity_paths,
26
- attributes: many(:attributes),
27
- value_objects: many(:value_objects),
28
- commands: many(:commands),
29
- invariants: -> { invariants.map { |rule| Expression::AstJson.rule_row(rule) } },
23
+ name: :name,
24
+ description: :description,
25
+ identified_by: :identity_paths,
26
+ attributes: many(:attributes),
27
+ value_objects: many(:value_objects),
28
+ commands: many(:commands),
29
+ invariants: -> { invariants.map { |rule| Expression::AstJson.rule_row(rule) } },
30
30
  # The named `given`s a referencing command's resolved `givens` entry came from.
31
- preconditions: -> { preconditions.map { |rule| Expression::AstJson.rule_row(rule) } },
31
+ preconditions: -> { preconditions.map { |rule| Expression::AstJson.rule_row(rule) } },
32
32
  # Not folded into `attributes`: EraGuard::ShapeDiff walks those, and a record predating
33
33
  # `projects` is expected to lack this field until the rebuild sweep runs.
34
- projected_fields: lambda {
34
+ projected_fields: lambda {
35
35
  projected_fields.map do |field|
36
36
  { name: field.name.to_s, reference: field.reference.to_s, remote_field: field.remote_field.to_s }
37
37
  end
38
38
  },
39
- lifecycle: one(:lifecycle),
40
- entities: many(:entities),
41
- queries: many(:queries),
39
+ lifecycle: one(:lifecycle),
40
+ entities: many(:entities),
41
+ queries: many(:queries),
42
42
  # Additive: domains that declare no port emit `ports: []`; no existing key moves.
43
- ports: many(:ports),
44
- provenance: :provenance,
43
+ ports: many(:ports),
44
+ provenance: :provenance,
45
+ formerly_known_as: :formerly_known_as,
46
+ created_by: :created_by,
45
47
  # Additive: an aggregate that acknowledges no finding emits `acknowledgements: []`.
46
- acknowledgements: lambda {
47
- acknowledgements.map { |held| { finding: held.finding.to_s, subject: held.subject.to_s, reason: held.reason } }
48
+ acknowledgements: lambda {
49
+ acknowledgements.map { |held| { finding: held.finding.to_s, subject: held.subject, reason: held.reason } }
48
50
  }
49
51
  )
50
52
 
51
53
  attr_reader :name, :description, :attributes, :value_objects, :commands, :invariants, :preconditions,
52
54
  :projected_fields, :identified_by, :identity_paths, :identity_heads, :lifecycle,
53
55
  :entities, :queries, :policies, :ports, :reference_targets, :provenance,
54
- :acknowledgements
56
+ :acknowledgements, :formerly_known_as, :created_by
55
57
 
56
58
  # Every optional field and what it holds when the declaration omits it.
57
59
  FIELD_DEFAULTS = {
58
60
  description: nil, attributes: [], value_objects: [], commands: [], invariants: [],
59
61
  preconditions: [], projected_fields: [], identified_by: [], lifecycle: nil, entities: [],
60
- queries: [], policies: [], ports: [], reference_targets: [], provenance: nil, acknowledgements: []
62
+ queries: [], policies: [], ports: [], reference_targets: [], provenance: nil, acknowledgements: [],
63
+ formerly_known_as: nil, created_by: nil
61
64
  }.freeze
62
65
 
63
66
  # Assigns the declared fields, then `settle` derives identity, name indexes and owner stamps.
@@ -13,6 +13,8 @@ module Hecks
13
13
  correlates_by: [:correlates_by, :identity],
14
14
  starts_on: [:starts_on, :plain],
15
15
  ends_on: [:ends_on, :plain],
16
+ endings: [:endings, :plain],
17
+ resumes: [:resumes, :plain],
16
18
  states: [:states, :plain]
17
19
  },
18
20
  reads: { states: :names },
@@ -14,7 +14,8 @@ module Hecks
14
14
  formerly_known_as: [:formerly_known_as, :plain],
15
15
  namespace: [:namespace, :plain],
16
16
  attaches_to: [:attaches_to, :plain],
17
- provides: [:provides, :plain]
17
+ provides: [:provides, :plain],
18
+ modules: [:modules, :plain]
18
19
  },
19
20
  rows: { normalisations: :normalisation_table },
20
21
  derived: { normalisations: :elsewhere }
@@ -23,17 +24,19 @@ module Hecks
23
24
  "Aggregate" => Contract.new(
24
25
  holder: Aggregate, make: :new,
25
26
  fields: {
26
- name: [:name, :plain],
27
- description: [:description, :plain],
28
- identified_by: [:identified_by, :plain],
29
- attributes: [:attributes, [:each, :attribute]],
27
+ name: [:name, :plain],
28
+ description: [:description, :plain],
29
+ identified_by: [:identified_by, :plain],
30
+ attributes: [:attributes, [:each, :attribute]],
30
31
  # Aggregate's own precondition, referenced by name from a command (ADR 0025).
31
- invariants: [:invariants, [:each, :invariant]],
32
- preconditions: [:preconditions, [:each, :given]],
32
+ invariants: [:invariants, [:each, :invariant]],
33
+ preconditions: [:preconditions, [:each, :given]],
33
34
  # The local half of `projects :name, from: "reference.remote_field"` (ADR 0025).
34
- projected_fields: [:projected_fields, [:each, :projected_field]],
35
- provenance: [:provenance, :plain],
36
- acknowledgements: [:acknowledgements, [:each, :acknowledgement]]
35
+ projected_fields: [:projected_fields, [:each, :projected_field]],
36
+ provenance: [:provenance, :plain],
37
+ formerly_known_as: [:formerly_known_as, :plain],
38
+ created_by: [:created_by, :plain],
39
+ acknowledgements: [:acknowledgements, [:each, :acknowledgement]]
37
40
  },
38
41
  rows: { transitions: :transition_rows, marks: :mark_rows, value_objects: :value_object_names,
39
42
  identified_by: :identity_rows },
@@ -56,6 +59,7 @@ module Hecks
56
59
  name: [:name, :plain],
57
60
  role: [:role, :plain],
58
61
  roles: [:roles, :plain],
62
+ audience: [:audience, :plain],
59
63
  goal: [:goal, :plain],
60
64
  references: [:references, :plain],
61
65
  attributes: [:attributes, [:each, :shape_field]],
@@ -67,13 +71,14 @@ module Hecks
67
71
  # Lifecycle state as a command guard: one state, an array, or nil (ADR 0025).
68
72
  from: [:from, :plain],
69
73
  provenance: [:provenance, :plain],
70
- idempotent: [:idempotent, :plain]
74
+ idempotent: [:idempotent, :plain],
75
+ mints_era: [:mints_era, :plain]
71
76
  },
72
77
  rows: { mutations: :mutation_rows },
73
78
  reads: { attributes: [:each, :shape_field], givens: [:each, :rule], ensures: [:each, :rule],
74
- needs: [:each, :need], mutations: [:call, :mutations], emits: :names, roles: :names,
79
+ needs: [:each, :need], mutations: [:call, :mutations], emits: :names, roles: :names, audience: :names,
75
80
  provenance: :provenance,
76
- from: :from, idempotent: :idempotent? },
81
+ from: :from, idempotent: :idempotent?, mints_era: :mints_era? },
77
82
  derived: { position: :walk }
78
83
  ),
79
84
 
@@ -112,11 +112,35 @@ module Hecks
112
112
  @ports_by_name[port.name] = port
113
113
  end
114
114
 
115
+ # The physical name the world gives this aggregate (`stored_as Revision: "commit"`), set
116
+ # when a registry applies its world's names. Nothing in the bluebook sets it.
117
+ attr_writer :stored_as, :prior_storage_names
118
+
115
119
  # Names the table, file or key persistence adapters store this aggregate
116
- # under.
120
+ # under. A renamed aggregate keeps the name its rows were written under, so
121
+ # its stored records stay where they are.
122
+ #
123
+ # @return [String] the world's `stored_as` when it gives one, else the former name from
124
+ # `formerly_known_as` when the bluebook declares one, else the aggregate's own name,
125
+ # snake-cased
126
+ def storage_name = Naming.snake(@stored_as || former_name || @name)
127
+
128
+ # The physical names this aggregate's rows may sit under from an earlier name: its
129
+ # `formerly_known_as` and every name a translation edge renames it from. An adapter
130
+ # that finds rows under one while its own table is empty refuses instead of beginning anew.
117
131
  #
118
- # @return [String] the aggregate's name, snake-cased
119
- def storage_name = Naming.snake(@name)
132
+ # @return [Array<String>] snake-cased names other than the current storage name
133
+ def prior_storage_names = (@prior_storage_names || []).map { |name| Naming.snake(name) } - [storage_name]
134
+
135
+ # The name this aggregate carried before its rename, from `formerly_known_as`.
136
+ #
137
+ # @return [String, nil] the former name, or nil when the aggregate was never renamed
138
+ def former_name
139
+ held = formerly_known_as
140
+ return nil if held.nil?
141
+
142
+ (held.respond_to?(:value) ? held.value : held).to_s
143
+ end
120
144
  end
121
145
  end
122
146
  end
@@ -52,6 +52,8 @@ module Hecks
52
52
  role: :role,
53
53
  # Every role that may run the command, when more than one may; `role` is then the first.
54
54
  roles: -> { roles.size > 1 ? roles : Hecks::IR::OMIT },
55
+ # Who a launcher lists the command for; absent when the command declares none.
56
+ audience: -> { audience.empty? ? Hecks::IR::OMIT : audience },
55
57
  goal: :goal,
56
58
  references: :references,
57
59
  attributes: many(:attributes),
@@ -64,29 +66,38 @@ module Hecks
64
66
  from: -> { from },
65
67
  provenance: :provenance,
66
68
  # Safe to deliver twice; the saga redrive reads it for a dispatch left unsettled.
67
- idempotent: -> { idempotent? }
69
+ idempotent: -> { idempotent? },
70
+ # Lets this command's own record through a boot whose shape no era holds yet.
71
+ mints_era: -> { mints_era? }
68
72
  )
69
73
 
70
74
  # Every optional declared field and what it holds when the declaration omits it.
71
75
  FIELD_DEFAULTS = {
72
- role: nil, roles: [], goal: nil, attributes: [], givens: [], ensures: [], needs: [],
73
- mutations: [], emits: [], references: nil, from: nil, provenance: nil, idempotent: false
76
+ role: nil, roles: [], audience: [], goal: nil, attributes: [], givens: [], ensures: [], needs: [],
77
+ mutations: [], emits: [], references: nil, from: nil, provenance: nil, idempotent: false,
78
+ mints_era: false
74
79
  }.freeze
75
80
 
76
81
  class << self
77
82
  attr_reader :role, :goal, :attributes, :givens, :ensures, :needs, :mutations, :emits, :references,
78
- :from, :provenance, :idempotent
83
+ :from, :provenance, :idempotent, :mints_era
79
84
 
80
85
  # @return [Boolean] whether a second delivery leaves the state a first one did
81
86
  def idempotent? = @idempotent ? true : false
82
87
 
88
+ # @return [Boolean] whether this command's own record may be written through an unminted boot
89
+ def mints_era? = @mints_era ? true : false
90
+
83
91
  # @return [Array<String>] every role that may run it when more than one may, else empty
84
92
  def roles = @roles || []
85
93
 
94
+ # @return [Array<String>] who a launcher lists it for, else empty (a person and an agent)
95
+ def audience = @audience || []
96
+
86
97
  # Mints one command as its own anonymous subclass of the class `declare` is called on.
87
98
  #
88
99
  # @param name [String, Symbol] the command's declared name
89
- # @param role [String, nil] the declared role; `roles` all of them when several may run it
100
+ # @param role [String, nil] the declared role; `roles` all of them, `audience` who it is listed for
90
101
  # @param attributes [Array<Bluebook::Attribute>] the declared arguments
91
102
  # @param givens [Array<Bluebook::Given>] the declared preconditions
92
103
  # @param ensures [Array<Bluebook::Given>] the postconditions; `needs` the facts it supplies
@@ -36,6 +36,9 @@ module Hecks
36
36
  # One row per declared `provides` capability, in declaration order;
37
37
  # present (possibly empty) like `attaches_to`.
38
38
  provides: -> { provides.map(&:to_h) },
39
+ # One row per aggregate a module groups, in declaration order; left out when the bluebook
40
+ # declares no module, so a bluebook that never groups emits as it did.
41
+ modules: -> { modules.empty? ? Hecks::IR::OMIT : modules.map(&:to_h) },
39
42
  canonical_form: -> { Expression::CanonicalForm.table }
40
43
  )
41
44
 
@@ -56,14 +59,32 @@ module Hecks
56
59
  end
57
60
  end
58
61
 
62
+ # One aggregate's membership of a module: the module's name and vision, and the aggregate.
63
+ ModuleRow = Struct.new(:name, :vision, :aggregate, keyword_init: true) do
64
+ # Coerces one declared or reconstructed module row into a `ModuleRow`.
65
+ #
66
+ # @param row [Bluebook::Declaration::ModuleRow, #to_h] a `ModuleRow` already, or anything
67
+ # answering `to_h` with `name`/`vision`/`aggregate` entries
68
+ # @return [Bluebook::Declaration::ModuleRow] `row` itself if it already is one, else a new one
69
+ def self.from(row)
70
+ return row if row.is_a?(self)
71
+
72
+ fields = row.to_h.transform_keys(&:to_sym)
73
+ new(name: fields[:name].to_s, vision: fields[:vision].to_s, aggregate: fields[:aggregate].to_s)
74
+ end
75
+ end
76
+
77
+ attr_accessor :formerly_known_as
78
+
59
79
  attr_reader :name, :version, :vision, :aggregates, :policies, :process_managers,
60
- :classification, :read_models, :ports, :formerly_known_as, :namespace, :attaches_to, :provides
80
+ :classification, :read_models, :ports, :namespace, :attaches_to, :provides,
81
+ :modules
61
82
 
62
83
  # Every optional field and what it holds when the declaration omits it.
63
84
  FIELD_DEFAULTS = {
64
85
  version: nil, vision: nil, aggregates: [], policies: [], process_managers: [],
65
86
  classification: nil, read_models: [], formerly_known_as: nil, namespace: nil,
66
- attaches_to: [], provides: []
87
+ attaches_to: [], provides: [], modules: []
67
88
  }.freeze
68
89
 
69
90
  # @param policies [Array<Bluebook::Policy>] every reaction declared across the
@@ -85,10 +106,17 @@ module Hecks
85
106
  @classification = @classification&.to_s
86
107
  @formerly_known_as = @formerly_known_as&.to_s
87
108
  @namespace = @namespace&.to_s
88
- @attaches_to = Array(@attaches_to).map(&:to_s)
89
- @provides = Array(@provides).map { |row| Provision.from(row) }
109
+ coerce_rows
90
110
  end
91
111
  private :coerce_fields
112
+
113
+ # Holds every row-valued field as the rows its reader answers.
114
+ def coerce_rows
115
+ @attaches_to = Array(@attaches_to).map(&:to_s)
116
+ @provides = Array(@provides).map { |row| Provision.from(row) }
117
+ @modules = Array(@modules).map { |row| ModuleRow.from(row) }
118
+ end
119
+ private :coerce_rows
92
120
  end
93
121
  end
94
122
  end
@@ -10,9 +10,12 @@ module Hecks
10
10
  include Hecks::IR
11
11
  include Behaviour::PortOperation
12
12
 
13
- emits_ir(name: :hecks_name, attributes: many(:attributes), emits: :emits)
13
+ emits_ir(
14
+ name: :hecks_name, attributes: many(:attributes), emits: :emits,
15
+ handles: -> { handles.map { |held| { command: held[:command], value: held[:value] } } }
16
+ )
14
17
 
15
- attr_reader :hecks_name, :attributes, :emits, :direction, :answers, :refuses, :to
18
+ attr_reader :hecks_name, :attributes, :emits, :direction, :answers, :refuses, :to, :handles
16
19
 
17
20
  # Marks this operation as the one the hecksagon picks (`ask_via`) when its ask name is
18
21
  # declared on more than one port of the aggregate.
@@ -29,7 +32,8 @@ module Hecks
29
32
  #
30
33
  # Every optional keyword and what it holds when the declaration omits it.
31
34
  FIELD_DEFAULTS = {
32
- attributes: [], emits: [], direction: :inbound, answers: nil, refuses: nil, to: nil, chosen: false
35
+ attributes: [], emits: [], direction: :inbound, answers: nil, refuses: nil, to: nil, chosen: false,
36
+ handles: []
33
37
  }.freeze
34
38
 
35
39
  # @param name [String, Symbol] the operation's declared name
@@ -65,7 +65,6 @@ module Hecks
65
65
 
66
66
  # `has_many_impl`/`has_one_impl` are DSL keywords (`has_many`/`has_one` in a bluebook),
67
67
  # not real predicates, so Naming/PredicatePrefix does not apply here.
68
- # rubocop:disable Naming/PredicatePrefix
69
68
 
70
69
  # Declares a list-typed relationship to another aggregate, referenced by its plural name.
71
70
  #
@@ -105,7 +104,6 @@ module Hecks
105
104
  relationship_attribute(target, :has_one, as || Naming.snake(target).to_sym,
106
105
  optional: optional)
107
106
  end
108
- # rubocop:enable Naming/PredicatePrefix
109
107
 
110
108
  # Declares a single-valued relationship toward the aggregate that owns this one.
111
109
  #
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hecks
4
+ module Bluebook
5
+ module DSL
6
+ class AggregateBuilder
7
+ # The names an aggregate keeps: the name it held before a rename, which keeps the old name
8
+ # resolving, and the command that creates its records, which a missing-record refusal names.
9
+ module Renaming
10
+ # @param value [Object] the name the aggregate held before, as the attribute types it
11
+ # @return [Object] the old name as stored
12
+ def formerly_known_as_impl(value)
13
+ @formerly_known_as = value
14
+ end
15
+
16
+ # @param value [Object] the command's name, as the bluebook writes it (e.g. "Adr.draft!")
17
+ # @return [Object] the command name as stored
18
+ def created_by_impl(value)
19
+ @created_by = value
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -4,6 +4,7 @@ require_relative "aggregate_builder/relationships"
4
4
  require_relative "aggregate_builder/one_of_reference"
5
5
  require_relative "aggregate_builder/rules"
6
6
  require_relative "aggregate_builder/draining"
7
+ require_relative "aggregate_builder/renaming"
7
8
  module Hecks
8
9
  module Bluebook
9
10
  module DSL
@@ -17,6 +18,7 @@ module Hecks
17
18
  include RuleReference
18
19
  include WordGate
19
20
  include Sealing
21
+ include Renaming
20
22
  include OneOfReference
21
23
 
22
24
  # @param name [String] the aggregate's name, as written after `aggregate`
@@ -177,6 +179,7 @@ module Hecks
177
179
  { name: @name, description: @description, attributes: attributes,
178
180
  value_objects: @value_objects + closed_sets, identified_by: @identity_paths,
179
181
  lifecycle: @lifecycle, entities: @entities, provenance: @provenance,
182
+ formerly_known_as: @formerly_known_as, created_by: @created_by,
180
183
  acknowledgements: @acknowledgements }
181
184
  end
182
185
 
@@ -10,7 +10,6 @@ module Hecks
10
10
 
11
11
  ListOf = Struct.new(:type)
12
12
  # `:values` shadows Struct#values so the accessor returns the flat permitted-value array.
13
- # rubocop:disable-next Lint/StructNewOverride
14
13
  OneOf = Struct.new(:values)
15
14
 
16
15
  UNSET = Object.new.freeze
@@ -0,0 +1,40 @@
1
+ module Hecks
2
+ module Bluebook
3
+ module DSL
4
+ # The `audience` word of a command: who a launcher lists it for (ADR 0163). It decides
5
+ # listing only; the role still decides who may run the command. The including builder holds
6
+ # `@name`.
7
+ module AudienceWord
8
+ # The audiences a command may be listed for: a person at a keyboard, an agent through the
9
+ # MCP door, a CI step, or the run's own bookkeeping.
10
+ AUDIENCES = %w[person agent ci record].freeze
11
+
12
+ # Names who a launcher lists the command for.
13
+ #
14
+ # @param values [Array<Symbol, String>] one or several of `AUDIENCES`
15
+ # @return [Array<String>] the audience as stored
16
+ # @raise [Bluebook::DSL::Malformed] if one is already declared, one is not an audience, or
17
+ # one is named twice
18
+ def audience_impl(*values)
19
+ names = values.map(&:to_s)
20
+ raise Malformed, "#{@name} declares its audience twice" if @audience
21
+ raise Malformed, audience_problem(names) if audience_problem(names)
22
+
23
+ @audience = names
24
+ end
25
+
26
+ private
27
+
28
+ # Why an audience declaration is refused, or nil when every name is an audience named once.
29
+ def audience_problem(names)
30
+ return "#{@name} names no audience" if names.empty?
31
+
32
+ unknown = names - AUDIENCES
33
+ return "#{@name} names #{unknown.join(", ")} as an audience; the audiences are #{AUDIENCES.join(", ")}" if unknown.any?
34
+
35
+ "#{@name} names an audience twice" if names.uniq.size != names.size
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,56 @@
1
+ module Hecks
2
+ module Bluebook
3
+ module DSL
4
+ class BluebookBuilder
5
+ # The words that describe the whole bluebook rather than one construct in it: its earlier
6
+ # name, the Ruby module its constants install under, and its classification. Each refuses
7
+ # to sit inside a `domain_module` block, since a module names a task, not the bluebook.
8
+ module Metadata
9
+ # Records the bluebook's earlier name, so the storage layer recognizes its history
10
+ # under it instead of minting a new lineage — a bluebook's identity can change.
11
+ #
12
+ # @param value [String, Symbol] the bluebook's earlier name
13
+ # @return [String] `value`, stringified, as stored
14
+ def formerly_known_as(value)
15
+ bluebook_wide!(:formerly_known_as)
16
+ @formerly_known_as = value.to_s
17
+ end
18
+
19
+ # Names the Ruby module the bluebook's constants install under instead of its own name,
20
+ # such as `namespace "Hecks::Domain"` for a bluebook that would otherwise collide.
21
+ #
22
+ # @param value [String] a constant path, such as `"Hecks::Domain"`
23
+ # @return [String] `value`, stringified, as stored
24
+ def namespace(value)
25
+ bluebook_wide!(:namespace)
26
+ @namespace = value.to_s
27
+ end
28
+
29
+ # Classifies this bluebook as core to the framework, rather than a domain built on it.
30
+ #
31
+ # @return [Symbol] `:core`
32
+ def core = classify(:core)
33
+
34
+ # Classifies this bluebook as a supporting piece of the framework, rather than a domain
35
+ # built on it.
36
+ #
37
+ # @return [Symbol] `:supporting`
38
+ def supporting = classify(:supporting)
39
+
40
+ # Classifies this bluebook as generic infrastructure, rather than a domain built on it.
41
+ #
42
+ # @return [Symbol] `:generic`
43
+ def generic = classify(:generic)
44
+
45
+ private
46
+
47
+ # Sets how this bluebook is classified, which describes the whole of it.
48
+ def classify(kind)
49
+ bluebook_wide!(kind)
50
+ @classification = kind
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end