hecks 3.4.2 → 3.6.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 (1099) hide show
  1. checksums.yaml +4 -4
  2. data/examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb +1 -1
  3. data/lib/hecks/adapters/driven/claude_code.rb +11 -7
  4. data/lib/hecks/adapters/driven/d1/connection.rb +90 -0
  5. data/lib/hecks/adapters/driven/d1.rb +48 -314
  6. data/lib/hecks/adapters/driven/folder.rb +20 -10
  7. data/lib/hecks/adapters/driven/google_authentication.rb +18 -4
  8. data/lib/hecks/adapters/driven/governance_authorization.rb +2 -2
  9. data/lib/hecks/adapters/driven/heki/journal.rb +11 -10
  10. data/lib/hecks/adapters/driven/heki/saga_store.rb +4 -6
  11. data/lib/hecks/adapters/driven/heki/sagas.rb +55 -0
  12. data/lib/hecks/adapters/driven/heki.rb +21 -66
  13. data/lib/hecks/adapters/driven/in_memory_ordering.rb +37 -12
  14. data/lib/hecks/adapters/driven/lambda/client.rb +1 -1
  15. data/lib/hecks/adapters/driven/lambda.rb +1 -8
  16. data/lib/hecks/adapters/driven/memory/outbox_rows.rb +76 -0
  17. data/lib/hecks/adapters/driven/memory/shared_elements/values.rb +117 -0
  18. data/lib/hecks/adapters/driven/memory/shared_elements.rb +10 -97
  19. data/lib/hecks/adapters/driven/memory.rb +3 -65
  20. data/lib/hecks/adapters/driven/postgres/codec.rb +29 -26
  21. data/lib/hecks/adapters/driven/postgres/ddl.rb +50 -0
  22. data/lib/hecks/adapters/driven/postgres/dialect.rb +93 -0
  23. data/lib/hecks/adapters/driven/postgres/events.rb +57 -0
  24. data/lib/hecks/adapters/driven/postgres/journal.rb +127 -0
  25. data/lib/hecks/adapters/driven/postgres/outbox.rb +39 -31
  26. data/lib/hecks/adapters/driven/postgres/repository.rb +190 -0
  27. data/lib/hecks/adapters/driven/postgres/sagas.rb +72 -0
  28. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +13 -41
  29. data/lib/hecks/adapters/driven/postgres.rb +61 -528
  30. data/lib/hecks/adapters/driven/prism.rb +1 -1
  31. data/lib/hecks/adapters/driven/sql_query_builder.rb +45 -53
  32. data/lib/hecks/adapters/driven/sql_value_members.rb +57 -0
  33. data/lib/hecks/adapters/driven/sqlite/codec.rb +32 -29
  34. data/lib/hecks/adapters/driven/sqlite/ddl.rb +68 -0
  35. data/lib/hecks/adapters/driven/sqlite/dialect.rb +55 -0
  36. data/lib/hecks/adapters/driven/sqlite/events.rb +61 -0
  37. data/lib/hecks/adapters/driven/sqlite/journal.rb +125 -0
  38. data/lib/hecks/adapters/driven/sqlite/outbox.rb +98 -0
  39. data/lib/hecks/adapters/driven/sqlite/projection.rb +82 -63
  40. data/lib/hecks/adapters/driven/sqlite/repository.rb +146 -0
  41. data/lib/hecks/adapters/driven/sqlite/sagas.rb +69 -0
  42. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +8 -55
  43. data/lib/hecks/adapters/driven/sqlite.rb +36 -513
  44. data/lib/hecks/adapters/driven/tenant_provisioner.rb +13 -7
  45. data/lib/hecks/adapters/driving/github_webhook.rb +11 -8
  46. data/lib/hecks/behaviors/dsl.rb +17 -12
  47. data/lib/hecks/behaviors/expectations/boot.rb +81 -0
  48. data/lib/hecks/behaviors/expectations/checks.rb +178 -0
  49. data/lib/hecks/behaviors/expectations/dispatching.rb +93 -0
  50. data/lib/hecks/behaviors/expectations/qualify.rb +81 -0
  51. data/lib/hecks/behaviors/expectations.rb +39 -355
  52. data/lib/hecks/behaviors/rspec.rb +12 -12
  53. data/lib/hecks/behaviors/runner.rb +20 -11
  54. data/lib/hecks/bench/cli.rb +16 -13
  55. data/lib/hecks/bench/environment.rb +1 -1
  56. data/lib/hecks/bench/report.rb +11 -7
  57. data/lib/hecks/bench/ruby_runner.rb +13 -8
  58. data/lib/hecks/bench/rust_runner.rb +19 -11
  59. data/lib/hecks/bench/suite.rb +48 -20
  60. data/lib/hecks/bench/workload.rb +42 -31
  61. data/lib/hecks/bluebook/aggregate.rb +15 -21
  62. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +18 -21
  63. data/lib/hecks/bluebook/assembly/build.rb +12 -7
  64. data/lib/hecks/bluebook/assembly/contracts/read_models.rb +70 -0
  65. data/lib/hecks/bluebook/assembly/contracts/rules.rb +84 -0
  66. data/lib/hecks/bluebook/assembly/contracts/sagas.rb +109 -0
  67. data/lib/hecks/bluebook/assembly/contracts/structure.rb +91 -0
  68. data/lib/hecks/bluebook/assembly/contracts.rb +9 -319
  69. data/lib/hecks/bluebook/assembly/marks.rb +9 -8
  70. data/lib/hecks/bluebook/attribute.rb +13 -10
  71. data/lib/hecks/bluebook/behaviour/aggregate.rb +10 -3
  72. data/lib/hecks/bluebook/behaviour/read_model.rb +26 -13
  73. data/lib/hecks/bluebook/chapter.rb +22 -14
  74. data/lib/hecks/bluebook/command.rb +14 -18
  75. data/lib/hecks/bluebook/domain_port.rb +11 -8
  76. data/lib/hecks/bluebook/dsl/aggregate_builder/correction_sealing.rb +78 -0
  77. data/lib/hecks/bluebook/dsl/aggregate_builder/draining.rb +74 -0
  78. data/lib/hecks/bluebook/dsl/aggregate_builder/query_field_sealing.rb +105 -0
  79. data/lib/hecks/bluebook/dsl/aggregate_builder/query_sealing.rb +121 -0
  80. data/lib/hecks/bluebook/dsl/aggregate_builder/relationships.rb +128 -0
  81. data/lib/hecks/bluebook/dsl/aggregate_builder/rules.rb +84 -0
  82. data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +61 -249
  83. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +51 -285
  84. data/lib/hecks/bluebook/dsl/attribute_collector/identity_resolution.rb +113 -0
  85. data/lib/hecks/bluebook/dsl/attribute_collector.rb +58 -117
  86. data/lib/hecks/bluebook/dsl/binding_proxy.rb +24 -19
  87. data/lib/hecks/bluebook/dsl/bluebook_builder/pending_givens.rb +109 -0
  88. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb +105 -0
  89. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/event_shapes.rb +126 -0
  90. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/hop_tails.rb +79 -0
  91. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/projected_fields.rb +76 -0
  92. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/provisions.rb +65 -0
  93. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/query_hops.rb +123 -0
  94. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/references.rb +112 -0
  95. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/with_projections.rb +126 -0
  96. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +34 -595
  97. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +18 -107
  98. data/lib/hecks/bluebook/dsl/command_builder/implicit_attributes.rb +132 -0
  99. data/lib/hecks/bluebook/dsl/command_builder/mutations.rb +190 -0
  100. data/lib/hecks/bluebook/dsl/command_builder/owner.rb +22 -0
  101. data/lib/hecks/bluebook/dsl/command_builder/rules.rb +57 -0
  102. data/lib/hecks/bluebook/dsl/command_builder.rb +60 -360
  103. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +19 -13
  104. data/lib/hecks/bluebook/dsl/entity_builder/rules.rb +96 -0
  105. data/lib/hecks/bluebook/dsl/entity_builder/scope.rb +25 -0
  106. data/lib/hecks/bluebook/dsl/entity_builder/sealing.rb +94 -0
  107. data/lib/hecks/bluebook/dsl/entity_builder.rb +35 -169
  108. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +53 -24
  109. data/lib/hecks/bluebook/dsl/hecksagon_builder/chapter_scope.rb +133 -0
  110. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +3 -97
  111. data/lib/hecks/bluebook/dsl/identity_declaration.rb +73 -73
  112. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +7 -3
  113. data/lib/hecks/bluebook/dsl/need_word.rb +1 -1
  114. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +34 -29
  115. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +57 -41
  116. data/lib/hecks/bluebook/dsl/query_builder.rb +12 -15
  117. data/lib/hecks/bluebook/dsl/read_model_builder/sealing.rb +116 -0
  118. data/lib/hecks/bluebook/dsl/read_model_builder.rb +25 -102
  119. data/lib/hecks/bluebook/dsl/rule_reference.rb +26 -12
  120. data/lib/hecks/bluebook/dsl/translation_builder.rb +24 -14
  121. data/lib/hecks/bluebook/dsl/value_object_builder.rb +29 -19
  122. data/lib/hecks/bluebook/dsl/word_gate.rb +34 -27
  123. data/lib/hecks/bluebook/entity.rb +13 -17
  124. data/lib/hecks/bluebook/expression/ast_json/emitters.rb +93 -0
  125. data/lib/hecks/bluebook/expression/ast_json/emitters.rb-e +88 -0
  126. data/lib/hecks/bluebook/expression/ast_json.rb +49 -76
  127. data/lib/hecks/bluebook/expression/ast_reader.rb +95 -28
  128. data/lib/hecks/bluebook/expression/canonical_form.rb +6 -26
  129. data/lib/hecks/bluebook/expression/evaluator/parser.rb +62 -0
  130. data/lib/hecks/bluebook/expression/evaluator/scanning.rb +122 -0
  131. data/lib/hecks/bluebook/expression/evaluator.rb +11 -111
  132. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +28 -44
  133. data/lib/hecks/bluebook/expression/resolver/lookups.rb +77 -0
  134. data/lib/hecks/bluebook/expression/resolver/operations.rb +78 -0
  135. data/lib/hecks/bluebook/expression/resolver/parsing.rb +110 -0
  136. data/lib/hecks/bluebook/expression/resolver/scanning.rb +139 -0
  137. data/lib/hecks/bluebook/expression/resolver/values.rb +115 -0
  138. data/lib/hecks/bluebook/expression/resolver.rb +16 -414
  139. data/lib/hecks/bluebook/{hexagon.rb → hecksagon.rb} +22 -14
  140. data/lib/hecks/bluebook/keyword_fields.rb +42 -0
  141. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +7 -6
  142. data/lib/hecks/bluebook/meta_validator/judge/cells.rb +99 -0
  143. data/lib/hecks/bluebook/meta_validator/judge/dispatching.rb +111 -0
  144. data/lib/hecks/bluebook/meta_validator/judge/identity.rb +108 -0
  145. data/lib/hecks/bluebook/meta_validator/judge/walking.rb +141 -0
  146. data/lib/hecks/bluebook/meta_validator/judge.rb +31 -376
  147. data/lib/hecks/bluebook/meta_validator/modes.rb +137 -0
  148. data/lib/hecks/bluebook/meta_validator/plan/category.rb +44 -0
  149. data/lib/hecks/bluebook/meta_validator/plan/verbs.rb +73 -0
  150. data/lib/hecks/bluebook/meta_validator/plan.rb +38 -122
  151. data/lib/hecks/bluebook/meta_validator/readings/fields.rb +100 -0
  152. data/lib/hecks/bluebook/meta_validator/readings.rb +10 -95
  153. data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +89 -0
  154. data/lib/hecks/bluebook/meta_validator/reconstruction/reading.rb +96 -0
  155. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -151
  156. data/lib/hecks/bluebook/meta_validator/shapes/helpers.rb +83 -0
  157. data/lib/hecks/bluebook/meta_validator/shapes.rb +8 -75
  158. data/lib/hecks/bluebook/meta_validator/syntax_boot/disk_cache.rb +77 -0
  159. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +31 -95
  160. data/lib/hecks/bluebook/meta_validator/translation_judge/rules.rb +74 -0
  161. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +15 -65
  162. data/lib/hecks/bluebook/meta_validator/verdict_cache/tagging.rb +63 -0
  163. data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +22 -43
  164. data/lib/hecks/bluebook/meta_validator/world_judge.rb +8 -4
  165. data/lib/hecks/bluebook/meta_validator.rb +59 -175
  166. data/lib/hecks/bluebook/model_check/lifecycle_checks.rb +122 -0
  167. data/lib/hecks/bluebook/model_check/policy_checks.rb +129 -0
  168. data/lib/hecks/bluebook/model_check/saga_checks.rb +134 -0
  169. data/lib/hecks/bluebook/model_check/verbs.rb +69 -0
  170. data/lib/hecks/bluebook/model_check.rb +73 -413
  171. data/lib/hecks/bluebook/pattern_subset/refusals.rb +54 -0
  172. data/lib/hecks/bluebook/pattern_subset/scan.rb +58 -0
  173. data/lib/hecks/bluebook/pattern_subset.rb +93 -134
  174. data/lib/hecks/bluebook/process_manager.rb +10 -9
  175. data/lib/hecks/bluebook/project_discovery.rb +10 -7
  176. data/lib/hecks/bluebook/project_register.rb +42 -41
  177. data/lib/hecks/bluebook/query.rb +19 -12
  178. data/lib/hecks/bluebook/read_model.rb +41 -39
  179. data/lib/hecks/bluebook/smoke_test.rb +51 -36
  180. data/lib/hecks/bluebook/synthesizer.rb +13 -5
  181. data/lib/hecks/bluebook/translation.rb +12 -12
  182. data/lib/hecks/bluebook.rb +1 -1
  183. data/lib/hecks/chapters.rb +32 -16
  184. data/lib/hecks/cli/behaviors.rb +22 -15
  185. data/lib/hecks/cli/check_era.rb +2 -2
  186. data/lib/hecks/cli/command_table.rb +72 -0
  187. data/lib/hecks/cli/console.rb +10 -7
  188. data/lib/hecks/cli/deploy_template_diff.rb +22 -9
  189. data/lib/hecks/cli/document.rb +14 -10
  190. data/lib/hecks/cli/domain_stub.rb +1 -1
  191. data/lib/hecks/cli/domain_writer.rb +1 -1
  192. data/lib/hecks/cli/expression_projection.rb +8 -6
  193. data/lib/hecks/cli/follow.rb +10 -4
  194. data/lib/hecks/cli/interview_aggregate.rb +132 -0
  195. data/lib/hecks/cli/interview_draft.rb +16 -200
  196. data/lib/hecks/cli/interview_record.rb +130 -0
  197. data/lib/hecks/cli/interview_run.rb +19 -8
  198. data/lib/hecks/cli/interview_session/agent_state.rb +70 -0
  199. data/lib/hecks/cli/interview_session/catalog.rb +76 -0
  200. data/lib/hecks/cli/interview_session/manual_findings.rb +48 -0
  201. data/lib/hecks/cli/interview_session/proposals.rb +90 -0
  202. data/lib/hecks/cli/interview_session.rb +8 -205
  203. data/lib/hecks/cli/interview_shape.rb +13 -6
  204. data/lib/hecks/cli/ir.rb +8 -11
  205. data/lib/hecks/cli/launcher_words.rb +168 -0
  206. data/lib/hecks/cli/model_check/examination.rb +93 -0
  207. data/lib/hecks/cli/model_check/sources.rb +57 -0
  208. data/lib/hecks/cli/model_check.rb +28 -134
  209. data/lib/hecks/cli/project_cli/launcher_source.rb +177 -0
  210. data/lib/hecks/cli/project_cli/templates.rb +106 -0
  211. data/lib/hecks/cli/project_cli.rb +57 -236
  212. data/lib/hecks/cli/project_diagrams.rb +26 -4
  213. data/lib/hecks/cli/project_glossary.rb +19 -9
  214. data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +29 -13
  215. data/lib/hecks/cli/release.rb +29 -22
  216. data/lib/hecks/cli/release_gem.rb +12 -6
  217. data/lib/hecks/cli/rspec_io_parallel_files.rb +87 -30
  218. data/lib/hecks/cli/rspec_shard_files.rb +24 -9
  219. data/lib/hecks/cli/run.rb +25 -44
  220. data/lib/hecks/cli/run_expectations.rb +63 -0
  221. data/lib/hecks/cli/seed_semantics_corpus.rb +37 -17
  222. data/lib/hecks/cli/smoke_http/checks.rb +66 -0
  223. data/lib/hecks/cli/smoke_http/settings.rb +63 -0
  224. data/lib/hecks/cli/smoke_http/transport.rb +45 -0
  225. data/lib/hecks/cli/smoke_http.rb +8 -142
  226. data/lib/hecks/cli/smoke_test.rb +18 -4
  227. data/lib/hecks/cli/stores.rb +7 -4
  228. data/lib/hecks/cli/stress_concurrency_specs/reporting.rb +44 -0
  229. data/lib/hecks/cli/stress_concurrency_specs/usage.rb +28 -0
  230. data/lib/hecks/cli/stress_concurrency_specs.rb +82 -80
  231. data/lib/hecks/cli.rb +32 -208
  232. data/lib/hecks/codemod/runner.rb +92 -0
  233. data/lib/hecks/codemod/sweep.rb +94 -0
  234. data/lib/hecks/codemod.rb +22 -165
  235. data/lib/hecks/corpus/routes.rb +34 -0
  236. data/lib/hecks/corpus/rust.rb +193 -0
  237. data/lib/hecks/corpus/sources.rb +46 -0
  238. data/lib/hecks/corpus.rb +28 -265
  239. data/lib/hecks/deploy/bluebook/deploy.bluebook +1510 -3
  240. data/lib/hecks/deploy/bluebook/deploy.hecksagon +57 -0
  241. data/lib/hecks/deploy/oidc.json +225 -0
  242. data/lib/hecks/doc/reference/coverage.rb +70 -0
  243. data/lib/hecks/doc/reference/harvester.rb +55 -0
  244. data/lib/hecks/doc/reference/readme.rb +89 -0
  245. data/lib/hecks/doc/reference/rendering.rb +149 -0
  246. data/lib/hecks/doc/reference.rb +14 -273
  247. data/lib/hecks/doors/cli_door/nesting.rb +34 -0
  248. data/lib/hecks/doors/cli_door/shorthand.rb +85 -0
  249. data/lib/hecks/doors/cli_door.rb +23 -95
  250. data/lib/hecks/doors/cli_runner/answers.rb +138 -0
  251. data/lib/hecks/doors/cli_runner/resolution.rb +146 -0
  252. data/lib/hecks/doors/cli_runner/settling.rb +115 -0
  253. data/lib/hecks/doors/cli_runner/streaming.rb +90 -0
  254. data/lib/hecks/doors/cli_runner/suggestions.rb +43 -0
  255. data/lib/hecks/doors/cli_runner.rb +12 -336
  256. data/lib/hecks/doors/command_request.rb +42 -31
  257. data/lib/hecks/doors/handle.rb +32 -30
  258. data/lib/hecks/doors/launcher_options.rb +62 -7
  259. data/lib/hecks/doors/mcp_door/properties.rb +47 -0
  260. data/lib/hecks/doors/mcp_door/tool_calls.rb +113 -0
  261. data/lib/hecks/doors/mcp_door/tool_definitions/auditing.rb +51 -0
  262. data/lib/hecks/doors/mcp_door/tool_definitions/calling.rb +69 -0
  263. data/lib/hecks/doors/mcp_door/tool_definitions/reading.rb +97 -0
  264. data/lib/hecks/doors/mcp_door/tool_definitions.rb +15 -0
  265. data/lib/hecks/doors/mcp_door.rb +55 -301
  266. data/lib/hecks/doors/mcp_door_scope/argument_policy.rb +92 -0
  267. data/lib/hecks/doors/mcp_door_scope/env_problems.rb +55 -0
  268. data/lib/hecks/doors/mcp_door_scope/presenter.rb +78 -0
  269. data/lib/hecks/doors/mcp_door_scope.rb +16 -172
  270. data/lib/hecks/doors/ruby_door/aggregate_door.rb +1 -1
  271. data/lib/hecks/doors/ruby_door/chapter.rb +33 -16
  272. data/lib/hecks/doors/ruby_door.rb +14 -11
  273. data/lib/hecks/doors/usage_cache.rb +14 -8
  274. data/lib/hecks/doors.rb +10 -4
  275. data/lib/hecks/embryonaut_bluebook/manifest.rb +11 -3
  276. data/lib/hecks/embryonaut_bluebook/registry/changelog.rb +26 -0
  277. data/lib/hecks/embryonaut_bluebook/registry/versions.rb +27 -0
  278. data/lib/hecks/embryonaut_bluebook/registry.rb +27 -37
  279. data/lib/hecks/embryonaut_bluebook/vendor/acceptance.rb +37 -0
  280. data/lib/hecks/embryonaut_bluebook/vendor.rb +22 -36
  281. data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +9 -6
  282. data/lib/hecks/embryonaut_bluebook.rb +16 -11
  283. data/lib/hecks/engine_agreement.rb +24 -17
  284. data/lib/hecks/forms/app/commands.rb +98 -0
  285. data/lib/hecks/forms/app/queries.rb +62 -0
  286. data/lib/hecks/forms/app/records.rb +67 -0
  287. data/lib/hecks/forms/app/responses.rb +46 -0
  288. data/lib/hecks/forms/app.rb +33 -221
  289. data/lib/hecks/forms/banking_presentation.rb +5 -0
  290. data/lib/hecks/forms/command_form_renderer.rb +55 -14
  291. data/lib/hecks/forms/field_controls.rb +95 -0
  292. data/lib/hecks/forms/field_renderer.rb +34 -88
  293. data/lib/hecks/forms/field_shape.rb +9 -34
  294. data/lib/hecks/forms/html.rb +1 -1
  295. data/lib/hecks/forms/index_renderer.rb +14 -9
  296. data/lib/hecks/forms/page.rb +2 -106
  297. data/lib/hecks/forms/page_assets.rb +88 -0
  298. data/lib/hecks/forms/page_script.rb +28 -0
  299. data/lib/hecks/forms/params.rb +17 -8
  300. data/lib/hecks/forms/query_form_renderer.rb +11 -7
  301. data/lib/hecks/forms/record_renderer.rb +28 -19
  302. data/lib/hecks/forms/reference_options.rb +1 -1
  303. data/lib/hecks/forms/text_shape.rb +40 -0
  304. data/lib/hecks/fqn.rb +64 -32
  305. data/lib/hecks/framework.rb +10 -3
  306. data/lib/hecks/freezer.rb +10 -1
  307. data/lib/hecks/fuzzing/bounded_exhaustive_expressions/fragments.rb +61 -0
  308. data/lib/hecks/fuzzing/bounded_exhaustive_expressions/productions.rb +217 -0
  309. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +5 -194
  310. data/lib/hecks/fuzzing/combination_miner.rb +23 -12
  311. data/lib/hecks/fuzzing/concurrent_dispatch/racing.rb +64 -0
  312. data/lib/hecks/fuzzing/concurrent_dispatch/world_copy.rb +66 -0
  313. data/lib/hecks/fuzzing/concurrent_dispatch.rb +31 -107
  314. data/lib/hecks/fuzzing/coverage_campaign.rb +7 -7
  315. data/lib/hecks/fuzzing/differential/wire_comparison.rb +74 -0
  316. data/lib/hecks/fuzzing/differential.rb +59 -84
  317. data/lib/hecks/fuzzing/domain_generator/block_rendering.rb +70 -0
  318. data/lib/hecks/fuzzing/domain_generator/builder/attribute_shapes.rb +105 -0
  319. data/lib/hecks/fuzzing/domain_generator/builder/shapes.rb +97 -0
  320. data/lib/hecks/fuzzing/domain_generator/builder/wiring.rb +128 -0
  321. data/lib/hecks/fuzzing/domain_generator/builder.rb +105 -0
  322. data/lib/hecks/fuzzing/domain_generator/pruning.rb +90 -0
  323. data/lib/hecks/fuzzing/domain_generator/removals.rb +62 -0
  324. data/lib/hecks/fuzzing/domain_generator/rendering.rb +94 -0
  325. data/lib/hecks/fuzzing/domain_generator/tokens.rb +38 -0
  326. data/lib/hecks/fuzzing/domain_generator.rb +7 -555
  327. data/lib/hecks/fuzzing/era_boundary.rb +34 -24
  328. data/lib/hecks/fuzzing/form_census.rb +18 -8
  329. data/lib/hecks/fuzzing/generated_domain_check.rb +23 -11
  330. data/lib/hecks/fuzzing/isolated_boot/copying.rb +62 -0
  331. data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +133 -0
  332. data/lib/hecks/fuzzing/isolated_boot/worlds.rb +102 -0
  333. data/lib/hecks/fuzzing/isolated_boot.rb +25 -252
  334. data/lib/hecks/fuzzing/persistence_parity.rb +5 -5
  335. data/lib/hecks/fuzzing/properties/aggregation_recompute.rb +121 -0
  336. data/lib/hecks/fuzzing/properties/catalog.rb +138 -0
  337. data/lib/hecks/fuzzing/properties/corrections.rb +23 -20
  338. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +64 -185
  339. data/lib/hecks/fuzzing/properties/group_by_recompute.rb +69 -0
  340. data/lib/hecks/fuzzing/properties/guards.rb +76 -108
  341. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +66 -227
  342. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +46 -35
  343. data/lib/hecks/fuzzing/properties/mutation_recompute.rb +162 -0
  344. data/lib/hecks/fuzzing/properties/outbox.rb +41 -24
  345. data/lib/hecks/fuzzing/properties/piece_invariants.rb +61 -0
  346. data/lib/hecks/fuzzing/properties/policy_wiring.rb +140 -0
  347. data/lib/hecks/fuzzing/properties/query_rows.rb +67 -0
  348. data/lib/hecks/fuzzing/properties/querying.rb +69 -90
  349. data/lib/hecks/fuzzing/properties/references.rb +100 -0
  350. data/lib/hecks/fuzzing/properties/tenant_scope.rb +84 -0
  351. data/lib/hecks/fuzzing/properties.rb +6 -119
  352. data/lib/hecks/fuzzing/qa_settings.rb +23 -17
  353. data/lib/hecks/fuzzing/replay/fan_out.rb +78 -0
  354. data/lib/hecks/fuzzing/replay/filters.rb +72 -0
  355. data/lib/hecks/fuzzing/replay/guard_check.rb +88 -0
  356. data/lib/hecks/fuzzing/replay/mutation_trace.rb +117 -0
  357. data/lib/hecks/fuzzing/replay/observation.rb +60 -0
  358. data/lib/hecks/fuzzing/replay/read_only_steps.rb +84 -0
  359. data/lib/hecks/fuzzing/replay/session.rb +151 -0
  360. data/lib/hecks/fuzzing/replay.rb +35 -442
  361. data/lib/hecks/fuzzing/rust_gap_manifest.rb +3 -4
  362. data/lib/hecks/fuzzing/self_consistency/saga_redelivery.rb +133 -0
  363. data/lib/hecks/fuzzing/self_consistency/sagas.rb +93 -0
  364. data/lib/hecks/fuzzing/self_consistency/value_objects.rb +87 -0
  365. data/lib/hecks/fuzzing/self_consistency.rb +8 -213
  366. data/lib/hecks/fuzzing/sequence_generator/adversary/argument_mutations.rb +116 -0
  367. data/lib/hecks/fuzzing/sequence_generator/adversary/caller_draw.rb +68 -0
  368. data/lib/hecks/fuzzing/sequence_generator/adversary/identity_mutations.rb +62 -0
  369. data/lib/hecks/fuzzing/sequence_generator/adversary/precedence_mutations.rb +126 -0
  370. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +23 -283
  371. data/lib/hecks/fuzzing/sequence_generator/argument_drawing.rb +78 -0
  372. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +69 -53
  373. data/lib/hecks/fuzzing/sequence_generator/identity_shaping.rb +85 -0
  374. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +20 -16
  375. data/lib/hecks/fuzzing/sequence_generator/picker.rb +12 -6
  376. data/lib/hecks/fuzzing/sequence_generator/prefixing.rb +45 -0
  377. data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +19 -8
  378. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +43 -144
  379. data/lib/hecks/fuzzing/sequence_generator.rb +65 -63
  380. data/lib/hecks/fuzzing/shrinker.rb +33 -29
  381. data/lib/hecks/fuzzing/target_capabilities.rb +10 -4
  382. data/lib/hecks/fuzzing/value_generator.rb +27 -17
  383. data/lib/hecks/gate/stages.yml +10 -0
  384. data/lib/hecks/grammar/evolve/arguments.rb +90 -0
  385. data/lib/hecks/grammar/evolve/keywords.rb +81 -0
  386. data/lib/hecks/grammar/evolve/seeds.rb +172 -0
  387. data/lib/hecks/grammar/evolve.rb +22 -263
  388. data/lib/hecks/grammar/operators.rb +111 -0
  389. data/lib/hecks/grammar.rb +53 -126
  390. data/lib/hecks/hecks/adapters/bluebook_report.rb +91 -0
  391. data/lib/hecks/hecks/adapters/codebase/codemods.rb +1 -1
  392. data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +23 -9
  393. data/lib/hecks/hecks/adapters/codebase/language/edits.rb +75 -0
  394. data/lib/hecks/hecks/adapters/codebase/language.rb +30 -72
  395. data/lib/hecks/hecks/adapters/codebase/promotion/candidates.rb +54 -0
  396. data/lib/hecks/hecks/adapters/codebase/promotion/gate.rb +50 -0
  397. data/lib/hecks/hecks/adapters/codebase/promotion/move.rb +70 -0
  398. data/lib/hecks/hecks/adapters/codebase/promotion/standing.rb +88 -0
  399. data/lib/hecks/hecks/adapters/codebase/promotion/watch.rb +83 -0
  400. data/lib/hecks/hecks/adapters/codebase/promotion.rb +115 -0
  401. data/lib/hecks/hecks/adapters/codebase/publishing.rb +31 -12
  402. data/lib/hecks/hecks/adapters/codebase/regeneration.rb +43 -6
  403. data/lib/hecks/hecks/adapters/codebase/release_facts.rb +16 -5
  404. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +9 -1
  405. data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +1 -1
  406. data/lib/hecks/hecks/adapters/codebase/style.rb +1 -1
  407. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +11 -5
  408. data/lib/hecks/hecks/adapters/codebase/test_suite.rb +27 -8
  409. data/lib/hecks/hecks/adapters/console_capture.rb +21 -17
  410. data/lib/hecks/hecks/adapters/cost_explorer.rb +11 -6
  411. data/lib/hecks/hecks/adapters/deploy_plans.rb +49 -0
  412. data/lib/hecks/hecks/adapters/deploy_toolchain/answers.rb +141 -0
  413. data/lib/hecks/hecks/adapters/deploy_toolchain/scripts.rb +95 -0
  414. data/lib/hecks/hecks/adapters/deploy_toolchain/statuses.rb +74 -0
  415. data/lib/hecks/hecks/adapters/deploy_toolchain.rb +122 -59
  416. data/lib/hecks/hecks/adapters/finding_github.rb +2 -2
  417. data/lib/hecks/hecks/adapters/first_admin.rb +22 -8
  418. data/lib/hecks/hecks/adapters/git.rb +18 -5
  419. data/lib/hecks/hecks/adapters/git_refs.rb +144 -0
  420. data/lib/hecks/hecks/adapters/github_rulesets.rb +126 -0
  421. data/lib/hecks/hecks/adapters/host_http.rb +16 -6
  422. data/lib/hecks/hecks/adapters/in_process_boot.rb +9 -5
  423. data/lib/hecks/hecks/adapters/in_process_operations/tailing.rb +61 -0
  424. data/lib/hecks/hecks/adapters/in_process_operations.rb +39 -37
  425. data/lib/hecks/hecks/adapters/journal_store/changes.rb +21 -15
  426. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +29 -12
  427. data/lib/hecks/hecks/adapters/journal_store/readings/attestation.rb +52 -0
  428. data/lib/hecks/hecks/adapters/journal_store/readings/scaffolding.rb +52 -0
  429. data/lib/hecks/hecks/adapters/journal_store/readings.rb +5 -62
  430. data/lib/hecks/hecks/adapters/local_files.rb +27 -10
  431. data/lib/hecks/hecks/adapters/pg_admin/ownership.rb +115 -0
  432. data/lib/hecks/hecks/adapters/pg_admin.rb +14 -87
  433. data/lib/hecks/hecks/adapters/process_pool.rb +54 -22
  434. data/lib/hecks/hecks/adapters/rust_toolchain.rb +12 -4
  435. data/lib/hecks/hecks/adapters/site_toolchain.rb +19 -10
  436. data/lib/hecks/hecks/adapters/terminal.rb +13 -9
  437. data/lib/hecks/hecks/codebase.bluebook +322 -5
  438. data/lib/hecks/hecks/custodian.bluebook +12 -2
  439. data/lib/hecks/hecks/hecks.hecksagon +73 -0
  440. data/lib/hecks/hecks/hecks.world +15 -3
  441. data/lib/hecks/kernel_capabilities/templates.rb +92 -0
  442. data/lib/hecks/kernel_capabilities.rb +18 -85
  443. data/lib/hecks/language/bluebook/vocabulary.bluebook +43 -1
  444. data/lib/hecks/literal/item_splitter.rb +50 -0
  445. data/lib/hecks/literal.rb +29 -38
  446. data/lib/hecks/mcp_stdio_guard.rb +8 -8
  447. data/lib/hecks/naming.rb +9 -3
  448. data/lib/hecks/persistence_legacy_fixture/postgres_stores.rb +81 -0
  449. data/lib/hecks/persistence_legacy_fixture/regenerate.rb +26 -66
  450. data/lib/hecks/persistence_legacy_fixture.rb +13 -10
  451. data/lib/hecks/ports/access_control.rb +13 -10
  452. data/lib/hecks/ports/agent/answers.rb +2 -2
  453. data/lib/hecks/ports/agent.rb +13 -10
  454. data/lib/hecks/ports/authentication.rb +13 -10
  455. data/lib/hecks/ports/authorization.rb +13 -10
  456. data/lib/hecks/ports/clock.rb +13 -10
  457. data/lib/hecks/ports/extraction.rb +13 -12
  458. data/lib/hecks/ports/identity_assignment.rb +13 -10
  459. data/lib/hecks/ports/identity_generation.rb +13 -10
  460. data/lib/hecks/ports/identity_resolution.rb +13 -10
  461. data/lib/hecks/ports/key_vault.rb +13 -10
  462. data/lib/hecks/ports/persistence/append_only.rb +5 -5
  463. data/lib/hecks/ports/persistence/binding_policy.rb +33 -9
  464. data/lib/hecks/ports/persistence/codec_boundary.rb +22 -11
  465. data/lib/hecks/ports/persistence/constants.rb +10 -0
  466. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +18 -16
  467. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +27 -18
  468. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +52 -23
  469. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +14 -8
  470. data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +17 -6
  471. data/lib/hecks/ports/persistence/plugins/era/lineage/coverage.rb +58 -0
  472. data/lib/hecks/ports/persistence/plugins/era/lineage/rewrite.rb +130 -0
  473. data/lib/hecks/ports/persistence/plugins/era/lineage/rules.rb +25 -0
  474. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +20 -180
  475. data/lib/hecks/ports/persistence/plugins/era/postgres_era/boot.rb +41 -0
  476. data/lib/hecks/ports/persistence/plugins/era/postgres_era/class_methods.rb +105 -0
  477. data/lib/hecks/ports/persistence/plugins/era/postgres_era/dialect.rb +137 -0
  478. data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +25 -28
  479. data/lib/hecks/ports/persistence/plugins/era/postgres_era/head_writes.rb +62 -0
  480. data/lib/hecks/ports/persistence/plugins/era/postgres_era/journal.rb +128 -0
  481. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/base_sql.rb +74 -0
  482. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/chain_sql.rb +169 -0
  483. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/domain_rename.rb +91 -0
  484. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_integrity.rb +99 -0
  485. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +0 -73
  486. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +55 -39
  487. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +51 -222
  488. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/merge_writes.rb +120 -0
  489. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +85 -60
  490. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +97 -181
  491. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +19 -19
  492. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/sql_templates.rb +88 -0
  493. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +77 -118
  494. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +3 -117
  495. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_sql.rb +116 -0
  496. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +3 -1
  497. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/context.rb +38 -0
  498. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +43 -25
  499. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +62 -38
  500. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +21 -16
  501. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +66 -86
  502. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/refusals.rb +75 -0
  503. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +27 -9
  504. data/lib/hecks/ports/persistence/plugins/era/postgres_era/query_phases.rb +63 -0
  505. data/lib/hecks/ports/persistence/plugins/era/postgres_era/sagas.rb +78 -0
  506. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +28 -482
  507. data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +40 -12
  508. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +22 -15
  509. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +39 -19
  510. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +16 -16
  511. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +48 -25
  512. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +60 -99
  513. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/path_diff.rb +57 -0
  514. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +21 -11
  515. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +13 -4
  516. data/lib/hecks/ports/persistence/postgres_dump/connection.rb +4 -2
  517. data/lib/hecks/ports/persistence/postgres_dump.rb +13 -7
  518. data/lib/hecks/ports/persistence/repository_factory.rb +35 -11
  519. data/lib/hecks/ports/persistence/state_codec.rb +10 -0
  520. data/lib/hecks/ports/persistence.rb +1 -10
  521. data/lib/hecks/ports/projection.rb +34 -21
  522. data/lib/hecks/ports/query/in_memory.rb +16 -8
  523. data/lib/hecks/projection_files/expression_tables.rb +64 -0
  524. data/lib/hecks/projection_files/texts.rb +67 -0
  525. data/lib/hecks/projection_files.rb +19 -103
  526. data/lib/hecks/projections/bootstrap_table.rb +43 -29
  527. data/lib/hecks/projections/deploy/bastion_lines.rb +32 -0
  528. data/lib/hecks/projections/deploy/box/access.rb +73 -0
  529. data/lib/hecks/projections/deploy/box/caddy.rb +87 -0
  530. data/lib/hecks/projections/deploy/box/compose.rb +70 -0
  531. data/lib/hecks/projections/deploy/box/hosting.rb +16 -108
  532. data/lib/hecks/projections/deploy/box/hosting_parts.rb +97 -0
  533. data/lib/hecks/projections/deploy/box/hosting_settings.rb +1 -1
  534. data/lib/hecks/projections/deploy/box/roll_recipe.rb +62 -0
  535. data/lib/hecks/projections/deploy/box/roll_scripts.rb +135 -0
  536. data/lib/hecks/projections/deploy/box/settings/checks.rb +38 -0
  537. data/lib/hecks/projections/deploy/box/settings/containers.rb +123 -0
  538. data/lib/hecks/projections/deploy/box/settings/origin.rb +56 -0
  539. data/lib/hecks/projections/deploy/box/settings/patterns.rb +43 -0
  540. data/lib/hecks/projections/deploy/box/settings/types.rb +72 -0
  541. data/lib/hecks/projections/deploy/box/settings.rb +58 -263
  542. data/lib/hecks/projections/deploy/box/stack_yaml.rb +107 -0
  543. data/lib/hecks/projections/deploy/box/templates/MIGRATION.md.tmpl +39 -0
  544. data/lib/hecks/projections/deploy/box/templates/Makefile.tmpl +24 -0
  545. data/lib/hecks/projections/deploy/box/templates/deploy-box.sh.tmpl +51 -4
  546. data/lib/hecks/projections/deploy/box/templates/deploy-service.services-roll.part +4 -3
  547. data/lib/hecks/projections/deploy/box/templates/deploy-service.sh.tmpl +16 -4
  548. data/lib/hecks/projections/deploy/box/templates/deploy-service.taskdef-roll.part +8 -7
  549. data/lib/hecks/projections/deploy/box/templates/deploy-service.taskdef.part +1 -1
  550. data/lib/hecks/projections/deploy/box/templates/deploy-usage-services.tmpl +4 -0
  551. data/lib/hecks/projections/deploy/box/templates/deploy-usage-taskdef.tmpl +5 -0
  552. data/lib/hecks/projections/deploy/box/templates/ecr-repository.yaml.tmpl +9 -0
  553. data/lib/hecks/projections/deploy/box/templates/hosting.mk.tmpl +6 -3
  554. data/lib/hecks/projections/deploy/box/templates/mode-summary-services.tmpl +2 -0
  555. data/lib/hecks/projections/deploy/box/templates/mode-summary-taskdef.tmpl +4 -0
  556. data/lib/hecks/projections/deploy/box/templates/restore-to-rds.sh.tmpl +8 -3
  557. data/lib/hecks/projections/deploy/box/templates/services-block.tmpl +9 -0
  558. data/lib/hecks/projections/deploy/box/templates/tunnel-egress.yaml.tmpl +11 -0
  559. data/lib/hecks/projections/deploy/box/templates/verify-copy.sh.tmpl +2 -2
  560. data/lib/hecks/projections/deploy/box/templates/writable-secrets.yaml.tmpl +7 -0
  561. data/lib/hecks/projections/deploy/box.rb +37 -503
  562. data/lib/hecks/projections/deploy/fargate/assembly.rb +13 -142
  563. data/lib/hecks/projections/deploy/fargate/cdn/behaviors.rb +76 -0
  564. data/lib/hecks/projections/deploy/fargate/cdn/lines.rb +112 -0
  565. data/lib/hecks/projections/deploy/fargate/cdn/options.rb +85 -0
  566. data/lib/hecks/projections/deploy/fargate/cdn.rb +23 -215
  567. data/lib/hecks/projections/deploy/fargate/check.rb +16 -6
  568. data/lib/hecks/projections/deploy/fargate/containers/definition_lines.rb +61 -0
  569. data/lib/hecks/projections/deploy/fargate/containers/reading.rb +86 -0
  570. data/lib/hecks/projections/deploy/fargate/containers/rendering.rb +132 -0
  571. data/lib/hecks/projections/deploy/fargate/containers/routing.rb +93 -0
  572. data/lib/hecks/projections/deploy/fargate/containers.rb +10 -286
  573. data/lib/hecks/projections/deploy/fargate/extras/reading.rb +90 -0
  574. data/lib/hecks/projections/deploy/fargate/extras/rendering.rb +81 -0
  575. data/lib/hecks/projections/deploy/fargate/extras.rb +9 -158
  576. data/lib/hecks/projections/deploy/fargate/monitoring/alarms.rb +115 -0
  577. data/lib/hecks/projections/deploy/fargate/monitoring/reading.rb +84 -0
  578. data/lib/hecks/projections/deploy/fargate/monitoring/topic.rb +59 -0
  579. data/lib/hecks/projections/deploy/fargate/monitoring/warmer.rb +90 -0
  580. data/lib/hecks/projections/deploy/fargate/monitoring/warmer_roles.rb +76 -0
  581. data/lib/hecks/projections/deploy/fargate/monitoring.rb +14 -348
  582. data/lib/hecks/projections/deploy/fargate/sections.rb +115 -0
  583. data/lib/hecks/projections/deploy/fargate/settings/ids.rb +55 -0
  584. data/lib/hecks/projections/deploy/fargate/settings/tuning.rb +77 -0
  585. data/lib/hecks/projections/deploy/fargate/settings.rb +17 -104
  586. data/lib/hecks/projections/deploy/fargate/stack/blocks.rb +91 -0
  587. data/lib/hecks/projections/deploy/fargate/stack/readers.rb +87 -0
  588. data/lib/hecks/projections/deploy/fargate/stack/recipes.rb +106 -0
  589. data/lib/hecks/projections/deploy/fargate/stack.rb +146 -0
  590. data/lib/hecks/projections/deploy/fargate/task_sections.rb +56 -0
  591. data/lib/hecks/projections/deploy/fargate/yaml.rb +1 -1
  592. data/lib/hecks/projections/deploy/fargate.rb +51 -756
  593. data/lib/hecks/projections/deploy/lambda/pii.rb +49 -0
  594. data/lib/hecks/projections/deploy/lambda/stack/blocks.rb +118 -0
  595. data/lib/hecks/projections/deploy/lambda/stack/checks.rb +64 -0
  596. data/lib/hecks/projections/deploy/lambda/stack/deploy_chain.rb +119 -0
  597. data/lib/hecks/projections/deploy/lambda/stack/readers.rb +62 -0
  598. data/lib/hecks/projections/deploy/lambda/stack/reading.rb +170 -0
  599. data/lib/hecks/projections/deploy/lambda/stack/reading_web.rb +53 -0
  600. data/lib/hecks/projections/deploy/lambda/stack/recipes.rb +112 -0
  601. data/lib/hecks/projections/deploy/lambda/stack/web.rb +57 -0
  602. data/lib/hecks/projections/deploy/lambda/stack.rb +54 -0
  603. data/lib/hecks/projections/deploy/lambda.rb +77 -1885
  604. data/lib/hecks/projections/deploy/preview/access_yaml.rb +8 -74
  605. data/lib/hecks/projections/deploy/preview/containers.rb +18 -7
  606. data/lib/hecks/projections/deploy/preview/routing_yaml.rb +15 -87
  607. data/lib/hecks/projections/deploy/preview/settings.rb +7 -4
  608. data/lib/hecks/projections/deploy/preview/task_yaml.rb +42 -106
  609. data/lib/hecks/projections/deploy/preview/template.rb +11 -106
  610. data/lib/hecks/projections/deploy/preview/yaml_text.rb +1 -1
  611. data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +1 -1
  612. data/lib/hecks/projections/deploy/scripts/settings.rb +14 -6
  613. data/lib/hecks/projections/deploy/scripts.rb +11 -9
  614. data/lib/hecks/projections/deploy/shared/rows.rb +48 -0
  615. data/lib/hecks/projections/deploy/shared.rb +89 -449
  616. data/lib/hecks/projections/deploy/smoke.rb +15 -10
  617. data/lib/hecks/projections/deploy/template_diff/comparer.rb +21 -147
  618. data/lib/hecks/projections/deploy/template_diff/normalizer.rb +60 -0
  619. data/lib/hecks/projections/deploy/template_diff/value_diff.rb +136 -0
  620. data/lib/hecks/projections/deploy/template_diff.rb +8 -3
  621. data/lib/hecks/projections/deploy/templates/fargate/Dockerfile.tmpl +28 -0
  622. data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +63 -0
  623. data/lib/hecks/projections/deploy/templates/fargate/always_params.tmpl +4 -0
  624. data/lib/hecks/projections/deploy/templates/fargate/deploy_plain.tmpl +1 -0
  625. data/lib/hecks/projections/deploy/templates/fargate/deploy_shared.tmpl +11 -0
  626. data/lib/hecks/projections/deploy/templates/fargate/mint_era_own.tmpl +44 -0
  627. data/lib/hecks/projections/deploy/templates/fargate/mint_era_shared.tmpl +8 -0
  628. data/lib/hecks/projections/deploy/templates/fargate/missing_owner.tmpl +9 -0
  629. data/lib/hecks/projections/deploy/templates/fargate/oauth_params.tmpl +7 -0
  630. data/lib/hecks/projections/deploy/templates/fargate/oauth_task_env.tmpl +4 -0
  631. data/lib/hecks/projections/deploy/templates/fargate/oauth_task_policy.tmpl +7 -0
  632. data/lib/hecks/projections/deploy/templates/fargate/owning_params.tmpl +33 -0
  633. data/lib/hecks/projections/deploy/templates/fargate/template.yaml.tmpl +281 -0
  634. data/lib/hecks/projections/deploy/templates/lambda/Makefile.tmpl +218 -0
  635. data/lib/hecks/projections/deploy/templates/lambda/aurora_depends.tmpl +18 -0
  636. data/lib/hecks/projections/deploy/templates/lambda/build_dispatch_none.tmpl +10 -0
  637. data/lib/hecks/projections/deploy/templates/lambda/build_pg.tmpl +15 -0
  638. data/lib/hecks/projections/deploy/templates/lambda/build_plain.tmpl +2 -0
  639. data/lib/hecks/projections/deploy/templates/lambda/build_web.tmpl +11 -0
  640. data/lib/hecks/projections/deploy/templates/lambda/env_blind_guard.tmpl +4 -0
  641. data/lib/hecks/projections/deploy/templates/lambda/mint_era_own.tmpl +122 -0
  642. data/lib/hecks/projections/deploy/templates/lambda/mint_era_shared.tmpl +47 -0
  643. data/lib/hecks/projections/deploy/templates/lambda/missing_owner.tmpl +9 -0
  644. data/lib/hecks/projections/deploy/templates/lambda/nat_comment_oauth.tmpl +14 -0
  645. data/lib/hecks/projections/deploy/templates/lambda/nat_comment_plain.tmpl +3 -0
  646. data/lib/hecks/projections/deploy/templates/lambda/oauth_note.tmpl +8 -0
  647. data/lib/hecks/projections/deploy/templates/lambda/params_oauth.tmpl +13 -0
  648. data/lib/hecks/projections/deploy/templates/lambda/params_shared.tmpl +33 -0
  649. data/lib/hecks/projections/deploy/templates/lambda/pg_native.tmpl +71 -0
  650. data/lib/hecks/projections/deploy/templates/lambda/pii_oac.tmpl +8 -0
  651. data/lib/hecks/projections/deploy/templates/lambda/pii_permission.tmpl +8 -0
  652. data/lib/hecks/projections/deploy/templates/lambda/pii_resources.tmpl +116 -0
  653. data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge.tmpl +30 -0
  654. data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge_oauth.tmpl +12 -0
  655. data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge_plain.tmpl +7 -0
  656. data/lib/hecks/projections/deploy/templates/lambda/rename_schema_own.tmpl +93 -0
  657. data/lib/hecks/projections/deploy/templates/lambda/rename_schema_shared.tmpl +7 -0
  658. data/lib/hecks/projections/deploy/templates/lambda/rust_oauth_env.tmpl +17 -0
  659. data/lib/hecks/projections/deploy/templates/lambda/rust_oauth_policy.tmpl +16 -0
  660. data/lib/hecks/projections/deploy/templates/lambda/rust_session_secret.tmpl +13 -0
  661. data/lib/hecks/projections/deploy/templates/lambda/samconfig.toml.tmpl +12 -0
  662. data/lib/hecks/projections/deploy/templates/lambda/shared_note.tmpl +6 -0
  663. data/lib/hecks/projections/deploy/templates/lambda/sync_oauth.tmpl +23 -0
  664. data/lib/hecks/projections/deploy/templates/lambda/template.yaml.tmpl +187 -0
  665. data/lib/hecks/projections/deploy/templates/lambda/translation_own.tmpl +46 -0
  666. data/lib/hecks/projections/deploy/templates/lambda/translation_shared.tmpl +2 -0
  667. data/lib/hecks/projections/deploy/templates/lambda/web_function.tmpl +207 -0
  668. data/lib/hecks/projections/deploy/templates/lambda/web_google_oauth_env.tmpl +12 -0
  669. data/lib/hecks/projections/deploy/templates/lambda/web_no_oauth_env.tmpl +7 -0
  670. data/lib/hecks/projections/deploy/templates/lambda/web_oauth_policy.tmpl +4 -0
  671. data/lib/hecks/projections/deploy/templates/lambda/webhook_secret_resource.tmpl +20 -0
  672. data/lib/hecks/projections/deploy/templates/preview/alb.tmpl +8 -0
  673. data/lib/hecks/projections/deploy/templates/preview/alb_security_group.tmpl +11 -0
  674. data/lib/hecks/projections/deploy/templates/preview/assume_role.tmpl +6 -0
  675. data/lib/hecks/projections/deploy/templates/preview/base_parameters.tmpl +24 -0
  676. data/lib/hecks/projections/deploy/templates/preview/cluster.tmpl +4 -0
  677. data/lib/hecks/projections/deploy/templates/preview/container_secret.tmpl +9 -0
  678. data/lib/hecks/projections/deploy/templates/preview/db_init_script.sh.tmpl +23 -0
  679. data/lib/hecks/projections/deploy/templates/preview/db_init_secrets.tmpl +5 -0
  680. data/lib/hecks/projections/deploy/templates/preview/db_init_task.tmpl +39 -0
  681. data/lib/hecks/projections/deploy/templates/preview/desired_count.tmpl +5 -0
  682. data/lib/hecks/projections/deploy/templates/preview/distribution.tmpl +24 -0
  683. data/lib/hecks/projections/deploy/templates/preview/execution_role.tmpl +16 -0
  684. data/lib/hecks/projections/deploy/templates/preview/header.tmpl +16 -0
  685. data/lib/hecks/projections/deploy/templates/preview/ingress.tmpl +8 -0
  686. data/lib/hecks/projections/deploy/templates/preview/listener.tmpl +9 -0
  687. data/lib/hecks/projections/deploy/templates/preview/listener_rule.tmpl +11 -0
  688. data/lib/hecks/projections/deploy/templates/preview/log_group.tmpl +5 -0
  689. data/lib/hecks/projections/deploy/templates/preview/log_options.tmpl +5 -0
  690. data/lib/hecks/projections/deploy/templates/preview/outputs.tmpl +14 -0
  691. data/lib/hecks/projections/deploy/templates/preview/service.tmpl +17 -0
  692. data/lib/hecks/projections/deploy/templates/preview/session_secret.tmpl +11 -0
  693. data/lib/hecks/projections/deploy/templates/preview/target_group.tmpl +9 -0
  694. data/lib/hecks/projections/deploy/templates/preview/task_definition.tmpl +15 -0
  695. data/lib/hecks/projections/deploy/templates/preview/task_role.tmpl +22 -0
  696. data/lib/hecks/projections/deploy/templates/shared/aurora_db.tmpl +52 -0
  697. data/lib/hecks/projections/deploy/templates/shared/bastion.tmpl +74 -0
  698. data/lib/hecks/projections/deploy/templates/shared/bastion_own_public.tmpl +41 -0
  699. data/lib/hecks/projections/deploy/templates/shared/bastion_reuse_public.tmpl +10 -0
  700. data/lib/hecks/projections/deploy/templates/shared/nat_gateway.tmpl +102 -0
  701. data/lib/hecks/projections/deploy/templates/shared/oauth_egress.tmpl +17 -0
  702. data/lib/hecks/projections/deploy/templates/shared/plain_db.tmpl +16 -0
  703. data/lib/hecks/projections/deploy/templates/shared/vpc_and_database.tmpl +67 -0
  704. data/lib/hecks/projections/deploy/text_template.rb +35 -0
  705. data/lib/hecks/projections/diagrams/dispatch.rb +114 -0
  706. data/lib/hecks/projections/diagrams/statecharts.rb +59 -0
  707. data/lib/hecks/projections/diagrams/structure.rb +114 -0
  708. data/lib/hecks/projections/diagrams.rb +33 -256
  709. data/lib/hecks/projections/glossary/entries.rb +140 -0
  710. data/lib/hecks/projections/glossary/html/page.rb +96 -0
  711. data/lib/hecks/projections/glossary/html/parser.rb +66 -0
  712. data/lib/hecks/projections/glossary/html/sections.rb +78 -0
  713. data/lib/hecks/projections/glossary/html.rb +7 -179
  714. data/lib/hecks/projections/glossary/index.rb +45 -0
  715. data/lib/hecks/projections/glossary/markdown.rb +22 -11
  716. data/lib/hecks/projections/glossary/mermaid.rb +44 -31
  717. data/lib/hecks/projections/glossary/sensitivity.rb +7 -4
  718. data/lib/hecks/projections/glossary/sentences/value_objects.rb +77 -0
  719. data/lib/hecks/projections/glossary/sentences.rb +42 -81
  720. data/lib/hecks/projections/glossary/slugs.rb +33 -0
  721. data/lib/hecks/projections/glossary.rb +22 -190
  722. data/lib/hecks/projections/model.rb +20 -14
  723. data/lib/hecks/projections/rust_vocabulary/arguments/support.rb +33 -0
  724. data/lib/hecks/projections/rust_vocabulary/arguments.rb +171 -0
  725. data/lib/hecks/projections/rust_vocabulary/enum_body.rb +114 -0
  726. data/lib/hecks/projections/rust_vocabulary/tests.rb +144 -0
  727. data/lib/hecks/projections/rust_vocabulary.rb +24 -293
  728. data/lib/hecks/projections/site/admin.rb +146 -0
  729. data/lib/hecks/projections/site/admin_cms/templates/membership.rb +115 -0
  730. data/lib/hecks/projections/site/admin_cms/templates/session_strategy.rb +90 -0
  731. data/lib/hecks/projections/site/admin_cms/templates/sso.rb +101 -0
  732. data/lib/hecks/projections/site/admin_cms/templates/sso_tail.rb +54 -0
  733. data/lib/hecks/projections/site/admin_cms/templates/users.rb +83 -0
  734. data/lib/hecks/projections/site/admin_cms/templates.rb +33 -0
  735. data/lib/hecks/projections/site/admin_cms.rb +78 -0
  736. data/lib/hecks/projections/site/edge/behaviours.rb +10 -6
  737. data/lib/hecks/projections/site/edge/checks.rb +30 -80
  738. data/lib/hecks/projections/site/edge/findings.rb +28 -0
  739. data/lib/hecks/projections/site/edge/route_checks.rb +110 -0
  740. data/lib/hecks/projections/site/edge/row_reader.rb +52 -0
  741. data/lib/hecks/projections/site/edge/rules.rb +28 -26
  742. data/lib/hecks/projections/site/edge.rb +20 -31
  743. data/lib/hecks/projections/site/live_edge.rb +9 -7
  744. data/lib/hecks/projections/site/payload/fields/definitions.rb +90 -0
  745. data/lib/hecks/projections/site/payload/fields/readers.rb +69 -0
  746. data/lib/hecks/projections/site/payload/fields.rb +137 -0
  747. data/lib/hecks/projections/site/payload/lifecycle/text.rb +84 -0
  748. data/lib/hecks/projections/site/payload/lifecycle/text_tail.rb +106 -0
  749. data/lib/hecks/projections/site/payload/lifecycle.rb +33 -0
  750. data/lib/hecks/projections/site/payload/model.rb +128 -0
  751. data/lib/hecks/projections/site/payload/specs/wire.rb +69 -0
  752. data/lib/hecks/projections/site/payload/specs.rb +135 -0
  753. data/lib/hecks/projections/site/payload_driver.rb +95 -0
  754. data/lib/hecks/projections/site/root_rows.rb +67 -0
  755. data/lib/hecks/projections/site/routes_ts/helpers.rb +79 -0
  756. data/lib/hecks/projections/site/routes_ts/listings.rb +75 -0
  757. data/lib/hecks/projections/site/routes_ts/navigation.rb +79 -0
  758. data/lib/hecks/projections/site/routes_ts.rb +27 -175
  759. data/lib/hecks/projections/site/site_admin/access.rb +104 -0
  760. data/lib/hecks/projections/site/site_admin/session.rb +127 -0
  761. data/lib/hecks/projections/site/site_admin.rb +85 -0
  762. data/lib/hecks/projections/site/site_cdn.rb +12 -7
  763. data/lib/hecks/projections/site/site_host/dockerfile.rb +75 -0
  764. data/lib/hecks/projections/site/site_host/templates.rb +109 -0
  765. data/lib/hecks/projections/site/site_host.rb +58 -0
  766. data/lib/hecks/projections/site/site_root/workflow.rb +65 -0
  767. data/lib/hecks/projections/site/site_root.rb +128 -0
  768. data/lib/hecks/projections/site/table/checks.rb +28 -57
  769. data/lib/hecks/projections/site/table/link_builder.rb +14 -5
  770. data/lib/hecks/projections/site/table/navigation_checks.rb +75 -0
  771. data/lib/hecks/projections/site/table/row_builder.rb +31 -53
  772. data/lib/hecks/projections/site/table/row_defaults.rb +65 -0
  773. data/lib/hecks/projections/site/table.rb +9 -5
  774. data/lib/hecks/projections/vocabulary.rb +34 -31
  775. data/lib/hecks/projector/cli_audience.rb +42 -0
  776. data/lib/hecks/projector/cli_projector/claims.rb +149 -0
  777. data/lib/hecks/projector/cli_projector/command_help.rb +65 -0
  778. data/lib/hecks/projector/cli_projector/command_specs.rb +133 -0
  779. data/lib/hecks/projector/cli_projector/listing.rb +100 -0
  780. data/lib/hecks/projector/cli_projector/option_specs.rb +116 -0
  781. data/lib/hecks/projector/cli_projector/query_specs.rb +67 -0
  782. data/lib/hecks/projector/cli_projector/usage.rb +101 -0
  783. data/lib/hecks/projector/cli_projector.rb +15 -532
  784. data/lib/hecks/projector/docs_projector/attributes.rb +78 -0
  785. data/lib/hecks/projector/docs_projector/behaviour.rb +127 -0
  786. data/lib/hecks/projector/docs_projector/closing.rb +40 -0
  787. data/lib/hecks/projector/docs_projector.rb +58 -192
  788. data/lib/hecks/projector/exporter/bindings.rb +174 -0
  789. data/lib/hecks/projector/exporter/translations.rb +127 -0
  790. data/lib/hecks/projector/exporter.rb +8 -279
  791. data/lib/hecks/projector/narrate_projector/commands.rb +108 -0
  792. data/lib/hecks/projector/narrate_projector/reactions.rb +33 -0
  793. data/lib/hecks/projector/narrate_projector.rb +60 -160
  794. data/lib/hecks/projector.rb +22 -13
  795. data/lib/hecks/quality_control/adapters/agent_profile.rb +25 -16
  796. data/lib/hecks/quality_control/adapters/github_checks.rb +42 -6
  797. data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +1 -1
  798. data/lib/hecks/quality_control/adapters/github_issues.rb +22 -10
  799. data/lib/hecks/quality_control/cli/qa_discover_external_domains/parsing.rb +54 -0
  800. data/lib/hecks/quality_control/cli/qa_discover_external_domains/reporting.rb +44 -0
  801. data/lib/hecks/quality_control/cli/qa_discover_external_domains/scanning.rb +119 -0
  802. data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +28 -155
  803. data/lib/hecks/quality_control/cli/qa_domain_novelty/verdict.rb +76 -0
  804. data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +33 -66
  805. data/lib/hecks/quality_control/cli/qa_generated_domains/arguments.rb +62 -0
  806. data/lib/hecks/quality_control/cli/qa_generated_domains/blueprints.rb +45 -0
  807. data/lib/hecks/quality_control/cli/qa_generated_domains/evaluation.rb +107 -0
  808. data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +107 -0
  809. data/lib/hecks/quality_control/cli/qa_generated_domains/reporting.rb +97 -0
  810. data/lib/hecks/quality_control/cli/qa_generated_domains/shrinking.rb +70 -0
  811. data/lib/hecks/quality_control/cli/qa_generated_domains.rb +43 -327
  812. data/lib/hecks/quality_control/cli/qa_log_bug/arguments.rb +55 -0
  813. data/lib/hecks/quality_control/cli/qa_log_bug/proof.rb +65 -0
  814. data/lib/hecks/quality_control/cli/qa_log_bug.rb +18 -81
  815. data/lib/hecks/quality_control/cli/qa_mine_combinations/arguments.rb +54 -0
  816. data/lib/hecks/quality_control/cli/qa_mine_combinations/booting.rb +96 -0
  817. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +45 -109
  818. data/lib/hecks/quality_control/cli/qa_open_pr/arguments.rb +55 -0
  819. data/lib/hecks/quality_control/cli/qa_open_pr/recording.rb +79 -0
  820. data/lib/hecks/quality_control/cli/qa_open_pr/rules.rb +122 -0
  821. data/lib/hecks/quality_control/cli/qa_open_pr.rb +41 -200
  822. data/lib/hecks/quality_control/cli/qa_postgres_migrate/copying.rb +45 -0
  823. data/lib/hecks/quality_control/cli/qa_postgres_migrate/reporting.rb +33 -0
  824. data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +37 -63
  825. data/lib/hecks/quality_control/cli/qa_postgres_role/ownership.rb +57 -0
  826. data/lib/hecks/quality_control/cli/qa_postgres_role.rb +66 -71
  827. data/lib/hecks/quality_control/cli/qa_pr_check/checking.rb +118 -0
  828. data/lib/hecks/quality_control/cli/qa_pr_check/reporting.rb +54 -0
  829. data/lib/hecks/quality_control/cli/qa_pr_check.rb +28 -145
  830. data/lib/hecks/quality_control/cli/qa_seed_angles/seed.rb +80 -0
  831. data/lib/hecks/quality_control/cli/qa_seed_angles.rb +13 -86
  832. data/lib/hecks/quality_control/cli/qa_sweep/all_mode/children.rb +80 -0
  833. data/lib/hecks/quality_control/cli/qa_sweep/all_mode/report.rb +125 -0
  834. data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +63 -193
  835. data/lib/hecks/quality_control/cli/qa_sweep/checks/boundary.rb +92 -0
  836. data/lib/hecks/quality_control/cli/qa_sweep/checks/engines.rb +92 -0
  837. data/lib/hecks/quality_control/cli/qa_sweep/checks/seeds.rb +86 -0
  838. data/lib/hecks/quality_control/cli/qa_sweep/checks/shrinking.rb +69 -0
  839. data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +10 -248
  840. data/lib/hecks/quality_control/cli/qa_sweep/conclusion.rb +60 -0
  841. data/lib/hecks/quality_control/cli/qa_sweep/depth.rb +61 -0
  842. data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +26 -13
  843. data/lib/hecks/quality_control/cli/qa_sweep/finding_report/shrunk.rb +42 -0
  844. data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +40 -41
  845. data/lib/hecks/quality_control/cli/qa_sweep/parsing/validation.rb +70 -0
  846. data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +35 -65
  847. data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +41 -22
  848. data/lib/hecks/quality_control/cli/qa_sweep/scratch.rb +67 -0
  849. data/lib/hecks/quality_control/cli/qa_sweep/seat.rb +94 -0
  850. data/lib/hecks/quality_control/cli/qa_sweep/seed_loop.rb +149 -0
  851. data/lib/hecks/quality_control/cli/qa_sweep/target_setup.rb +115 -0
  852. data/lib/hecks/quality_control/cli/qa_sweep.rb +22 -445
  853. data/lib/hecks/quality_control/cli/qa_tick/output.rb +107 -0
  854. data/lib/hecks/quality_control/cli/qa_tick/preflight.rb +95 -0
  855. data/lib/hecks/quality_control/cli/qa_tick.rb +42 -175
  856. data/lib/hecks/query_ir/formatting.rb +86 -0
  857. data/lib/hecks/query_ir/rules.rb +132 -0
  858. data/lib/hecks/query_ir/touchpoints.rb +104 -0
  859. data/lib/hecks/query_ir.rb +33 -281
  860. data/lib/hecks/query_ir_mcp/tools.rb +68 -0
  861. data/lib/hecks/query_ir_mcp.rb +27 -71
  862. data/lib/hecks/query_specification/common/comparison.rb +25 -5
  863. data/lib/hecks/query_specification/common/dsl.rb +1 -1
  864. data/lib/hecks/query_specification/common/null_policy.rb +9 -6
  865. data/lib/hecks/query_specification/common/options.rb +21 -14
  866. data/lib/hecks/query_specification/field_path.rb +5 -2
  867. data/lib/hecks/query_specification/hop_path.rb +15 -18
  868. data/lib/hecks/release/lane.rb +22 -0
  869. data/lib/hecks/release/runner/clean_tree.rb +2 -2
  870. data/lib/hecks/release/runner/commands.rb +1 -1
  871. data/lib/hecks/release/runner/options.rb +82 -0
  872. data/lib/hecks/release/runner/preflight.rb +12 -7
  873. data/lib/hecks/release/runner/publishing.rb +86 -0
  874. data/lib/hecks/release/runner/tagger.rb +8 -3
  875. data/lib/hecks/release/runner.rb +40 -156
  876. data/lib/hecks/rendering.rb +13 -9
  877. data/lib/hecks/router/door.rb +37 -0
  878. data/lib/hecks/router/namespace_installer.rb +45 -83
  879. data/lib/hecks/router/options_proxy.rb +44 -0
  880. data/lib/hecks/runtime/adapter_lookup.rb +45 -24
  881. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -8
  882. data/lib/hecks/runtime/command_interpreter/delegation.rb +116 -0
  883. data/lib/hecks/runtime/command_interpreter/enforcement.rb +38 -0
  884. data/lib/hecks/runtime/command_interpreter/hydration.rb +139 -0
  885. data/lib/hecks/runtime/command_interpreter/list_mutations.rb +98 -0
  886. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +67 -114
  887. data/lib/hecks/runtime/command_interpreter/persisting.rb +96 -0
  888. data/lib/hecks/runtime/command_interpreter.rb +57 -352
  889. data/lib/hecks/runtime/command_rules/admissibility.rb +64 -147
  890. data/lib/hecks/runtime/command_rules/arithmetic.rb +13 -72
  891. data/lib/hecks/runtime/command_rules/authorization.rb +9 -9
  892. data/lib/hecks/runtime/command_rules/emission.rb +13 -14
  893. data/lib/hecks/runtime/command_rules/guard_state.rb +49 -0
  894. data/lib/hecks/runtime/command_rules/invariants.rb +84 -0
  895. data/lib/hecks/runtime/command_rules/operands.rb +88 -0
  896. data/lib/hecks/runtime/command_rules/references.rb +59 -57
  897. data/lib/hecks/runtime/command_rules/tenant_boundary.rb +69 -0
  898. data/lib/hecks/runtime/dependency_planning/analyzer.rb +90 -0
  899. data/lib/hecks/runtime/dependency_planning/expression_reads.rb +73 -0
  900. data/lib/hecks/runtime/dependency_planning/mutation_analysis.rb +89 -0
  901. data/lib/hecks/runtime/dependency_planning/rule_analysis.rb +82 -0
  902. data/lib/hecks/runtime/dependency_planning.rb +3 -250
  903. data/lib/hecks/runtime/dispatcher/queries.rb +62 -0
  904. data/lib/hecks/runtime/dispatcher/result.rb +55 -0
  905. data/lib/hecks/runtime/dispatcher/routing.rb +107 -0
  906. data/lib/hecks/runtime/dispatcher.rb +64 -209
  907. data/lib/hecks/runtime/entity_element/location.rb +124 -0
  908. data/lib/hecks/runtime/entity_element/mutations.rb +150 -0
  909. data/lib/hecks/runtime/entity_element.rb +5 -177
  910. data/lib/hecks/runtime/entity_interpreter/enforcement.rb +51 -0
  911. data/lib/hecks/runtime/entity_interpreter/locating.rb +62 -0
  912. data/lib/hecks/runtime/entity_interpreter/resolution.rb +42 -0
  913. data/lib/hecks/runtime/entity_interpreter/saving.rb +49 -0
  914. data/lib/hecks/runtime/entity_interpreter.rb +45 -164
  915. data/lib/hecks/runtime/identity.rb +15 -9
  916. data/lib/hecks/runtime/instance.rb +11 -7
  917. data/lib/hecks/runtime/interpreting.rb +16 -8
  918. data/lib/hecks/runtime/invocation.rb +3 -155
  919. data/lib/hecks/runtime/invocation_builder.rb +132 -0
  920. data/lib/hecks/runtime/invocation_facts.rb +87 -0
  921. data/lib/hecks/runtime/loader/boot_steps.rb +96 -0
  922. data/lib/hecks/runtime/loader/described.rb +27 -0
  923. data/lib/hecks/runtime/loader.rb +27 -114
  924. data/lib/hecks/runtime/outbox/consumer_runner.rb +40 -0
  925. data/lib/hecks/runtime/outbox/fanout.rb +82 -0
  926. data/lib/hecks/runtime/outbox/relay.rb +149 -0
  927. data/lib/hecks/runtime/outbox.rb +3 -214
  928. data/lib/hecks/runtime/policy_interpreter/arguments.rb +67 -0
  929. data/lib/hecks/runtime/policy_interpreter/fan_out.rb +96 -0
  930. data/lib/hecks/runtime/policy_interpreter.rb +22 -137
  931. data/lib/hecks/runtime/port_operation_interpreter.rb +18 -17
  932. data/lib/hecks/runtime/query_interpreter/arguments.rb +51 -0
  933. data/lib/hecks/runtime/query_interpreter/entity_rows.rb +82 -0
  934. data/lib/hecks/runtime/query_interpreter/outside_answer.rb +89 -0
  935. data/lib/hecks/runtime/query_interpreter.rb +43 -191
  936. data/lib/hecks/runtime/reaction_invocation/identities.rb +92 -0
  937. data/lib/hecks/runtime/reaction_invocation/target_resolution.rb +88 -0
  938. data/lib/hecks/runtime/reaction_invocation.rb +66 -183
  939. data/lib/hecks/runtime/reaction_outcome.rb +7 -3
  940. data/lib/hecks/runtime/read_model_interpreter/head_ordering.rb +49 -0
  941. data/lib/hecks/runtime/read_model_interpreter/reductions.rb +123 -0
  942. data/lib/hecks/runtime/read_model_interpreter/shaping.rb +100 -0
  943. data/lib/hecks/runtime/read_model_interpreter.rb +71 -214
  944. data/lib/hecks/runtime/reference_hop.rb +11 -11
  945. data/lib/hecks/runtime/refusal_wording.rb +11 -8
  946. data/lib/hecks/runtime/registry/chapter_verification.rb +84 -0
  947. data/lib/hecks/runtime/registry/declarations.rb +17 -0
  948. data/lib/hecks/runtime/registry/durability_warnings.rb +71 -0
  949. data/lib/hecks/runtime/registry/hecksagon_rules.rb +124 -0
  950. data/lib/hecks/runtime/registry/merging.rb +49 -0
  951. data/lib/hecks/runtime/registry/providers.rb +139 -0
  952. data/lib/hecks/runtime/registry/query_verification.rb +144 -0
  953. data/lib/hecks/runtime/registry/read_repository.rb +61 -0
  954. data/lib/hecks/runtime/registry/runtime_state.rb +27 -0
  955. data/lib/hecks/runtime/registry/saga_persistence.rb +12 -8
  956. data/lib/hecks/runtime/registry/verification.rb +45 -389
  957. data/lib/hecks/runtime/registry/world_defaults.rb +3 -3
  958. data/lib/hecks/runtime/registry.rb +58 -296
  959. data/lib/hecks/runtime/remote_dispatcher.rb +47 -31
  960. data/lib/hecks/runtime/saga_interpreter/compensation.rb +90 -0
  961. data/lib/hecks/runtime/saga_interpreter/correlation.rb +19 -10
  962. data/lib/hecks/runtime/saga_interpreter/delivery.rb +147 -0
  963. data/lib/hecks/runtime/saga_interpreter/lifecycle.rb +63 -0
  964. data/lib/hecks/runtime/saga_interpreter/transitions.rb +112 -0
  965. data/lib/hecks/runtime/saga_interpreter.rb +41 -320
  966. data/lib/hecks/runtime/tenant_check.rb +14 -9
  967. data/lib/hecks/runtime/value/admission.rb +28 -19
  968. data/lib/hecks/runtime/value/coercion.rb +55 -404
  969. data/lib/hecks/runtime/value/entity_list_coercion.rb +27 -29
  970. data/lib/hecks/runtime/value/field_checks.rb +57 -100
  971. data/lib/hecks/runtime/value/flags.rb +65 -0
  972. data/lib/hecks/runtime/value/identifiers.rb +64 -0
  973. data/lib/hecks/runtime/value/references.rb +195 -0
  974. data/lib/hecks/runtime/value/shape_checks.rb +61 -0
  975. data/lib/hecks/runtime/value/validation.rb +125 -0
  976. data/lib/hecks/runtime/value.rb +18 -6
  977. data/lib/hecks/rust_build/conformance/surface.rb +75 -0
  978. data/lib/hecks/rust_build/conformance.rb +27 -59
  979. data/lib/hecks/rust_build/conformance_fuzz.rb +26 -15
  980. data/lib/hecks/rust_build/coverage.rb +32 -104
  981. data/lib/hecks/rust_build/coverage_parts/expected.rb +68 -0
  982. data/lib/hecks/rust_build/coverage_parts/printer.rb +75 -0
  983. data/lib/hecks/rust_build/host.rb +23 -13
  984. data/lib/hecks/rust_build/kernel_input.rb +19 -12
  985. data/lib/hecks/rust_build/native_build.rb +19 -15
  986. data/lib/hecks/rust_build/project_rust/domain_loader.rb +75 -0
  987. data/lib/hecks/rust_build/project_rust/root_mod/notes.rb +66 -0
  988. data/lib/hecks/rust_build/project_rust/root_mod.rb +22 -55
  989. data/lib/hecks/rust_build/project_rust/target_ir.rb +74 -0
  990. data/lib/hecks/rust_build/project_rust.rb +21 -89
  991. data/lib/hecks/rust_build/wasm.rb +11 -4
  992. data/lib/hecks/rust_build/wasm_browser.rb +7 -7
  993. data/lib/hecks/rust_build/write_if_changed.rb +3 -6
  994. data/lib/hecks/rust_build.rb +7 -3
  995. data/lib/hecks/site/bluebook/site.bluebook +7 -1
  996. data/lib/hecks/storehouse/audit.rb +106 -0
  997. data/lib/hecks/storehouse/callers.rb +73 -0
  998. data/lib/hecks/storehouse/dispatching.rb +149 -0
  999. data/lib/hecks/storehouse/introspection.rb +145 -0
  1000. data/lib/hecks/storehouse/querying.rb +78 -0
  1001. data/lib/hecks/storehouse.rb +43 -451
  1002. data/lib/hecks/tickets/bluebook/tickets.bluebook +29 -0
  1003. data/lib/hecks/tools/argument_gate_matrix/dispatching.rb +69 -0
  1004. data/lib/hecks/tools/argument_gate_matrix/rows.rb +121 -0
  1005. data/lib/hecks/tools/argument_gate_matrix/violations.rb +108 -0
  1006. data/lib/hecks/tools/argument_gate_matrix.rb +43 -212
  1007. data/lib/hecks/tools/ci_gate_decision.rb +21 -14
  1008. data/lib/hecks/tools/ci_gates.rb +40 -26
  1009. data/lib/hecks/tools/comment_style/baseline.rb +41 -0
  1010. data/lib/hecks/tools/comment_style/caps_words.rb +104 -0
  1011. data/lib/hecks/tools/comment_style/cli.rb +121 -0
  1012. data/lib/hecks/tools/comment_style/dictionary.rb +60 -0
  1013. data/lib/hecks/tools/comment_style/fixing.rb +119 -0
  1014. data/lib/hecks/tools/comment_style/long_blocks.rb +51 -0
  1015. data/lib/hecks/tools/comment_style/masking.rb +94 -0
  1016. data/lib/hecks/tools/comment_style/patterns.rb +61 -0
  1017. data/lib/hecks/tools/comment_style/run.rb +161 -0
  1018. data/lib/hecks/tools/comment_style/signature.rb +59 -0
  1019. data/lib/hecks/tools/comment_style/source_file.rb +105 -0
  1020. data/lib/hecks/tools/comment_style/structure_checks.rb +113 -0
  1021. data/lib/hecks/tools/comment_style/text_checks.rb +67 -0
  1022. data/lib/hecks/tools/comment_style/vocabulary.rb +55 -0
  1023. data/lib/hecks/tools/comment_style/walker.rb +136 -0
  1024. data/lib/hecks/tools/comment_style.rb +17 -1000
  1025. data/lib/hecks/tools/corpus_report.rb +26 -16
  1026. data/lib/hecks/tools/deploy_recipe/targets.rb +61 -0
  1027. data/lib/hecks/tools/deploy_recipe/worlds.rb +114 -0
  1028. data/lib/hecks/tools/deploy_recipe.rb +60 -174
  1029. data/lib/hecks/tools/deploy_recipe_lint/checks.rb +78 -0
  1030. data/lib/hecks/tools/deploy_recipe_lint/fixtures.rb +88 -0
  1031. data/lib/hecks/tools/deploy_recipe_lint/makefile.rb +84 -0
  1032. data/lib/hecks/tools/deploy_recipe_lint.rb +29 -192
  1033. data/lib/hecks/tools/drop_implicit_append_fields.rb +20 -12
  1034. data/lib/hecks/tools/era_projection_backfill.rb +50 -33
  1035. data/lib/hecks/tools/era_reattest/reporting.rb +55 -0
  1036. data/lib/hecks/tools/era_reattest.rb +32 -43
  1037. data/lib/hecks/tools/evolve_run/arguments.rb +49 -0
  1038. data/lib/hecks/tools/evolve_run/words.rb +60 -0
  1039. data/lib/hecks/tools/evolve_run.rb +43 -90
  1040. data/lib/hecks/tools/fuzz_sweep/findings.rb +106 -0
  1041. data/lib/hecks/tools/fuzz_sweep/options.rb +69 -0
  1042. data/lib/hecks/tools/fuzz_sweep/pool.rb +74 -0
  1043. data/lib/hecks/tools/fuzz_sweep/reporting.rb +88 -0
  1044. data/lib/hecks/tools/fuzz_sweep.rb +75 -273
  1045. data/lib/hecks/tools/gate.rb +31 -16
  1046. data/lib/hecks/tools/heki_compaction.rb +63 -42
  1047. data/lib/hecks/tools/hoist_local_givens/rewriting.rb +119 -0
  1048. data/lib/hecks/tools/hoist_local_givens.rb +89 -157
  1049. data/lib/hecks/tools/journal_compaction.rb +40 -31
  1050. data/lib/hecks/tools/lanes/files.rb +82 -0
  1051. data/lib/hecks/tools/lanes/live.rb +41 -0
  1052. data/lib/hecks/tools/lanes/rows.rb +45 -0
  1053. data/lib/hecks/tools/lanes/ruleset.rb +44 -0
  1054. data/lib/hecks/tools/lanes/watch_workflow.rb +82 -0
  1055. data/lib/hecks/tools/lanes/workflow.rb +79 -0
  1056. data/lib/hecks/tools/lanes.rb +71 -0
  1057. data/lib/hecks/tools/oidc_manifests.rb +10 -9
  1058. data/lib/hecks/tools/query_ir_run.rb +7 -3
  1059. data/lib/hecks/tools/regeneration_run.rb +40 -26
  1060. data/lib/hecks/tools/rust_comment_style/caps_words.rb +98 -0
  1061. data/lib/hecks/tools/rust_comment_style/fixing.rb +102 -0
  1062. data/lib/hecks/tools/rust_comment_style/masking.rb +85 -0
  1063. data/lib/hecks/tools/rust_comment_style/run.rb +94 -0
  1064. data/lib/hecks/tools/rust_comment_style/source_file.rb +71 -0
  1065. data/lib/hecks/tools/rust_comment_style/structure.rb +79 -0
  1066. data/lib/hecks/tools/rust_comment_style/text_checks.rb +63 -0
  1067. data/lib/hecks/tools/rust_comment_style/tokenizer.rb +102 -0
  1068. data/lib/hecks/tools/rust_comment_style.rb +38 -535
  1069. data/lib/hecks/tools/sequence_script.rb +20 -14
  1070. data/lib/hecks/tools/site_routes/cli.rb +70 -0
  1071. data/lib/hecks/tools/site_routes/root_files.rb +59 -0
  1072. data/lib/hecks/tools/site_routes/templates.rb +77 -0
  1073. data/lib/hecks/tools/site_routes.rb +102 -108
  1074. data/lib/hecks/tools/tail_merge.rb +45 -37
  1075. data/lib/hecks/tools/tenant_provisioning.rb +45 -31
  1076. data/lib/hecks/tools/tools_doc.rb +42 -19
  1077. data/lib/hecks/tools/translation_audit/domain_loading.rb +71 -0
  1078. data/lib/hecks/tools/translation_audit/edges.rb +71 -0
  1079. data/lib/hecks/tools/translation_audit/verdicts.rb +107 -0
  1080. data/lib/hecks/tools/translation_audit.rb +30 -161
  1081. data/lib/hecks/tools/translation_scaffold/reporting.rb +40 -0
  1082. data/lib/hecks/tools/translation_scaffold.rb +77 -60
  1083. data/lib/hecks/tools.rb +1 -0
  1084. data/lib/hecks/vendoring.rb +37 -11
  1085. data/lib/hecks/version.rb +1 -1
  1086. data/lib/hecks/vocabulary.rb +16 -1
  1087. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +7 -9
  1088. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +8 -6
  1089. data/rust/.cargo/mutants.toml +8 -0
  1090. data/rust/host/Cargo.toml +5 -0
  1091. data/rust/host/HECKS_RELEASE +1 -1
  1092. data/rust/host/src/auth.rs +32 -0
  1093. data/rust/host/src/web.rs +2 -3
  1094. data/rust/src/kernel/dispatch.rs +4 -0
  1095. data/rust/src/kernel/dispatch_guard_tests.rs +506 -0
  1096. data/rust/src/kernel/orchestrate.rs +4 -0
  1097. data/rust/src/kernel/orchestrate_guard_tests.rs +708 -0
  1098. metadata +607 -3
  1099. /data/lib/hecks/bluebook/behaviour/{hexagon.rb → hecksagon.rb} +0 -0
@@ -45,7 +45,7 @@ module Hecks
45
45
  def no_facts(operation)
46
46
  none = { value: "none" }
47
47
  { operation: { value: operation }, version: { value: "0.0.0" }, client_version: { value: "0.0.0" },
48
- ir_version: { value: "0.0.0" }, ships_from: { path: "none" }, branch: none, head: none,
48
+ ir_version: { value: "0.0.0" }, ships_from: { path: "none" }, branch: none, head: none, release_lane: none,
49
49
  tag_state: none, on_origin: { value: false }, clean: { value: false }, changelog: { value: false } }
50
50
  end
51
51
 
@@ -80,19 +80,26 @@ module Hecks
80
80
  err = StringIO.new
81
81
  runner = release(args, tree, commands, out, err)
82
82
  status = runner.call
83
- text = [out.string, err.string].map(&:strip).reject(&:empty?).join("\n")
83
+ text = transcript(out, err)
84
84
  raise ConsoleCapture::Failure, text if !status.zero? && runner.steps.empty?
85
85
 
86
- outcome(text, args, tagged: runner.steps.include?(:tagged), published: runner.steps.include?(:gem),
87
- verified: runner.verified, succeeded: status.zero?)
86
+ outcome(text, args, **steps_taken(runner, status))
87
+ end
88
+
89
+ # @return [String] what the release printed to either stream, trimmed
90
+ def transcript(out, err)
91
+ [out, err].map { |stream| stream.string.strip }.reject(&:empty?).join("\n")
92
+ end
93
+
94
+ # @return [Hash] which steps the release really carried out, and whether it ended well
95
+ def steps_taken(runner, status)
96
+ { tagged: runner.steps.include?(:tagged), published: runner.steps.include?(:gem),
97
+ verified: runner.verified, succeeded: status.zero? }
88
98
  end
89
99
 
90
100
  # @return [Hecks::Release::Runner] the release, over the facts the run was cleared by
91
101
  def release(args, tree, commands, out, err)
92
- flag = ->(name) { args[name] == true }
93
- options = Release::Runner::Options.new(dry_run: args[:confirm] != true, gem_only: flag.call(:gem_only),
94
- npm_only: flag.call(:npm_only), npm_local: flag.call(:npm_local),
95
- no_wait: flag.call(:no_wait), yes: true)
102
+ options = runner_options(args)
96
103
  facts = Release::Runner::Preflight::Facts.new(version: args[:version], sha: args[:head])
97
104
  Release::Runner.new(root: tree.root, options: options, commands: commands, input: StringIO.new, out: out,
98
105
  err: err, facts: facts, **(Publishing.release_options || {}))
@@ -100,6 +107,15 @@ module Hecks
100
107
  raise ConsoleCapture::Failure, e.message
101
108
  end
102
109
 
110
+ # @return [Hecks::Release::Runner::Options] the release's switches: a dry run unless
111
+ # confirmed
112
+ def runner_options(args)
113
+ flag = ->(name) { args[name] == true }
114
+ Release::Runner::Options.new(dry_run: args[:confirm] != true, gem_only: flag.call(:gem_only),
115
+ npm_only: flag.call(:npm_only), npm_local: flag.call(:npm_local),
116
+ no_wait: flag.call(:no_wait), yes: true)
117
+ end
118
+
103
119
  # Pushes the gem alone, or builds it and deletes it again when unconfirmed.
104
120
  #
105
121
  # @param args [Hash] the record's plain fields
@@ -130,11 +146,14 @@ module Hecks
130
146
  raise ConsoleCapture::Failure, e.message
131
147
  end
132
148
 
149
+ # @param steps [Hash] `tagged`, `published` and `verified`, and `succeeded` (true when
150
+ # absent)
133
151
  # @return [Hash] the answer the journal records: a report, what was done, and the release
134
- def outcome(text, args, tagged:, published:, verified:, succeeded: true)
135
- { report: { value: text }, tagged: { value: tagged }, published: { value: published },
136
- verified: { value: verified }, succeeded: { value: succeeded }, version: { value: args[:version] },
137
- ir_version: { value: args[:ir_version] }, ships_from: args[:ships_from] }
152
+ def outcome(text, args, **steps)
153
+ { report: { value: text }, tagged: { value: steps[:tagged] }, published: { value: steps[:published] },
154
+ verified: { value: steps[:verified] }, succeeded: { value: steps.fetch(:succeeded, true) },
155
+ version: { value: args[:version] }, ir_version: { value: args[:ir_version] },
156
+ ships_from: args[:ships_from] }
138
157
  end
139
158
  end
140
159
  end
@@ -16,7 +16,7 @@ module Hecks
16
16
  # files reports drift and writes only when it is confirmed.
17
17
  module Regeneration
18
18
  # Every operation this family carries out.
19
- OPERATIONS = %w[regenerate_corpus project_ci_gates project_tools_doc decide_ci_gate].freeze
19
+ OPERATIONS = %w[regenerate_corpus project_ci_gates project_lanes project_tools_doc decide_ci_gate].freeze
20
20
 
21
21
  # How many lines of a script's output a refusal keeps.
22
22
  KEPT_LINES = 60
@@ -33,13 +33,35 @@ module Hecks
33
33
  # @raise [ConsoleCapture::Failure] with the difference, when a check finds drift, or with
34
34
  # what the script printed when it ends badly
35
35
  def call(operation, held, tree, shell: nil)
36
- flag = ->(name) { (held[name].is_a?(Hash) ? held[name][:value] : held[name]) == true }
37
- check = flag.call(:check) || !flag.call(:confirm)
36
+ check = check_only?(held)
38
37
  child = RubyChild.new(tree)
39
- return project_ci_gates(child, check) if operation == "project_ci_gates"
40
- return project_tools_doc(child, check) if operation == "project_tools_doc"
41
- return decide_ci_gate(child, held) if operation == "decide_ci_gate"
38
+ case operation
39
+ when "project_ci_gates" then project_ci_gates(child, check)
40
+ when "project_lanes" then project_lanes(child, check, set?(held, :live), set?(held, :confirm))
41
+ when "project_tools_doc" then project_tools_doc(child, check)
42
+ when "decide_ci_gate" then decide_ci_gate(child, held)
43
+ else regenerate(child, check)
44
+ end
45
+ end
46
+
47
+ # @param held [Hash] the record's fields: `check`, `confirm`
48
+ # @return [Boolean] whether the run only compares: asked for, or not confirmed
49
+ def check_only?(held)
50
+ set?(held, :check) || !set?(held, :confirm)
51
+ end
42
52
 
53
+ # @param held [Hash] the record's fields
54
+ # @param name [Symbol] a switch of the record
55
+ # @return [Boolean] whether the switch was given as true
56
+ def set?(held, name)
57
+ (held[name].is_a?(Hash) ? held[name][:value] : held[name]) == true
58
+ end
59
+
60
+ # @param child [RubyChild] the checkout's tool runner
61
+ # @param check [Boolean] whether to only compare
62
+ # @return [String] how many domains were checked or regenerated
63
+ # @raise [ConsoleCapture::Failure] with the difference, or with what the script printed
64
+ def regenerate(child, check)
43
65
  result = child.capture("regen_codegen_domains", *("--check" if check))
44
66
  raise ConsoleCapture::Failure, refusal(result) unless result.ok?
45
67
 
@@ -54,6 +76,21 @@ module Hecks
54
76
  child.answer("project_ci_gates", *("--check" if check))
55
77
  end
56
78
 
79
+ # Projects the `Lane` rows, or with `live` compares GitHub's rulesets with them. Only a live
80
+ # run that is confirmed changes GitHub, so without `confirm` a live run is a comparison.
81
+ #
82
+ # @param child [RubyChild] the checkout's tool runner
83
+ # @param check [Boolean] whether to only compare the files
84
+ # @param live [Boolean] whether to compare, or with `confirm` update, GitHub's rulesets
85
+ # @param confirm [Boolean] whether a live run may change GitHub
86
+ # @return [String] what the tool printed
87
+ # @raise [ConsoleCapture::Failure] with the stale files or differing rulesets
88
+ def project_lanes(child, check, live, confirm)
89
+ return child.answer("project_lanes", "--live", *("--confirm" if confirm)) if live
90
+
91
+ child.answer("project_lanes", *("--check" if check))
92
+ end
93
+
57
94
  # @param child [RubyChild] the checkout's tool runner
58
95
  # @param check [Boolean] whether to only compare
59
96
  # @return [String] what the tool printed
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "json"
4
4
  require "hecks/release/runner"
5
+ require "hecks/release/lane"
5
6
  require_relative "tree"
6
7
  require_relative "../console_capture"
7
8
 
@@ -11,7 +12,8 @@ module Hecks
11
12
  # The facts a release is judged by, read from git and the checkout's files and judged by
12
13
  # nothing here: the rules are the givens of the `Clear` command of `PublishingRun`.
13
14
  #
14
- # It reads the branch, whether `HEAD` is `origin/main` (after a fetch), whether the tree is
15
+ # It reads the branch, the lane a release is cut from (the `Lane` row that feeds a tag),
16
+ # whether `HEAD` is that lane's `origin/` branch (after a fetch), whether the tree is
15
17
  # clean, the gem's version and the client package's, whether the changelog has a heading for
16
18
  # the version, and where a tag for the version already points. Nothing is changed but the
17
19
  # remote-tracking refs a fetch updates.
@@ -49,13 +51,22 @@ module Hecks
49
51
  private
50
52
 
51
53
  def git_facts(version)
54
+ fetch_origin!
55
+ head = read("rev-parse", "HEAD")
56
+ lane_facts(head).merge(clean: flag(read("status", "--porcelain").empty?),
57
+ tag_state: word(tag_state("v#{version}", head)))
58
+ end
59
+
60
+ def fetch_origin!
52
61
  fetch = @git.capture("fetch", "origin")
53
62
  raise ConsoleCapture::Failure, "git fetch origin failed (#{fetch.stderr.strip})" unless fetch.success?
63
+ end
54
64
 
55
- head = read("rev-parse", "HEAD")
56
- { branch: word(read("rev-parse", "--abbrev-ref", "HEAD")), head: word(head),
57
- on_origin: flag(head == read("rev-parse", "origin/main")),
58
- clean: flag(read("status", "--porcelain").empty?), tag_state: word(tag_state("v#{version}", head)) }
65
+ # Where the checkout stands against the lane a release is cut from.
66
+ def lane_facts(head)
67
+ lane = Release::Lane.release
68
+ { branch: word(read("rev-parse", "--abbrev-ref", "HEAD")), head: word(head), release_lane: word(lane),
69
+ on_origin: flag(head == read("rev-parse", "origin/#{lane}")) }
59
70
  end
60
71
 
61
72
  def tag_state(tag, head)
@@ -11,6 +11,7 @@ require_relative "codemods"
11
11
  require_relative "test_suite"
12
12
  require_relative "corpus_tasks"
13
13
  require_relative "publishing"
14
+ require_relative "promotion"
14
15
  require_relative "../git"
15
16
 
16
17
  module Hecks
@@ -47,6 +48,7 @@ module Hecks
47
48
  def examine(**held)
48
49
  answer = { checkout: { value: tree.checkout? } }
49
50
  operation = plain(held[:operation])
51
+ return answer.merge(promotion_facts(held)) if Codebase::Promotion::OPERATIONS.include?(operation)
50
52
  return answer unless Codebase::Publishing::OPERATIONS.include?(operation)
51
53
 
52
54
  facts = tree.checkout? ? Git.new.survey(**held) : Codebase::Publishing.no_facts(operation)
@@ -180,9 +182,15 @@ module Hecks
180
182
  # The task families, each carrying out the operations it lists.
181
183
  FAMILIES = [Codebase::Language, Codebase::KernelTables, Codebase::Conformance, Codebase::Regeneration,
182
184
  Codebase::Gate, Codebase::Style, Codebase::Codemods, Codebase::TestSuite,
183
- Codebase::CorpusTasks, Codebase::Publishing].freeze
185
+ Codebase::CorpusTasks, Codebase::Publishing, Codebase::Promotion].freeze
184
186
  private_constant :FAMILIES
185
187
 
188
+ # The facts of a promotion or a watch, naming the operation so policies can tell them apart.
189
+ def promotion_facts(held)
190
+ facts = tree.checkout? ? Codebase::Promotion.facts(held, tree) : Codebase::Promotion.no_facts
191
+ { operation: held[:operation], alert_key: held[:alert_key] }.compact.merge(facts)
192
+ end
193
+
186
194
  def tree = Codebase::Tree.new
187
195
 
188
196
  def plain(argument) = argument.is_a?(Hash) ? argument[:value] : argument
@@ -40,7 +40,7 @@ module Hecks
40
40
  def regenerate(confirm:)
41
41
  return rewrite if confirm
42
42
 
43
- "dry run, would rewrite #{DIRECTORY}/ for #{STORES.join(', ')} through the real adapters " \
43
+ "dry run, would rewrite #{DIRECTORY}/ for #{STORES.join(", ")} through the real adapters " \
44
44
  "(#{installed}; add --confirm)"
45
45
  end
46
46
 
@@ -161,7 +161,7 @@ module Hecks
161
161
  # @raise [ConsoleCapture::Failure] when a path begins with `-`
162
162
  def after_separator(paths)
163
163
  flagged = paths.select { |path| path.start_with?("-") }
164
- raise ConsoleCapture::Failure, "paths may not begin with '-': #{flagged.join(', ')}" if flagged.any?
164
+ raise ConsoleCapture::Failure, "paths may not begin with '-': #{flagged.join(", ")}" if flagged.any?
165
165
 
166
166
  ["--", *paths]
167
167
  end
@@ -34,17 +34,23 @@ module Hecks
34
34
  path = File.expand_path(file, @tree.root)
35
35
  raise ConsoleCapture::Failure, "no such spec file #{file}" unless File.file?(path)
36
36
 
37
+ report = run_example(path, example)
38
+ raise ConsoleCapture::Failure, "the test runner printed nothing for #{file}" if report.empty?
39
+
40
+ report
41
+ end
42
+
43
+ private
44
+
45
+ # What the runner printed for the example, when it passed.
46
+ def run_example(path, example)
37
47
  out = StringIO.new
38
48
  status = Dir.chdir(@tree.root) { runner.call(["--example", example, path], out, out) }
39
49
  raise ConsoleCapture::Failure, out.string.strip unless status.zero?
40
50
 
41
- out.string.strip.tap do |report|
42
- raise ConsoleCapture::Failure, "the test runner printed nothing for #{file}" if report.empty?
43
- end
51
+ out.string.strip
44
52
  end
45
53
 
46
- private
47
-
48
54
  def runner
49
55
  return self.class.runner if self.class.runner
50
56
 
@@ -51,16 +51,35 @@ module Hecks
51
51
  case operation
52
52
  when "refresh_runtime_baseline" then refresh(args, tree)
53
53
  when "run_spec_example" then TestRunner.new(tree).run(file: args[:file], example: args[:example])
54
- when "stress_concurrency"
55
- answer { command("stress_concurrency_specs").call(stress_flags(args), root: tree.root) }
56
- when "regenerate_legacy_fixtures"
57
- SqliteFixture.new(tree, shell: shell).regenerate(confirm: args[:confirm] == true)
58
- when "seed_semantics_corpus"
59
- answer { command("seed_semantics_corpus").call(root: tree.root, env: seed_env(args)) }
54
+ when "stress_concurrency" then stress(args, tree)
55
+ when "regenerate_legacy_fixtures" then regenerate_fixtures(args, tree, shell)
56
+ when "seed_semantics_corpus" then seed(args, tree)
60
57
  else write_list(args, tree)
61
58
  end
62
59
  end
63
60
 
61
+ # @param args [Hash] `runs`, `parallel` and `seed_start`
62
+ # @param tree [Tree] the checkout
63
+ # @return [String] what the stress run printed
64
+ def stress(args, tree)
65
+ answer { command("stress_concurrency_specs").call(stress_flags(args), root: tree.root) }
66
+ end
67
+
68
+ # @param args [Hash] `confirm`
69
+ # @param tree [Tree] the checkout
70
+ # @param shell [#capture, nil] starts the fixtures' child process
71
+ # @return [String] what was regenerated, or (unconfirmed) what would be
72
+ def regenerate_fixtures(args, tree, shell)
73
+ SqliteFixture.new(tree, shell: shell).regenerate(confirm: args[:confirm] == true)
74
+ end
75
+
76
+ # @param args [Hash] `fixture`, perhaps absent
77
+ # @param tree [Tree] the checkout
78
+ # @return [String] what the seeding printed
79
+ def seed(args, tree)
80
+ answer { command("seed_semantics_corpus").call(root: tree.root, env: seed_env(args)) }
81
+ end
82
+
64
83
  # A pure read: a listing, or the recorded pattern cases.
65
84
  #
66
85
  # @param operation [String] `shard_specs`, `list_io_parallel_specs`, `record_pattern_cases`
@@ -130,8 +149,8 @@ module Hecks
130
149
  source = args[:from_run] ? ["--from-run", args[:from_run]] : [*args[:workers]&.to_s]
131
150
  return answer { command("refresh_rspec_runtime_baseline").call(source, root: tree.root) } if args[:confirm] == true
132
151
 
133
- "dry run, would #{args[:from_run] ? "read CI run #{args[:from_run]}'s timings" : 'time a local run'} " \
134
- "and rewrite #{BASELINES.join(', ')} (add --confirm)"
152
+ "dry run, would #{args[:from_run] ? "read CI run #{args[:from_run]}'s timings" : "time a local run"} " \
153
+ "and rewrite #{BASELINES.join(", ")} (add --confirm)"
135
154
  end
136
155
 
137
156
  # @param args [Hash] `runs`, `parallel` and `seed_start`
@@ -44,23 +44,27 @@ module Hecks
44
44
  #
45
45
  # @yield the entry point to run
46
46
  # @return [Outcome] the text printed and the exit status
47
- def capture
48
- synchronize do
49
- saved = [$stdout, $stderr]
50
- buffer = StringIO.new
51
- begin
52
- $stdout = $stderr = buffer
53
- status = begin
54
- yield
55
- 0
56
- rescue SystemExit => e
57
- e.status
58
- end
59
- Outcome.new(buffer.string, status)
60
- ensure
61
- $stdout, $stderr = saved
62
- end
63
- end
47
+ def capture(&)
48
+ synchronize { redirected(&) }
49
+ end
50
+
51
+ # Runs the block with both streams pointed at one buffer, putting them back afterwards.
52
+ def redirected(&)
53
+ saved = [$stdout, $stderr]
54
+ buffer = StringIO.new
55
+ $stdout = $stderr = buffer
56
+ status = exit_status(&)
57
+ Outcome.new(buffer.string, status)
58
+ ensure
59
+ $stdout, $stderr = saved
60
+ end
61
+
62
+ # The status the block ends with: 0, or the one an `exit` inside it carries.
63
+ def exit_status
64
+ yield
65
+ 0
66
+ rescue SystemExit => e
67
+ e.status
64
68
  end
65
69
 
66
70
  # Runs the block captured and answers its text, or refuses with it.
@@ -78,16 +78,21 @@ module Hecks
78
78
 
79
79
  # @return [Float] the mean daily total, scaled to an average month
80
80
  def monthly_rate(days)
81
- mean = days.values.sum { |services| services.values.sum } / days.size
82
- mean * DAYS_IN_MONTH
81
+ mean_daily(days) * DAYS_IN_MONTH
83
82
  end
84
83
 
84
+ # @return [Float] the mean daily total across every service
85
+ def mean_daily(days) = days.values.sum { |services| services.values.sum } / days.size
86
+
85
87
  def report_line(first, last, days, budget)
86
- mean = days.values.sum { |services| services.values.sum } / days.size
88
+ "#{first}..#{last - 1} (#{days.size} days): $#{format("%.2f", mean_daily(days))}/day, " \
89
+ "$#{format("%.2f", monthly_rate(days))}/month against $#{budget}; biggest: #{biggest_services(days)}"
90
+ end
91
+
92
+ # @return [String] the costliest services, each with its mean daily cost
93
+ def biggest_services(days)
87
94
  biggest = totals_by_service(days).max_by(TOP_SERVICES) { |_name, dollars| dollars }
88
- named = biggest.map { |name, dollars| "#{name} $#{format('%.2f', dollars / days.size)}/day" }.join(", ")
89
- "#{first}..#{last - 1} (#{days.size} days): $#{format('%.2f', mean)}/day, " \
90
- "$#{format('%.2f', monthly_rate(days))}/month against $#{budget}; biggest: #{named}"
95
+ biggest.map { |name, dollars| "#{name} $#{format("%.2f", dollars / days.size)}/day" }.join(", ")
91
96
  end
92
97
 
93
98
  def totals_by_service(days)
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hecks
4
+ module Adapters
5
+ # The plan a write to AWS prints when it is refused unconfirmed or run with `dry_run`: what the
6
+ # project's script would do, read from the script's own text, so nothing is run to say it.
7
+ module DeployPlans
8
+ module_function
9
+
10
+ # What `preview.sh <action>` would do for a branch.
11
+ #
12
+ # @param text [String] the preview script's source
13
+ # @param action [String] `deploy`, `destroy` or `login`
14
+ # @param branch [String, nil] the branch named, or nil for the checked-out one
15
+ # @return [String]
16
+ def preview(text, action, branch)
17
+ stack = "#{variable(text, "PREFIX") || "<prefix>"}-<name derived from #{branch || "the checked-out branch"}>"
18
+ region = variable(text, "REGION")
19
+ where = region ? " in #{region}" : ""
20
+ case action
21
+ when "deploy"
22
+ "push the locally built images and create or update the preview stack #{stack}#{where}, " \
23
+ "create its database and start its service"
24
+ when "destroy" then "empty the preview's storage and delete the preview stack #{stack}#{where}"
25
+ else "read the session secret of the preview stack #{stack}#{where} and mint a signed-in admin session"
26
+ end
27
+ end
28
+
29
+ # What `deploy-<companion>.sh` would roll, and onto which box.
30
+ #
31
+ # @param text [String] the companion script's source
32
+ # @param companion [String] the companion's name
33
+ # @param taskdef [String] the task definition its image and settings are read from
34
+ # @return [String]
35
+ def companion(text, companion, taskdef)
36
+ stack = text[/out\s+(\S+)\s+InstanceId/, 1]
37
+ project = text[/compose -p (\w+)/, 1] || companion
38
+ directory = text[%r{mkdir -p (/\S+)}, 1]
39
+ place = directory ? " in #{directory}" : +""
40
+ "roll #{companion} (Compose project #{project}#{place}) from task definition " \
41
+ "#{taskdef} onto the box of stack #{stack || "<box stack>"} over SSM, beside the app's project, " \
42
+ "then check it on the box"
43
+ end
44
+
45
+ # The value a script assigns to an upper-case variable at the start of a line.
46
+ def variable(text, name) = text[/^#{name}=["']?([^"'\s]+)/, 1]
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "statuses"
4
+
5
+ module Hecks
6
+ module Adapters
7
+ class DeployToolchain
8
+ # The answers the asks hand on to the policies that follow them: plans, confirmations, what a
9
+ # roll or a data copy carries, and the bluebook comparison.
10
+ module Answers
11
+ include Statuses
12
+
13
+ private
14
+
15
+ # Runs the confirmed restore and answers what it printed.
16
+ def restore(held)
17
+ script = Scripts::Script.new(RESTORE_SCRIPT, "restore", RESTORE_STATUS, copy_args(held))
18
+ copy_answer(held, run_script(script, held, copy_env(held))[:report][:value], planned: false)
19
+ end
20
+
21
+ # What a preview verb that writes would do, read from the script, or nil for one that reads.
22
+ # A dry run answers the plan; otherwise the write needs `confirm`.
23
+ #
24
+ # @return [Hash, nil] the dry run's answer, when it is one
25
+ def gate_preview(held, action)
26
+ return unless PREVIEW_WRITES.include?(action)
27
+
28
+ script = script_for(PREVIEW_SCRIPT, plain(held[:project]), plain(held[:script]))
29
+ plan = DeployPlans.preview(File.read(script), action, plain(held[:branch]))
30
+ return planned_answer("#{action}: #{plan}") if plain(held[:dry_run]) == true
31
+
32
+ require_confirm(held, "#{action} a preview", plan)
33
+ nil
34
+ end
35
+
36
+ # What rolling the companion would do, read from its script.
37
+ def companion_plan(held, name, companion)
38
+ script = script_for(name, plain(held[:project]), plain(held[:script]))
39
+ DeployPlans.companion(File.read(script), companion, plain(held[:taskdef]))
40
+ end
41
+
42
+ # A dry run's answer: the plan, and nothing run.
43
+ def planned_answer(plan)
44
+ { outcome: { value: "planned" }, report: { value: "#{plan}\ndry run: nothing was run" }, planned: { value: true } }
45
+ end
46
+
47
+ def require_confirm(held, what, plan)
48
+ return if plain(held[:confirm]) == true
49
+
50
+ raise ConsoleCapture::Failure,
51
+ "refusing to #{what}: #{plan}\npass confirm=true to run it (dry_run=true prints this plan)"
52
+ end
53
+
54
+ def diff_files(old, new)
55
+ report = BluebookReport.new(File.read(File.expand_path(old)), File.read(File.expand_path(new)))
56
+ diff_answer(report.changed? ? "changed" : "unchanged", report.text)
57
+ rescue SystemCallError, JSON::ParserError, TypeError, KeyError => e
58
+ diff_answer("unavailable", "bluebooks: could not compare #{old} and #{new} (#{e.message.lines.first.strip})")
59
+ end
60
+
61
+ # The script reads the registry and the local image; its report says what it found.
62
+ def diff_script(held)
63
+ text = run_script(Scripts::Script.new(DIFF_SCRIPT, "bluebook diff", {}), held, {}).dig(:report, :value)
64
+ return diff_answer("unavailable", text) if text.match?(DIFF_UNAVAILABLE)
65
+
66
+ diff_answer(text.include?("no bluebook changes.") ? "unchanged" : "changed", text)
67
+ rescue ConsoleCapture::Failure => e
68
+ diff_answer("unavailable", "bluebooks: #{e.message.lines.first.strip}; nothing to compare.")
69
+ end
70
+
71
+ def diff_answer(outcome, text) = { outcome: { value: outcome }, report: { value: text } }
72
+
73
+ # What a data copy's answer hands on to the policies that follow it.
74
+ def copy_answer(held, report, planned:)
75
+ carried = %i[project bastion source source_secret target target_secret source_db target_db]
76
+ .to_h { |key| [key, { value: plain(held[key]).to_s }] }
77
+ verify = !planned && plain(held[:skip_verify]) != true
78
+ carried.merge(report: { value: report }, planned: { value: planned }, run_verify: { value: verify })
79
+ end
80
+
81
+ # A database name the record gave, or nil when it left the script's default.
82
+ def database(argument) = plain(argument).to_s.empty? ? nil : plain(argument)
83
+
84
+ def copy_args(held) = %i[bastion source source_secret target target_secret].map { |key| plain(held[key]) }
85
+
86
+ def copy_env(held)
87
+ { "FORCE" => flag(held[:force]), "SRC_DB" => database(held[:source_db]), "DST_DB" => database(held[:target_db]),
88
+ "VERIFY_BY_COMMAND" => "1" }.compact
89
+ end
90
+
91
+ # What the script would overwrite, read from the script itself (its schemas and databases).
92
+ def copy_plan(script, held)
93
+ text = File.read(script)
94
+ schemas = text[/^SCHEMAS="([^"]*)"/, 1].to_s.split.join(", ")
95
+ source_db, target_db = copy_databases(text, held)
96
+ drop = plain(held[:force]) == true ? "; force=true drops each target schema first" : ""
97
+ "copy schemas #{schemas} from database #{source_db} on #{plain(held[:source])} into database " \
98
+ "#{target_db} on #{plain(held[:target])} through bastion #{plain(held[:bastion])}, " \
99
+ "OVERWRITING those schemas there#{drop}"
100
+ end
101
+
102
+ # The source and target databases: the record's, else the script's defaults.
103
+ def copy_databases(text, held)
104
+ databases = text.match(/^SRC_DB=\$\{SRC_DB:-([^}]*)\}; DST_DB=\$\{DST_DB:-([^}]*)\}/)
105
+ [database(held[:source_db]) || databases&.[](1), database(held[:target_db]) || databases&.[](2)]
106
+ end
107
+
108
+ # What a roll's answer hands on to the policies that follow it: the project to find the
109
+ # smoke in, whether to request the smoke (not when the record opted out or the project has
110
+ # no smoke script, either of which is noted on the record), and which roll asked.
111
+ def carried(held, kind)
112
+ skipped = plain(held[:skip_smoke]) == true
113
+ script = smoke_script?(plain(held[:project]))
114
+ note = "smoke skipped: skip_smoke=true" if skipped
115
+ note ||= "smoke skipped: no smoke script" unless script
116
+ { project: { value: plain(held[:project]) }, skip_smoke: { value: skipped },
117
+ run_smoke: { value: note.nil? }, smoke: wrapped(note), kind: { value: kind } }
118
+ end
119
+
120
+ # Whether the project has a generated smoke script the smoke could run.
121
+ def smoke_script?(project)
122
+ script_for(SMOKE_SCRIPT, project, nil)
123
+ true
124
+ rescue ConsoleCapture::Failure
125
+ false
126
+ end
127
+
128
+ def wrapped(text) = text.to_s.empty? ? nil : { value: text }
129
+
130
+ # What `deploy-box.sh` takes: a task definition, or `name=tag` words.
131
+ def box_args(held) = [plain(held[:taskdef]), *plain(held[:tags]).to_s.split].compact
132
+
133
+ # The taskdef and tag a service roll's last line names.
134
+ def rolled(text)
135
+ match = text.match(/^==> rolled taskdef=(\S*) tag=(\S+)$/)
136
+ { taskdef: wrapped(match&.[](1)), tag: wrapped(match&.[](2)) }
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end