hecks 3.9.1 → 3.11.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 (504) hide show
  1. checksums.yaml +4 -4
  2. data/examples/pizzas/bluebook/pizzas.bluebook +29 -0
  3. data/examples/pizzas/bluebook/pizzas.hecksagon +7 -0
  4. data/exe/hecks +4 -4
  5. data/lib/hecks/adapters/driven/d1.rb +2 -10
  6. data/lib/hecks/adapters/driven/heki.adapter +1 -1
  7. data/lib/hecks/adapters/driven/heki.rb +2 -12
  8. data/lib/hecks/adapters/driven/lambda.adapter +1 -1
  9. data/lib/hecks/adapters/driven/lambda.rb +3 -18
  10. data/lib/hecks/adapters/driven/postgres.rb +4 -11
  11. data/lib/hecks/adapters/driven/sqlite.adapter +1 -1
  12. data/lib/hecks/adapters/driven/sqlite.rb +2 -10
  13. data/lib/hecks/adapters/driving/admission.rb +46 -0
  14. data/lib/hecks/adapters/driving/cli/nesting.rb +36 -0
  15. data/lib/hecks/adapters/driving/cli/shorthand.rb +88 -0
  16. data/lib/hecks/adapters/driving/cli.rb +127 -0
  17. data/lib/hecks/adapters/driving/cli_runner/answers.rb +160 -0
  18. data/lib/hecks/adapters/driving/cli_runner/resolution.rb +155 -0
  19. data/lib/hecks/adapters/driving/cli_runner/settling.rb +120 -0
  20. data/lib/hecks/adapters/driving/cli_runner/streaming.rb +93 -0
  21. data/lib/hecks/adapters/driving/cli_runner/suggestions.rb +47 -0
  22. data/lib/hecks/adapters/driving/cli_runner.rb +69 -0
  23. data/lib/hecks/adapters/driving/command_request.rb +121 -0
  24. data/lib/hecks/adapters/driving/handle.rb +214 -0
  25. data/lib/hecks/adapters/driving/json.rb +136 -0
  26. data/lib/hecks/adapters/driving/launcher_options.rb +267 -0
  27. data/lib/hecks/adapters/driving/mcp/properties.rb +49 -0
  28. data/lib/hecks/adapters/driving/mcp/tool_calls.rb +116 -0
  29. data/lib/hecks/adapters/driving/mcp/tool_definitions/auditing.rb +53 -0
  30. data/lib/hecks/adapters/driving/mcp/tool_definitions/calling.rb +71 -0
  31. data/lib/hecks/adapters/driving/mcp/tool_definitions/reading.rb +99 -0
  32. data/lib/hecks/adapters/driving/mcp/tool_definitions.rb +18 -0
  33. data/lib/hecks/adapters/driving/mcp.rb +159 -0
  34. data/lib/hecks/adapters/driving/mcp_guide_cache.rb +78 -0
  35. data/lib/hecks/adapters/driving/mcp_scope/argument_policy.rb +97 -0
  36. data/lib/hecks/adapters/driving/mcp_scope/env_problems.rb +69 -0
  37. data/lib/hecks/adapters/driving/mcp_scope/presenter.rb +83 -0
  38. data/lib/hecks/adapters/driving/mcp_scope.rb +213 -0
  39. data/lib/hecks/adapters/driving/ruby/aggregate_module.rb +171 -0
  40. data/lib/hecks/adapters/driving/ruby/chapter.rb +91 -0
  41. data/lib/hecks/adapters/driving/ruby.rb +83 -0
  42. data/lib/hecks/adapters/driving/usage_cache.rb +144 -0
  43. data/lib/hecks/{doors.rb → adapters/driving.rb} +10 -6
  44. data/lib/hecks/behaviors/expectations/boot.rb +1 -1
  45. data/lib/hecks/bench/ruby_runner.rb +1 -1
  46. data/lib/hecks/bluebook/ask_resolution.rb +130 -0
  47. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +8 -2
  48. data/lib/hecks/bluebook/assembly/contracts/rules.rb +4 -2
  49. data/lib/hecks/bluebook/assembly/contracts/structure.rb +3 -1
  50. data/lib/hecks/bluebook/assembly/marks.rb +1 -0
  51. data/lib/hecks/bluebook/attribute.rb +1 -1
  52. data/lib/hecks/bluebook/behaviour/command.rb +13 -8
  53. data/lib/hecks/bluebook/behaviour/policy.rb +30 -0
  54. data/lib/hecks/bluebook/capabilities/attribute_values.rb +72 -0
  55. data/lib/hecks/bluebook/capabilities.rb +91 -9
  56. data/lib/hecks/bluebook/domain_port.rb +16 -4
  57. data/lib/hecks/bluebook/dsl/adapter_builder.rb +18 -6
  58. data/lib/hecks/bluebook/dsl/binding_proxy.rb +13 -0
  59. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/computed_sources.rb +98 -0
  60. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/fan_out_rows.rb +42 -0
  61. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/projected_fields.rb +14 -2
  62. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/provisions.rb +69 -3
  63. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/with_projections.rb +17 -10
  64. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +5 -0
  65. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -0
  66. data/lib/hecks/bluebook/dsl/command_builder/mutations.rb +8 -1
  67. data/lib/hecks/bluebook/dsl/command_builder/operands.rb +121 -0
  68. data/lib/hecks/bluebook/dsl/command_builder.rb +2 -0
  69. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +10 -1
  70. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +45 -2
  71. data/lib/hecks/bluebook/dsl/policy_builder.rb +47 -10
  72. data/lib/hecks/bluebook/dsl/rule_reference.rb +7 -4
  73. data/lib/hecks/bluebook/dsl/world_builder.rb +1 -1
  74. data/lib/hecks/bluebook/expression/ast_json/emitters.rb +6 -0
  75. data/lib/hecks/bluebook/expression/ast_json.rb +9 -6
  76. data/lib/hecks/bluebook/expression/ast_reader.rb +14 -9
  77. data/lib/hecks/bluebook/expression/projection.json +36 -0
  78. data/lib/hecks/bluebook/expression/resolver/operations.rb +31 -0
  79. data/lib/hecks/bluebook/expression/resolver/parsing.rb +38 -5
  80. data/lib/hecks/bluebook/expression/resolver/scanning.rb +22 -5
  81. data/lib/hecks/bluebook/expression/resolver/values.rb +10 -0
  82. data/lib/hecks/bluebook/expression/resolver.rb +20 -1
  83. data/lib/hecks/bluebook/hecksagon.rb +23 -3
  84. data/lib/hecks/bluebook/lifecycle.rb +22 -3
  85. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +13 -1
  86. data/lib/hecks/bluebook/meta_validator/modes.rb +4 -1
  87. data/lib/hecks/bluebook/meta_validator/readings.rb +18 -1
  88. data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +2 -1
  89. data/lib/hecks/bluebook/meta_validator/shapes.rb +5 -0
  90. data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +1 -1
  91. data/lib/hecks/bluebook/meta_validator.rb +12 -12
  92. data/lib/hecks/bluebook/model_check/ask_checks.rb +71 -0
  93. data/lib/hecks/bluebook/model_check/policy_checks.rb +2 -1
  94. data/lib/hecks/bluebook/model_check/reference_checks.rb +70 -0
  95. data/lib/hecks/bluebook/model_check.rb +8 -2
  96. data/lib/hecks/bluebook/policy.rb +4 -2
  97. data/lib/hecks/bluebook/smoke_test.rb +1 -1
  98. data/lib/hecks/bluebook/synthesizer.rb +2 -0
  99. data/lib/hecks/bluebook.rb +1 -0
  100. data/lib/hecks/cli/command_table.rb +1 -1
  101. data/lib/hecks/cli/console.rb +2 -1
  102. data/lib/hecks/cli/document.rb +1 -1
  103. data/lib/hecks/cli/launcher_words.rb +4 -4
  104. data/lib/hecks/cli/mcp.rb +4 -4
  105. data/lib/hecks/cli/project_cli/launcher_source.rb +2 -2
  106. data/lib/hecks/cli/project_cli/templates.rb +5 -5
  107. data/lib/hecks/cli/project_cli.rb +9 -6
  108. data/lib/hecks/cli/run.rb +2 -2
  109. data/lib/hecks/cli/smoke_http/checks.rb +4 -1
  110. data/lib/hecks/cli/smoke_http/transport.rb +3 -3
  111. data/lib/hecks/cli/smoke_http.rb +3 -0
  112. data/lib/hecks/codemod.rb +5 -2
  113. data/lib/hecks/corpus/routes.rb +7 -0
  114. data/lib/hecks/corpus/rust.rb +3 -2
  115. data/lib/hecks/deploy/bluebook/deploy.bluebook +124 -2
  116. data/lib/hecks/deploy/bluebook/deploy.hecksagon +8 -0
  117. data/lib/hecks/deploy/oidc.json +16 -3
  118. data/lib/hecks/doc/reference/rendering.rb +6 -3
  119. data/lib/hecks/forms/app/commands.rb +8 -7
  120. data/lib/hecks/forms/app/queries.rb +2 -1
  121. data/lib/hecks/forms/app.rb +1 -1
  122. data/lib/hecks/forms/record_renderer.rb +1 -1
  123. data/lib/hecks/framework/bluebook/privacy.bluebook +11 -0
  124. data/lib/hecks/fuzzing/concurrent_dispatch.rb +4 -1
  125. data/lib/hecks/fuzzing/failure_triage.rb +2 -1
  126. data/lib/hecks/fuzzing/mutation/run.rb +11 -4
  127. data/lib/hecks/fuzzing/properties/catalog.rb +6 -4
  128. data/lib/hecks/fuzzing/properties/guaranteed_by_construction.rb +18 -11
  129. data/lib/hecks/fuzzing/properties/guards.rb +1 -1
  130. data/lib/hecks/fuzzing/self_consistency/saga_redelivery.rb +1 -1
  131. data/lib/hecks/fuzzing/self_consistency.rb +6 -2
  132. data/lib/hecks/fuzzing/shrinker.rb +3 -1
  133. data/lib/hecks/fuzzing/value_generator.rb +19 -5
  134. data/lib/hecks/gate/stages.yml +4 -10
  135. data/lib/hecks/grammar/evolve.rb +1 -1
  136. data/lib/hecks/grammar/expression_operators.json +372 -0
  137. data/lib/hecks/grammar/operators.rb +3 -1
  138. data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +10 -10
  139. data/lib/hecks/hecks/adapters/codebase/inspection/rubycritic.rb +35 -0
  140. data/lib/hecks/hecks/adapters/codebase/inspection.rb +104 -0
  141. data/lib/hecks/hecks/adapters/codebase/publishing.rb +2 -1
  142. data/lib/hecks/hecks/adapters/codebase/release_facts.rb +12 -2
  143. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +2 -1
  144. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +1 -1
  145. data/lib/hecks/hecks/adapters/cost_explorer.rb +8 -5
  146. data/lib/hecks/hecks/adapters/deploy_toolchain/clearing.rb +51 -0
  147. data/lib/hecks/hecks/adapters/deploy_toolchain/statuses.rb +2 -1
  148. data/lib/hecks/hecks/adapters/deploy_toolchain.rb +2 -0
  149. data/lib/hecks/hecks/adapters/finding_github.rb +13 -6
  150. data/lib/hecks/hecks/adapters/first_admin.rb +2 -2
  151. data/lib/hecks/hecks/adapters/github_rulesets.rb +6 -3
  152. data/lib/hecks/hecks/adapters/in_process_boot.rb +1 -1
  153. data/lib/hecks/hecks/adapters/journal_store/compaction.rb +1 -1
  154. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +10 -20
  155. data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +28 -5
  156. data/lib/hecks/hecks/adapters/local_files.rb +2 -2
  157. data/lib/hecks/hecks/adapters/rehearsal/audit_report.rb +107 -0
  158. data/lib/hecks/hecks/adapters/rehearsal/census.rb +71 -0
  159. data/lib/hecks/hecks/adapters/rehearsal/declaration.rb +133 -0
  160. data/lib/hecks/hecks/adapters/rehearsal/environment.rb +83 -0
  161. data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +142 -0
  162. data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +96 -0
  163. data/lib/hecks/hecks/adapters/rehearsal/postgres_census.rb +100 -0
  164. data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +69 -0
  165. data/lib/hecks/hecks/adapters/rehearsal/postgres_store.rb +129 -0
  166. data/lib/hecks/hecks/adapters/rehearsal/rows.rb +41 -0
  167. data/lib/hecks/hecks/adapters/rehearsal/rust_audit.rb +83 -0
  168. data/lib/hecks/hecks/adapters/rehearsal/subject.rb +104 -0
  169. data/lib/hecks/hecks/adapters/rehearsal.rb +54 -0
  170. data/lib/hecks/hecks/adapters/rehearsal_store.adapter +7 -0
  171. data/lib/hecks/hecks/adapters/rehearsal_store.rb +81 -0
  172. data/lib/hecks/hecks/adapters/site_toolchain/role_prober.rb +78 -0
  173. data/lib/hecks/hecks/adapters/site_toolchain.rb +29 -4
  174. data/lib/hecks/hecks/adapters/terminal.rb +13 -11
  175. data/lib/hecks/hecks/adapters/world_clearing.rb +65 -0
  176. data/lib/hecks/hecks/codebase.behaviors +13 -1
  177. data/lib/hecks/hecks/codebase.bluebook +239 -5
  178. data/lib/hecks/hecks/custodian.behaviors +24 -6
  179. data/lib/hecks/hecks/custodian.bluebook +6 -1227
  180. data/lib/hecks/hecks/deploy.behaviors +1 -1
  181. data/lib/hecks/hecks/deploy.world +1 -3
  182. data/lib/hecks/hecks/hecks.behaviors +1 -1
  183. data/lib/hecks/hecks/hecks.hecksagon +61 -18
  184. data/lib/hecks/hecks/hecks.world +11 -10
  185. data/lib/hecks/hecks/rehearsal.bluebook +477 -0
  186. data/lib/hecks/hecks/site.behaviors +1 -1
  187. data/lib/hecks/hecks/site.world +0 -1
  188. data/lib/hecks/hecks/tooling.bluebook +1238 -0
  189. data/lib/hecks/indifferent_key.rb +20 -0
  190. data/lib/hecks/language/adapter.bluebook +13 -3
  191. data/lib/hecks/language/bluebook/aggregate.bluebook +23 -0
  192. data/lib/hecks/language/bluebook/bluebook.bluebook +15 -0
  193. data/lib/hecks/language/bluebook/entity.bluebook +18 -0
  194. data/lib/hecks/language/bluebook/policy.bluebook +9 -1
  195. data/lib/hecks/language/bluebook/query.bluebook +1 -1
  196. data/lib/hecks/language/bluebook/vocabulary.bluebook +11 -4
  197. data/lib/hecks/language/hecksagon/domain_port.bluebook +1 -1
  198. data/lib/hecks/language/hecksagon/hecksagon.bluebook +22 -0
  199. data/lib/hecks/language/oidc.json +10 -0
  200. data/lib/hecks/language/port.bluebook +4 -4
  201. data/lib/hecks/literal.rb +12 -3
  202. data/lib/hecks/ports/key_vault.rb +7 -2
  203. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +21 -10
  204. data/lib/hecks/ports/persistence/plugins/era/postgres_era/boot.rb +4 -2
  205. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +2 -1
  206. data/lib/hecks/ports/persistence/repository_factory.rb +6 -3
  207. data/lib/hecks/projections/deploy/box/templates/deploy-box.sh.tmpl +29 -0
  208. data/lib/hecks/projections/deploy/box/templates/deploy-service.sh.tmpl +1 -1
  209. data/lib/hecks/projections/deploy/fargate/settings/tuning.rb +15 -0
  210. data/lib/hecks/projections/deploy/fargate/settings.rb +3 -1
  211. data/lib/hecks/projections/deploy/fargate/stack/readers.rb +1 -0
  212. data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
  213. data/lib/hecks/projections/deploy/shared.rb +5 -2
  214. data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +7 -4
  215. data/lib/hecks/projections/model/deviations.rb +2 -2
  216. data/lib/hecks/projections/model.rb +2 -2
  217. data/lib/hecks/projections/oidc.rb +13 -1
  218. data/lib/hecks/projections/shape.rb +5 -2
  219. data/lib/hecks/projections/site/cms_editor/attributes.rb +95 -0
  220. data/lib/hecks/projections/site/cms_editor/blocks.rb +157 -0
  221. data/lib/hecks/projections/site/cms_editor/checks.rb +77 -0
  222. data/lib/hecks/projections/site/cms_editor/clearing.rb +70 -0
  223. data/lib/hecks/projections/site/cms_editor/color.rb +124 -0
  224. data/lib/hecks/projections/site/cms_editor/composition.rb +42 -0
  225. data/lib/hecks/projections/site/cms_editor/destructive.rb +61 -0
  226. data/lib/hecks/projections/site/cms_editor/drafts.rb +102 -0
  227. data/lib/hecks/projections/site/cms_editor/hints.rb +74 -0
  228. data/lib/hecks/projections/site/cms_editor/icons.rb +86 -0
  229. data/lib/hecks/projections/site/cms_editor/key_kinds.rb +31 -0
  230. data/lib/hecks/projections/site/cms_editor/limits.rb +72 -0
  231. data/lib/hecks/projections/site/cms_editor/media.rb +85 -0
  232. data/lib/hecks/projections/site/cms_editor/moment.rb +34 -0
  233. data/lib/hecks/projections/site/cms_editor/palette.rb +115 -0
  234. data/lib/hecks/projections/site/cms_editor/pickers.rb +85 -0
  235. data/lib/hecks/projections/site/cms_editor/pretty.rb +40 -0
  236. data/lib/hecks/projections/site/cms_editor/preview.rb +91 -0
  237. data/lib/hecks/projections/site/cms_editor/relations.rb +92 -0
  238. data/lib/hecks/projections/site/cms_editor/scale_checks.rb +66 -0
  239. data/lib/hecks/projections/site/cms_editor/scheduling.rb +150 -0
  240. data/lib/hecks/projections/site/cms_editor/schema.rb +161 -0
  241. data/lib/hecks/projections/site/cms_editor/setting.rb +130 -0
  242. data/lib/hecks/projections/site/cms_editor/targets.rb +86 -0
  243. data/lib/hecks/projections/site/cms_editor/templates/package.json.tmpl +36 -0
  244. data/lib/hecks/projections/site/cms_editor/templates/src/app.ts.tmpl +370 -0
  245. data/lib/hecks/projections/site/cms_editor/templates/src/assets.ts.tmpl +98 -0
  246. data/lib/hecks/projections/site/cms_editor/templates/src/auth/membership.ts.tmpl +87 -0
  247. data/lib/hecks/projections/site/cms_editor/templates/src/auth/session.ts.tmpl +36 -0
  248. data/lib/hecks/projections/site/cms_editor/templates/src/auth/sso.ts.tmpl +20 -0
  249. data/lib/hecks/projections/site/cms_editor/templates/src/browser/app.css.tmpl +412 -0
  250. data/lib/hecks/projections/site/cms_editor/templates/src/browser/autosave.js.tmpl +144 -0
  251. data/lib/hecks/projections/site/cms_editor/templates/src/browser/blocks.js.tmpl +500 -0
  252. data/lib/hecks/projections/site/cms_editor/templates/src/browser/body_doc.js.tmpl +175 -0
  253. data/lib/hecks/projections/site/cms_editor/templates/src/browser/body_editor.js.tmpl +418 -0
  254. data/lib/hecks/projections/site/cms_editor/templates/src/browser/epoch.js.tmpl +61 -0
  255. data/lib/hecks/projections/site/cms_editor/templates/src/browser/forms.js.tmpl +210 -0
  256. data/lib/hecks/projections/site/cms_editor/templates/src/browser/lists.js.tmpl +40 -0
  257. data/lib/hecks/projections/site/cms_editor/templates/src/browser/main.js.tmpl +26 -0
  258. data/lib/hecks/projections/site/cms_editor/templates/src/browser/media_picker.js.tmpl +232 -0
  259. data/lib/hecks/projections/site/cms_editor/templates/src/browser/moments.js.tmpl +73 -0
  260. data/lib/hecks/projections/site/cms_editor/templates/src/browser/pickers.js.tmpl +152 -0
  261. data/lib/hecks/projections/site/cms_editor/templates/src/browser/preview.js.tmpl +98 -0
  262. data/lib/hecks/projections/site/cms_editor/templates/src/browser/shell.js.tmpl +140 -0
  263. data/lib/hecks/projections/site/cms_editor/templates/src/browser/toast.js.tmpl +66 -0
  264. data/lib/hecks/projections/site/cms_editor/templates/src/choices.ts.tmpl +99 -0
  265. data/lib/hecks/projections/site/cms_editor/templates/src/commands.ts.tmpl +133 -0
  266. data/lib/hecks/projections/site/cms_editor/templates/src/config.ts.tmpl +29 -0
  267. data/lib/hecks/projections/site/cms_editor/templates/src/flash.ts.tmpl +52 -0
  268. data/lib/hecks/projections/site/cms_editor/templates/src/host.ts.tmpl +43 -0
  269. data/lib/hecks/projections/site/cms_editor/templates/src/media/handler.ts.tmpl +177 -0
  270. data/lib/hecks/projections/site/cms_editor/templates/src/media/multipart.ts.tmpl +53 -0
  271. data/lib/hecks/projections/site/cms_editor/templates/src/media/sniff.ts.tmpl +94 -0
  272. data/lib/hecks/projections/site/cms_editor/templates/src/media/storage.ts.tmpl +50 -0
  273. data/lib/hecks/projections/site/cms_editor/templates/src/names.ts.tmpl +36 -0
  274. data/lib/hecks/projections/site/cms_editor/templates/src/schema.ts.tmpl +214 -0
  275. data/lib/hecks/projections/site/cms_editor/templates/src/server.ts.tmpl +65 -0
  276. data/lib/hecks/projections/site/cms_editor/templates/src/ui/availability.ts.tmpl +15 -0
  277. data/lib/hecks/projections/site/cms_editor/templates/src/ui/block_list.js.tmpl +213 -0
  278. data/lib/hecks/projections/site/cms_editor/templates/src/ui/blocks.ts.tmpl +275 -0
  279. data/lib/hecks/projections/site/cms_editor/templates/src/ui/body_model.js.tmpl +123 -0
  280. data/lib/hecks/projections/site/cms_editor/templates/src/ui/body_parse.js.tmpl +320 -0
  281. data/lib/hecks/projections/site/cms_editor/templates/src/ui/detail.ts.tmpl +88 -0
  282. data/lib/hecks/projections/site/cms_editor/templates/src/ui/dialogs.ts.tmpl +43 -0
  283. data/lib/hecks/projections/site/cms_editor/templates/src/ui/fields.ts.tmpl +275 -0
  284. data/lib/hecks/projections/site/cms_editor/templates/src/ui/html.ts.tmpl +61 -0
  285. data/lib/hecks/projections/site/cms_editor/templates/src/ui/icons.ts.tmpl +15 -0
  286. data/lib/hecks/projections/site/cms_editor/templates/src/ui/input.ts.tmpl +92 -0
  287. data/lib/hecks/projections/site/cms_editor/templates/src/ui/links.ts.tmpl +100 -0
  288. data/lib/hecks/projections/site/cms_editor/templates/src/ui/moments.ts.tmpl +44 -0
  289. data/lib/hecks/projections/site/cms_editor/templates/src/ui/outline.ts.tmpl +63 -0
  290. data/lib/hecks/projections/site/cms_editor/templates/src/ui/pages.ts.tmpl +213 -0
  291. data/lib/hecks/projections/site/cms_editor/templates/src/ui/paging.ts.tmpl +82 -0
  292. data/lib/hecks/projections/site/cms_editor/templates/src/ui/pickers.ts.tmpl +110 -0
  293. data/lib/hecks/projections/site/cms_editor/templates/src/ui/preview.ts.tmpl +87 -0
  294. data/lib/hecks/projections/site/cms_editor/templates/src/ui/related.ts.tmpl +97 -0
  295. data/lib/hecks/projections/site/cms_editor/templates/src/ui/schedule.ts.tmpl +160 -0
  296. data/lib/hecks/projections/site/cms_editor/templates/src/ui/shell.ts.tmpl +211 -0
  297. data/lib/hecks/projections/site/cms_editor/templates/src/ui/table.ts.tmpl +151 -0
  298. data/lib/hecks/projections/site/cms_editor/templates/src/ui/theme.js.tmpl +16 -0
  299. data/lib/hecks/projections/site/cms_editor/templates/src/ui/values.ts.tmpl +69 -0
  300. data/lib/hecks/projections/site/cms_editor/templates/src/ui/words.ts.tmpl +97 -0
  301. data/lib/hecks/projections/site/cms_editor/templates/src/ui/world.ts.tmpl +35 -0
  302. data/lib/hecks/projections/site/cms_editor/templates/tsconfig.json.tmpl +17 -0
  303. data/lib/hecks/projections/site/cms_editor/theme.rb +29 -0
  304. data/lib/hecks/projections/site/cms_editor/theme_checks.rb +57 -0
  305. data/lib/hecks/projections/site/cms_editor.rb +133 -0
  306. data/lib/hecks/projections/site/role_probe.rb +74 -0
  307. data/lib/hecks/projector/cli_audience.rb +2 -1
  308. data/lib/hecks/projector/cli_projector/listing.rb +1 -1
  309. data/lib/hecks/projector/cli_projector/option_specs.rb +1 -1
  310. data/lib/hecks/projector/docs_projector/closing.rb +1 -1
  311. data/lib/hecks/projector/docs_projector.rb +1 -1
  312. data/lib/hecks/projector/exporter/bindings.rb +40 -10
  313. data/lib/hecks/projector/exporter/capability_values.rb +55 -0
  314. data/lib/hecks/projector/narrate_projector/reactions.rb +1 -1
  315. data/lib/hecks/projector/target.rb +11 -0
  316. data/lib/hecks/projector.rb +32 -5
  317. data/lib/hecks/quality_control/adapters/github_checks.rb +12 -8
  318. data/lib/hecks/quality_control/adapters/github_issues.rb +8 -4
  319. data/lib/hecks/quality_control/cli/qa_open_pr.rb +2 -2
  320. data/lib/hecks/quality_control/cli/qa_sweep/checks/shrinking.rb +1 -1
  321. data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +1 -1
  322. data/lib/hecks/quality_control/cli/qa_sweep.rb +1 -1
  323. data/lib/hecks/quality_control/quality_control.bluebook +6 -2
  324. data/lib/hecks/release/approval.rb +64 -0
  325. data/lib/hecks/router/{door.rb → aggregate_reader.rb} +5 -4
  326. data/lib/hecks/router/namespace_installer.rb +16 -16
  327. data/lib/hecks/router.rb +1 -1
  328. data/lib/hecks/runtime/best_effort.rb +22 -0
  329. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +12 -2
  330. data/lib/hecks/runtime/command_interpreter.rb +3 -2
  331. data/lib/hecks/runtime/command_rules/emission.rb +1 -1
  332. data/lib/hecks/runtime/dispatcher.rb +4 -4
  333. data/lib/hecks/runtime/entity_element/location.rb +1 -1
  334. data/lib/hecks/runtime/event.rb +5 -0
  335. data/lib/hecks/runtime/identity.rb +7 -6
  336. data/lib/hecks/runtime/interpreting.rb +2 -1
  337. data/lib/hecks/runtime/invocation_builder.rb +1 -1
  338. data/lib/hecks/runtime/loader/boot_steps.rb +8 -5
  339. data/lib/hecks/runtime/loader.rb +10 -10
  340. data/lib/hecks/runtime/policy_interpreter/arguments.rb +7 -4
  341. data/lib/hecks/runtime/policy_interpreter/fan_out.rb +3 -3
  342. data/lib/hecks/runtime/policy_interpreter.rb +6 -6
  343. data/lib/hecks/runtime/port_operation_interpreter.rb +1 -1
  344. data/lib/hecks/runtime/reaction_invocation.rb +1 -1
  345. data/lib/hecks/runtime/rebuild_sweep.rb +11 -1
  346. data/lib/hecks/runtime/registry/ask_verification.rb +35 -0
  347. data/lib/hecks/runtime/registry/hecksagon_rules.rb +10 -0
  348. data/lib/hecks/runtime/registry/merging.rb +1 -1
  349. data/lib/hecks/runtime/registry/providers.rb +16 -0
  350. data/lib/hecks/runtime/registry/read_repository.rb +6 -4
  351. data/lib/hecks/runtime/registry/verification.rb +4 -1
  352. data/lib/hecks/runtime/registry/world_defaults.rb +29 -0
  353. data/lib/hecks/runtime/registry.rb +1 -1
  354. data/lib/hecks/runtime/saga_interpreter/compensation.rb +1 -1
  355. data/lib/hecks/runtime/saga_interpreter/delivery.rb +4 -4
  356. data/lib/hecks/runtime/saga_interpreter/transitions.rb +1 -1
  357. data/lib/hecks/runtime/saga_interpreter.rb +3 -3
  358. data/lib/hecks/runtime/tenant_check.rb +5 -4
  359. data/lib/hecks/runtime/value/coercion.rb +2 -2
  360. data/lib/hecks/runtime/value/validation.rb +16 -4
  361. data/lib/hecks/runtime.rb +9 -9
  362. data/lib/hecks/rust_build/project_rust/target_ir.rb +1 -1
  363. data/lib/hecks/rust_build/wasm.rb +1 -1
  364. data/lib/hecks/rust_build/wasm_browser.rb +1 -1
  365. data/lib/hecks/rust_build.rb +11 -0
  366. data/lib/hecks/served_options.rb +53 -0
  367. data/lib/hecks/site/bluebook/site.bluebook +29 -1
  368. data/lib/hecks/site/bluebook/site.ports.hecksagon +6 -0
  369. data/lib/hecks/storehouse/audit.rb +1 -1
  370. data/lib/hecks/storehouse/dispatching.rb +8 -6
  371. data/lib/hecks/storehouse/introspection.rb +2 -2
  372. data/lib/hecks/storehouse/querying.rb +6 -4
  373. data/lib/hecks/storehouse.rb +4 -4
  374. data/lib/hecks/tools/comment_style/source_file.rb +4 -1
  375. data/lib/hecks/tools/deploy_recipe_lint/fixtures.rb +4 -1
  376. data/lib/hecks/tools/lanes/rows.rb +6 -0
  377. data/lib/hecks/tools/oidc_manifests.rb +4 -5
  378. data/lib/hecks/tools/regeneration_run.rb +11 -4
  379. data/lib/hecks/tools/site_routes/cli.rb +1 -1
  380. data/lib/hecks/tools/site_routes/editor_files.rb +45 -0
  381. data/lib/hecks/tools/site_routes.rb +14 -7
  382. data/lib/hecks/tools/tenant_provisioning.rb +2 -2
  383. data/lib/hecks/tools/tools_doc.rb +4 -4
  384. data/lib/hecks/version.rb +1 -1
  385. data/lib/hecks/vocabulary.rb +4 -4
  386. data/lib/hecks.rb +15 -15
  387. data/lib/rubocop/cop/hecks/env_dump.rb +69 -0
  388. data/lib/rubocop/cop/hecks/monotonic_duration.rb +53 -0
  389. data/lib/rubocop/cop/hecks/no_wall_clock_in_runtime.rb +34 -0
  390. data/lib/rubocop/cop/hecks/raw_shell_interpolation.rb +79 -0
  391. data/lib/rubocop/cop/hecks/sleep_in_spec.rb +34 -0
  392. data/lib/rubocop/cop/hecks/swallowed_rescue.rb +37 -0
  393. data/lib/rubocop/cop/hecks/symbol_string_key_mix.rb +50 -0
  394. data/lib/rubocop/cop/hecks/untyped_raise.rb +37 -0
  395. data/prebuilt/05c358d38d661a3774f813d49c66f5b68939af94432d66257a56f49ee2598994.marshal +0 -0
  396. data/prebuilt/26c40c61f09b09b11651c64668eda3ceb180f83cf2a3802d3033d2fd99ac841b.marshal +0 -0
  397. data/prebuilt/verdicts-230ac18c25abfd3d92ede032bee2661a4c2cd2773ab0cf0e2ae52546ba2f7af9.json +1 -0
  398. data/rust/.gitignore +6 -0
  399. data/rust/Cargo.toml +9 -1
  400. data/rust/build/src/binding_pass.rs +103 -0
  401. data/rust/build/src/cargo_sync.rs +6 -0
  402. data/rust/build/src/lineage_pass.rs +3 -3
  403. data/rust/build/src/main.rs +17 -5
  404. data/rust/build/src/pipeline.rs +48 -5
  405. data/rust/build/src/seams_pass.rs +123 -0
  406. data/rust/build/src/translation_pass.rs +167 -0
  407. data/rust/codegen/src/asks.rs +103 -0
  408. data/rust/codegen/src/bridging.rs +1 -1
  409. data/rust/codegen/src/commands.rs +13 -8
  410. data/rust/codegen/src/constraints.rs +25 -0
  411. data/rust/codegen/src/domain_generator.rs +11 -9
  412. data/rust/codegen/src/expr_emitter.rs +13 -0
  413. data/rust/codegen/src/json_codec.rs +54 -15
  414. data/rust/codegen/src/main.rs +2 -1
  415. data/rust/codegen/src/mutations.rs +174 -4
  416. data/rust/codegen/src/naming.rs +30 -0
  417. data/rust/codegen/src/queries.rs +11 -2
  418. data/rust/codegen/src/reactions.rs +1 -1
  419. data/rust/codegen/src/types.rs +166 -8
  420. data/rust/host/HECKS_RELEASE +1 -1
  421. data/rust/host/src/api.rs +4 -4
  422. data/rust/host/src/bin/validate_harness.rs +43 -0
  423. data/rust/host/src/boundary_fuzz/expr_json.rs +2 -2
  424. data/rust/host/src/boundary_fuzz/ir.rs +1 -0
  425. data/rust/host/src/boundary_fuzz/server.rs +1 -1
  426. data/rust/host/src/checkout.rs +35 -19
  427. data/rust/host/src/commerce_ir.rs +408 -2
  428. data/rust/host/src/expr_json.rs +118 -0
  429. data/rust/host/src/mint.rs +1 -1
  430. data/rust/host/src/payments/tests.rs +27 -1
  431. data/rust/host/src/payments.rs +12 -4
  432. data/rust/host/src/query_step.rs +22 -4
  433. data/rust/host/src/reference_validate.rs +653 -108
  434. data/rust/host/src/resend.rs +2 -0
  435. data/rust/host/src/server.rs +19 -6
  436. data/rust/host/src/ui_schema.rs +132 -5
  437. data/rust/host/src/web/newsletter.rs +7 -8
  438. data/rust/host/src/web/newsletter_send.rs +38 -13
  439. data/rust/host/src/web/registrations.rs +229 -26
  440. data/rust/host/src/web.rs +3 -3
  441. data/rust/parser/src/emit.rs +38 -6
  442. data/rust/parser/src/expr/ast_json.rs +7 -1
  443. data/rust/parser/src/expr/resolver.rs +171 -6
  444. data/rust/parser/src/ir.rs +7 -0
  445. data/rust/parser/src/keywords.rs +24 -0
  446. data/rust/parser/src/main.rs +3 -0
  447. data/rust/parser/src/parse/aggregate.rs +2 -1
  448. data/rust/parser/src/parse/chapter.rs +2 -2
  449. data/rust/parser/src/parse/command.rs +2 -0
  450. data/rust/parser/src/parse/hecksagon.rs +5 -2
  451. data/rust/parser/src/parse/lifecycle.rs +81 -0
  452. data/rust/parser/src/parse/mod.rs +15 -1
  453. data/rust/parser/src/parse/policy.rs +13 -2
  454. data/rust/parser/src/parse/value_object.rs +13 -8
  455. data/rust/parser/src/ruby_value.rs +1 -1
  456. data/rust/src/exemplar/commands.rs +4 -4
  457. data/rust/src/exemplar/constraints.rs +1 -1
  458. data/rust/src/exemplar/json.rs +43 -1
  459. data/rust/src/kernel/cli.rs +7 -5
  460. data/rust/src/kernel/dispatch.rs +2 -2
  461. data/rust/src/kernel/dispatch_guard_tests.rs +1 -1
  462. data/rust/src/kernel/expr.rs +73 -4
  463. data/rust/src/kernel/expression_operators/arithmetic.rs +130 -5
  464. data/rust/src/kernel/expression_operators/presence.rs +41 -3
  465. data/rust/src/kernel/expression_operators/text.rs +26 -2
  466. data/rust/src/kernel/json.rs +15 -0
  467. data/rust/src/kernel/mod.rs +1 -1
  468. data/rust/src/kernel/orchestrate.rs +54 -5
  469. data/rust/src/kernel/orchestrate_guard_tests.rs +67 -0
  470. data/rust/src/kernel/pattern.rs +60 -0
  471. data/rust/src/kernel/reference_lookup.rs +90 -7
  472. metadata +174 -36
  473. data/lib/hecks/doors/cli_door/nesting.rb +0 -34
  474. data/lib/hecks/doors/cli_door/shorthand.rb +0 -85
  475. data/lib/hecks/doors/cli_door.rb +0 -124
  476. data/lib/hecks/doors/cli_runner/answers.rb +0 -138
  477. data/lib/hecks/doors/cli_runner/resolution.rb +0 -146
  478. data/lib/hecks/doors/cli_runner/settling.rb +0 -115
  479. data/lib/hecks/doors/cli_runner/streaming.rb +0 -90
  480. data/lib/hecks/doors/cli_runner/suggestions.rb +0 -43
  481. data/lib/hecks/doors/cli_runner.rb +0 -66
  482. data/lib/hecks/doors/command_request.rb +0 -119
  483. data/lib/hecks/doors/handle.rb +0 -208
  484. data/lib/hecks/doors/json_door.rb +0 -132
  485. data/lib/hecks/doors/launcher_options.rb +0 -247
  486. data/lib/hecks/doors/mcp_door/properties.rb +0 -47
  487. data/lib/hecks/doors/mcp_door/tool_calls.rb +0 -113
  488. data/lib/hecks/doors/mcp_door/tool_definitions/auditing.rb +0 -51
  489. data/lib/hecks/doors/mcp_door/tool_definitions/calling.rb +0 -69
  490. data/lib/hecks/doors/mcp_door/tool_definitions/reading.rb +0 -97
  491. data/lib/hecks/doors/mcp_door/tool_definitions.rb +0 -15
  492. data/lib/hecks/doors/mcp_door.rb +0 -156
  493. data/lib/hecks/doors/mcp_door_scope/argument_policy.rb +0 -92
  494. data/lib/hecks/doors/mcp_door_scope/env_problems.rb +0 -55
  495. data/lib/hecks/doors/mcp_door_scope/presenter.rb +0 -78
  496. data/lib/hecks/doors/mcp_door_scope.rb +0 -201
  497. data/lib/hecks/doors/mcp_guide_cache.rb +0 -75
  498. data/lib/hecks/doors/ruby_door/aggregate_door.rb +0 -162
  499. data/lib/hecks/doors/ruby_door/chapter.rb +0 -89
  500. data/lib/hecks/doors/ruby_door.rb +0 -80
  501. data/lib/hecks/doors/usage_cache.rb +0 -139
  502. data/prebuilt/0ee7f83cba59ce7d1c45c65ba166b071779f70143449f584f33ff7989f64eccb.marshal +0 -0
  503. data/prebuilt/6e4a6bcf0aa880e2e6b056e1846b70e5a768090b9dc998bbadeaf5d6bcfd3db8.marshal +0 -0
  504. data/prebuilt/verdicts-91aaf93ce8981bd9a754948f075d95650dc2ec6435015376f5c60992b36a24b1.json +0 -1
@@ -6,7 +6,7 @@ require "hecks/cli/console"
6
6
  module Hecks
7
7
  module Adapters
8
8
  # The `Terminal` port's adapter: the sessions an operator or a program drives through stdin and
9
- # stdout, an IRB console (`open`) or the stdio MCP door (`serve`).
9
+ # stdout, an IRB console (`open`) or the stdio MCP server (`serve`).
10
10
  #
11
11
  # The journal records that a session was opened and how it ended, not what was said in it.
12
12
  # Each starts here and nowhere else; a caller that must not open a real session (a spec)
@@ -43,26 +43,28 @@ module Hecks
43
43
  { output: { value: "console session ended (#{domain || "pizzas"})" } }
44
44
  end
45
45
 
46
- # Hands the process over to the MCP door until the client closes stdin. The door writes its
46
+ # Hands the process over to the MCP server until the client closes stdin. The server writes
47
+ # its
47
48
  # JSON-RPC on stdout, so nothing here is captured, and the launcher's own answer follows
48
49
  # only once the client is gone.
49
50
  #
50
- # @param held [Hash] the `Door` record: `stdio` (whether `--stdio` was given)
51
- # @return [Hash{Symbol => Hash}] `output:` a one-line note that the door closed
52
- # @raise [ConsoleCapture::Failure] when the process is not set up for stdio: the door
51
+ # @param held [Hash] the `Launch` record: `stdio` (whether `--stdio` was given)
52
+ # @return [Hash{Symbol => Hash}] `output:` a one-line note that the server closed
53
+ # @raise [ConsoleCapture::Failure] when the process is not set up for stdio: the server
53
54
  # refused to start, and said why on stderr
54
55
  def serve(**held)
55
- run_door(plain(held[:stdio]) ? ["--stdio"] : [])
56
+ run_server(plain(held[:stdio]) ? ["--stdio"] : [])
56
57
 
57
- { output: { value: "mcp door closed" } }
58
+ { output: { value: "mcp server closed" } }
58
59
  rescue SystemExit => e
59
- raise ConsoleCapture::Failure, "the mcp door refused to start (status #{e.status}); see stderr"
60
+ raise ConsoleCapture::Failure, "the mcp server refused to start (status #{e.status}); see stderr"
60
61
  end
61
62
 
62
63
  # Holds an interview at the terminal and writes the domain it drafts (ADR 0088). Asking is IO,
63
64
  # so it happens here and nowhere else; the journal records that one was held, not its words.
64
65
  #
65
- # @param held [Hash] the `Door` record: `name`; optionally `adapter`, `dir`, `expert`, `no_ai`
66
+ # @param held [Hash] the `Launch` record: `name`; optionally `adapter`, `dir`, `expert`,
67
+ # `no_ai`
66
68
  # @return [Hash{Symbol => Hash}] `output:` what the interview wrote, or that it wrote nothing
67
69
  # @raise [ConsoleCapture::Failure] when the name or adapter is refused, or a file is there
68
70
  def converse(**held)
@@ -76,8 +78,8 @@ module Hecks
76
78
 
77
79
  private
78
80
 
79
- # Hands the process to the server a spec set, or else to the real MCP door.
80
- def run_door(argv)
81
+ # Hands the process to the server a spec set, or else to the real MCP server.
82
+ def run_server(argv)
81
83
  server = self.class.server
82
84
  if server
83
85
  server.call(argv)
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hecks
4
+ module Adapters
5
+ # Empties the `deployed_to(...) do ... end` blocks of a `.world` file's text: the region,
6
+ # stacks, secrets, domain and buckets a host deploys with, which a project handed to a client
7
+ # must not carry. Each block keeps its opening and closing lines and holds one comment naming
8
+ # the settings it held, so the file still loads and shows what to set.
9
+ #
10
+ # A block closes at the first `end` at its own indent, and a setting is a line one indent
11
+ # step inside it that starts with its name. A block that holds only comments is already clear
12
+ # and is left as it is, so clearing twice changes nothing the second time.
13
+ class WorldClearing
14
+ BLOCK = /^(?<indent>[ \t]*)deployed_to\b[^\n]*[ \t]do\b[^\n]*\n(?<body>.*?)^\k<indent>end\b[^\n]*\n/m
15
+
16
+ # What clearing one world's text produced.
17
+ #
18
+ # @!attribute [r] text
19
+ # @return [String] the text with every block emptied
20
+ # @!attribute [r] settings
21
+ # @return [Array<String>] the setting names removed, in order, without repeats
22
+ Result = Struct.new(:text, :settings) do
23
+ # @return [Boolean] whether any block was emptied
24
+ def changed? = !settings.empty?
25
+ end
26
+
27
+ # @param text [String] the contents of a `.world` file
28
+ # @return [Result] the cleared text and the settings that were in the blocks
29
+ def self.call(text)
30
+ names = []
31
+ cleared = text.gsub(BLOCK) { |block| empty(Regexp.last_match, block, names) }
32
+ Result.new(cleared, names.uniq)
33
+ end
34
+
35
+ # @param match [MatchData] one `deployed_to` block
36
+ # @param block [String] the block's text
37
+ # @param names [Array<String>] collects the setting names removed
38
+ # @return [String] the block's replacement
39
+ def self.empty(match, block, names)
40
+ indent = match[:indent]
41
+ held = match[:body].scan(/^#{indent} {2}([a-z_]\w*)/).flatten
42
+ return block if held.empty?
43
+
44
+ names.concat(held)
45
+ "#{block.lines.first}#{comment(indent, note(held.uniq))}#{indent}end\n"
46
+ end
47
+
48
+ # @param held [Array<String>] the setting names the block held
49
+ # @return [String] the comment that stands where the settings were
50
+ def self.note(held)
51
+ "The host's deployment settings were removed from this handoff. Set your own: #{held.join(", ")}."
52
+ end
53
+
54
+ # @param indent [String] the block's indent
55
+ # @param note [String] the sentence to put in the block
56
+ # @return [String] the sentence as comment lines inside the block, folded under 100 columns
57
+ def self.comment(indent, note)
58
+ width = 96 - indent.size
59
+ note.scan(/(.{1,#{width}})(?:\s+|\z)/).flatten.map { |line| "#{indent} # #{line}\n" }.join
60
+ end
61
+
62
+ private_class_method :empty, :note, :comment
63
+ end
64
+ end
65
+ end
@@ -1,7 +1,7 @@
1
1
  Hecks.behaviors "Codebase" do
2
2
  vision "A request to work on this repository is recorded, the tree is examined, and only a hecks checkout lets it through."
3
3
 
4
- loads "hecks.bluebook", "custodian.bluebook", "codebase.bluebook", "context_map.hecksagon", "hecks.hecksagon", "environments/memory.world"
4
+ loads "hecks.bluebook", "custodian.bluebook", "tooling.bluebook", "rehearsal.bluebook", "codebase.bluebook", "context_map.hecksagon", "hecks.hecksagon", "environments/memory.world"
5
5
 
6
6
  test "ProjectModel reports what the language projects, and keeps the answer" do
7
7
  tests "ProjectModel", on: "LanguageRun"
@@ -187,4 +187,16 @@ Hecks.behaviors "Codebase" do
187
187
  input run: { value: "" }
188
188
  expect refused: "must match"
189
189
  end
190
+
191
+ test "Flog refuses a list of paths that is not one" do
192
+ tests "Flog", on: "InspectionRun"
193
+ input paths: { value: "lib, spec" }, run: { value: "paths" }
194
+ expect refused: "must match"
195
+ end
196
+
197
+ test "Reek refuses a count that is not positive" do
198
+ tests "Reek", on: "InspectionRun"
199
+ input top: { value: 0 }, run: { value: "top" }
200
+ expect refused: "positive"
201
+ end
190
202
  end
@@ -98,6 +98,7 @@ Hecks.bluebook "Hecks" do
98
98
  end
99
99
 
100
100
  lifecycle :status, default: "requested" do
101
+ mark :failure, "faulted"
101
102
  transition "Accept" => "accepted", from: "requested"
102
103
  transition "Complete" => "completed", from: "accepted"
103
104
  transition "Fault" => "faulted", from: %w[requested accepted]
@@ -658,6 +659,7 @@ Hecks.bluebook "Hecks" do
658
659
  end
659
660
 
660
661
  lifecycle :status, default: "requested" do
662
+ mark :failure, "faulted"
661
663
  transition "Accept" => "accepted", from: "requested"
662
664
  transition "Complete" => "completed", from: "accepted"
663
665
  transition "Fault" => "faulted", from: %w[requested accepted]
@@ -812,6 +814,7 @@ Hecks.bluebook "Hecks" do
812
814
  end
813
815
 
814
816
  lifecycle :status, default: "requested" do
817
+ mark :failure, "faulted"
815
818
  transition "Accept" => "accepted", from: "requested"
816
819
  transition "Complete" => "completed", from: "accepted"
817
820
  transition "Fault" => "faulted", from: %w[requested accepted]
@@ -991,6 +994,7 @@ Hecks.bluebook "Hecks" do
991
994
  end
992
995
 
993
996
  lifecycle :status, default: "requested" do
997
+ mark :failure, "faulted"
994
998
  transition "Accept" => "accepted", from: "requested"
995
999
  transition "Complete" => "completed", from: "accepted"
996
1000
  transition "Fault" => "faulted", from: %w[requested accepted]
@@ -1225,6 +1229,7 @@ Hecks.bluebook "Hecks" do
1225
1229
  end
1226
1230
 
1227
1231
  lifecycle :status, default: "requested" do
1232
+ mark :failure, "faulted"
1228
1233
  transition "Accept" => "accepted", from: "requested"
1229
1234
  transition "Complete" => "completed", from: "accepted"
1230
1235
  transition "Fault" => "faulted", from: %w[requested accepted]
@@ -1397,6 +1402,7 @@ Hecks.bluebook "Hecks" do
1397
1402
  end
1398
1403
 
1399
1404
  lifecycle :status, default: "requested" do
1405
+ mark :failure, "faulted"
1400
1406
  transition "Accept" => "accepted", from: "requested"
1401
1407
  transition "Complete" => "completed", from: "accepted"
1402
1408
  transition "Fault" => "faulted", from: %w[requested accepted]
@@ -1654,6 +1660,222 @@ Hecks.bluebook "Hecks" do
1654
1660
  trigger StyleRun::Fault, with: { refusal: :refusal }
1655
1661
  end
1656
1662
 
1663
+ # Inspection: ranking the Ruby by complexity, finding copied code, listing design smells and
1664
+ # writing the combined report. A read of the tree: nothing is rewritten. The files the style
1665
+ # config excludes (generated output, vendored code) are left out of every tool.
1666
+ aggregate "InspectionRun" do
1667
+ description "One inspection of the Ruby by flog, flay, reek or rubycritic."
1668
+
1669
+ attribute :run, RunKey
1670
+ attribute :operation, Operation, optional: true
1671
+ attribute :paths, PathList, optional: true
1672
+ attribute :top, Top, optional: true
1673
+ attribute :checkout, Switch, optional: true
1674
+ attribute :report, Report, optional: true
1675
+ attribute :refusal, Report, optional: true
1676
+ identified_by :run
1677
+
1678
+ value_object "RunKey" do
1679
+ attribute :value, String, pattern: '[^ \t\n\r]'
1680
+
1681
+ invariant("a run is named") { !value.to_s.empty? }
1682
+ end
1683
+
1684
+ value_object "Operation" do
1685
+ attribute :value, String, pattern: '[^ \t\n\r]'
1686
+ end
1687
+
1688
+ value_object "Switch" do
1689
+ attribute :value, Boolean
1690
+ end
1691
+
1692
+ value_object "Report" do
1693
+ attribute :value, String
1694
+ end
1695
+
1696
+ # Files or directories, comma separated; lib when none is named.
1697
+ value_object "PathList" do
1698
+ attribute :value, String, pattern: '^[^ \t\n\r,]+(,[^ \t\n\r,]+)*$'
1699
+ end
1700
+
1701
+ # How many lines of the report are kept.
1702
+ value_object "Top" do
1703
+ attribute :value, Integer
1704
+
1705
+ invariant("a count is positive") { value > 0 }
1706
+ end
1707
+
1708
+ lifecycle :status, default: "requested" do
1709
+ mark :failure, "faulted"
1710
+ transition "Accept" => "accepted", from: "requested"
1711
+ transition "Complete" => "completed", from: "accepted"
1712
+ transition "Fault" => "faulted", from: %w[requested accepted]
1713
+ end
1714
+
1715
+ command "Flog" do
1716
+ role "Maintainer"
1717
+ goal "Rank the Ruby methods by complexity, worst first"
1718
+
1719
+ attribute :paths, PathList, optional: true
1720
+ attribute :top, Top, optional: true
1721
+ attribute :run, RunKey
1722
+
1723
+ sets :paths
1724
+ sets :top
1725
+ sets :run
1726
+ sets :operation, to: "flog"
1727
+
1728
+ emits FlogRequested
1729
+ end
1730
+
1731
+ command "Flay" do
1732
+ role "Maintainer"
1733
+ goal "Find Ruby code that is copied or nearly copied"
1734
+
1735
+ attribute :paths, PathList, optional: true
1736
+ attribute :top, Top, optional: true
1737
+ attribute :run, RunKey
1738
+
1739
+ sets :paths
1740
+ sets :top
1741
+ sets :run
1742
+ sets :operation, to: "flay"
1743
+
1744
+ emits FlayRequested
1745
+ end
1746
+
1747
+ command "Reek" do
1748
+ role "Maintainer"
1749
+ goal "List the design smells in the Ruby"
1750
+
1751
+ attribute :paths, PathList, optional: true
1752
+ attribute :top, Top, optional: true
1753
+ attribute :run, RunKey
1754
+
1755
+ sets :paths
1756
+ sets :top
1757
+ sets :run
1758
+ sets :operation, to: "reek"
1759
+
1760
+ emits ReekRequested
1761
+ end
1762
+
1763
+ command "Rubycritic" do
1764
+ role "Maintainer"
1765
+ goal "Write the combined quality report, with git churn"
1766
+
1767
+ attribute :paths, PathList, optional: true
1768
+ attribute :top, Top, optional: true
1769
+ attribute :run, RunKey
1770
+
1771
+ sets :paths
1772
+ sets :top
1773
+ sets :run
1774
+ sets :operation, to: "rubycritic"
1775
+
1776
+ emits RubycriticRequested
1777
+ end
1778
+
1779
+ # What the tree reported about itself, held against every request: nothing here runs
1780
+ # outside a hecks checkout (hecks.gemspec beside lib/).
1781
+ command "Accept" do
1782
+ role "System"
1783
+ goal "Let a request through only when the working tree is a hecks checkout"
1784
+
1785
+ reference_to InspectionRun
1786
+ attribute :checkout, Switch
1787
+
1788
+ given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
1789
+
1790
+ sets :checkout
1791
+
1792
+ emits InspectionAccepted
1793
+ end
1794
+
1795
+ command "Complete" do
1796
+ role "System"
1797
+ goal "Record that the inspection was carried out, and what it reported"
1798
+
1799
+ reference_to InspectionRun
1800
+ attribute :report, Report
1801
+
1802
+ sets :report
1803
+
1804
+ emits InspectionCompleted
1805
+ end
1806
+
1807
+ command "Fault" do
1808
+ role "System"
1809
+ goal "Record that the inspection was refused or could not be carried out, and why"
1810
+
1811
+ reference_to InspectionRun
1812
+ attribute :refusal, Report
1813
+
1814
+ sets :refusal
1815
+
1816
+ emits InspectionFaulted
1817
+ end
1818
+
1819
+ query "InspectionOutcome" do
1820
+ description "How one inspection ended: its status, and what it reported or why it failed."
1821
+ attribute :run, RunKey
1822
+ where(run: :run)
1823
+ order_by :run
1824
+ end
1825
+
1826
+ query "InspectionsFaulted" do
1827
+ description "Every inspection that was refused or could not be carried out."
1828
+ where(status: "faulted")
1829
+ order_by :run
1830
+ end
1831
+ end
1832
+
1833
+ policy "ExamineWhenFlogRequested" do
1834
+ on "InspectionRun.FlogRequested"
1835
+ trigger InspectionRun::SourceTree::Examine, with: { run: :run }
1836
+ end
1837
+
1838
+ policy "ExamineWhenFlayRequested" do
1839
+ on "InspectionRun.FlayRequested"
1840
+ trigger InspectionRun::SourceTree::Examine, with: { run: :run }
1841
+ end
1842
+
1843
+ policy "ExamineWhenReekRequested" do
1844
+ on "InspectionRun.ReekRequested"
1845
+ trigger InspectionRun::SourceTree::Examine, with: { run: :run }
1846
+ end
1847
+
1848
+ policy "ExamineWhenRubycriticRequested" do
1849
+ on "InspectionRun.RubycriticRequested"
1850
+ trigger InspectionRun::SourceTree::Examine, with: { run: :run }
1851
+ end
1852
+
1853
+ policy "AcceptInspectionWhenExamined" do
1854
+ on "InspectionRun.InspectionExamined"
1855
+ trigger InspectionRun::Accept, with: { checkout: :checkout }
1856
+ end
1857
+
1858
+ policy "FaultInspectionWhenNotAccepted" do
1859
+ on "InspectionRun.InspectionExamined"
1860
+ where { !checkout.value }
1861
+ trigger InspectionRun::Fault, with: { refusal: "needs a hecks checkout: hecks.gemspec stands beside lib/" }
1862
+ end
1863
+
1864
+ policy "PerformInspectionWhenAccepted" do
1865
+ on "InspectionRun.InspectionAccepted"
1866
+ trigger InspectionRun::SourceTree::Perform, with: { run: :run }
1867
+ end
1868
+
1869
+ policy "RecordInspectionOutcome" do
1870
+ on "InspectionRun.InspectionAnswered"
1871
+ trigger InspectionRun::Complete, with: { report: :report }
1872
+ end
1873
+
1874
+ policy "RecordInspectionFault" do
1875
+ on "InspectionRun.InspectionRefused"
1876
+ trigger InspectionRun::Fault, with: { refusal: :refusal }
1877
+ end
1878
+
1657
1879
  # Codemod: the mechanical rewrites of the example bluebooks. Each one edits tracked files, so
1658
1880
  # unconfirmed it rehearses the edit (the script reboots every bluebook and puts the files back)
1659
1881
  # and reports what it would change; the files stay changed only when it is confirmed.
@@ -1687,6 +1909,7 @@ Hecks.bluebook "Hecks" do
1687
1909
  end
1688
1910
 
1689
1911
  lifecycle :status, default: "requested" do
1912
+ mark :failure, "faulted"
1690
1913
  transition "Accept" => "accepted", from: "requested"
1691
1914
  transition "Complete" => "completed", from: "accepted"
1692
1915
  transition "Fault" => "faulted", from: %w[requested accepted]
@@ -1900,6 +2123,7 @@ Hecks.bluebook "Hecks" do
1900
2123
  end
1901
2124
 
1902
2125
  lifecycle :status, default: "requested" do
2126
+ mark :failure, "faulted"
1903
2127
  transition "Accept" => "accepted", from: "requested"
1904
2128
  transition "Complete" => "completed", from: "accepted"
1905
2129
  transition "Fault" => "faulted", from: %w[requested accepted]
@@ -2145,7 +2369,7 @@ Hecks.bluebook "Hecks" do
2145
2369
  # Corpus: what this repository's committed domains are, and what the language's own IR holds.
2146
2370
  # Every question about them is a pure read, answered by the SourceTree port: which domains carry
2147
2371
  # a Rust feature, the order they regenerate in, whether each generated module is covered, and the
2148
- # structural queries over the IR. Two commands open a long-running door: the query MCP server
2372
+ # structural queries over the IR. Two commands open a long-running server: the query MCP server
2149
2373
  # on stdio and the forms app on a local port; each is recorded, runs until it is closed, and
2150
2374
  # answers when it ends.
2151
2375
  aggregate "CorpusRun" do
@@ -2211,6 +2435,7 @@ Hecks.bluebook "Hecks" do
2211
2435
  end
2212
2436
 
2213
2437
  lifecycle :status, default: "requested" do
2438
+ mark :failure, "faulted"
2214
2439
  transition "Accept" => "accepted", from: "requested"
2215
2440
  transition "Complete" => "completed", from: "accepted"
2216
2441
  transition "Fault" => "faulted", from: %w[requested accepted]
@@ -2395,6 +2620,7 @@ Hecks.bluebook "Hecks" do
2395
2620
  attribute :version, Version, optional: true
2396
2621
  attribute :client_version, Version, optional: true
2397
2622
  attribute :changelog, Switch, optional: true
2623
+ attribute :approved, Switch, optional: true
2398
2624
  attribute :tag_state, Word, optional: true
2399
2625
  attribute :head, Word, optional: true
2400
2626
  attribute :ir_version, Version, optional: true
@@ -2439,6 +2665,7 @@ Hecks.bluebook "Hecks" do
2439
2665
  end
2440
2666
 
2441
2667
  lifecycle :status, default: "requested" do
2668
+ mark :failure, "faulted"
2442
2669
  transition "Accept" => "accepted", from: "requested"
2443
2670
  transition "AcceptGem" => "accepted", from: "requested"
2444
2671
  transition "Complete" => "completed", from: "accepted"
@@ -2496,6 +2723,7 @@ Hecks.bluebook "Hecks" do
2496
2723
  attribute :version, Version
2497
2724
  attribute :client_version, Version
2498
2725
  attribute :changelog, Switch
2726
+ attribute :approved, Switch
2499
2727
  attribute :tag_state, Word
2500
2728
  attribute :head, Word
2501
2729
  attribute :ir_version, Version
@@ -2511,6 +2739,9 @@ Hecks.bluebook "Hecks" do
2511
2739
  client_version.value == version.value
2512
2740
  end
2513
2741
  given("CHANGELOG.md has a heading for the version: add the release entry") { changelog.value }
2742
+ given("the commit that set the version carries a Release-Approved-By line: the owner decides when a release happens") do
2743
+ approved.value || tag_state.value == "at_release_commit"
2744
+ end
2514
2745
  given("a tag for the version points at the release commit, not elsewhere") do
2515
2746
  tag_state.value != "elsewhere"
2516
2747
  end
@@ -2523,6 +2754,7 @@ Hecks.bluebook "Hecks" do
2523
2754
  sets :version
2524
2755
  sets :client_version
2525
2756
  sets :changelog
2757
+ sets :approved
2526
2758
  sets :tag_state
2527
2759
  sets :head
2528
2760
  sets :ir_version
@@ -2617,8 +2849,8 @@ Hecks.bluebook "Hecks" do
2617
2849
  trigger PublishingRun::Accept, with: { checkout: :checkout, branch: :branch, release_lane: :release_lane,
2618
2850
  on_origin: :on_origin, clean: :clean, version: :version,
2619
2851
  client_version: :client_version,
2620
- changelog: :changelog, tag_state: :tag_state, head: :head,
2621
- ir_version: :ir_version, ships_from: :ships_from }
2852
+ changelog: :changelog, approved: :approved, tag_state: :tag_state,
2853
+ head: :head, ir_version: :ir_version, ships_from: :ships_from }
2622
2854
  end
2623
2855
 
2624
2856
  policy "AcceptTheGemWhenExamined" do
@@ -2634,9 +2866,10 @@ Hecks.bluebook "Hecks" do
2634
2866
  where do
2635
2867
  operation.value == "publish" &&
2636
2868
  (!checkout.value || branch.value != release_lane.value || !on_origin.value || !clean.value ||
2637
- client_version.value != version.value || !changelog.value || tag_state.value == "elsewhere")
2869
+ client_version.value != version.value || !changelog.value || tag_state.value == "elsewhere" ||
2870
+ (!approved.value && tag_state.value != "at_release_commit"))
2638
2871
  end
2639
- trigger PublishingRun::Fault, with: { refusal: "a release rule is not met: check the branch, tree, versions, CHANGELOG and tag" }
2872
+ trigger PublishingRun::Fault, with: { refusal: "a release rule is not met: check the branch, tree, versions, CHANGELOG, tag and the Release-Approved-By line" }
2640
2873
  end
2641
2874
 
2642
2875
  policy "FaultTheGemWhenNotAccepted" do
@@ -2763,6 +2996,7 @@ Hecks.bluebook "Hecks" do
2763
2996
  end
2764
2997
 
2765
2998
  lifecycle :status, default: "requested" do
2999
+ mark :failure, "faulted"
2766
3000
  transition "Accept" => "accepted", from: "requested"
2767
3001
  transition "Observe" => "observed", from: "requested"
2768
3002
  transition "Complete" => "completed", from: %w[accepted observed]
@@ -1,7 +1,7 @@
1
1
  Hecks.behaviors "Custodian" do
2
2
  vision "A check and an operation are recorded as requested before anything outside is asked."
3
3
 
4
- loads "hecks.bluebook", "custodian.bluebook", "codebase.bluebook", "context_map.hecksagon", "hecks.hecksagon", "environments/memory.world"
4
+ loads "hecks.bluebook", "custodian.bluebook", "tooling.bluebook", "rehearsal.bluebook", "codebase.bluebook", "context_map.hecksagon", "hecks.hecksagon", "environments/memory.world"
5
5
 
6
6
  test "ModelCheck records the request, runs the analysis and keeps a clean verdict" do
7
7
  tests "ModelCheck", on: "ModelCheckRun"
@@ -69,14 +69,14 @@ Hecks.behaviors "Custodian" do
69
69
  expect emits: %w[VendorRequested PinRefused VendoringRefused]
70
70
  end
71
71
 
72
- test "ProjectCli keeps a domain it cannot boot as a stopped door, and writes nothing" do
73
- tests "ProjectCli", on: "Door"
72
+ test "ProjectCli keeps a domain it cannot boot as a stopped launch, and writes nothing" do
73
+ tests "ProjectCli", on: "Launch"
74
74
  input run: { value: "launchers" }, domains: { value: "no/such/domain" }
75
- expect emits: %w[LaunchersRequested DoorRefused DoorStopped]
75
+ expect emits: %w[LaunchersRequested LaunchRefused LaunchStopped]
76
76
  end
77
77
 
78
- test "ServeMcp refuses a door that is not named" do
79
- tests "ServeMcp", on: "Door"
78
+ test "ServeMcp refuses a launch that is not named" do
79
+ tests "ServeMcp", on: "Launch"
80
80
  input run: { value: "" }
81
81
  expect refused: "must match"
82
82
  end
@@ -188,4 +188,22 @@ Hecks.behaviors "Custodian" do
188
188
  input domain: { value: "examples/pizzas" }, run: { value: "host" }, target: { value: "arm64" }
189
189
  expect refused: "must match"
190
190
  end
191
+
192
+ test "Request refuses a rehearsal that is not named" do
193
+ tests "Request", on: "RehearsalRun"
194
+ input run: { value: "" }, domain: { value: "examples/pizzas" }
195
+ expect refused: "must match"
196
+ end
197
+
198
+ test "Request refuses a pin that is neither a release nor a commit" do
199
+ tests "Request", on: "RehearsalRun"
200
+ input run: { value: "rehearse" }, domain: { value: "examples/pizzas" }, pin: { value: "main" }
201
+ expect refused: "must match"
202
+ end
203
+
204
+ test "Request keeps a domain that is not there as a withheld rehearsal" do
205
+ tests "Request", on: "RehearsalRun"
206
+ input run: { value: "rehearse" }, domain: { value: "/tmp/hecks-behaviors-absent/shop" }
207
+ expect emits: %w[RehearsalRequested StoreSurveyed RehearsalWithheld]
208
+ end
191
209
  end