hecks 2.8.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (886) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +50 -7
  3. data/lib/hecks/adapters/driven/claude_code.rb +4 -104
  4. data/lib/hecks/adapters/driven/d1.rb +44 -237
  5. data/lib/hecks/adapters/driven/folder.rb +17 -76
  6. data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
  7. data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
  8. data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
  9. data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
  10. data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
  11. data/lib/hecks/adapters/driven/heki.rb +13 -42
  12. data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
  13. data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
  14. data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
  15. data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
  16. data/lib/hecks/adapters/driven/lambda.rb +10 -84
  17. data/lib/hecks/adapters/driven/local_storage.rb +5 -40
  18. data/lib/hecks/adapters/driven/memory.rb +32 -100
  19. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
  20. data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
  21. data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
  22. data/lib/hecks/adapters/driven/postgres/reconnect.rb +10 -32
  23. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
  24. data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
  25. data/lib/hecks/adapters/driven/postgres.rb +149 -136
  26. data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
  27. data/lib/hecks/adapters/driven/prism.rb +48 -38
  28. data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
  29. data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
  30. data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
  31. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
  32. data/lib/hecks/adapters/driven/sqlite.rb +128 -65
  33. data/lib/hecks/adapters/driven/tenant_provisioner.rb +76 -62
  34. data/lib/hecks/adapters/driven.rb +5 -36
  35. data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
  36. data/lib/hecks/behaviors/dsl.rb +7 -25
  37. data/lib/hecks/behaviors/expectations.rb +32 -142
  38. data/lib/hecks/behaviors/ir.rb +7 -20
  39. data/lib/hecks/behaviors/rspec.rb +6 -17
  40. data/lib/hecks/behaviors/runner.rb +10 -34
  41. data/lib/hecks/behaviors.rb +4 -8
  42. data/lib/hecks/bench/cli.rb +62 -0
  43. data/lib/hecks/bench/environment.rb +71 -0
  44. data/lib/hecks/bench/postgres_probe.rb +30 -0
  45. data/lib/hecks/bench/report.rb +76 -0
  46. data/lib/hecks/bench/ruby_runner.rb +93 -0
  47. data/lib/hecks/bench/run.rb +55 -0
  48. data/lib/hecks/bench/rust_runner.rb +101 -0
  49. data/lib/hecks/bench/stats.rb +46 -0
  50. data/lib/hecks/bench/suite.rb +98 -0
  51. data/lib/hecks/bench/workload.rb +89 -0
  52. data/lib/hecks/bench.rb +17 -0
  53. data/lib/hecks/bluebook/aggregate.rb +9 -75
  54. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
  55. data/lib/hecks/bluebook/assembly/build.rb +4 -15
  56. data/lib/hecks/bluebook/assembly/contract.rb +15 -136
  57. data/lib/hecks/bluebook/assembly/contracts.rb +56 -174
  58. data/lib/hecks/bluebook/assembly/marks.rb +31 -223
  59. data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
  60. data/lib/hecks/bluebook/assembly.rb +6 -45
  61. data/lib/hecks/bluebook/attribute.rb +12 -61
  62. data/lib/hecks/bluebook/behaviour/aggregate.rb +39 -39
  63. data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
  64. data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
  65. data/lib/hecks/bluebook/behaviour/command.rb +14 -66
  66. data/lib/hecks/bluebook/behaviour/domain_port.rb +11 -20
  67. data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
  68. data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
  69. data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
  70. data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
  71. data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
  72. data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
  73. data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
  74. data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
  75. data/lib/hecks/bluebook/capabilities.rb +17 -49
  76. data/lib/hecks/bluebook/chapter.rb +16 -50
  77. data/lib/hecks/bluebook/command.rb +23 -81
  78. data/lib/hecks/bluebook/domain_port.rb +49 -67
  79. data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
  80. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
  81. data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
  82. data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
  83. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +96 -708
  84. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +63 -169
  85. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +3 -1
  86. data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
  87. data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
  88. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +42 -89
  89. data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
  90. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
  91. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +148 -197
  92. data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
  93. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
  94. data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
  95. data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
  96. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
  97. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
  98. data/lib/hecks/bluebook/dsl/query_builder.rb +38 -43
  99. data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
  100. data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
  101. data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
  102. data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
  103. data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
  104. data/lib/hecks/bluebook/dsl/world_builder.rb +46 -111
  105. data/lib/hecks/bluebook/entity.rb +13 -71
  106. data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
  107. data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
  108. data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
  109. data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
  110. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
  111. data/lib/hecks/bluebook/expression/resolver.rb +39 -661
  112. data/lib/hecks/bluebook/hexagon.rb +18 -33
  113. data/lib/hecks/bluebook/lifecycle.rb +5 -16
  114. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
  115. data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
  116. data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
  117. data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
  118. data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
  119. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -176
  120. data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
  121. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -306
  122. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
  123. data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
  124. data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
  125. data/lib/hecks/bluebook/meta_validator.rb +87 -352
  126. data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
  127. data/lib/hecks/bluebook/model_check.rb +122 -596
  128. data/lib/hecks/bluebook/pattern_subset.rb +49 -69
  129. data/lib/hecks/bluebook/process_manager.rb +13 -83
  130. data/lib/hecks/bluebook/project_loader.rb +3 -39
  131. data/lib/hecks/bluebook/project_register.rb +12 -60
  132. data/lib/hecks/bluebook/query.rb +27 -51
  133. data/lib/hecks/bluebook/read_model.rb +57 -81
  134. data/lib/hecks/bluebook/reference.rb +7 -41
  135. data/lib/hecks/bluebook/smoke_test.rb +9 -99
  136. data/lib/hecks/bluebook/synthesizer.rb +13 -62
  137. data/lib/hecks/bluebook/translation.rb +26 -62
  138. data/lib/hecks/bluebook/value_object.rb +11 -36
  139. data/lib/hecks/bluebook.rb +5 -22
  140. data/lib/hecks/cache_dir.rb +4 -23
  141. data/lib/hecks/canonical_json.rb +30 -0
  142. data/lib/hecks/chapters.rb +102 -0
  143. data/lib/hecks/cli/behaviors.rb +61 -0
  144. data/lib/hecks/cli/canonicalise.rb +25 -0
  145. data/lib/hecks/cli/check_engine_agreement.rb +32 -0
  146. data/lib/hecks/cli/check_era.rb +88 -0
  147. data/lib/hecks/cli/console.rb +66 -0
  148. data/lib/hecks/cli/deploy_template_diff.rb +40 -0
  149. data/lib/hecks/cli/doc_coverage.rb +32 -0
  150. data/lib/hecks/cli/document.rb +5 -23
  151. data/lib/hecks/cli/expression_projection.rb +41 -0
  152. data/lib/hecks/cli/follow.rb +88 -0
  153. data/lib/hecks/cli/history.rb +44 -0
  154. data/lib/hecks/cli/ir.rb +4 -6
  155. data/lib/hecks/cli/mcp.rb +5 -6
  156. data/lib/hecks/cli/model_check.rb +24 -88
  157. data/lib/hecks/cli/pattern_cases.rb +47 -0
  158. data/lib/hecks/cli/present.rb +39 -0
  159. data/lib/hecks/cli/project_cli.rb +223 -64
  160. data/lib/hecks/cli/project_diagrams.rb +4 -10
  161. data/lib/hecks/cli/project_glossary.rb +44 -0
  162. data/lib/hecks/cli/reference.rb +46 -0
  163. data/lib/hecks/cli/refresh_projections.rb +44 -0
  164. data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +150 -0
  165. data/lib/hecks/cli/release.rb +70 -0
  166. data/lib/hecks/cli/release_gem.rb +59 -0
  167. data/lib/hecks/cli/rspec_io_parallel_files.rb +137 -0
  168. data/lib/hecks/cli/rspec_shard_files.rb +66 -0
  169. data/lib/hecks/cli/run.rb +15 -61
  170. data/lib/hecks/cli/seed_semantics_corpus.rb +71 -0
  171. data/lib/hecks/cli/serve_query_ir_mcp.rb +30 -0
  172. data/lib/hecks/cli/shape.rb +70 -0
  173. data/lib/hecks/cli/smoke_http.rb +230 -0
  174. data/lib/hecks/cli/smoke_test.rb +7 -19
  175. data/lib/hecks/cli/spec_example.rb +27 -0
  176. data/lib/hecks/cli/statements.rb +32 -0
  177. data/lib/hecks/cli/stores.rb +4 -6
  178. data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
  179. data/lib/hecks/cli.rb +216 -73
  180. data/lib/hecks/codemod.rb +324 -0
  181. data/lib/hecks/construct.rb +8 -34
  182. data/lib/hecks/corpus.rb +423 -0
  183. data/lib/hecks/deploy/bluebook/deploy.bluebook +617 -158
  184. data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -11
  185. data/lib/hecks/deploy/oidc.json +82 -2
  186. data/lib/hecks/doc/reference.rb +351 -0
  187. data/lib/hecks/doors/cli_door.rb +196 -0
  188. data/lib/hecks/doors/cli_runner.rb +297 -0
  189. data/lib/hecks/{facade → doors}/command_request.rb +14 -34
  190. data/lib/hecks/doors/handle.rb +206 -0
  191. data/lib/hecks/doors/json_door.rb +132 -0
  192. data/lib/hecks/doors/launcher_options.rb +129 -0
  193. data/lib/hecks/{cli → doors}/mcp_door.rb +25 -120
  194. data/lib/hecks/doors/mcp_door_scope.rb +97 -0
  195. data/lib/hecks/doors/ruby_door/aggregate_door.rb +162 -0
  196. data/lib/hecks/doors/ruby_door/chapter.rb +72 -0
  197. data/lib/hecks/doors/ruby_door.rb +77 -0
  198. data/lib/hecks/doors.rb +61 -0
  199. data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
  200. data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
  201. data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
  202. data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
  203. data/lib/hecks/embryonaut_bluebook.rb +5 -72
  204. data/lib/hecks/engine_agreement.rb +156 -0
  205. data/lib/hecks/facade.rb +23 -51
  206. data/lib/hecks/forms/app.rb +21 -76
  207. data/lib/hecks/forms/banking_presentation.rb +50 -0
  208. data/lib/hecks/forms/command_form_renderer.rb +10 -29
  209. data/lib/hecks/forms/field_renderer.rb +17 -156
  210. data/lib/hecks/forms/field_shape.rb +31 -222
  211. data/lib/hecks/forms/html.rb +12 -47
  212. data/lib/hecks/forms/index_renderer.rb +1 -4
  213. data/lib/hecks/forms/page.rb +3 -9
  214. data/lib/hecks/forms/params.rb +14 -60
  215. data/lib/hecks/forms/port_argument.rb +2 -19
  216. data/lib/hecks/forms/query_form_renderer.rb +4 -79
  217. data/lib/hecks/forms/record_renderer.rb +8 -75
  218. data/lib/hecks/forms/record_table.rb +7 -50
  219. data/lib/hecks/forms/reference_options.rb +3 -30
  220. data/lib/hecks/forms/value_object_shape.rb +8 -35
  221. data/lib/hecks/forms.rb +5 -33
  222. data/lib/hecks/fqn.rb +5 -12
  223. data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
  224. data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
  225. data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
  226. data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
  227. data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
  228. data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
  229. data/lib/hecks/framework.rb +11 -80
  230. data/lib/hecks/freezer.rb +5 -39
  231. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +393 -0
  232. data/lib/hecks/fuzzing/combination_miner.rb +86 -0
  233. data/lib/hecks/fuzzing/concurrent_dispatch.rb +214 -0
  234. data/lib/hecks/fuzzing/coverage_campaign.rb +143 -0
  235. data/lib/hecks/fuzzing/differential.rb +156 -0
  236. data/lib/hecks/fuzzing/domain_generator.rb +615 -0
  237. data/lib/hecks/fuzzing/era_boundary.rb +71 -0
  238. data/lib/hecks/fuzzing/form_census.rb +136 -0
  239. data/lib/hecks/fuzzing/generated_domain_check.rb +93 -0
  240. data/lib/hecks/fuzzing/invalid_value_generator.rb +64 -0
  241. data/lib/hecks/fuzzing/isolated_boot.rb +301 -0
  242. data/lib/hecks/fuzzing/nondeterministic.rb +51 -0
  243. data/lib/hecks/fuzzing/outside_world.rb +45 -0
  244. data/lib/hecks/fuzzing/persistence_parity.rb +102 -0
  245. data/lib/hecks/fuzzing/properties/corrections.rb +88 -0
  246. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +314 -0
  247. data/lib/hecks/fuzzing/properties/guards.rb +190 -0
  248. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +300 -0
  249. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +93 -0
  250. data/lib/hecks/fuzzing/properties/outbox.rb +89 -0
  251. data/lib/hecks/fuzzing/properties/querying.rb +175 -0
  252. data/lib/hecks/fuzzing/properties.rb +162 -0
  253. data/lib/hecks/fuzzing/qa_settings.rb +123 -0
  254. data/lib/hecks/fuzzing/replay.rb +505 -0
  255. data/lib/hecks/fuzzing/rotation_priority.rb +48 -0
  256. data/lib/hecks/fuzzing/rust_gap_manifest.rb +108 -0
  257. data/lib/hecks/fuzzing/self_consistency.rb +339 -0
  258. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +385 -0
  259. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +132 -0
  260. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +95 -0
  261. data/lib/hecks/fuzzing/sequence_generator/picker.rb +77 -0
  262. data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +109 -0
  263. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +237 -0
  264. data/lib/hecks/fuzzing/sequence_generator.rb +189 -0
  265. data/lib/hecks/fuzzing/shrinker.rb +166 -0
  266. data/lib/hecks/fuzzing/structural_skips.rb +33 -0
  267. data/lib/hecks/fuzzing/sweep_depth.rb +43 -0
  268. data/lib/hecks/fuzzing/target_capabilities.rb +163 -0
  269. data/lib/hecks/fuzzing/value_generator.rb +216 -0
  270. data/lib/hecks/fuzzing.rb +23 -0
  271. data/lib/hecks/grammar/evolve.rb +336 -0
  272. data/lib/hecks/grammar/expression.bluebook +15 -40
  273. data/lib/hecks/grammar/translation.bluebook +3 -6
  274. data/lib/hecks/grammar.rb +16 -41
  275. data/lib/hecks/hecks/adapters/codebase/codemods.rb +45 -0
  276. data/lib/hecks/hecks/adapters/codebase/conformance.rb +71 -0
  277. data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +202 -0
  278. data/lib/hecks/hecks/adapters/codebase/gem_registry.rb +80 -0
  279. data/lib/hecks/hecks/adapters/codebase/kernel_tables.rb +54 -0
  280. data/lib/hecks/hecks/adapters/codebase/language.rb +240 -0
  281. data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +102 -0
  282. data/lib/hecks/hecks/adapters/codebase/publishing.rb +142 -0
  283. data/lib/hecks/hecks/adapters/codebase/regeneration.rb +67 -0
  284. data/lib/hecks/hecks/adapters/codebase/release_facts.rb +90 -0
  285. data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +83 -0
  286. data/lib/hecks/hecks/adapters/codebase/secret_vault.rb +36 -0
  287. data/lib/hecks/hecks/adapters/codebase/source_tree.adapter +7 -0
  288. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +189 -0
  289. data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +71 -0
  290. data/lib/hecks/hecks/adapters/codebase/style.rb +171 -0
  291. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +55 -0
  292. data/lib/hecks/hecks/adapters/codebase/test_suite.rb +165 -0
  293. data/lib/hecks/hecks/adapters/codebase/tree.rb +111 -0
  294. data/lib/hecks/hecks/adapters/console_capture.rb +79 -0
  295. data/lib/hecks/hecks/adapters/deploy_toolchain.adapter +7 -0
  296. data/lib/hecks/hecks/adapters/deploy_toolchain.rb +108 -0
  297. data/lib/hecks/hecks/adapters/git.adapter +7 -0
  298. data/lib/hecks/hecks/adapters/git.rb +102 -0
  299. data/lib/hecks/hecks/adapters/host_http.adapter +7 -0
  300. data/lib/hecks/hecks/adapters/host_http.rb +65 -0
  301. data/lib/hecks/hecks/adapters/in_process_boot.adapter +7 -0
  302. data/lib/hecks/hecks/adapters/in_process_boot.rb +197 -0
  303. data/lib/hecks/hecks/adapters/in_process_operations.rb +202 -0
  304. data/lib/hecks/hecks/adapters/journal_store/changes.rb +143 -0
  305. data/lib/hecks/hecks/adapters/journal_store/compaction.rb +145 -0
  306. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +132 -0
  307. data/lib/hecks/hecks/adapters/journal_store/examination.rb +135 -0
  308. data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +163 -0
  309. data/lib/hecks/hecks/adapters/journal_store/readings.rb +187 -0
  310. data/lib/hecks/hecks/adapters/journal_store.adapter +7 -0
  311. data/lib/hecks/hecks/adapters/journal_store.rb +64 -0
  312. data/lib/hecks/hecks/adapters/local_files.adapter +7 -0
  313. data/lib/hecks/hecks/adapters/local_files.rb +46 -0
  314. data/lib/hecks/hecks/adapters/pg_admin.adapter +7 -0
  315. data/lib/hecks/hecks/adapters/pg_admin.rb +245 -0
  316. data/lib/hecks/hecks/adapters/process_pool.adapter +7 -0
  317. data/lib/hecks/hecks/adapters/process_pool.rb +119 -0
  318. data/lib/hecks/hecks/adapters/rust_toolchain.adapter +7 -0
  319. data/lib/hecks/hecks/adapters/rust_toolchain.rb +179 -0
  320. data/lib/hecks/hecks/adapters/rust_workspace.rb +150 -0
  321. data/lib/hecks/hecks/adapters/shell.adapter +7 -0
  322. data/lib/hecks/hecks/adapters/shell.rb +49 -0
  323. data/lib/hecks/hecks/adapters/terminal.adapter +7 -0
  324. data/lib/hecks/hecks/adapters/terminal.rb +74 -0
  325. data/lib/hecks/hecks/codebase.behaviors +172 -0
  326. data/lib/hecks/hecks/codebase.bluebook +2453 -0
  327. data/lib/hecks/hecks/context_map.hecksagon +13 -0
  328. data/lib/hecks/hecks/custodian.behaviors +179 -0
  329. data/lib/hecks/hecks/custodian.bluebook +1847 -0
  330. data/lib/hecks/hecks/deploy.behaviors +74 -0
  331. data/lib/hecks/hecks/deploy.world +12 -0
  332. data/lib/hecks/hecks/environments/memory.world +10 -0
  333. data/lib/hecks/hecks/governance.world +7 -0
  334. data/lib/hecks/hecks/hecks.behaviors +62 -0
  335. data/lib/hecks/hecks/hecks.bluebook +124 -0
  336. data/lib/hecks/hecks/hecks.hecksagon +390 -0
  337. data/lib/hecks/hecks/hecks.world +42 -0
  338. data/lib/hecks/ir.rb +14 -83
  339. data/lib/hecks/kernel_capabilities.rb +194 -0
  340. data/lib/hecks/language/adapter.bluebook +2 -7
  341. data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
  342. data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
  343. data/lib/hecks/language/bluebook/bluebook.bluebook +26 -83
  344. data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
  345. data/lib/hecks/language/bluebook/command.bluebook +27 -144
  346. data/lib/hecks/language/bluebook/entity.bluebook +24 -97
  347. data/lib/hecks/language/bluebook/policy.bluebook +16 -67
  348. data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
  349. data/lib/hecks/language/bluebook/projection.bluebook +126 -60
  350. data/lib/hecks/language/bluebook/query.bluebook +19 -43
  351. data/lib/hecks/language/bluebook/shape.bluebook +23 -73
  352. data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
  353. data/lib/hecks/language/bluebook/vocabulary.bluebook +83 -198
  354. data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
  355. data/lib/hecks/language/hecksagon/domain_port.bluebook +14 -19
  356. data/lib/hecks/language/hecksagon/hecksagon.bluebook +26 -25
  357. data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
  358. data/lib/hecks/language/oidc.json +35 -0
  359. data/lib/hecks/language/port.bluebook +4 -17
  360. data/lib/hecks/language/translation/translation.bluebook +3 -9
  361. data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
  362. data/lib/hecks/language/world/wiring.bluebook +1 -3
  363. data/lib/hecks/language/world/world.bluebook +5 -7
  364. data/lib/hecks/literal.rb +8 -50
  365. data/lib/hecks/mcp_stdio_guard.rb +4 -41
  366. data/lib/hecks/naming.rb +29 -137
  367. data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
  368. data/lib/hecks/persistence_legacy_fixture.rb +113 -0
  369. data/lib/hecks/ports/access_control.rb +7 -23
  370. data/lib/hecks/ports/agent/answers.rb +5 -23
  371. data/lib/hecks/ports/agent.rb +47 -172
  372. data/lib/hecks/ports/authentication.rb +12 -39
  373. data/lib/hecks/ports/authorization.rb +16 -43
  374. data/lib/hecks/ports/clock.rb +5 -45
  375. data/lib/hecks/ports/extraction.rb +7 -12
  376. data/lib/hecks/ports/identity_assignment.rb +8 -29
  377. data/lib/hecks/ports/identity_generation.rb +6 -29
  378. data/lib/hecks/ports/identity_resolution.rb +2 -10
  379. data/lib/hecks/ports/key_vault.rb +9 -45
  380. data/lib/hecks/ports/persistence/append_only.rb +61 -64
  381. data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
  382. data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
  383. data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
  384. data/lib/hecks/ports/persistence/plugin.rb +13 -42
  385. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +44 -144
  386. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
  387. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +20 -85
  388. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
  389. data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +18 -24
  390. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
  391. data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
  392. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
  393. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
  394. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
  395. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
  396. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
  397. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
  398. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +19 -76
  399. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
  400. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
  401. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
  402. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
  403. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
  404. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +43 -127
  405. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
  406. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +131 -555
  407. data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
  408. data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +227 -0
  409. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
  410. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
  411. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
  412. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
  413. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
  414. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +50 -47
  415. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
  416. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
  417. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
  418. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
  419. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
  420. data/lib/hecks/ports/persistence/plugins/era/translation.rb +1 -0
  421. data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
  422. data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
  423. data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
  424. data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
  425. data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
  426. data/lib/hecks/ports/persistence/state_codec.rb +47 -108
  427. data/lib/hecks/ports/persistence.rb +7 -14
  428. data/lib/hecks/ports/projection.rb +42 -84
  429. data/lib/hecks/ports/query/in_memory.rb +10 -58
  430. data/lib/hecks/ports/query/ordering.rb +11 -32
  431. data/lib/hecks/ports/query.rb +14 -37
  432. data/lib/hecks/ports.rb +2 -8
  433. data/lib/hecks/projection_files.rb +285 -0
  434. data/lib/hecks/projections/bootstrap_table.rb +12 -44
  435. data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
  436. data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
  437. data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
  438. data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
  439. data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
  440. data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
  441. data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
  442. data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
  443. data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
  444. data/lib/hecks/projections/deploy/fargate.rb +40 -207
  445. data/lib/hecks/projections/deploy/lambda.rb +191 -708
  446. data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
  447. data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
  448. data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
  449. data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
  450. data/lib/hecks/projections/deploy/preview/script.rb +2 -14
  451. data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
  452. data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
  453. data/lib/hecks/projections/deploy/preview/template.rb +3 -59
  454. data/lib/hecks/projections/deploy/preview.rb +2 -67
  455. data/lib/hecks/projections/deploy/scripts/deploy-service.sh.tmpl +1 -1
  456. data/lib/hecks/projections/deploy/scripts/expected-era.header +1 -1
  457. data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +3 -3
  458. data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
  459. data/lib/hecks/projections/deploy/scripts/smoke-after-deploy.sh.tmpl +1 -1
  460. data/lib/hecks/projections/deploy/scripts.rb +4 -57
  461. data/lib/hecks/projections/deploy/shared.rb +48 -147
  462. data/lib/hecks/projections/deploy/smoke.rb +4 -61
  463. data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
  464. data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
  465. data/lib/hecks/projections/deploy/template_diff.rb +5 -57
  466. data/lib/hecks/projections/diagrams.rb +22 -584
  467. data/lib/hecks/projections/glossary/html.rb +14 -130
  468. data/lib/hecks/projections/glossary/markdown.rb +8 -69
  469. data/lib/hecks/projections/glossary/mermaid.rb +9 -66
  470. data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
  471. data/lib/hecks/projections/glossary/sentences.rb +14 -159
  472. data/lib/hecks/projections/glossary.rb +30 -222
  473. data/lib/hecks/projections/ir.rb +3 -10
  474. data/lib/hecks/projections/model/deviations.rb +16 -43
  475. data/lib/hecks/projections/model.rb +12 -51
  476. data/lib/hecks/projections/oidc.rb +12 -56
  477. data/lib/hecks/projections/parser_table.rb +13 -32
  478. data/lib/hecks/projections/reference.rb +4 -18
  479. data/lib/hecks/projections/rust_vocabulary.rb +13 -251
  480. data/lib/hecks/projections/shape.rb +3 -29
  481. data/lib/hecks/projections/statements.rb +7 -86
  482. data/lib/hecks/projections/vocabulary.rb +6 -22
  483. data/lib/hecks/projections.rb +2 -16
  484. data/lib/hecks/projector/cli_projector.rb +154 -400
  485. data/lib/hecks/projector/docs_projector.rb +10 -201
  486. data/lib/hecks/projector/exporter.rb +42 -134
  487. data/lib/hecks/projector/ir_projector.rb +2 -9
  488. data/lib/hecks/projector/narrate_projector.rb +15 -189
  489. data/lib/hecks/projector/target.rb +13 -76
  490. data/lib/hecks/projector.rb +30 -121
  491. data/lib/hecks/quality_control/adapters/agent.adapter +7 -0
  492. data/lib/hecks/quality_control/adapters/agent.rb +58 -0
  493. data/lib/hecks/quality_control/adapters/angle_tools.adapter +7 -0
  494. data/lib/hecks/quality_control/adapters/angle_tools.rb +15 -0
  495. data/lib/hecks/quality_control/adapters/clearance_recorder.rb +36 -0
  496. data/lib/hecks/quality_control/adapters/clearance_tools.adapter +7 -0
  497. data/lib/hecks/quality_control/adapters/clearance_tools.rb +17 -0
  498. data/lib/hecks/quality_control/adapters/git_pr.adapter +7 -0
  499. data/lib/hecks/quality_control/adapters/git_pr.rb +226 -0
  500. data/lib/hecks/quality_control/adapters/github_checks.adapter +9 -0
  501. data/lib/hecks/quality_control/adapters/github_checks.rb +83 -0
  502. data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +56 -0
  503. data/lib/hecks/quality_control/adapters/github_issues.adapter +7 -0
  504. data/lib/hecks/quality_control/adapters/github_issues.rb +49 -0
  505. data/lib/hecks/quality_control/adapters/qa_tool.rb +59 -0
  506. data/lib/hecks/quality_control/adapters/sweep_tools.adapter +7 -0
  507. data/lib/hecks/quality_control/adapters/sweep_tools.rb +51 -0
  508. data/lib/hecks/quality_control/adapters/target_tools.adapter +7 -0
  509. data/lib/hecks/quality_control/adapters/target_tools.rb +43 -0
  510. data/lib/hecks/quality_control/cli/child.rb +45 -0
  511. data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +45 -0
  512. data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +248 -0
  513. data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +163 -0
  514. data/lib/hecks/quality_control/cli/qa_generated_domains.rb +450 -0
  515. data/lib/hecks/quality_control/cli/qa_log_bug.rb +195 -0
  516. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +220 -0
  517. data/lib/hecks/quality_control/cli/qa_open_pr.rb +305 -0
  518. data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +154 -0
  519. data/lib/hecks/quality_control/cli/qa_postgres_role.rb +159 -0
  520. data/lib/hecks/quality_control/cli/qa_pr_check.rb +232 -0
  521. data/lib/hecks/quality_control/cli/qa_seed_angles.rb +142 -0
  522. data/lib/hecks/quality_control/cli/qa_seed_targets.rb +69 -0
  523. data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +280 -0
  524. data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +329 -0
  525. data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +92 -0
  526. data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +117 -0
  527. data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +175 -0
  528. data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +60 -0
  529. data/lib/hecks/quality_control/cli/qa_sweep.rb +611 -0
  530. data/lib/hecks/quality_control/cli/qa_tick.rb +274 -0
  531. data/lib/hecks/quality_control/quality_control.bluebook +2224 -0
  532. data/lib/hecks/quality_control/quality_control.hecksagon +13 -0
  533. data/lib/hecks/quality_control/quality_control.ports.hecksagon +54 -0
  534. data/lib/hecks/query_ir.rb +346 -0
  535. data/lib/hecks/query_ir_mcp.rb +198 -0
  536. data/lib/hecks/query_specification/common/comparators.rb +5 -26
  537. data/lib/hecks/query_specification/common/comparison.rb +35 -143
  538. data/lib/hecks/query_specification/common/dsl.rb +8 -24
  539. data/lib/hecks/query_specification/common/null_policy.rb +20 -70
  540. data/lib/hecks/query_specification/common/options.rb +2 -6
  541. data/lib/hecks/query_specification/common/where_clause.rb +2 -10
  542. data/lib/hecks/query_specification/field_path.rb +37 -77
  543. data/lib/hecks/query_specification/hop_path.rb +12 -76
  544. data/lib/hecks/release/gem_pin.rb +2 -26
  545. data/lib/hecks/release/runner/ci_publisher.rb +5 -8
  546. data/lib/hecks/release/runner/clean_tree.rb +42 -0
  547. data/lib/hecks/release/runner/commands.rb +2 -4
  548. data/lib/hecks/release/runner/console.rb +6 -0
  549. data/lib/hecks/release/runner/gem_publisher.rb +15 -9
  550. data/lib/hecks/release/runner/npm_publisher.rb +9 -53
  551. data/lib/hecks/release/runner/preflight.rb +29 -20
  552. data/lib/hecks/release/runner/published.rb +8 -26
  553. data/lib/hecks/release/runner/tagger.rb +31 -23
  554. data/lib/hecks/release/runner.rb +60 -38
  555. data/lib/hecks/rendering.rb +4 -26
  556. data/lib/hecks/router/namespace_installer.rb +15 -39
  557. data/lib/hecks/router.rb +4 -8
  558. data/lib/hecks/runtime/adapter_lookup.rb +124 -0
  559. data/lib/hecks/runtime/aggregate_lock.rb +8 -33
  560. data/lib/hecks/runtime/boot_gates.rb +3 -18
  561. data/lib/hecks/runtime/caller.rb +19 -59
  562. data/lib/hecks/runtime/capability_graph.rb +5 -21
  563. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
  564. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +27 -160
  565. data/lib/hecks/runtime/command_interpreter.rb +124 -306
  566. data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
  567. data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
  568. data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
  569. data/lib/hecks/runtime/command_rules/emission.rb +8 -21
  570. data/lib/hecks/runtime/command_rules/references.rb +23 -202
  571. data/lib/hecks/runtime/dependency_planning.rb +50 -104
  572. data/lib/hecks/runtime/dispatcher.rb +134 -243
  573. data/lib/hecks/runtime/entity_element.rb +40 -462
  574. data/lib/hecks/runtime/entity_interpreter.rb +64 -219
  575. data/lib/hecks/runtime/errors.rb +32 -115
  576. data/lib/hecks/runtime/event.rb +3 -25
  577. data/lib/hecks/runtime/identity.rb +18 -154
  578. data/lib/hecks/runtime/instance.rb +18 -150
  579. data/lib/hecks/runtime/interpreting.rb +14 -70
  580. data/lib/hecks/runtime/invocation.rb +28 -164
  581. data/lib/hecks/runtime/loader.rb +109 -194
  582. data/lib/hecks/runtime/outbox.rb +39 -262
  583. data/lib/hecks/runtime/policy_interpreter.rb +43 -202
  584. data/lib/hecks/runtime/port_operation_interpreter.rb +28 -97
  585. data/lib/hecks/runtime/query_interpreter.rb +122 -187
  586. data/lib/hecks/runtime/reaction_invocation.rb +36 -138
  587. data/lib/hecks/runtime/reaction_outcome.rb +89 -0
  588. data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
  589. data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
  590. data/lib/hecks/runtime/reference_hop.rb +8 -81
  591. data/lib/hecks/runtime/refusal_wording.rb +28 -87
  592. data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
  593. data/lib/hecks/runtime/registry/verification.rb +213 -227
  594. data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
  595. data/lib/hecks/runtime/registry.rb +156 -247
  596. data/lib/hecks/runtime/remote_dispatcher.rb +68 -154
  597. data/lib/hecks/runtime/routing.rb +4 -15
  598. data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
  599. data/lib/hecks/runtime/saga_interpreter.rb +79 -263
  600. data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
  601. data/lib/hecks/runtime/tenant_check.rb +6 -68
  602. data/lib/hecks/runtime/tenant_scope.rb +3 -28
  603. data/lib/hecks/runtime/value/admission.rb +16 -67
  604. data/lib/hecks/runtime/value/coercion.rb +162 -760
  605. data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
  606. data/lib/hecks/runtime/value/field_checks.rb +172 -0
  607. data/lib/hecks/runtime/value.rb +15 -84
  608. data/lib/hecks/runtime.rb +35 -69
  609. data/lib/hecks/rust_build/conformance.rb +158 -0
  610. data/lib/hecks/rust_build/conformance_fuzz.rb +71 -0
  611. data/lib/hecks/rust_build/coverage.rb +218 -0
  612. data/lib/hecks/rust_build/native_build.rb +124 -0
  613. data/lib/hecks/rust_build/project_rust/root_mod.rb +120 -0
  614. data/lib/hecks/rust_build/project_rust.rb +332 -0
  615. data/lib/hecks/rust_build/wasm.rb +105 -0
  616. data/lib/hecks/rust_build/wasm_browser.rb +113 -0
  617. data/lib/hecks/rust_build.rb +144 -0
  618. data/lib/hecks/storehouse.rb +155 -582
  619. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +10 -34
  620. data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
  621. data/lib/hecks/three_zero/forms.yml +127 -0
  622. data/lib/hecks/three_zero.rb +12 -0
  623. data/lib/hecks/tools/argument_gate_matrix.rb +316 -0
  624. data/lib/hecks/tools/comment_style.rb +1070 -0
  625. data/lib/hecks/tools/corpus_report.rb +87 -0
  626. data/lib/hecks/tools/deploy_recipe.rb +255 -0
  627. data/lib/hecks/tools/deploy_recipe_lint.rb +282 -0
  628. data/lib/hecks/tools/drop_implicit_append_fields.rb +95 -0
  629. data/lib/hecks/tools/era_projection_backfill.rb +94 -0
  630. data/lib/hecks/tools/era_reattest.rb +146 -0
  631. data/lib/hecks/tools/evolve_run.rb +189 -0
  632. data/lib/hecks/tools/fuzz_sweep.rb +373 -0
  633. data/lib/hecks/tools/heki_compaction.rb +100 -0
  634. data/lib/hecks/tools/hoist_local_givens.rb +246 -0
  635. data/lib/hecks/tools/journal_compaction.rb +89 -0
  636. data/lib/hecks/tools/oidc_manifests.rb +70 -0
  637. data/lib/hecks/tools/query_ir_run.rb +81 -0
  638. data/lib/hecks/tools/regeneration_run.rb +166 -0
  639. data/lib/hecks/tools/rust_comment_style.rb +642 -0
  640. data/lib/hecks/tools/sequence_script.rb +62 -0
  641. data/lib/hecks/tools/tail_merge.rb +117 -0
  642. data/lib/hecks/tools/tenant_provisioning.rb +142 -0
  643. data/lib/hecks/tools/translation_audit.rb +208 -0
  644. data/lib/hecks/tools/translation_scaffold.rb +131 -0
  645. data/lib/hecks/tools.rb +86 -0
  646. data/lib/hecks/vendoring/git_environment.rb +2 -8
  647. data/lib/hecks/vendoring/git_source.rb +4 -10
  648. data/lib/hecks/vendoring.rb +7 -46
  649. data/lib/hecks/version.rb +3 -14
  650. data/lib/hecks.rb +52 -90
  651. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
  652. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
  653. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
  654. data/qa/settings.yml +66 -0
  655. data/rust/.cargo/config.toml +6 -0
  656. data/rust/.gitignore +2 -0
  657. data/rust/Cargo.lock +54 -0
  658. data/rust/Cargo.toml +61 -0
  659. data/rust/build/.cargo/config.toml +3 -0
  660. data/rust/build/.gitignore +1 -0
  661. data/rust/build/Cargo.lock +7 -0
  662. data/rust/build/Cargo.toml +19 -0
  663. data/rust/build/src/build_artifact.rs +47 -0
  664. data/rust/build/src/cargo_sync.rs +248 -0
  665. data/rust/build/src/json.rs +421 -0
  666. data/rust/build/src/lineage_pass.rs +285 -0
  667. data/rust/build/src/main.rs +51 -0
  668. data/rust/build/src/optional_pass.rs +150 -0
  669. data/rust/build/src/pipeline.rs +264 -0
  670. data/rust/build/src/reserved_names.rs +76 -0
  671. data/rust/build/src/resolve.rs +124 -0
  672. data/rust/build/src/root.rs +25 -0
  673. data/rust/build/src/sidecars.rs +73 -0
  674. data/rust/build/src/subprocess.rs +51 -0
  675. data/rust/build/src/tmp.rs +31 -0
  676. data/rust/codegen/.cargo/config.toml +3 -0
  677. data/rust/codegen/.gitignore +1 -0
  678. data/rust/codegen/Cargo.lock +7 -0
  679. data/rust/codegen/Cargo.toml +20 -0
  680. data/rust/codegen/src/attr.rs +32 -0
  681. data/rust/codegen/src/bridging.rs +481 -0
  682. data/rust/codegen/src/commands.rs +1226 -0
  683. data/rust/codegen/src/constraints.rs +109 -0
  684. data/rust/codegen/src/dependency_planning.rs +209 -0
  685. data/rust/codegen/src/domain_generator.rs +1288 -0
  686. data/rust/codegen/src/exemplar.rs +230 -0
  687. data/rust/codegen/src/expr_emitter.rs +87 -0
  688. data/rust/codegen/src/fielded.rs +192 -0
  689. data/rust/codegen/src/hecks_naming.rs +33 -0
  690. data/rust/codegen/src/json.rs +335 -0
  691. data/rust/codegen/src/json_codec.rs +697 -0
  692. data/rust/codegen/src/literal.rs +207 -0
  693. data/rust/codegen/src/main.rs +290 -0
  694. data/rust/codegen/src/manifest.rs +227 -0
  695. data/rust/codegen/src/mutations.rs +784 -0
  696. data/rust/codegen/src/naming.rs +286 -0
  697. data/rust/codegen/src/ports.rs +208 -0
  698. data/rust/codegen/src/prelude.rs +116 -0
  699. data/rust/codegen/src/queries.rs +786 -0
  700. data/rust/codegen/src/reactions.rs +532 -0
  701. data/rust/codegen/src/read_models.rs +697 -0
  702. data/rust/codegen/src/reference_specs.rs +40 -0
  703. data/rust/codegen/src/registry.rs +966 -0
  704. data/rust/codegen/src/reserved_names.rs +76 -0
  705. data/rust/codegen/src/shared.rs +93 -0
  706. data/rust/codegen/src/skip_reason.rs +25 -0
  707. data/rust/codegen/src/types.rs +362 -0
  708. data/rust/host/.cargo/config.toml +3 -0
  709. data/rust/host/.gitignore +1 -0
  710. data/rust/host/Cargo.lock +4297 -0
  711. data/rust/host/Cargo.toml +61 -0
  712. data/rust/host/HECKS_RELEASE +1 -0
  713. data/rust/host/rds-ca-bundle.pem +2736 -0
  714. data/rust/host/src/api.rs +1596 -0
  715. data/rust/host/src/approval.rs +652 -0
  716. data/rust/host/src/auth.rs +1287 -0
  717. data/rust/host/src/bin/expr_harness.rs +46 -0
  718. data/rust/host/src/bin/lineage_harness.rs +119 -0
  719. data/rust/host/src/bin/mint_harness.rs +135 -0
  720. data/rust/host/src/checkout.rs +265 -0
  721. data/rust/host/src/dispatch.rs +1443 -0
  722. data/rust/host/src/expr_json.rs +1117 -0
  723. data/rust/host/src/field_hints.rs +52 -0
  724. data/rust/host/src/ir.rs +733 -0
  725. data/rust/host/src/journal.rs +874 -0
  726. data/rust/host/src/lambda_client.rs +378 -0
  727. data/rust/host/src/log.rs +147 -0
  728. data/rust/host/src/main.rs +474 -0
  729. data/rust/host/src/mint.rs +1865 -0
  730. data/rust/host/src/payments/keystore.rs +330 -0
  731. data/rust/host/src/payments/tests.rs +1400 -0
  732. data/rust/host/src/payments.rs +767 -0
  733. data/rust/host/src/presentation.rs +698 -0
  734. data/rust/host/src/presentation_write.rs +1431 -0
  735. data/rust/host/src/query_step.rs +149 -0
  736. data/rust/host/src/rate_limit.rs +904 -0
  737. data/rust/host/src/reference_transform.rs +241 -0
  738. data/rust/host/src/reference_validate.rs +338 -0
  739. data/rust/host/src/resend.rs +296 -0
  740. data/rust/host/src/secrets.rs +106 -0
  741. data/rust/host/src/server.rs +663 -0
  742. data/rust/host/src/storage_shape.rs +175 -0
  743. data/rust/host/src/test_pg.rs +40 -0
  744. data/rust/host/src/ui_schema.rs +1351 -0
  745. data/rust/host/src/wasm_runner.rs +191 -0
  746. data/rust/host/src/web/newsletter/cooldown.rs +126 -0
  747. data/rust/host/src/web/newsletter/tests.rs +104 -0
  748. data/rust/host/src/web/newsletter.rs +310 -0
  749. data/rust/host/src/web/newsletter_send.rs +357 -0
  750. data/rust/host/src/web/registrations.rs +1505 -0
  751. data/rust/host/src/web.rs +2937 -0
  752. data/rust/lsp/.gitignore +1 -0
  753. data/rust/lsp/Cargo.lock +7 -0
  754. data/rust/lsp/Cargo.toml +16 -0
  755. data/rust/lsp/README.md +133 -0
  756. data/rust/lsp/src/diagnostics.rs +165 -0
  757. data/rust/lsp/src/json.rs +385 -0
  758. data/rust/lsp/src/main.rs +399 -0
  759. data/rust/lsp/src/outline.rs +177 -0
  760. data/rust/lsp/src/rpc.rs +67 -0
  761. data/rust/parser/.cargo/config.toml +5 -0
  762. data/rust/parser/.gitignore +1 -0
  763. data/rust/parser/Cargo.lock +7 -0
  764. data/rust/parser/Cargo.toml +21 -0
  765. data/rust/parser/src/build/closed_sets.rs +27 -0
  766. data/rust/parser/src/build/identity.rs +276 -0
  767. data/rust/parser/src/build/mod.rs +12 -0
  768. data/rust/parser/src/build/naming.rs +141 -0
  769. data/rust/parser/src/build/pattern_subset.rs +161 -0
  770. data/rust/parser/src/build/query_derive.rs +72 -0
  771. data/rust/parser/src/build/query_inference.rs +269 -0
  772. data/rust/parser/src/build/query_options.rs +100 -0
  773. data/rust/parser/src/build/read_model.rs +94 -0
  774. data/rust/parser/src/build/references.rs +32 -0
  775. data/rust/parser/src/canonical.rs +114 -0
  776. data/rust/parser/src/diag.rs +55 -0
  777. data/rust/parser/src/emit.rs +953 -0
  778. data/rust/parser/src/expr/ast_json.rs +147 -0
  779. data/rust/parser/src/expr/evaluator.rs +81 -0
  780. data/rust/parser/src/expr/mod.rs +84 -0
  781. data/rust/parser/src/expr/resolver.rs +497 -0
  782. data/rust/parser/src/ir.rs +387 -0
  783. data/rust/parser/src/keywords.rs +585 -0
  784. data/rust/parser/src/lex.rs +662 -0
  785. data/rust/parser/src/main.rs +252 -0
  786. data/rust/parser/src/parse/aggregate.rs +612 -0
  787. data/rust/parser/src/parse/chapter.rs +517 -0
  788. data/rust/parser/src/parse/command.rs +637 -0
  789. data/rust/parser/src/parse/domain_port.rs +127 -0
  790. data/rust/parser/src/parse/entity.rs +527 -0
  791. data/rust/parser/src/parse/file.rs +67 -0
  792. data/rust/parser/src/parse/hecksagon.rs +231 -0
  793. data/rust/parser/src/parse/lifecycle.rs +162 -0
  794. data/rust/parser/src/parse/mod.rs +1262 -0
  795. data/rust/parser/src/parse/policy.rs +87 -0
  796. data/rust/parser/src/parse/process_manager.rs +305 -0
  797. data/rust/parser/src/parse/query.rs +100 -0
  798. data/rust/parser/src/parse/read_model.rs +214 -0
  799. data/rust/parser/src/parse/value_object.rs +250 -0
  800. data/rust/parser/src/ruby_value.rs +422 -0
  801. data/rust/project/bridging.rb +257 -0
  802. data/rust/project/commands.rb +877 -0
  803. data/rust/project/constraints.rb +86 -0
  804. data/rust/project/dependency_planning.rb +178 -0
  805. data/rust/project/domain_generator.rb +980 -0
  806. data/rust/project/exemplar.rb +148 -0
  807. data/rust/project/expr_emitter.rb +72 -0
  808. data/rust/project/fielded.rb +141 -0
  809. data/rust/project/json_codec.rb +641 -0
  810. data/rust/project/mutations.rb +721 -0
  811. data/rust/project/naming.rb +205 -0
  812. data/rust/project/ports.rb +65 -0
  813. data/rust/project/queries.rb +493 -0
  814. data/rust/project/reactions.rb +317 -0
  815. data/rust/project/read_models.rb +690 -0
  816. data/rust/project/reference_specs.rb +27 -0
  817. data/rust/project/registry.rb +396 -0
  818. data/rust/project/skip_reason.rb +29 -0
  819. data/rust/project/types.rb +225 -0
  820. data/rust/project/write_if_changed.rb +83 -0
  821. data/rust/project.rb +30 -0
  822. data/rust/project_rust_pipeline.rb +383 -0
  823. data/rust/src/exemplar/commands.rs +279 -0
  824. data/rust/src/exemplar/constraints.rs +18 -0
  825. data/rust/src/exemplar/fielded.rs +280 -0
  826. data/rust/src/exemplar/json.rs +277 -0
  827. data/rust/src/exemplar/mod.rs +17 -0
  828. data/rust/src/exemplar/mutations.rs +80 -0
  829. data/rust/src/exemplar/queries.rs +33 -0
  830. data/rust/src/exemplar/reactions.rs +88 -0
  831. data/rust/src/exemplar/read_models.rs +48 -0
  832. data/rust/src/exemplar/registry.rs +166 -0
  833. data/rust/src/exemplar/types.rs +44 -0
  834. data/rust/src/kernel/attribute_shapes/composite.rs +88 -0
  835. data/rust/src/kernel/attribute_shapes/list.rs +18 -0
  836. data/rust/src/kernel/attribute_shapes/mod.rs +44 -0
  837. data/rust/src/kernel/attribute_shapes/optional.rs +9 -0
  838. data/rust/src/kernel/attribute_shapes/scalar.rs +39 -0
  839. data/rust/src/kernel/cli.rs +585 -0
  840. data/rust/src/kernel/dispatch.rs +1090 -0
  841. data/rust/src/kernel/expr.rs +458 -0
  842. data/rust/src/kernel/expression_operators/arithmetic.rs +128 -0
  843. data/rust/src/kernel/expression_operators/comparison.rs +48 -0
  844. data/rust/src/kernel/expression_operators/enumeration.rs +232 -0
  845. data/rust/src/kernel/expression_operators/logical.rs +13 -0
  846. data/rust/src/kernel/expression_operators/membership.rs +18 -0
  847. data/rust/src/kernel/expression_operators/mod.rs +68 -0
  848. data/rust/src/kernel/expression_operators/pattern_match.rs +73 -0
  849. data/rust/src/kernel/expression_operators/positional.rs +126 -0
  850. data/rust/src/kernel/expression_operators/presence.rs +101 -0
  851. data/rust/src/kernel/expression_operators/sign_test.rs +16 -0
  852. data/rust/src/kernel/expression_operators/sized.rs +35 -0
  853. data/rust/src/kernel/expression_operators/text.rs +79 -0
  854. data/rust/src/kernel/expression_operators/to_string.rs +18 -0
  855. data/rust/src/kernel/json.rs +779 -0
  856. data/rust/src/kernel/mod.rs +133 -0
  857. data/rust/src/kernel/named_query.rs +219 -0
  858. data/rust/src/kernel/orchestrate.rs +1810 -0
  859. data/rust/src/kernel/pattern.rs +307 -0
  860. data/rust/src/kernel/query_comparators.rs +206 -0
  861. data/rust/src/kernel/query_ordering.rs +103 -0
  862. data/rust/src/kernel/read_model.rs +914 -0
  863. data/rust/src/kernel/reference_lookup.rs +149 -0
  864. data/rust/src/kernel/repository.rs +468 -0
  865. data/rust/src/kernel/routing.rs +612 -0
  866. data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +118 -0
  867. data/rust/src/kernel/vocab/entity_dispatch_order.rs +114 -0
  868. data/rust/src/kernel/vocab/field_hint.rs +70 -0
  869. data/rust/src/kernel/vocab/mod.rs +20 -0
  870. data/rust/src/kernel/vocab/query_comparator.rs +65 -0
  871. data/rust/src/kernel/vocab/refusal_template.rs +1592 -0
  872. data/rust/src/lib.rs +8 -0
  873. data/rust/src/main.rs +16 -0
  874. data/rust/web/.gitignore +1 -0
  875. data/rust/web/Cargo.lock +119 -0
  876. data/rust/web/Cargo.toml +18 -0
  877. data/rust/web/src/lib.rs +8 -0
  878. metadata +478 -12
  879. data/lib/hecks/facade/cli_door.rb +0 -178
  880. data/lib/hecks/facade/cli_runner.rb +0 -271
  881. data/lib/hecks/facade/handle.rb +0 -293
  882. data/lib/hecks/facade/json_door.rb +0 -247
  883. data/lib/hecks/facade/surface/aggregate_door.rb +0 -222
  884. data/lib/hecks/facade/surface/chapter.rb +0 -116
  885. data/lib/hecks/facade/surface.rb +0 -61
  886. data/lib/hecks/mcp_door_scope.rb +0 -176
@@ -8,28 +8,8 @@ module Hecks
8
8
  module Projections
9
9
  module Deploy
10
10
  module Preview
11
- # Renders `preview.yaml`, the CloudFormation template of one
12
- # per-branch preview stack.
13
- #
14
- # A separate template rather than conditions threaded through the main
15
- # one, so a preview can never put the main stack's live resources in a
16
- # change set. The two share a task shape and nothing else.
17
- #
18
- # ## What a preview owns
19
- #
20
- # Per branch: a cluster, service and task, a load balancer, one image
21
- # repository per container, a session secret, any secrets a container
22
- # declares, a log group, a CloudFront distribution (default hostname,
23
- # nothing cached) and a database name on the shared instance, created
24
- # by a one-shot task before the service starts.
25
- #
26
- # ## What it borrows and leaves out
27
- #
28
- # It attaches to the owner stack's VPC, subnets and compute security
29
- # group and connects to the shared database instance, through the same
30
- # `Owning*` parameters the main template takes for `database "Shared"`.
31
- # It has no alarms, no notifications, no warmer and no custom domain:
32
- # nobody should be paged for a preview.
11
+ # Renders `preview.yaml`, one per-branch preview stack's CloudFormation template.
12
+ # Kept separate from the main one, so a preview can never enter a change set against it.
33
13
  module Template
34
14
  CACHING_DISABLED = "4135ea2d-6df8-44a3-9df3-4b5a84be39ad".freeze
35
15
  ALL_VIEWER = "216adef6-5c7f-47e4-b989-5492eafa07d3".freeze
@@ -38,10 +18,6 @@ module Hecks
38
18
 
39
19
  module_function
40
20
 
41
- # Renders the whole template.
42
- #
43
- # @param settings [Settings] the resolved preview settings
44
- # @return [String] the CloudFormation YAML, ending in one newline
45
21
  def render(settings)
46
22
  [
47
23
  header(settings), parameters(settings),
@@ -50,13 +26,9 @@ module Hecks
50
26
  ].join("\n") << "\n"
51
27
  end
52
28
 
53
- # Renders the file's leading comment and template description.
54
- #
55
- # @param settings [Settings] the resolved preview settings
56
- # @return [String] the header block
57
29
  def header(settings)
58
30
  <<~YAML.chomp
59
- # GENERATED by bin/project_deploy - re-run it to refresh this file rather than
31
+ # GENERATED by hecks deploy project - re-run it to refresh this file rather than
60
32
  # hand-editing. Source: the `preview` block of the domain's deployed_to("AwsFargate").
61
33
  #
62
34
  # One stack per git branch, driven by preview.sh. A separate template from the main
@@ -75,10 +47,6 @@ module Hecks
75
47
  YAML
76
48
  end
77
49
 
78
- # Renders the parameters section.
79
- #
80
- # @param settings [Settings] the resolved preview settings
81
- # @return [String] the section, one image-tag parameter per container
82
50
  def parameters(settings)
83
51
  image_tags = settings.containers.map do |c|
84
52
  <<~YAML.chomp
@@ -90,9 +58,6 @@ module Hecks
90
58
  "Parameters:\n#{indent([base_parameters, *image_tags, desired_count_parameter].join("\n"), 2)}"
91
59
  end
92
60
 
93
- # Renders the parameters every preview takes: its name, database and the borrowed network.
94
- #
95
- # @return [String] the parameter blocks
96
61
  def base_parameters
97
62
  <<~YAML.chomp
98
63
  EnvName:
@@ -122,9 +87,6 @@ module Hecks
122
87
  YAML
123
88
  end
124
89
 
125
- # Renders the parameter `preview.sh` uses to start the stack at zero tasks.
126
- #
127
- # @return [String] the parameter block
128
90
  def desired_count_parameter
129
91
  <<~YAML.chomp
130
92
  # The repositories are created by this stack, so the first create has no image to
@@ -135,10 +97,6 @@ module Hecks
135
97
  YAML
136
98
  end
137
99
 
138
- # Collects every resource block of the template.
139
- #
140
- # @param settings [Settings] the resolved preview settings
141
- # @return [Array<String>] the resource blocks, in template order
142
100
  def resources(settings)
143
101
  [
144
102
  AccessYaml.secrets(settings), RoutingYaml.networking(settings), repositories(settings),
@@ -149,10 +107,6 @@ module Hecks
149
107
  ].flatten
150
108
  end
151
109
 
152
- # Renders one image repository per container, emptied when the stack is deleted.
153
- #
154
- # @param settings [Settings] the resolved preview settings
155
- # @return [Array<String>] the resource blocks
156
110
  def repositories(settings)
157
111
  settings.containers.map do |c|
158
112
  <<~YAML.chomp
@@ -165,10 +119,6 @@ module Hecks
165
119
  end
166
120
  end
167
121
 
168
- # Renders the cluster and the log group.
169
- #
170
- # @param settings [Settings] the resolved preview settings
171
- # @return [Array<String>] the two resource blocks
172
122
  def cluster_and_logs(settings)
173
123
  [
174
124
  <<~YAML.chomp,
@@ -187,9 +137,6 @@ module Hecks
187
137
  ]
188
138
  end
189
139
 
190
- # Renders the CDN distribution, which caches nothing.
191
- #
192
- # @return [String] the resource block
193
140
  def distribution
194
141
  <<~YAML.chomp
195
142
  # One behavior, nothing cached: a preview is for looking at a change, so no cache means
@@ -219,9 +166,6 @@ module Hecks
219
166
  YAML
220
167
  end
221
168
 
222
- # Renders the outputs `preview.sh` reads back.
223
- #
224
- # @return [String] the section
225
169
  def outputs
226
170
  <<~YAML.chomp
227
171
  Outputs:
@@ -5,73 +5,8 @@ require_relative "preview/script"
5
5
  module Hecks
6
6
  module Projections
7
7
  module Deploy
8
- # Per-branch preview stacks for a `deployed_to("AwsFargate")` domain: one
9
- # isolated copy of the stack per git branch, created and torn down by a
10
- # generated script.
11
- #
12
- # Opt-in. A domain with no `preview` setting gets exactly the files it
13
- # got before; `Fargate.call` asks `requested?` and merges in `call`'s
14
- # files only when the answer is yes.
15
- #
16
- # ## What is generated
17
- #
18
- # - `preview.yaml`: a separate CloudFormation template, so a preview never
19
- # appears in a change set against the live stack (see `Template`).
20
- # - `preview.sh`: `deploy` (create or update), `destroy`, `list`, `url`,
21
- # `name`, `ensure-database` and `login` (see `Script`).
22
- # - The database step is a one-shot task declared in `preview.yaml`
23
- # and run by `preview.sh`; there is no separate file, because the
24
- # instance is reachable only from inside the VPC.
25
- #
26
- # ## Settings
27
- #
28
- # ```ruby
29
- # deployed_to("AwsFargate") do
30
- # region "us-east-1"
31
- # preview do
32
- # containers [{ name: "web", port: 8080, host: true, default: true }]
33
- # end
34
- # end
35
- # ```
36
- #
37
- # `preview true` and a block with no settings accept every default. Keys:
38
- #
39
- # - `prefix`: stack, cluster, service and image repository name prefix.
40
- # Default `<stack_prefix>-<stack>-preview`.
41
- # - `alb_prefix`: load balancer name prefix, at most 11 characters.
42
- # Default the first 8 letters of the stack name plus `pv`.
43
- # - `owner_stack`: the stack whose VPC, subnets and compute security group
44
- # the preview attaches to. Default the `owner_stack` of a Shared main
45
- # stack, else the main stack.
46
- # - `database_stack`: the stack whose outputs name the shared database
47
- # instance. Default `owner_stack`.
48
- # - `database_endpoint_output`, `database_secret_output`: the output keys
49
- # holding the instance host and the master secret ARN. Defaults
50
- # `DatabaseEndpoint` and `DatabaseSecretArn`.
51
- # - `db_prefix`: a preview's database is `<db_prefix>_pv_<env>`. Default
52
- # the stack name, lowercased, at most 30 characters.
53
- # - `protected_databases`: names the database task refuses, added to the
54
- # main database, `postgres` and the two template databases. Default `[]`.
55
- # - `protected_branches`: branches `preview.sh` refuses. Default
56
- # `["main", "master"]`.
57
- # - `cpu`, `memory`: task size. Default the main stack's.
58
- # - `log_retention_days`: a value CloudWatch accepts. Default `7`.
59
- # - `session_cookie`: cookie name; sets `HECKS_SESSION_COOKIE` on the host
60
- # and is what `login` writes. Default the host's own default.
61
- # - `first_admin`: whether `preview.sh` signs the deployer up and offers
62
- # `login`. Default `true`.
63
- # - `signup_path`: the host route the signup posts to. Default `/signups`.
64
- # - `landing_path`: the page `login` points the browser at. Default `/`.
65
- # - `db_init_image`: image of the database task; needs `sh` and `psql`.
66
- # Default the public Postgres 16 alpine image.
67
- # - `containers`: the containers the preview task runs. Default the main
68
- # stack's container list; see `Containers` for the entry keys.
69
- #
70
- # ## Why a preview mints no era and needs no bastion
71
- #
72
- # The host mints era 1 itself on an empty database, and the database
73
- # task runs inside the VPC, so neither the main stack's bastion nor a
74
- # tunnel is involved.
8
+ # Per-branch preview stacks for a `deployed_to("AwsFargate")` domain, opt-in
9
+ # via a `preview` setting; the host mints era 1 itself, so no bastion is needed.
75
10
  module Preview
76
11
  module_function
77
12
 
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # GENERATED by bin/project_deploy -- re-run it to refresh this file rather
2
+ # GENERATED by hecks deploy project -- re-run it to refresh this file rather
3
3
  # than hand-editing. Settings come from the domain's deployed_to("AwsFargate")
4
4
  # block; see Hecks::Projections::Deploy::Scripts for each key.
5
5
  #
@@ -13,5 +13,5 @@
13
13
  # The id is what the host reports at GET /version, the same id the era mint
14
14
  # prints. Compare a live host with this file:
15
15
  #
16
- # bin/check_era https://host.example expected-era
16
+ # hecks check_era host=https://host.example expected=expected-era --wait
17
17
  # make check-era URL=https://host.example
@@ -1,4 +1,4 @@
1
- # GENERATED by bin/project_deploy -- re-run it to refresh this file rather
1
+ # GENERATED by hecks deploy project -- re-run it to refresh this file rather
2
2
  # than hand-editing. Included by the Makefile beside it; settings come from the
3
3
  # domain's deployed_to("AwsFargate") block (see
4
4
  # Hecks::Projections::Deploy::Scripts for each key).
@@ -24,7 +24,7 @@ build: hecks-release
24
24
  # Fetches the pinned release's tag into HECKS_ROOT unless it is already there,
25
25
  # and refuses a checkout that is not exactly that tag.
26
26
  hecks-release:
27
- @if [ -f "$(HECKS_ROOT)/bin/project_wasm" ]; then \
27
+ @if [ -f "$(HECKS_ROOT)/exe/hecks" ]; then \
28
28
  echo "hecks v$(HECKS_VERSION) is already at $(HECKS_ROOT)"; \
29
29
  else \
30
30
  echo "Fetching hecks v$(HECKS_VERSION) from $(HECKS_SOURCE) into $(HECKS_ROOT)..."; \
@@ -51,4 +51,4 @@ smoke-after-deploy:
51
51
  # Compares the era a live host reports at GET /version with expected-era.
52
52
  check-era:
53
53
  @test -n "$(URL)" || { echo "usage: make check-era URL=https://host.example"; exit 1; }
54
- ruby "$(HECKS_ROOT)/bin/check_era" "$(URL)" expected-era
54
+ HECKS_ENVIRONMENT=memory ruby "$(HECKS_ROOT)/exe/hecks" check_era host="$(URL)" expected=expected-era --wait
@@ -2,21 +2,8 @@ module Hecks
2
2
  module Projections
3
3
  module Deploy
4
4
  module Scripts
5
- # The `deployed_to("AwsFargate")` settings the hosting scripts read,
6
- # with their defaults and the check each value must pass.
7
- #
8
- # Every value ends up inside a shell script or a Makefile, so each one
9
- # is refused unless it matches a conservative pattern for what it names
10
- # (a region, a cluster, a GitHub repository). That check is what lets
11
- # the renderers write values without per-context escaping.
12
- #
13
- # The containers, their ECR repositories and image-tag parameters, and
14
- # the default cluster and service names are not settings here. They come
15
- # from the template generator's own resolved plan
16
- # (`Fargate::Settings::Plan`), so a script can only name what the
17
- # generated `template.yaml` defines.
18
- #
19
- # The keys are documented on `Scripts`.
5
+ # The `deployed_to("AwsFargate")` settings the hosting scripts read, checked
6
+ # against a conservative pattern so a renderer can splice one in without escaping.
20
7
  class Settings
21
8
  RESOURCE = /\A[a-zA-Z0-9][a-zA-Z0-9_-]*\z/
22
9
  REGION = /\A[a-z]{2}(-[a-z]+)+-\d\z/
@@ -34,16 +21,7 @@ module Hecks
34
21
  attr_reader :region, :stack, :cluster, :service, :containers, :hecks_release, :hecks_source,
35
22
  :hecks_cache_dir, :smoke_repo, :smoke_workflow, :smoke_ref, :expected_eras, :public_url
36
23
 
37
- # Reads and checks every hosting setting.
38
- #
39
- # @param deploy_settings [Hash{Symbol => Object}] the world's
40
- # `deployed_to("AwsFargate")` settings
41
- # @param plan [Fargate::Settings::Plan] the template generator's resolved settings:
42
- # its `layout` holds the containers, its `names` the cluster and service
43
- # @param stack_name [String] the CloudFormation stack
44
- # @param region [String] the validated AWS region
45
- # @raise [ArgumentError] if `hecks_release` is missing, or a value
46
- # does not match the pattern for what it names
24
+ # `plan.layout` holds the containers; `plan.names` the cluster and service.
47
25
  def initialize(deploy_settings:, plan:, stack_name:, region:)
48
26
  @raw = deploy_settings
49
27
  @region = check(:region, region, REGION)
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # GENERATED by bin/project_deploy -- re-run it to refresh this file rather
2
+ # GENERATED by hecks deploy project -- re-run it to refresh this file rather
3
3
  # than hand-editing. Settings come from the domain's deployed_to("AwsFargate")
4
4
  # block; see Hecks::Projections::Deploy::Scripts for each key.
5
5
  #
@@ -4,64 +4,11 @@ require_relative "scripts/settings"
4
4
  module Hecks
5
5
  module Projections
6
6
  module Deploy
7
- # The hosting scripts an AWS Fargate deploy ships beside its template:
8
- # the steps an operator runs after `make deploy` has created the stack.
9
- # `Fargate.call` adds them when the domain's
10
- # `deployed_to("AwsFargate")` block opts in, and leaves its file map
11
- # untouched otherwise.
12
- #
13
- # ## What it emits
14
- #
15
- # - `deploy-service.sh` reads the service's active task definition,
16
- # pushes a local image under a never-reused tag, swaps one container's
17
- # image, and syncs that container's CloudFormation `*ImageTag`
18
- # parameter with `--use-previous-template`, checking afterwards that no
19
- # other parameter changed.
20
- # - `smoke-after-deploy.sh` waits for the roll to settle, then dispatches
21
- # a GitHub workflow and reports its result. Exit codes 20 to 23 are its
22
- # own.
23
- # - `hosting.mk` is included by the generated `Makefile`. It pins the
24
- # Hecks release the domain image is built from (`HECKS_ROOT` resolves
25
- # to a cached checkout of that release's tag, never to a path on one
26
- # machine) and adds the `deploy-service`, `smoke-after-deploy` and
27
- # `check-era` targets.
28
- # - `expected-era` is the allow-list `bin/check_era` compares a host's
29
- # `GET /version` era against.
30
- #
31
- # ## Settings
32
- #
33
- # Read from `deployed_to("AwsFargate")`. Everything but `hosting_scripts`
34
- # and `hecks_release` has a default; the ones the stack template already
35
- # names (`stack_name`, `stack_prefix`, `region`) are not repeated here.
36
- #
37
- # - `hosting_scripts` opts in to every file above, when `true`. Off by default.
38
- # - `hecks_release` is the Hecks release the domain image is built from,
39
- # such as `"2.5.1"`. Required.
40
- # - `hecks_source` is the repository URL the release tag is fetched from.
41
- # Defaults to the Hecks repository.
42
- # - `hecks_cache_dir` is where release checkouts are kept, a Make expression.
43
- # Defaults to `$(HOME)/.cache/hecks`.
44
- # - `ecs_cluster` and `ecs_service` name the cluster and service. They default to the
45
- # names the generated template gives them: the stack name, or the `names` override.
46
- # - `smoke_repo` is the GitHub `owner/name` holding the smoke workflow, and
47
- # `smoke_workflow` its file name. With neither set, `REPO` and `WORKFLOW` must
48
- # come from the environment.
49
- # - `smoke_ref` is the ref the workflow is dispatched on. Defaults to `main`.
50
- # - `expected_eras` lists the era ids `expected-era` holds. Defaults to none, so a
51
- # host is only checked to report an era.
52
- # - `public_url` is the host URL `make check-era` requests. Without it, `URL` must
53
- # be passed to `make`.
54
- #
55
- # ## Names come from the template
56
- #
57
- # The containers, their ECR repositories and their image-tag parameters are not
58
- # settings of the scripts. `deploy-service.sh` accepts exactly the containers the
59
- # template's `Fargate::Containers::Layout` holds (the domain container, then each
60
- # entry of the world's `containers`), and for each one pushes to the repository and
61
- # syncs the parameter that layout names: the values the template renders. Rename them
62
- # with `domain_container` and `containers` (see `Fargate`), and the scripts, and the
63
- # `Makefile`'s `deploy`, follow.
7
+ # The hosting scripts an AWS Fargate deploy ships beside its template: the steps an
8
+ # operator runs after `make deploy` has created the stack.
64
9
  module Scripts
10
+ # Container names, repositories and image-tag parameters come from `plan`, not
11
+ # from a setting here; rename them in `Fargate::Settings::Plan` and these scripts follow.
65
12
  SCRIPT_DIR = File.join(__dir__, "scripts").freeze
66
13
 
67
14
  module_function
@@ -1,57 +1,22 @@
1
1
  module Hecks
2
2
  module Projections
3
3
  module Deploy
4
- # Plumbing `Lambda` and `Fargate` both need — VPC/subnet/security-group
5
- # resources, RDS/Aurora, `bastion.yaml`, and a cross-domain policy's
6
- # own least-privilege invoke grant are the same problem (get a
7
- # domain's own Postgres instance stood up and reachable for the one
8
- # boot that mints era 1, and let a domain call another domain's
9
- # Lambda) whichever compute target ships the domain's own code.
10
- #
11
- # Plain module functions, not a registered `Projector::Target` — this
12
- # has no `deployed_to(...)` block of its own to generate from, only
13
- # helpers the two real targets call with the facts they have already
14
- # resolved (`db_id`, `aurora`, `google_oauth_present`, and so on).
15
- #
16
- # Every `*_table` method here answers the same `key`/`var`/`name`
17
- # strings regardless of which target built them — `stack_outputs`'
18
- # own `"FunctionSecurityGroupId"` key, in particular, is what a
19
- # Shared-mode domain looks up from its owner's stack (`bin/project_deploy`'s
20
- # own Shared-mode branch), and that lookup has to succeed the same
21
- # way whether the owner is a `Lambda` or a `Fargate` deploy.
4
+ # VPC, RDS/Aurora, bastion and cross-domain invoke plumbing shared by the
5
+ # `Lambda` and `Fargate` deploy targets. Plain module functions, not a Target.
22
6
  module Shared
23
7
  module_function
24
8
 
25
- # The stack↔bastion contract — one shared table each of
26
- # `template.yaml`'s Outputs, `bastion.yaml`'s Parameters, and a
27
- # Makefile's own eval/`--parameter-overrides` lines reads from,
28
- # instead of three to four independent string literals per fact
29
- # with nothing checking they agree. `var` is the Make variable
30
- # each output becomes.
9
+ # The stack-to-bastion contract: one table that `template.yaml` Outputs,
10
+ # `bastion.yaml` Parameters and the Makefile overrides all read from.
11
+ # Empty when `shared`, since such a domain provisions no VPC/RDS of its own.
31
12
  #
32
- # Empty when `shared` — a Shared-mode domain provisions no
33
- # VPC/RDS of its own to expose at all (`bastion_parameters`,
34
- # `bastion_yaml`, and era-minting are all skipped for the same
35
- # reason: there's nothing here for a bastion to reach). A
36
- # Shared-mode domain's own stack is never an owner, so nothing
37
- # downstream ever needs to look these up from it either.
38
- #
39
- # @param shared [Boolean] whether this domain borrows another domain's
40
- # RDS instance (`database "Shared"`) rather than provisioning its own
41
- # @param db_id [String] the RDS/VPC resources' own shared logical-id prefix
42
- # @param db_ref_id [String] the logical id `.Endpoint`/`.MasterUserSecret` resolve
43
- # against — `db_id` itself for plain RDS, `"#{db_id}Cluster"` for Aurora
44
- # @param secret_intrinsic [String] the rendered `!Ref`/`!GetAtt` expression for
45
- # this domain's own database secret
46
- # @param compute_security_group_ref [String] the `!Ref` expression for the
47
- # compute resource's own security group (a Lambda function's, an `ECS`
48
- # service's) — reused by a Shared-mode domain elsewhere to attach its own
49
- # compute to this domain's VPC without minting a security group of its own
50
- # @param google_oauth_present [Boolean] whether this domain's own NAT
51
- # Gateway/public-subnet resources exist, and so whether `PublicSubnetId`/
52
- # `BastionSubnetId` are real outputs to expose
53
- # @return [Array<Hash{Symbol => String}>] frozen; each entry a `{key:, var:,
54
- # ref:}` triple
13
+ # @param shared [Boolean] whether this domain borrows another domain's RDS instance
14
+ # @param db_id [String] shared logical-id prefix of the RDS/VPC resources
15
+ # @param db_ref_id [String] logical id `.Endpoint` resolves against (Cluster for Aurora)
16
+ # @param secret_intrinsic [String] rendered `!Ref`/`!GetAtt` for the database secret
17
+ # @param compute_security_group_ref [String] `!Ref` for the compute's security group
18
+ # @param google_oauth_present [Boolean] whether the NAT/public-subnet resources exist
19
+ # @return [Array<Hash{Symbol => String}>] frozen `{key:, var:, ref:}` entries
55
20
  def stack_outputs(shared:, db_id:, db_ref_id:, secret_intrinsic:, compute_security_group_ref:, google_oauth_present:)
56
21
  return [].freeze if shared
57
22
 
@@ -60,44 +25,25 @@ module Hecks
60
25
  { key: "DbSecurityGroupId", var: "DB_SG_ID", ref: "!Ref #{db_id}SecurityGroup" },
61
26
  { key: "DatabaseEndpoint", var: "DB_HOST", ref: "!GetAtt #{db_ref_id}.Endpoint.Address" },
62
27
  { key: "DatabaseSecretArn", var: "DB_SECRET_ARN", ref: secret_intrinsic },
63
- # Not consumed by anything in this domain's own generated output —
64
- # a "Shared"-mode domain elsewhere looks these two up live to
65
- # attach its own compute to this domain's VPC/security group
66
- # without minting either itself.
28
+ # Read live by a Shared-mode domain to attach its compute to this VPC.
67
29
  { key: "FunctionSecurityGroupId", var: "FN_SG_ID", ref: compute_security_group_ref },
68
30
  { key: "PrivateSubnetAId", var: "PRIVATE_SUBNET_A_ID", ref: "!Ref #{db_id}SubnetA" },
69
31
  { key: "PrivateSubnetBId", var: "PRIVATE_SUBNET_B_ID", ref: "!Ref #{db_id}SubnetB" },
70
- # Only when google_oauth_present — #{db_id}PublicSubnet (and the
71
- # Internet Gateway it's attached through) only exist as resources
72
- # at all when the NAT Gateway block does. `bastion.yaml` needs
73
- # this: a VPC accepts only one attached Internet Gateway, and one
74
- # already exists once this is true — its own temporary IGW+subnet
75
- # would collide (a real, live "Resource.AlreadyAssociated").
32
+ # A VPC accepts one Internet Gateway; `bastion.yaml` must reuse this subnet's
33
+ # rather than mint its own (Resource.AlreadyAssociated).
76
34
  *(google_oauth_present ? [{ key: "PublicSubnetId", var: "PUBLIC_SUBNET_ID", ref: "!Ref #{db_id}PublicSubnet" }] : []),
77
- # A separate subnet from PublicSubnetId, same shared route
78
- # table/Internet Gateway -- #{db_id}PublicSubnet always lands in
79
- # AZ index 0 (`!Select [0, !GetAZs '']`), and a real, live
80
- # CREATE_FAILED caught this account unable to launch any EC2
81
- # instance there at all ("Your requested instance type ... is
82
- # not supported in your requested Availability Zone
83
- # (us-east-1a)") -- NatGateway and RDS aren't EC2 instances and
84
- # never hit this, only BastionInstance does. AZ index 1 instead,
85
- # matching #{db_id}SubnetB's own choice.
35
+ # Separate AZ-1 subnet: EC2 instances cannot launch in AZ index 0 on this
36
+ # account, which only the bastion hits.
86
37
  *(google_oauth_present ? [{ key: "BastionSubnetId", var: "BASTION_SUBNET_ID", ref: "!Ref #{db_id}BastionPublicSubnet" }] : []),
87
38
  ].freeze
88
39
  end
89
40
 
90
- # `bastion.yaml`'s own Parameters — deliberately allowed to rename
91
- # (`RdsSecurityGroupId` reads better inside `bastion.yaml` than the
92
- # stack output's own `DbSecurityGroupId`), which is exactly the kind
93
- # of rename that can silently drift between the two files without
94
- # this shared table.
41
+ # `bastion.yaml`'s Parameters, kept in one table so renames cannot drift
42
+ # from the stack outputs.
95
43
  #
96
- # @param shared [Boolean] whether this domain borrows another domain's
97
- # RDS instance — see `stack_outputs`' own comment
44
+ # @param shared [Boolean] see `stack_outputs`
98
45
  # @param google_oauth_present [Boolean] see `stack_outputs`
99
- # @return [Array<Hash{Symbol => String}>] frozen; each entry a `{name:,
100
- # from_output:, type:}` triple
46
+ # @return [Array<Hash{Symbol => String}>] frozen `{name:, from_output:, type:}` entries
101
47
  def bastion_parameters(shared:, google_oauth_present:)
102
48
  return [].freeze if shared
103
49
 
@@ -109,16 +55,9 @@ module Hecks
109
55
  ].freeze
110
56
  end
111
57
 
112
- # A generation-time assertion, not a bluebook refusal — this is the
113
- # generator catching its own bug immediately, before writing a
114
- # single file, instead of producing a `bastion.yaml` whose Parameter
115
- # nothing could ever fill.
58
+ # Generation-time check that every bastion parameter maps to a stack output.
116
59
  #
117
- # @param bastion_parameters [Array<Hash{Symbol => String}>] as `bastion_parameters` builds
118
- # @param stack_outputs [Array<Hash{Symbol => String}>] as `stack_outputs` builds
119
- # @return [void]
120
- # @raise [RuntimeError] if any parameter names a `from_output` absent from
121
- # `stack_outputs`
60
+ # @raise [RuntimeError] if a parameter names a `from_output` absent from `stack_outputs`
122
61
  def check_bastion_parameters!(bastion_parameters, stack_outputs)
123
62
  bastion_parameters.each do |param|
124
63
  stack_outputs.any? { |o| o[:key] == param[:from_output] } or
@@ -126,27 +65,13 @@ module Hecks
126
65
  end
127
66
  end
128
67
 
129
- # Renders the least-privilege IAM grant a cross-domain policy's own
130
- # invoke needs — one `lambda:InvokeFunction` statement per declared
131
- # `across:` target, appended to the compute role's existing
132
- # `Policies:` list. `rust/host`'s own `lambda_client.rs`
133
- # (`AwsLambdaInvoker`) is the one piece of a cross-domain dispatch
134
- # path that needs this at all, regardless of which compute target
135
- # ships the calling domain's own code — a Fargate task and a Lambda
136
- # function both reach another domain's dispatch Lambda the same way.
137
- #
138
- # Declared, not deployed: an ARN naming a function that does not
139
- # exist yet is still valid IAM policy — the call simply fails with
140
- # `ResourceNotFoundException` instead of `AccessDeniedException`
141
- # until the target domain is deployed for real.
68
+ # Renders one `lambda:InvokeFunction` IAM statement per `across:` target,
69
+ # to append to the compute role's `Policies:` list.
70
+ # An ARN for a not-yet-deployed function is valid IAM; the call just fails until then.
142
71
  #
143
- # @param targets [Array<String>] the domain names this stack's `across:` targets
144
- # declare
145
- # @param base [String] the marker line's own rendered indentation whitespace;
146
- # everything below is built relative to it
147
- # @return [String] the rendered comment plus one `Statement`-shaped IAM policy
148
- # entry granting invoke on each target's function ARN, ending in exactly one
149
- # trailing newline; an empty string if `targets` is empty
72
+ # @param targets [Array<String>] domain names declared by `across:`
73
+ # @param base [String] indentation of the marker line
74
+ # @return [String] the YAML ending in one newline; empty if `targets` is empty
150
75
  def cross_domain_invoke_policy_yaml(targets, base)
151
76
  return "" if targets.empty?
152
77
 
@@ -173,32 +98,18 @@ module Hecks
173
98
  ].join("\n") + "\n"
174
99
  end
175
100
 
176
- # Renders one domain's own private VPC, subnets, RDS/Aurora Postgres
177
- # instance, and the two security groups pairing it with its compute
178
- # — everything `Lambda` and `Fargate` both need to give a
179
- # non-`"Shared"`-mode domain a real, reachable Postgres endpoint.
180
- # Dedented flush-left, the same shape a caller's own enclosing
181
- # `<<~` heredoc expects to reindent as it splices this in.
101
+ # Renders a domain's private VPC, subnets, RDS/Aurora Postgres and the two
102
+ # security groups pairing it with its compute, dedented flush-left.
103
+ # The compute group has no inbound rule; it only needs egress to the database.
182
104
  #
183
- # `compute_logical_id`'s own security group carries no inbound rule
184
- # at all — neither a Lambda function nor a Fargate task/`ALB` target
185
- # group receives traffic over this VPC-attached `ENI` directly, only
186
- # egress to the database (and, when `google_oauth_present`, to the
187
- # internet for a real OAuth token exchange).
188
- #
189
- # @param db_id [String] the RDS/VPC resources' own shared logical-id prefix
190
- # @param db_name [String] the database identifier RDS/Aurora provisions
191
- # @param infra_name [String] the domain's own AWS-facing name, quoted in the
192
- # `DBSubnetGroupDescription`
105
+ # @param db_id [String] shared logical-id prefix of the RDS/VPC resources
106
+ # @param db_name [String] database identifier RDS/Aurora provisions
107
+ # @param infra_name [String] AWS-facing domain name, quoted in the subnet group description
193
108
  # @param aurora [Boolean] Aurora Serverless v2 when true, plain RDS otherwise
194
- # @param google_oauth_present [Boolean] whether a NAT Gateway, public subnet, and
195
- # the compute security group's own internet egress rule are needed
196
- # @param compute_logical_id [String] the compute resource's own logical id,
197
- # naming its security group and egress rules
198
- # @param compute_description [String] the compute security group's own
199
- # `GroupDescription` text — what actually terminates the `ENI` this ingress
200
- # pairs with
201
- # @return [String] the rendered CloudFormation Resources, flush-left
109
+ # @param google_oauth_present [Boolean] whether to add a NAT Gateway and internet egress
110
+ # @param compute_logical_id [String] logical id naming the compute's security group
111
+ # @param compute_description [String] the compute security group's `GroupDescription`
112
+ # @return [String] the rendered CloudFormation Resources
202
113
  def vpc_and_database_yaml(db_id:, db_name:, infra_name:, aurora:, google_oauth_present:, compute_logical_id:, compute_description:)
203
114
  <<~OWNDB.rstrip
204
115
  #{db_id}Vpc:
@@ -466,30 +377,20 @@ module Hecks
466
377
  OWNDB
467
378
  end
468
379
 
469
- # Renders the temporary era-minting bastion — a standalone
470
- # CloudFormation template, deployed and destroyed by `make
471
- # mint-era`, never merged into the main stack. SSM Session Manager
472
- # only, never SSH: no key pair, no inbound security group rule at
473
- # all — the only way in is `aws ssm start-session`, itself gated by
474
- # the caller's own IAM permissions.
475
- #
476
- # Callers skip this entirely when `shared` — a Shared-mode domain
477
- # provisions no RDS/VPC of its own for a bastion to reach, and era-
478
- # minting for it reuses its owner's own already-standing bastion
479
- # path instead.
380
+ # Renders the temporary era-minting bastion: a standalone template deployed
381
+ # and destroyed by `make mint-era`. SSM Session Manager only, no inbound rules.
382
+ # Callers skip this when `shared`, as there is no RDS/VPC for it to reach.
480
383
  #
481
- # @param domain [String] the domain directory's path, named in the header comment
482
- # @param infra_name [String] the domain's own AWS-facing name
483
- # @param stack_name [String] the main stack's own name, tagged onto the bastion instance
484
- # @param db_id [String] the RDS/VPC resources' own shared logical-id prefix, as
485
- # `vpc_and_database_yaml` names them
486
- # @param google_oauth_present [Boolean] whether the main stack already has its own
487
- # public subnet/Internet Gateway to reuse, rather than minting a second one
384
+ # @param domain [String] domain directory path, named in the header comment
385
+ # @param infra_name [String] AWS-facing domain name
386
+ # @param stack_name [String] main stack name, tagged onto the instance
387
+ # @param db_id [String] shared logical-id prefix, as `vpc_and_database_yaml` names it
388
+ # @param google_oauth_present [Boolean] reuse the stack's public subnet, mint none
488
389
  # @param bastion_parameters [Array<Hash{Symbol => String}>] as `bastion_parameters` builds
489
390
  # @return [String] the rendered CloudFormation template
490
391
  def bastion_yaml(domain:, infra_name:, stack_name:, db_id:, google_oauth_present:, bastion_parameters:)
491
392
  <<~YAML
492
- # GENERATED by bin/project_deploy #{domain} — re-run it to refresh
393
+ # GENERATED by hecks deploy project #{domain} — re-run it to refresh
493
394
  # this file rather than hand-editing. Deployed and destroyed by
494
395
  # `make mint-era` (this directory's own Makefile) — never left
495
396
  # running: it exists only long enough for one Ruby boot to reach