hecks 3.13.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 (440) 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.bluebook +4 -4
  7. data/examples/pizzas/bluebook/pizzas.hecksagon +5 -3
  8. data/examples/pizzas/config.ru +22 -0
  9. data/lib/hecks/adapters/driven/prism.rb +0 -2
  10. data/lib/hecks/adapters/driven.rb +0 -2
  11. data/lib/hecks/adapters/driving/json.rb +1 -7
  12. data/lib/hecks/bluebook/dsl/attribute_collector.rb +15 -5
  13. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -2
  14. data/lib/hecks/bluebook/dsl/derivation_words.rb +58 -0
  15. data/lib/hecks/bluebook/dsl/translation_builder.rb +6 -37
  16. data/lib/hecks/bluebook/expression/ast_json.rb +0 -9
  17. data/lib/hecks/bluebook/hecksagon.rb +1 -1
  18. data/lib/hecks/bluebook/meta_validator/translation_judge/rules.rb +7 -10
  19. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +4 -8
  20. data/lib/hecks/bluebook/meta_validator.rb +0 -11
  21. data/lib/hecks/bluebook/named_pattern.rb +33 -0
  22. data/lib/hecks/bluebook/translation.rb +18 -10
  23. data/lib/hecks/bluebook/translation_expression/evaluator.rb +63 -0
  24. data/lib/hecks/bluebook/translation_expression/parser.rb +127 -0
  25. data/lib/hecks/bluebook/translation_expression.rb +39 -0
  26. data/lib/hecks/bluebook/translation_plan.rb +70 -0
  27. data/lib/hecks/bluebook.rb +3 -0
  28. data/lib/hecks/chapters.rb +3 -3
  29. data/lib/hecks/cli/domain_stub.rb +1 -1
  30. data/lib/hecks/cli/interview_aggregate.rb +4 -4
  31. data/lib/hecks/composer/adapters/claude_composer.adapter +3 -0
  32. data/lib/hecks/composer/adapters/claude_composer.rb +83 -0
  33. data/lib/hecks/composer/adapters/fake_agent.adapter +3 -0
  34. data/lib/hecks/composer/adapters/fake_agent.rb +55 -0
  35. data/lib/hecks/composer/adapters/jev.adapter +3 -0
  36. data/lib/hecks/composer/adapters/jev.rb +66 -0
  37. data/lib/hecks/composer/agent.rb +113 -0
  38. data/lib/hecks/composer/assistant.rb +110 -0
  39. data/lib/hecks/composer/behavior_run.rb +53 -0
  40. data/lib/hecks/composer/bluebook/composer.bluebook +178 -0
  41. data/lib/hecks/composer/bluebook/composer.hecksagon +16 -0
  42. data/lib/hecks/composer/board.rb +65 -0
  43. data/lib/hecks/composer/board_edit/command_text.rb +39 -0
  44. data/lib/hecks/composer/board_edit/source.rb +84 -0
  45. data/lib/hecks/composer/board_edit.rb +144 -0
  46. data/lib/hecks/composer/check.rb +89 -0
  47. data/lib/hecks/composer/domains.rb +81 -0
  48. data/lib/hecks/composer/jobs.rb +134 -0
  49. data/lib/hecks/composer/layout.rb +37 -0
  50. data/lib/hecks/composer/live.rb +150 -0
  51. data/lib/hecks/composer/outline.rb +48 -0
  52. data/lib/hecks/composer/page.html +989 -0
  53. data/lib/hecks/composer/panels.rb +142 -0
  54. data/lib/hecks/composer/parse.rb +83 -0
  55. data/lib/hecks/composer/plain.rb +28 -0
  56. data/lib/hecks/composer/ports/composer_agent.port +7 -0
  57. data/lib/hecks/composer/session.rb +141 -0
  58. data/lib/hecks/composer/toolbox.rb +166 -0
  59. data/lib/hecks/composer/web.rb +156 -0
  60. data/lib/hecks/composer/workbench.rb +51 -0
  61. data/lib/hecks/composer/workspace.rb +81 -0
  62. data/lib/hecks/composer.rb +17 -0
  63. data/lib/hecks/corpus/adapters.rb +22 -0
  64. data/lib/hecks/corpus/rust.rb +1 -1
  65. data/lib/hecks/corpus/worlds.rb +19 -0
  66. data/lib/hecks/corpus.rb +5 -0
  67. data/lib/hecks/deploy/bluebook/deploy.bluebook +34 -34
  68. data/lib/hecks/forms/app/commands.rb +2 -3
  69. data/lib/hecks/forms/app/queries.rb +2 -3
  70. data/lib/hecks/forms/app/records.rb +17 -5
  71. data/lib/hecks/forms/command_form_renderer.rb +42 -16
  72. data/lib/hecks/forms/field_controls.rb +2 -2
  73. data/lib/hecks/forms/field_renderer.rb +1 -1
  74. data/lib/hecks/forms/field_shape.rb +36 -17
  75. data/lib/hecks/forms/index_renderer.rb +2 -1
  76. data/lib/hecks/forms/page.rb +1 -1
  77. data/lib/hecks/forms/params.rb +0 -13
  78. data/lib/hecks/forms/query_form_renderer.rb +7 -6
  79. data/lib/hecks/forms/record_renderer.rb +11 -7
  80. data/lib/hecks/forms/rule_words.rb +100 -0
  81. data/lib/hecks/forms/value_object_shape.rb +2 -1
  82. data/lib/hecks/framework/bluebook/change.bluebook +2 -2
  83. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +0 -3
  84. data/lib/hecks/fuzzing/domain_generator/block_rendering.rb +1 -1
  85. data/lib/hecks/fuzzing/isolated_boot/worlds.rb +3 -6
  86. data/lib/hecks/fuzzing/replay/filters.rb +2 -6
  87. data/lib/hecks/gate/stages.yml +25 -0
  88. data/lib/hecks/grammar/evolve/seeds.rb +0 -6
  89. data/lib/hecks/grammar/evolve.rb +0 -3
  90. data/lib/hecks/grammar/translation.bluebook +1 -1
  91. data/lib/hecks/hecks/adapters/codebase/composing.rb +56 -0
  92. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +3 -1
  93. data/lib/hecks/hecks/adapters/journal_store/changes.rb +0 -26
  94. data/lib/hecks/hecks/adapters/journal_store/examination.rb +2 -23
  95. data/lib/hecks/hecks/adapters/journal_store/readings.rb +3 -11
  96. data/lib/hecks/hecks/adapters/journal_store.rb +0 -11
  97. data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +4 -11
  98. data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +0 -9
  99. data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +0 -4
  100. data/lib/hecks/hecks/codebase.behaviors +6 -0
  101. data/lib/hecks/hecks/codebase.bluebook +58 -37
  102. data/lib/hecks/hecks/composer.behaviors +68 -0
  103. data/lib/hecks/hecks/context_map.hecksagon +1 -1
  104. data/lib/hecks/hecks/custodian.behaviors +0 -6
  105. data/lib/hecks/hecks/custodian.bluebook +15 -92
  106. data/lib/hecks/hecks/hecks.bluebook +2 -2
  107. data/lib/hecks/hecks/hecks.hecksagon +2 -2
  108. data/lib/hecks/hecks/hecks.world +1 -1
  109. data/lib/hecks/hecks/rehearsal.bluebook +10 -16
  110. data/lib/hecks/hecks/tooling.bluebook +22 -22
  111. data/lib/hecks/kernel_capabilities/templates.rb +4 -4
  112. data/lib/hecks/kernel_capabilities.rb +1 -1
  113. data/lib/hecks/language/bluebook/aggregate.bluebook +1 -0
  114. data/lib/hecks/language/bluebook/command.bluebook +1 -0
  115. data/lib/hecks/language/bluebook/entity.bluebook +1 -0
  116. data/lib/hecks/language/bluebook/query.bluebook +1 -0
  117. data/lib/hecks/language/bluebook/shape.bluebook +8 -7
  118. data/lib/hecks/language/bluebook/vocabulary.bluebook +2 -3
  119. data/lib/hecks/language/hecksagon/port_operation.bluebook +1 -0
  120. data/lib/hecks/language/translation/translation_aggregate.bluebook +21 -24
  121. data/lib/hecks/ports/access_control.rb +2 -2
  122. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +3 -41
  123. data/lib/hecks/ports/persistence/plugins/era/lineage/coverage.rb +7 -7
  124. data/lib/hecks/ports/persistence/plugins/era/lineage/rewrite.rb +25 -2
  125. data/lib/hecks/ports/persistence/plugins/era/lineage/rules.rb +4 -4
  126. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +17 -25
  127. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/base_sql.rb +0 -12
  128. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/domain_rename.rb +1 -1
  129. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +2 -22
  130. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +0 -1
  131. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +9 -3
  132. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +3 -29
  133. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/refusals.rb +2 -26
  134. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +6 -33
  135. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -3
  136. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +2 -4
  137. data/lib/hecks/ports/persistence/plugins/era/translation/expression_sql.rb +52 -0
  138. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +23 -29
  139. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +1 -1
  140. data/lib/hecks/ports/persistence/plugins/era/translation.rb +0 -1
  141. data/lib/hecks/ports/persistence/plugins/era.rb +3 -6
  142. data/lib/hecks/ports.rb +0 -1
  143. data/lib/hecks/projection_files.rb +3 -1
  144. data/lib/hecks/projections/deploy/templates/lambda/nat_comment_oauth.tmpl +1 -1
  145. data/lib/hecks/projections/glossary/entries.rb +10 -4
  146. data/lib/hecks/projections/glossary/groups.rb +42 -0
  147. data/lib/hecks/projections/glossary/html/page.rb +7 -2
  148. data/lib/hecks/projections/glossary/html/parser.rb +1 -1
  149. data/lib/hecks/projections/glossary/html/sections.rb +31 -11
  150. data/lib/hecks/projections/glossary/html.rb +1 -2
  151. data/lib/hecks/projections/glossary/markdown.rb +31 -28
  152. data/lib/hecks/projections/glossary/mermaid.rb +3 -0
  153. data/lib/hecks/projections/glossary/page.css +143 -153
  154. data/lib/hecks/projections/glossary/page.js +63 -3
  155. data/lib/hecks/projections/glossary/sentences/actions.rb +88 -0
  156. data/lib/hecks/projections/glossary/sentences/paths.rb +77 -0
  157. data/lib/hecks/projections/glossary/sentences/queries.rb +90 -0
  158. data/lib/hecks/projections/glossary/sentences/value_objects.rb +32 -5
  159. data/lib/hecks/projections/glossary/sentences.rb +13 -3
  160. data/lib/hecks/projections/glossary/slugs.rb +4 -1
  161. data/lib/hecks/projections/glossary.rb +2 -1
  162. data/lib/hecks/projections/plain_english.rb +97 -0
  163. data/lib/hecks/projections/rust_vocabulary/arguments.rb +2 -2
  164. data/lib/hecks/projections/rust_vocabulary/enum_body.rb +20 -25
  165. data/lib/hecks/projections/rust_vocabulary/tests.rb +2 -2
  166. data/lib/hecks/projections/rust_vocabulary.rb +14 -6
  167. data/lib/hecks/projections/site/cms_editor/color.rb +0 -6
  168. data/lib/hecks/projections/statements/actions.rb +99 -0
  169. data/lib/hecks/projections/statements/relationships.rb +86 -0
  170. data/lib/hecks/projections/statements.rb +15 -24
  171. data/lib/hecks/projector/exporter/adapters.rb +112 -0
  172. data/lib/hecks/projector/exporter/translations.rb +18 -35
  173. data/lib/hecks/projector/exporter/worlds.rb +103 -0
  174. data/lib/hecks/projector/exporter.rb +5 -1
  175. data/lib/hecks/quality_control/adapters/agent.rb +6 -7
  176. data/lib/hecks/quality_control/adapters/agent_profile.rb +16 -114
  177. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +1 -1
  178. data/lib/hecks/quality_control/quality_control.bluebook +51 -51
  179. data/lib/hecks/runtime/loader/boot_steps.rb +0 -20
  180. data/lib/hecks/runtime/outbox.rb +2 -9
  181. data/lib/hecks/runtime/port_operation_interpreter.rb +1 -9
  182. data/lib/hecks/runtime/remote_dispatcher.rb +2 -2
  183. data/lib/hecks/runtime/value.rb +13 -0
  184. data/lib/hecks/rust_build/project_rust/target_ir.rb +23 -4
  185. data/lib/hecks/rust_build/wasm.rb +0 -12
  186. data/lib/hecks/rust_build/write_if_changed.rb +12 -12
  187. data/lib/hecks/rust_format.rb +77 -0
  188. data/lib/hecks/site/bluebook/site.bluebook +5 -5
  189. data/lib/hecks/sme/bluebook/sme.bluebook +12 -12
  190. data/lib/hecks/tickets/bluebook/tickets.bluebook +3 -3
  191. data/lib/hecks/tools/fuzz_sweep/findings.rb +3 -9
  192. data/lib/hecks/tools/fuzz_sweep.rb +1 -3
  193. data/lib/hecks/tools/translation_audit/verdicts.rb +3 -28
  194. data/lib/hecks/tools/translation_audit.rb +8 -10
  195. data/lib/hecks/tools/translation_scaffold/reporting.rb +1 -1
  196. data/lib/hecks/version.rb +1 -1
  197. data/lib/hecks/vocabulary.rb +2 -1
  198. data/lib/hecks.rb +3 -0
  199. data/prebuilt/{58208399bada10b0db99928c48e38789288fc58f7b71a72b21bfa386680e32ed.marshal → 02c09c73b272c1fb5a9ae6d87bb5e5e529208e00f6b4b597dc2c0fd70a9c0964.marshal} +0 -0
  200. data/prebuilt/{2b59737fbdbd5f44edda0fddce2611f45d76087b3a7c782d1f1a17ea58c77948.marshal → bb84a835cf6a15136bad5ca03aa5bf93a5b92f5f72444618d3ef2412b987fb32.marshal} +0 -0
  201. data/prebuilt/verdicts-f1f10da14c8e8f01b4c9b7e3e2d74be8cd2bf4676364ed17fa16975d2a076d75.json +1 -0
  202. data/rust/Cargo.toml +40 -0
  203. data/rust/build/Cargo.toml +36 -0
  204. data/rust/build/clippy.toml +4 -0
  205. data/rust/build/src/adapters_pass.rs +196 -0
  206. data/rust/build/src/binding_pass.rs +54 -13
  207. data/rust/build/src/build_artifact.rs +23 -5
  208. data/rust/build/src/cargo_sync.rs +69 -26
  209. data/rust/build/src/lineage_pass.rs +101 -87
  210. data/rust/build/src/main.rs +11 -2
  211. data/rust/build/src/pipeline.rs +80 -19
  212. data/rust/build/src/reserved_names.rs +6 -50
  213. data/rust/build/src/resolve.rs +82 -35
  214. data/rust/build/src/rustfmt.rs +100 -0
  215. data/rust/build/src/seams_pass.rs +85 -16
  216. data/rust/build/src/subprocess.rs +30 -6
  217. data/rust/build/src/tmp.rs +5 -2
  218. data/rust/build/src/translation_pass.rs +72 -22
  219. data/rust/build/src/world_pass.rs +109 -0
  220. data/rust/clippy.toml +4 -0
  221. data/rust/codegen/Cargo.toml +36 -0
  222. data/rust/codegen/clippy.toml +4 -0
  223. data/rust/codegen/src/asks.rs +40 -14
  224. data/rust/codegen/src/attr.rs +2 -2
  225. data/rust/codegen/src/bridging.rs +676 -117
  226. data/rust/codegen/src/commands.rs +979 -373
  227. data/rust/codegen/src/constraints.rs +88 -25
  228. data/rust/codegen/src/dependency_planning.rs +128 -34
  229. data/rust/codegen/src/domain_generator.rs +300 -170
  230. data/rust/codegen/src/exemplar.rs +87 -32
  231. data/rust/codegen/src/expr_emitter.rs +54 -6
  232. data/rust/codegen/src/fielded.rs +193 -41
  233. data/rust/codegen/src/hecks_naming.rs +124 -16
  234. data/rust/codegen/src/hecks_naming_tests.rs +81 -0
  235. data/rust/codegen/src/json.rs +80 -44
  236. data/rust/codegen/src/json_codec.rs +585 -149
  237. data/rust/codegen/src/literal.rs +104 -138
  238. data/rust/codegen/src/main.rs +145 -52
  239. data/rust/codegen/src/manifest.rs +76 -14
  240. data/rust/codegen/src/mutations.rs +1212 -239
  241. data/rust/codegen/src/naming.rs +111 -60
  242. data/rust/codegen/src/optional_pass.rs +90 -28
  243. data/rust/codegen/src/ports.rs +5 -4
  244. data/rust/codegen/src/prelude.rs +139 -49
  245. data/rust/codegen/src/queries.rs +601 -226
  246. data/rust/codegen/src/reactions.rs +268 -74
  247. data/rust/codegen/src/read_models.rs +606 -205
  248. data/rust/codegen/src/reference_specs.rs +16 -3
  249. data/rust/codegen/src/registry.rs +128 -79
  250. data/rust/codegen/src/reserved_names.rs +6 -50
  251. data/rust/codegen/src/shared.rs +71 -22
  252. data/rust/codegen/src/sidecars.rs +15 -5
  253. data/rust/codegen/src/skip_reason.rs +8 -2
  254. data/rust/codegen/src/types.rs +306 -108
  255. data/rust/host/Cargo.lock +1 -0
  256. data/rust/host/Cargo.toml +40 -4
  257. data/rust/host/HECKS_RELEASE +1 -1
  258. data/rust/host/clippy.toml +4 -0
  259. data/rust/host/src/api.rs +698 -218
  260. data/rust/host/src/auth.rs +491 -214
  261. data/rust/host/src/b64.rs +91 -0
  262. data/rust/host/src/bin/expr_harness.rs +6 -2
  263. data/rust/host/src/bin/lineage_harness.rs +47 -11
  264. data/rust/host/src/bin/mint_harness.rs +70 -37
  265. data/rust/host/src/bin/validate_harness.rs +16 -8
  266. data/rust/host/src/boot.rs +144 -68
  267. data/rust/host/src/boundary_fuzz/api.rs +130 -32
  268. data/rust/host/src/boundary_fuzz/auth.rs +108 -23
  269. data/rust/host/src/boundary_fuzz/expr_json.rs +85 -11
  270. data/rust/host/src/boundary_fuzz/ir.rs +164 -12
  271. data/rust/host/src/boundary_fuzz/server.rs +283 -36
  272. data/rust/host/src/boundary_fuzz/web.rs +56 -8
  273. data/rust/host/src/checkout.rs +78 -32
  274. data/rust/host/src/clock.rs +8 -0
  275. data/rust/host/src/commerce_ir.rs +333 -95
  276. data/rust/host/src/crypto.rs +33 -0
  277. data/rust/host/src/dispatch.rs +990 -331
  278. data/rust/host/src/expr_json.rs +1021 -273
  279. data/rust/host/src/extension.rs +24 -4
  280. data/rust/host/src/field_hints.rs +11 -7
  281. data/rust/host/src/fuzz_support.rs +85 -13
  282. data/rust/host/src/host.rs +100 -0
  283. data/rust/host/src/http.rs +22 -0
  284. data/rust/host/src/ir.rs +326 -16
  285. data/rust/host/src/journal.rs +277 -176
  286. data/rust/host/src/lambda_client.rs +219 -53
  287. data/rust/host/src/lib.rs +16 -4
  288. data/rust/host/src/log.rs +62 -11
  289. data/rust/host/src/mint.rs +1153 -326
  290. data/rust/host/src/needs.rs +185 -44
  291. data/rust/host/src/payments/keystore.rs +197 -45
  292. data/rust/host/src/payments/roles.rs +191 -0
  293. data/rust/host/src/payments/tests.rs +1445 -275
  294. data/rust/host/src/payments.rs +409 -121
  295. data/rust/host/src/platform_signin/attack_tests.rs +5 -5
  296. data/rust/host/src/platform_signin/config.rs +11 -11
  297. data/rust/host/src/platform_signin/cookie.rs +2 -2
  298. data/rust/host/src/platform_signin/extension.rs +2 -1
  299. data/rust/host/src/platform_signin/handler.rs +9 -8
  300. data/rust/host/src/platform_signin/jti.rs +4 -2
  301. data/rust/host/src/platform_signin/jwks.rs +2 -1
  302. data/rust/host/src/platform_signin/jws.rs +2 -37
  303. data/rust/host/src/platform_signin/known_answer_tests.rs +5 -1
  304. data/rust/host/src/platform_signin/mode_tests.rs +5 -3
  305. data/rust/host/src/platform_signin/pages.rs +20 -20
  306. data/rust/host/src/platform_signin/session.rs +8 -1
  307. data/rust/host/src/platform_signin/settings.rs +6 -6
  308. data/rust/host/src/platform_signin/strict_json.rs +12 -9
  309. data/rust/host/src/platform_signin/verify.rs +41 -41
  310. data/rust/host/src/platform_signin/wiring_support.rs +13 -18
  311. data/rust/host/src/presentation.rs +207 -63
  312. data/rust/host/src/presentation_write.rs +502 -187
  313. data/rust/host/src/query_step.rs +69 -18
  314. data/rust/host/src/rate_limit.rs +541 -142
  315. data/rust/host/src/reference_transform.rs +77 -25
  316. data/rust/host/src/reference_validate.rs +443 -104
  317. data/rust/host/src/resend.rs +190 -55
  318. data/rust/host/src/secrets.rs +116 -21
  319. data/rust/host/src/server.rs +483 -104
  320. data/rust/host/src/storage_shape.rs +88 -21
  321. data/rust/host/src/test_pg.rs +17 -7
  322. data/rust/host/src/ui_schema.rs +495 -207
  323. data/rust/host/src/wasm_runner.rs +21 -6
  324. data/rust/host/src/web/commerce.rs +101 -23
  325. data/rust/host/src/web/newsletter/cooldown.rs +10 -3
  326. data/rust/host/src/web/newsletter/template.rs +26 -7
  327. data/rust/host/src/web/newsletter/tests.rs +112 -23
  328. data/rust/host/src/web/newsletter.rs +209 -59
  329. data/rust/host/src/web/newsletter_send.rs +251 -79
  330. data/rust/host/src/web/registration_receipt/tests.rs +16 -4
  331. data/rust/host/src/web/registration_receipt.rs +100 -24
  332. data/rust/host/src/web/registrations.rs +1384 -332
  333. data/rust/host/src/web/resend_webhook.rs +138 -80
  334. data/rust/host/src/web.rs +2416 -508
  335. data/rust/lsp/Cargo.toml +36 -0
  336. data/rust/lsp/clippy.toml +4 -0
  337. data/rust/lsp/src/json.rs +29 -22
  338. data/rust/lsp/src/main.rs +81 -31
  339. data/rust/lsp/src/outline.rs +23 -7
  340. data/rust/lsp/src/rpc.rs +17 -4
  341. data/rust/parser/Cargo.toml +36 -0
  342. data/rust/parser/clippy.toml +4 -0
  343. data/rust/parser/src/build/closed_sets.rs +6 -1
  344. data/rust/parser/src/build/identity.rs +4 -3
  345. data/rust/parser/src/build/mod.rs +1 -0
  346. data/rust/parser/src/build/named_pattern.rs +26 -0
  347. data/rust/parser/src/build/naming.rs +2 -80
  348. data/rust/parser/src/build/pattern_subset.rs +6 -8
  349. data/rust/parser/src/build/query_derive.rs +3 -1
  350. data/rust/parser/src/build/query_inference.rs +14 -5
  351. data/rust/parser/src/build/read_model.rs +4 -1
  352. data/rust/parser/src/build/references.rs +4 -3
  353. data/rust/parser/src/canonical.rs +34 -15
  354. data/rust/parser/src/emit.rs +187 -105
  355. data/rust/parser/src/expr/ast_json.rs +134 -42
  356. data/rust/parser/src/expr/evaluator.rs +27 -9
  357. data/rust/parser/src/expr/mod.rs +54 -13
  358. data/rust/parser/src/expr/resolver.rs +299 -92
  359. data/rust/parser/src/ir.rs +35 -3
  360. data/rust/parser/src/keywords.rs +7168 -510
  361. data/rust/parser/src/lex.rs +11 -25
  362. data/rust/parser/src/lib.rs +1 -0
  363. data/rust/parser/src/main.rs +65 -6
  364. data/rust/parser/src/parse/adapter.rs +157 -0
  365. data/rust/parser/src/parse/aggregate.rs +19 -10
  366. data/rust/parser/src/parse/chapter.rs +16 -17
  367. data/rust/parser/src/parse/command.rs +35 -16
  368. data/rust/parser/src/parse/domain_port.rs +4 -7
  369. data/rust/parser/src/parse/entity.rs +21 -11
  370. data/rust/parser/src/parse/hecksagon.rs +10 -4
  371. data/rust/parser/src/parse/lifecycle.rs +9 -5
  372. data/rust/parser/src/parse/mod.rs +43 -91
  373. data/rust/parser/src/parse/needs.rs +21 -12
  374. data/rust/parser/src/parse/policy.rs +2 -2
  375. data/rust/parser/src/parse/process_manager.rs +9 -11
  376. data/rust/parser/src/parse/query.rs +8 -4
  377. data/rust/parser/src/parse/read_model.rs +57 -16
  378. data/rust/parser/src/parse/value_object.rs +7 -2
  379. data/rust/parser/src/parse/world.rs +322 -0
  380. data/rust/parser/src/ruby_value.rs +7 -6
  381. data/rust/src/exemplar/json.rs +4 -4
  382. data/rust/src/exemplar/mutations.rs +18 -0
  383. data/rust/src/exemplar/read_models.rs +1 -10
  384. data/rust/src/kernel/attribute_shapes/composite.rs +54 -14
  385. data/rust/src/kernel/attribute_shapes/list.rs +2 -2
  386. data/rust/src/kernel/attribute_shapes/mod.rs +8 -8
  387. data/rust/src/kernel/attribute_shapes/scalar.rs +2 -2
  388. data/rust/src/kernel/cli.rs +229 -112
  389. data/rust/src/kernel/dispatch.rs +323 -115
  390. data/rust/src/kernel/dispatch_guard_tests.rs +327 -65
  391. data/rust/src/kernel/expr.rs +203 -86
  392. data/rust/src/kernel/expression_operators/arithmetic.rs +138 -25
  393. data/rust/src/kernel/expression_operators/comparison.rs +87 -2
  394. data/rust/src/kernel/expression_operators/enumeration.rs +106 -22
  395. data/rust/src/kernel/expression_operators/logical.rs +9 -3
  396. data/rust/src/kernel/expression_operators/membership.rs +3 -1
  397. data/rust/src/kernel/expression_operators/mod.rs +34 -21
  398. data/rust/src/kernel/expression_operators/pattern_match.rs +46 -11
  399. data/rust/src/kernel/expression_operators/positional.rs +84 -30
  400. data/rust/src/kernel/expression_operators/presence.rs +52 -13
  401. data/rust/src/kernel/expression_operators/sign_test.rs +3 -1
  402. data/rust/src/kernel/expression_operators/sized.rs +24 -8
  403. data/rust/src/kernel/expression_operators/text.rs +120 -27
  404. data/rust/src/kernel/expression_operators/to_string.rs +10 -4
  405. data/rust/src/kernel/json.rs +230 -148
  406. data/rust/src/kernel/mod.rs +46 -33
  407. data/rust/src/kernel/named_query.rs +63 -15
  408. data/rust/src/kernel/needs.rs +112 -25
  409. data/rust/src/kernel/orchestrate.rs +980 -581
  410. data/rust/src/kernel/orchestrate_guard_tests.rs +538 -140
  411. data/rust/src/kernel/pattern.rs +107 -34
  412. data/rust/src/kernel/query_comparators.rs +118 -41
  413. data/rust/src/kernel/query_ordering.rs +13 -5
  414. data/rust/src/kernel/read_model.rs +479 -181
  415. data/rust/src/kernel/reference_lookup.rs +122 -26
  416. data/rust/src/kernel/repository.rs +293 -66
  417. data/rust/src/kernel/routing.rs +58 -42
  418. data/rust/src/kernel/ruby_float.rs +139 -0
  419. data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +57 -57
  420. data/rust/src/kernel/vocab/entity_dispatch_order.rs +54 -54
  421. data/rust/src/kernel/vocab/field_hint.rs +19 -25
  422. data/rust/src/kernel/vocab/mod.rs +6 -6
  423. data/rust/src/kernel/vocab/query_comparator.rs +23 -24
  424. data/rust/src/kernel/vocab/refusal_template.rs +501 -297
  425. data/rust/src/lib.rs +50 -0
  426. data/rust/src/main.rs +4 -1
  427. data/rust/web/Cargo.toml +36 -0
  428. data/rust/web/clippy.toml +4 -0
  429. metadata +85 -15
  430. data/examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb +0 -36
  431. data/lib/hecks/adapters/driven/google_authentication.adapter +0 -3
  432. data/lib/hecks/adapters/driven/google_authentication.rb +0 -99
  433. data/lib/hecks/adapters/driven/mock_stripe_adapter.adapter +0 -3
  434. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +0 -32
  435. data/lib/hecks/ports/authentication.port +0 -6
  436. data/lib/hecks/ports/authentication.rb +0 -67
  437. data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +0 -255
  438. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +0 -22
  439. data/prebuilt/verdicts-48318ca172edd21443b1ad02801c697fff100b746e828f09db987647641a5df2.json +0 -1
  440. data/rust/host/src/approval.rs +0 -652
@@ -14,7 +14,7 @@ Hecks.bluebook "Hecks" do
14
14
  identified_by :version
15
15
 
16
16
  value_object "FindingKey" do
17
- attribute :value, String, pattern: '[^ \t\n\r]'
17
+ attribute :value, String, matches: :present
18
18
  end
19
19
 
20
20
  value_object "Version" do
@@ -94,7 +94,7 @@ Hecks.bluebook "Hecks" do
94
94
  identified_by :digest
95
95
 
96
96
  value_object "Digest" do
97
- attribute :value, String, pattern: '[^ \t\n\r]'
97
+ attribute :value, String, matches: :present
98
98
 
99
99
  invariant("a digest is present") { !value.to_s.empty? }
100
100
  end
@@ -2,8 +2,8 @@ Hecks.hecksagon "Hecks" do
2
2
  attaches "Governance"
3
3
 
4
4
  # The chapters the gem carries: the language declared in itself (Paging comes with Bluebook),
5
- # Expression, Tenancy, Deploy, Site, Tickets and QualityControl (the last three bring their own ports).
6
- %w[Bluebook Hecksagon World Adapter Port Translation Expression Tenancy Deploy Site Tickets QualityControl]
5
+ # Expression, Tenancy, Deploy, Site, Tickets, Composer and QualityControl (the last three bring their own ports).
6
+ %w[Bluebook Hecksagon World Adapter Port Translation Expression Tenancy Deploy Site Tickets Composer QualityControl]
7
7
  .each { |chapter| attaches chapter }
8
8
  # Persistence is not bound here: hecks.world's `default_adapter` binds every aggregate, so
9
9
  # environments/memory.world can swap the whole domain without a double bind.
@@ -61,7 +61,7 @@ Hecks.world "Hecks" do
61
61
  CodemodRun TestSuiteRun CorpusRun PublishingRun PromotionRun Release
62
62
  SyntaxBootCache],
63
63
  newcomer: %w[launch.init launch.interview operation.open_console],
64
- chapters: %w[Deploy Governance Tenancy Site Tickets QualityControl],
64
+ chapters: %w[Deploy Governance Tenancy Site Tickets Composer QualityControl],
65
65
  maintainer_chapters: %w[Bluebook Hecksagon World Adapter Port Translation Expression],
66
66
  memory_commands: %w[console init interview],
67
67
  legacy: %w[run docs narrate ir stores model_check smoke_test
@@ -35,7 +35,6 @@ Hecks.bluebook "Hecks" do
35
35
  attribute :after, ShapeLabel, optional: true
36
36
  attribute :minting, Minting, optional: true
37
37
  attribute :edge_present, Switch, optional: true
38
- attribute :edge_approved, Switch, optional: true
39
38
  attribute :refused_rows, list_of(RefusedRow), optional: true
40
39
  attribute :refusal_total, Count, optional: true
41
40
  attribute :audited, Switch, optional: true
@@ -53,14 +52,14 @@ Hecks.bluebook "Hecks" do
53
52
  identified_by :run
54
53
 
55
54
  value_object "RunKey" do
56
- attribute :value, String, pattern: '[^ \t\n\r]'
55
+ attribute :value, String, matches: :present
57
56
 
58
57
  invariant("a rehearsal is named") { !value.to_s.empty? }
59
58
  end
60
59
 
61
60
  # The domain's directory: where its bluebooks and its `.world` stand.
62
61
  value_object "DomainPath" do
63
- attribute :value, String, pattern: '[^\t\n\r]'
62
+ attribute :value, String, matches: :not_empty
64
63
  end
65
64
 
66
65
  # The Hecks the rehearsal must run on: a release (`3.9.0`) or a commit, whole or a prefix.
@@ -69,7 +68,7 @@ Hecks.bluebook "Hecks" do
69
68
  end
70
69
 
71
70
  value_object "HostVersion" do
72
- attribute :value, String, pattern: '[^ \t\n\r]'
71
+ attribute :value, String, matches: :present
73
72
  end
74
73
 
75
74
  # Which strategy the subject's world named for the copy of its data.
@@ -279,15 +278,14 @@ Hecks.bluebook "Hecks" do
279
278
  emits RehearsalBooted
280
279
  end
281
280
 
282
- # The mint's own three layers and its edge, approval and coverage rules, run over the copy.
281
+ # The mint's own three layers and its edge and coverage rules, run over the copy.
283
282
  command "Audit" do
284
283
  role "System"
285
- goal "Record whether an edge leads to the shape and is approved, and every row the mint's audit would refuse"
284
+ goal "Record whether an edge leads to the shape, and every row the mint's audit would refuse"
286
285
 
287
286
  reference_to RehearsalRun
288
287
  attribute :minting, Minting
289
288
  attribute :edge_present, Switch
290
- attribute :edge_approved, Switch
291
289
  attribute :refused_rows, list_of(RefusedRow), optional: true
292
290
  attribute :refusal_total, Count
293
291
  attribute :audited, Switch
@@ -302,7 +300,6 @@ Hecks.bluebook "Hecks" do
302
300
 
303
301
  sets :minting
304
302
  sets :edge_present
305
- sets :edge_approved
306
303
  sets :refused_rows
307
304
  sets :refusal_total
308
305
  sets :audited
@@ -326,7 +323,6 @@ Hecks.bluebook "Hecks" do
326
323
  attribute :verdict, Verdict
327
324
  attribute :refusal_total, Count
328
325
  attribute :edge_present, Switch
329
- attribute :edge_approved, Switch
330
326
 
331
327
  given("a rehearsal that finds a refused row would not mint") { refusal_total.value == 0 }
332
328
  given("a rehearsal judged to mint names that verdict") { verdict.value == "would_mint" }
@@ -439,7 +435,7 @@ Hecks.bluebook "Hecks" do
439
435
 
440
436
  policy "RecordAuditWhenStoreExamined" do
441
437
  on "RehearsalRun.StoreExamined"
442
- trigger RehearsalRun::Audit, with: { minting: :minting, edge_present: :edge_present, edge_approved: :edge_approved,
438
+ trigger RehearsalRun::Audit, with: { minting: :minting, edge_present: :edge_present,
443
439
  refused_rows: :refused_rows, refusal_total: :refusal_total,
444
440
  audited: :audited, rows_examined: :rows_examined,
445
441
  rust_rows_examined: :rust_rows_examined,
@@ -451,11 +447,10 @@ Hecks.bluebook "Hecks" do
451
447
  policy "JudgeWhenNothingWouldStopTheMint" do
452
448
  on "RehearsalRun.RehearsalAudited"
453
449
  where do
454
- (minting.value != "next" || edge_present.value) && refusal_total.value == 0 &&
455
- (minting.value != "next" || edge_approved.value)
450
+ (minting.value != "next" || edge_present.value) && refusal_total.value == 0
456
451
  end
457
452
  trigger RehearsalRun::Judge, with: { verdict: "would_mint", refusal_total: :refusal_total,
458
- edge_present: :edge_present, edge_approved: :edge_approved }
453
+ edge_present: :edge_present }
459
454
  end
460
455
 
461
456
  policy "WithholdWhenNoEdgeLeadsOn" do
@@ -468,10 +463,9 @@ Hecks.bluebook "Hecks" do
468
463
  policy "WithholdWhenTheMintWouldRefuse" do
469
464
  on "RehearsalRun.RehearsalAudited"
470
465
  where do
471
- (minting.value != "next" || edge_present.value) &&
472
- (refusal_total.value > 0 || (minting.value == "next" && !edge_approved.value))
466
+ (minting.value != "next" || edge_present.value) && refusal_total.value > 0
473
467
  end
474
468
  trigger RehearsalRun::Withhold, with: { verdict: "would_refuse",
475
- refusal: "the mint would refuse: see the refused rows and the edge's approval" }
469
+ refusal: "the mint would refuse: see the refused rows" }
476
470
  end
477
471
  end
@@ -10,19 +10,19 @@ Hecks.bluebook "Hecks" do
10
10
  identified_by :domain
11
11
 
12
12
  value_object "DomainPath" do
13
- attribute :value, String, pattern: '[^\t\n\r]'
13
+ attribute :value, String, matches: :not_empty
14
14
 
15
15
  invariant("a domain is named by its path") { !value.to_s.empty? }
16
16
  end
17
17
 
18
18
  value_object "ChapterName" do
19
- attribute :value, String, pattern: '[^ \t\n\r]'
19
+ attribute :value, String, matches: :present
20
20
 
21
21
  invariant("a chapter is named") { !value.to_s.empty? }
22
22
  end
23
23
 
24
24
  value_object "AggregateName" do
25
- attribute :value, String, pattern: '[^ \t\n\r]'
25
+ attribute :value, String, matches: :present
26
26
 
27
27
  invariant("an aggregate is named") { !value.to_s.empty? }
28
28
  end
@@ -128,13 +128,13 @@ Hecks.bluebook "Hecks" do
128
128
  identified_by :run
129
129
 
130
130
  value_object "RunKey" do
131
- attribute :value, String, pattern: '[^ \t\n\r]'
131
+ attribute :value, String, matches: :present
132
132
 
133
133
  invariant("a run is named") { !value.to_s.empty? }
134
134
  end
135
135
 
136
136
  value_object "DomainList" do
137
- attribute :value, String, pattern: '[^\t\n\r]'
137
+ attribute :value, String, matches: :not_empty
138
138
  end
139
139
 
140
140
  value_object "ProfileName" do
@@ -254,7 +254,7 @@ Hecks.bluebook "Hecks" do
254
254
 
255
255
  # A directory: the source repository (`from`), or the project the files land in (`root`).
256
256
  value_object "Location" do
257
- attribute :value, String, pattern: '[^\t\n\r]'
257
+ attribute :value, String, matches: :not_empty
258
258
  end
259
259
 
260
260
  value_object "Report" do
@@ -383,18 +383,18 @@ Hecks.bluebook "Hecks" do
383
383
  identified_by :run
384
384
 
385
385
  value_object "RegistryKey" do
386
- attribute :value, String, pattern: '[^ \t\n\r]'
386
+ attribute :value, String, matches: :present
387
387
 
388
388
  invariant("a release is named") { !value.to_s.empty? }
389
389
  end
390
390
 
391
391
  value_object "PackageName" do
392
- attribute :value, String, pattern: '^[a-z][a-z0-9_]*$'
392
+ attribute :value, String, matches: :snake_name
393
393
  end
394
394
 
395
395
  # The registry repository: the current directory when absent.
396
396
  value_object "Location" do
397
- attribute :value, String, pattern: '[^\t\n\r]'
397
+ attribute :value, String, matches: :not_empty
398
398
  end
399
399
 
400
400
  value_object "Report" do
@@ -520,14 +520,14 @@ Hecks.bluebook "Hecks" do
520
520
  identified_by :run
521
521
 
522
522
  value_object "LaunchKey" do
523
- attribute :value, String, pattern: '[^ \t\n\r]'
523
+ attribute :value, String, matches: :present
524
524
 
525
525
  invariant("a launch is named") { !value.to_s.empty? }
526
526
  end
527
527
 
528
528
  # Domain directories under the project, comma separated.
529
529
  value_object "DomainList" do
530
- attribute :value, String, pattern: '[^\t\n\r]'
530
+ attribute :value, String, matches: :not_empty
531
531
  end
532
532
 
533
533
  value_object "Switch" do
@@ -546,12 +546,12 @@ Hecks.bluebook "Hecks" do
546
546
 
547
547
  # Where the new domain goes; the domain's snake-cased name under the current directory when absent.
548
548
  value_object "TargetDir" do
549
- attribute :value, String, pattern: '[^\t\n\r]'
549
+ attribute :value, String, matches: :not_empty
550
550
  end
551
551
 
552
552
  # Who is interviewed; asked for at the terminal when absent.
553
553
  value_object "ExpertName" do
554
- attribute :value, String, pattern: '[^\t\n\r]'
554
+ attribute :value, String, matches: :not_empty
555
555
  end
556
556
 
557
557
  value_object "Note" do
@@ -724,7 +724,7 @@ Hecks.bluebook "Hecks" do
724
724
  identified_by :run
725
725
 
726
726
  value_object "BuildKey" do
727
- attribute :value, String, pattern: '[^ \t\n\r]'
727
+ attribute :value, String, matches: :present
728
728
 
729
729
  invariant("a build is named") { !value.to_s.empty? }
730
730
  end
@@ -737,18 +737,18 @@ Hecks.bluebook "Hecks" do
737
737
 
738
738
  # A generated module: the directory name a domain was built as.
739
739
  value_object "ModuleName" do
740
- attribute :value, String, pattern: '^[a-z][a-z0-9_]*$'
740
+ attribute :value, String, matches: :snake_name
741
741
  end
742
742
 
743
743
  # A JSON file of steps for a domain to replay.
744
744
  value_object "ScriptPath" do
745
- attribute :value, String, pattern: '[^\t\n\r]'
745
+ attribute :value, String, matches: :not_empty
746
746
  end
747
747
 
748
748
  # What a build is replayed through: `native`, `build` (the domain's own feature), a `.wasm`
749
749
  # module, or a binary.
750
750
  value_object "Artifact" do
751
- attribute :value, String, pattern: '[^ \t\n\r]'
751
+ attribute :value, String, matches: :present
752
752
  end
753
753
 
754
754
  # A Rust target triple: `<arch>-<vendor>-<os>` with an optional `-<env>`. The toolchain
@@ -759,7 +759,7 @@ Hecks.bluebook "Hecks" do
759
759
 
760
760
  # The directory a host build stages its files in.
761
761
  value_object "StagePath" do
762
- attribute :value, String, pattern: '[^\t\n\r]'
762
+ attribute :value, String, matches: :not_empty
763
763
  end
764
764
 
765
765
  value_object "Count" do
@@ -1014,14 +1014,14 @@ Hecks.bluebook "Hecks" do
1014
1014
  identified_by :run
1015
1015
 
1016
1016
  value_object "FuzzKey" do
1017
- attribute :value, String, pattern: '[^ \t\n\r]'
1017
+ attribute :value, String, matches: :present
1018
1018
 
1019
1019
  invariant("a sweep is named") { !value.to_s.empty? }
1020
1020
  end
1021
1021
 
1022
1022
  # A domain directory; a sweep with none covers every domain of a hecks checkout.
1023
1023
  value_object "DomainPath" do
1024
- attribute :value, String, pattern: '[^\t\n\r]'
1024
+ attribute :value, String, matches: :not_empty
1025
1025
 
1026
1026
  invariant("a domain is named by its path") { !value.to_s.empty? }
1027
1027
  end
@@ -1054,7 +1054,7 @@ Hecks.bluebook "Hecks" do
1054
1054
  end
1055
1055
 
1056
1056
  value_object "BinaryPath" do
1057
- attribute :value, String, pattern: '[^\t\n\r]'
1057
+ attribute :value, String, matches: :not_empty
1058
1058
  end
1059
1059
 
1060
1060
  value_object "Format" do
@@ -1062,7 +1062,7 @@ Hecks.bluebook "Hecks" do
1062
1062
  end
1063
1063
 
1064
1064
  value_object "OutputPath" do
1065
- attribute :value, String, pattern: '[^\t\n\r]'
1065
+ attribute :value, String, matches: :not_empty
1066
1066
  end
1067
1067
 
1068
1068
  value_object "Report" do
@@ -30,13 +30,13 @@ module Hecks
30
30
  /// variant names — `hecks measure_kernel_coverage`'s own existence
31
31
  /// check reads this, so the file-name spelling here is the ONE
32
32
  /// place that ever needs to change if a name is renamed.
33
- pub fn module_name(&self) -> &'static str {
33
+ pub const fn module_name(&self) -> &'static str {
34
34
  match self {
35
35
  %<arms>s
36
36
  }
37
37
  }
38
38
 
39
- pub const ALL: &'static [%<enum_name>s] = &[%<all>s];
39
+ pub const ALL: &'static [Self] = &[%<all>s];
40
40
  }
41
41
  RUST
42
42
 
@@ -78,8 +78,8 @@ module Hecks
78
78
  directory: shapes ? "attribute_shapes" : "expression_operators",
79
79
  mods: names.map { |name| "pub mod #{name};" }.join("\n"),
80
80
  variants: names.map { |name| " #{pascal(name)}," }.join("\n"),
81
- arms: names.map { |name| " #{enum_name}::#{pascal(name)} => #{name.to_s.inspect}," }.join("\n"),
82
- all: names.map { |name| "#{enum_name}::#{pascal(name)}" }.join(", "))
81
+ arms: names.map { |name| " Self::#{pascal(name)} => #{name.to_s.inspect}," }.join("\n"),
82
+ all: names.map { |name| "Self::#{pascal(name)}" }.join(", "))
83
83
  end
84
84
 
85
85
  # @param name [String, Symbol] a snake_case capability name
@@ -42,7 +42,7 @@ module Hecks
42
42
  File.join(kernel, "attribute_shapes/mod.rs") => shapes_module,
43
43
  File.join(kernel, "expression_operators/mod.rs") => operators_module
44
44
  }
45
- ProjectionFiles::Result.new(content, [])
45
+ ProjectionFiles::Result.new(RustFormat.files(content), [])
46
46
  end
47
47
 
48
48
  # Writes the capability modules.
@@ -440,6 +440,7 @@ Hecks.bluebook "Bluebook" do
440
440
  member keyword: "attribute", context: "Aggregate", at: "", named: "default", kind: "literal", required: "false", fills: "default"
441
441
  member keyword: "attribute", context: "Aggregate", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
442
442
  member keyword: "attribute", context: "Aggregate", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
443
+ member keyword: "attribute", context: "Aggregate", at: "", named: "matches", kind: "symbol", required: "false", fills: "matches"
443
444
  member keyword: "attribute", context: "Aggregate", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
444
445
  member keyword: "attribute", context: "Aggregate", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
445
446
  member keyword: "invariant", context: "Aggregate", at: "1", named: "", kind: "text", required: "true", fills: "description"
@@ -368,6 +368,7 @@ Hecks.bluebook "Bluebook" do
368
368
  member keyword: "attribute", context: "Command", at: "", named: "default", kind: "literal", required: "false", fills: "default"
369
369
  member keyword: "attribute", context: "Command", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
370
370
  member keyword: "attribute", context: "Command", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
371
+ member keyword: "attribute", context: "Command", at: "", named: "matches", kind: "symbol", required: "false", fills: "matches"
371
372
  member keyword: "attribute", context: "Command", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
372
373
  member keyword: "attribute", context: "Command", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
373
374
  # `reason` is required in practice; CommandBuilder#corrects_impl refuses its absence.
@@ -319,6 +319,7 @@ Hecks.bluebook "Bluebook" do
319
319
  member keyword: "attribute", context: "Entity", at: "", named: "default", kind: "literal", required: "false", fills: "default"
320
320
  member keyword: "attribute", context: "Entity", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
321
321
  member keyword: "attribute", context: "Entity", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
322
+ member keyword: "attribute", context: "Entity", at: "", named: "matches", kind: "symbol", required: "false", fills: "matches"
322
323
  member keyword: "attribute", context: "Entity", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
323
324
  member keyword: "attribute", context: "Entity", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
324
325
  member keyword: "reference_to", context: "Entity", at: "1", named: "", kind: "constant", required: "true", fills: "type"
@@ -229,6 +229,7 @@ Hecks.bluebook "Bluebook" do
229
229
  member keyword: "attribute", context: "Query", at: "", named: "default", kind: "literal", required: "false", fills: "default"
230
230
  member keyword: "attribute", context: "Query", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
231
231
  member keyword: "attribute", context: "Query", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
232
+ member keyword: "attribute", context: "Query", at: "", named: "matches", kind: "symbol", required: "false", fills: "matches"
232
233
  member keyword: "attribute", context: "Query", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
233
234
  member keyword: "attribute", context: "Query", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
234
235
  member keyword: "reference_to", context: "Query", at: "1", named: "", kind: "constant", required: "true", fills: "type"
@@ -19,14 +19,14 @@ Hecks.bluebook "Bluebook" do
19
19
  end
20
20
 
21
21
  value_object "ValueObjectName" do
22
- attribute :value, String, pattern: '[^ \t\n\r]'
22
+ attribute :value, String, matches: :present
23
23
  invariant("a value object is named") { !value.to_s.empty? }
24
24
  end
25
25
 
26
26
  value_object "ShapeField" do
27
- attribute :name, String, pattern: '[^ \t\n\r]'
28
- attribute :type, String, pattern: '[^ \t\n\r]'
29
- attribute :list, String, pattern: '[^ \t\n\r]'
27
+ attribute :name, String, matches: :present
28
+ attribute :type, String, matches: :present
29
+ attribute :list, String, matches: :present
30
30
  attribute :optional, String, optional: true
31
31
  attribute :pattern, String, optional: true
32
32
  # optional: a declaration with no default has none
@@ -40,8 +40,8 @@ Hecks.bluebook "Bluebook" do
40
40
  end
41
41
 
42
42
  value_object "Assertion" do
43
- attribute :description, String, pattern: '[^ \t\n\r]'
44
- attribute :canonical, String, pattern: '[^ \t\n\r]'
43
+ attribute :description, String, matches: :present
44
+ attribute :canonical, String, matches: :present
45
45
  invariant("an assertion description is present") { !description.to_s.empty? }
46
46
  invariant("an assertion canonical form is present") { !canonical.to_s.empty? }
47
47
  end
@@ -59,7 +59,7 @@ Hecks.bluebook "Bluebook" do
59
59
  end
60
60
 
61
61
  value_object "Pair" do
62
- attribute :key, String, pattern: '[^ \t\n\r]'
62
+ attribute :key, String, matches: :present
63
63
  attribute :value, String
64
64
  # Keys must be named; values may be empty or numeric.
65
65
  invariant("a pair key is present") { !key.to_s.empty? }
@@ -230,6 +230,7 @@ Hecks.bluebook "Bluebook" do
230
230
  member keyword: "attribute", context: "ValueObject", at: "", named: "default", kind: "literal", required: "false", fills: "default"
231
231
  member keyword: "attribute", context: "ValueObject", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
232
232
  member keyword: "attribute", context: "ValueObject", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
233
+ member keyword: "attribute", context: "ValueObject", at: "", named: "matches", kind: "symbol", required: "false", fills: "matches"
233
234
  member keyword: "attribute", context: "ValueObject", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
234
235
  member keyword: "attribute", context: "ValueObject", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
235
236
  member keyword: "invariant", context: "ValueObject", at: "1", named: "", kind: "text", required: "true", fills: "description"
@@ -846,7 +846,6 @@ Hecks.bluebook "Bluebook" do
846
846
  member script: "backfill_era_projections", section: "Custodian", aggregate: "Era", verb: "backfill_projections"
847
847
  member script: "scaffold_translation", section: "Custodian", aggregate: "Era", verb: "scaffold_translation"
848
848
  member script: "translation_audit", section: "Custodian", aggregate: "Era", verb: "audit_translation"
849
- member script: "translation_audit", section: "Custodian", aggregate: "Era", verb: "approve_translation"
850
849
  member script: "compact", section: "Custodian", aggregate: "Era", verb: "compact"
851
850
  member script: "heki_compact", section: "Custodian", aggregate: "Era", verb: "compact_heki"
852
851
  member script: "vendor_bluebook", section: "Custodian", aggregate: "Package", verb: "vendor", note: "waits: a refusal exits 1 with its reason on stderr"
@@ -954,8 +953,8 @@ Hecks.bluebook "Bluebook" do
954
953
  # hand-typed copies.
955
954
  value_object "RustReservedWord" do
956
955
  attribute :word, String,
957
- one_of: ["as", "break", "const", "continue", "crate", "dyn", "else", "enum", "extern", "false",
958
- "fn", "for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut", "pub",
956
+ one_of: ["as", "async", "await", "break", "const", "continue", "crate", "dyn", "else", "enum",
957
+ "extern", "false", "fn", "for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut", "pub",
959
958
  "ref", "return", "self", "Self", "static", "struct", "super", "trait", "true", "type",
960
959
  "unsafe", "use", "where", "while", "abstract", "become", "box", "do", "final", "macro",
961
960
  "override", "priv", "typeof", "unsized", "virtual", "yield", "try"]
@@ -80,6 +80,7 @@ Hecks.bluebook "Hecksagon" do
80
80
  member keyword: "attribute", context: "PortOperation", at: "", named: "default", kind: "literal", required: "false", fills: "default"
81
81
  member keyword: "attribute", context: "PortOperation", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
82
82
  member keyword: "attribute", context: "PortOperation", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
83
+ member keyword: "attribute", context: "PortOperation", at: "", named: "matches", kind: "symbol", required: "false", fills: "matches"
83
84
  member keyword: "attribute", context: "PortOperation", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
84
85
  member keyword: "attribute", context: "PortOperation", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
85
86
  member keyword: "emits", context: "PortOperation", at: "1", named: "", kind: "text", required: "true", fills: "emits"
@@ -29,7 +29,7 @@ Hecks.bluebook "Translation" do
29
29
  attribute :converts, list_of(TranslationConvert)
30
30
  attribute :drops, list_of(TranslationName)
31
31
  attribute :retypes, list_of(TranslationRetype)
32
- attribute :computes, list_of(TranslationCompute)
32
+ attribute :derives, list_of(TranslationDerive)
33
33
  attribute :rekeys, list_of(TranslationRekey)
34
34
  attribute :backfills, list_of(TranslationBackfill)
35
35
 
@@ -56,14 +56,13 @@ Hecks.bluebook "Translation" do
56
56
  attribute :to, TranslationName
57
57
  end
58
58
 
59
- value_object "TranslationCompute" do
60
- attribute :from, TranslationName
61
- attribute :to, TranslationName
62
- attribute :sql, TranslationLiteralText
59
+ value_object "TranslationDerive" do
60
+ attribute :to, TranslationName
61
+ attribute :expression, TranslationLiteralText
63
62
  end
64
63
 
65
64
  value_object "TranslationRekey" do
66
- attribute :sql, TranslationLiteralText
65
+ attribute :to, TranslationName
67
66
  end
68
67
 
69
68
  value_object "TranslationBackfill" do
@@ -146,28 +145,27 @@ Hecks.bluebook "Translation" do
146
145
  emits "TranslationRetypeAdded"
147
146
  end
148
147
 
149
- command "AddCompute" do
148
+ command "AddDerive" do
150
149
  role "Deployment"
151
- goal "Move data at an old path to a new one, transformed by a real SQL expression"
150
+ goal "Give a new field a value computed from the record's own text, read before any other rule runs"
152
151
 
153
- attribute :from, TranslationName
154
- attribute :to, TranslationName
155
- attribute :sql, TranslationLiteralText
152
+ attribute :to, TranslationName
153
+ attribute :expression, TranslationLiteralText
156
154
 
157
- sets :computes, append: { from: :from, to: :to, sql: :sql }
155
+ sets :derives, append: { to: :to, expression: :expression }
158
156
 
159
- emits "TranslationComputeAdded"
157
+ emits "TranslationDeriveAdded"
160
158
  end
161
159
 
162
- command "AddRekey" do
160
+ command "AddRekeyTo" do
163
161
  role "Deployment"
164
- goal "Recompute this aggregate's own identity by a real SQL expression"
162
+ goal "Take this aggregate's identity from the value of a field a derive computes"
165
163
 
166
- attribute :sql, TranslationLiteralText
164
+ attribute :to, TranslationName
167
165
 
168
- sets :rekeys, append: { sql: :sql }
166
+ sets :rekeys, append: { to: :to }
169
167
 
170
- emits "TranslationRekeyAdded"
168
+ emits "TranslationRekeyToAdded"
171
169
  end
172
170
 
173
171
  command "AddBackfill" do
@@ -200,8 +198,8 @@ Hecks.bluebook "Translation" do
200
198
  member word: "convert", context: "TranslationAggregate", body: "none", inner: "", opens: "", fills: "converts", calls: "convert_impl"
201
199
  member word: "drop", context: "TranslationAggregate", body: "none", inner: "", opens: "", fills: "drops"
202
200
  member word: "retype", context: "TranslationAggregate", body: "none", inner: "", opens: "", fills: "retypes", calls: "retype_impl"
203
- member word: "compute", context: "TranslationAggregate", body: "none", inner: "", opens: "", fills: "computes", calls: "compute_impl"
204
- member word: "rekey", context: "TranslationAggregate", body: "none", inner: "", opens: "", fills: "rekeys", calls: "rekey_impl"
201
+ member word: "derive", context: "TranslationAggregate", body: "none", inner: "", opens: "", fills: "derives", calls: "derive_impl"
202
+ member word: "rekey_to", context: "TranslationAggregate", body: "none", inner: "", opens: "", fills: "rekeys", calls: "rekey_to_impl"
205
203
  member word: "backfill", context: "TranslationAggregate", body: "none", inner: "", opens: "", fills: "backfills", calls: "backfill_impl"
206
204
  member word: "unresolved", context: "TranslationAggregate", body: "none", inner: "", opens: "", fills: "", calls: "unresolved_impl"
207
205
 
@@ -234,10 +232,9 @@ Hecks.bluebook "Translation" do
234
232
  member keyword: "drop", context: "TranslationAggregate", at: "1", named: "", kind: "symbol", required: "true", fills: "name", blank_message: "a drop needs a name"
235
233
  member keyword: "retype", context: "TranslationAggregate", at: "1", named: "", kind: "text", required: "true", fills: "old_type"
236
234
  member keyword: "retype", context: "TranslationAggregate", at: "", named: "to", kind: "text", required: "true", fills: "to"
237
- member keyword: "compute", context: "TranslationAggregate", at: "1", named: "", kind: "text", required: "true", fills: "old_path"
238
- member keyword: "compute", context: "TranslationAggregate", at: "", named: "to", kind: "text", required: "true", fills: "to"
239
- member keyword: "compute", context: "TranslationAggregate", at: "", named: "sql", kind: "text", required: "true", fills: "sql"
240
- member keyword: "rekey", context: "TranslationAggregate", at: "", named: "sql", kind: "text", required: "true", fills: "sql"
235
+ member keyword: "derive", context: "TranslationAggregate", at: "1", named: "", kind: "text", required: "true", fills: "to"
236
+ member keyword: "derive", context: "TranslationAggregate", at: "", named: "as", kind: "text", required: "true", fills: "as"
237
+ member keyword: "rekey_to", context: "TranslationAggregate", at: "1", named: "", kind: "symbol", required: "true", fills: "to"
241
238
  member keyword: "backfill", context: "TranslationAggregate", at: "1", named: "", kind: "symbol", required: "true", fills: "name"
242
239
  member keyword: "backfill", context: "TranslationAggregate", at: "", named: "default", kind: "literal", required: "true", fills: "default"
243
240
  member keyword: "unresolved", context: "TranslationAggregate", at: "1", named: "", kind: "symbol", required: "true", fills: "name"
@@ -26,8 +26,8 @@ module Hecks
26
26
 
27
27
  # Admits a new person, in whatever way this domain's adapter defines admission.
28
28
  #
29
- # The keywords carry the names of a verified sign-in (`Ports::Authentication.verify`),
30
- # but nothing here wires the two together, so their shapes are adapter-defined.
29
+ # The keywords carry the names of a verified OIDC sign-in, but nothing here wires
30
+ # one to this port, so their shapes are adapter-defined.
31
31
  #
32
32
  # @param registry [Runtime::Registry] the booted registry to resolve the adapter against
33
33
  # @param email [Object] adapter-defined, forwarded unchanged; the person's email