hecks 3.14.0 → 4.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 (419) hide show
  1. checksums.yaml +4 -4
  2. data/examples/pizzas/adapters/fake_processor.rb +34 -0
  3. data/examples/pizzas/adapters/payment_signature.rb +66 -0
  4. data/examples/pizzas/adapters/payment_webhook.rb +87 -0
  5. data/examples/pizzas/bluebook/pizzas.behaviors +33 -0
  6. data/examples/pizzas/bluebook/pizzas.hecksagon +5 -3
  7. data/examples/pizzas/config.ru +22 -0
  8. data/lib/hecks/adapters/driven/prism.rb +0 -2
  9. data/lib/hecks/adapters/driven.rb +0 -2
  10. data/lib/hecks/adapters/driving/json.rb +1 -7
  11. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -2
  12. data/lib/hecks/bluebook/dsl/derivation_words.rb +58 -0
  13. data/lib/hecks/bluebook/dsl/translation_builder.rb +6 -37
  14. data/lib/hecks/bluebook/expression/ast_json.rb +0 -9
  15. data/lib/hecks/bluebook/hecksagon.rb +1 -1
  16. data/lib/hecks/bluebook/meta_validator/translation_judge/rules.rb +7 -10
  17. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +4 -8
  18. data/lib/hecks/bluebook/meta_validator.rb +0 -11
  19. data/lib/hecks/bluebook/translation.rb +18 -10
  20. data/lib/hecks/bluebook/translation_expression/evaluator.rb +63 -0
  21. data/lib/hecks/bluebook/translation_expression/parser.rb +127 -0
  22. data/lib/hecks/bluebook/translation_expression.rb +39 -0
  23. data/lib/hecks/bluebook/translation_plan.rb +70 -0
  24. data/lib/hecks/bluebook.rb +2 -0
  25. data/lib/hecks/chapters.rb +3 -3
  26. data/lib/hecks/composer/adapters/claude_composer.adapter +3 -0
  27. data/lib/hecks/composer/adapters/claude_composer.rb +83 -0
  28. data/lib/hecks/composer/adapters/fake_agent.adapter +3 -0
  29. data/lib/hecks/composer/adapters/fake_agent.rb +55 -0
  30. data/lib/hecks/composer/adapters/jev.adapter +3 -0
  31. data/lib/hecks/composer/adapters/jev.rb +66 -0
  32. data/lib/hecks/composer/agent.rb +113 -0
  33. data/lib/hecks/composer/assistant.rb +110 -0
  34. data/lib/hecks/composer/behavior_run.rb +53 -0
  35. data/lib/hecks/composer/bluebook/composer.bluebook +178 -0
  36. data/lib/hecks/composer/bluebook/composer.hecksagon +16 -0
  37. data/lib/hecks/composer/board.rb +65 -0
  38. data/lib/hecks/composer/board_edit/command_text.rb +39 -0
  39. data/lib/hecks/composer/board_edit/source.rb +84 -0
  40. data/lib/hecks/composer/board_edit.rb +144 -0
  41. data/lib/hecks/composer/check.rb +89 -0
  42. data/lib/hecks/composer/domains.rb +81 -0
  43. data/lib/hecks/composer/jobs.rb +134 -0
  44. data/lib/hecks/composer/layout.rb +37 -0
  45. data/lib/hecks/composer/live.rb +150 -0
  46. data/lib/hecks/composer/outline.rb +48 -0
  47. data/lib/hecks/composer/page.html +989 -0
  48. data/lib/hecks/composer/panels.rb +142 -0
  49. data/lib/hecks/composer/parse.rb +83 -0
  50. data/lib/hecks/composer/plain.rb +28 -0
  51. data/lib/hecks/composer/ports/composer_agent.port +7 -0
  52. data/lib/hecks/composer/session.rb +141 -0
  53. data/lib/hecks/composer/toolbox.rb +166 -0
  54. data/lib/hecks/composer/web.rb +156 -0
  55. data/lib/hecks/composer/workbench.rb +51 -0
  56. data/lib/hecks/composer/workspace.rb +81 -0
  57. data/lib/hecks/composer.rb +17 -0
  58. data/lib/hecks/corpus/adapters.rb +22 -0
  59. data/lib/hecks/corpus/rust.rb +1 -1
  60. data/lib/hecks/corpus/worlds.rb +19 -0
  61. data/lib/hecks/corpus.rb +5 -0
  62. data/lib/hecks/forms/app/commands.rb +2 -3
  63. data/lib/hecks/forms/app/queries.rb +2 -3
  64. data/lib/hecks/forms/app/records.rb +17 -5
  65. data/lib/hecks/forms/command_form_renderer.rb +42 -16
  66. data/lib/hecks/forms/field_controls.rb +2 -2
  67. data/lib/hecks/forms/field_renderer.rb +1 -1
  68. data/lib/hecks/forms/field_shape.rb +36 -17
  69. data/lib/hecks/forms/index_renderer.rb +2 -1
  70. data/lib/hecks/forms/page.rb +1 -1
  71. data/lib/hecks/forms/params.rb +0 -13
  72. data/lib/hecks/forms/query_form_renderer.rb +7 -6
  73. data/lib/hecks/forms/record_renderer.rb +11 -7
  74. data/lib/hecks/forms/rule_words.rb +100 -0
  75. data/lib/hecks/forms/value_object_shape.rb +2 -1
  76. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +0 -3
  77. data/lib/hecks/fuzzing/isolated_boot/worlds.rb +3 -6
  78. data/lib/hecks/fuzzing/replay/filters.rb +2 -6
  79. data/lib/hecks/gate/stages.yml +25 -0
  80. data/lib/hecks/grammar/evolve/seeds.rb +0 -6
  81. data/lib/hecks/grammar/evolve.rb +0 -3
  82. data/lib/hecks/grammar/translation.bluebook +1 -1
  83. data/lib/hecks/hecks/adapters/codebase/composing.rb +56 -0
  84. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +3 -1
  85. data/lib/hecks/hecks/adapters/journal_store/changes.rb +0 -26
  86. data/lib/hecks/hecks/adapters/journal_store/examination.rb +2 -23
  87. data/lib/hecks/hecks/adapters/journal_store/readings.rb +3 -11
  88. data/lib/hecks/hecks/adapters/journal_store.rb +0 -11
  89. data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +4 -11
  90. data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +0 -9
  91. data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +0 -4
  92. data/lib/hecks/hecks/codebase.behaviors +6 -0
  93. data/lib/hecks/hecks/codebase.bluebook +21 -0
  94. data/lib/hecks/hecks/composer.behaviors +68 -0
  95. data/lib/hecks/hecks/context_map.hecksagon +1 -1
  96. data/lib/hecks/hecks/custodian.behaviors +0 -6
  97. data/lib/hecks/hecks/custodian.bluebook +3 -80
  98. data/lib/hecks/hecks/hecks.hecksagon +2 -2
  99. data/lib/hecks/hecks/hecks.world +1 -1
  100. data/lib/hecks/hecks/rehearsal.bluebook +7 -13
  101. data/lib/hecks/kernel_capabilities/templates.rb +4 -4
  102. data/lib/hecks/kernel_capabilities.rb +1 -1
  103. data/lib/hecks/language/bluebook/vocabulary.bluebook +2 -3
  104. data/lib/hecks/language/translation/translation_aggregate.bluebook +21 -24
  105. data/lib/hecks/ports/access_control.rb +2 -2
  106. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +3 -41
  107. data/lib/hecks/ports/persistence/plugins/era/lineage/coverage.rb +7 -7
  108. data/lib/hecks/ports/persistence/plugins/era/lineage/rewrite.rb +25 -2
  109. data/lib/hecks/ports/persistence/plugins/era/lineage/rules.rb +4 -4
  110. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +17 -25
  111. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/base_sql.rb +0 -12
  112. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/domain_rename.rb +1 -1
  113. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +2 -22
  114. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +0 -1
  115. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +9 -3
  116. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +3 -29
  117. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/refusals.rb +2 -26
  118. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +6 -33
  119. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -3
  120. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +2 -4
  121. data/lib/hecks/ports/persistence/plugins/era/translation/expression_sql.rb +52 -0
  122. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +23 -29
  123. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +1 -1
  124. data/lib/hecks/ports/persistence/plugins/era/translation.rb +0 -1
  125. data/lib/hecks/ports/persistence/plugins/era.rb +3 -6
  126. data/lib/hecks/ports.rb +0 -1
  127. data/lib/hecks/projection_files.rb +3 -1
  128. data/lib/hecks/projections/deploy/templates/lambda/nat_comment_oauth.tmpl +1 -1
  129. data/lib/hecks/projections/glossary/entries.rb +10 -4
  130. data/lib/hecks/projections/glossary/groups.rb +42 -0
  131. data/lib/hecks/projections/glossary/html/page.rb +7 -2
  132. data/lib/hecks/projections/glossary/html/parser.rb +1 -1
  133. data/lib/hecks/projections/glossary/html/sections.rb +31 -11
  134. data/lib/hecks/projections/glossary/html.rb +1 -2
  135. data/lib/hecks/projections/glossary/markdown.rb +31 -28
  136. data/lib/hecks/projections/glossary/mermaid.rb +3 -0
  137. data/lib/hecks/projections/glossary/page.css +143 -153
  138. data/lib/hecks/projections/glossary/page.js +63 -3
  139. data/lib/hecks/projections/glossary/sentences/actions.rb +88 -0
  140. data/lib/hecks/projections/glossary/sentences/paths.rb +77 -0
  141. data/lib/hecks/projections/glossary/sentences/queries.rb +90 -0
  142. data/lib/hecks/projections/glossary/sentences/value_objects.rb +32 -5
  143. data/lib/hecks/projections/glossary/sentences.rb +13 -3
  144. data/lib/hecks/projections/glossary/slugs.rb +4 -1
  145. data/lib/hecks/projections/glossary.rb +2 -1
  146. data/lib/hecks/projections/plain_english.rb +97 -0
  147. data/lib/hecks/projections/rust_vocabulary/arguments.rb +2 -2
  148. data/lib/hecks/projections/rust_vocabulary/enum_body.rb +20 -25
  149. data/lib/hecks/projections/rust_vocabulary/tests.rb +2 -2
  150. data/lib/hecks/projections/rust_vocabulary.rb +14 -6
  151. data/lib/hecks/projections/site/cms_editor/color.rb +0 -6
  152. data/lib/hecks/projections/statements/actions.rb +99 -0
  153. data/lib/hecks/projections/statements/relationships.rb +86 -0
  154. data/lib/hecks/projections/statements.rb +15 -24
  155. data/lib/hecks/projector/exporter/adapters.rb +112 -0
  156. data/lib/hecks/projector/exporter/translations.rb +18 -35
  157. data/lib/hecks/projector/exporter/worlds.rb +103 -0
  158. data/lib/hecks/projector/exporter.rb +5 -1
  159. data/lib/hecks/quality_control/adapters/agent.rb +6 -7
  160. data/lib/hecks/quality_control/adapters/agent_profile.rb +16 -114
  161. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +1 -1
  162. data/lib/hecks/runtime/loader/boot_steps.rb +0 -20
  163. data/lib/hecks/runtime/outbox.rb +2 -9
  164. data/lib/hecks/runtime/port_operation_interpreter.rb +1 -9
  165. data/lib/hecks/runtime/remote_dispatcher.rb +2 -2
  166. data/lib/hecks/runtime/value.rb +13 -0
  167. data/lib/hecks/rust_build/project_rust/target_ir.rb +23 -4
  168. data/lib/hecks/rust_build/wasm.rb +0 -12
  169. data/lib/hecks/rust_build/write_if_changed.rb +12 -12
  170. data/lib/hecks/rust_format.rb +77 -0
  171. data/lib/hecks/tools/fuzz_sweep/findings.rb +3 -9
  172. data/lib/hecks/tools/fuzz_sweep.rb +1 -3
  173. data/lib/hecks/tools/translation_audit/verdicts.rb +3 -28
  174. data/lib/hecks/tools/translation_audit.rb +8 -10
  175. data/lib/hecks/tools/translation_scaffold/reporting.rb +1 -1
  176. data/lib/hecks/version.rb +1 -1
  177. data/lib/hecks/vocabulary.rb +2 -1
  178. data/lib/hecks.rb +3 -0
  179. data/prebuilt/{a883a7e568667aa5ac904c82daff356bdf9e996252a36af6def4a4a43efb967e.marshal → 02c09c73b272c1fb5a9ae6d87bb5e5e529208e00f6b4b597dc2c0fd70a9c0964.marshal} +0 -0
  180. data/prebuilt/{1a6f596be124228be93eba1d86dbc9d2933190fa389b284331241cb9f27115a0.marshal → bb84a835cf6a15136bad5ca03aa5bf93a5b92f5f72444618d3ef2412b987fb32.marshal} +0 -0
  181. data/prebuilt/{verdicts-872993b1aa26d73fe48f28251374b8585fed145d02aab42be0f00de386b6ff80.json → verdicts-f1f10da14c8e8f01b4c9b7e3e2d74be8cd2bf4676364ed17fa16975d2a076d75.json} +1 -1
  182. data/rust/Cargo.toml +40 -0
  183. data/rust/build/Cargo.toml +36 -0
  184. data/rust/build/clippy.toml +4 -0
  185. data/rust/build/src/adapters_pass.rs +196 -0
  186. data/rust/build/src/binding_pass.rs +54 -13
  187. data/rust/build/src/build_artifact.rs +23 -5
  188. data/rust/build/src/cargo_sync.rs +69 -26
  189. data/rust/build/src/lineage_pass.rs +101 -87
  190. data/rust/build/src/main.rs +11 -2
  191. data/rust/build/src/pipeline.rs +80 -19
  192. data/rust/build/src/reserved_names.rs +6 -50
  193. data/rust/build/src/resolve.rs +82 -35
  194. data/rust/build/src/rustfmt.rs +100 -0
  195. data/rust/build/src/seams_pass.rs +85 -16
  196. data/rust/build/src/subprocess.rs +30 -6
  197. data/rust/build/src/tmp.rs +5 -2
  198. data/rust/build/src/translation_pass.rs +72 -22
  199. data/rust/build/src/world_pass.rs +109 -0
  200. data/rust/clippy.toml +4 -0
  201. data/rust/codegen/Cargo.toml +36 -0
  202. data/rust/codegen/clippy.toml +4 -0
  203. data/rust/codegen/src/asks.rs +40 -14
  204. data/rust/codegen/src/attr.rs +2 -2
  205. data/rust/codegen/src/bridging.rs +676 -117
  206. data/rust/codegen/src/commands.rs +979 -373
  207. data/rust/codegen/src/constraints.rs +88 -25
  208. data/rust/codegen/src/dependency_planning.rs +128 -34
  209. data/rust/codegen/src/domain_generator.rs +300 -170
  210. data/rust/codegen/src/exemplar.rs +87 -32
  211. data/rust/codegen/src/expr_emitter.rs +54 -6
  212. data/rust/codegen/src/fielded.rs +193 -41
  213. data/rust/codegen/src/hecks_naming.rs +124 -16
  214. data/rust/codegen/src/hecks_naming_tests.rs +81 -0
  215. data/rust/codegen/src/json.rs +80 -44
  216. data/rust/codegen/src/json_codec.rs +585 -149
  217. data/rust/codegen/src/literal.rs +104 -138
  218. data/rust/codegen/src/main.rs +145 -52
  219. data/rust/codegen/src/manifest.rs +76 -14
  220. data/rust/codegen/src/mutations.rs +1212 -239
  221. data/rust/codegen/src/naming.rs +111 -60
  222. data/rust/codegen/src/optional_pass.rs +90 -28
  223. data/rust/codegen/src/ports.rs +5 -4
  224. data/rust/codegen/src/prelude.rs +139 -49
  225. data/rust/codegen/src/queries.rs +601 -226
  226. data/rust/codegen/src/reactions.rs +268 -74
  227. data/rust/codegen/src/read_models.rs +606 -205
  228. data/rust/codegen/src/reference_specs.rs +16 -3
  229. data/rust/codegen/src/registry.rs +128 -79
  230. data/rust/codegen/src/reserved_names.rs +6 -50
  231. data/rust/codegen/src/shared.rs +71 -22
  232. data/rust/codegen/src/sidecars.rs +15 -5
  233. data/rust/codegen/src/skip_reason.rs +8 -2
  234. data/rust/codegen/src/types.rs +306 -108
  235. data/rust/host/Cargo.lock +1 -0
  236. data/rust/host/Cargo.toml +40 -4
  237. data/rust/host/HECKS_RELEASE +1 -1
  238. data/rust/host/clippy.toml +4 -0
  239. data/rust/host/src/api.rs +698 -218
  240. data/rust/host/src/auth.rs +491 -214
  241. data/rust/host/src/b64.rs +91 -0
  242. data/rust/host/src/bin/expr_harness.rs +6 -2
  243. data/rust/host/src/bin/lineage_harness.rs +47 -11
  244. data/rust/host/src/bin/mint_harness.rs +70 -37
  245. data/rust/host/src/bin/validate_harness.rs +16 -8
  246. data/rust/host/src/boot.rs +144 -68
  247. data/rust/host/src/boundary_fuzz/api.rs +130 -32
  248. data/rust/host/src/boundary_fuzz/auth.rs +108 -23
  249. data/rust/host/src/boundary_fuzz/expr_json.rs +85 -11
  250. data/rust/host/src/boundary_fuzz/ir.rs +164 -12
  251. data/rust/host/src/boundary_fuzz/server.rs +283 -36
  252. data/rust/host/src/boundary_fuzz/web.rs +56 -8
  253. data/rust/host/src/checkout.rs +78 -32
  254. data/rust/host/src/clock.rs +8 -0
  255. data/rust/host/src/commerce_ir.rs +333 -95
  256. data/rust/host/src/crypto.rs +33 -0
  257. data/rust/host/src/dispatch.rs +990 -331
  258. data/rust/host/src/expr_json.rs +1021 -273
  259. data/rust/host/src/extension.rs +24 -4
  260. data/rust/host/src/field_hints.rs +11 -7
  261. data/rust/host/src/fuzz_support.rs +85 -13
  262. data/rust/host/src/host.rs +100 -0
  263. data/rust/host/src/http.rs +22 -0
  264. data/rust/host/src/ir.rs +326 -16
  265. data/rust/host/src/journal.rs +277 -176
  266. data/rust/host/src/lambda_client.rs +219 -53
  267. data/rust/host/src/lib.rs +16 -4
  268. data/rust/host/src/log.rs +62 -11
  269. data/rust/host/src/mint.rs +1153 -326
  270. data/rust/host/src/needs.rs +185 -44
  271. data/rust/host/src/payments/keystore.rs +197 -45
  272. data/rust/host/src/payments/roles.rs +39 -7
  273. data/rust/host/src/payments/tests.rs +1427 -282
  274. data/rust/host/src/payments.rs +391 -112
  275. data/rust/host/src/platform_signin/attack_tests.rs +5 -5
  276. data/rust/host/src/platform_signin/config.rs +11 -11
  277. data/rust/host/src/platform_signin/cookie.rs +2 -2
  278. data/rust/host/src/platform_signin/extension.rs +2 -1
  279. data/rust/host/src/platform_signin/handler.rs +9 -8
  280. data/rust/host/src/platform_signin/jti.rs +4 -2
  281. data/rust/host/src/platform_signin/jwks.rs +2 -1
  282. data/rust/host/src/platform_signin/jws.rs +2 -37
  283. data/rust/host/src/platform_signin/known_answer_tests.rs +5 -1
  284. data/rust/host/src/platform_signin/mode_tests.rs +5 -3
  285. data/rust/host/src/platform_signin/pages.rs +20 -20
  286. data/rust/host/src/platform_signin/session.rs +8 -1
  287. data/rust/host/src/platform_signin/settings.rs +6 -6
  288. data/rust/host/src/platform_signin/strict_json.rs +12 -9
  289. data/rust/host/src/platform_signin/verify.rs +41 -41
  290. data/rust/host/src/platform_signin/wiring_support.rs +13 -18
  291. data/rust/host/src/presentation.rs +207 -63
  292. data/rust/host/src/presentation_write.rs +502 -187
  293. data/rust/host/src/query_step.rs +69 -18
  294. data/rust/host/src/rate_limit.rs +541 -142
  295. data/rust/host/src/reference_transform.rs +77 -25
  296. data/rust/host/src/reference_validate.rs +443 -104
  297. data/rust/host/src/resend.rs +190 -55
  298. data/rust/host/src/secrets.rs +116 -21
  299. data/rust/host/src/server.rs +483 -104
  300. data/rust/host/src/storage_shape.rs +88 -21
  301. data/rust/host/src/test_pg.rs +17 -7
  302. data/rust/host/src/ui_schema.rs +495 -207
  303. data/rust/host/src/wasm_runner.rs +21 -6
  304. data/rust/host/src/web/commerce.rs +101 -23
  305. data/rust/host/src/web/newsletter/cooldown.rs +10 -3
  306. data/rust/host/src/web/newsletter/template.rs +26 -7
  307. data/rust/host/src/web/newsletter/tests.rs +112 -23
  308. data/rust/host/src/web/newsletter.rs +209 -59
  309. data/rust/host/src/web/newsletter_send.rs +251 -79
  310. data/rust/host/src/web/registration_receipt/tests.rs +16 -4
  311. data/rust/host/src/web/registration_receipt.rs +100 -24
  312. data/rust/host/src/web/registrations.rs +1384 -332
  313. data/rust/host/src/web/resend_webhook.rs +138 -80
  314. data/rust/host/src/web.rs +2416 -508
  315. data/rust/lsp/Cargo.toml +36 -0
  316. data/rust/lsp/clippy.toml +4 -0
  317. data/rust/lsp/src/json.rs +29 -22
  318. data/rust/lsp/src/main.rs +81 -31
  319. data/rust/lsp/src/outline.rs +23 -7
  320. data/rust/lsp/src/rpc.rs +17 -4
  321. data/rust/parser/Cargo.toml +36 -0
  322. data/rust/parser/clippy.toml +4 -0
  323. data/rust/parser/src/build/closed_sets.rs +6 -1
  324. data/rust/parser/src/build/identity.rs +4 -3
  325. data/rust/parser/src/build/mod.rs +1 -1
  326. data/rust/parser/src/build/named_pattern.rs +4 -1
  327. data/rust/parser/src/build/naming.rs +2 -80
  328. data/rust/parser/src/build/pattern_subset.rs +6 -8
  329. data/rust/parser/src/build/query_derive.rs +3 -1
  330. data/rust/parser/src/build/query_inference.rs +14 -5
  331. data/rust/parser/src/build/read_model.rs +4 -1
  332. data/rust/parser/src/build/references.rs +4 -3
  333. data/rust/parser/src/canonical.rs +34 -15
  334. data/rust/parser/src/emit.rs +187 -105
  335. data/rust/parser/src/expr/ast_json.rs +134 -42
  336. data/rust/parser/src/expr/evaluator.rs +27 -9
  337. data/rust/parser/src/expr/mod.rs +54 -13
  338. data/rust/parser/src/expr/resolver.rs +299 -92
  339. data/rust/parser/src/ir.rs +35 -3
  340. data/rust/parser/src/keywords.rs +7168 -516
  341. data/rust/parser/src/lex.rs +11 -25
  342. data/rust/parser/src/lib.rs +1 -0
  343. data/rust/parser/src/main.rs +65 -6
  344. data/rust/parser/src/parse/adapter.rs +157 -0
  345. data/rust/parser/src/parse/aggregate.rs +19 -10
  346. data/rust/parser/src/parse/chapter.rs +16 -17
  347. data/rust/parser/src/parse/command.rs +35 -16
  348. data/rust/parser/src/parse/domain_port.rs +4 -7
  349. data/rust/parser/src/parse/entity.rs +21 -11
  350. data/rust/parser/src/parse/hecksagon.rs +10 -4
  351. data/rust/parser/src/parse/lifecycle.rs +9 -5
  352. data/rust/parser/src/parse/mod.rs +22 -91
  353. data/rust/parser/src/parse/needs.rs +21 -12
  354. data/rust/parser/src/parse/policy.rs +2 -2
  355. data/rust/parser/src/parse/process_manager.rs +9 -11
  356. data/rust/parser/src/parse/query.rs +8 -4
  357. data/rust/parser/src/parse/read_model.rs +57 -16
  358. data/rust/parser/src/parse/value_object.rs +7 -2
  359. data/rust/parser/src/parse/world.rs +322 -0
  360. data/rust/parser/src/ruby_value.rs +7 -6
  361. data/rust/src/exemplar/json.rs +4 -4
  362. data/rust/src/exemplar/mutations.rs +18 -0
  363. data/rust/src/exemplar/read_models.rs +1 -10
  364. data/rust/src/kernel/attribute_shapes/composite.rs +54 -14
  365. data/rust/src/kernel/attribute_shapes/list.rs +2 -2
  366. data/rust/src/kernel/attribute_shapes/mod.rs +8 -8
  367. data/rust/src/kernel/attribute_shapes/scalar.rs +2 -2
  368. data/rust/src/kernel/cli.rs +229 -112
  369. data/rust/src/kernel/dispatch.rs +323 -115
  370. data/rust/src/kernel/dispatch_guard_tests.rs +327 -65
  371. data/rust/src/kernel/expr.rs +203 -86
  372. data/rust/src/kernel/expression_operators/arithmetic.rs +138 -25
  373. data/rust/src/kernel/expression_operators/comparison.rs +87 -2
  374. data/rust/src/kernel/expression_operators/enumeration.rs +106 -22
  375. data/rust/src/kernel/expression_operators/logical.rs +9 -3
  376. data/rust/src/kernel/expression_operators/membership.rs +3 -1
  377. data/rust/src/kernel/expression_operators/mod.rs +34 -21
  378. data/rust/src/kernel/expression_operators/pattern_match.rs +46 -11
  379. data/rust/src/kernel/expression_operators/positional.rs +84 -30
  380. data/rust/src/kernel/expression_operators/presence.rs +52 -13
  381. data/rust/src/kernel/expression_operators/sign_test.rs +3 -1
  382. data/rust/src/kernel/expression_operators/sized.rs +24 -8
  383. data/rust/src/kernel/expression_operators/text.rs +120 -27
  384. data/rust/src/kernel/expression_operators/to_string.rs +10 -4
  385. data/rust/src/kernel/json.rs +230 -148
  386. data/rust/src/kernel/mod.rs +46 -33
  387. data/rust/src/kernel/named_query.rs +63 -15
  388. data/rust/src/kernel/needs.rs +112 -25
  389. data/rust/src/kernel/orchestrate.rs +980 -581
  390. data/rust/src/kernel/orchestrate_guard_tests.rs +538 -140
  391. data/rust/src/kernel/pattern.rs +107 -34
  392. data/rust/src/kernel/query_comparators.rs +118 -41
  393. data/rust/src/kernel/query_ordering.rs +13 -5
  394. data/rust/src/kernel/read_model.rs +479 -181
  395. data/rust/src/kernel/reference_lookup.rs +122 -26
  396. data/rust/src/kernel/repository.rs +293 -66
  397. data/rust/src/kernel/routing.rs +58 -42
  398. data/rust/src/kernel/ruby_float.rs +139 -0
  399. data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +57 -57
  400. data/rust/src/kernel/vocab/entity_dispatch_order.rs +54 -54
  401. data/rust/src/kernel/vocab/field_hint.rs +19 -25
  402. data/rust/src/kernel/vocab/mod.rs +6 -6
  403. data/rust/src/kernel/vocab/query_comparator.rs +23 -24
  404. data/rust/src/kernel/vocab/refusal_template.rs +501 -297
  405. data/rust/src/lib.rs +50 -0
  406. data/rust/src/main.rs +4 -1
  407. data/rust/web/Cargo.toml +36 -0
  408. data/rust/web/clippy.toml +4 -0
  409. metadata +82 -15
  410. data/examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb +0 -36
  411. data/lib/hecks/adapters/driven/google_authentication.adapter +0 -3
  412. data/lib/hecks/adapters/driven/google_authentication.rb +0 -99
  413. data/lib/hecks/adapters/driven/mock_stripe_adapter.adapter +0 -3
  414. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +0 -32
  415. data/lib/hecks/ports/authentication.port +0 -6
  416. data/lib/hecks/ports/authentication.rb +0 -67
  417. data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +0 -255
  418. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +0 -22
  419. data/rust/host/src/approval.rs +0 -652
data/rust/src/lib.rs CHANGED
@@ -1,8 +1,58 @@
1
1
  //! Library face of the crate, shared by the native/WASI binary and the rust/web browser cdylib.
2
2
  //! Std-only, zero Cargo dependencies (ADR 0012); wasm-bindgen lives in rust/web.
3
+
4
+ // Generated code keeps one shape for every domain, so a domain with no arms still has its `match`,
5
+ // a store still has its `new()`, a chapter may hold an aggregate named like itself
6
+ // (identity::identity), and every command gets the same signature whether or not it uses all of
7
+ // it. Clippy's complaints about that shape are not bugs to fix per file; the generators fix the
8
+ // ones that are real (see the emitters in rust/codegen/src).
9
+ #[allow(
10
+ clippy::match_single_binding,
11
+ clippy::match_like_matches_macro,
12
+ clippy::new_without_default,
13
+ clippy::module_inception,
14
+ clippy::needless_pass_by_value,
15
+ clippy::needless_pass_by_ref_mut,
16
+ clippy::unused_self,
17
+ clippy::unnecessary_wraps,
18
+ clippy::trivially_copy_pass_by_ref,
19
+ clippy::no_effect_underscore_binding,
20
+ clippy::missing_const_for_fn,
21
+ clippy::derive_partial_eq_without_eq,
22
+ clippy::single_match_else,
23
+ clippy::needless_continue,
24
+ clippy::implicit_clone,
25
+ clippy::assigning_clones,
26
+ clippy::doc_link_with_quotes,
27
+ clippy::redundant_closure_for_method_calls
28
+ )]
3
29
  pub mod generated;
4
30
  pub mod kernel;
5
31
 
6
32
  // Test-only: rust/codegen/src/exemplar.rs slices shapes out of this; never in a release build.
33
+ // The files are templates with placeholder bodies, named after their placeholders, so they are
34
+ // neither formatted nor linted as code.
7
35
  #[cfg(test)]
36
+ #[rustfmt::skip]
37
+ #[allow(
38
+ clippy::match_single_binding,
39
+ clippy::match_like_matches_macro,
40
+ clippy::new_without_default,
41
+ clippy::ptr_arg,
42
+ clippy::borrow_deref_ref,
43
+ clippy::needless_pass_by_value,
44
+ clippy::needless_pass_by_ref_mut,
45
+ clippy::unused_self,
46
+ clippy::unnecessary_wraps,
47
+ clippy::trivially_copy_pass_by_ref,
48
+ clippy::no_effect_underscore_binding,
49
+ clippy::missing_const_for_fn,
50
+ clippy::derive_partial_eq_without_eq,
51
+ clippy::use_self,
52
+ clippy::uninlined_format_args,
53
+ clippy::redundant_closure_for_method_calls,
54
+ clippy::map_unwrap_or,
55
+ clippy::doc_link_with_quotes,
56
+ unused_mut
57
+ )]
8
58
  pub mod exemplar;
data/rust/src/main.rs CHANGED
@@ -11,6 +11,9 @@ fn main() {
11
11
  return;
12
12
  }
13
13
  let mut input = String::new();
14
- std::io::stdin().read_to_string(&mut input).expect("failed to read stdin");
14
+ if let Err(error) = std::io::stdin().read_to_string(&mut input) {
15
+ eprintln!("failed to read stdin: {error}");
16
+ std::process::exit(1);
17
+ }
15
18
  println!("{}", rust::kernel::cli::run(&input));
16
19
  }
data/rust/web/Cargo.toml CHANGED
@@ -16,3 +16,39 @@ crate-type = ["cdylib"]
16
16
  [dependencies]
17
17
  rust = { path = ".." }
18
18
  wasm-bindgen = "=0.2.126"
19
+
20
+ # Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
21
+ # out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
22
+ # The same table is in every crate's Cargo.toml; change them together.
23
+ [lints.clippy]
24
+ pedantic = { level = "warn", priority = -1 }
25
+ nursery = { level = "warn", priority = -1 }
26
+ unwrap_used = "warn"
27
+ expect_used = "warn"
28
+ panic = "warn"
29
+ dbg_macro = "warn"
30
+ todo = "warn"
31
+ unimplemented = "warn"
32
+ # Lints that ask for prose or an attribute on every item rather than for better code.
33
+ missing_errors_doc = "allow"
34
+ missing_panics_doc = "allow"
35
+ must_use_candidate = "allow"
36
+ return_self_not_must_use = "allow"
37
+ module_name_repetitions = "allow"
38
+ too_many_lines = "allow"
39
+ too_long_first_doc_paragraph = "allow"
40
+ doc_markdown = "allow"
41
+ # Numeric conversions here are deliberate: JSON numbers are f64 and ids are small.
42
+ cast_possible_truncation = "allow"
43
+ cast_possible_wrap = "allow"
44
+ cast_precision_loss = "allow"
45
+ cast_sign_loss = "allow"
46
+ # Naming heuristics that fire on ordinary short names.
47
+ similar_names = "allow"
48
+ many_single_char_names = "allow"
49
+ struct_field_names = "allow"
50
+ # Heuristics that cost more clarity than they buy here.
51
+ redundant_pub_crate = "allow"
52
+ future_not_send = "allow"
53
+ significant_drop_tightening = "allow"
54
+ match_same_arms = "allow"
@@ -0,0 +1,4 @@
1
+ # The restriction lints (unwrap, expect, panic) guard library code; a test panics to fail.
2
+ allow-unwrap-in-tests = true
3
+ allow-expect-in-tests = true
4
+ allow-panic-in-tests = true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hecks
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.14.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Young
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-10-17 00:00:00.000000000 Z
11
+ date: 2026-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: prism
@@ -35,12 +35,15 @@ executables:
35
35
  extensions: []
36
36
  extra_rdoc_files: []
37
37
  files:
38
- - examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb
38
+ - examples/pizzas/adapters/fake_processor.rb
39
+ - examples/pizzas/adapters/payment_signature.rb
40
+ - examples/pizzas/adapters/payment_webhook.rb
39
41
  - examples/pizzas/bluebook/pizzas.behaviors
40
42
  - examples/pizzas/bluebook/pizzas.bluebook
41
43
  - examples/pizzas/bluebook/pizzas.hecksagon
42
44
  - examples/pizzas/bluebook/pizzas.world
43
45
  - examples/pizzas/bluebook/translations/2-77625c.bluebook
46
+ - examples/pizzas/config.ru
44
47
  - examples/pizzas/oidc.json
45
48
  - examples/pizzas/pizzas_behaviors.hecksagon
46
49
  - exe/hecks
@@ -54,8 +57,6 @@ files:
54
57
  - lib/hecks/adapters/driven/d1/connection.rb
55
58
  - lib/hecks/adapters/driven/folder.adapter
56
59
  - lib/hecks/adapters/driven/folder.rb
57
- - lib/hecks/adapters/driven/google_authentication.adapter
58
- - lib/hecks/adapters/driven/google_authentication.rb
59
60
  - lib/hecks/adapters/driven/governance_authorization.adapter
60
61
  - lib/hecks/adapters/driven/governance_authorization.rb
61
62
  - lib/hecks/adapters/driven/heki.adapter
@@ -79,8 +80,6 @@ files:
79
80
  - lib/hecks/adapters/driven/memory/outbox_rows.rb
80
81
  - lib/hecks/adapters/driven/memory/shared_elements.rb
81
82
  - lib/hecks/adapters/driven/memory/shared_elements/values.rb
82
- - lib/hecks/adapters/driven/mock_stripe_adapter.adapter
83
- - lib/hecks/adapters/driven/mock_stripe_adapter.rb
84
83
  - lib/hecks/adapters/driven/postgres.adapter
85
84
  - lib/hecks/adapters/driven/postgres.rb
86
85
  - lib/hecks/adapters/driven/postgres/codec.rb
@@ -242,6 +241,7 @@ files:
242
241
  - lib/hecks/bluebook/dsl/command_builder/owner.rb
243
242
  - lib/hecks/bluebook/dsl/command_builder/rules.rb
244
243
  - lib/hecks/bluebook/dsl/const_shim.rb
244
+ - lib/hecks/bluebook/dsl/derivation_words.rb
245
245
  - lib/hecks/bluebook/dsl/domain_port_builder.rb
246
246
  - lib/hecks/bluebook/dsl/entity_builder.rb
247
247
  - lib/hecks/bluebook/dsl/entity_builder/rules.rb
@@ -337,6 +337,10 @@ files:
337
337
  - lib/hecks/bluebook/smoke_test.rb
338
338
  - lib/hecks/bluebook/synthesizer.rb
339
339
  - lib/hecks/bluebook/translation.rb
340
+ - lib/hecks/bluebook/translation_expression.rb
341
+ - lib/hecks/bluebook/translation_expression/evaluator.rb
342
+ - lib/hecks/bluebook/translation_expression/parser.rb
343
+ - lib/hecks/bluebook/translation_plan.rb
340
344
  - lib/hecks/bluebook/value_object.rb
341
345
  - lib/hecks/cache_dir.rb
342
346
  - lib/hecks/canonical_json.rb
@@ -406,11 +410,45 @@ files:
406
410
  - lib/hecks/codemod.rb
407
411
  - lib/hecks/codemod/runner.rb
408
412
  - lib/hecks/codemod/sweep.rb
413
+ - lib/hecks/composer.rb
414
+ - lib/hecks/composer/adapters/claude_composer.adapter
415
+ - lib/hecks/composer/adapters/claude_composer.rb
416
+ - lib/hecks/composer/adapters/fake_agent.adapter
417
+ - lib/hecks/composer/adapters/fake_agent.rb
418
+ - lib/hecks/composer/adapters/jev.adapter
419
+ - lib/hecks/composer/adapters/jev.rb
420
+ - lib/hecks/composer/agent.rb
421
+ - lib/hecks/composer/assistant.rb
422
+ - lib/hecks/composer/behavior_run.rb
423
+ - lib/hecks/composer/bluebook/composer.bluebook
424
+ - lib/hecks/composer/bluebook/composer.hecksagon
425
+ - lib/hecks/composer/board.rb
426
+ - lib/hecks/composer/board_edit.rb
427
+ - lib/hecks/composer/board_edit/command_text.rb
428
+ - lib/hecks/composer/board_edit/source.rb
429
+ - lib/hecks/composer/check.rb
430
+ - lib/hecks/composer/domains.rb
431
+ - lib/hecks/composer/jobs.rb
432
+ - lib/hecks/composer/layout.rb
433
+ - lib/hecks/composer/live.rb
434
+ - lib/hecks/composer/outline.rb
435
+ - lib/hecks/composer/page.html
436
+ - lib/hecks/composer/panels.rb
437
+ - lib/hecks/composer/parse.rb
438
+ - lib/hecks/composer/plain.rb
439
+ - lib/hecks/composer/ports/composer_agent.port
440
+ - lib/hecks/composer/session.rb
441
+ - lib/hecks/composer/toolbox.rb
442
+ - lib/hecks/composer/web.rb
443
+ - lib/hecks/composer/workbench.rb
444
+ - lib/hecks/composer/workspace.rb
409
445
  - lib/hecks/construct.rb
410
446
  - lib/hecks/corpus.rb
447
+ - lib/hecks/corpus/adapters.rb
411
448
  - lib/hecks/corpus/routes.rb
412
449
  - lib/hecks/corpus/rust.rb
413
450
  - lib/hecks/corpus/sources.rb
451
+ - lib/hecks/corpus/worlds.rb
414
452
  - lib/hecks/deploy/bluebook/deploy.bluebook
415
453
  - lib/hecks/deploy/bluebook/deploy.hecksagon
416
454
  - lib/hecks/deploy/oidc.json
@@ -453,6 +491,7 @@ files:
453
491
  - lib/hecks/forms/record_renderer.rb
454
492
  - lib/hecks/forms/record_table.rb
455
493
  - lib/hecks/forms/reference_options.rb
494
+ - lib/hecks/forms/rule_words.rb
456
495
  - lib/hecks/forms/text_shape.rb
457
496
  - lib/hecks/forms/value_object_shape.rb
458
497
  - lib/hecks/fqn.rb
@@ -593,6 +632,7 @@ files:
593
632
  - lib/hecks/grammar/translation.oidc.json
594
633
  - lib/hecks/hecks/adapters/bluebook_report.rb
595
634
  - lib/hecks/hecks/adapters/codebase/codemods.rb
635
+ - lib/hecks/hecks/adapters/codebase/composing.rb
596
636
  - lib/hecks/hecks/adapters/codebase/conformance.rb
597
637
  - lib/hecks/hecks/adapters/codebase/corpus_tasks.rb
598
638
  - lib/hecks/hecks/adapters/codebase/gate.rb
@@ -691,6 +731,7 @@ files:
691
731
  - lib/hecks/hecks/adapters/world_clearing.rb
692
732
  - lib/hecks/hecks/codebase.behaviors
693
733
  - lib/hecks/hecks/codebase.bluebook
734
+ - lib/hecks/hecks/composer.behaviors
694
735
  - lib/hecks/hecks/context_map.hecksagon
695
736
  - lib/hecks/hecks/custodian.behaviors
696
737
  - lib/hecks/hecks/custodian.bluebook
@@ -749,8 +790,6 @@ files:
749
790
  - lib/hecks/ports/agent.port
750
791
  - lib/hecks/ports/agent.rb
751
792
  - lib/hecks/ports/agent/answers.rb
752
- - lib/hecks/ports/authentication.port
753
- - lib/hecks/ports/authentication.rb
754
793
  - lib/hecks/ports/authorization.port
755
794
  - lib/hecks/ports/authorization.rb
756
795
  - lib/hecks/ports/clock.port
@@ -820,12 +859,11 @@ files:
820
859
  - lib/hecks/ports/persistence/plugins/era/postgres_era/sagas.rb
821
860
  - lib/hecks/ports/persistence/plugins/era/storage_shape.rb
822
861
  - lib/hecks/ports/persistence/plugins/era/translation.rb
823
- - lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb
824
862
  - lib/hecks/ports/persistence/plugins/era/translation/audit.rb
825
- - lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb
826
863
  - lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb
827
864
  - lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb
828
865
  - lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb
866
+ - lib/hecks/ports/persistence/plugins/era/translation/expression_sql.rb
829
867
  - lib/hecks/ports/persistence/plugins/era/translation/reattest.rb
830
868
  - lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb
831
869
  - lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb
@@ -1064,6 +1102,7 @@ files:
1064
1102
  - lib/hecks/projections/diagrams/structure.rb
1065
1103
  - lib/hecks/projections/glossary.rb
1066
1104
  - lib/hecks/projections/glossary/entries.rb
1105
+ - lib/hecks/projections/glossary/groups.rb
1067
1106
  - lib/hecks/projections/glossary/html.rb
1068
1107
  - lib/hecks/projections/glossary/html/page.rb
1069
1108
  - lib/hecks/projections/glossary/html/parser.rb
@@ -1076,6 +1115,9 @@ files:
1076
1115
  - lib/hecks/projections/glossary/sections.rb
1077
1116
  - lib/hecks/projections/glossary/sensitivity.rb
1078
1117
  - lib/hecks/projections/glossary/sentences.rb
1118
+ - lib/hecks/projections/glossary/sentences/actions.rb
1119
+ - lib/hecks/projections/glossary/sentences/paths.rb
1120
+ - lib/hecks/projections/glossary/sentences/queries.rb
1079
1121
  - lib/hecks/projections/glossary/sentences/value_objects.rb
1080
1122
  - lib/hecks/projections/glossary/slugs.rb
1081
1123
  - lib/hecks/projections/ir.rb
@@ -1083,6 +1125,7 @@ files:
1083
1125
  - lib/hecks/projections/model/deviations.rb
1084
1126
  - lib/hecks/projections/oidc.rb
1085
1127
  - lib/hecks/projections/parser_table.rb
1128
+ - lib/hecks/projections/plain_english.rb
1086
1129
  - lib/hecks/projections/reference.rb
1087
1130
  - lib/hecks/projections/rust_vocabulary.rb
1088
1131
  - lib/hecks/projections/rust_vocabulary/arguments.rb
@@ -1231,6 +1274,8 @@ files:
1231
1274
  - lib/hecks/projections/site/table/row_builder.rb
1232
1275
  - lib/hecks/projections/site/table/row_defaults.rb
1233
1276
  - lib/hecks/projections/statements.rb
1277
+ - lib/hecks/projections/statements/actions.rb
1278
+ - lib/hecks/projections/statements/relationships.rb
1234
1279
  - lib/hecks/projections/vocabulary.rb
1235
1280
  - lib/hecks/projector.rb
1236
1281
  - lib/hecks/projector/cli_audience.rb
@@ -1247,9 +1292,11 @@ files:
1247
1292
  - lib/hecks/projector/docs_projector/behaviour.rb
1248
1293
  - lib/hecks/projector/docs_projector/closing.rb
1249
1294
  - lib/hecks/projector/exporter.rb
1295
+ - lib/hecks/projector/exporter/adapters.rb
1250
1296
  - lib/hecks/projector/exporter/bindings.rb
1251
1297
  - lib/hecks/projector/exporter/capability_values.rb
1252
1298
  - lib/hecks/projector/exporter/translations.rb
1299
+ - lib/hecks/projector/exporter/worlds.rb
1253
1300
  - lib/hecks/projector/ir_projector.rb
1254
1301
  - lib/hecks/projector/narrate_projector.rb
1255
1302
  - lib/hecks/projector/narrate_projector/commands.rb
@@ -1518,6 +1565,7 @@ files:
1518
1565
  - lib/hecks/rust_build/wasm.rb
1519
1566
  - lib/hecks/rust_build/wasm_browser.rb
1520
1567
  - lib/hecks/rust_build/write_if_changed.rb
1568
+ - lib/hecks/rust_format.rb
1521
1569
  - lib/hecks/served_options.rb
1522
1570
  - lib/hecks/site/bluebook/site.bluebook
1523
1571
  - lib/hecks/site/bluebook/site.hecksagon
@@ -1637,9 +1685,9 @@ files:
1637
1685
  - lib/rubocop/cop/hecks/symbol_string_key_mix.rb
1638
1686
  - lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb
1639
1687
  - lib/rubocop/cop/hecks/untyped_raise.rb
1640
- - prebuilt/1a6f596be124228be93eba1d86dbc9d2933190fa389b284331241cb9f27115a0.marshal
1641
- - prebuilt/a883a7e568667aa5ac904c82daff356bdf9e996252a36af6def4a4a43efb967e.marshal
1642
- - prebuilt/verdicts-872993b1aa26d73fe48f28251374b8585fed145d02aab42be0f00de386b6ff80.json
1688
+ - prebuilt/02c09c73b272c1fb5a9ae6d87bb5e5e529208e00f6b4b597dc2c0fd70a9c0964.marshal
1689
+ - prebuilt/bb84a835cf6a15136bad5ca03aa5bf93a5b92f5f72444618d3ef2412b987fb32.marshal
1690
+ - prebuilt/verdicts-f1f10da14c8e8f01b4c9b7e3e2d74be8cd2bf4676364ed17fa16975d2a076d75.json
1643
1691
  - qa/settings.yml
1644
1692
  - rust/.cargo/config.toml
1645
1693
  - rust/.cargo/mutants.toml
@@ -1650,6 +1698,8 @@ files:
1650
1698
  - rust/build/.gitignore
1651
1699
  - rust/build/Cargo.lock
1652
1700
  - rust/build/Cargo.toml
1701
+ - rust/build/clippy.toml
1702
+ - rust/build/src/adapters_pass.rs
1653
1703
  - rust/build/src/binding_pass.rs
1654
1704
  - rust/build/src/build_artifact.rs
1655
1705
  - rust/build/src/cargo_sync.rs
@@ -1659,14 +1709,18 @@ files:
1659
1709
  - rust/build/src/reserved_names.rs
1660
1710
  - rust/build/src/resolve.rs
1661
1711
  - rust/build/src/root.rs
1712
+ - rust/build/src/rustfmt.rs
1662
1713
  - rust/build/src/seams_pass.rs
1663
1714
  - rust/build/src/subprocess.rs
1664
1715
  - rust/build/src/tmp.rs
1665
1716
  - rust/build/src/translation_pass.rs
1717
+ - rust/build/src/world_pass.rs
1718
+ - rust/clippy.toml
1666
1719
  - rust/codegen/.cargo/config.toml
1667
1720
  - rust/codegen/.gitignore
1668
1721
  - rust/codegen/Cargo.lock
1669
1722
  - rust/codegen/Cargo.toml
1723
+ - rust/codegen/clippy.toml
1670
1724
  - rust/codegen/src/asks.rs
1671
1725
  - rust/codegen/src/attr.rs
1672
1726
  - rust/codegen/src/bridging.rs
@@ -1678,6 +1732,7 @@ files:
1678
1732
  - rust/codegen/src/expr_emitter.rs
1679
1733
  - rust/codegen/src/fielded.rs
1680
1734
  - rust/codegen/src/hecks_naming.rs
1735
+ - rust/codegen/src/hecks_naming_tests.rs
1681
1736
  - rust/codegen/src/json.rs
1682
1737
  - rust/codegen/src/json_codec.rs
1683
1738
  - rust/codegen/src/literal.rs
@@ -1703,10 +1758,11 @@ files:
1703
1758
  - rust/host/Cargo.lock
1704
1759
  - rust/host/Cargo.toml
1705
1760
  - rust/host/HECKS_RELEASE
1761
+ - rust/host/clippy.toml
1706
1762
  - rust/host/rds-ca-bundle.pem
1707
1763
  - rust/host/src/api.rs
1708
- - rust/host/src/approval.rs
1709
1764
  - rust/host/src/auth.rs
1765
+ - rust/host/src/b64.rs
1710
1766
  - rust/host/src/bin/expr_harness.rs
1711
1767
  - rust/host/src/bin/lineage_harness.rs
1712
1768
  - rust/host/src/bin/mint_harness.rs
@@ -1719,12 +1775,16 @@ files:
1719
1775
  - rust/host/src/boundary_fuzz/server.rs
1720
1776
  - rust/host/src/boundary_fuzz/web.rs
1721
1777
  - rust/host/src/checkout.rs
1778
+ - rust/host/src/clock.rs
1722
1779
  - rust/host/src/commerce_ir.rs
1780
+ - rust/host/src/crypto.rs
1723
1781
  - rust/host/src/dispatch.rs
1724
1782
  - rust/host/src/expr_json.rs
1725
1783
  - rust/host/src/extension.rs
1726
1784
  - rust/host/src/field_hints.rs
1727
1785
  - rust/host/src/fuzz_support.rs
1786
+ - rust/host/src/host.rs
1787
+ - rust/host/src/http.rs
1728
1788
  - rust/host/src/ir.rs
1729
1789
  - rust/host/src/journal.rs
1730
1790
  - rust/host/src/lambda_client.rs
@@ -1788,6 +1848,7 @@ files:
1788
1848
  - rust/lsp/Cargo.lock
1789
1849
  - rust/lsp/Cargo.toml
1790
1850
  - rust/lsp/README.md
1851
+ - rust/lsp/clippy.toml
1791
1852
  - rust/lsp/src/diagnostics.rs
1792
1853
  - rust/lsp/src/json.rs
1793
1854
  - rust/lsp/src/main.rs
@@ -1797,6 +1858,7 @@ files:
1797
1858
  - rust/parser/.gitignore
1798
1859
  - rust/parser/Cargo.lock
1799
1860
  - rust/parser/Cargo.toml
1861
+ - rust/parser/clippy.toml
1800
1862
  - rust/parser/fuzz/.gitignore
1801
1863
  - rust/parser/fuzz/Cargo.lock
1802
1864
  - rust/parser/fuzz/Cargo.toml
@@ -1824,7 +1886,9 @@ files:
1824
1886
  - rust/parser/src/ir.rs
1825
1887
  - rust/parser/src/keywords.rs
1826
1888
  - rust/parser/src/lex.rs
1889
+ - rust/parser/src/lib.rs
1827
1890
  - rust/parser/src/main.rs
1891
+ - rust/parser/src/parse/adapter.rs
1828
1892
  - rust/parser/src/parse/aggregate.rs
1829
1893
  - rust/parser/src/parse/chapter.rs
1830
1894
  - rust/parser/src/parse/command.rs
@@ -1840,6 +1904,7 @@ files:
1840
1904
  - rust/parser/src/parse/query.rs
1841
1905
  - rust/parser/src/parse/read_model.rs
1842
1906
  - rust/parser/src/parse/value_object.rs
1907
+ - rust/parser/src/parse/world.rs
1843
1908
  - rust/parser/src/ruby_value.rs
1844
1909
  - rust/src/exemplar/commands.rs
1845
1910
  - rust/src/exemplar/constraints.rs
@@ -1887,6 +1952,7 @@ files:
1887
1952
  - rust/src/kernel/reference_lookup.rs
1888
1953
  - rust/src/kernel/repository.rs
1889
1954
  - rust/src/kernel/routing.rs
1955
+ - rust/src/kernel/ruby_float.rs
1890
1956
  - rust/src/kernel/vocab/aggregate_dispatch_order.rs
1891
1957
  - rust/src/kernel/vocab/entity_dispatch_order.rs
1892
1958
  - rust/src/kernel/vocab/field_hint.rs
@@ -1898,6 +1964,7 @@ files:
1898
1964
  - rust/web/.gitignore
1899
1965
  - rust/web/Cargo.lock
1900
1966
  - rust/web/Cargo.toml
1967
+ - rust/web/clippy.toml
1901
1968
  - rust/web/src/lib.rs
1902
1969
  homepage: https://github.com/heckslabs/hecks
1903
1970
  licenses:
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Driving adapter standing in for a Stripe webhook handler: boots Pizzas and calls
4
- # Dispatcher#dispatch_port, which translates the payment into PizzaPaymentReceived.
5
- #
6
- # examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb
7
-
8
- $LOAD_PATH.unshift File.expand_path("../../../../lib", __dir__)
9
-
10
- require "hecks"
11
-
12
- DOMAIN = File.expand_path("../..", __dir__)
13
- RUNTIME = Hecks.boot(DOMAIN)
14
-
15
- # Unique per run: identity is never minted, so a repeated name would be refused as AlreadyExists.
16
- NAME = "StripeDemoMargherita-#{Process.pid}-#{rand(10_000)}".freeze
17
-
18
- # Set the stage: an order Purchase's `given` rules will accept.
19
- order = Order.create_pizza(name: { value: NAME }, pizza: { price_cents: { cents: 1200 }, size: { value: "large" } })
20
- order.add_topping(topping: { value: "Basil" }, amount: { value: 3 })
21
-
22
- puts "Before payment: #{order.status}, customer=#{order.customer_name.inspect}"
23
-
24
- # The webhook: a real handler would verify a Stripe signature; a reference is always a bare id.
25
- RUNTIME.dispatch_port(
26
- "Pizzas", "Order", "PaymentGateway", "Receive",
27
- flat: {
28
- name: NAME,
29
- customer_name: { value: "Chris" },
30
- amount: { cents: 1200 }
31
- }
32
- )
33
-
34
- sold = Order.find(NAME)
35
- puts "After payment: #{sold.status}, customer=#{sold.customer_name.to_h}"
36
- puts "Events: #{sold.events.map(&:name).join(", ")}"
@@ -1,3 +0,0 @@
1
- Hecks.adapter "GoogleAuthentication" do
2
- port "authentication"
3
- end
@@ -1,99 +0,0 @@
1
- require "securerandom"
2
-
3
- require_relative "../../ports/authentication"
4
-
5
- module Hecks
6
- module Adapters
7
- # Google's OIDC handshake — the `authentication` port's adapter for Google
8
- # sign-in, via `oauth2` (code exchange) and `google-id-token` (verification).
9
- #
10
- # `oauth2`/`google-id-token` load lazily, inside the methods that use
11
- # them, so a domain that never binds this adapter never needs them installed.
12
- #
13
- # `GOOGLE_CLIENT_ID`/`GOOGLE_CLIENT_SECRET`/`GOOGLE_REDIRECT_URI` have no
14
- # defaults, on purpose: a half-configured login should refuse to boot.
15
- module GoogleAuthentication
16
- ISSUER = "https://accounts.google.com".freeze
17
-
18
- module_function
19
-
20
- # Builds the OAuth2 client for Google's token endpoints.
21
- #
22
- # @return [OAuth2::Client] a client configured for Google's OAuth2/OIDC endpoints
23
- # @raise [KeyError] if `GOOGLE_CLIENT_ID` or `GOOGLE_CLIENT_SECRET` is unset
24
- def client
25
- require "oauth2"
26
- OAuth2::Client.new(
27
- ENV.fetch("GOOGLE_CLIENT_ID"), ENV.fetch("GOOGLE_CLIENT_SECRET"),
28
- site: "https://oauth2.googleapis.com",
29
- authorize_url: "https://accounts.google.com/o/oauth2/v2/auth",
30
- token_url: "/token"
31
- )
32
- end
33
-
34
- # The URL to send a browser to, carrying a fresh CSRF `state` the caller
35
- # must stash (typically in a session) and check again in `verify`.
36
- #
37
- # @return [Array(String, String)] the URL to send the browser to, and the fresh CSRF
38
- # `state` embedded in it
39
- # @raise [KeyError] if `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` or
40
- # `GOOGLE_REDIRECT_URI` is unset
41
- def authorization_url
42
- state = SecureRandom.hex(24)
43
- url = client.auth_code.authorize_url(
44
- redirect_uri: ENV.fetch("GOOGLE_REDIRECT_URI"),
45
- scope: "openid email profile",
46
- state: state
47
- )
48
- [url, state]
49
- end
50
-
51
- # Exchanges `code` for tokens and verifies the ID token against Google's
52
- # JWKS; `email_verified` tells a caller if Google actually checked the email.
53
- # @param code [String] the authorization code the provider sent back
54
- # @param state [String, nil] the state parameter the provider returned; nil is refused
55
- # @param expected_state [String, nil] the state `authorization_url` handed out before
56
- # the redirect; nil is refused
57
- # @return [Hash{Symbol => Object}] `issuer:` and `subject:` (String), `email:` (String,
58
- # or nil if the token carries none), `email_verified:` (Boolean)
59
- # @raise [Ports::Authentication::ValidationError] if the state check, code exchange, or
60
- # ID token verification fails
61
- # @raise [KeyError] if `GOOGLE_CLIENT_ID` or `GOOGLE_REDIRECT_URI` is unset, or a
62
- # verified token lacks an `iss` or `sub` claim
63
- def verify(code:, state:, expected_state:)
64
- # Both requires happen up front: the rescue below matches
65
- # GoogleIDToken::ValidationError, resolved only when caught, so
66
- # requiring it lazily after an OAuth2::Error would mask the real failure.
67
- require "oauth2"
68
- require "google-id-token"
69
-
70
- raise Ports::Authentication::ValidationError, "state mismatch" unless state && expected_state && state == expected_state
71
-
72
- identity(GoogleIDToken::Validator.new.check(exchange(code), ENV.fetch("GOOGLE_CLIENT_ID")))
73
- rescue OAuth2::Error, GoogleIDToken::ValidationError => e
74
- raise Ports::Authentication::ValidationError, e.message
75
- end
76
-
77
- # Exchanges an authorization code for the provider's raw ID token.
78
- #
79
- # @param code [String] the authorization code the provider sent back
80
- # @return [String] the unverified ID token
81
- # @raise [Ports::Authentication::ValidationError] if the response carries no ID token
82
- def exchange(code)
83
- token = client.auth_code.get_token(code, redirect_uri: ENV.fetch("GOOGLE_REDIRECT_URI"))
84
- token.params["id_token"] or raise Ports::Authentication::ValidationError, "no id_token in the response"
85
- end
86
-
87
- # Reads the identity claims out of a verified ID token payload.
88
- #
89
- # @param payload [Hash{String => Object}] the verified token claims
90
- # @return [Hash{Symbol => Object}] the same shape `verify` returns
91
- def identity(payload)
92
- {
93
- issuer: payload.fetch("iss"), subject: payload.fetch("sub"),
94
- email: payload["email"], email_verified: [true, "true"].include?(payload["email_verified"])
95
- }
96
- end
97
- end
98
- end
99
- end
@@ -1,3 +0,0 @@
1
- Hecks.adapter "MockStripeAdapter" do
2
- port "checkout"
3
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Hecks
4
- module Adapters
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.
7
- class MockStripeAdapter
8
- # Accepts and discards the shared adapter constructor arguments; this adapter holds no
9
- # state of its own.
10
- #
11
- # @param aggregate [Bluebook::Aggregate, nil] accepted for the shared adapter
12
- # constructor shape and ignored
13
- # @param settings [Hash] accepted for the shared adapter constructor shape and ignored
14
- # @param root [String, nil] accepted for the shared adapter constructor shape and ignored
15
- def initialize(aggregate: nil, settings: {}, root: nil); end
16
-
17
- # Builds a fake checkout URL carrying `registration_id`, standing in for a real
18
- # Checkout-Session call.
19
- #
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
22
- # @param success_url [String] the base URL to redirect a successful payer to
23
- # @param cancel_url [String] accepted for the shared call shape and never read
24
- # @return [String] `success_url` with `mock_checkout=1` and `mock_registration_id`
25
- # query parameters appended
26
- def create_session(event:, registration_id:, success_url:, cancel_url:)
27
- separator = success_url.include?("?") ? "&" : "?"
28
- "#{success_url}#{separator}mock_checkout=1&mock_registration_id=#{registration_id}"
29
- end
30
- end
31
- end
32
- end
@@ -1,6 +0,0 @@
1
- Hecks.port "authentication" do
2
- verb "authenticated_by"
3
- signal :reply
4
- answers :authorization_url
5
- answers :verify
6
- end