hecks 3.5.0 → 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 (1088) 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/doc/reference/coverage.rb +70 -0
  240. data/lib/hecks/doc/reference/harvester.rb +55 -0
  241. data/lib/hecks/doc/reference/readme.rb +89 -0
  242. data/lib/hecks/doc/reference/rendering.rb +149 -0
  243. data/lib/hecks/doc/reference.rb +14 -273
  244. data/lib/hecks/doors/cli_door/nesting.rb +34 -0
  245. data/lib/hecks/doors/cli_door/shorthand.rb +85 -0
  246. data/lib/hecks/doors/cli_door.rb +23 -95
  247. data/lib/hecks/doors/cli_runner/answers.rb +138 -0
  248. data/lib/hecks/doors/cli_runner/resolution.rb +146 -0
  249. data/lib/hecks/doors/cli_runner/settling.rb +115 -0
  250. data/lib/hecks/doors/cli_runner/streaming.rb +90 -0
  251. data/lib/hecks/doors/cli_runner/suggestions.rb +43 -0
  252. data/lib/hecks/doors/cli_runner.rb +12 -336
  253. data/lib/hecks/doors/command_request.rb +42 -31
  254. data/lib/hecks/doors/handle.rb +32 -30
  255. data/lib/hecks/doors/launcher_options.rb +62 -7
  256. data/lib/hecks/doors/mcp_door/properties.rb +47 -0
  257. data/lib/hecks/doors/mcp_door/tool_calls.rb +113 -0
  258. data/lib/hecks/doors/mcp_door/tool_definitions/auditing.rb +51 -0
  259. data/lib/hecks/doors/mcp_door/tool_definitions/calling.rb +69 -0
  260. data/lib/hecks/doors/mcp_door/tool_definitions/reading.rb +97 -0
  261. data/lib/hecks/doors/mcp_door/tool_definitions.rb +15 -0
  262. data/lib/hecks/doors/mcp_door.rb +55 -301
  263. data/lib/hecks/doors/mcp_door_scope/argument_policy.rb +92 -0
  264. data/lib/hecks/doors/mcp_door_scope/env_problems.rb +55 -0
  265. data/lib/hecks/doors/mcp_door_scope/presenter.rb +78 -0
  266. data/lib/hecks/doors/mcp_door_scope.rb +16 -172
  267. data/lib/hecks/doors/ruby_door/aggregate_door.rb +1 -1
  268. data/lib/hecks/doors/ruby_door/chapter.rb +33 -16
  269. data/lib/hecks/doors/ruby_door.rb +14 -11
  270. data/lib/hecks/doors/usage_cache.rb +14 -8
  271. data/lib/hecks/doors.rb +10 -4
  272. data/lib/hecks/embryonaut_bluebook/manifest.rb +11 -3
  273. data/lib/hecks/embryonaut_bluebook/registry/changelog.rb +26 -0
  274. data/lib/hecks/embryonaut_bluebook/registry/versions.rb +27 -0
  275. data/lib/hecks/embryonaut_bluebook/registry.rb +27 -37
  276. data/lib/hecks/embryonaut_bluebook/vendor/acceptance.rb +37 -0
  277. data/lib/hecks/embryonaut_bluebook/vendor.rb +22 -36
  278. data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +9 -6
  279. data/lib/hecks/embryonaut_bluebook.rb +16 -11
  280. data/lib/hecks/engine_agreement.rb +24 -17
  281. data/lib/hecks/forms/app/commands.rb +98 -0
  282. data/lib/hecks/forms/app/queries.rb +62 -0
  283. data/lib/hecks/forms/app/records.rb +67 -0
  284. data/lib/hecks/forms/app/responses.rb +46 -0
  285. data/lib/hecks/forms/app.rb +33 -221
  286. data/lib/hecks/forms/banking_presentation.rb +5 -0
  287. data/lib/hecks/forms/command_form_renderer.rb +55 -14
  288. data/lib/hecks/forms/field_controls.rb +95 -0
  289. data/lib/hecks/forms/field_renderer.rb +34 -88
  290. data/lib/hecks/forms/field_shape.rb +9 -34
  291. data/lib/hecks/forms/html.rb +1 -1
  292. data/lib/hecks/forms/index_renderer.rb +14 -9
  293. data/lib/hecks/forms/page.rb +2 -106
  294. data/lib/hecks/forms/page_assets.rb +88 -0
  295. data/lib/hecks/forms/page_script.rb +28 -0
  296. data/lib/hecks/forms/params.rb +17 -8
  297. data/lib/hecks/forms/query_form_renderer.rb +11 -7
  298. data/lib/hecks/forms/record_renderer.rb +28 -19
  299. data/lib/hecks/forms/reference_options.rb +1 -1
  300. data/lib/hecks/forms/text_shape.rb +40 -0
  301. data/lib/hecks/fqn.rb +64 -32
  302. data/lib/hecks/framework.rb +10 -3
  303. data/lib/hecks/freezer.rb +10 -1
  304. data/lib/hecks/fuzzing/bounded_exhaustive_expressions/fragments.rb +61 -0
  305. data/lib/hecks/fuzzing/bounded_exhaustive_expressions/productions.rb +217 -0
  306. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +5 -194
  307. data/lib/hecks/fuzzing/combination_miner.rb +23 -12
  308. data/lib/hecks/fuzzing/concurrent_dispatch/racing.rb +64 -0
  309. data/lib/hecks/fuzzing/concurrent_dispatch/world_copy.rb +66 -0
  310. data/lib/hecks/fuzzing/concurrent_dispatch.rb +31 -107
  311. data/lib/hecks/fuzzing/coverage_campaign.rb +7 -7
  312. data/lib/hecks/fuzzing/differential/wire_comparison.rb +74 -0
  313. data/lib/hecks/fuzzing/differential.rb +59 -84
  314. data/lib/hecks/fuzzing/domain_generator/block_rendering.rb +70 -0
  315. data/lib/hecks/fuzzing/domain_generator/builder/attribute_shapes.rb +105 -0
  316. data/lib/hecks/fuzzing/domain_generator/builder/shapes.rb +97 -0
  317. data/lib/hecks/fuzzing/domain_generator/builder/wiring.rb +128 -0
  318. data/lib/hecks/fuzzing/domain_generator/builder.rb +105 -0
  319. data/lib/hecks/fuzzing/domain_generator/pruning.rb +90 -0
  320. data/lib/hecks/fuzzing/domain_generator/removals.rb +62 -0
  321. data/lib/hecks/fuzzing/domain_generator/rendering.rb +94 -0
  322. data/lib/hecks/fuzzing/domain_generator/tokens.rb +38 -0
  323. data/lib/hecks/fuzzing/domain_generator.rb +7 -555
  324. data/lib/hecks/fuzzing/era_boundary.rb +34 -24
  325. data/lib/hecks/fuzzing/form_census.rb +18 -8
  326. data/lib/hecks/fuzzing/generated_domain_check.rb +23 -11
  327. data/lib/hecks/fuzzing/isolated_boot/copying.rb +62 -0
  328. data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +133 -0
  329. data/lib/hecks/fuzzing/isolated_boot/worlds.rb +102 -0
  330. data/lib/hecks/fuzzing/isolated_boot.rb +25 -252
  331. data/lib/hecks/fuzzing/persistence_parity.rb +5 -5
  332. data/lib/hecks/fuzzing/properties/aggregation_recompute.rb +121 -0
  333. data/lib/hecks/fuzzing/properties/catalog.rb +138 -0
  334. data/lib/hecks/fuzzing/properties/corrections.rb +23 -20
  335. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +64 -185
  336. data/lib/hecks/fuzzing/properties/group_by_recompute.rb +69 -0
  337. data/lib/hecks/fuzzing/properties/guards.rb +76 -108
  338. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +66 -227
  339. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +46 -35
  340. data/lib/hecks/fuzzing/properties/mutation_recompute.rb +162 -0
  341. data/lib/hecks/fuzzing/properties/outbox.rb +41 -24
  342. data/lib/hecks/fuzzing/properties/piece_invariants.rb +61 -0
  343. data/lib/hecks/fuzzing/properties/policy_wiring.rb +140 -0
  344. data/lib/hecks/fuzzing/properties/query_rows.rb +67 -0
  345. data/lib/hecks/fuzzing/properties/querying.rb +69 -90
  346. data/lib/hecks/fuzzing/properties/references.rb +100 -0
  347. data/lib/hecks/fuzzing/properties/tenant_scope.rb +84 -0
  348. data/lib/hecks/fuzzing/properties.rb +6 -119
  349. data/lib/hecks/fuzzing/qa_settings.rb +23 -17
  350. data/lib/hecks/fuzzing/replay/fan_out.rb +78 -0
  351. data/lib/hecks/fuzzing/replay/filters.rb +72 -0
  352. data/lib/hecks/fuzzing/replay/guard_check.rb +88 -0
  353. data/lib/hecks/fuzzing/replay/mutation_trace.rb +117 -0
  354. data/lib/hecks/fuzzing/replay/observation.rb +60 -0
  355. data/lib/hecks/fuzzing/replay/read_only_steps.rb +84 -0
  356. data/lib/hecks/fuzzing/replay/session.rb +151 -0
  357. data/lib/hecks/fuzzing/replay.rb +35 -442
  358. data/lib/hecks/fuzzing/rust_gap_manifest.rb +3 -4
  359. data/lib/hecks/fuzzing/self_consistency/saga_redelivery.rb +133 -0
  360. data/lib/hecks/fuzzing/self_consistency/sagas.rb +93 -0
  361. data/lib/hecks/fuzzing/self_consistency/value_objects.rb +87 -0
  362. data/lib/hecks/fuzzing/self_consistency.rb +8 -213
  363. data/lib/hecks/fuzzing/sequence_generator/adversary/argument_mutations.rb +116 -0
  364. data/lib/hecks/fuzzing/sequence_generator/adversary/caller_draw.rb +68 -0
  365. data/lib/hecks/fuzzing/sequence_generator/adversary/identity_mutations.rb +62 -0
  366. data/lib/hecks/fuzzing/sequence_generator/adversary/precedence_mutations.rb +126 -0
  367. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +23 -283
  368. data/lib/hecks/fuzzing/sequence_generator/argument_drawing.rb +78 -0
  369. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +69 -53
  370. data/lib/hecks/fuzzing/sequence_generator/identity_shaping.rb +85 -0
  371. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +20 -16
  372. data/lib/hecks/fuzzing/sequence_generator/picker.rb +12 -6
  373. data/lib/hecks/fuzzing/sequence_generator/prefixing.rb +45 -0
  374. data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +19 -8
  375. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +43 -144
  376. data/lib/hecks/fuzzing/sequence_generator.rb +65 -63
  377. data/lib/hecks/fuzzing/shrinker.rb +33 -29
  378. data/lib/hecks/fuzzing/target_capabilities.rb +10 -4
  379. data/lib/hecks/fuzzing/value_generator.rb +27 -17
  380. data/lib/hecks/gate/stages.yml +10 -0
  381. data/lib/hecks/grammar/evolve/arguments.rb +90 -0
  382. data/lib/hecks/grammar/evolve/keywords.rb +81 -0
  383. data/lib/hecks/grammar/evolve/seeds.rb +172 -0
  384. data/lib/hecks/grammar/evolve.rb +22 -263
  385. data/lib/hecks/grammar/operators.rb +111 -0
  386. data/lib/hecks/grammar.rb +53 -126
  387. data/lib/hecks/hecks/adapters/bluebook_report.rb +6 -6
  388. data/lib/hecks/hecks/adapters/codebase/codemods.rb +1 -1
  389. data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +23 -9
  390. data/lib/hecks/hecks/adapters/codebase/language/edits.rb +75 -0
  391. data/lib/hecks/hecks/adapters/codebase/language.rb +30 -72
  392. data/lib/hecks/hecks/adapters/codebase/promotion/candidates.rb +54 -0
  393. data/lib/hecks/hecks/adapters/codebase/promotion/gate.rb +50 -0
  394. data/lib/hecks/hecks/adapters/codebase/promotion/move.rb +70 -0
  395. data/lib/hecks/hecks/adapters/codebase/promotion/standing.rb +88 -0
  396. data/lib/hecks/hecks/adapters/codebase/promotion/watch.rb +83 -0
  397. data/lib/hecks/hecks/adapters/codebase/promotion.rb +115 -0
  398. data/lib/hecks/hecks/adapters/codebase/publishing.rb +31 -12
  399. data/lib/hecks/hecks/adapters/codebase/regeneration.rb +43 -6
  400. data/lib/hecks/hecks/adapters/codebase/release_facts.rb +16 -5
  401. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +9 -1
  402. data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +1 -1
  403. data/lib/hecks/hecks/adapters/codebase/style.rb +1 -1
  404. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +11 -5
  405. data/lib/hecks/hecks/adapters/codebase/test_suite.rb +27 -8
  406. data/lib/hecks/hecks/adapters/console_capture.rb +21 -17
  407. data/lib/hecks/hecks/adapters/cost_explorer.rb +11 -6
  408. data/lib/hecks/hecks/adapters/deploy_plans.rb +3 -3
  409. data/lib/hecks/hecks/adapters/deploy_toolchain/answers.rb +141 -0
  410. data/lib/hecks/hecks/adapters/deploy_toolchain/scripts.rb +95 -0
  411. data/lib/hecks/hecks/adapters/deploy_toolchain/statuses.rb +74 -0
  412. data/lib/hecks/hecks/adapters/deploy_toolchain.rb +21 -239
  413. data/lib/hecks/hecks/adapters/finding_github.rb +2 -2
  414. data/lib/hecks/hecks/adapters/first_admin.rb +22 -8
  415. data/lib/hecks/hecks/adapters/git.rb +18 -5
  416. data/lib/hecks/hecks/adapters/git_refs.rb +144 -0
  417. data/lib/hecks/hecks/adapters/github_rulesets.rb +126 -0
  418. data/lib/hecks/hecks/adapters/host_http.rb +16 -6
  419. data/lib/hecks/hecks/adapters/in_process_boot.rb +9 -5
  420. data/lib/hecks/hecks/adapters/in_process_operations/tailing.rb +61 -0
  421. data/lib/hecks/hecks/adapters/in_process_operations.rb +33 -35
  422. data/lib/hecks/hecks/adapters/journal_store/changes.rb +21 -15
  423. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +29 -12
  424. data/lib/hecks/hecks/adapters/journal_store/readings/attestation.rb +52 -0
  425. data/lib/hecks/hecks/adapters/journal_store/readings/scaffolding.rb +52 -0
  426. data/lib/hecks/hecks/adapters/journal_store/readings.rb +5 -62
  427. data/lib/hecks/hecks/adapters/local_files.rb +27 -10
  428. data/lib/hecks/hecks/adapters/pg_admin/ownership.rb +115 -0
  429. data/lib/hecks/hecks/adapters/pg_admin.rb +14 -87
  430. data/lib/hecks/hecks/adapters/process_pool.rb +54 -22
  431. data/lib/hecks/hecks/adapters/rust_toolchain.rb +12 -4
  432. data/lib/hecks/hecks/adapters/site_toolchain.rb +16 -7
  433. data/lib/hecks/hecks/adapters/terminal.rb +13 -9
  434. data/lib/hecks/hecks/codebase.bluebook +322 -5
  435. data/lib/hecks/hecks/hecks.hecksagon +16 -0
  436. data/lib/hecks/hecks/hecks.world +10 -2
  437. data/lib/hecks/kernel_capabilities/templates.rb +92 -0
  438. data/lib/hecks/kernel_capabilities.rb +18 -85
  439. data/lib/hecks/language/bluebook/vocabulary.bluebook +43 -1
  440. data/lib/hecks/literal/item_splitter.rb +50 -0
  441. data/lib/hecks/literal.rb +29 -38
  442. data/lib/hecks/mcp_stdio_guard.rb +8 -8
  443. data/lib/hecks/naming.rb +9 -3
  444. data/lib/hecks/persistence_legacy_fixture/postgres_stores.rb +81 -0
  445. data/lib/hecks/persistence_legacy_fixture/regenerate.rb +26 -66
  446. data/lib/hecks/persistence_legacy_fixture.rb +13 -10
  447. data/lib/hecks/ports/access_control.rb +13 -10
  448. data/lib/hecks/ports/agent/answers.rb +2 -2
  449. data/lib/hecks/ports/agent.rb +13 -10
  450. data/lib/hecks/ports/authentication.rb +13 -10
  451. data/lib/hecks/ports/authorization.rb +13 -10
  452. data/lib/hecks/ports/clock.rb +13 -10
  453. data/lib/hecks/ports/extraction.rb +13 -12
  454. data/lib/hecks/ports/identity_assignment.rb +13 -10
  455. data/lib/hecks/ports/identity_generation.rb +13 -10
  456. data/lib/hecks/ports/identity_resolution.rb +13 -10
  457. data/lib/hecks/ports/key_vault.rb +13 -10
  458. data/lib/hecks/ports/persistence/append_only.rb +5 -5
  459. data/lib/hecks/ports/persistence/binding_policy.rb +33 -9
  460. data/lib/hecks/ports/persistence/codec_boundary.rb +22 -11
  461. data/lib/hecks/ports/persistence/constants.rb +10 -0
  462. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +18 -16
  463. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +27 -18
  464. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +52 -23
  465. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +14 -8
  466. data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +17 -6
  467. data/lib/hecks/ports/persistence/plugins/era/lineage/coverage.rb +58 -0
  468. data/lib/hecks/ports/persistence/plugins/era/lineage/rewrite.rb +130 -0
  469. data/lib/hecks/ports/persistence/plugins/era/lineage/rules.rb +25 -0
  470. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +20 -180
  471. data/lib/hecks/ports/persistence/plugins/era/postgres_era/boot.rb +41 -0
  472. data/lib/hecks/ports/persistence/plugins/era/postgres_era/class_methods.rb +105 -0
  473. data/lib/hecks/ports/persistence/plugins/era/postgres_era/dialect.rb +137 -0
  474. data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +25 -28
  475. data/lib/hecks/ports/persistence/plugins/era/postgres_era/head_writes.rb +62 -0
  476. data/lib/hecks/ports/persistence/plugins/era/postgres_era/journal.rb +128 -0
  477. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/base_sql.rb +74 -0
  478. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/chain_sql.rb +169 -0
  479. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/domain_rename.rb +91 -0
  480. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_integrity.rb +99 -0
  481. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +0 -73
  482. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +55 -39
  483. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +51 -222
  484. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/merge_writes.rb +120 -0
  485. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +85 -60
  486. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +97 -181
  487. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +19 -19
  488. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/sql_templates.rb +88 -0
  489. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +77 -118
  490. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +3 -117
  491. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_sql.rb +116 -0
  492. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +3 -1
  493. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/context.rb +38 -0
  494. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +43 -25
  495. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +62 -38
  496. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +21 -16
  497. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +66 -86
  498. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/refusals.rb +75 -0
  499. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +27 -9
  500. data/lib/hecks/ports/persistence/plugins/era/postgres_era/query_phases.rb +63 -0
  501. data/lib/hecks/ports/persistence/plugins/era/postgres_era/sagas.rb +78 -0
  502. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +28 -482
  503. data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +40 -12
  504. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +22 -15
  505. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +39 -19
  506. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +16 -16
  507. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +48 -25
  508. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +60 -99
  509. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/path_diff.rb +57 -0
  510. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +21 -11
  511. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +13 -4
  512. data/lib/hecks/ports/persistence/postgres_dump/connection.rb +4 -2
  513. data/lib/hecks/ports/persistence/postgres_dump.rb +13 -7
  514. data/lib/hecks/ports/persistence/repository_factory.rb +35 -11
  515. data/lib/hecks/ports/persistence/state_codec.rb +10 -0
  516. data/lib/hecks/ports/persistence.rb +1 -10
  517. data/lib/hecks/ports/projection.rb +34 -21
  518. data/lib/hecks/ports/query/in_memory.rb +16 -8
  519. data/lib/hecks/projection_files/expression_tables.rb +64 -0
  520. data/lib/hecks/projection_files/texts.rb +67 -0
  521. data/lib/hecks/projection_files.rb +19 -103
  522. data/lib/hecks/projections/bootstrap_table.rb +43 -29
  523. data/lib/hecks/projections/deploy/bastion_lines.rb +32 -0
  524. data/lib/hecks/projections/deploy/box/access.rb +73 -0
  525. data/lib/hecks/projections/deploy/box/caddy.rb +87 -0
  526. data/lib/hecks/projections/deploy/box/compose.rb +70 -0
  527. data/lib/hecks/projections/deploy/box/hosting.rb +4 -105
  528. data/lib/hecks/projections/deploy/box/hosting_parts.rb +97 -0
  529. data/lib/hecks/projections/deploy/box/hosting_settings.rb +1 -1
  530. data/lib/hecks/projections/deploy/box/roll_recipe.rb +1 -1
  531. data/lib/hecks/projections/deploy/box/roll_scripts.rb +135 -0
  532. data/lib/hecks/projections/deploy/box/settings/checks.rb +38 -0
  533. data/lib/hecks/projections/deploy/box/settings/containers.rb +123 -0
  534. data/lib/hecks/projections/deploy/box/settings/origin.rb +56 -0
  535. data/lib/hecks/projections/deploy/box/settings/patterns.rb +43 -0
  536. data/lib/hecks/projections/deploy/box/settings/types.rb +72 -0
  537. data/lib/hecks/projections/deploy/box/settings.rb +58 -263
  538. data/lib/hecks/projections/deploy/box/stack_yaml.rb +107 -0
  539. data/lib/hecks/projections/deploy/box/templates/MIGRATION.md.tmpl +39 -0
  540. data/lib/hecks/projections/deploy/box/templates/Makefile.tmpl +24 -0
  541. data/lib/hecks/projections/deploy/box/templates/deploy-box.sh.tmpl +41 -1
  542. data/lib/hecks/projections/deploy/box/templates/deploy-service.services-roll.part +2 -1
  543. data/lib/hecks/projections/deploy/box/templates/deploy-service.taskdef-roll.part +2 -1
  544. data/lib/hecks/projections/deploy/box/templates/deploy-usage-services.tmpl +4 -0
  545. data/lib/hecks/projections/deploy/box/templates/deploy-usage-taskdef.tmpl +5 -0
  546. data/lib/hecks/projections/deploy/box/templates/ecr-repository.yaml.tmpl +9 -0
  547. data/lib/hecks/projections/deploy/box/templates/mode-summary-services.tmpl +2 -0
  548. data/lib/hecks/projections/deploy/box/templates/mode-summary-taskdef.tmpl +4 -0
  549. data/lib/hecks/projections/deploy/box/templates/services-block.tmpl +9 -0
  550. data/lib/hecks/projections/deploy/box/templates/tunnel-egress.yaml.tmpl +11 -0
  551. data/lib/hecks/projections/deploy/box/templates/writable-secrets.yaml.tmpl +7 -0
  552. data/lib/hecks/projections/deploy/box.rb +33 -493
  553. data/lib/hecks/projections/deploy/fargate/assembly.rb +13 -142
  554. data/lib/hecks/projections/deploy/fargate/cdn/behaviors.rb +76 -0
  555. data/lib/hecks/projections/deploy/fargate/cdn/lines.rb +112 -0
  556. data/lib/hecks/projections/deploy/fargate/cdn/options.rb +85 -0
  557. data/lib/hecks/projections/deploy/fargate/cdn.rb +23 -215
  558. data/lib/hecks/projections/deploy/fargate/check.rb +16 -6
  559. data/lib/hecks/projections/deploy/fargate/containers/definition_lines.rb +61 -0
  560. data/lib/hecks/projections/deploy/fargate/containers/reading.rb +86 -0
  561. data/lib/hecks/projections/deploy/fargate/containers/rendering.rb +132 -0
  562. data/lib/hecks/projections/deploy/fargate/containers/routing.rb +93 -0
  563. data/lib/hecks/projections/deploy/fargate/containers.rb +10 -286
  564. data/lib/hecks/projections/deploy/fargate/extras/reading.rb +90 -0
  565. data/lib/hecks/projections/deploy/fargate/extras/rendering.rb +81 -0
  566. data/lib/hecks/projections/deploy/fargate/extras.rb +9 -158
  567. data/lib/hecks/projections/deploy/fargate/monitoring/alarms.rb +115 -0
  568. data/lib/hecks/projections/deploy/fargate/monitoring/reading.rb +84 -0
  569. data/lib/hecks/projections/deploy/fargate/monitoring/topic.rb +59 -0
  570. data/lib/hecks/projections/deploy/fargate/monitoring/warmer.rb +90 -0
  571. data/lib/hecks/projections/deploy/fargate/monitoring/warmer_roles.rb +76 -0
  572. data/lib/hecks/projections/deploy/fargate/monitoring.rb +14 -348
  573. data/lib/hecks/projections/deploy/fargate/sections.rb +115 -0
  574. data/lib/hecks/projections/deploy/fargate/settings/ids.rb +55 -0
  575. data/lib/hecks/projections/deploy/fargate/settings/tuning.rb +77 -0
  576. data/lib/hecks/projections/deploy/fargate/settings.rb +17 -104
  577. data/lib/hecks/projections/deploy/fargate/stack/blocks.rb +91 -0
  578. data/lib/hecks/projections/deploy/fargate/stack/readers.rb +87 -0
  579. data/lib/hecks/projections/deploy/fargate/stack/recipes.rb +106 -0
  580. data/lib/hecks/projections/deploy/fargate/stack.rb +146 -0
  581. data/lib/hecks/projections/deploy/fargate/task_sections.rb +56 -0
  582. data/lib/hecks/projections/deploy/fargate/yaml.rb +1 -1
  583. data/lib/hecks/projections/deploy/fargate.rb +51 -756
  584. data/lib/hecks/projections/deploy/lambda/pii.rb +49 -0
  585. data/lib/hecks/projections/deploy/lambda/stack/blocks.rb +118 -0
  586. data/lib/hecks/projections/deploy/lambda/stack/checks.rb +64 -0
  587. data/lib/hecks/projections/deploy/lambda/stack/deploy_chain.rb +119 -0
  588. data/lib/hecks/projections/deploy/lambda/stack/readers.rb +62 -0
  589. data/lib/hecks/projections/deploy/lambda/stack/reading.rb +170 -0
  590. data/lib/hecks/projections/deploy/lambda/stack/reading_web.rb +53 -0
  591. data/lib/hecks/projections/deploy/lambda/stack/recipes.rb +112 -0
  592. data/lib/hecks/projections/deploy/lambda/stack/web.rb +57 -0
  593. data/lib/hecks/projections/deploy/lambda/stack.rb +54 -0
  594. data/lib/hecks/projections/deploy/lambda.rb +77 -1885
  595. data/lib/hecks/projections/deploy/preview/access_yaml.rb +8 -74
  596. data/lib/hecks/projections/deploy/preview/containers.rb +18 -7
  597. data/lib/hecks/projections/deploy/preview/routing_yaml.rb +15 -87
  598. data/lib/hecks/projections/deploy/preview/settings.rb +7 -4
  599. data/lib/hecks/projections/deploy/preview/task_yaml.rb +42 -106
  600. data/lib/hecks/projections/deploy/preview/template.rb +11 -106
  601. data/lib/hecks/projections/deploy/preview/yaml_text.rb +1 -1
  602. data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +1 -1
  603. data/lib/hecks/projections/deploy/scripts/settings.rb +14 -6
  604. data/lib/hecks/projections/deploy/scripts.rb +11 -9
  605. data/lib/hecks/projections/deploy/shared/rows.rb +48 -0
  606. data/lib/hecks/projections/deploy/shared.rb +89 -449
  607. data/lib/hecks/projections/deploy/smoke.rb +15 -10
  608. data/lib/hecks/projections/deploy/template_diff/comparer.rb +21 -147
  609. data/lib/hecks/projections/deploy/template_diff/normalizer.rb +60 -0
  610. data/lib/hecks/projections/deploy/template_diff/value_diff.rb +136 -0
  611. data/lib/hecks/projections/deploy/template_diff.rb +8 -3
  612. data/lib/hecks/projections/deploy/templates/fargate/Dockerfile.tmpl +28 -0
  613. data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +63 -0
  614. data/lib/hecks/projections/deploy/templates/fargate/always_params.tmpl +4 -0
  615. data/lib/hecks/projections/deploy/templates/fargate/deploy_plain.tmpl +1 -0
  616. data/lib/hecks/projections/deploy/templates/fargate/deploy_shared.tmpl +11 -0
  617. data/lib/hecks/projections/deploy/templates/fargate/mint_era_own.tmpl +44 -0
  618. data/lib/hecks/projections/deploy/templates/fargate/mint_era_shared.tmpl +8 -0
  619. data/lib/hecks/projections/deploy/templates/fargate/missing_owner.tmpl +9 -0
  620. data/lib/hecks/projections/deploy/templates/fargate/oauth_params.tmpl +7 -0
  621. data/lib/hecks/projections/deploy/templates/fargate/oauth_task_env.tmpl +4 -0
  622. data/lib/hecks/projections/deploy/templates/fargate/oauth_task_policy.tmpl +7 -0
  623. data/lib/hecks/projections/deploy/templates/fargate/owning_params.tmpl +33 -0
  624. data/lib/hecks/projections/deploy/templates/fargate/template.yaml.tmpl +281 -0
  625. data/lib/hecks/projections/deploy/templates/lambda/Makefile.tmpl +218 -0
  626. data/lib/hecks/projections/deploy/templates/lambda/aurora_depends.tmpl +18 -0
  627. data/lib/hecks/projections/deploy/templates/lambda/build_dispatch_none.tmpl +10 -0
  628. data/lib/hecks/projections/deploy/templates/lambda/build_pg.tmpl +15 -0
  629. data/lib/hecks/projections/deploy/templates/lambda/build_plain.tmpl +2 -0
  630. data/lib/hecks/projections/deploy/templates/lambda/build_web.tmpl +11 -0
  631. data/lib/hecks/projections/deploy/templates/lambda/env_blind_guard.tmpl +4 -0
  632. data/lib/hecks/projections/deploy/templates/lambda/mint_era_own.tmpl +122 -0
  633. data/lib/hecks/projections/deploy/templates/lambda/mint_era_shared.tmpl +47 -0
  634. data/lib/hecks/projections/deploy/templates/lambda/missing_owner.tmpl +9 -0
  635. data/lib/hecks/projections/deploy/templates/lambda/nat_comment_oauth.tmpl +14 -0
  636. data/lib/hecks/projections/deploy/templates/lambda/nat_comment_plain.tmpl +3 -0
  637. data/lib/hecks/projections/deploy/templates/lambda/oauth_note.tmpl +8 -0
  638. data/lib/hecks/projections/deploy/templates/lambda/params_oauth.tmpl +13 -0
  639. data/lib/hecks/projections/deploy/templates/lambda/params_shared.tmpl +33 -0
  640. data/lib/hecks/projections/deploy/templates/lambda/pg_native.tmpl +71 -0
  641. data/lib/hecks/projections/deploy/templates/lambda/pii_oac.tmpl +8 -0
  642. data/lib/hecks/projections/deploy/templates/lambda/pii_permission.tmpl +8 -0
  643. data/lib/hecks/projections/deploy/templates/lambda/pii_resources.tmpl +116 -0
  644. data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge.tmpl +30 -0
  645. data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge_oauth.tmpl +12 -0
  646. data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge_plain.tmpl +7 -0
  647. data/lib/hecks/projections/deploy/templates/lambda/rename_schema_own.tmpl +93 -0
  648. data/lib/hecks/projections/deploy/templates/lambda/rename_schema_shared.tmpl +7 -0
  649. data/lib/hecks/projections/deploy/templates/lambda/rust_oauth_env.tmpl +17 -0
  650. data/lib/hecks/projections/deploy/templates/lambda/rust_oauth_policy.tmpl +16 -0
  651. data/lib/hecks/projections/deploy/templates/lambda/rust_session_secret.tmpl +13 -0
  652. data/lib/hecks/projections/deploy/templates/lambda/samconfig.toml.tmpl +12 -0
  653. data/lib/hecks/projections/deploy/templates/lambda/shared_note.tmpl +6 -0
  654. data/lib/hecks/projections/deploy/templates/lambda/sync_oauth.tmpl +23 -0
  655. data/lib/hecks/projections/deploy/templates/lambda/template.yaml.tmpl +187 -0
  656. data/lib/hecks/projections/deploy/templates/lambda/translation_own.tmpl +46 -0
  657. data/lib/hecks/projections/deploy/templates/lambda/translation_shared.tmpl +2 -0
  658. data/lib/hecks/projections/deploy/templates/lambda/web_function.tmpl +207 -0
  659. data/lib/hecks/projections/deploy/templates/lambda/web_google_oauth_env.tmpl +12 -0
  660. data/lib/hecks/projections/deploy/templates/lambda/web_no_oauth_env.tmpl +7 -0
  661. data/lib/hecks/projections/deploy/templates/lambda/web_oauth_policy.tmpl +4 -0
  662. data/lib/hecks/projections/deploy/templates/lambda/webhook_secret_resource.tmpl +20 -0
  663. data/lib/hecks/projections/deploy/templates/preview/alb.tmpl +8 -0
  664. data/lib/hecks/projections/deploy/templates/preview/alb_security_group.tmpl +11 -0
  665. data/lib/hecks/projections/deploy/templates/preview/assume_role.tmpl +6 -0
  666. data/lib/hecks/projections/deploy/templates/preview/base_parameters.tmpl +24 -0
  667. data/lib/hecks/projections/deploy/templates/preview/cluster.tmpl +4 -0
  668. data/lib/hecks/projections/deploy/templates/preview/container_secret.tmpl +9 -0
  669. data/lib/hecks/projections/deploy/templates/preview/db_init_script.sh.tmpl +23 -0
  670. data/lib/hecks/projections/deploy/templates/preview/db_init_secrets.tmpl +5 -0
  671. data/lib/hecks/projections/deploy/templates/preview/db_init_task.tmpl +39 -0
  672. data/lib/hecks/projections/deploy/templates/preview/desired_count.tmpl +5 -0
  673. data/lib/hecks/projections/deploy/templates/preview/distribution.tmpl +24 -0
  674. data/lib/hecks/projections/deploy/templates/preview/execution_role.tmpl +16 -0
  675. data/lib/hecks/projections/deploy/templates/preview/header.tmpl +16 -0
  676. data/lib/hecks/projections/deploy/templates/preview/ingress.tmpl +8 -0
  677. data/lib/hecks/projections/deploy/templates/preview/listener.tmpl +9 -0
  678. data/lib/hecks/projections/deploy/templates/preview/listener_rule.tmpl +11 -0
  679. data/lib/hecks/projections/deploy/templates/preview/log_group.tmpl +5 -0
  680. data/lib/hecks/projections/deploy/templates/preview/log_options.tmpl +5 -0
  681. data/lib/hecks/projections/deploy/templates/preview/outputs.tmpl +14 -0
  682. data/lib/hecks/projections/deploy/templates/preview/service.tmpl +17 -0
  683. data/lib/hecks/projections/deploy/templates/preview/session_secret.tmpl +11 -0
  684. data/lib/hecks/projections/deploy/templates/preview/target_group.tmpl +9 -0
  685. data/lib/hecks/projections/deploy/templates/preview/task_definition.tmpl +15 -0
  686. data/lib/hecks/projections/deploy/templates/preview/task_role.tmpl +22 -0
  687. data/lib/hecks/projections/deploy/templates/shared/aurora_db.tmpl +52 -0
  688. data/lib/hecks/projections/deploy/templates/shared/bastion.tmpl +74 -0
  689. data/lib/hecks/projections/deploy/templates/shared/bastion_own_public.tmpl +41 -0
  690. data/lib/hecks/projections/deploy/templates/shared/bastion_reuse_public.tmpl +10 -0
  691. data/lib/hecks/projections/deploy/templates/shared/nat_gateway.tmpl +102 -0
  692. data/lib/hecks/projections/deploy/templates/shared/oauth_egress.tmpl +17 -0
  693. data/lib/hecks/projections/deploy/templates/shared/plain_db.tmpl +16 -0
  694. data/lib/hecks/projections/deploy/templates/shared/vpc_and_database.tmpl +67 -0
  695. data/lib/hecks/projections/deploy/text_template.rb +35 -0
  696. data/lib/hecks/projections/diagrams/dispatch.rb +114 -0
  697. data/lib/hecks/projections/diagrams/statecharts.rb +59 -0
  698. data/lib/hecks/projections/diagrams/structure.rb +114 -0
  699. data/lib/hecks/projections/diagrams.rb +33 -256
  700. data/lib/hecks/projections/glossary/entries.rb +140 -0
  701. data/lib/hecks/projections/glossary/html/page.rb +96 -0
  702. data/lib/hecks/projections/glossary/html/parser.rb +66 -0
  703. data/lib/hecks/projections/glossary/html/sections.rb +78 -0
  704. data/lib/hecks/projections/glossary/html.rb +7 -179
  705. data/lib/hecks/projections/glossary/index.rb +45 -0
  706. data/lib/hecks/projections/glossary/markdown.rb +22 -11
  707. data/lib/hecks/projections/glossary/mermaid.rb +44 -31
  708. data/lib/hecks/projections/glossary/sensitivity.rb +7 -4
  709. data/lib/hecks/projections/glossary/sentences/value_objects.rb +77 -0
  710. data/lib/hecks/projections/glossary/sentences.rb +42 -81
  711. data/lib/hecks/projections/glossary/slugs.rb +33 -0
  712. data/lib/hecks/projections/glossary.rb +22 -190
  713. data/lib/hecks/projections/model.rb +20 -14
  714. data/lib/hecks/projections/rust_vocabulary/arguments/support.rb +33 -0
  715. data/lib/hecks/projections/rust_vocabulary/arguments.rb +171 -0
  716. data/lib/hecks/projections/rust_vocabulary/enum_body.rb +114 -0
  717. data/lib/hecks/projections/rust_vocabulary/tests.rb +144 -0
  718. data/lib/hecks/projections/rust_vocabulary.rb +24 -293
  719. data/lib/hecks/projections/site/admin.rb +15 -9
  720. data/lib/hecks/projections/site/admin_cms/templates/membership.rb +115 -0
  721. data/lib/hecks/projections/site/admin_cms/templates/session_strategy.rb +90 -0
  722. data/lib/hecks/projections/site/admin_cms/templates/sso.rb +101 -0
  723. data/lib/hecks/projections/site/admin_cms/templates/sso_tail.rb +54 -0
  724. data/lib/hecks/projections/site/admin_cms/templates/users.rb +83 -0
  725. data/lib/hecks/projections/site/admin_cms/templates.rb +14 -369
  726. data/lib/hecks/projections/site/admin_cms.rb +15 -9
  727. data/lib/hecks/projections/site/edge/behaviours.rb +10 -6
  728. data/lib/hecks/projections/site/edge/checks.rb +30 -80
  729. data/lib/hecks/projections/site/edge/findings.rb +28 -0
  730. data/lib/hecks/projections/site/edge/route_checks.rb +110 -0
  731. data/lib/hecks/projections/site/edge/row_reader.rb +52 -0
  732. data/lib/hecks/projections/site/edge/rules.rb +28 -26
  733. data/lib/hecks/projections/site/edge.rb +20 -31
  734. data/lib/hecks/projections/site/live_edge.rb +9 -7
  735. data/lib/hecks/projections/site/payload/fields/definitions.rb +90 -0
  736. data/lib/hecks/projections/site/payload/fields/readers.rb +69 -0
  737. data/lib/hecks/projections/site/payload/fields.rb +14 -111
  738. data/lib/hecks/projections/site/payload/lifecycle/text.rb +84 -0
  739. data/lib/hecks/projections/site/payload/lifecycle/text_tail.rb +106 -0
  740. data/lib/hecks/projections/site/payload/lifecycle.rb +8 -166
  741. data/lib/hecks/projections/site/payload/model.rb +22 -22
  742. data/lib/hecks/projections/site/payload/specs/wire.rb +69 -0
  743. data/lib/hecks/projections/site/payload/specs.rb +24 -68
  744. data/lib/hecks/projections/site/payload_driver.rb +19 -17
  745. data/lib/hecks/projections/site/root_rows.rb +12 -4
  746. data/lib/hecks/projections/site/routes_ts/helpers.rb +79 -0
  747. data/lib/hecks/projections/site/routes_ts/listings.rb +75 -0
  748. data/lib/hecks/projections/site/routes_ts/navigation.rb +79 -0
  749. data/lib/hecks/projections/site/routes_ts.rb +27 -175
  750. data/lib/hecks/projections/site/site_admin/access.rb +104 -0
  751. data/lib/hecks/projections/site/site_admin/session.rb +127 -0
  752. data/lib/hecks/projections/site/site_admin.rb +12 -219
  753. data/lib/hecks/projections/site/site_cdn.rb +12 -7
  754. data/lib/hecks/projections/site/site_host/dockerfile.rb +75 -0
  755. data/lib/hecks/projections/site/site_host/templates.rb +7 -63
  756. data/lib/hecks/projections/site/site_root/workflow.rb +65 -0
  757. data/lib/hecks/projections/site/site_root.rb +3 -54
  758. data/lib/hecks/projections/site/table/checks.rb +28 -57
  759. data/lib/hecks/projections/site/table/link_builder.rb +14 -5
  760. data/lib/hecks/projections/site/table/navigation_checks.rb +75 -0
  761. data/lib/hecks/projections/site/table/row_builder.rb +31 -53
  762. data/lib/hecks/projections/site/table/row_defaults.rb +65 -0
  763. data/lib/hecks/projections/site/table.rb +9 -5
  764. data/lib/hecks/projections/vocabulary.rb +34 -31
  765. data/lib/hecks/projector/cli_audience.rb +42 -0
  766. data/lib/hecks/projector/cli_projector/claims.rb +149 -0
  767. data/lib/hecks/projector/cli_projector/command_help.rb +65 -0
  768. data/lib/hecks/projector/cli_projector/command_specs.rb +133 -0
  769. data/lib/hecks/projector/cli_projector/listing.rb +100 -0
  770. data/lib/hecks/projector/cli_projector/option_specs.rb +116 -0
  771. data/lib/hecks/projector/cli_projector/query_specs.rb +67 -0
  772. data/lib/hecks/projector/cli_projector/usage.rb +101 -0
  773. data/lib/hecks/projector/cli_projector.rb +15 -532
  774. data/lib/hecks/projector/docs_projector/attributes.rb +78 -0
  775. data/lib/hecks/projector/docs_projector/behaviour.rb +127 -0
  776. data/lib/hecks/projector/docs_projector/closing.rb +40 -0
  777. data/lib/hecks/projector/docs_projector.rb +58 -192
  778. data/lib/hecks/projector/exporter/bindings.rb +174 -0
  779. data/lib/hecks/projector/exporter/translations.rb +127 -0
  780. data/lib/hecks/projector/exporter.rb +8 -279
  781. data/lib/hecks/projector/narrate_projector/commands.rb +108 -0
  782. data/lib/hecks/projector/narrate_projector/reactions.rb +33 -0
  783. data/lib/hecks/projector/narrate_projector.rb +60 -160
  784. data/lib/hecks/projector.rb +22 -13
  785. data/lib/hecks/quality_control/adapters/agent_profile.rb +25 -16
  786. data/lib/hecks/quality_control/adapters/github_checks.rb +42 -6
  787. data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +1 -1
  788. data/lib/hecks/quality_control/adapters/github_issues.rb +22 -10
  789. data/lib/hecks/quality_control/cli/qa_discover_external_domains/parsing.rb +54 -0
  790. data/lib/hecks/quality_control/cli/qa_discover_external_domains/reporting.rb +44 -0
  791. data/lib/hecks/quality_control/cli/qa_discover_external_domains/scanning.rb +119 -0
  792. data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +28 -155
  793. data/lib/hecks/quality_control/cli/qa_domain_novelty/verdict.rb +76 -0
  794. data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +33 -66
  795. data/lib/hecks/quality_control/cli/qa_generated_domains/arguments.rb +62 -0
  796. data/lib/hecks/quality_control/cli/qa_generated_domains/blueprints.rb +45 -0
  797. data/lib/hecks/quality_control/cli/qa_generated_domains/evaluation.rb +107 -0
  798. data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +107 -0
  799. data/lib/hecks/quality_control/cli/qa_generated_domains/reporting.rb +97 -0
  800. data/lib/hecks/quality_control/cli/qa_generated_domains/shrinking.rb +70 -0
  801. data/lib/hecks/quality_control/cli/qa_generated_domains.rb +43 -327
  802. data/lib/hecks/quality_control/cli/qa_log_bug/arguments.rb +55 -0
  803. data/lib/hecks/quality_control/cli/qa_log_bug/proof.rb +65 -0
  804. data/lib/hecks/quality_control/cli/qa_log_bug.rb +18 -81
  805. data/lib/hecks/quality_control/cli/qa_mine_combinations/arguments.rb +54 -0
  806. data/lib/hecks/quality_control/cli/qa_mine_combinations/booting.rb +96 -0
  807. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +45 -109
  808. data/lib/hecks/quality_control/cli/qa_open_pr/arguments.rb +55 -0
  809. data/lib/hecks/quality_control/cli/qa_open_pr/recording.rb +79 -0
  810. data/lib/hecks/quality_control/cli/qa_open_pr/rules.rb +122 -0
  811. data/lib/hecks/quality_control/cli/qa_open_pr.rb +41 -200
  812. data/lib/hecks/quality_control/cli/qa_postgres_migrate/copying.rb +45 -0
  813. data/lib/hecks/quality_control/cli/qa_postgres_migrate/reporting.rb +33 -0
  814. data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +37 -63
  815. data/lib/hecks/quality_control/cli/qa_postgres_role/ownership.rb +57 -0
  816. data/lib/hecks/quality_control/cli/qa_postgres_role.rb +66 -71
  817. data/lib/hecks/quality_control/cli/qa_pr_check/checking.rb +118 -0
  818. data/lib/hecks/quality_control/cli/qa_pr_check/reporting.rb +54 -0
  819. data/lib/hecks/quality_control/cli/qa_pr_check.rb +28 -145
  820. data/lib/hecks/quality_control/cli/qa_seed_angles/seed.rb +80 -0
  821. data/lib/hecks/quality_control/cli/qa_seed_angles.rb +13 -86
  822. data/lib/hecks/quality_control/cli/qa_sweep/all_mode/children.rb +80 -0
  823. data/lib/hecks/quality_control/cli/qa_sweep/all_mode/report.rb +125 -0
  824. data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +63 -193
  825. data/lib/hecks/quality_control/cli/qa_sweep/checks/boundary.rb +92 -0
  826. data/lib/hecks/quality_control/cli/qa_sweep/checks/engines.rb +92 -0
  827. data/lib/hecks/quality_control/cli/qa_sweep/checks/seeds.rb +86 -0
  828. data/lib/hecks/quality_control/cli/qa_sweep/checks/shrinking.rb +69 -0
  829. data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +10 -248
  830. data/lib/hecks/quality_control/cli/qa_sweep/conclusion.rb +60 -0
  831. data/lib/hecks/quality_control/cli/qa_sweep/depth.rb +61 -0
  832. data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +26 -13
  833. data/lib/hecks/quality_control/cli/qa_sweep/finding_report/shrunk.rb +42 -0
  834. data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +40 -41
  835. data/lib/hecks/quality_control/cli/qa_sweep/parsing/validation.rb +70 -0
  836. data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +35 -65
  837. data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +41 -22
  838. data/lib/hecks/quality_control/cli/qa_sweep/scratch.rb +67 -0
  839. data/lib/hecks/quality_control/cli/qa_sweep/seat.rb +94 -0
  840. data/lib/hecks/quality_control/cli/qa_sweep/seed_loop.rb +149 -0
  841. data/lib/hecks/quality_control/cli/qa_sweep/target_setup.rb +115 -0
  842. data/lib/hecks/quality_control/cli/qa_sweep.rb +22 -445
  843. data/lib/hecks/quality_control/cli/qa_tick/output.rb +107 -0
  844. data/lib/hecks/quality_control/cli/qa_tick/preflight.rb +95 -0
  845. data/lib/hecks/quality_control/cli/qa_tick.rb +42 -175
  846. data/lib/hecks/query_ir/formatting.rb +86 -0
  847. data/lib/hecks/query_ir/rules.rb +132 -0
  848. data/lib/hecks/query_ir/touchpoints.rb +104 -0
  849. data/lib/hecks/query_ir.rb +33 -281
  850. data/lib/hecks/query_ir_mcp/tools.rb +68 -0
  851. data/lib/hecks/query_ir_mcp.rb +27 -71
  852. data/lib/hecks/query_specification/common/comparison.rb +25 -5
  853. data/lib/hecks/query_specification/common/dsl.rb +1 -1
  854. data/lib/hecks/query_specification/common/null_policy.rb +9 -6
  855. data/lib/hecks/query_specification/common/options.rb +21 -14
  856. data/lib/hecks/query_specification/field_path.rb +5 -2
  857. data/lib/hecks/query_specification/hop_path.rb +15 -18
  858. data/lib/hecks/release/lane.rb +22 -0
  859. data/lib/hecks/release/runner/clean_tree.rb +2 -2
  860. data/lib/hecks/release/runner/commands.rb +1 -1
  861. data/lib/hecks/release/runner/options.rb +82 -0
  862. data/lib/hecks/release/runner/preflight.rb +12 -7
  863. data/lib/hecks/release/runner/publishing.rb +86 -0
  864. data/lib/hecks/release/runner/tagger.rb +8 -3
  865. data/lib/hecks/release/runner.rb +40 -156
  866. data/lib/hecks/rendering.rb +13 -9
  867. data/lib/hecks/router/door.rb +37 -0
  868. data/lib/hecks/router/namespace_installer.rb +45 -83
  869. data/lib/hecks/router/options_proxy.rb +44 -0
  870. data/lib/hecks/runtime/adapter_lookup.rb +45 -24
  871. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -8
  872. data/lib/hecks/runtime/command_interpreter/delegation.rb +116 -0
  873. data/lib/hecks/runtime/command_interpreter/enforcement.rb +38 -0
  874. data/lib/hecks/runtime/command_interpreter/hydration.rb +139 -0
  875. data/lib/hecks/runtime/command_interpreter/list_mutations.rb +98 -0
  876. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +67 -114
  877. data/lib/hecks/runtime/command_interpreter/persisting.rb +96 -0
  878. data/lib/hecks/runtime/command_interpreter.rb +57 -352
  879. data/lib/hecks/runtime/command_rules/admissibility.rb +64 -147
  880. data/lib/hecks/runtime/command_rules/arithmetic.rb +13 -72
  881. data/lib/hecks/runtime/command_rules/authorization.rb +9 -9
  882. data/lib/hecks/runtime/command_rules/emission.rb +13 -14
  883. data/lib/hecks/runtime/command_rules/guard_state.rb +49 -0
  884. data/lib/hecks/runtime/command_rules/invariants.rb +84 -0
  885. data/lib/hecks/runtime/command_rules/operands.rb +88 -0
  886. data/lib/hecks/runtime/command_rules/references.rb +59 -57
  887. data/lib/hecks/runtime/command_rules/tenant_boundary.rb +69 -0
  888. data/lib/hecks/runtime/dependency_planning/analyzer.rb +90 -0
  889. data/lib/hecks/runtime/dependency_planning/expression_reads.rb +73 -0
  890. data/lib/hecks/runtime/dependency_planning/mutation_analysis.rb +89 -0
  891. data/lib/hecks/runtime/dependency_planning/rule_analysis.rb +82 -0
  892. data/lib/hecks/runtime/dependency_planning.rb +3 -250
  893. data/lib/hecks/runtime/dispatcher/queries.rb +62 -0
  894. data/lib/hecks/runtime/dispatcher/result.rb +55 -0
  895. data/lib/hecks/runtime/dispatcher/routing.rb +107 -0
  896. data/lib/hecks/runtime/dispatcher.rb +64 -209
  897. data/lib/hecks/runtime/entity_element/location.rb +124 -0
  898. data/lib/hecks/runtime/entity_element/mutations.rb +150 -0
  899. data/lib/hecks/runtime/entity_element.rb +5 -177
  900. data/lib/hecks/runtime/entity_interpreter/enforcement.rb +51 -0
  901. data/lib/hecks/runtime/entity_interpreter/locating.rb +62 -0
  902. data/lib/hecks/runtime/entity_interpreter/resolution.rb +42 -0
  903. data/lib/hecks/runtime/entity_interpreter/saving.rb +49 -0
  904. data/lib/hecks/runtime/entity_interpreter.rb +45 -164
  905. data/lib/hecks/runtime/identity.rb +15 -9
  906. data/lib/hecks/runtime/instance.rb +11 -7
  907. data/lib/hecks/runtime/interpreting.rb +16 -8
  908. data/lib/hecks/runtime/invocation.rb +3 -155
  909. data/lib/hecks/runtime/invocation_builder.rb +132 -0
  910. data/lib/hecks/runtime/invocation_facts.rb +87 -0
  911. data/lib/hecks/runtime/loader/boot_steps.rb +96 -0
  912. data/lib/hecks/runtime/loader/described.rb +27 -0
  913. data/lib/hecks/runtime/loader.rb +27 -114
  914. data/lib/hecks/runtime/outbox/consumer_runner.rb +40 -0
  915. data/lib/hecks/runtime/outbox/fanout.rb +82 -0
  916. data/lib/hecks/runtime/outbox/relay.rb +149 -0
  917. data/lib/hecks/runtime/outbox.rb +3 -214
  918. data/lib/hecks/runtime/policy_interpreter/arguments.rb +67 -0
  919. data/lib/hecks/runtime/policy_interpreter/fan_out.rb +96 -0
  920. data/lib/hecks/runtime/policy_interpreter.rb +22 -137
  921. data/lib/hecks/runtime/port_operation_interpreter.rb +18 -17
  922. data/lib/hecks/runtime/query_interpreter/arguments.rb +51 -0
  923. data/lib/hecks/runtime/query_interpreter/entity_rows.rb +82 -0
  924. data/lib/hecks/runtime/query_interpreter/outside_answer.rb +89 -0
  925. data/lib/hecks/runtime/query_interpreter.rb +43 -191
  926. data/lib/hecks/runtime/reaction_invocation/identities.rb +92 -0
  927. data/lib/hecks/runtime/reaction_invocation/target_resolution.rb +88 -0
  928. data/lib/hecks/runtime/reaction_invocation.rb +66 -183
  929. data/lib/hecks/runtime/reaction_outcome.rb +7 -3
  930. data/lib/hecks/runtime/read_model_interpreter/head_ordering.rb +49 -0
  931. data/lib/hecks/runtime/read_model_interpreter/reductions.rb +123 -0
  932. data/lib/hecks/runtime/read_model_interpreter/shaping.rb +100 -0
  933. data/lib/hecks/runtime/read_model_interpreter.rb +71 -214
  934. data/lib/hecks/runtime/reference_hop.rb +11 -11
  935. data/lib/hecks/runtime/refusal_wording.rb +11 -8
  936. data/lib/hecks/runtime/registry/chapter_verification.rb +84 -0
  937. data/lib/hecks/runtime/registry/declarations.rb +17 -0
  938. data/lib/hecks/runtime/registry/durability_warnings.rb +71 -0
  939. data/lib/hecks/runtime/registry/hecksagon_rules.rb +124 -0
  940. data/lib/hecks/runtime/registry/merging.rb +49 -0
  941. data/lib/hecks/runtime/registry/providers.rb +139 -0
  942. data/lib/hecks/runtime/registry/query_verification.rb +144 -0
  943. data/lib/hecks/runtime/registry/read_repository.rb +61 -0
  944. data/lib/hecks/runtime/registry/runtime_state.rb +27 -0
  945. data/lib/hecks/runtime/registry/saga_persistence.rb +12 -8
  946. data/lib/hecks/runtime/registry/verification.rb +45 -389
  947. data/lib/hecks/runtime/registry/world_defaults.rb +3 -3
  948. data/lib/hecks/runtime/registry.rb +58 -296
  949. data/lib/hecks/runtime/remote_dispatcher.rb +47 -31
  950. data/lib/hecks/runtime/saga_interpreter/compensation.rb +90 -0
  951. data/lib/hecks/runtime/saga_interpreter/correlation.rb +19 -10
  952. data/lib/hecks/runtime/saga_interpreter/delivery.rb +147 -0
  953. data/lib/hecks/runtime/saga_interpreter/lifecycle.rb +63 -0
  954. data/lib/hecks/runtime/saga_interpreter/transitions.rb +112 -0
  955. data/lib/hecks/runtime/saga_interpreter.rb +41 -320
  956. data/lib/hecks/runtime/tenant_check.rb +14 -9
  957. data/lib/hecks/runtime/value/admission.rb +28 -19
  958. data/lib/hecks/runtime/value/coercion.rb +55 -404
  959. data/lib/hecks/runtime/value/entity_list_coercion.rb +27 -29
  960. data/lib/hecks/runtime/value/field_checks.rb +57 -100
  961. data/lib/hecks/runtime/value/flags.rb +65 -0
  962. data/lib/hecks/runtime/value/identifiers.rb +64 -0
  963. data/lib/hecks/runtime/value/references.rb +195 -0
  964. data/lib/hecks/runtime/value/shape_checks.rb +61 -0
  965. data/lib/hecks/runtime/value/validation.rb +125 -0
  966. data/lib/hecks/runtime/value.rb +18 -6
  967. data/lib/hecks/rust_build/conformance/surface.rb +75 -0
  968. data/lib/hecks/rust_build/conformance.rb +27 -59
  969. data/lib/hecks/rust_build/conformance_fuzz.rb +26 -15
  970. data/lib/hecks/rust_build/coverage.rb +32 -104
  971. data/lib/hecks/rust_build/coverage_parts/expected.rb +68 -0
  972. data/lib/hecks/rust_build/coverage_parts/printer.rb +75 -0
  973. data/lib/hecks/rust_build/host.rb +23 -13
  974. data/lib/hecks/rust_build/kernel_input.rb +19 -12
  975. data/lib/hecks/rust_build/native_build.rb +19 -15
  976. data/lib/hecks/rust_build/project_rust/domain_loader.rb +75 -0
  977. data/lib/hecks/rust_build/project_rust/root_mod/notes.rb +66 -0
  978. data/lib/hecks/rust_build/project_rust/root_mod.rb +22 -55
  979. data/lib/hecks/rust_build/project_rust/target_ir.rb +74 -0
  980. data/lib/hecks/rust_build/project_rust.rb +21 -89
  981. data/lib/hecks/rust_build/wasm.rb +11 -4
  982. data/lib/hecks/rust_build/wasm_browser.rb +7 -7
  983. data/lib/hecks/rust_build/write_if_changed.rb +3 -6
  984. data/lib/hecks/rust_build.rb +7 -3
  985. data/lib/hecks/storehouse/audit.rb +106 -0
  986. data/lib/hecks/storehouse/callers.rb +73 -0
  987. data/lib/hecks/storehouse/dispatching.rb +149 -0
  988. data/lib/hecks/storehouse/introspection.rb +145 -0
  989. data/lib/hecks/storehouse/querying.rb +78 -0
  990. data/lib/hecks/storehouse.rb +43 -451
  991. data/lib/hecks/tickets/bluebook/tickets.bluebook +29 -0
  992. data/lib/hecks/tools/argument_gate_matrix/dispatching.rb +69 -0
  993. data/lib/hecks/tools/argument_gate_matrix/rows.rb +121 -0
  994. data/lib/hecks/tools/argument_gate_matrix/violations.rb +108 -0
  995. data/lib/hecks/tools/argument_gate_matrix.rb +43 -212
  996. data/lib/hecks/tools/ci_gate_decision.rb +21 -14
  997. data/lib/hecks/tools/ci_gates.rb +40 -26
  998. data/lib/hecks/tools/comment_style/baseline.rb +41 -0
  999. data/lib/hecks/tools/comment_style/caps_words.rb +104 -0
  1000. data/lib/hecks/tools/comment_style/cli.rb +121 -0
  1001. data/lib/hecks/tools/comment_style/dictionary.rb +60 -0
  1002. data/lib/hecks/tools/comment_style/fixing.rb +119 -0
  1003. data/lib/hecks/tools/comment_style/long_blocks.rb +51 -0
  1004. data/lib/hecks/tools/comment_style/masking.rb +94 -0
  1005. data/lib/hecks/tools/comment_style/patterns.rb +61 -0
  1006. data/lib/hecks/tools/comment_style/run.rb +161 -0
  1007. data/lib/hecks/tools/comment_style/signature.rb +59 -0
  1008. data/lib/hecks/tools/comment_style/source_file.rb +105 -0
  1009. data/lib/hecks/tools/comment_style/structure_checks.rb +113 -0
  1010. data/lib/hecks/tools/comment_style/text_checks.rb +67 -0
  1011. data/lib/hecks/tools/comment_style/vocabulary.rb +55 -0
  1012. data/lib/hecks/tools/comment_style/walker.rb +136 -0
  1013. data/lib/hecks/tools/comment_style.rb +17 -1000
  1014. data/lib/hecks/tools/corpus_report.rb +26 -16
  1015. data/lib/hecks/tools/deploy_recipe/targets.rb +61 -0
  1016. data/lib/hecks/tools/deploy_recipe/worlds.rb +114 -0
  1017. data/lib/hecks/tools/deploy_recipe.rb +60 -174
  1018. data/lib/hecks/tools/deploy_recipe_lint/checks.rb +78 -0
  1019. data/lib/hecks/tools/deploy_recipe_lint/fixtures.rb +88 -0
  1020. data/lib/hecks/tools/deploy_recipe_lint/makefile.rb +84 -0
  1021. data/lib/hecks/tools/deploy_recipe_lint.rb +29 -192
  1022. data/lib/hecks/tools/drop_implicit_append_fields.rb +20 -12
  1023. data/lib/hecks/tools/era_projection_backfill.rb +50 -33
  1024. data/lib/hecks/tools/era_reattest/reporting.rb +55 -0
  1025. data/lib/hecks/tools/era_reattest.rb +32 -43
  1026. data/lib/hecks/tools/evolve_run/arguments.rb +49 -0
  1027. data/lib/hecks/tools/evolve_run/words.rb +60 -0
  1028. data/lib/hecks/tools/evolve_run.rb +43 -90
  1029. data/lib/hecks/tools/fuzz_sweep/findings.rb +106 -0
  1030. data/lib/hecks/tools/fuzz_sweep/options.rb +69 -0
  1031. data/lib/hecks/tools/fuzz_sweep/pool.rb +74 -0
  1032. data/lib/hecks/tools/fuzz_sweep/reporting.rb +88 -0
  1033. data/lib/hecks/tools/fuzz_sweep.rb +75 -273
  1034. data/lib/hecks/tools/gate.rb +31 -16
  1035. data/lib/hecks/tools/heki_compaction.rb +63 -42
  1036. data/lib/hecks/tools/hoist_local_givens/rewriting.rb +119 -0
  1037. data/lib/hecks/tools/hoist_local_givens.rb +89 -157
  1038. data/lib/hecks/tools/journal_compaction.rb +40 -31
  1039. data/lib/hecks/tools/lanes/files.rb +82 -0
  1040. data/lib/hecks/tools/lanes/live.rb +41 -0
  1041. data/lib/hecks/tools/lanes/rows.rb +45 -0
  1042. data/lib/hecks/tools/lanes/ruleset.rb +44 -0
  1043. data/lib/hecks/tools/lanes/watch_workflow.rb +82 -0
  1044. data/lib/hecks/tools/lanes/workflow.rb +79 -0
  1045. data/lib/hecks/tools/lanes.rb +71 -0
  1046. data/lib/hecks/tools/oidc_manifests.rb +10 -9
  1047. data/lib/hecks/tools/query_ir_run.rb +7 -3
  1048. data/lib/hecks/tools/regeneration_run.rb +40 -26
  1049. data/lib/hecks/tools/rust_comment_style/caps_words.rb +98 -0
  1050. data/lib/hecks/tools/rust_comment_style/fixing.rb +102 -0
  1051. data/lib/hecks/tools/rust_comment_style/masking.rb +85 -0
  1052. data/lib/hecks/tools/rust_comment_style/run.rb +94 -0
  1053. data/lib/hecks/tools/rust_comment_style/source_file.rb +71 -0
  1054. data/lib/hecks/tools/rust_comment_style/structure.rb +79 -0
  1055. data/lib/hecks/tools/rust_comment_style/text_checks.rb +63 -0
  1056. data/lib/hecks/tools/rust_comment_style/tokenizer.rb +102 -0
  1057. data/lib/hecks/tools/rust_comment_style.rb +38 -535
  1058. data/lib/hecks/tools/sequence_script.rb +20 -14
  1059. data/lib/hecks/tools/site_routes/cli.rb +70 -0
  1060. data/lib/hecks/tools/site_routes/root_files.rb +59 -0
  1061. data/lib/hecks/tools/site_routes/templates.rb +77 -0
  1062. data/lib/hecks/tools/site_routes.rb +84 -160
  1063. data/lib/hecks/tools/tail_merge.rb +45 -37
  1064. data/lib/hecks/tools/tenant_provisioning.rb +45 -31
  1065. data/lib/hecks/tools/tools_doc.rb +42 -19
  1066. data/lib/hecks/tools/translation_audit/domain_loading.rb +71 -0
  1067. data/lib/hecks/tools/translation_audit/edges.rb +71 -0
  1068. data/lib/hecks/tools/translation_audit/verdicts.rb +107 -0
  1069. data/lib/hecks/tools/translation_audit.rb +30 -161
  1070. data/lib/hecks/tools/translation_scaffold/reporting.rb +40 -0
  1071. data/lib/hecks/tools/translation_scaffold.rb +77 -60
  1072. data/lib/hecks/tools.rb +1 -0
  1073. data/lib/hecks/vendoring.rb +37 -11
  1074. data/lib/hecks/version.rb +1 -1
  1075. data/lib/hecks/vocabulary.rb +16 -1
  1076. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +7 -9
  1077. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +8 -6
  1078. data/rust/.cargo/mutants.toml +8 -0
  1079. data/rust/host/Cargo.toml +5 -0
  1080. data/rust/host/HECKS_RELEASE +1 -1
  1081. data/rust/host/src/auth.rs +32 -0
  1082. data/rust/host/src/web.rs +2 -3
  1083. data/rust/src/kernel/dispatch.rs +4 -0
  1084. data/rust/src/kernel/dispatch_guard_tests.rs +506 -0
  1085. data/rust/src/kernel/orchestrate.rs +4 -0
  1086. data/rust/src/kernel/orchestrate_guard_tests.rs +708 -0
  1087. metadata +591 -3
  1088. /data/lib/hecks/bluebook/behaviour/{hexagon.rb → hecksagon.rb} +0 -0
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "pg"
4
+ require_relative "qa_postgres_role/ownership"
4
5
 
5
6
  module Hecks
6
7
  module QualityControlCli
@@ -11,6 +12,8 @@ module Hecks
11
12
  # hecks quality_control sweep.create_ledger_role <database> [--role <role>] # role defaults
12
13
  # to hecks_qa
13
14
  class QaPostgresRole
15
+ include Ownership
16
+
14
17
  USAGE = "usage: hecks quality_control create_ledger_role <database> [--role <role>]"
15
18
 
16
19
  # `relkind` of each relation to the word `ALTER` takes for it. Partitions are their own
@@ -39,16 +42,39 @@ module Hecks
39
42
  # @return [Integer] the exit status
40
43
  # @raise [SystemExit] when the role is a superuser or `BYPASSRLS`, or the database is missing
41
44
  def call(argv)
42
- argv = argv.dup
43
- role = "hecks_qa"
44
- if (index = argv.index("--role"))
45
- role = argv[index + 1] or return usage("--role needs a name")
46
- argv.slice!(index, 2)
47
- end
45
+ database, role = parse(argv.dup)
46
+ provision(database, role)
47
+ 0
48
+ rescue UsageError => e
49
+ usage(e.message)
50
+ end
51
+
52
+ private
53
+
54
+ # Raised for a wrong command line; `call` answers it with the usage line and status 1.
55
+ class UsageError < StandardError; end
56
+
57
+ def parse(argv)
58
+ role = take_role(argv)
48
59
  database = argv.shift
49
- return usage("no database named") if database.to_s.empty?
50
- return usage("unexpected argument #{argv.first.inspect}") unless argv.empty?
60
+ raise UsageError, "no database named" if database.to_s.empty?
61
+ raise UsageError, "unexpected argument #{argv.first.inspect}" unless argv.empty?
62
+
63
+ [database, role]
64
+ end
51
65
 
66
+ def take_role(argv)
67
+ index = argv.index("--role")
68
+ return "hecks_qa" unless index
69
+
70
+ role = argv[index + 1]
71
+ raise UsageError, "--role needs a name" unless role
72
+
73
+ argv.slice!(index, 2)
74
+ role
75
+ end
76
+
77
+ def provision(database, role)
52
78
  done = []
53
79
  skipped = []
54
80
  admin = PG.connect(dbname: "postgres")
@@ -57,11 +83,8 @@ module Hecks
57
83
  admin.close
58
84
  take_contents(database, role, done)
59
85
  report(database, role, done, skipped)
60
- 0
61
86
  end
62
87
 
63
- private
64
-
65
88
  def usage(message)
66
89
  @err.puts "hecks quality_control create_ledger_role: #{message}"
67
90
  @err.puts USAGE
@@ -71,81 +94,53 @@ module Hecks
71
94
  def create_role(admin, role, done, skipped)
72
95
  attrs = admin.exec_params("SELECT rolsuper, rolbypassrls FROM pg_roles WHERE rolname = $1", [role])
73
96
  if attrs.ntuples.zero?
74
- # CREATE ROLE has no IF NOT EXISTS. Concurrent creates can lose on the catalog index
75
- # (unique_violation) rather than duplicate_object, so the block rescues both.
76
- admin.exec(<<~SQL)
77
- DO $$ BEGIN
78
- CREATE ROLE #{admin.quote_ident(role)} LOGIN NOSUPERUSER NOBYPASSRLS NOCREATEDB NOCREATEROLE;
79
- EXCEPTION WHEN duplicate_object OR unique_violation THEN NULL;
80
- END $$
81
- SQL
97
+ insert_role(admin, role)
82
98
  done << "created role #{role} (LOGIN, no SUPERUSER, no BYPASSRLS)"
83
99
  elsif attrs[0]["rolsuper"] == "t" || attrs[0]["rolbypassrls"] == "t"
84
- admin.close
85
- abort "hecks quality_control create_ledger_role: role #{role} already exists as " \
86
- "#{attrs[0]['rolsuper'] == 't' ? 'a superuser' : 'a BYPASSRLS role'} — the era write-fence " \
87
- "cannot bite it, which is the exact state this script exists to end. Pick another role, or " \
88
- "ALTER ROLE #{role} NOSUPERUSER NOBYPASSRLS first."
100
+ refuse_privileged_role(admin, role, attrs[0])
89
101
  else
90
102
  skipped << "role #{role} exists, ordinary"
91
103
  end
92
104
  end
93
105
 
106
+ # CREATE ROLE has no IF NOT EXISTS. Concurrent creates can lose on the catalog index
107
+ # (unique_violation) rather than duplicate_object, so the block rescues both.
108
+ def insert_role(admin, role)
109
+ admin.exec(<<~SQL)
110
+ DO $$ BEGIN
111
+ CREATE ROLE #{admin.quote_ident(role)} LOGIN NOSUPERUSER NOBYPASSRLS NOCREATEDB NOCREATEROLE;
112
+ EXCEPTION WHEN duplicate_object OR unique_violation THEN NULL;
113
+ END $$
114
+ SQL
115
+ end
116
+
117
+ def refuse_privileged_role(admin, role, attrs)
118
+ admin.close
119
+ abort "hecks quality_control create_ledger_role: role #{role} already exists as " \
120
+ "#{attrs["rolsuper"] == "t" ? "a superuser" : "a BYPASSRLS role"} — the era write-fence " \
121
+ "cannot bite it, which is the exact state this script exists to end. Pick another role, or " \
122
+ "ALTER ROLE #{role} NOSUPERUSER NOBYPASSRLS first."
123
+ end
124
+
94
125
  def take_database(admin, database, role, done, skipped)
95
- owner = admin.exec_params(
96
- "SELECT pg_get_userbyid(datdba) AS owner FROM pg_database WHERE datname = $1", [database]
97
- )
98
- if owner.ntuples.zero?
99
- admin.close
100
- abort "hecks quality_control create_ledger_role: no database #{database} — createdb it first (PostgresEra provisions " \
101
- "every table it needs on first connect, never the database itself)"
102
- end
103
- if owner[0]["owner"] == role
126
+ owner = database_owner(admin, database)
127
+ if owner == role
104
128
  skipped << "database #{database} already owned by #{role}"
105
129
  else
106
130
  admin.exec("ALTER DATABASE #{admin.quote_ident(database)} OWNER TO #{admin.quote_ident(role)}")
107
- done << "database #{database}: owner #{owner[0]['owner']} -> #{role}"
108
- end
109
- end
110
-
111
- def take_contents(database, role, done)
112
- db = PG.connect(dbname: database)
113
- quoted_role = db.quote_ident(role)
114
- schema_owner = db.exec("SELECT pg_get_userbyid(nspowner) AS owner FROM pg_namespace WHERE nspname = 'public'")
115
- if schema_owner.ntuples.positive? && schema_owner[0]["owner"] != role
116
- db.exec("ALTER SCHEMA public OWNER TO #{quoted_role}")
117
- done << "schema public: owner #{schema_owner[0]['owner']} -> #{role}"
131
+ done << "database #{database}: owner #{owner} -> #{role}"
118
132
  end
119
- take_relations(db, role, quoted_role, done)
120
- take_functions(db, role, quoted_role, done)
121
- db.close
122
133
  end
123
134
 
124
- # relkind: r table, p partitioned table, S sequence, v view, m matview.
125
- def take_relations(db, role, quoted_role, done)
126
- relations = db.exec_params(<<~SQL, [role])
127
- SELECT c.relname, c.relkind, pg_get_userbyid(c.relowner) AS owner
128
- FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
129
- WHERE n.nspname = 'public' AND c.relkind IN ('r', 'p', 'S', 'v', 'm') AND pg_get_userbyid(c.relowner) <> $1
130
- ORDER BY c.relkind, c.relname
131
- SQL
132
- relations.each do |row|
133
- db.exec("ALTER #{KINDS.fetch(row['relkind'])} #{db.quote_ident(row['relname'])} OWNER TO #{quoted_role}")
134
- end
135
- done << "#{relations.ntuples} relation(s) in public -> #{role}" if relations.ntuples.positive?
136
- end
135
+ def database_owner(admin, database)
136
+ rows = admin.exec_params(
137
+ "SELECT pg_get_userbyid(datdba) AS owner FROM pg_database WHERE datname = $1", [database]
138
+ )
139
+ return rows[0]["owner"] unless rows.ntuples.zero?
137
140
 
138
- def take_functions(db, role, quoted_role, done)
139
- functions = db.exec_params(<<~SQL, [role])
140
- SELECT p.proname, pg_get_function_identity_arguments(p.oid) AS args
141
- FROM pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace
142
- WHERE n.nspname = 'public' AND pg_get_userbyid(p.proowner) <> $1
143
- ORDER BY p.proname
144
- SQL
145
- functions.each do |row|
146
- db.exec("ALTER FUNCTION #{db.quote_ident(row['proname'])}(#{row['args']}) OWNER TO #{quoted_role}")
147
- end
148
- done << "#{functions.ntuples} function(s) in public -> #{role}" if functions.ntuples.positive?
141
+ admin.close
142
+ abort "hecks quality_control create_ledger_role: no database #{database} — createdb it first (PostgresEra provisions " \
143
+ "every table it needs on first connect, never the database itself)"
149
144
  end
150
145
 
151
146
  def report(database, role, done, skipped)
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hecks
4
+ module QualityControlCli
5
+ class QaPrCheck
6
+ # What `clearance.check_pull_requests` does with one tracked PR: retire it when GitHub says it
7
+ # is settled, skip it while checks run, otherwise ask the ledger for a verdict on its head.
8
+ module Checking
9
+ # The `gh` state of a settled PR to the ledger command that retires it and what to say.
10
+ RETIREMENTS = { "MERGED" => ["Merge", "merged"], "CLOSED" => ["Close", "closed without merging"] }.freeze
11
+
12
+ # One tracked PR as the checks see it: its worklist aggregate, number and display label, the
13
+ # bug or angle it cites, and the live head sha.
14
+ Pull = Struct.new(:aggregate, :number, :label, :citation, :sha) do
15
+ # @return [String] the prefix every line about this PR starts with
16
+ def tag
17
+ "#{label}, #{citation}, #{sha[0, 7]}"
18
+ end
19
+
20
+ # @param summary [String] what the CI port said about the red head
21
+ # @return [Hash] the newly-red record the report prints
22
+ def finding(summary)
23
+ { aggregate: aggregate, pr: number, citation: citation, commit: sha, refusal: summary }
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ # Checks one tracked PR, appending to `@newly_red` or `@operational_errors`. The live head
30
+ # sha is read from gh each run, since a push mints a new commit to clear.
31
+ def check_one_pr(row, aggregate:, citation_field:, citation_label:)
32
+ number = field(row, :number, :value)
33
+ label = "#{aggregate} PR ##{number} (#{field(row, :branch, :value)})"
34
+ view = reading_gh(label) { @git_pr.pull_request(number) }
35
+ return unless view
36
+ return if retire_if_settled?(view, number, label, aggregate)
37
+
38
+ sha = view[:headRefOid].to_s
39
+ return reject_sha(label, sha) unless sha.match?(SHA_PATTERN)
40
+
41
+ citation = citation_for(row, citation_field, citation_label)
42
+ check_clearance(Pull.new(aggregate, number, label, citation, sha))
43
+ end
44
+
45
+ def reject_sha(label, sha)
46
+ @operational_errors << "#{label}: head commit #{sha.inspect} does not look like a sha — skipping"
47
+ end
48
+
49
+ def citation_for(row, citation_field, citation_label)
50
+ cited = field(row, citation_field)
51
+ cited ? "#{citation_label} #{cited}" : "no #{citation_label} cited"
52
+ end
53
+
54
+ def check_clearance(pull)
55
+ existing = clearance_for_commit(pull.sha)
56
+ return puts("#{pull.tag}: already cleared (#{existing[:status]}) — settled once, not re-checked") if existing
57
+ return unless checks_settled?(pull)
58
+
59
+ ask_the_ledger(pull)
60
+ end
61
+
62
+ def clearance_for_commit(sha)
63
+ query("Clearance.All").find { |row| field(row, :commit, :value) == sha }
64
+ end
65
+
66
+ # Retires a Patch/Improvement whose PR GitHub reports merged or closed; nothing else tells
67
+ # the ledger. Returns true if it retired one.
68
+ def retire_if_settled?(view, number, label, aggregate)
69
+ verb, outcome = RETIREMENTS[view[:state]]
70
+ return false unless verb
71
+
72
+ @runtime.dispatch_flat("QualityControl::#{aggregate}.#{verb}", { id: number })
73
+ puts "#{label}: #{outcome} — retired from the worklist"
74
+ true
75
+ end
76
+
77
+ # Runs a read against `gh`; a failure is appended to `@operational_errors` and answers nil.
78
+ def reading_gh(label)
79
+ yield
80
+ rescue Hecks::Adapters::GitPr::CommandFailed => e
81
+ @operational_errors << "#{label}: #{e.message}"
82
+ nil
83
+ end
84
+
85
+ # True when every check has finished, so a verdict is worth asking for. Pending stays out
86
+ # here because the CI port cannot express "ask again later".
87
+ def checks_settled?(pull)
88
+ checks = reading_gh(pull.label) { @git_pr.checks(pull.number) }
89
+ return false unless checks
90
+
91
+ reason = unsettled_reason(checks)
92
+ puts "#{pull.tag}: #{reason} — skipping this run" if reason
93
+ reason.nil?
94
+ end
95
+
96
+ def unsettled_reason(checks)
97
+ return "gh reports no checks at all yet" if checks.empty?
98
+
99
+ "checks still running" if checks.any? { |c| c[:bucket] == "pending" }
100
+ end
101
+
102
+ # Starts a Clearance and asks the CI port for a verdict. ClearOnPass/RefuseOnFail settle
103
+ # the record synchronously, so `find` sees it straight away; a red one is appended to
104
+ # `@newly_red`.
105
+ def ask_the_ledger(pull)
106
+ ::QualityControl::Clearance.start!(commit: { value: pull.sha })
107
+ @runtime.dispatch_flat("QualityControl::Clearance.CI.Run", { commit: pull.sha })
108
+ cleared = ::QualityControl::Clearance.find(pull.sha)
109
+ summary = cleared.summary.to_h[:value]
110
+ return puts("#{pull.tag}: CLEARED — #{summary}") if cleared.status == "green"
111
+
112
+ puts "#{pull.tag}: RED — #{summary}"
113
+ @newly_red << pull.finding(summary)
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hecks
4
+ module QualityControlCli
5
+ class QaPrCheck
6
+ # What `clearance.check_pull_requests` prints once every tracked PR was looked at.
7
+ module Reporting
8
+ private
9
+
10
+ def report_errors
11
+ return if @operational_errors.empty?
12
+
13
+ puts
14
+ puts "operational error(s):"
15
+ @operational_errors.each { |message| puts " #{message}" }
16
+ end
17
+
18
+ def report_clean
19
+ puts
20
+ puts "clean — every PR QualityControl::Patch or QualityControl::Improvement tracks as open is " \
21
+ "either already cleared, still running, or was retired this run."
22
+ EXIT_OK
23
+ end
24
+
25
+ def report_newly_red
26
+ print_newly_red_header
27
+ @newly_red.each { |finding| print_finding(finding) }
28
+ EXIT_NEWLY_RED
29
+ end
30
+
31
+ def print_newly_red_header
32
+ puts
33
+ puts "=" * 72
34
+ puts "FOUND #{@newly_red.length} NEWLY-RED PR(S) — BugCiWatch/ImprovementCiWatch already dispatched " \
35
+ "the matching Regress for each, by aggregate."
36
+ puts "An agent picks up the investigation from here: the same judgment"
37
+ puts "SKILL.md's own \"on a surprising check\" section describes for a sweep's"
38
+ puts "own find — self-contained fix with a regression test and a draft PR,"
39
+ puts "or leave the record for something bigger. Never re-verify from this script."
40
+ puts "=" * 72
41
+ end
42
+
43
+ def print_finding(finding)
44
+ puts
45
+ puts "aggregate: #{finding[:aggregate]}"
46
+ puts "citation: #{finding[:citation]}"
47
+ puts "pr: ##{finding[:pr]}"
48
+ puts "commit: #{finding[:commit]}"
49
+ puts "refusal: #{finding[:refusal]}"
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -4,6 +4,8 @@ require_relative "../../../hecks"
4
4
  # The ledger's `persisted_by "PostgresEra"` binding needs the era plugin, which core does not load.
5
5
  require_relative "../../ports/persistence/plugins/era"
6
6
  require_relative "../adapters/git_pr"
7
+ require_relative "qa_pr_check/checking"
8
+ require_relative "qa_pr_check/reporting"
7
9
 
8
10
  module Hecks
9
11
  module QualityControlCli
@@ -15,6 +17,9 @@ module Hecks
15
17
  # 2 a newly red PR, with the details on stdout. A commit's `Clearance` is minted once and never
16
18
  # re-asked; pending checks are skipped, since the CI port has no way to say "ask again later".
17
19
  class QaPrCheck
20
+ include Checking
21
+ include Reporting
22
+
18
23
  EXIT_OK = 0
19
24
  EXIT_ERROR = 1
20
25
  EXIT_NEWLY_RED = 2
@@ -51,30 +56,34 @@ module Hecks
51
56
  # @return [Integer] the exit status
52
57
  # @raise [SystemExit] when given arguments, or the ledger does not boot
53
58
  def call(argv)
54
- unless argv.empty?
55
- if %w[-h --help].include?(argv.first)
56
- puts USAGE
57
- return EXIT_OK
58
- end
59
- abort "#{USAGE}\nthis script takes no arguments — it checks every PR QualityControl::Patch or " \
60
- "QualityControl::Improvement tracks as open, every time"
61
- end
59
+ return reject_arguments(argv) unless argv.empty?
62
60
 
63
61
  # Every `gh` call goes through the `GitPr` adapter. With `--json`, gh exits 0 whatever the
64
62
  # checks say, so a failure means only that the call did not succeed.
65
63
  @git_pr = Hecks::Adapters::GitPr.new(repo_dir: Dir.pwd)
66
64
  @runtime = boot_ledger
67
65
  worklists = WORKLISTS.to_h { |w| [w, query("#{w[:aggregate]}.Open")] }
68
- if worklists.values.all?(&:empty?)
69
- puts "no PRs tracked as open by QualityControl::Patch or QualityControl::Improvement — nothing to check"
70
- return EXIT_OK
71
- end
66
+ return nothing_to_check if worklists.values.all?(&:empty?)
72
67
 
73
68
  check_all(worklists)
74
69
  end
75
70
 
76
71
  private
77
72
 
73
+ def reject_arguments(argv)
74
+ if %w[-h --help].include?(argv.first)
75
+ puts USAGE
76
+ return EXIT_OK
77
+ end
78
+ abort "#{USAGE}\nthis script takes no arguments — it checks every PR QualityControl::Patch or " \
79
+ "QualityControl::Improvement tracks as open, every time"
80
+ end
81
+
82
+ def nothing_to_check
83
+ puts "no PRs tracked as open by QualityControl::Patch or QualityControl::Improvement — nothing to check"
84
+ EXIT_OK
85
+ end
86
+
78
87
  def boot_ledger
79
88
  Hecks.boot(@domain_dir)
80
89
  rescue StandardError => e
@@ -83,19 +92,16 @@ module Hecks
83
92
  end
84
93
 
85
94
  def check_all(worklists)
86
- newly_red = []
87
- operational_errors = []
95
+ @newly_red = []
96
+ @operational_errors = []
88
97
  worklists.each do |worklist, rows|
89
- rows.each { |row| check_one_pr(row, newly_red, operational_errors, **worklist) }
98
+ rows.each { |row| check_one_pr(row, **worklist) }
90
99
  end
91
- report_errors(operational_errors)
92
- return report_newly_red(newly_red) if newly_red.any?
93
- return EXIT_ERROR if operational_errors.any?
100
+ report_errors
101
+ return report_newly_red if @newly_red.any?
102
+ return EXIT_ERROR if @operational_errors.any?
94
103
 
95
- puts
96
- puts "clean — every PR QualityControl::Patch or QualityControl::Improvement tracks as open is " \
97
- "either already cleared, still running, or was retired this run."
98
- EXIT_OK
104
+ report_clean
99
105
  end
100
106
 
101
107
  def query(name, **args) = @runtime.query("QualityControl::#{name}", **args)
@@ -104,129 +110,6 @@ module Hecks
104
110
  def field(row, *path)
105
111
  path.reduce(row) { |held, key| held.nil? ? nil : held[key] }
106
112
  end
107
-
108
- def clearance_for_commit(sha)
109
- query("Clearance.All").find { |row| field(row, :commit, :value) == sha }
110
- end
111
-
112
- # Retires a Patch/Improvement whose PR GitHub reports merged or closed; nothing else tells
113
- # the ledger. Returns true if it retired one.
114
- def retire_if_settled?(view, number, label, aggregate)
115
- case view[:state]
116
- when "MERGED"
117
- @runtime.dispatch_flat("QualityControl::#{aggregate}.Merge", { id: number })
118
- puts "#{label}: merged — retired from the worklist"
119
- true
120
- when "CLOSED"
121
- @runtime.dispatch_flat("QualityControl::#{aggregate}.Close", { id: number })
122
- puts "#{label}: closed without merging — retired from the worklist"
123
- true
124
- else
125
- false
126
- end
127
- end
128
-
129
- # Runs a read against `gh`; a failure is appended to `operational_errors` and answers nil.
130
- def reading_gh(label, operational_errors)
131
- yield
132
- rescue Hecks::Adapters::GitPr::CommandFailed => e
133
- operational_errors << "#{label}: #{e.message}"
134
- nil
135
- end
136
-
137
- # True when every check has finished, so a verdict is worth asking for. Pending stays out
138
- # here because the CI port cannot express "ask again later".
139
- def checks_settled?(number, label, citation, sha, operational_errors)
140
- checks = reading_gh(label, operational_errors) { @git_pr.checks(number) }
141
- return false unless checks
142
-
143
- if checks.empty?
144
- puts "#{label}, #{citation}, #{sha[0, 7]}: gh reports no checks at all yet — skipping this run"
145
- return false
146
- end
147
-
148
- if checks.any? { |c| c[:bucket] == "pending" }
149
- puts "#{label}, #{citation}, #{sha[0, 7]}: checks still running — skipping this run"
150
- return false
151
- end
152
-
153
- true
154
- end
155
-
156
- # Checks one tracked PR, appending to `newly_red` or `operational_errors` in place. The live
157
- # head sha is read from gh each run, since a push mints a new commit to clear.
158
- def check_one_pr(row, newly_red, operational_errors, aggregate:, citation_field:, citation_label:)
159
- number = field(row, :number, :value)
160
- cited = field(row, citation_field)
161
- citation = cited ? "#{citation_label} #{cited}" : "no #{citation_label} cited"
162
- label = "#{aggregate} PR ##{number} (#{field(row, :branch, :value)})"
163
-
164
- view = reading_gh(label, operational_errors) { @git_pr.pull_request(number) }
165
- return unless view
166
- return if retire_if_settled?(view, number, label, aggregate)
167
-
168
- sha = view[:headRefOid].to_s
169
- unless sha.match?(SHA_PATTERN)
170
- operational_errors << "#{label}: head commit #{sha.inspect} does not look like a sha — skipping"
171
- return
172
- end
173
-
174
- if (existing = clearance_for_commit(sha))
175
- puts "#{label}, #{citation}, #{sha[0, 7]}: already cleared (#{existing[:status]}) — " \
176
- "settled once, not re-checked"
177
- return
178
- end
179
- return unless checks_settled?(number, label, citation, sha, operational_errors)
180
-
181
- ask_the_ledger(sha, label, citation, number, newly_red, aggregate: aggregate)
182
- end
183
-
184
- # Starts a Clearance and asks the CI port for a verdict. ClearOnPass/RefuseOnFail settle the
185
- # record synchronously, so `find` sees it straight away; a red one is appended to `newly_red`.
186
- def ask_the_ledger(sha, label, citation, number, newly_red, aggregate:)
187
- ::QualityControl::Clearance.start!(commit: { value: sha })
188
- @runtime.dispatch_flat("QualityControl::Clearance.CI.Run", { commit: sha })
189
-
190
- cleared = ::QualityControl::Clearance.find(sha)
191
- summary = cleared.summary.to_h[:value]
192
-
193
- if cleared.status == "green"
194
- puts "#{label}, #{citation}, #{sha[0, 7]}: CLEARED — #{summary}"
195
- return
196
- end
197
-
198
- puts "#{label}, #{citation}, #{sha[0, 7]}: RED — #{summary}"
199
- newly_red << { aggregate: aggregate, pr: number, citation: citation, commit: sha, refusal: summary }
200
- end
201
-
202
- def report_errors(operational_errors)
203
- return if operational_errors.empty?
204
-
205
- puts
206
- puts "operational error(s):"
207
- operational_errors.each { |message| puts " #{message}" }
208
- end
209
-
210
- def report_newly_red(newly_red)
211
- puts
212
- puts "=" * 72
213
- puts "FOUND #{newly_red.length} NEWLY-RED PR(S) — BugCiWatch/ImprovementCiWatch already dispatched " \
214
- "the matching Regress for each, by aggregate."
215
- puts "An agent picks up the investigation from here: the same judgment"
216
- puts "SKILL.md's own \"on a surprising check\" section describes for a sweep's"
217
- puts "own find — self-contained fix with a regression test and a draft PR,"
218
- puts "or leave the record for something bigger. Never re-verify from this script."
219
- puts "=" * 72
220
- newly_red.each do |finding|
221
- puts
222
- puts "aggregate: #{finding[:aggregate]}"
223
- puts "citation: #{finding[:citation]}"
224
- puts "pr: ##{finding[:pr]}"
225
- puts "commit: #{finding[:commit]}"
226
- puts "refusal: #{finding[:refusal]}"
227
- end
228
- EXIT_NEWLY_RED
229
- end
230
113
  end
231
114
  end
232
115
  end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hecks
4
+ module QualityControlCli
5
+ class QaSeedAngles
6
+ # A `resolution:` present means the lead was already chased down: it is proposed,
7
+ # investigated and built in one pass. Its absence means the lever is still open.
8
+ SEED = [
9
+ {
10
+ reference: "ANGLE-1",
11
+ premise: "None of BUG#1-5 touched saga/process_manager machinery at all, despite this " \
12
+ "session having just built a real one (BugCiWatch) — a stress domain specifically " \
13
+ "exercising process-manager correlation, multi-step handler chains, and compensation " \
14
+ "legs was a natural, and the highest-priority, next target.",
15
+ citation: "BugCiWatch (lib/hecks/quality_control/quality_control.bluebook, \"noticing when a fix " \
16
+ "stops holding\"); BUG#1-5, none of which touched saga machinery",
17
+ proposer: "Claude QA",
18
+ resolution: "BUG#6 — SagaInterpreter#qualified cannot tell a same-domain nested-entity " \
19
+ "command reference (dispatch Manifest::Slot::Fill) apart from a genuine " \
20
+ "cross-domain qualifier, so the leg is silently read as targeting a nonexistent " \
21
+ "domain and refuses every time; found by qa/stress_domains/waybill on its first " \
22
+ "real run, before fuzzing was even needed. PR #530 (merged)."
23
+ },
24
+ {
25
+ reference: "ANGLE-2",
26
+ premise: "nested_pieces (qa/stress_domains/nested_pieces) proves two-level ENTITY nesting " \
27
+ "fuzzes and dispatches correctly, but nothing in the corpus exercises deep " \
28
+ "reference_to HOPS — a chain of reference-typed lookups across aggregates — or a " \
29
+ "governance/authorization-shaped construct combined with existence-checking. Entity " \
30
+ "nesting and reference hopping are different DSL mechanisms entirely (entity " \
31
+ "addressing vs CommandRules::References#resolve_references / " \
32
+ "resolve_state_references), and ADR 0037's own Finding 5 already shows reference " \
33
+ "resolution is exactly the kind of place Ruby and Rust structurally diverge — a " \
34
+ "stress domain built around multi-hop references, or a scope/authorization check " \
35
+ "combined with existence-checking, is a genuinely different construct combination " \
36
+ "from anything the six bugs found this session actually touched.",
37
+ citation: "qa/stress_domains/nested_pieces (entity nesting, not reference hops); " \
38
+ "docs/decisions/0037-generated-sequence-fuzz-bridge-found-real-gaps-two-fixed-" \
39
+ "three-catalogued.md, Finding 5 (resolve_state_references never ported to Rust)",
40
+ proposer: "Claude QA"
41
+ },
42
+ {
43
+ reference: "ANGLE-3",
44
+ premise: "BUG#1/#3/#4 were specifically ENGINE-DIVERGENCE bugs — Ruby and Rust disagreeing " \
45
+ "on the same dispatch — a class Ruby-only property/exception fuzzing structurally " \
46
+ "cannot see, because there is no second engine to disagree with. " \
47
+ "spec/rust_conformance_fuzz_spec.rb's own DOMAINS list wires up only pizzas and " \
48
+ "banking for CI-gated differential fuzzing. rust/Cargo.toml already declares " \
49
+ "compiled-binary features for compliance and roster (plus meta) that " \
50
+ "sit unused for this purpose; examples/chess and examples/directory have no Cargo " \
51
+ "feature at all — `hecks project_rust` has never regenerated a binary for either. " \
52
+ "Widening either list would let differential fuzzing catch a whole bug class " \
53
+ "Ruby-only fuzzing cannot, on domains the practice already owns.",
54
+ citation: "BUG#1/#3/#4 (engine-divergence bugs); spec/rust_conformance_fuzz_spec.rb DOMAINS " \
55
+ "(pizzas/banking only); rust/Cargo.toml [features] (compliance/roster/" \
56
+ "meta have binaries and are not wired in; chess/directory have no feature at all)",
57
+ proposer: "Claude QA"
58
+ },
59
+ {
60
+ reference: "ANGLE-4",
61
+ premise: "lib/hecks/bluebook/model_check.rb's ALLOWED_FINDINGS, " \
62
+ "spec/fuzzing/meta_domain_coverage_spec.rb's META_DOMAIN_GUARANTEED_BY_CONSTRUCTION " \
63
+ "and META_DOMAIN_KNOWN_GAPS, and ADR 0037's own catalogued Findings 3-5 are all " \
64
+ "places where something once labeled 'known, not a bug' could be re-examined — a " \
65
+ "gap accepted a year ago is not guaranteed to still be the right call once the " \
66
+ "surrounding code has moved. This session's own waybill finding (BUG#6) confirmed a " \
67
+ "SECOND instance of exactly the family ALLOWED_FINDINGS[\"quality_control\"] already " \
68
+ "named once (Naming.command_ref's bare-constant rewrite conflating a genuine " \
69
+ "cross-domain qualifier with mere nesting) — proof the allowlists are themselves a " \
70
+ "live source of leads, not just a static ledger of settled questions.",
71
+ citation: "lib/hecks/bluebook/model_check.rb ALLOWED_FINDINGS; " \
72
+ "spec/fuzzing/meta_domain_coverage_spec.rb META_DOMAIN_GUARANTEED_BY_CONSTRUCTION / " \
73
+ "META_DOMAIN_KNOWN_GAPS; docs/decisions/0037-generated-sequence-fuzz-bridge-found-" \
74
+ "real-gaps-two-fixed-three-catalogued.md Findings 3-5",
75
+ proposer: "Claude QA"
76
+ }
77
+ ].freeze
78
+ end
79
+ end
80
+ end