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
@@ -6,32 +6,20 @@ require_relative "../../runtime/errors"
6
6
 
7
7
  module Hecks
8
8
  module Adapters
9
- # Shared by every adapter that holds decoded Ruby records rather than
10
- # running real SQL (Memory, Lambda, Heki) — the identical dotted-path
11
- # value-object member-picking Postgres/Sqlite/D1's own
12
- # order_expression does (numeric member wins, else the one-field
13
- # convention "value"), just walked in Ruby instead of compiled to a
14
- # JSONB/json_extract path, because there is no query engine
15
- # underneath any of these three to hide that walk inside.
9
+ # Ordering for adapters that hold decoded Ruby records (Memory, Lambda, Heki),
10
+ # mirroring the SQL adapters' value-object member picking.
16
11
  module InMemoryOrdering
17
12
  module_function
18
13
 
19
- # Orders decoded records by a declared attribute, then by id as the total-order
20
- # tiebreaker.
14
+ # Orders decoded records by a declared attribute, then by id as the tiebreaker.
21
15
  #
22
- # order_by is a runtime value (an HTTP query param, in the
23
- # console's case), not framework-authored bluebook source — see
24
- # postgres.rb's own all for the full reasoning. Whitelisted the
25
- # identical way before FieldPath.dig ever runs.
16
+ # `order_by` may come from an HTTP query param, so it is checked before `FieldPath.dig`.
26
17
  #
27
18
  # @param records [Array<Runtime::Instance>] the records to order
28
- # @param aggregate [Bluebook::Aggregate] the aggregate `records` belong to, checked for
29
- # `order_by`'s attribute
30
- # @param order_by [String, Symbol, nil] a dotted attribute path to sort by; nil returns
31
- # `records` unchanged
19
+ # @param aggregate [Bluebook::Aggregate] the aggregate `records` belong to
20
+ # @param order_by [String, Symbol, nil] a dotted attribute path; nil returns `records` as-is
32
21
  # @param direction [Symbol] `:asc` or `:desc`
33
- # @return [Array<Runtime::Instance>] `records`, ordered by `order_by` then id; unchanged
34
- # when `order_by` is nil
22
+ # @return [Array<Runtime::Instance>] `records`, ordered by `order_by` then id
35
23
  # @raise [Runtime::WiringError] if `order_by` names no attribute of `aggregate` and is
36
24
  # not its lifecycle field
37
25
  def ordered(records, aggregate:, order_by:, direction:)
@@ -68,13 +56,8 @@ module Hecks
68
56
  vo = aggregate.value_object(attribute.type)
69
57
  return field.to_s unless vo
70
58
 
71
- # Numeric member first, then the sole attribute whatever it is
72
- # named (single-attribute value objects strictly answer `.value`
73
- # — the same generalization `SqlQueryBuilder#query_expression`
74
- # makes for the column side, kept in lockstep so Memory and SQL
75
- # order the identical rows identically), and only then the bare
76
- # `value` convention — now purely a backstop for the multi-field
77
- # non-numeric shape neither rule can honestly pick a field for.
59
+ # Numeric member, else the sole attribute, else `value`; kept in lockstep with
60
+ # `SqlQueryBuilder#query_expression` so Memory and SQL order rows identically.
78
61
  member = vo.attributes.find { |a| %w[Integer Float].include?(a.type) }&.name ||
79
62
  vo.sole_attribute&.name || "value"
80
63
  "#{name}.#{member}"
@@ -2,20 +2,8 @@ require "securerandom"
2
2
 
3
3
  module Hecks
4
4
  module Adapters
5
- # The real `key_vault` fulfillment for a single running process — a
6
- # table of key material, keyed by an opaque reference never exposed to
7
- # a bluebook or an event. Cryptoshredding only works if the key
8
- # genuinely leaves memory when destroyed: `destroy` deletes the Hash
9
- # entry outright, not merely a flag, so a `fetch` afterward has
10
- # nothing left to decrypt with.
11
- #
12
- # **Not crash-durable** — a process restart loses every key this
13
- # adapter ever issued, along with every ciphertext under it. A
14
- # deployment that needs destruction to survive a restart (or to leave
15
- # a physical-destruction audit trail) backs this port with a real
16
- # `KMS` or `HSM` instead; this default asks for nothing external to
17
- # run, the same tradeoff `SecureRandomIdentity` already makes for
18
- # identity minting.
5
+ # In-process `key_vault` fulfillment: key material held under opaque references.
6
+ # Not crash-durable; use a KMS or HSM when destruction must survive a restart.
19
7
  module InProcessKeyVault
20
8
  module_function
21
9
 
@@ -3,48 +3,13 @@ require "json"
3
3
  module Hecks
4
4
  module Adapters
5
5
  class Lambda
6
- # **The thin AWS client** — shared by this adapter's own read methods
7
- # (Lambda#find/#all/#count/#query) and Runtime::RemoteDispatcher's
8
- # write methods. One Lambda invoke, one JSON round trip, nothing
9
- # domain-specific: neither caller needs to know an AWS SDK is
10
- # involved at all.
6
+ # The thin AWS client shared by this adapter's read methods and
7
+ # Runtime::RemoteDispatcher's writes: one Lambda invoke, one JSON round trip.
11
8
  #
12
- # ## Resolving the function name
13
- #
14
- # Function name is computed unless it is named — `"hecks-#{domain}"`,
15
- # lowercased, matches bin/project_deploy's own `stack_name`
16
- # exactly (bin/project_deploy: `stack_name = "hecks-#{domain_name}"`,
17
- # `domain_name = File.basename(domain)`). `domain` here is the
18
- # bluebook's own declared name (`Embryonaut`, not the directory);
19
- # today's real corpus has directory name == declared name
20
- # lowercased for every domain that deploys, so `.downcase` alone
21
- # reproduces the same string bin/project_deploy computes from the
22
- # directory.
23
- #
24
- # ## When the assumption breaks
25
- #
26
- # That assumption is not always true, and when it breaks nothing
27
- # about it is recoverable from here. `bin/project_deploy` honours
28
- # a `.world`'s own `stack_prefix`/`stack_name` — settings that
29
- # exist precisely so a domain whose AWS identity predates a rename
30
- # keeps targeting the stack that is actually live rather than
31
- # standing up a second, empty one beside it. A real one:
32
- # a client site deploys under a fixed stack name, and no
33
- # value of `domain` (or of `DOMAIN_NAME`, the deployed-Lambda
34
- # override callers already pass) can make this computation produce
35
- # a name with no dash after "hecks". Every Ruby-side read and
36
- # dispatch for that app has therefore been invoking a function
37
- # that does not exist — found live, and visible in the deployed
38
- # journal having never received a single row.
39
- #
40
- # ## Naming it explicitly
41
- #
42
- # So the name can be named, in the one place the rest of this
43
- # deployment is already described: the `.world`'s own
44
- # `persisted_by("Lambda")`/`dispatched_by("Lambda")` block, beside
45
- # `region`. Given, it wins outright; absent, the computation above
46
- # is unchanged, which is every domain whose stack name was never
47
- # pinned.
9
+ # The function name defaults to `"hecks-#{domain.downcase}"`, matching
10
+ # `hecks deploy project`'s `stack_name` computation. A domain whose stack
11
+ # name doesn't follow that pattern must pass `function` explicitly, via
12
+ # a `.world`'s `persisted_by("Lambda")`/`dispatched_by("Lambda")` block.
48
13
  class Client
49
14
  # @param domain [String, Symbol] the bluebook's own declared domain name; computes
50
15
  # the function name when `function` is not given
@@ -58,20 +23,14 @@ module Hecks
58
23
  @client = Aws::Lambda::Client.new(region: region)
59
24
  end
60
25
 
61
- # The function this client actually invokes — read by
62
- # `Runtime::WiringError` messages and worth asserting on
63
- # directly, since "which function did we call" is otherwise
64
- # unanswerable from outside.
26
+ # The function this client actually invokes; used in `Runtime::WiringError`
27
+ # messages and worth asserting on directly in tests.
65
28
  attr_reader :function_name
66
29
 
67
30
  # Reads the whole domain's current state and event log from the remote function.
68
31
  #
69
- # **The whole domain, every time** — matches dispatch::read's own
70
- # rehydrate-the-full-journal design (Phase 1, rust/host). No
71
- # caching here, deliberately: memoizing this across calls once
72
- # silently served stale reads for a warm web process's whole
73
- # lifetime after a write happened elsewhere — see Lambda#instances's
74
- # own comment on the real, live bug that caught it.
32
+ # No caching here, deliberately: a memoized read would go stale the
33
+ # moment a write happens elsewhere in a long-lived process.
75
34
  #
76
35
  # @return [Hash{String => Object}] the parsed JSON response; the deployed function's
77
36
  # own top-level keys (`"instances"`, `"events"`, …)
@@ -6,24 +6,8 @@ require_relative "../../runtime/instance"
6
6
 
7
7
  module Hecks
8
8
  module Adapters
9
- # **The read-side half of lambda routing** — `persisted_by("Lambda")`'s
10
- # own adapter, resolved through the same `Ports::Persistence`
11
- # machinery `persisted_by("Postgres")`/`persisted_by("Memory")`
12
- # already use (`Runtime::Registry#repository`, `RepositoryFactory
13
- # .build`) — no new framework plumbing, just a new adapter class at
14
- # the name the existing lookup already expects. See
15
- # `Runtime::RemoteDispatcher` for the write-side half; the two
16
- # compose through one shared `Client` per domain rather than each
17
- # inventing its own AWS wiring.
18
- #
19
- # **Read-only, deliberately** — `append`/`project` raise rather than
20
- # silently no-op. A write reaching this class would mean
21
- # `Runtime::CommandInterpreter` ran locally against a Lambda-routed
22
- # domain, which is exactly the bypass `Runtime::RemoteDispatcher`
23
- # exists to prevent (business-rule validation must happen in Rust
24
- # for these domains, not be pre-computed here against an
25
- # incomplete local view). A loud failure here is the correct
26
- # outcome, not a bug to route around.
9
+ # Read-side adapter for `persisted_by("Lambda")`; writes go through Runtime::RemoteDispatcher.
10
+ # Read-only: `append`/`project` raise, since a local write would bypass remote validation.
27
11
  class Lambda
28
12
  include Ports::Persistence::RemoteRuntime
29
13
 
@@ -50,41 +34,11 @@ module Hecks
50
34
  aggregate.name
51
35
  end
52
36
  region = setting(settings, :region, "us-east-1")
53
- # Named, when this deployment's function isn't `hecks-<domain>`
54
- # — `Client`'s own comment has the real case that needs it.
55
- # Absent (every domain whose stack name was never pinned), the
56
- # computation below is exactly as it was.
37
+ # Explicit function name, for deployments whose function is not `hecks-<domain>`.
57
38
  function = setting(settings, :function, nil)
58
- # Two different "domain"s, deliberately not conflated: `domain`
59
- # (this aggregate's own bluebook name — "Identity", "Governance")
60
- # only ever prefixes the instances lookup, since that's how
61
- # rust/host's own `Store::instances()` keys every record
62
- # (`registry.rb`'s own `"#{a[:domain_name]}::#{a[:name]}#"`
63
- # dump format, unchanged by which chapter attached it). The
64
- # function to actually call is a different question: Governance
65
- # and Identity aggregates are compiled into the attaching
66
- # domain's own Lambda (one merged `Store` per target — Phase 0's
67
- # framework-bluebook work), never a function of their own, so
68
- # `settings[:domain]` is the wrong signal for `Client.new`.
69
- # `root` is the boot's own directory (`Registry#root`, shared by
70
- # every bluebook in one registry regardless of which one
71
- # attached it) — `File.basename(root)` reproduces the exact
72
- # same string `bin/project_deploy`'s own `stack_name` computes
73
- # from the domain path, so the two can never name two
74
- # different functions for the same deploy... on a local boot,
75
- # where `root` is a real project directory. Inside the deployed
76
- # Lambda itself `root` is always `/var/task` (every Lambda's own
77
- # fixed code root, regardless of domain) — `File.basename` gives
78
- # "task", not the domain name, and invokes the wrong function
79
- # entirely. A real, live AccessDeniedException on
80
- # "hecks-task" caught this: invisible through every earlier
81
- # phase's own verify step, all run from a local boot, until
82
- # WebFunction became the first Ruby process to ever make this
83
- # exact call from inside a deployed Lambda. `DOMAIN_NAME` (set
84
- # by bin/project_deploy's own WebFunction Environment) is the
85
- # real, unambiguous signal in that specific context; the
86
- # root-basename heuristic stays as the local-boot fallback,
87
- # unchanged.
39
+ # `domain` only prefixes the instances lookup; the function to call is named by
40
+ # DOMAIN_NAME (set in a deployed Lambda, where root is always /var/task), else by
41
+ # root's basename, which matches hecks deploy project's stack name on a local boot.
88
42
  function_domain = ENV["DOMAIN_NAME"] || (root ? File.basename(root) : domain)
89
43
  @client = Client.new(domain: function_domain, region: region, function: function)
90
44
  @prefix = "#{domain}::#{aggregate.hecks_name}#"
@@ -128,21 +82,9 @@ module Hecks
128
82
  Ports::Query::InMemory.execute(instances.values, specification, args)
129
83
  end
130
84
 
131
- # `entries`/`append`/`project` — the append-only contract
132
- # `Ports::Persistence::AppendOnly` requires of every adapter
133
- # (raises at construction if any are missing). Answered by
134
- # `Ports::Persistence::RemoteRuntime`, included above: `entries` is
135
- # `[]` unconditionally (Lambda's own Postgres is already the
136
- # durable store — rust/host's rehydrate-and-replay journal, Phase
137
- # 1 — there is no local write-ahead log for `recover!` to replay),
138
- # `append`/`project` raise rather than silently no-op.
139
-
140
85
  # Reads a world setting under either a Symbol or a String key, with a fallback.
141
86
  #
142
- # A `.world` block's settings arrive symbol-keyed from the DSL and
143
- # string-keyed from a round-tripped export, so every read has to
144
- # accept both — one helper rather than the same five lines per
145
- # key.
87
+ # Settings arrive symbol-keyed from the DSL and string-keyed from a round-tripped export.
146
88
  #
147
89
  # @param settings [Hash] the world settings Hash to read from
148
90
  # @param key [Symbol] the setting name, tried as itself and as `key.to_s`
@@ -157,21 +99,8 @@ module Hecks
157
99
 
158
100
  private
159
101
 
160
- # Re-fetched every call, deliberately not memoized across them —
161
- # this adapter itself is long-lived (one instance per aggregate,
162
- # held by the registry `RUNTIME = Hecks.boot(...)` builds once
163
- # per Lambda web process — WebFunction's own top-level constant,
164
- # reused warm across every HTTP request that process serves, not
165
- # rebuilt per request the way memoizing here would wrongly assume).
166
- # A real, live bug caught this: a mutation
167
- # dispatched fine (RemoteDispatcher always calls the dispatch
168
- # Lambda fresh) and the very next `.all` on the same warm
169
- # container kept returning the state from before that mutation,
170
- # forever, until the container cold-started — memoizing here
171
- # made every write invisible to every read on a warm container.
172
- # Keyed by bare id (the part after "Domain::Aggregate#"), not the
173
- # full "Domain::Aggregate#id" string — callers already know which
174
- # aggregate they're asking this instance about.
102
+ # Never memoized: the adapter outlives requests on a warm container, so a cached read
103
+ # would hide every later write. Keyed by the bare id after "Domain::Aggregate#".
175
104
  def instances
176
105
  @client.read.fetch("instances", {}).filter_map do |key, state|
177
106
  next unless key.start_with?(@prefix)
@@ -180,10 +109,7 @@ module Hecks
180
109
  end.to_h
181
110
  end
182
111
 
183
- # Lambda's own JSON response is already Ruby-decoded with string
184
- # keys (plain `JSON.parse`, no `symbolize_names:`) — decoded through
185
- # the state codec (PR A3), the same IR-driven spelling every other
186
- # adapter's read produces.
112
+ # The response is string-keyed JSON; the state codec decodes it as every adapter's read does.
187
113
  def build_instance(id, state)
188
114
  Runtime::Instance.new(aggregate: @aggregate, id: id, state: Ports::Persistence::StateCodec.decode(@aggregate, state))
189
115
  end
@@ -5,36 +5,10 @@ require_relative "../../runtime/instance"
5
5
 
6
6
  module Hecks
7
7
  module Adapters
8
- # **A browser-hosted domain's own declared intent** — not a second Memory
9
- # wearing a different name. Ruby has no way to reach a real browser's
10
- # `window.localStorage` at all (it is per-tab, per-origin, JS-only,
11
- # unreachable over any network the way D1's own REST API is) — so
12
- # this Ruby-side adapter is honestly a stand-in: in-process, ephemeral,
13
- # mechanically identical to Memory. What earns it a name of its own
14
- # is what it declares, not what it happens to do in Ruby: `persisted_by
15
- # "LocalStorage"` says "this domain expects real, durable, single-
16
- # device storage the moment it's actually running where it's meant to
17
- # run" — the same distinction Heki (real local durability) already
18
- # draws against Memory (deliberately ephemeral, test/example-only),
19
- # one adapter over. `bin/console`, the fuzzer, `spec/`, `bin/
20
- # model_check` all get a domain that boots and behaves correctly
21
- # against this adapter; only a real browser gets the real durability.
22
- #
23
- # The real browser half lives outside this file entirely: `rust/web`'s
24
- # `dispatch(json)` (docs/implemented/decisions/0015) takes an optional
25
- # `"seed"` (the exact `"instances"` shape it also answers with) plus
26
- # `"steps"` — a host rehydrates from a prior snapshot and replays only
27
- # the new command(s), rather than the whole history every call. A
28
- # page bound to this adapter is expected to hold that snapshot in
29
- # `window.localStorage` itself (get on load, set after every
30
- # `dispatch`) — the seed/instances round trip is the adapter, once
31
- # you're in the one runtime that can actually reach the storage this
32
- # name promises.
8
+ # Declares browser-local storage; in Ruby it behaves like Memory (in-process, ephemeral).
9
+ # Only a real browser page, holding the rust/web `dispatch` snapshot, gets durability.
33
10
  class LocalStorage
34
- # Tenant-capable trivially, same reasoning as Memory's own — a
35
- # browser tab is exactly one origin, exactly one user; there is no
36
- # second tenant this in-process Hash could ever confuse a first
37
- # one with.
11
+ # Trivially tenant-capable, as Memory is: a browser tab is one origin and one user.
38
12
  #
39
13
  # @return [Boolean] true, always
40
14
  def self.tenant_capable? = true
@@ -79,10 +53,7 @@ module Hecks
79
53
 
80
54
  # Answers a declared query specification against the projected records.
81
55
  #
82
- # The decision the guide asks for, made explicitly: no compiled
83
- # dialect of its own, same as Heki/Memory — a personal-scale local
84
- # store answering by walking `all` is correct on day one, and
85
- # nothing about a browser tab's own data volume asks for pushdown.
56
+ # No compiled dialect, as with Heki and Memory: walking `all` suffices at tab-sized volumes.
86
57
  #
87
58
  # @param specification [QuerySpecification::Common::Options,
88
59
  # Bluebook::Behaviour::ReadModel::FilteredOptions] the declared query specification
@@ -181,13 +152,7 @@ module Hecks
181
152
 
182
153
  def copy(state) = Ports::Persistence::StateCodec.copy(@aggregate, state)
183
154
 
184
- # Not lineage_capable? — deliberately absent, the same trade Heki
185
- # makes and states plainly (writing-an-adapter.md's own section on
186
- # it): a domain bound here has no edge for its own shape to travel
187
- # across if it ever changes; that must be hand-migrated, or the
188
- # shape must not change. A browser-local personal store is exactly
189
- # the small-adapter case that guide names as a fine place to make
190
- # that trade.
155
+ # Deliberately not lineage_capable?, as with Heki: a shape change must be hand-migrated.
191
156
  end
192
157
  end
193
158
  end
@@ -5,22 +5,13 @@ require_relative "../../runtime/instance"
5
5
 
6
6
  module Hecks
7
7
  module Adapters
8
- # The default, no-external-dependency persistence/query adapter — a
9
- # plain in-process Hash of `Runtime::Instance` records per aggregate,
10
- # with an append-only `@entries`/`@events` log alongside it. Every
11
- # behaviors suite must resolve to this one (see
12
- # Behaviors::Expectations#guard_memory_only!) precisely because a fresh
13
- # instance really is a fresh store, with nothing shared across tests or
14
- # tenants.
8
+ # The default in-process adapter: a Hash of `Runtime::Instance` records
9
+ # per aggregate, plus an append-only `@entries`/`@events` log.
15
10
  class Memory
16
11
  # Reports that two tenant boots of this adapter never share state.
17
12
  #
18
- # **Tenant-capable trivially** — see `Runtime::TenantCheck`'s own header
19
- # for the full reasoning. `@records` is a plain instance variable;
20
- # two `Runtime.boot` calls build two entirely separate Registry
21
- # objects and, through them, two entirely separate Memory
22
- # instances, so two tenant boots never share this adapter's state
23
- # by construction — nothing here needs to know "tenant" exists.
13
+ # Trivially true: `@records` is a plain ivar, and each `Runtime.boot`
14
+ # builds a wholly separate Memory instance.
24
15
  #
25
16
  # @return [Boolean] always true
26
17
  def self.tenant_capable? = true
@@ -43,6 +34,7 @@ module Hecks
43
34
  @events = []
44
35
  @entries = []
45
36
  @outbox = []
37
+ @outbox_deliveries = {}
46
38
  end
47
39
 
48
40
  # Looks up the current record for one aggregate identity.
@@ -81,11 +73,10 @@ module Hecks
81
73
 
82
74
  # Records one journal entry, holding a codec copy of its state.
83
75
  #
84
- # Through the state codec, like every durable adapter (PR A3): the
85
- # journal holds `StateCodec.copy` — exactly what an encode-to-JSON
86
- # then decode would hand back — never the caller's own live state
87
- # objects, so an entry read back here has the same deep-symbol,
88
- # plain-Hash shape a Heki/Sqlite/Postgres entry has.
76
+ # Like every durable adapter, the journal holds `StateCodec.copy` —
77
+ # what an encode-to-JSON then decode would hand back — never the
78
+ # caller's own live state objects, so an entry read back here has
79
+ # the same deep-symbol, plain-Hash shape a Heki/Sqlite/Postgres entry has.
89
80
  #
90
81
  # @param entry [Ports::Persistence::Entry] the save or delete to journal
91
82
  # @return [Ports::Persistence::Entry] the caller's own `entry`, not the journalled copy
@@ -163,18 +154,8 @@ module Hecks
163
154
 
164
155
  # Empties the records, journal, event log and outbox, keeping the adapter itself.
165
156
  #
166
- # Every other driven adapter (Postgres/PostgresEra/Sqlite/D1)
167
- # implements this too — `Ports::Persistence::AppendOnly#reset!`
168
- # forwards to it and only raises when the wrapped adapter doesn't
169
- # respond to `reset!` at all, and nothing about "in memory" implies
170
- # "cannot be cleared". Existing callers that fully re-`Hecks.boot`
171
- # a domain per test case don't need this — they get a brand new
172
- # `Memory` instance, with brand new empty `@records`/`@events`/
173
- # `@entries`, for free. This is for the other case: a caller that
174
- # deliberately keeps one booted runtime across many cases (to skip
175
- # `load_domain`'s own per-boot parse/verify cost) and wants each
176
- # case to start from the same clean slate `Hecks.boot` would have
177
- # given it, without paying for a fresh boot to get there.
157
+ # Lets a caller that keeps one booted runtime across many cases reset
158
+ # to a clean slate without paying for a fresh boot.
178
159
  #
179
160
  # @return [Adapters::Memory] self, now empty
180
161
  def reset!
@@ -182,6 +163,7 @@ module Hecks
182
163
  @events = []
183
164
  @entries = []
184
165
  @outbox = []
166
+ @outbox_deliveries = {}
185
167
  self
186
168
  end
187
169
 
@@ -205,10 +187,11 @@ module Hecks
205
187
  # was a duplicate
206
188
  def outbox_enqueue(rows)
207
189
  rows.filter_map do |row|
208
- next nil if @outbox.any? { |held| held.delivery_id == row.delivery_id }
190
+ next nil if @outbox_deliveries.key?(row.delivery_id)
209
191
 
210
192
  row.id = @outbox.size + 1
211
193
  @outbox << row
194
+ @outbox_deliveries[row.delivery_id] = true
212
195
  row
213
196
  end
214
197
  end
@@ -219,7 +202,7 @@ module Hecks
219
202
  # @return [Boolean] true when the row was pending and is now claimed; false when it is
220
203
  # unknown or not pending
221
204
  def outbox_claim(id) # rubocop:disable Naming/PredicateMethod
222
- row = @outbox.find { |held| held.id == id }
205
+ row = outbox_row(id)
223
206
  return false unless row&.pending?
224
207
 
225
208
  row.status = "claimed"
@@ -235,7 +218,7 @@ module Hecks
235
218
  # @param error [String, nil] the failure description, or nil to clear it
236
219
  # @return [Boolean] true when the row exists and was updated; false when no row has `id`
237
220
  def outbox_settle(id, status:, error: nil) # rubocop:disable Naming/PredicateMethod
238
- row = @outbox.find { |held| held.id == id } or return false
221
+ row = outbox_row(id) or return false
239
222
  row.status = status.to_s
240
223
  row.error = error
241
224
  true
@@ -253,74 +236,23 @@ module Hecks
253
236
 
254
237
  private
255
238
 
256
- # The language's own bootstrap saves its self-description quadratically
257
- # otherwise. `MetaValidator::Judge` dispatches every declaration in the
258
- # self-hosted grammar into a fresh, private, never-durable `Memory`
259
- # store (meta_validator.rb's own header: "each bluebook is judged in a
260
- # fresh in-memory store") — and every nested-entity dispatch (a
261
- # `ValueObject::Member`, then one `ValueObject::Member::Pair` per
262
- # key/value pair) re-saves the whole parent aggregate, because entities
263
- # have no storage of their own (S17, ADR 0026). A table of N member
264
- # rows costs O(N) dispatches, each paying twice for the aggregate's own
265
- # size-N state: once in `StateCodec.copy` (`append`/`project`'s own
266
- # encode-then-decode round trip) and again in `Instance#initialize`'s
267
- # `hydrate_with_defaults`, which re-walks and re-validates every
268
- # element of an entity list on every save regardless of how many of
269
- # them were already valid as of the previous one
270
- # (`Value::EntityListCoercion#hydrate_entity_list` has no "already
271
- # hydrated" shortcut for entity elements — only a value-object list
272
- # element gets one). Both are O(N) per save, so a table of N rows
273
- # costs O(N^2) total — and it is paid by every rspec worker and every
274
- # `bin/*` subprocess that boots the language at all (found live: PR
275
- # #738's 128-row `RefusalSiteArgument` table alone tripled this one
276
- # aggregate's own save time, 6.7s -> 18.2s).
239
+ # Finds a held outbox row by id in constant time.
277
240
  #
278
- # `Runtime::Value.judge_bootstrapping?` (judge.rb's own `send_to`,
279
- # wrapping every dispatch the judge makes) is already the flag that
280
- # marks exactly this window and nothing else — "never for a real
281
- # domain's own declared value objects... which Judge never dispatches
282
- # commands against" (coercion.rb's own comment on the same flag). It
283
- # is reused here rather than a new toggle for the same reason: one
284
- # flag, one meaning, checked by two unrelated callers for two
285
- # unrelated purposes (loosening a scalar-shape check there, skipping
286
- # both round trips here) is simpler to reason about than two flags
287
- # that would always be true or false together.
288
- #
289
- # Why skipping both is safe here, and only here: `entry.state` a save
290
- # ever hands this adapter is always `instance.state.dup`
291
- # (`AppendOnly#save`) — a shallow copy of an already-hydrated,
292
- # already-validated live `Instance`'s own state, built by the very
293
- # same `Value.for_attribute`/`hydrate_with_defaults` machinery
294
- # `StateCodec.copy` and `Instance.new`'s default (`hydrate: true`)
295
- # path would otherwise redo. Every value inside it — a `Runtime::
296
- # Value` (frozen through, see value.rb's own header) or a `list_of`
297
- # attribute's own array (`Freezer.deep`d the moment it was built,
298
- # instance.rb's own header on `Instance#dup`) — is already immutable,
299
- # so a bare top-level `.dup` is exactly as safe as `Instance#dup`
300
- # already trusts it to be everywhere else in this codebase; nothing
301
- # below the top level is ever mutated in place. Re-deriving the same
302
- # answer through the codec and through re-hydration is therefore
303
- # pure, avoidable cost for this one caller — never a correctness
304
- # requirement.
305
- #
306
- # `bootstrap_fast_path?` is the guard, and it is deliberately cheap —
307
- # O(this aggregate's own declared attribute count), never O(N) — so
308
- # it cannot reintroduce the very cost it exists to avoid: `StateCodec.
309
- # decoded?` (the obvious-looking alternative) recurses into every
310
- # `list_of` element to check it, which is exactly the O(N) walk this
311
- # whole change removes. A `Hash` with every top-level key already a
312
- # `Symbol` is what `Instance#state` always looks like (`Value.hydrate`
313
- # refuses anything else, coercion.rb's own header), so it is checked
314
- # here instead — true for the actual shape every real save has,
315
- # false (falling back to the always-correct slow path) for anything
316
- # that somehow doesn't.
317
- #
318
- # Verified empirically before landing, not just argued: instrumenting
319
- # every bootstrapping-time save across a full `grammar_registry` boot
320
- # and comparing this fast path's own state, journal entry, and stored
321
- # `Instance` against the unmodified `StateCodec.copy` + `Instance.new
322
- # (hydrate: true)` pipeline's found them equal (`==`) for every one of
323
- # 6,617 saves, zero mismatches.
241
+ # Ids are assigned as the 1-based position at enqueue and rows are never
242
+ # removed, so the id is the row's index plus one.
243
+ def outbox_row(id)
244
+ return nil unless id.is_a?(Integer) && id >= 1
245
+
246
+ @outbox[id - 1]
247
+ end
248
+
249
+ # Skips the codec copy and rehydration round trip while judging the
250
+ # self-hosted grammar (S17, ADR 0026), where re-validating already-valid
251
+ # entity state costs O(N) per save and O(N^2) across an N-row table.
252
+ # Safe only here: `entry.state` is already hydrated, validated, deep-
253
+ # frozen state from the same Value machinery the skipped paths rerun.
254
+ # The check itself must stay O(this aggregate's attribute count), not
255
+ # O(N), so it can't reintroduce the cost it exists to avoid.
324
256
  def bootstrap_fast_path?(state)
325
257
  Runtime::Value.judge_bootstrapping? && state.is_a?(Hash) && state.keys.all?(Symbol)
326
258
  end
@@ -2,20 +2,8 @@
2
2
 
3
3
  module Hecks
4
4
  module Adapters
5
- # A generic stand-in for a real Checkout-Session-style adapter — no
6
- # network call, no real account, matching whatever real payment
7
- # adapter a project pairs it with by shape alone
8
- # (`create_session(event:, registration_id:, success_url:, cancel_url:)
9
- # -> a URL string`), the same way `Memory` stands in for a real
10
- # persistence adapter without knowing anything about the domain bound
11
- # to it. Never reads `event`'s own fields — a real adapter needs the
12
- # price/name inside it to build a session a payer actually sees;
13
- # this only needs to look enough like one to swap in.
14
- #
15
- # The URL it returns carries the same `registration_id` a real
16
- # webhook's metadata would, so a caller building its own signed
17
- # webhook against it (a smoke test, CI) has something real to key
18
- # off of — the real shape production has, minus the network hop.
5
+ # A network-free stand-in for a Checkout-Session-style payment adapter, matching it by
6
+ # method shape alone. The returned URL carries `registration_id`, as webhook metadata would.
19
7
  class MockStripeAdapter
20
8
  # Accepts and discards the shared adapter constructor arguments; this adapter holds no
21
9
  # state of its own.
@@ -29,14 +17,10 @@ module Hecks
29
17
  # Builds a fake checkout URL carrying `registration_id`, standing in for a real
30
18
  # Checkout-Session call.
31
19
  #
32
- # @param event [Object] the record data a real adapter would read the price and name
33
- # from; adapter-defined shape (whatever the declaring bluebook's `checkout` port
34
- # operation supplies as `event`) and never read here
35
- # @param registration_id [String] the registration id to key a signed webhook off of;
36
- # embedded in the returned URL, never read otherwise
20
+ # @param event [Object] the record data a real adapter would read; never read here
21
+ # @param registration_id [String] embedded in the returned URL, never read otherwise
37
22
  # @param success_url [String] the base URL to redirect a successful payer to
38
- # @param cancel_url [String] accepted for the shared checkout-adapter call shape and
39
- # never read
23
+ # @param cancel_url [String] accepted for the shared call shape and never read
40
24
  # @return [String] `success_url` with `mock_checkout=1` and `mock_registration_id`
41
25
  # query parameters appended
42
26
  def create_session(event:, registration_id:, success_url:, cancel_url:)