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
@@ -38,13 +38,13 @@ Hecks.bluebook "Hecks" do
38
38
  identified_by :run
39
39
 
40
40
  value_object "RunKey" do
41
- attribute :value, String, pattern: '[^ \t\n\r]'
41
+ attribute :value, String, matches: :present
42
42
 
43
43
  invariant("a run is named") { !value.to_s.empty? }
44
44
  end
45
45
 
46
46
  value_object "Operation" do
47
- attribute :value, String, pattern: '[^ \t\n\r]'
47
+ attribute :value, String, matches: :present
48
48
  end
49
49
 
50
50
  value_object "Switch" do
@@ -57,7 +57,7 @@ Hecks.bluebook "Hecks" do
57
57
 
58
58
  # A keyword of the language, or the keyword an argument belongs to.
59
59
  value_object "Word" do
60
- attribute :value, String, pattern: '[^ \t\n\r]'
60
+ attribute :value, String, matches: :present
61
61
 
62
62
  invariant("a word is named") { !value.to_s.empty? }
63
63
  end
@@ -94,7 +94,7 @@ Hecks.bluebook "Hecks" do
94
94
 
95
95
  # How a pairs argument is read, such as verbatim.
96
96
  value_object "Shape" do
97
- attribute :value, String, pattern: '[^ \t\n\r]'
97
+ attribute :value, String, matches: :present
98
98
  end
99
99
 
100
100
  lifecycle :status, default: "requested" do
@@ -641,13 +641,13 @@ Hecks.bluebook "Hecks" do
641
641
  identified_by :run
642
642
 
643
643
  value_object "RunKey" do
644
- attribute :value, String, pattern: '[^ \t\n\r]'
644
+ attribute :value, String, matches: :present
645
645
 
646
646
  invariant("a run is named") { !value.to_s.empty? }
647
647
  end
648
648
 
649
649
  value_object "Operation" do
650
- attribute :value, String, pattern: '[^ \t\n\r]'
650
+ attribute :value, String, matches: :present
651
651
  end
652
652
 
653
653
  value_object "Switch" do
@@ -796,13 +796,13 @@ Hecks.bluebook "Hecks" do
796
796
  identified_by :run
797
797
 
798
798
  value_object "RunKey" do
799
- attribute :value, String, pattern: '[^ \t\n\r]'
799
+ attribute :value, String, matches: :present
800
800
 
801
801
  invariant("a run is named") { !value.to_s.empty? }
802
802
  end
803
803
 
804
804
  value_object "Operation" do
805
- attribute :value, String, pattern: '[^ \t\n\r]'
805
+ attribute :value, String, matches: :present
806
806
  end
807
807
 
808
808
  value_object "Switch" do
@@ -971,13 +971,13 @@ Hecks.bluebook "Hecks" do
971
971
  identified_by :run
972
972
 
973
973
  value_object "RunKey" do
974
- attribute :value, String, pattern: '[^ \t\n\r]'
974
+ attribute :value, String, matches: :present
975
975
 
976
976
  invariant("a run is named") { !value.to_s.empty? }
977
977
  end
978
978
 
979
979
  value_object "Operation" do
980
- attribute :value, String, pattern: '[^ \t\n\r]'
980
+ attribute :value, String, matches: :present
981
981
  end
982
982
 
983
983
  value_object "Switch" do
@@ -990,7 +990,7 @@ Hecks.bluebook "Hecks" do
990
990
 
991
991
  # A `CiGate` row of the Vocabulary chapter, by name.
992
992
  value_object "GateName" do
993
- attribute :value, String, pattern: '[^ \t\n\r]'
993
+ attribute :value, String, matches: :present
994
994
  end
995
995
 
996
996
  lifecycle :status, default: "requested" do
@@ -1201,17 +1201,17 @@ Hecks.bluebook "Hecks" do
1201
1201
  identified_by :run
1202
1202
 
1203
1203
  value_object "RunKey" do
1204
- attribute :value, String, pattern: '[^ \t\n\r]'
1204
+ attribute :value, String, matches: :present
1205
1205
 
1206
1206
  invariant("a run is named") { !value.to_s.empty? }
1207
1207
  end
1208
1208
 
1209
1209
  value_object "Operation" do
1210
- attribute :value, String, pattern: '[^ \t\n\r]'
1210
+ attribute :value, String, matches: :present
1211
1211
  end
1212
1212
 
1213
1213
  value_object "Stage" do
1214
- attribute :value, String, pattern: '^[a-z][a-z0-9_]*$'
1214
+ attribute :value, String, matches: :snake_name
1215
1215
 
1216
1216
  invariant("a stage is named") { !value.to_s.empty? }
1217
1217
  end
@@ -1355,13 +1355,13 @@ Hecks.bluebook "Hecks" do
1355
1355
  identified_by :run
1356
1356
 
1357
1357
  value_object "RunKey" do
1358
- attribute :value, String, pattern: '[^ \t\n\r]'
1358
+ attribute :value, String, matches: :present
1359
1359
 
1360
1360
  invariant("a run is named") { !value.to_s.empty? }
1361
1361
  end
1362
1362
 
1363
1363
  value_object "Operation" do
1364
- attribute :value, String, pattern: '[^ \t\n\r]'
1364
+ attribute :value, String, matches: :present
1365
1365
  end
1366
1366
 
1367
1367
  value_object "Switch" do
@@ -1391,12 +1391,12 @@ Hecks.bluebook "Hecks" do
1391
1391
 
1392
1392
  # A revision a code comparison is made against.
1393
1393
  value_object "Ref" do
1394
- attribute :value, String, pattern: '^[^ \t\n\r]+$'
1394
+ attribute :value, String, matches: :no_whitespace
1395
1395
  end
1396
1396
 
1397
1397
  # A JSON file.
1398
1398
  value_object "FilePath" do
1399
- attribute :value, String, pattern: '[^\t\n\r]'
1399
+ attribute :value, String, matches: :not_empty
1400
1400
 
1401
1401
  invariant("a file is named") { !value.to_s.empty? }
1402
1402
  end
@@ -1676,13 +1676,13 @@ Hecks.bluebook "Hecks" do
1676
1676
  identified_by :run
1677
1677
 
1678
1678
  value_object "RunKey" do
1679
- attribute :value, String, pattern: '[^ \t\n\r]'
1679
+ attribute :value, String, matches: :present
1680
1680
 
1681
1681
  invariant("a run is named") { !value.to_s.empty? }
1682
1682
  end
1683
1683
 
1684
1684
  value_object "Operation" do
1685
- attribute :value, String, pattern: '[^ \t\n\r]'
1685
+ attribute :value, String, matches: :present
1686
1686
  end
1687
1687
 
1688
1688
  value_object "Switch" do
@@ -1891,13 +1891,13 @@ Hecks.bluebook "Hecks" do
1891
1891
  identified_by :run
1892
1892
 
1893
1893
  value_object "RunKey" do
1894
- attribute :value, String, pattern: '[^ \t\n\r]'
1894
+ attribute :value, String, matches: :present
1895
1895
 
1896
1896
  invariant("a run is named") { !value.to_s.empty? }
1897
1897
  end
1898
1898
 
1899
1899
  value_object "Operation" do
1900
- attribute :value, String, pattern: '[^ \t\n\r]'
1900
+ attribute :value, String, matches: :present
1901
1901
  end
1902
1902
 
1903
1903
  value_object "Switch" do
@@ -2064,13 +2064,13 @@ Hecks.bluebook "Hecks" do
2064
2064
  identified_by :run
2065
2065
 
2066
2066
  value_object "RunKey" do
2067
- attribute :value, String, pattern: '[^ \t\n\r]'
2067
+ attribute :value, String, matches: :present
2068
2068
 
2069
2069
  invariant("a run is named") { !value.to_s.empty? }
2070
2070
  end
2071
2071
 
2072
2072
  value_object "Operation" do
2073
- attribute :value, String, pattern: '[^ \t\n\r]'
2073
+ attribute :value, String, matches: :present
2074
2074
  end
2075
2075
 
2076
2076
  value_object "Switch" do
@@ -2090,19 +2090,19 @@ Hecks.bluebook "Hecks" do
2090
2090
 
2091
2091
  # A CI run's number.
2092
2092
  value_object "RunId" do
2093
- attribute :value, String, pattern: '^[0-9]+$'
2093
+ attribute :value, String, matches: :digits
2094
2094
  end
2095
2095
 
2096
2096
  # A file, relative to the checkout or absolute.
2097
2097
  value_object "FilePath" do
2098
- attribute :value, String, pattern: '[^\t\n\r]'
2098
+ attribute :value, String, matches: :not_empty
2099
2099
 
2100
2100
  invariant("a file is named") { !value.to_s.empty? }
2101
2101
  end
2102
2102
 
2103
2103
  # Part of an example's description.
2104
2104
  value_object "ExampleText" do
2105
- attribute :value, String, pattern: '[^\t\n\r]'
2105
+ attribute :value, String, matches: :not_empty
2106
2106
 
2107
2107
  invariant("an example is named") { !value.to_s.empty? }
2108
2108
  end
@@ -2114,7 +2114,7 @@ Hecks.bluebook "Hecks" do
2114
2114
 
2115
2115
  # A regular expression naming the specs to leave out.
2116
2116
  value_object "ExcludePattern" do
2117
- attribute :value, String, pattern: '[^\t\n\r]'
2117
+ attribute :value, String, matches: :not_empty
2118
2118
  end
2119
2119
 
2120
2120
  # The tag filter, as the test runner spells it.
@@ -2390,13 +2390,13 @@ Hecks.bluebook "Hecks" do
2390
2390
  identified_by :run
2391
2391
 
2392
2392
  value_object "RunKey" do
2393
- attribute :value, String, pattern: '[^ \t\n\r]'
2393
+ attribute :value, String, matches: :present
2394
2394
 
2395
2395
  invariant("a run is named") { !value.to_s.empty? }
2396
2396
  end
2397
2397
 
2398
2398
  value_object "Operation" do
2399
- attribute :value, String, pattern: '[^ \t\n\r]'
2399
+ attribute :value, String, matches: :present
2400
2400
  end
2401
2401
 
2402
2402
  value_object "Switch" do
@@ -2424,7 +2424,7 @@ Hecks.bluebook "Hecks" do
2424
2424
 
2425
2425
  # The name of one field of a construct.
2426
2426
  value_object "FieldName" do
2427
- attribute :value, String, pattern: '^[a-z][a-z0-9_]*$'
2427
+ attribute :value, String, matches: :snake_name
2428
2428
  end
2429
2429
 
2430
2430
  # A local port a server listens on.
@@ -2467,6 +2467,22 @@ Hecks.bluebook "Hecks" do
2467
2467
  emits PresentRequested
2468
2468
  end
2469
2469
 
2470
+ command "Compose" do
2471
+ role "Maintainer"
2472
+ goal "Serve the Composer, a live bluebook editor over one domain directory, on a local port until stopped"
2473
+
2474
+ attribute :port, Port, optional: true
2475
+ attribute :domains, PathList, optional: true
2476
+ attribute :run, RunKey
2477
+
2478
+ sets :port
2479
+ sets :domains
2480
+ sets :run
2481
+ sets :operation, to: "compose"
2482
+
2483
+ emits ComposeRequested
2484
+ end
2485
+
2470
2486
  # What the tree reported about itself, held against every request: nothing here runs
2471
2487
  # outside a hecks checkout (hecks.gemspec beside lib/).
2472
2488
  command "Accept" do
@@ -2571,6 +2587,11 @@ Hecks.bluebook "Hecks" do
2571
2587
  trigger CorpusRun::SourceTree::Examine, with: { run: :run }
2572
2588
  end
2573
2589
 
2590
+ policy "ExamineWhenComposeRequested" do
2591
+ on "CorpusRun.ComposeRequested"
2592
+ trigger CorpusRun::SourceTree::Examine, with: { run: :run }
2593
+ end
2594
+
2574
2595
  policy "AcceptCorpusWhenExamined" do
2575
2596
  on "CorpusRun.CorpusExamined"
2576
2597
  trigger CorpusRun::Accept, with: { checkout: :checkout }
@@ -2633,13 +2654,13 @@ Hecks.bluebook "Hecks" do
2633
2654
  identified_by :run
2634
2655
 
2635
2656
  value_object "RunKey" do
2636
- attribute :value, String, pattern: '[^ \t\n\r]'
2657
+ attribute :value, String, matches: :present
2637
2658
 
2638
2659
  invariant("a run is named") { !value.to_s.empty? }
2639
2660
  end
2640
2661
 
2641
2662
  value_object "Operation" do
2642
- attribute :value, String, pattern: '[^ \t\n\r]'
2663
+ attribute :value, String, matches: :present
2643
2664
  end
2644
2665
 
2645
2666
  value_object "Switch" do
@@ -2652,7 +2673,7 @@ Hecks.bluebook "Hecks" do
2652
2673
 
2653
2674
  # One word of a fact: a branch, a commit, whether a tag stands.
2654
2675
  value_object "Word" do
2655
- attribute :value, String, pattern: '[^ \t\n\r]'
2676
+ attribute :value, String, matches: :present
2656
2677
  end
2657
2678
 
2658
2679
  value_object "Version" do
@@ -2968,13 +2989,13 @@ Hecks.bluebook "Hecks" do
2968
2989
  identified_by :run
2969
2990
 
2970
2991
  value_object "RunKey" do
2971
- attribute :value, String, pattern: '[^ \t\n\r]'
2992
+ attribute :value, String, matches: :present
2972
2993
 
2973
2994
  invariant("a run is named") { !value.to_s.empty? }
2974
2995
  end
2975
2996
 
2976
2997
  value_object "Operation" do
2977
- attribute :value, String, pattern: '[^ \t\n\r]'
2998
+ attribute :value, String, matches: :present
2978
2999
  end
2979
3000
 
2980
3001
  value_object "Switch" do
@@ -2987,7 +3008,7 @@ Hecks.bluebook "Hecks" do
2987
3008
 
2988
3009
  # A branch name, or a commit.
2989
3010
  value_object "Word" do
2990
- attribute :value, String, pattern: '[^ \t\n\r]'
3011
+ attribute :value, String, matches: :present
2991
3012
  end
2992
3013
 
2993
3014
  # How long a lane has stood behind the lane it follows, or how long its row lets it.
@@ -0,0 +1,68 @@
1
+ Hecks.behaviors "Composer" do
2
+ vision "A draft is opened, revised, judged by its check and talked about with an agent, one recorded step at a time."
3
+
4
+ loads "hecks.bluebook", "custodian.bluebook", "tooling.bluebook", "rehearsal.bluebook", "codebase.bluebook", "context_map.hecksagon", "hecks.hecksagon", "environments/memory.world"
5
+
6
+ test "Begin opens a chapter for editing" do
7
+ tests "Begin", on: "Draft"
8
+ input slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
9
+ expect status:"drafting"
10
+ end
11
+
12
+ test "Revise replaces the text of a draft" do
13
+ tests "Revise", on: "Draft"
14
+ setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
15
+ input slug: { value: "account" }, text: { value: "Hecks.bluebook \"Account\" do\nend" }
16
+ expect emits: ["DraftRevised"]
17
+ end
18
+
19
+ test "Accept records a draft that passed its check" do
20
+ tests "Accept", on: "Draft"
21
+ setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
22
+ input slug: { value: "account" }, note: { value: "ok" }
23
+ expect status:"valid"
24
+ end
25
+
26
+ test "Reject records a draft that failed its check" do
27
+ tests "Reject", on: "Draft"
28
+ setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
29
+ input slug: { value: "account" }, note: { value: "line 3: expected one of: attribute, command" }
30
+ expect status:"invalid"
31
+ end
32
+
33
+ test "Revise returns a valid draft to drafting" do
34
+ tests "Revise", on: "Draft"
35
+ setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
36
+ setup "Composer::Draft.Accept", slug: { value: "account" }, note: { value: "ok" }
37
+ input slug: { value: "account" }, text: { value: "Hecks.bluebook \"Account\" do\nend" }
38
+ expect status:"drafting"
39
+ end
40
+
41
+ test "Ask puts a request to the conversation" do
42
+ tests "Ask", on: "Draft"
43
+ setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
44
+ input slug: { value: "account" }, sequence: { value: 1 }, said: { value: "add a Refund command" }
45
+ expect emits: ["TurnAsked"]
46
+ end
47
+
48
+ test "Ask refuses a turn that says nothing" do
49
+ tests "Ask", on: "Draft"
50
+ setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
51
+ input slug: { value: "account" }, sequence: { value: 1 }, said: { value: "" }
52
+ expect refused: "says something"
53
+ end
54
+
55
+ test "Answer records the agent's reply after a request" do
56
+ tests "Answer", on: "Draft"
57
+ setup "Composer::Draft.Begin", slug: { value: "account" }, chapter_name: { value: "Account" }, text: { value: "" }
58
+ setup "Composer::Draft.Ask", slug: { value: "account" }, sequence: { value: 1 }, said: { value: "add a Refund command" }
59
+ input slug: { value: "account" }, sequence: { value: 2 }, said: { value: "Added Refund." }, text: { value: "Hecks.bluebook \"Account\" do\nend" }
60
+ expect emits: ["TurnAnswered"]
61
+ end
62
+
63
+ test "Accept refuses a draft that was never begun" do
64
+ tests "Accept", on: "Draft"
65
+ input slug: { value: "nothing" }, note: { value: "ok" }
66
+ expect refused: "no Draft with"
67
+ end
68
+ end
@@ -8,6 +8,6 @@ end
8
8
 
9
9
  # The attached chapters (hecks.hecksagon `attaches`): each is a bounded context whose store comes
10
10
  # from hecks.world's `default_adapter`, so the memory overlay swaps them with the Hecks chapter.
11
- %w[Bluebook Hecksagon World Adapter Port Translation Expression Tenancy Deploy Site Tickets QualityControl].each do |chapter|
11
+ %w[Bluebook Hecksagon World Adapter Port Translation Expression Tenancy Deploy Site Tickets Composer QualityControl].each do |chapter|
12
12
  Hecks.hecksagon(chapter) { attaches "Governance" }
13
13
  end
@@ -105,12 +105,6 @@ Hecks.behaviors "Custodian" do
105
105
  expect refused: "an era is counted from one"
106
106
  end
107
107
 
108
- test "ApproveTranslation refuses a rehearsal that neither passed nor failed" do
109
- tests "ApproveTranslation", on: "Era"
110
- input domain: { value: "examples/pizzas" }, run: { value: "approve" }, confirm: { value: true }, rehearsal: { value: "maybe" }
111
- expect refused: "must match"
112
- end
113
-
114
108
  test "CompactHeki keeps a domain that is not there as a refused change" do
115
109
  tests "CompactHeki", on: "Era"
116
110
  input domain: { value: "/tmp/hecks-behaviors-absent/heki-domain" }, run: { value: "compact" }, confirm: { value: true }
@@ -27,14 +27,14 @@ Hecks.bluebook "Hecks" do
27
27
  identified_by :run
28
28
 
29
29
  value_object "OperationKey" do
30
- attribute :value, String, pattern: '[^ \t\n\r]'
30
+ attribute :value, String, matches: :present
31
31
 
32
32
  invariant("an operation is named") { !value.to_s.empty? }
33
33
  end
34
34
 
35
35
  # What the operation acts on: a domain directory, or a behaviors file or directory.
36
36
  value_object "Subject" do
37
- attribute :value, String, pattern: '[^\t\n\r]'
37
+ attribute :value, String, matches: :not_empty
38
38
  end
39
39
 
40
40
  value_object "Script" do
@@ -42,7 +42,7 @@ Hecks.bluebook "Hecks" do
42
42
  end
43
43
 
44
44
  value_object "Verb" do
45
- attribute :value, String, pattern: '[^ \t\n\r]'
45
+ attribute :value, String, matches: :present
46
46
  end
47
47
 
48
48
  # One `name=value` word of the verb a run dispatches.
@@ -59,7 +59,7 @@ Hecks.bluebook "Hecks" do
59
59
  end
60
60
 
61
61
  value_object "HeaderName" do
62
- attribute :value, String, pattern: '[^ \t\n\r]'
62
+ attribute :value, String, matches: :present
63
63
  end
64
64
 
65
65
  value_object "Scheme" do
@@ -71,7 +71,7 @@ Hecks.bluebook "Hecks" do
71
71
  end
72
72
 
73
73
  value_object "PayloadFile" do
74
- attribute :value, String, pattern: '[^\t\n\r]'
74
+ attribute :value, String, matches: :not_empty
75
75
  end
76
76
 
77
77
  value_object "Output" do
@@ -84,11 +84,11 @@ Hecks.bluebook "Hecks" do
84
84
  end
85
85
 
86
86
  value_object "PersonName" do
87
- attribute :value, String, pattern: '[^\t\n\r]'
87
+ attribute :value, String, matches: :not_empty
88
88
  end
89
89
 
90
90
  value_object "RoleName" do
91
- attribute :value, String, pattern: '^[^ \t\n\r]+$'
91
+ attribute :value, String, matches: :no_whitespace
92
92
  end
93
93
 
94
94
  lifecycle :status, default: "requested" do
@@ -361,7 +361,7 @@ Hecks.bluebook "Hecks" do
361
361
 
362
362
  # The file listing the eras that should be running, one per line.
363
363
  value_object "ExpectedFile" do
364
- attribute :value, String, pattern: '[^\t\n\r]'
364
+ attribute :value, String, matches: :not_empty
365
365
  end
366
366
 
367
367
  value_object "Seconds" do
@@ -371,7 +371,7 @@ Hecks.bluebook "Hecks" do
371
371
  end
372
372
 
373
373
  value_object "EraId" do
374
- attribute :value, String, pattern: '[^ \t\n\r]'
374
+ attribute :value, String, matches: :present
375
375
  end
376
376
 
377
377
  value_object "VersionText" do
@@ -524,20 +524,12 @@ policy "RecordTheEra" do
524
524
  attribute :era, Ordinal, optional: true
525
525
  attribute :aggregates, AggregateList, optional: true
526
526
  attribute :confirm, Switch, optional: true
527
- attribute :snapshot, Snapshot, optional: true
528
- attribute :host_version, HostVersion, optional: true
529
- attribute :rehearsal, Verdict, optional: true
530
- attribute :rehearsed_at, Moment, optional: true
531
527
  attribute :capable, Switch, optional: true
532
528
  attribute :held, Count, optional: true
533
529
  attribute :forks, Count, optional: true
534
530
  attribute :contested, Count, optional: true
535
- attribute :edges, Count, optional: true
536
531
  attribute :bound, Count, optional: true
537
532
  attribute :candidates, Count, optional: true
538
- attribute :audited, Switch, optional: true
539
- attribute :rehearsal_needed, Switch, optional: true
540
- attribute :rehearsal_recorded, Switch, optional: true
541
533
  attribute :drifted, Switch, optional: true
542
534
  attribute :loadable, Switch, optional: true
543
535
  attribute :shape_kept, Switch, optional: true
@@ -546,19 +538,19 @@ policy "RecordTheEra" do
546
538
  identified_by :run
547
539
 
548
540
  value_object "RunKey" do
549
- attribute :value, String, pattern: '[^ \t\n\r]'
541
+ attribute :value, String, matches: :present
550
542
 
551
543
  invariant("a change is named") { !value.to_s.empty? }
552
544
  end
553
545
 
554
546
  # The domain whose journal is changed: its directory.
555
547
  value_object "DomainPath" do
556
- attribute :value, String, pattern: '[^\t\n\r]'
548
+ attribute :value, String, matches: :not_empty
557
549
  end
558
550
 
559
551
  value_object "OperationName" do
560
552
  attribute :value, String,
561
- pattern: '^(hold_first|merge_tail|reattest|backfill_projections|compact|compact_heki|approve_translation)$'
553
+ pattern: '^(hold_first|merge_tail|reattest|backfill_projections|compact|compact_heki)$'
562
554
  end
563
555
 
564
556
  # `id:old,id:new`: which world's record wins for each id both worlds touched since the cut.
@@ -574,7 +566,7 @@ policy "RecordTheEra" do
574
566
 
575
567
  # Aggregate names, comma separated; every aggregate that keeps a journal when absent.
576
568
  value_object "AggregateList" do
577
- attribute :value, String, pattern: '[^\t\n\r]'
569
+ attribute :value, String, matches: :not_empty
578
570
  end
579
571
 
580
572
  value_object "Switch" do
@@ -585,24 +577,6 @@ policy "RecordTheEra" do
585
577
  attribute :value, Integer
586
578
  end
587
579
 
588
- # The rehearsal a compute or rekey edge is approved on: the snapshot it ran against, the host
589
- # that ran it, whether it passed, and when.
590
- value_object "Snapshot" do
591
- attribute :value, String, pattern: '[^\t\n\r]'
592
- end
593
-
594
- value_object "HostVersion" do
595
- attribute :value, String, pattern: '[^ \t\n\r]'
596
- end
597
-
598
- value_object "Verdict" do
599
- attribute :value, String, pattern: '^(pass|fail)$'
600
- end
601
-
602
- value_object "Moment" do
603
- attribute :value, String, pattern: '^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[^ \t\n\r]+$'
604
- end
605
-
606
580
  value_object "Report" do
607
581
  attribute :value, String
608
582
  end
@@ -730,34 +704,6 @@ policy "RecordTheEra" do
730
704
  emits HekiCompactionRequested
731
705
  end
732
706
 
733
- # Writes `translations/<edge>.approval` beside the edge, for the host to apply at its next
734
- # boot. An edge with a compute or rekey rule also needs the rehearsal a person ran by hand.
735
- command "ApproveTranslation" do
736
- role "Operator"
737
- goal "Approve the edge that leads a domain's latest era to its current shape, in a committed file"
738
-
739
- attribute :domain, DomainPath
740
- attribute :run, RunKey
741
- attribute :confirm, Switch, optional: true
742
- attribute :snapshot, Snapshot, optional: true
743
- attribute :host_version, HostVersion, optional: true
744
- attribute :rehearsal, Verdict, optional: true
745
- attribute :rehearsed_at, Moment, optional: true
746
-
747
- given("the approval is confirmed") { confirm.value == true }
748
-
749
- sets :domain
750
- sets :run
751
- sets :confirm
752
- sets :snapshot
753
- sets :host_version
754
- sets :rehearsal
755
- sets :rehearsed_at
756
- sets :operation, to: "approve_translation"
757
-
758
- emits ApprovalRequested
759
- end
760
-
761
707
  # The facts the journal store reported, held against the change that was asked for.
762
708
  command "Permit" do
763
709
  role "System"
@@ -768,12 +714,8 @@ policy "RecordTheEra" do
768
714
  attribute :held, Count
769
715
  attribute :forks, Count
770
716
  attribute :contested, Count
771
- attribute :edges, Count
772
717
  attribute :bound, Count
773
718
  attribute :candidates, Count
774
- attribute :audited, Switch
775
- attribute :rehearsal_needed, Switch
776
- attribute :rehearsal_recorded, Switch
777
719
  attribute :drifted, Switch
778
720
  attribute :loadable, Switch
779
721
  attribute :shape_kept, Switch
@@ -795,13 +737,6 @@ policy "RecordTheEra" do
795
737
  given("no projection reads the journal that would be emptied") do
796
738
  (operation.value != "compact" && operation.value != "compact_heki") || bound.value == 0
797
739
  end
798
- given("exactly one edge leaves the latest era") do
799
- operation.value != "approve_translation" || edges.value == 1
800
- end
801
- given("the audit passed") { operation.value != "approve_translation" || audited.value }
802
- given("a rehearsal that passed is recorded for an edge with a compute or rekey rule") do
803
- operation.value != "approve_translation" || !rehearsal_needed.value || rehearsal_recorded.value
804
- end
805
740
  given("the held text no longer matches its digest: there is nothing to re-attest") do
806
741
  operation.value != "reattest" || drifted.value
807
742
  end
@@ -816,12 +751,8 @@ policy "RecordTheEra" do
816
751
  sets :held
817
752
  sets :forks
818
753
  sets :contested
819
- sets :edges
820
754
  sets :bound
821
755
  sets :candidates
822
- sets :audited
823
- sets :rehearsal_needed
824
- sets :rehearsal_recorded
825
756
  sets :drifted
826
757
  sets :loadable
827
758
  sets :shape_kept
@@ -930,17 +861,11 @@ policy "RecordTheEra" do
930
861
  trigger Era::JournalStore::Examine, with: { run: :run }
931
862
  end
932
863
 
933
- policy "ExamineWhenApprovalRequested" do
934
- on "Era.ApprovalRequested"
935
- trigger Era::JournalStore::Examine, with: { run: :run }
936
- end
937
-
938
864
  policy "PermitWhenExamined" do
939
865
  on "Era.EraExamined"
940
866
  trigger Era::Permit, with: {
941
- capable: :capable, held: :held, forks: :forks, contested: :contested, edges: :edges,
942
- bound: :bound, candidates: :candidates, audited: :audited,
943
- rehearsal_needed: :rehearsal_needed, rehearsal_recorded: :rehearsal_recorded,
867
+ capable: :capable, held: :held, forks: :forks, contested: :contested,
868
+ bound: :bound, candidates: :candidates,
944
869
  drifted: :drifted, loadable: :loadable, shape_kept: :shape_kept
945
870
  }
946
871
  end
@@ -956,8 +881,6 @@ policy "RecordTheEra" do
956
881
  (operation.value == "merge_tail" && (held.value <= 1 || forks.value != 0 || contested.value != 0)) ||
957
882
  ((operation.value == "compact" || operation.value == "compact_heki") &&
958
883
  (candidates.value <= 0 || bound.value != 0)) ||
959
- (operation.value == "approve_translation" &&
960
- (edges.value != 1 || !audited.value || (rehearsal_needed.value && !rehearsal_recorded.value))) ||
961
884
  (operation.value == "reattest" && (!drifted.value || !loadable.value || !shape_kept.value))
962
885
  end
963
886
  trigger Era::Abandon, with: { refusal: "the journal's facts do not admit this change" }