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
@@ -1,1234 +0,0 @@
1
- Hecks.bluebook "Hecks" do
2
- # Tooling: developer tooling for working with a domain, in the Maintenance module (ADR 0096).
3
- # A client runs these while building a domain, not while operating one; the operating half is
4
- # in custodian.bluebook.
5
-
6
- aggregate "Introspection" do
7
- description "A look at a booted domain, answered by the runtime without changing anything."
8
-
9
- attribute :domain, DomainPath
10
- identified_by :domain
11
-
12
- value_object "DomainPath" do
13
- attribute :value, String, matches: :not_empty
14
-
15
- invariant("a domain is named by its path") { !value.to_s.empty? }
16
- end
17
-
18
- value_object "BluebookName" do
19
- attribute :value, String, matches: :present
20
-
21
- invariant("a bluebook is named") { !value.to_s.empty? }
22
- end
23
-
24
- value_object "AggregateName" do
25
- attribute :value, String, matches: :present
26
-
27
- invariant("an aggregate is named") { !value.to_s.empty? }
28
- end
29
-
30
- # Each query below is answered by the DomainRuntime port's adapter: the domain is booted
31
- # in-process and the answer is the exact text the matching bin script printed.
32
-
33
- # An answer that is one document of text, exactly as the tool that produced it wrote it.
34
- value_object "Document" do
35
- attribute :text, String
36
- end
37
-
38
- query "Ir" do
39
- description "The IR a domain's boot produces, as JSON: what golden specs pin and an era hashes."
40
- attribute :domain, DomainPath, optional: true
41
- attribute :translations, Boolean, optional: true
42
- attribute :meta, Boolean, optional: true
43
- returns Document
44
- end
45
-
46
- query "Shape" do
47
- description "The storage shape an era's label is minted from: a bluebook file or a directory of them."
48
- attribute :domain, DomainPath
49
- returns Document
50
- end
51
-
52
- # The identity one stored record answers to, as the store's `id` column holds it.
53
- value_object "RecordId" do
54
- attribute :value, String, matches: :present
55
-
56
- invariant("a record is named by its id") { !value.to_s.empty? }
57
- end
58
-
59
- # `aggregate` is the storage name the full document keys by (`reflection`, not `Reflection`); with
60
- # `record` as well it narrows to that one record, so one row can be read without dumping the rest.
61
- query "Stores" do
62
- description "Every aggregate's current records, or one aggregate's, or one record: the head, not the journal."
63
- attribute :domain, DomainPath
64
- attribute :aggregate, AggregateName, optional: true
65
- attribute :record, RecordId, optional: true
66
- attribute :flat, Boolean, optional: true
67
- returns Document
68
- end
69
-
70
- query "History" do
71
- description "Every journal entry a domain's append-only adapters hold: the whole write history."
72
- attribute :domain, DomainPath
73
- returns Document
74
- end
75
-
76
- query "Statements" do
77
- description "A bluebook's declared facts, as plain English sentences."
78
- attribute :domain, DomainPath
79
- attribute :bluebook, BluebookName
80
- returns Document
81
- end
82
-
83
- query "Narrate" do
84
- description "A domain read back in English, whole or for one aggregate."
85
- attribute :domain, DomainPath, optional: true
86
- attribute :aggregate, AggregateName, optional: true
87
- returns Document
88
- end
89
-
90
- query "Relationships" do
91
- description "How the contexts a domain holds depend on each other: shared kernel, customer/supplier, anti-corruption layer, subscription."
92
- attribute :domain, DomainPath
93
- returns Document
94
- end
95
-
96
- query "ContextMap" do
97
- description "A domain's declared context map drawn as a Mermaid diagram beside its wiring, with what holding the wiring to the map finds."
98
- attribute :domain, DomainPath
99
- returns Document
100
- end
101
-
102
- query "WorldSkeleton" do
103
- description "A starting .world for a domain: the settings and secrets its bound adapters declare, with no secret's value."
104
- attribute :domain, DomainPath
105
- returns Document
106
- end
107
-
108
- query "Docs" do
109
- description "A domain's usage document, whole or for one aggregate."
110
- attribute :domain, DomainPath, optional: true
111
- attribute :aggregate, AggregateName, optional: true
112
- returns Document
113
- end
114
-
115
- # One file a projection would have written, held as its name and its text.
116
- value_object "ProjectedFile" do
117
- attribute :name, String
118
- attribute :text, String
119
- end
120
-
121
- query "ProjectDiagrams" do
122
- description "A bluebook's Mermaid diagrams, as file names mapped to their text; nothing is written."
123
- attribute :domain, DomainPath
124
- attribute :bluebook, BluebookName
125
- returns list_of(ProjectedFile)
126
- end
127
-
128
- query "Glossary" do
129
- description "A bluebook's Ubiquitous Language glossary, as file names mapped to their text; nothing is written."
130
- attribute :domain, DomainPath
131
- attribute :bluebook, BluebookName
132
- returns list_of(ProjectedFile)
133
- end
134
- end
135
-
136
- # A journaled command whose work happens outside the runtime (ADR 0080, section 11). Every
137
- # command below that runs something follows this one shape, so later aggregates copy it:
138
- #
139
- # 1. A creating command records the request as a record in state "requested" and emits.
140
- # 2. A policy on that event asks for the work by name (`ask :check`); the hecksagon says which
141
- # port answers. The runtime hands the port's adapter the whole record, so the adapter does
142
- # all the IO, and only there.
143
- # 3. The adapter answers (a hash named like a command's arguments) or raises (its message
144
- # is the refusal). One policy per outcome re-enters the record with a command that stores it.
145
- #
146
- # The ports are declared in hecks.hecksagon; each adapter is in adapters/.
147
-
148
- aggregate "ModelCheckRun" do
149
- description "One static analysis over domains' models, and what it found: a check's history."
150
-
151
- attribute :run, RunKey
152
- attribute :domains, DomainList, optional: true
153
- attribute :profile, ProfileName, optional: true
154
- attribute :strict, Switch, optional: true
155
- attribute :report, Report, optional: true
156
- attribute :checked, Checked, optional: true
157
- attribute :refusal, Report, optional: true
158
- identified_by :run
159
-
160
- value_object "RunKey" do
161
- attribute :value, String, matches: :present
162
-
163
- invariant("a run is named") { !value.to_s.empty? }
164
- end
165
-
166
- value_object "DomainList" do
167
- attribute :value, String, matches: :not_empty
168
- end
169
-
170
- value_object "ProfileName" do
171
- attribute :value, String, pattern: '^client$'
172
- end
173
-
174
- value_object "Switch" do
175
- attribute :value, Boolean
176
- end
177
-
178
- value_object "Report" do
179
- attribute :value, String
180
- end
181
-
182
- # How many domains the report examined, counted from its headers so a reader need not.
183
- value_object "Checked" do
184
- attribute :value, Integer
185
-
186
- invariant("a count is not negative") { value >= 0 }
187
- end
188
-
189
- lifecycle :status, default: "requested" do
190
- mark :failure, "flagged"
191
- transition "Pass" => "clean", from: "requested"
192
- transition "Flag" => "flagged", from: "requested"
193
- mark :terminal, "clean", "flagged"
194
- end
195
-
196
- command "ModelCheck" do
197
- role "Operator"
198
- goal "Check domains for dead states and unreachable steps, and keep the verdict"
199
-
200
- attribute :run, RunKey, sets: true
201
- attribute :domains, DomainList, optional: true, sets: true
202
- attribute :profile, ProfileName, optional: true, sets: true
203
- attribute :strict, Switch, optional: true, sets: true
204
-
205
-
206
- emits ModelCheckRequested
207
- end
208
-
209
- command "Pass" do
210
- role "System"
211
- goal "Record that the analysis left no error"
212
-
213
- reference_to ModelCheckRun
214
- attribute :report, Report, sets: true
215
- attribute :checked, Checked, sets: true
216
-
217
-
218
- emits ModelCheckPassed
219
- end
220
-
221
- command "Flag" do
222
- role "System"
223
- goal "Record that the analysis found something, or could not run, and what it said"
224
-
225
- reference_to ModelCheckRun
226
- attribute :refusal, Report, sets: true
227
-
228
-
229
- emits ModelCheckFlagged
230
- end
231
-
232
- # `hecks model_check` answers once the request is recorded, so the verdict is read here.
233
- query "Verdict" do
234
- description "What one check found: its status, and the report or the reason it could not run."
235
- attribute :run, RunKey
236
- where(run: :run)
237
- order_by :run
238
- end
239
-
240
- query "Flagged" do
241
- description "Every check that left a finding or could not run."
242
- where(status: "flagged")
243
- order_by :run
244
- end
245
- end
246
-
247
- policy "AnalyseWhenRequested" do
248
- on "ModelCheckRun.ModelCheckRequested"
249
- ask :check, with: { run: :run }
250
- end
251
-
252
- policy "RecordTheClean" do
253
- on "ModelCheckRun.ModelCheckAnswered"
254
- trigger ModelCheckRun::Pass, with: { report: :report, checked: :checked }
255
- end
256
-
257
- policy "RecordTheFlag" do
258
- on "ModelCheckRun.ModelCheckRefused"
259
- trigger ModelCheckRun::Flag, with: { refusal: :refusal }
260
- end
261
-
262
- aggregate "Package" do
263
- description "One package of the bluebook registry, vendored into a project and pinned."
264
-
265
- attribute :package, PackageRef
266
- attribute :from, Location, optional: true
267
- attribute :root, Location, optional: true
268
- attribute :report, Report, optional: true
269
- attribute :refusal, Report, optional: true
270
- identified_by :package
271
-
272
- # `name` for the newest release, `name@1.2.0` for one release, `name@9f2c1ab` for a commit.
273
- value_object "PackageRef" do
274
- attribute :value, String, pattern: '^[a-z][a-z0-9_]*(@[^ \t\n\r]+)?$'
275
-
276
- invariant("a package is named") { !value.to_s.empty? }
277
- end
278
-
279
- # A directory: the source repository (`from`), or the project the files land in (`root`).
280
- value_object "Location" do
281
- attribute :value, String, matches: :not_empty
282
- end
283
-
284
- value_object "Report" do
285
- attribute :value, String
286
- end
287
-
288
- # An answer that is one document of text, exactly as the tool that produced it wrote it.
289
- value_object "Document" do
290
- attribute :text, String
291
- end
292
-
293
- lifecycle :status, default: "requested" do
294
- mark :failure, "refused"
295
- transition "Revendor" => "requested", from: %w[vendored refused]
296
- transition "Complete" => "vendored", from: "requested"
297
- transition "Abandon" => "refused", from: "requested"
298
- end
299
-
300
- # `hecks vendor <package[@version]> [from=path] [root=path]`. The record is named by what was
301
- # asked for, so a release is one record; vendoring the same spelling again is `hecks revendor`.
302
- # `from` defaults to $EMBRYONAUT_BLUEBOOKS_SRC and `root` to the current directory, both read by
303
- # the adapter.
304
- command "Vendor" do
305
- role "Operator"
306
- goal "Pin a package of the bluebook registry into this project, at a release or a commit"
307
-
308
- attribute :package, PackageRef, sets: true
309
- attribute :from, Location, optional: true, sets: true
310
- attribute :root, Location, optional: true, sets: true
311
-
312
-
313
- emits VendorRequested
314
- end
315
-
316
- command "Revendor" do
317
- role "Operator"
318
- goal "Pin a package that was vendored before again, for the newest release or the same one"
319
-
320
- reference_to Package
321
- attribute :from, Location, optional: true, sets: true
322
- attribute :root, Location, optional: true, sets: true
323
-
324
-
325
- emits RevendorRequested
326
- end
327
-
328
- command "Complete" do
329
- role "System"
330
- goal "Record that the package was pinned, and what changed"
331
-
332
- reference_to Package
333
- attribute :report, Report, sets: true
334
-
335
-
336
- emits PackageVendored
337
- end
338
-
339
- command "Abandon" do
340
- role "System"
341
- goal "Record that the package could not be pinned, and why"
342
-
343
- reference_to Package
344
- attribute :refusal, Report, sets: true
345
-
346
-
347
- emits VendoringRefused
348
- end
349
-
350
- query "Pinning" do
351
- description "What vendoring one package did: its status, and the report or the refusal."
352
- attribute :package, PackageRef
353
- where(package: :package)
354
- order_by :package
355
- end
356
-
357
- query "Unpinned" do
358
- description "Every package the last vendoring of which was refused."
359
- where(status: "refused")
360
- order_by :package
361
- end
362
-
363
- # `hecks package.verify [root=path]`: a read of the files, so it keeps no record. The manifest
364
- # is the answer; a package that disagrees with its lock refuses it, naming each one.
365
- query "Verify" do
366
- description "Check every vendored package against its bluebook.lock, then describe them as the manifest a client image carries."
367
- attribute :root, Location, optional: true
368
- returns Document
369
- end
370
- end
371
-
372
- policy "PinWhenVendored" do
373
- on "Package.VendorRequested"
374
- ask :pin, with: { package: :package }
375
- end
376
-
377
- policy "PinWhenRevendored" do
378
- on "Package.RevendorRequested"
379
- ask :pin, with: { package: :package }
380
- end
381
-
382
- policy "RecordThePinning" do
383
- on "Package.PackagePinned"
384
- trigger Package::Complete, with: { report: :report }
385
- end
386
-
387
- policy "RecordTheRefusedPin" do
388
- on "Package.PinRefused"
389
- trigger Package::Abandon, with: { refusal: :refusal }
390
- end
391
-
392
- aggregate "Registry" do
393
- description "A bluebook registry repository: packages versioned in it and released as tags."
394
-
395
- attribute :run, RegistryKey
396
- attribute :package, PackageName, optional: true
397
- attribute :root, Location, optional: true
398
- attribute :report, Report, optional: true
399
- attribute :refusal, Report, optional: true
400
- identified_by :run
401
-
402
- value_object "RegistryKey" do
403
- attribute :value, String, matches: :present
404
-
405
- invariant("a release is named") { !value.to_s.empty? }
406
- end
407
-
408
- value_object "PackageName" do
409
- attribute :value, String, matches: :snake_name
410
- end
411
-
412
- # The registry repository: the current directory when absent.
413
- value_object "Location" do
414
- attribute :value, String, matches: :not_empty
415
- end
416
-
417
- value_object "Report" do
418
- attribute :value, String
419
- end
420
-
421
- # An answer that is one document of text, exactly as the tool that produced it wrote it.
422
- value_object "Document" do
423
- attribute :text, String
424
- end
425
-
426
- lifecycle :status, default: "requested" do
427
- mark :failure, "refused"
428
- transition "Complete" => "tagged", from: "requested"
429
- transition "Abandon" => "refused", from: "requested"
430
- mark :terminal, "refused", "tagged"
431
- end
432
-
433
- # `hecks package.release <package> [root=path]`. Tags the package's current version as
434
- # `<package>-vX.Y.Z` in the local repository and never pushes; the report ends in the command
435
- # that does. A refusal says which rule the package broke.
436
- command "Release" do
437
- role "Operator"
438
- goal "Tag a package of this registry at the version its bluebook.yml carries"
439
-
440
- attribute :run, RegistryKey, sets: true
441
- attribute :package, PackageName, sets: true
442
- attribute :root, Location, optional: true, sets: true
443
-
444
-
445
- emits ReleaseRequested
446
- end
447
-
448
- command "Complete" do
449
- role "System"
450
- goal "Record that the release was tagged, and the command that publishes it"
451
-
452
- reference_to Registry
453
- attribute :report, Report, sets: true
454
-
455
-
456
- emits ReleaseRecorded
457
- end
458
-
459
- command "Abandon" do
460
- role "System"
461
- goal "Record that the release was refused, and why"
462
-
463
- reference_to Registry
464
- attribute :refusal, Report, sets: true
465
-
466
-
467
- emits ReleaseAbandoned
468
- end
469
-
470
- # `hecks package.check [root=path]`: a read of the repository's files and tags, so it keeps no
471
- # record. A package that changed since its latest release without a version bump and a changelog
472
- # entry refuses it, naming each one.
473
- query "Check" do
474
- description "Judge every package against its latest release: a changed package needs a newer version and a changelog entry."
475
- attribute :root, Location, optional: true
476
- returns Document
477
- end
478
-
479
- # `hecks package.digest <package> [root=path]`: a read of the package's files, so it keeps no
480
- # record. The digest is `Lock.digest_of` over `<package>/bluebook/*.bluebook` only (the
481
- # `bluebook.lock` digest line), then the package's shape labels; `root` is the registry, or a
482
- # project that vendors the package.
483
- query "Digest" do
484
- description "Print a package's content digest and shape labels, as its bluebook.lock records them."
485
- attribute :package, PackageName
486
- attribute :root, Location, optional: true
487
- returns Document
488
- end
489
-
490
- query "Releasing" do
491
- description "What releasing one run did: its status, and the report or the refusal."
492
- attribute :run, RegistryKey
493
- where(run: :run)
494
- order_by :run
495
- end
496
-
497
- query "Refused" do
498
- description "Every release that was refused."
499
- where(status: "refused")
500
- order_by :run
501
- end
502
- end
503
-
504
- policy "TagWhenReleased" do
505
- on "Registry.ReleaseRequested"
506
- ask :tag, with: { run: :run }
507
- end
508
-
509
- policy "RecordTheTag" do
510
- on "Registry.ReleaseTagged"
511
- trigger Registry::Complete, with: { report: :report }
512
- end
513
-
514
- policy "RecordTheRefusedTag" do
515
- on "Registry.ReleaseRefused"
516
- trigger Registry::Abandon, with: { refusal: :refusal }
517
- end
518
-
519
- # A run record for one launch onto the framework, not an adapter: the driving adapters live in `Hecks::Adapters::Driving`.
520
- aggregate "Launch" do
521
- description "A way into the framework opened for a project: its launchers, or an MCP server."
522
-
523
- attribute :run, LaunchKey
524
- attribute :domains, DomainList, optional: true
525
- attribute :stdio, Switch, optional: true
526
- attribute :name, DomainName, optional: true
527
- attribute :adapter, AdapterName, optional: true
528
- attribute :dir, TargetDir, optional: true
529
- attribute :expert, ExpertName, optional: true
530
- attribute :no_ai, Switch, optional: true
531
- attribute :output, Note, optional: true
532
- attribute :refusal, Note, optional: true
533
- identified_by :run
534
-
535
- value_object "LaunchKey" do
536
- attribute :value, String, matches: :present
537
-
538
- invariant("a launch is named") { !value.to_s.empty? }
539
- end
540
-
541
- # Domain directories under the project, comma separated.
542
- value_object "DomainList" do
543
- attribute :value, String, matches: :not_empty
544
- end
545
-
546
- value_object "Switch" do
547
- attribute :value, Boolean
548
- end
549
-
550
- # What a new domain is called, as its bluebook spells it: a capital and then letters and digits.
551
- value_object "DomainName" do
552
- attribute :value, String, matches: :capitalized
553
- end
554
-
555
- # A persistence adapter a stub can be bound to; `Hecks::CLI::DomainStub` names the ones it knows.
556
- value_object "AdapterName" do
557
- attribute :value, String, pattern: '[A-Za-z]+'
558
- end
559
-
560
- # Where the new domain goes; the domain's snake-cased name under the current directory when absent.
561
- value_object "TargetDir" do
562
- attribute :value, String, matches: :not_empty
563
- end
564
-
565
- # Who is interviewed; asked for at the terminal when absent.
566
- value_object "ExpertName" do
567
- attribute :value, String, matches: :not_empty
568
- end
569
-
570
- value_object "Note" do
571
- attribute :value, String
572
- end
573
-
574
- lifecycle :status, default: "requested" do
575
- mark :failure, "stopped"
576
- transition "Finish" => "finished", from: "requested"
577
- transition "Stop" => "stopped", from: "requested"
578
- mark :terminal, "finished", "stopped"
579
- end
580
-
581
- # Writes a launcher beside each domain. It replaces the generated launcher already there and
582
- # deletes nothing, so it runs without `confirm` (`hecks project_cli` never asked for one).
583
- command "ProjectCli" do
584
- role "Operator"
585
- goal "Write a command-line launcher beside each domain of this project"
586
-
587
- attribute :run, LaunchKey, sets: true
588
- attribute :domains, DomainList, optional: true, sets: true
589
-
590
-
591
- emits LaunchersRequested
592
- end
593
-
594
- # Writes the stub files of a new domain (ADR 0087). It asks nothing and replaces nothing: a
595
- # directory that already holds any file it would write is refused, with that file named.
596
- command "Init" do
597
- role "Operator"
598
- goal "Write the stub files of a new domain"
599
-
600
- attribute :run, LaunchKey, sets: true
601
- attribute :name, DomainName, sets: true
602
- attribute :adapter, AdapterName, optional: true, sets: true
603
- attribute :dir, TargetDir, optional: true, sets: true
604
-
605
-
606
- emits StubRequested
607
- end
608
-
609
- # Writes the files a Rails app needs to drive its domain through hecks-rails: a controller per
610
- # aggregate and the routes file, read from the `bluebook/` under `dir` (the current directory
611
- # when absent). Models are generated at boot and need no file. A file already there is the
612
- # app's own and is left alone, so it runs without `confirm`.
613
- command "ProjectRails" do
614
- role "Operator"
615
- goal "Write the controllers and routes a Rails app drives its domain through"
616
-
617
- attribute :run, LaunchKey, sets: true
618
- attribute :dir, TargetDir, optional: true, sets: true
619
-
620
-
621
- emits RailsRequested
622
- end
623
-
624
- # Holds an interview with a subject matter expert and drafts a first domain from it (ADR 0088).
625
- # The Terminal adapter runs the conversation, as it runs a console; the journal records that one
626
- # was held and how it ended, not what was said. `--no-ai` leaves the model out.
627
- command "Interview" do
628
- role "Operator"
629
- goal "Hold an interview with a subject matter expert and draft a first domain from it"
630
-
631
- attribute :run, LaunchKey, sets: true
632
- attribute :name, DomainName, sets: true
633
- attribute :adapter, AdapterName, optional: true, sets: true
634
- attribute :dir, TargetDir, optional: true, sets: true
635
- attribute :expert, ExpertName, optional: true, sets: true
636
- attribute :no_ai, Switch, optional: true, sets: true
637
-
638
-
639
- emits InterviewRequested
640
- end
641
-
642
- # A stdio server runs until its client closes stdin, so it cannot be asked and answered
643
- # quickly like the others. The command records that the launch was started; the Terminal
644
- # adapter hands the process over to the launch and answers when it closes, as OpenConsole
645
- # does for a console. The launcher spells it `serve_mcp`; the `mcp` spelling exe/hecks ships
646
- # today stays with its router until the launcher is generated.
647
- command "ServeMcp" do
648
- role "Operator"
649
- goal "Serve the storehouse bus to an MCP client over stdio until it closes"
650
-
651
- attribute :run, LaunchKey, sets: true
652
- attribute :stdio, Switch, optional: true, sets: true
653
-
654
-
655
- emits McpRequested
656
- end
657
-
658
- command "Finish" do
659
- role "System"
660
- goal "Record that the launch did its work, or was closed, and what it said"
661
-
662
- reference_to Launch
663
- attribute :output, Note, sets: true
664
-
665
-
666
- emits LaunchFinished
667
- end
668
-
669
- command "Stop" do
670
- role "System"
671
- goal "Record that the launch could not be opened, and why"
672
-
673
- reference_to Launch
674
- attribute :refusal, Note, sets: true
675
-
676
-
677
- emits LaunchStopped
678
- end
679
-
680
- query "Ended" do
681
- description "How one launch ended: its status, and what it said or why it stopped."
682
- attribute :run, LaunchKey
683
- where(run: :run)
684
- order_by :run
685
- end
686
-
687
- query "Stopped" do
688
- description "Every launch that could not be opened."
689
- where(status: "stopped")
690
- order_by :run
691
- end
692
- end
693
-
694
- policy "WriteWhenRequested" do
695
- on "Launch.LaunchersRequested"
696
- ask :write, with: { run: :run }
697
- end
698
-
699
- policy "ScaffoldWhenRequested" do
700
- on "Launch.StubRequested"
701
- ask :scaffold, with: { run: :run }
702
- end
703
-
704
- policy "ProjectRailsWhenRequested" do
705
- on "Launch.RailsRequested"
706
- ask :write_rails, with: { run: :run }
707
- end
708
-
709
- policy "ConverseWhenRequested" do
710
- on "Launch.InterviewRequested"
711
- ask :converse, with: { run: :run }
712
- end
713
-
714
- policy "ServeWhenRequested" do
715
- on "Launch.McpRequested"
716
- ask :serve, with: { run: :run }
717
- end
718
-
719
- policy "RecordTheLaunch" do
720
- on "Launch.LaunchAnswered"
721
- trigger Launch::Finish, with: { output: :output }
722
- end
723
-
724
- policy "RecordTheStoppedLaunch" do
725
- on "Launch.LaunchRefused"
726
- trigger Launch::Stop, with: { refusal: :refusal }
727
- end
728
-
729
- aggregate "Build" do
730
- description "One build of a domain for the Rust host, or a check of that build against Ruby."
731
-
732
- acknowledges :key_by_value, "the domain's path, and Introspection declares queries only, so it holds no records and a reference would be refused on every write",
733
- of: :domain
734
-
735
- attribute :run, BuildKey
736
- attribute :domain, DomainPath, optional: true
737
- attribute :script, ScriptPath, optional: true
738
- attribute :artifact, Artifact, optional: true
739
- attribute :target, TargetTriple, optional: true
740
- attribute :stage_dir, StagePath, optional: true
741
- attribute :profile, WasmProfile, optional: true
742
- attribute :prebuilt, Switch, optional: true
743
- attribute :seeds, Count, optional: true
744
- attribute :steps, Count, optional: true
745
- attribute :output, Report, optional: true
746
- attribute :refusal, Report, optional: true
747
- identified_by :run
748
-
749
- value_object "BuildKey" do
750
- attribute :value, String, matches: :present
751
-
752
- invariant("a build is named") { !value.to_s.empty? }
753
- end
754
-
755
- # A domain directory. Its last part is also a Rust module and a Cargo feature, so it is a
756
- # lowercase identifier; the toolchain refuses the reserved words the pattern cannot.
757
- value_object "DomainPath" do
758
- attribute :value, String, pattern: '(^|/)[a-z][a-z0-9_]*/?$'
759
- end
760
-
761
- # A generated module: the directory name a domain was built as.
762
- value_object "ModuleName" do
763
- attribute :value, String, matches: :snake_name
764
- end
765
-
766
- # A JSON file of steps for a domain to replay.
767
- value_object "ScriptPath" do
768
- attribute :value, String, matches: :not_empty
769
- end
770
-
771
- # What a build is replayed through: `native`, `build` (the domain's own feature), a `.wasm`
772
- # module, or a binary.
773
- value_object "Artifact" do
774
- attribute :value, String, matches: :present
775
- end
776
-
777
- # A Rust target triple: `<arch>-<vendor>-<os>` with an optional `-<env>`. The toolchain
778
- # refuses the triples a host cannot be built for (a wasm target) and the ones not installed.
779
- value_object "TargetTriple" do
780
- attribute :value, String, pattern: '^[a-z0-9_]+(-[a-z0-9_.]+){2,3}$'
781
- end
782
-
783
- # The directory a host build stages its files in.
784
- value_object "StagePath" do
785
- attribute :value, String, matches: :not_empty
786
- end
787
-
788
- value_object "Count" do
789
- attribute :value, Integer
790
-
791
- invariant("a count is positive") { value > 0 }
792
- end
793
-
794
- # The Cargo profile a wasm module is built with: `dev` compiles much faster, for tests that only
795
- # run the module, not for one that ships.
796
- value_object "WasmProfile" do
797
- attribute :value, String, pattern: '^(release|dev)$'
798
- end
799
-
800
- # Whether the host build may download a published binary instead of compiling it.
801
- value_object "Switch" do
802
- attribute :value, Boolean
803
- end
804
-
805
- value_object "CodegenName" do
806
- attribute :value, String, pattern: '^(ruby|rust)$'
807
- end
808
-
809
- value_object "Report" do
810
- attribute :value, String
811
- end
812
-
813
- lifecycle :status, default: "requested" do
814
- mark :failure, "faulted"
815
- transition "Complete" => "completed", from: "requested"
816
- transition "Fault" => "faulted", from: "requested"
817
- mark :terminal, "completed", "faulted"
818
- end
819
-
820
- # Writes the domain's Rust source and a Cargo feature for it into the build workspace: the
821
- # checkout's own `rust/`, or a copy of the packaged workspace under `.hecks/rust/<version>/`.
822
- # Nothing is ever written into the installed gem.
823
- command "ProjectRust" do
824
- role "Operator"
825
- goal "Generate a domain's Rust source for the Rust host"
826
-
827
- attribute :domain, DomainPath, sets: true
828
- attribute :run, BuildKey, sets: true
829
-
830
-
831
- emits RustProjectionRequested
832
- end
833
-
834
- command "BuildWasm" do
835
- role "Operator"
836
- goal "Compile a domain to a WASI module a runtime such as wasmtime can run"
837
-
838
- attribute :domain, DomainPath, sets: true
839
- attribute :run, BuildKey, sets: true
840
- attribute :profile, WasmProfile, default: "release", sets: true
841
-
842
-
843
- emits WasmBuildRequested
844
- end
845
-
846
- # Compiles the host binary from the installed gem's workspace for the target and stages it with
847
- # the domain's `.wasm` and `.ir.json` (in `.hecks/host/<target>/` unless `stage_dir` names a
848
- # directory), the files a container image copies in.
849
- command "BuildHost" do
850
- role "Operator"
851
- goal "Build the Rust host for a domain, with its wasm and IR, ready to copy into an image"
852
-
853
- attribute :domain, DomainPath, sets: true
854
- attribute :run, BuildKey, sets: true
855
- attribute :target, TargetTriple, optional: true, sets: true
856
- attribute :stage_dir, StagePath, optional: true, sets: true
857
- attribute :prebuilt, Switch, default: true, sets: true
858
-
859
-
860
- emits HostBuildRequested
861
- end
862
-
863
- command "BuildBrowserWasm" do
864
- role "Operator"
865
- goal "Compile a domain to an ES module a browser can import"
866
-
867
- attribute :domain, DomainPath, sets: true
868
- attribute :run, BuildKey, sets: true
869
-
870
-
871
- emits BrowserWasmBuildRequested
872
- end
873
-
874
- # Without an artifact it answers Ruby's own result, which saved to a file becomes a pinned
875
- # expectation; with one it compares Ruby's result with that artifact's.
876
- command "CheckConformance" do
877
- role "Operator"
878
- goal "Replay a script through Ruby and a Rust build of the domain and compare what each did"
879
-
880
- attribute :domain, DomainPath, sets: true
881
- attribute :script, ScriptPath, sets: true
882
- attribute :run, BuildKey, sets: true
883
- attribute :artifact, Artifact, optional: true, sets: true
884
-
885
-
886
- emits ConformanceRequested
887
- end
888
-
889
- command "FuzzConformance" do
890
- role "Operator"
891
- goal "Replay generated sequences through Ruby and a Rust build of the domain and compare them"
892
-
893
- attribute :domain, DomainPath, sets: true
894
- attribute :artifact, Artifact, sets: true
895
- attribute :run, BuildKey, sets: true
896
- attribute :seeds, Count, optional: true, sets: true
897
- attribute :steps, Count, optional: true, sets: true
898
-
899
-
900
- emits ConformanceFuzzRequested
901
- end
902
-
903
- command "CheckCoverageAllowlist" do
904
- role "Operator"
905
- goal "Check that every rule excusing a Rust coverage gap still excuses a real one"
906
-
907
- attribute :run, BuildKey, sets: true
908
-
909
-
910
- emits CoverageAllowlistRequested
911
- end
912
-
913
- command "Complete" do
914
- role "System"
915
- goal "Record that the build or check ended well, and what it reported"
916
-
917
- reference_to Build
918
- attribute :output, Report, sets: true
919
-
920
-
921
- emits BuildCompleted
922
- end
923
-
924
- command "Fault" do
925
- role "System"
926
- goal "Record that the build or check was refused or found a difference, and what it said"
927
-
928
- reference_to Build
929
- attribute :refusal, Report, sets: true
930
-
931
-
932
- emits BuildFaulted
933
- end
934
-
935
- query "Result" do
936
- description "How one build or check ended: its status, and what it reported or why it failed."
937
- attribute :run, BuildKey
938
- where(run: :run)
939
- order_by :run
940
- end
941
-
942
- query "Faulted" do
943
- description "Every build or check that was refused or found a difference."
944
- where(status: "faulted")
945
- order_by :run
946
- end
947
-
948
- # An answer that is one document of text, exactly as the tool that produced it wrote it.
949
- value_object "Document" do
950
- attribute :text, String
951
- end
952
-
953
- query "RustCoverage" do
954
- description "Whether each construct of a generated module has a routed Rust implementation."
955
- attribute :module_name, ModuleName
956
- attribute :codegen, CodegenName, optional: true
957
- returns Document
958
- end
959
- end
960
-
961
- policy "GenerateWhenRequested" do
962
- on "Build.RustProjectionRequested"
963
- ask :generate, with: { run: :run }
964
- end
965
-
966
- policy "CompileWasmWhenRequested" do
967
- on "Build.WasmBuildRequested"
968
- ask :wasm, with: { run: :run }
969
- end
970
-
971
- policy "BuildHostWhenRequested" do
972
- on "Build.HostBuildRequested"
973
- ask :host, with: { run: :run }
974
- end
975
-
976
- policy "CompileBrowserWasmWhenRequested" do
977
- on "Build.BrowserWasmBuildRequested"
978
- ask :browser_wasm, with: { run: :run }
979
- end
980
-
981
- policy "ConformWhenRequested" do
982
- on "Build.ConformanceRequested"
983
- ask :conform, with: { run: :run }
984
- end
985
-
986
- policy "ReplayWhenRequested" do
987
- on "Build.ConformanceFuzzRequested"
988
- ask :replay, with: { run: :run }
989
- end
990
-
991
- policy "AuditWhenRequested" do
992
- on "Build.CoverageAllowlistRequested"
993
- ask :audit, with: { run: :run }
994
- end
995
-
996
- policy "RecordTheBuild" do
997
- on "Build.BuildAnswered"
998
- trigger Build::Complete, with: { output: :output }
999
- end
1000
-
1001
- policy "RecordTheFault" do
1002
- on "Build.BuildRefused"
1003
- trigger Build::Fault, with: { refusal: :refusal }
1004
- end
1005
-
1006
- # Named for the run, as ModelCheckRun is: `Hecks::Fuzzing` is the fuzzing toolkit's own module,
1007
- # so a hecksagon could not spell an aggregate of that name.
1008
- aggregate "FuzzRun" do
1009
- description "One fuzz sweep or benchmark, and how it ended; and the generated sequences it replays."
1010
-
1011
- acknowledges :key_by_value, "the domain's path, and Introspection declares queries only, so it holds no records and a reference would be refused on every write",
1012
- of: :domain
1013
-
1014
- attribute :domain, DomainPath, optional: true
1015
- attribute :run, FuzzKey
1016
- attribute :seeds, Count, optional: true
1017
- attribute :steps, Count, optional: true
1018
- attribute :workers, Count, optional: true
1019
- attribute :budget, Count, optional: true
1020
- attribute :adapter, Persistence, optional: true
1021
- attribute :persist_regressions, RegressionSwitch, optional: true
1022
- attribute :domains, NameList, optional: true
1023
- attribute :targets, NameList, optional: true
1024
- attribute :iterations, Count, optional: true
1025
- attribute :warmup, Warmup, optional: true
1026
- attribute :runs, Count, optional: true
1027
- attribute :rust_binary, BinaryPath, optional: true
1028
- attribute :format, Format, optional: true
1029
- attribute :output, OutputPath, optional: true
1030
- attribute :report, Report, optional: true
1031
- attribute :refusal, Report, optional: true
1032
- identified_by :run
1033
-
1034
- value_object "FuzzKey" do
1035
- attribute :value, String, matches: :present
1036
-
1037
- invariant("a sweep is named") { !value.to_s.empty? }
1038
- end
1039
-
1040
- # A domain directory; a sweep with none covers every domain of a hecks checkout.
1041
- value_object "DomainPath" do
1042
- attribute :value, String, matches: :not_empty
1043
-
1044
- invariant("a domain is named by its path") { !value.to_s.empty? }
1045
- end
1046
-
1047
- value_object "Count" do
1048
- attribute :value, Integer
1049
-
1050
- invariant("a count is positive") { value > 0 }
1051
- end
1052
-
1053
- value_object "Warmup" do
1054
- attribute :value, Integer
1055
-
1056
- invariant("a warmup is not negative") { value >= 0 }
1057
- end
1058
-
1059
- # Which persistence every ephemeral boot of a sweep uses.
1060
- value_object "Persistence" do
1061
- attribute :value, String, pattern: '^(memory|sqlite|postgres)$'
1062
- end
1063
-
1064
- # Whether each distinct finding's minimized repro is also kept under `spec/corpus/regressions/`.
1065
- value_object "RegressionSwitch" do
1066
- attribute :value, Boolean
1067
- end
1068
-
1069
- # Names, comma separated: benchmark domains, or the targets to measure.
1070
- value_object "NameList" do
1071
- attribute :value, String, matches: :csv_list
1072
- end
1073
-
1074
- value_object "BinaryPath" do
1075
- attribute :value, String, matches: :not_empty
1076
- end
1077
-
1078
- value_object "Format" do
1079
- attribute :value, String, pattern: '^(markdown|json)$'
1080
- end
1081
-
1082
- value_object "OutputPath" do
1083
- attribute :value, String, matches: :not_empty
1084
- end
1085
-
1086
- value_object "Report" do
1087
- attribute :value, String
1088
- end
1089
-
1090
- lifecycle :status, default: "requested" do
1091
- mark :failure, "halted"
1092
- transition "Conclude" => "concluded", from: "requested"
1093
- transition "Halt" => "halted", from: "requested"
1094
- mark :terminal, "concluded", "halted"
1095
- end
1096
-
1097
- # A sweep replays generated command and query sequences and checks properties over each.
1098
- # A finding is shrunk and saved under `tmp/fuzz-failures/`, and ends the run as halted, with
1099
- # what was found. Sweeping every domain of a checkout needs a hecks checkout; a client names
1100
- # the domain. The sweep runs in child processes started through the ProcessPool adapter, so an
1101
- # interrupt reaches the workers.
1102
- command "Fuzz" do
1103
- role "Operator"
1104
- goal "Fuzz a domain with generated sequences and keep whether anything broke a property"
1105
-
1106
- attribute :domain, DomainPath, optional: true, sets: true
1107
- attribute :run, FuzzKey, sets: true
1108
- attribute :seeds, Count, optional: true, sets: true
1109
- attribute :steps, Count, optional: true, sets: true
1110
- attribute :workers, Count, optional: true, sets: true
1111
- attribute :adapter, Persistence, optional: true, sets: true
1112
- attribute :persist_regressions, RegressionSwitch, optional: true, sets: true
1113
-
1114
-
1115
- emits FuzzRequested
1116
- end
1117
-
1118
- # Mutation-tests a domain's own checks: changes its bluebooks in small ways and keeps which
1119
- # changes the fuzz properties, the corpus script and the domain's behaviors tests let through.
1120
- # A survivor is a hole in those checks. `budget` caps how many mutants are tried. The run is a
1121
- # child process started through the ProcessPool adapter, as a sweep is.
1122
- command "Mutate" do
1123
- role "Operator"
1124
- goal "Mutate a domain's rules and keep whether its checks noticed each change"
1125
-
1126
- attribute :domain, DomainPath, sets: true
1127
- attribute :run, FuzzKey, sets: true
1128
- attribute :seeds, Count, optional: true, sets: true
1129
- attribute :steps, Count, optional: true, sets: true
1130
- attribute :budget, Count, optional: true, sets: true
1131
-
1132
-
1133
- emits MutateRequested
1134
- end
1135
-
1136
- # Measures each persistence adapter, and the Rust binary when there is one to build or use.
1137
- # The report is kept in this record, which the Hecks domain binds to Memory: keeping a
1138
- # domain's benchmark history beside it, in Sqlite under the project's `.hecks/`, is decided
1139
- # with the persistence binding for Custodian, not here. `output` also writes the full JSON.
1140
- command "Bench" do
1141
- role "Operator"
1142
- goal "Measure command throughput and latency for each target, and keep the report"
1143
-
1144
- attribute :run, FuzzKey, sets: true
1145
- attribute :domains, NameList, optional: true, sets: true
1146
- attribute :targets, NameList, optional: true, sets: true
1147
- attribute :iterations, Count, optional: true, sets: true
1148
- attribute :warmup, Warmup, optional: true, sets: true
1149
- attribute :runs, Count, optional: true, sets: true
1150
- attribute :rust_binary, BinaryPath, optional: true, sets: true
1151
- attribute :format, Format, optional: true, sets: true
1152
- attribute :output, OutputPath, optional: true, sets: true
1153
-
1154
-
1155
- emits BenchRequested
1156
- end
1157
-
1158
- command "Conclude" do
1159
- role "System"
1160
- goal "Record that the sweep or benchmark ended well, and what it reported"
1161
-
1162
- reference_to FuzzRun
1163
- attribute :report, Report, sets: true
1164
-
1165
-
1166
- emits FuzzConcluded
1167
- end
1168
-
1169
- command "Halt" do
1170
- role "System"
1171
- goal "Record that the sweep found something or the benchmark could not run, and what it said"
1172
-
1173
- reference_to FuzzRun
1174
- attribute :refusal, Report, sets: true
1175
-
1176
-
1177
- emits FuzzHalted
1178
- end
1179
-
1180
- query "Conclusion" do
1181
- description "How one sweep or benchmark ended: its status, and what it reported or found."
1182
- attribute :run, FuzzKey
1183
- where(run: :run)
1184
- order_by :run
1185
- end
1186
-
1187
- query "Halted" do
1188
- description "Every sweep that found something and every benchmark that could not run."
1189
- where(status: "halted")
1190
- order_by :run
1191
- end
1192
-
1193
- # An answer that is one document of text, exactly as the tool that produced it wrote it.
1194
- value_object "Document" do
1195
- attribute :text, String
1196
- end
1197
-
1198
- # The generator `hecks fuzz` draws from, on its own: one valid dispatch sequence as a
1199
- # replayable script. `adversarial` is the fraction of steps mutated to be refused; 0 is off.
1200
- query "GenerateSequence" do
1201
- description "One generated, valid dispatch sequence for a domain, as a script `hecks run` replays."
1202
- attribute :domain, DomainPath
1203
- attribute :seed, Integer, optional: true
1204
- attribute :steps, Integer, optional: true
1205
- attribute :adversarial, Float, optional: true
1206
- returns Document
1207
- end
1208
- end
1209
-
1210
- policy "SweepWhenRequested" do
1211
- on "FuzzRun.FuzzRequested"
1212
- ask :sweep, with: { run: :run }
1213
- end
1214
-
1215
- policy "MutateWhenRequested" do
1216
- on "FuzzRun.MutateRequested"
1217
- ask :probe, with: { run: :run }
1218
- end
1219
-
1220
- policy "MeasureWhenRequested" do
1221
- on "FuzzRun.BenchRequested"
1222
- ask :measure, with: { run: :run }
1223
- end
1224
-
1225
- policy "RecordTheSweep" do
1226
- on "FuzzRun.FuzzAnswered"
1227
- trigger FuzzRun::Conclude, with: { report: :report }
1228
- end
1229
-
1230
- policy "RecordTheFinding" do
1231
- on "FuzzRun.FuzzRefused"
1232
- trigger FuzzRun::Halt, with: { refusal: :refusal }
1233
- end
1234
- end