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
@@ -24,6 +24,8 @@ pub struct Options {
24
24
 
25
25
  struct Declaration {
26
26
  mod_name: String,
27
+ // The bluebook's own name, as `hecks project_rust` labels it: whoever attached it, its files
28
+ // read the same.
27
29
  source_label: String,
28
30
  ir_text: String,
29
31
  }
@@ -146,7 +148,7 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
146
148
  let files = resolve::other_gem_bluebook_files(root, fw_name)?;
147
149
  declarations.push(Declaration {
148
150
  mod_name: fw_name.to_lowercase(),
149
- source_label: format!("{domain} (attaches {fw_name:?})"),
151
+ source_label: fw_name.clone(),
150
152
  ir_text: parse_bluebook(&parser_bin, fw_name, &files)?,
151
153
  });
152
154
  continue;
@@ -175,7 +177,7 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
175
177
  )?;
176
178
  declarations.push(Declaration {
177
179
  mod_name: fw_name.to_lowercase(),
178
- source_label: format!("{domain} (attaches {fw_name:?})"),
180
+ source_label: fw_name.clone(),
179
181
  ir_text: fw_ir_text,
180
182
  });
181
183
  }
@@ -206,7 +208,7 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
206
208
  // `expected_bluebook_name` above), not the raw `pkg_name` — that
207
209
  // would diverge the moment a package name has an underscore.
208
210
  mod_name: expected_bluebook_name.to_lowercase(),
209
- source_label: format!("{domain} (attaches {pkg_name:?}, from: :vendor)"),
211
+ source_label: pkg_bluebook_name,
210
212
  ir_text: pkg_ir_text,
211
213
  });
212
214
  }
@@ -221,7 +223,7 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
221
223
  sources.extend(hecksagon_path.iter().cloned());
222
224
  siblings.push(Declaration {
223
225
  mod_name: name.to_lowercase(),
224
- source_label: format!("{domain} (attaches {name:?})"),
226
+ source_label: name.clone(),
225
227
  ir_text: parse_bluebook(&parser_bin, name, &sources)?,
226
228
  });
227
229
  }
@@ -117,6 +117,7 @@ const OTHER_GEM_BLUEBOOK_DIRS: &[&str] = &[
117
117
  "composer/bluebook",
118
118
  "quality_control",
119
119
  "bulk/bluebook",
120
+ "ci_pipeline",
120
121
  ];
121
122
 
122
123
  // Every bluebook the gem carries beside the framework members, with the bluebook its header names.
@@ -20,7 +20,7 @@ path = "src/main.rs"
20
20
  debug = 0
21
21
 
22
22
  # Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
23
- # out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
23
+ # out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
24
24
  # The same table is in every crate's Cargo.toml; change them together.
25
25
  [lints.clippy]
26
26
  pedantic = { level = "warn", priority = -1 }
@@ -68,6 +68,7 @@ fn reference_checks(
68
68
  optional: crate::attr::optional(attr),
69
69
  list_item: None,
70
70
  union_tag: None,
71
+ settled: false,
71
72
  target_mod: target
72
73
  .get("name")
73
74
  .and_then(Json::as_str)
@@ -155,6 +156,7 @@ fn state_reference_checks(
155
156
  optional: crate::attr::optional(source_attr),
156
157
  list_item,
157
158
  union_tag: None,
159
+ settled: true,
158
160
  target_mod: target
159
161
  .get("name")
160
162
  .and_then(Json::as_str)
@@ -1217,6 +1219,7 @@ pub fn generate(
1217
1219
  aggregate: format!("{domain_name}::{agg_name}"),
1218
1220
  arg_checks: queries::query_arg_checks(
1219
1221
  query,
1222
+ agg_name,
1220
1223
  &format!(
1221
1224
  "crate::generated::{mod_name}::{}",
1222
1225
  crate::naming::aggregate_module(agg_name)
@@ -84,6 +84,78 @@ pub fn scalar_json_accessor(scalar_type: &str) -> &'static str {
84
84
  }
85
85
  }
86
86
 
87
+ /// The refusal for a reference argument offered as anything but an id string, worded as Ruby's
88
+ /// `Value.refuse_object_reference` (`reference_wrong_shape`): an object is "an object", any other
89
+ /// value is described as it arrived. `known_by` is the target's `" (X is known by heads)"` tail.
90
+ /// `" (Target is known by heads)"` for a single reference attribute whose target aggregate is
91
+ /// known, `""` for one whose target lives in another domain (Ruby words that refusal too, with
92
+ /// no tail), or `None` when `attr` is no reference or no aggregates were given.
93
+ fn reference_known_by(
94
+ attr: &Json,
95
+ aggregates_by_name: Option<&HashMap<String, &Json>>,
96
+ ) -> Option<String> {
97
+ let target_name = naming::reference_target(crate::attr::type_name(attr))?;
98
+ let Some(target) = aggregates_by_name?.get(target_name) else {
99
+ return Some(String::new());
100
+ };
101
+ let mut heads: Vec<String> = Vec::new();
102
+ for path in target.get("identified_by").map_or_default(Json::each) {
103
+ let head = path.to_s().split('.').next().unwrap_or("").to_string();
104
+ if !heads.contains(&head) {
105
+ heads.push(head);
106
+ }
107
+ }
108
+ let known = if heads.is_empty() {
109
+ String::new()
110
+ } else {
111
+ format!(" ({target_name} is known by {})", heads.join(", "))
112
+ };
113
+ Some(known)
114
+ }
115
+
116
+ pub fn reference_shape_error(command: &str, key: &str, known_by: &str, value_var: &str) -> String {
117
+ format!(
118
+ "crate::kernel::Refusal::TypeMismatch(crate::kernel::refusal_wording::TypeMismatchReferenceWrongShapeArgs {{ command: {}, attribute: {}, offered: &(if matches!({value_var}, crate::kernel::Json::Object(_)) {{ \"an object\".to_string() }} else {{ {value_var}.describe() }}), known_by: {} }}.render_args())",
119
+ naming::ruby_inspect_string(command),
120
+ naming::ruby_inspect_string(key),
121
+ naming::ruby_inspect_string(known_by),
122
+ )
123
+ }
124
+
125
+ /// A required reference argument read as its id string; see `reference_shape_error`.
126
+ pub fn reference_from_json_expr(
127
+ command: &str,
128
+ key: &str,
129
+ known_by: &str,
130
+ default: Option<&Json>,
131
+ ) -> String {
132
+ let error = reference_shape_error(command, key, known_by, "x");
133
+ if let Some(default) = default {
134
+ let default_rhs = naming::literal_rhs(default);
135
+ return format!(
136
+ "match v.get({}) {{ Some(x) => x.as_str().map(ToString::to_string).ok_or_else(|| {error})?, None => {default_rhs} }}",
137
+ naming::ruby_inspect_string(key),
138
+ );
139
+ }
140
+ format!(
141
+ "{{ let x = {}; x.as_str().map(ToString::to_string).ok_or_else(|| {error})? }}",
142
+ required_field_expr(command, key, "String"),
143
+ )
144
+ }
145
+
146
+ /// An already-fetched optional reference argument read as its id string.
147
+ pub fn reference_from_json_value_expr(
148
+ command: &str,
149
+ key: &str,
150
+ known_by: &str,
151
+ value_expr: &str,
152
+ ) -> String {
153
+ format!(
154
+ "{value_expr}.as_str().map(ToString::to_string).ok_or_else(|| {})?",
155
+ reference_shape_error(command, key, known_by, value_expr)
156
+ )
157
+ }
158
+
87
159
  pub fn scalar_from_json_expr(
88
160
  struct_name: &str,
89
161
  key: &str,
@@ -302,7 +374,8 @@ pub fn command_argument_allowlist(
302
374
  }
303
375
 
304
376
  /// `ArgumentGate#refuse_absent_arguments`, generated: every declared non-optional name the JSON
305
- /// omits, sorted, refuses as `AbsentArgument` before any field is built.
377
+ /// omits, sorted, refuses as `AbsentArgument` before any field is built. An argument with a
378
+ /// `default:` is not required: Ruby fills the default for an omitted one (`fill_defaults`).
306
379
  ///
307
380
  /// Goes through the site's `<Variant>Args` struct, so leaving an argument out does not compile.
308
381
  ///
@@ -312,7 +385,7 @@ pub fn command_argument_allowlist(
312
385
  fn emit_absent_argument_check(command_name: &str, attributes: &[Json], collect: bool) -> String {
313
386
  let mut required: Vec<String> = attributes
314
387
  .iter()
315
- .filter(|a| !crate::attr::optional(a))
388
+ .filter(|a| !crate::attr::optional(a) && crate::attr::default(a).is_none())
316
389
  .map(|a| naming::rust_field(crate::attr::name(a)))
317
390
  .collect();
318
391
  required.sort();
@@ -492,7 +565,14 @@ pub fn emit_from_json_flat(
492
565
  let list = crate::attr::list(attr);
493
566
  let optional = crate::attr::optional(attr);
494
567
 
495
- let rhs = if list && optional {
568
+ let known_by = reference_known_by(attr, aggregates_by_name);
569
+ let rhs = if let (false, Some(known_by)) = (list, known_by.as_deref()) {
570
+ if optional {
571
+ format!("match v.get({}) {{ Some(crate::kernel::Json::Null) | None => None, Some(x) => Some({}) }}", naming::ruby_inspect_string(&key), reference_from_json_value_expr(command_name, &key, known_by, "x"))
572
+ } else {
573
+ reference_from_json_expr(command_name, &key, known_by, crate::attr::default(attr))
574
+ }
575
+ } else if list && optional {
496
576
  let mapper = list_element_from_json_mapper(error_name, &key, attr, value_objects_by_name);
497
577
  let array_error = json_type_error(error_name, &key, "an array");
498
578
  format!(
@@ -515,6 +595,11 @@ pub fn emit_from_json_flat(
515
595
  format!("match v.get({}) {{ Some(crate::kernel::Json::Null) | None => None, Some(x) => Some({}) }}", naming::ruby_inspect_string(&key), composite_from_json_expr(attr, value_objects_by_name, "x"))
516
596
  } else if let Some(scalar) = scalar {
517
597
  scalar_from_json_expr(scalar_error_name, &key, scalar, crate::attr::default(attr))
598
+ } else if let Some(default_rhs) = crate::attr::default(attr).and_then(|_| crate::bridging::creation_default_rhs(attr, value_objects_by_name)) {
599
+ // A composite argument the caller leaves out takes its declared default, as Ruby's
600
+ // `fill_defaults` gives it. A null the caller sends is a value, not an omission:
601
+ // it builds the composite from its own fields, as a required composite does.
602
+ format!("match v.get({}) {{ None => {default_rhs}, Some(x) => {} }}", naming::ruby_inspect_string(&key), composite_from_json_expr(attr, value_objects_by_name, "x"))
518
603
  } else if absent_argument_check {
519
604
  // The argument entry point only; see `required_composite_argument_expr`.
520
605
  required_composite_argument_expr(error_name, &key, attr, value_objects_by_name)
@@ -1052,17 +1137,19 @@ pub fn extract_id_supported(aggregate: &Json) -> bool {
1052
1137
  }
1053
1138
 
1054
1139
  pub fn emit_extract_id(exemplar: &Exemplar, aggregate: &Json) -> String {
1055
- emit_extract_id_shaped(exemplar, aggregate, "extract_id", "to_id_component")
1140
+ emit_extract_id_shaped(exemplar, aggregate, "extract_id", "to_id_component", true)
1056
1141
  }
1057
1142
 
1058
1143
  /// `extract_id` minted as `extract_id_lenient` on `to_id_component_lenient`; entity addressing
1059
- /// only, never a root aggregate's hydrate.
1144
+ /// only, never a root aggregate's hydrate. It reads the entity's declared identity alone, as
1145
+ /// Ruby's `EntityElement` does: no `id` or reference-key fallback.
1060
1146
  pub fn emit_extract_id_lenient(exemplar: &Exemplar, entity: &Json) -> String {
1061
1147
  emit_extract_id_shaped(
1062
1148
  exemplar,
1063
1149
  entity,
1064
1150
  "extract_id_lenient",
1065
1151
  "to_id_component_lenient",
1152
+ false,
1066
1153
  )
1067
1154
  }
1068
1155
 
@@ -1071,6 +1158,7 @@ fn emit_extract_id_shaped(
1071
1158
  aggregate: &Json,
1072
1159
  method_name: &str,
1073
1160
  coercion: &str,
1161
+ routing_fallbacks: bool,
1074
1162
  ) -> String {
1075
1163
  let name = naming::rust_ident(aggregate.get("name").and_then(Json::as_str).unwrap_or(""));
1076
1164
  let identified_by: Vec<String> = aggregate
@@ -1109,27 +1197,43 @@ fn emit_extract_id_shaped(
1109
1197
  };
1110
1198
 
1111
1199
  let mut tried = identified_by.clone();
1112
- tried.push("id".to_string());
1113
- tried.push(reference_key.clone());
1200
+ if routing_fallbacks {
1201
+ tried.push("id".to_string());
1202
+ tried.push(reference_key.clone());
1203
+ }
1114
1204
  let tried = tried.join(", ");
1205
+ let template = if routing_fallbacks {
1206
+ "extract_id"
1207
+ } else {
1208
+ "extract_id_exact"
1209
+ };
1115
1210
 
1211
+ // The exact shape has no reference-key slot, and its type is its own struct.
1212
+ let type_marker = if routing_fallbacks {
1213
+ "TmplExtractIdType"
1214
+ } else {
1215
+ "TmplExtractExactType"
1216
+ };
1217
+ let mut subs: Vec<(&str, String)> = vec![
1218
+ (type_marker, name.clone()),
1219
+ ("tmpl_extract_id_name", method_name.to_string()),
1220
+ ];
1221
+ if routing_fallbacks {
1222
+ subs.push(("tmpl_id_coercion", coercion.to_string()));
1223
+ subs.push((
1224
+ "\"tmpl_reference_key\"",
1225
+ naming::ruby_inspect_string(&reference_key),
1226
+ ));
1227
+ }
1228
+ subs.push(("tmpl_tier1_join_placeholder()", tier1_join));
1229
+ subs.push((
1230
+ "\"tmpl_error_text\"",
1231
+ naming::ruby_inspect_string(&format!("{name}: no identity found (tried {tried})")),
1232
+ ));
1116
1233
  exemplar.compose(
1117
- "extract_id",
1118
- &[
1119
- ("TmplExtractIdType", name.clone()),
1120
- ("tmpl_extract_id_name", method_name.to_string()),
1121
- ("tmpl_id_coercion", coercion.to_string()),
1122
- (
1123
- "\"tmpl_reference_key\"",
1124
- naming::ruby_inspect_string(&reference_key),
1125
- ),
1126
- ("tmpl_tier1_join_placeholder()", tier1_join),
1127
- (
1128
- "\"tmpl_error_text\"",
1129
- naming::ruby_inspect_string(&format!("{name}: no identity found (tried {tried})")),
1130
- ),
1131
- ],
1132
- "extract_id:TIER1_LINE",
1234
+ template,
1235
+ &subs,
1236
+ &format!("{template}:TIER1_LINE"),
1133
1237
  &tier1_subs,
1134
1238
  "\n",
1135
1239
  )
@@ -1211,3 +1315,58 @@ pub fn emit_self_identity(exemplar: &Exemplar, entity: &Json) -> String {
1211
1315
  ],
1212
1316
  )
1213
1317
  }
1318
+
1319
+ #[cfg(test)]
1320
+ mod tests {
1321
+ use super::*;
1322
+
1323
+ fn argument(name: &str, default: Json) -> Json {
1324
+ Json::Object(vec![
1325
+ ("name".to_string(), Json::String(name.to_string())),
1326
+ ("type".to_string(), Json::String("Integer".to_string())),
1327
+ ("optional".to_string(), Json::Bool(false)),
1328
+ ("default".to_string(), default),
1329
+ ])
1330
+ }
1331
+
1332
+ #[test]
1333
+ fn absent_gate_requires_each_argument_without_a_default_and_no_defaulted_one() {
1334
+ let attributes = vec![
1335
+ argument("key", Json::Null),
1336
+ argument("grace", Json::Number("0".to_string())),
1337
+ ];
1338
+ let gate = emit_absent_argument_check("Reap", &attributes, false);
1339
+ assert!(
1340
+ gate.contains("let required: &[&str] = &[\"key\"];"),
1341
+ "{gate}"
1342
+ );
1343
+ }
1344
+
1345
+ #[test]
1346
+ fn a_reference_to_another_domain_is_worded_as_a_reference_with_no_tail() {
1347
+ let attr = Json::Object(vec![
1348
+ ("name".to_string(), Json::String("parcel".to_string())),
1349
+ (
1350
+ "type".to_string(),
1351
+ Json::String("Reference<Parcel>".to_string()),
1352
+ ),
1353
+ ]);
1354
+ let in_this_domain = HashMap::new();
1355
+ assert_eq!(
1356
+ reference_known_by(&attr, Some(&in_this_domain)),
1357
+ Some(String::new())
1358
+ );
1359
+ assert_eq!(reference_known_by(&attr, None), None);
1360
+ }
1361
+
1362
+ #[test]
1363
+ fn a_reference_argument_refuses_in_the_reference_wrong_shape_wording() {
1364
+ let error = reference_shape_error("Open", "parcel", " (Parcel is known by code)", "x");
1365
+ assert!(
1366
+ error.contains("TypeMismatchReferenceWrongShapeArgs"),
1367
+ "{error}"
1368
+ );
1369
+ assert!(error.contains("\"an object\""), "{error}");
1370
+ assert!(error.contains("\" (Parcel is known by code)\""), "{error}");
1371
+ }
1372
+ }
@@ -117,6 +117,7 @@ fn variant_check(
117
117
  optional: crate::attr::optional(source),
118
118
  list_item: None,
119
119
  union_tag: Some(variant.to_string()),
120
+ settled: false,
120
121
  target_mod: crate::naming::aggregate_module(variant),
121
122
  target_name: variant.to_string(),
122
123
  heads,
@@ -1051,9 +1051,15 @@ pub fn emit_query_table(exemplar: &Exemplar, query_defs: &[QueryDef]) -> String
1051
1051
  )
1052
1052
  }
1053
1053
 
1054
- // One `if let` per value-object argument: built and invariant-checked, then dropped (ADR 0037).
1054
+ // The bare scalar types a query argument is shape-checked as, the types `mistyped?` names.
1055
+ const SCALAR_ARG_TYPES: [&str; 3] = ["String", "Integer", "Float"];
1056
+
1057
+ // One `if let` per argument that is checked: a value object is built and invariant-checked, then
1058
+ // dropped (ADR 0037); a bare scalar must hold the shape its declared type names. `owner` is the
1059
+ // aggregate's bare name, which a refusal quotes as Ruby's `aggregate.hecks_name` does.
1055
1060
  pub fn query_arg_checks(
1056
1061
  query: &Json,
1062
+ owner: &str,
1057
1063
  mod_path: &str,
1058
1064
  value_objects_by_name: &HashMap<String, &Json>,
1059
1065
  ) -> Vec<String> {
@@ -1067,8 +1073,20 @@ pub fn query_arg_checks(
1067
1073
  {
1068
1074
  return None;
1069
1075
  }
1070
- let vo = value_objects_by_name.get(crate::attr::type_name(attr))?;
1076
+ let type_name = crate::attr::type_name(attr);
1071
1077
  let key = naming::rust_field(crate::attr::name(attr));
1078
+ if !value_objects_by_name.contains_key(type_name) {
1079
+ return SCALAR_ARG_TYPES.contains(&type_name).then(|| {
1080
+ format!(
1081
+ "if let Some(x) = args.get({}) {{ x.expect_scalar_shape({}, {}, {})?; }}",
1082
+ naming::ruby_inspect_string(&key),
1083
+ naming::ruby_inspect_string(owner),
1084
+ naming::ruby_inspect_string(crate::attr::name(attr)),
1085
+ naming::ruby_inspect_string(type_name)
1086
+ )
1087
+ });
1088
+ }
1089
+ let vo = value_objects_by_name.get(type_name)?;
1072
1090
  let build =
1073
1091
  crate::json_codec::composite_from_json_expr(attr, value_objects_by_name, "x");
1074
1092
  let check = if vo.get("closed_set").is_some_and(Json::as_bool) {
@@ -15,6 +15,10 @@ pub struct ReferenceCheck {
15
15
  /// `Some(variant)` for a tagged `one_of` reference: the check runs only when the argument's
16
16
  /// `type` names this variant (ADR 0127).
17
17
  pub union_tag: Option<String>,
18
+ /// True for a reference a command sets through a plain value object: Ruby checks it on the
19
+ /// settled state at `save`, after hydrate, givens and invariants, so the router defers it
20
+ /// to `Save` beside the tenant boundary instead of running it with the argument gates.
21
+ pub settled: bool,
18
22
  pub target_mod: String,
19
23
  pub target_name: String,
20
24
  pub heads: String,
@@ -509,6 +513,7 @@ pub fn emit_registry(exemplar: &Exemplar, aggregates: &[AggregateEntry]) -> Stri
509
513
  emit_role_check(exemplar, c.role.as_deref(), &c.roles, &c.name),
510
514
  &c.reference_checks
511
515
  .iter()
516
+ .filter(|check| !check.settled)
512
517
  .map(|check| emit_reference_check(exemplar, check))
513
518
  .collect::<Vec<_>>()
514
519
  )
@@ -521,9 +526,15 @@ pub fn emit_registry(exemplar: &Exemplar, aggregates: &[AggregateEntry]) -> Stri
521
526
 
522
527
  // Checks come from `ir.json` at codegen time; none means `Ok(())`, else one closure.
523
528
  let tenant_boundary_check_bodies: Vec<String> = c
524
- .tenant_boundary_checks
529
+ .reference_checks
525
530
  .iter()
526
- .map(emit_tenant_boundary_check)
531
+ .filter(|check| check.settled)
532
+ .map(|check| emit_reference_check(exemplar, check))
533
+ .chain(
534
+ c.tenant_boundary_checks
535
+ .iter()
536
+ .map(emit_tenant_boundary_check),
537
+ )
527
538
  .collect();
528
539
  let tenant_boundary_check_line = if tenant_boundary_check_bodies.is_empty() {
529
540
  "let tenant_boundary_check: Result<(), crate::kernel::Refusal> = Ok(());"
@@ -616,14 +627,19 @@ pub fn emit_registry(exemplar: &Exemplar, aggregates: &[AggregateEntry]) -> Stri
616
627
  c.name, c.entity_name, c.entity_identity_reading
617
628
  );
618
629
  // `element_id` uses `extract_id_lenient` (absent vs blank element identity);
619
- // `parent_id` stays strict.
630
+ // `parent_id` stays strict. An element identity the arguments lack refuses as the
631
+ // missing parent when there is none, since Ruby hydrates the parent before it
632
+ // locates the element.
620
633
  let body_entity_match = format!(
621
- "let (parent_id, element_id, element_wants) = match route {{ Some(route) => {{ let element_id = route.entities()[0].clone(); (route.aggregate().to_string(), element_id.clone(), element_id) }}, None => {{ let parent_id = {mod_path}::{}::extract_id(facts_json).map_err(|_| crate::kernel::Refusal::NotFound({}.to_string()))?; let element_id = {mod_path}::{}::extract_id_lenient(facts_json).map_err(|_| crate::kernel::Refusal::NotFound({}.to_string()))?; let element_wants = {mod_path}::{}::extract_wants(facts_json); (parent_id, element_id, element_wants) }}, }};",
634
+ "let (parent_id, element_id, element_wants) = match route {{ Some(route) => {{ let element_id = route.entities()[0].clone(); (route.aggregate().to_string(), element_id.clone(), element_id) }}, None => {{ let parent_id = {mod_path}::{}::extract_id(facts_json).map_err(|_| crate::kernel::Refusal::NotFound({}.to_string()))?; let element_id = {mod_path}::{}::extract_id_lenient(facts_json).map_err(|_| {{ if store.{module}.find(&parent_id).is_none() {{ crate::kernel::Refusal::NotFound(crate::kernel::refusal_wording::NotFoundRecordMissingArgs {{ aggregate: {record_name}, identity: {identity_reading}, offered: &format!(\"{{parent_id:?}}\") }}.render_args()) }} else {{ crate::kernel::Refusal::NotFound({}.to_string()) }} }})?; let element_wants = {mod_path}::{}::extract_wants(facts_json); (parent_id, element_id, element_wants) }}, }};",
622
635
  a.record,
623
636
  naming::ruby_inspect_string(&entity_parent_no_identity_message),
624
637
  c.entity_record,
625
638
  naming::ruby_inspect_string(&entity_element_no_identity_message),
626
- c.entity_record
639
+ c.entity_record,
640
+ module = a.module_name,
641
+ record_name = naming::ruby_inspect_string(&a.record),
642
+ identity_reading = naming::ruby_inspect_string(&a.identified_by.join(", ")),
627
643
  );
628
644
 
629
645
  let mut body: Vec<String> = vec![
data/rust/expr/Cargo.toml CHANGED
@@ -16,7 +16,7 @@ path = "src/lib.rs"
16
16
  regex = { version = "1", default-features = false, features = ["std", "unicode"] }
17
17
 
18
18
  # Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
19
- # out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
19
+ # out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
20
20
  # The same table is in every crate's Cargo.toml; change them together.
21
21
  [lints.clippy]
22
22
  pedantic = { level = "warn", priority = -1 }
data/rust/host/Cargo.toml CHANGED
@@ -74,7 +74,7 @@ debug = 0
74
74
  opt-level = 2
75
75
 
76
76
  # Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
77
- # out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
77
+ # out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
78
78
  # The same table is in every crate's Cargo.toml; change them together.
79
79
  [lints.clippy]
80
80
  pedantic = { level = "warn", priority = -1 }
@@ -1 +1 @@
1
- 6.0.0
1
+ 7.0.0
@@ -28,7 +28,7 @@ base64 = "0.22"
28
28
  async-trait = "0.1.92"
29
29
 
30
30
  # Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
31
- # out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
31
+ # out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
32
32
  # The same table is in every crate's Cargo.toml; change them together.
33
33
  [lints.clippy]
34
34
  pedantic = { level = "warn", priority = -1 }
@@ -127,6 +127,7 @@ async fn main() -> anyhow::Result<()> {
127
127
  ordinal,
128
128
  &my_hash,
129
129
  &my_label,
130
+ &storage_shape::canonical(&ir),
130
131
  held_text,
131
132
  &aggregates,
132
133
  &chain,
@@ -589,6 +589,7 @@ async fn boot_postgres(
589
589
  ordinal,
590
590
  my_hash,
591
591
  my_label,
592
+ &storage_shape::canonical(ir),
592
593
  held_text,
593
594
  &aggregates,
594
595
  &chain,
@@ -365,6 +365,10 @@ pub async fn ensure_base<C: GenericClient>(client: &C, domain: &str) -> anyhow::
365
365
  client
366
366
  .batch_execute("ALTER TABLE hecks_eras ADD COLUMN IF NOT EXISTS canon_form int")
367
367
  .await?;
368
+ // Ruby's era reader selects `edge`; the Rust mint leaves it NULL (no implicit-edge record).
369
+ client
370
+ .batch_execute("ALTER TABLE hecks_eras ADD COLUMN IF NOT EXISTS edge jsonb")
371
+ .await?;
368
372
  client
369
373
  .batch_execute(
370
374
  "CREATE TABLE IF NOT EXISTS hecks_era_texts (\
@@ -1124,13 +1128,14 @@ async fn hold_first_body<C: GenericClient>(
1124
1128
  ) -> anyhow::Result<()> {
1125
1129
  let hash = storage_shape::mint_hash(ir);
1126
1130
  let label = storage_shape::mint_label(ir);
1131
+ let projection = storage_shape::canonical(ir);
1127
1132
  let digest = format!("{:x}", Sha256::digest(held_text.as_bytes()));
1128
1133
 
1129
1134
  client
1130
1135
  .execute(
1131
- "INSERT INTO hecks_eras (domain, ordinal, hash, label, held_text, watermark, held_digest, canon_form) \
1132
- VALUES ($1, 1, $2, $3, $4, 0, $5, $6) ON CONFLICT DO NOTHING",
1133
- &[&domain, &hash, &label, &held_text, &digest, &storage_shape::FORM_VERSION],
1136
+ "INSERT INTO hecks_eras (domain, ordinal, hash, label, held_text, watermark, held_digest, canon_form, \
1137
+ held_projection) VALUES ($1, 1, $2, $3, $4, 0, $5, $6, $7::text::jsonb) ON CONFLICT DO NOTHING",
1138
+ &[&domain, &hash, &label, &held_text, &digest, &storage_shape::FORM_VERSION, &projection],
1134
1139
  )
1135
1140
  .await?;
1136
1141
  archive_text(client, domain, 1, held_text, &digest).await?;
@@ -1268,6 +1273,7 @@ pub async fn mint_era<C: GenericClient>(
1268
1273
  ordinal: i32,
1269
1274
  hash: &str,
1270
1275
  label: &str,
1276
+ projection: &str,
1271
1277
  held_text: &str,
1272
1278
  aggregates: &[Aggregate],
1273
1279
  edges: &[&Edge],
@@ -1281,6 +1287,7 @@ pub async fn mint_era<C: GenericClient>(
1281
1287
  ordinal,
1282
1288
  hash,
1283
1289
  label,
1290
+ projection,
1284
1291
  held_text,
1285
1292
  aggregates,
1286
1293
  edges,
@@ -1308,6 +1315,7 @@ async fn mint_era_body<C: GenericClient>(
1308
1315
  ordinal: i32,
1309
1316
  hash: &str,
1310
1317
  label: &str,
1318
+ projection: &str,
1311
1319
  held_text: &str,
1312
1320
  aggregates: &[Aggregate],
1313
1321
  edges: &[&Edge],
@@ -1341,9 +1349,9 @@ async fn mint_era_body<C: GenericClient>(
1341
1349
  let digest = format!("{:x}", Sha256::digest(held_text.as_bytes()));
1342
1350
  client
1343
1351
  .execute(
1344
- "INSERT INTO hecks_eras (domain, ordinal, hash, label, held_text, watermark, held_digest, canon_form) \
1345
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
1346
- &[&domain, &ordinal, &hash, &label, &held_text, &watermark, &digest, &storage_shape::FORM_VERSION],
1352
+ "INSERT INTO hecks_eras (domain, ordinal, hash, label, held_text, watermark, held_digest, canon_form, \
1353
+ held_projection) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::text::jsonb)",
1354
+ &[&domain, &ordinal, &hash, &label, &held_text, &watermark, &digest, &storage_shape::FORM_VERSION, &projection],
1347
1355
  )
1348
1356
  .await?;
1349
1357
  archive_text(client, domain, ordinal, held_text, &digest).await?;
@@ -1895,6 +1903,7 @@ mod tests {
1895
1903
  2,
1896
1904
  &storage_shape::mint_hash(&v2_ir),
1897
1905
  &to_label,
1906
+ &storage_shape::canonical(&v2_ir),
1898
1907
  "v2 source text",
1899
1908
  &[aggregate],
1900
1909
  &[&edge],
@@ -1923,6 +1932,29 @@ mod tests {
1923
1932
  ),
1924
1933
  ]
1925
1934
  );
1935
+ assert_projections_stored(&client, domain, &[(1, &v1_ir), (2, &v2_ir)]).await;
1936
+ }
1937
+
1938
+ // Each era's `held_projection` is the parsed canonical shape of the IR it was minted from.
1939
+ async fn assert_projections_stored(
1940
+ client: &tokio_postgres::Client,
1941
+ domain: &str,
1942
+ expected: &[(i32, &Value)],
1943
+ ) {
1944
+ for (ordinal, ir) in expected {
1945
+ let row = client
1946
+ .query_one(
1947
+ "SELECT held_projection::text FROM hecks_eras WHERE domain = $1 AND ordinal = $2",
1948
+ &[&domain, ordinal],
1949
+ )
1950
+ .await
1951
+ .expect("era row");
1952
+ let stored: Option<String> = row.get(0);
1953
+ let stored: Value =
1954
+ serde_json::from_str(&stored.expect("held_projection set")).expect("json");
1955
+ let wanted: Value = serde_json::from_str(&storage_shape::canonical(ir)).expect("json");
1956
+ assert_eq!(stored, wanted, "era {ordinal} held_projection");
1957
+ }
1926
1958
  }
1927
1959
 
1928
1960
  fn registration_default() -> LifecycleDefault {
@@ -2130,6 +2162,7 @@ mod tests {
2130
2162
  2,
2131
2163
  &storage_shape::mint_hash(&v2_ir),
2132
2164
  &to_label,
2165
+ &storage_shape::canonical(&v2_ir),
2133
2166
  "v2 source",
2134
2167
  &[aggregate],
2135
2168
  &[&edge],
@@ -2436,6 +2469,7 @@ mod tests {
2436
2469
  era + 1,
2437
2470
  &"h".repeat(64),
2438
2471
  &format!("e{}", era + 1),
2472
+ "{}",
2439
2473
  "text",
2440
2474
  &aggregates,
2441
2475
  &chain,
data/rust/lsp/Cargo.toml CHANGED
@@ -16,7 +16,7 @@ path = "src/main.rs"
16
16
  [dependencies]
17
17
 
18
18
  # Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
19
- # out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
19
+ # out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
20
20
  # The same table is in every crate's Cargo.toml; change them together.
21
21
  [lints.clippy]
22
22
  pedantic = { level = "warn", priority = -1 }
@@ -21,7 +21,7 @@ path = "src/main.rs"
21
21
  debug = 0
22
22
 
23
23
  # Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
24
- # out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
24
+ # out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
25
25
  # The same table is in every crate's Cargo.toml; change them together.
26
26
  [lints.clippy]
27
27
  pedantic = { level = "warn", priority = -1 }