hecks 3.14.0 → 5.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 (427) hide show
  1. checksums.yaml +4 -4
  2. data/examples/pizzas/adapters/fake_processor.rb +34 -0
  3. data/examples/pizzas/adapters/payment_signature.rb +66 -0
  4. data/examples/pizzas/adapters/payment_webhook.rb +87 -0
  5. data/examples/pizzas/bluebook/pizzas.behaviors +33 -0
  6. data/examples/pizzas/bluebook/pizzas.hecksagon +5 -3
  7. data/examples/pizzas/config.ru +22 -0
  8. data/exe/hecks +1 -1
  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 +9 -16
  12. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -2
  13. data/lib/hecks/bluebook/dsl/derivation_words.rb +58 -0
  14. data/lib/hecks/bluebook/dsl/translation_builder.rb +6 -37
  15. data/lib/hecks/bluebook/expression/ast_json.rb +0 -9
  16. data/lib/hecks/bluebook/hecksagon.rb +1 -1
  17. data/lib/hecks/bluebook/meta_validator/translation_judge/rules.rb +7 -10
  18. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +4 -8
  19. data/lib/hecks/bluebook/meta_validator.rb +0 -11
  20. data/lib/hecks/bluebook/translation.rb +18 -10
  21. data/lib/hecks/bluebook/translation_expression/evaluator.rb +63 -0
  22. data/lib/hecks/bluebook/translation_expression/parser.rb +127 -0
  23. data/lib/hecks/bluebook/translation_expression.rb +39 -0
  24. data/lib/hecks/bluebook/translation_plan.rb +70 -0
  25. data/lib/hecks/bluebook.rb +2 -0
  26. data/lib/hecks/chapters.rb +3 -3
  27. data/lib/hecks/cli/project_cli/launcher_source.rb +1 -1
  28. data/lib/hecks/composer/adapters/claude_composer.adapter +3 -0
  29. data/lib/hecks/composer/adapters/claude_composer.rb +83 -0
  30. data/lib/hecks/composer/adapters/fake_agent.adapter +3 -0
  31. data/lib/hecks/composer/adapters/fake_agent.rb +55 -0
  32. data/lib/hecks/composer/adapters/jev.adapter +3 -0
  33. data/lib/hecks/composer/adapters/jev.rb +66 -0
  34. data/lib/hecks/composer/agent.rb +113 -0
  35. data/lib/hecks/composer/assistant.rb +110 -0
  36. data/lib/hecks/composer/behavior_run.rb +53 -0
  37. data/lib/hecks/composer/bluebook/composer.bluebook +178 -0
  38. data/lib/hecks/composer/bluebook/composer.hecksagon +16 -0
  39. data/lib/hecks/composer/board.rb +65 -0
  40. data/lib/hecks/composer/board_edit/command_text.rb +39 -0
  41. data/lib/hecks/composer/board_edit/source.rb +84 -0
  42. data/lib/hecks/composer/board_edit.rb +144 -0
  43. data/lib/hecks/composer/check.rb +89 -0
  44. data/lib/hecks/composer/domains.rb +81 -0
  45. data/lib/hecks/composer/jobs.rb +134 -0
  46. data/lib/hecks/composer/layout.rb +37 -0
  47. data/lib/hecks/composer/live.rb +150 -0
  48. data/lib/hecks/composer/outline.rb +48 -0
  49. data/lib/hecks/composer/page.html +989 -0
  50. data/lib/hecks/composer/panels.rb +142 -0
  51. data/lib/hecks/composer/parse.rb +83 -0
  52. data/lib/hecks/composer/plain.rb +28 -0
  53. data/lib/hecks/composer/ports/composer_agent.port +7 -0
  54. data/lib/hecks/composer/session.rb +141 -0
  55. data/lib/hecks/composer/toolbox.rb +166 -0
  56. data/lib/hecks/composer/web.rb +156 -0
  57. data/lib/hecks/composer/workbench.rb +51 -0
  58. data/lib/hecks/composer/workspace.rb +81 -0
  59. data/lib/hecks/composer.rb +17 -0
  60. data/lib/hecks/corpus/adapters.rb +22 -0
  61. data/lib/hecks/corpus/rust.rb +1 -1
  62. data/lib/hecks/corpus/worlds.rb +19 -0
  63. data/lib/hecks/corpus.rb +5 -0
  64. data/lib/hecks/forms/app/commands.rb +2 -3
  65. data/lib/hecks/forms/app/queries.rb +2 -3
  66. data/lib/hecks/forms/app/records.rb +17 -5
  67. data/lib/hecks/forms/app/responses.rb +3 -1
  68. data/lib/hecks/forms/command_form_renderer.rb +42 -16
  69. data/lib/hecks/forms/field_controls.rb +2 -2
  70. data/lib/hecks/forms/field_renderer.rb +1 -1
  71. data/lib/hecks/forms/field_shape.rb +36 -17
  72. data/lib/hecks/forms/index_renderer.rb +2 -1
  73. data/lib/hecks/forms/page.rb +1 -1
  74. data/lib/hecks/forms/params.rb +0 -13
  75. data/lib/hecks/forms/query_form_renderer.rb +7 -6
  76. data/lib/hecks/forms/record_renderer.rb +11 -7
  77. data/lib/hecks/forms/rule_words.rb +100 -0
  78. data/lib/hecks/forms/value_object_shape.rb +2 -1
  79. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +0 -3
  80. data/lib/hecks/fuzzing/isolated_boot/worlds.rb +3 -6
  81. data/lib/hecks/fuzzing/replay/filters.rb +2 -6
  82. data/lib/hecks/gate/stages.yml +25 -0
  83. data/lib/hecks/grammar/evolve/seeds.rb +0 -6
  84. data/lib/hecks/grammar/evolve.rb +0 -3
  85. data/lib/hecks/grammar/translation.bluebook +1 -1
  86. data/lib/hecks/hecks/adapters/codebase/composing.rb +56 -0
  87. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +3 -1
  88. data/lib/hecks/hecks/adapters/first_admin.rb +3 -3
  89. data/lib/hecks/hecks/adapters/journal_store/changes.rb +0 -26
  90. data/lib/hecks/hecks/adapters/journal_store/examination.rb +2 -23
  91. data/lib/hecks/hecks/adapters/journal_store/readings.rb +3 -11
  92. data/lib/hecks/hecks/adapters/journal_store.rb +0 -11
  93. data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +4 -11
  94. data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +0 -9
  95. data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +0 -4
  96. data/lib/hecks/hecks/codebase.behaviors +6 -0
  97. data/lib/hecks/hecks/codebase.bluebook +21 -0
  98. data/lib/hecks/hecks/composer.behaviors +68 -0
  99. data/lib/hecks/hecks/context_map.hecksagon +1 -1
  100. data/lib/hecks/hecks/custodian.behaviors +0 -6
  101. data/lib/hecks/hecks/custodian.bluebook +3 -80
  102. data/lib/hecks/hecks/hecks.hecksagon +2 -2
  103. data/lib/hecks/hecks/hecks.world +1 -1
  104. data/lib/hecks/hecks/rehearsal.bluebook +7 -13
  105. data/lib/hecks/kernel_capabilities/templates.rb +4 -4
  106. data/lib/hecks/kernel_capabilities.rb +1 -1
  107. data/lib/hecks/language/bluebook/vocabulary.bluebook +2 -3
  108. data/lib/hecks/language/translation/translation_aggregate.bluebook +21 -24
  109. data/lib/hecks/ports/access_control.rb +2 -2
  110. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +3 -41
  111. data/lib/hecks/ports/persistence/plugins/era/lineage/coverage.rb +7 -7
  112. data/lib/hecks/ports/persistence/plugins/era/lineage/rewrite.rb +25 -2
  113. data/lib/hecks/ports/persistence/plugins/era/lineage/rules.rb +4 -4
  114. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +17 -25
  115. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/base_sql.rb +0 -12
  116. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/domain_rename.rb +1 -1
  117. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +2 -22
  118. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +0 -1
  119. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +9 -3
  120. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +3 -29
  121. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/refusals.rb +2 -26
  122. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +6 -33
  123. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -3
  124. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +2 -4
  125. data/lib/hecks/ports/persistence/plugins/era/translation/expression_sql.rb +52 -0
  126. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +23 -29
  127. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +1 -1
  128. data/lib/hecks/ports/persistence/plugins/era/translation.rb +0 -1
  129. data/lib/hecks/ports/persistence/plugins/era.rb +3 -6
  130. data/lib/hecks/ports.rb +0 -1
  131. data/lib/hecks/projection_files.rb +3 -1
  132. data/lib/hecks/projections/deploy/templates/lambda/nat_comment_oauth.tmpl +1 -1
  133. data/lib/hecks/projections/glossary/entries.rb +10 -4
  134. data/lib/hecks/projections/glossary/groups.rb +42 -0
  135. data/lib/hecks/projections/glossary/html/page.rb +7 -2
  136. data/lib/hecks/projections/glossary/html/parser.rb +1 -1
  137. data/lib/hecks/projections/glossary/html/sections.rb +31 -11
  138. data/lib/hecks/projections/glossary/html.rb +1 -2
  139. data/lib/hecks/projections/glossary/markdown.rb +31 -28
  140. data/lib/hecks/projections/glossary/mermaid.rb +3 -0
  141. data/lib/hecks/projections/glossary/page.css +143 -153
  142. data/lib/hecks/projections/glossary/page.js +63 -3
  143. data/lib/hecks/projections/glossary/sentences/actions.rb +88 -0
  144. data/lib/hecks/projections/glossary/sentences/paths.rb +77 -0
  145. data/lib/hecks/projections/glossary/sentences/queries.rb +90 -0
  146. data/lib/hecks/projections/glossary/sentences/value_objects.rb +32 -5
  147. data/lib/hecks/projections/glossary/sentences.rb +13 -3
  148. data/lib/hecks/projections/glossary/slugs.rb +4 -1
  149. data/lib/hecks/projections/glossary.rb +2 -1
  150. data/lib/hecks/projections/plain_english.rb +97 -0
  151. data/lib/hecks/projections/rust_vocabulary/arguments.rb +2 -2
  152. data/lib/hecks/projections/rust_vocabulary/enum_body.rb +20 -25
  153. data/lib/hecks/projections/rust_vocabulary/tests.rb +2 -2
  154. data/lib/hecks/projections/rust_vocabulary.rb +14 -6
  155. data/lib/hecks/projections/site/cms_editor/color.rb +0 -6
  156. data/lib/hecks/projections/site/cms_editor/templates/src/host.ts.tmpl +7 -2
  157. data/lib/hecks/projections/statements/actions.rb +99 -0
  158. data/lib/hecks/projections/statements/relationships.rb +86 -0
  159. data/lib/hecks/projections/statements.rb +15 -24
  160. data/lib/hecks/projector/exporter/adapters.rb +112 -0
  161. data/lib/hecks/projector/exporter/translations.rb +18 -35
  162. data/lib/hecks/projector/exporter/worlds.rb +103 -0
  163. data/lib/hecks/projector/exporter.rb +5 -1
  164. data/lib/hecks/quality_control/adapters/agent.rb +6 -7
  165. data/lib/hecks/quality_control/adapters/agent_profile.rb +16 -114
  166. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +1 -1
  167. data/lib/hecks/runtime/loader/boot_steps.rb +0 -20
  168. data/lib/hecks/runtime/outbox.rb +2 -9
  169. data/lib/hecks/runtime/port_operation_interpreter.rb +1 -9
  170. data/lib/hecks/runtime/remote_dispatcher.rb +2 -2
  171. data/lib/hecks/runtime/value/unwrapping.rb +60 -0
  172. data/lib/hecks/runtime/value.rb +10 -21
  173. data/lib/hecks/rust_build/project_rust/target_ir.rb +23 -4
  174. data/lib/hecks/rust_build/wasm.rb +0 -12
  175. data/lib/hecks/rust_build/write_if_changed.rb +12 -12
  176. data/lib/hecks/rust_format.rb +77 -0
  177. data/lib/hecks/tools/fuzz_sweep/findings.rb +3 -9
  178. data/lib/hecks/tools/fuzz_sweep.rb +1 -3
  179. data/lib/hecks/tools/translation_audit/verdicts.rb +3 -28
  180. data/lib/hecks/tools/translation_audit.rb +8 -10
  181. data/lib/hecks/tools/translation_scaffold/reporting.rb +1 -1
  182. data/lib/hecks/version.rb +1 -1
  183. data/lib/hecks/vocabulary.rb +2 -1
  184. data/lib/hecks.rb +3 -0
  185. data/prebuilt/{1a6f596be124228be93eba1d86dbc9d2933190fa389b284331241cb9f27115a0.marshal → ad68f9e06c8068c2a4176b57abf3083d591d5d8980c2b3e897b97331f965b643.marshal} +0 -0
  186. data/prebuilt/{a883a7e568667aa5ac904c82daff356bdf9e996252a36af6def4a4a43efb967e.marshal → ee22ec8642c4006717ba2b80f46e5efb81de459eef9dfec043e838c0ad4fd720.marshal} +0 -0
  187. data/prebuilt/{verdicts-872993b1aa26d73fe48f28251374b8585fed145d02aab42be0f00de386b6ff80.json → verdicts-b69f5dcbba79c20daa0493476fa7c317004a30aa2bc3d3dc6a722ea70ae2b43b.json} +1 -1
  188. data/rust/Cargo.toml +40 -0
  189. data/rust/build/Cargo.toml +36 -0
  190. data/rust/build/clippy.toml +4 -0
  191. data/rust/build/src/adapters_pass.rs +196 -0
  192. data/rust/build/src/binding_pass.rs +54 -13
  193. data/rust/build/src/build_artifact.rs +23 -5
  194. data/rust/build/src/cargo_sync.rs +69 -26
  195. data/rust/build/src/lineage_pass.rs +101 -87
  196. data/rust/build/src/main.rs +11 -2
  197. data/rust/build/src/pipeline.rs +80 -19
  198. data/rust/build/src/reserved_names.rs +6 -50
  199. data/rust/build/src/resolve.rs +82 -35
  200. data/rust/build/src/rustfmt.rs +100 -0
  201. data/rust/build/src/seams_pass.rs +85 -16
  202. data/rust/build/src/subprocess.rs +30 -6
  203. data/rust/build/src/tmp.rs +5 -2
  204. data/rust/build/src/translation_pass.rs +72 -22
  205. data/rust/build/src/world_pass.rs +109 -0
  206. data/rust/clippy.toml +4 -0
  207. data/rust/codegen/Cargo.toml +36 -0
  208. data/rust/codegen/clippy.toml +4 -0
  209. data/rust/codegen/src/asks.rs +40 -14
  210. data/rust/codegen/src/attr.rs +2 -2
  211. data/rust/codegen/src/bridging.rs +676 -117
  212. data/rust/codegen/src/commands.rs +979 -373
  213. data/rust/codegen/src/constraints.rs +88 -25
  214. data/rust/codegen/src/dependency_planning.rs +128 -34
  215. data/rust/codegen/src/domain_generator.rs +306 -170
  216. data/rust/codegen/src/exemplar.rs +87 -32
  217. data/rust/codegen/src/expr_emitter.rs +54 -6
  218. data/rust/codegen/src/fielded.rs +193 -41
  219. data/rust/codegen/src/hecks_naming.rs +124 -16
  220. data/rust/codegen/src/hecks_naming_tests.rs +81 -0
  221. data/rust/codegen/src/json.rs +80 -44
  222. data/rust/codegen/src/json_codec.rs +585 -149
  223. data/rust/codegen/src/literal.rs +104 -138
  224. data/rust/codegen/src/main.rs +151 -52
  225. data/rust/codegen/src/manifest.rs +76 -14
  226. data/rust/codegen/src/mutations.rs +1212 -239
  227. data/rust/codegen/src/naming.rs +111 -60
  228. data/rust/codegen/src/optional_pass.rs +90 -28
  229. data/rust/codegen/src/ports.rs +5 -4
  230. data/rust/codegen/src/prelude.rs +139 -49
  231. data/rust/codegen/src/presenters.rs +335 -0
  232. data/rust/codegen/src/queries.rs +601 -226
  233. data/rust/codegen/src/reactions.rs +268 -74
  234. data/rust/codegen/src/read_models.rs +574 -229
  235. data/rust/codegen/src/reference_specs.rs +16 -3
  236. data/rust/codegen/src/registry.rs +128 -79
  237. data/rust/codegen/src/reserved_names.rs +6 -50
  238. data/rust/codegen/src/shared.rs +71 -22
  239. data/rust/codegen/src/sidecars.rs +15 -5
  240. data/rust/codegen/src/skip_reason.rs +8 -2
  241. data/rust/codegen/src/types.rs +306 -108
  242. data/rust/host/Cargo.lock +1 -0
  243. data/rust/host/Cargo.toml +40 -4
  244. data/rust/host/HECKS_RELEASE +1 -1
  245. data/rust/host/clippy.toml +4 -0
  246. data/rust/host/src/api.rs +698 -218
  247. data/rust/host/src/auth.rs +491 -214
  248. data/rust/host/src/b64.rs +91 -0
  249. data/rust/host/src/bin/expr_harness.rs +6 -2
  250. data/rust/host/src/bin/lineage_harness.rs +47 -11
  251. data/rust/host/src/bin/mint_harness.rs +70 -37
  252. data/rust/host/src/bin/validate_harness.rs +16 -8
  253. data/rust/host/src/boot.rs +144 -68
  254. data/rust/host/src/boundary_fuzz/api.rs +130 -32
  255. data/rust/host/src/boundary_fuzz/auth.rs +108 -23
  256. data/rust/host/src/boundary_fuzz/expr_json.rs +85 -11
  257. data/rust/host/src/boundary_fuzz/ir.rs +164 -12
  258. data/rust/host/src/boundary_fuzz/server.rs +283 -36
  259. data/rust/host/src/boundary_fuzz/web.rs +56 -8
  260. data/rust/host/src/checkout.rs +78 -32
  261. data/rust/host/src/clock.rs +8 -0
  262. data/rust/host/src/commerce_ir.rs +333 -95
  263. data/rust/host/src/crypto.rs +33 -0
  264. data/rust/host/src/dispatch.rs +1037 -331
  265. data/rust/host/src/expr_json.rs +1021 -273
  266. data/rust/host/src/extension.rs +24 -4
  267. data/rust/host/src/field_hints.rs +11 -7
  268. data/rust/host/src/fuzz_support.rs +85 -13
  269. data/rust/host/src/host.rs +100 -0
  270. data/rust/host/src/http.rs +22 -0
  271. data/rust/host/src/ir.rs +326 -16
  272. data/rust/host/src/journal.rs +277 -176
  273. data/rust/host/src/lambda_client.rs +219 -53
  274. data/rust/host/src/lib.rs +16 -4
  275. data/rust/host/src/log.rs +62 -11
  276. data/rust/host/src/mint.rs +1153 -326
  277. data/rust/host/src/needs.rs +185 -44
  278. data/rust/host/src/payments/keystore.rs +197 -45
  279. data/rust/host/src/payments/roles.rs +39 -7
  280. data/rust/host/src/payments/tests.rs +1427 -282
  281. data/rust/host/src/payments.rs +391 -112
  282. data/rust/host/src/platform_signin/attack_tests.rs +5 -5
  283. data/rust/host/src/platform_signin/config.rs +11 -11
  284. data/rust/host/src/platform_signin/cookie.rs +2 -2
  285. data/rust/host/src/platform_signin/extension.rs +2 -1
  286. data/rust/host/src/platform_signin/handler.rs +9 -8
  287. data/rust/host/src/platform_signin/jti.rs +4 -2
  288. data/rust/host/src/platform_signin/jwks.rs +2 -1
  289. data/rust/host/src/platform_signin/jws.rs +2 -37
  290. data/rust/host/src/platform_signin/known_answer_tests.rs +5 -1
  291. data/rust/host/src/platform_signin/mode_tests.rs +5 -3
  292. data/rust/host/src/platform_signin/pages.rs +20 -20
  293. data/rust/host/src/platform_signin/session.rs +8 -1
  294. data/rust/host/src/platform_signin/settings.rs +6 -6
  295. data/rust/host/src/platform_signin/strict_json.rs +12 -9
  296. data/rust/host/src/platform_signin/verify.rs +41 -41
  297. data/rust/host/src/platform_signin/wiring_support.rs +13 -18
  298. data/rust/host/src/presentation.rs +207 -63
  299. data/rust/host/src/presentation_write.rs +502 -187
  300. data/rust/host/src/query_step.rs +69 -18
  301. data/rust/host/src/rate_limit.rs +541 -142
  302. data/rust/host/src/reference_transform.rs +77 -25
  303. data/rust/host/src/reference_validate.rs +443 -104
  304. data/rust/host/src/resend.rs +190 -55
  305. data/rust/host/src/secrets.rs +116 -21
  306. data/rust/host/src/server.rs +555 -104
  307. data/rust/host/src/storage_shape.rs +88 -21
  308. data/rust/host/src/test_pg.rs +17 -7
  309. data/rust/host/src/ui_schema.rs +495 -207
  310. data/rust/host/src/wasm_runner.rs +21 -6
  311. data/rust/host/src/web/commerce.rs +101 -23
  312. data/rust/host/src/web/newsletter/cooldown.rs +10 -3
  313. data/rust/host/src/web/newsletter/template.rs +26 -7
  314. data/rust/host/src/web/newsletter/tests.rs +112 -23
  315. data/rust/host/src/web/newsletter.rs +209 -59
  316. data/rust/host/src/web/newsletter_send.rs +251 -79
  317. data/rust/host/src/web/registration_receipt/tests.rs +16 -4
  318. data/rust/host/src/web/registration_receipt.rs +100 -24
  319. data/rust/host/src/web/registrations.rs +1384 -332
  320. data/rust/host/src/web/resend_webhook.rs +138 -80
  321. data/rust/host/src/web.rs +2416 -508
  322. data/rust/lsp/Cargo.toml +36 -0
  323. data/rust/lsp/clippy.toml +4 -0
  324. data/rust/lsp/src/json.rs +29 -22
  325. data/rust/lsp/src/main.rs +81 -31
  326. data/rust/lsp/src/outline.rs +23 -7
  327. data/rust/lsp/src/rpc.rs +17 -4
  328. data/rust/parser/Cargo.toml +36 -0
  329. data/rust/parser/clippy.toml +4 -0
  330. data/rust/parser/src/build/closed_sets.rs +6 -1
  331. data/rust/parser/src/build/identity.rs +4 -3
  332. data/rust/parser/src/build/mod.rs +1 -1
  333. data/rust/parser/src/build/named_pattern.rs +4 -1
  334. data/rust/parser/src/build/naming.rs +2 -80
  335. data/rust/parser/src/build/pattern_subset.rs +6 -8
  336. data/rust/parser/src/build/query_derive.rs +3 -1
  337. data/rust/parser/src/build/query_inference.rs +14 -5
  338. data/rust/parser/src/build/read_model.rs +4 -1
  339. data/rust/parser/src/build/references.rs +4 -3
  340. data/rust/parser/src/canonical.rs +34 -15
  341. data/rust/parser/src/emit.rs +187 -105
  342. data/rust/parser/src/expr/ast_json.rs +134 -42
  343. data/rust/parser/src/expr/evaluator.rs +27 -9
  344. data/rust/parser/src/expr/mod.rs +54 -13
  345. data/rust/parser/src/expr/resolver.rs +299 -92
  346. data/rust/parser/src/ir.rs +35 -3
  347. data/rust/parser/src/keywords.rs +7168 -516
  348. data/rust/parser/src/lex.rs +11 -25
  349. data/rust/parser/src/lib.rs +1 -0
  350. data/rust/parser/src/main.rs +65 -6
  351. data/rust/parser/src/parse/adapter.rs +157 -0
  352. data/rust/parser/src/parse/aggregate.rs +19 -10
  353. data/rust/parser/src/parse/chapter.rs +16 -17
  354. data/rust/parser/src/parse/command.rs +35 -16
  355. data/rust/parser/src/parse/domain_port.rs +4 -7
  356. data/rust/parser/src/parse/entity.rs +21 -11
  357. data/rust/parser/src/parse/hecksagon.rs +10 -4
  358. data/rust/parser/src/parse/lifecycle.rs +9 -5
  359. data/rust/parser/src/parse/mod.rs +22 -91
  360. data/rust/parser/src/parse/needs.rs +21 -12
  361. data/rust/parser/src/parse/policy.rs +2 -2
  362. data/rust/parser/src/parse/process_manager.rs +9 -11
  363. data/rust/parser/src/parse/query.rs +8 -4
  364. data/rust/parser/src/parse/read_model.rs +57 -16
  365. data/rust/parser/src/parse/value_object.rs +7 -2
  366. data/rust/parser/src/parse/world.rs +322 -0
  367. data/rust/parser/src/ruby_value.rs +7 -6
  368. data/rust/src/exemplar/json.rs +4 -4
  369. data/rust/src/exemplar/mutations.rs +18 -0
  370. data/rust/src/exemplar/read_models.rs +1 -10
  371. data/rust/src/kernel/attribute_shapes/composite.rs +54 -14
  372. data/rust/src/kernel/attribute_shapes/list.rs +2 -2
  373. data/rust/src/kernel/attribute_shapes/mod.rs +8 -8
  374. data/rust/src/kernel/attribute_shapes/scalar.rs +2 -2
  375. data/rust/src/kernel/cli.rs +244 -114
  376. data/rust/src/kernel/dispatch.rs +323 -115
  377. data/rust/src/kernel/dispatch_guard_tests.rs +327 -65
  378. data/rust/src/kernel/expr.rs +203 -86
  379. data/rust/src/kernel/expression_operators/arithmetic.rs +138 -25
  380. data/rust/src/kernel/expression_operators/comparison.rs +87 -2
  381. data/rust/src/kernel/expression_operators/enumeration.rs +106 -22
  382. data/rust/src/kernel/expression_operators/logical.rs +9 -3
  383. data/rust/src/kernel/expression_operators/membership.rs +3 -1
  384. data/rust/src/kernel/expression_operators/mod.rs +34 -21
  385. data/rust/src/kernel/expression_operators/pattern_match.rs +46 -11
  386. data/rust/src/kernel/expression_operators/positional.rs +84 -30
  387. data/rust/src/kernel/expression_operators/presence.rs +52 -13
  388. data/rust/src/kernel/expression_operators/sign_test.rs +3 -1
  389. data/rust/src/kernel/expression_operators/sized.rs +24 -8
  390. data/rust/src/kernel/expression_operators/text.rs +120 -27
  391. data/rust/src/kernel/expression_operators/to_string.rs +10 -4
  392. data/rust/src/kernel/json.rs +244 -148
  393. data/rust/src/kernel/mod.rs +47 -33
  394. data/rust/src/kernel/named_query.rs +63 -15
  395. data/rust/src/kernel/needs.rs +112 -25
  396. data/rust/src/kernel/orchestrate.rs +980 -581
  397. data/rust/src/kernel/orchestrate_guard_tests.rs +538 -140
  398. data/rust/src/kernel/pattern.rs +107 -34
  399. data/rust/src/kernel/present.rs +261 -0
  400. data/rust/src/kernel/query_comparators.rs +118 -41
  401. data/rust/src/kernel/query_ordering.rs +13 -5
  402. data/rust/src/kernel/read_model.rs +479 -181
  403. data/rust/src/kernel/reference_lookup.rs +122 -26
  404. data/rust/src/kernel/repository.rs +293 -66
  405. data/rust/src/kernel/routing.rs +58 -42
  406. data/rust/src/kernel/ruby_float.rs +139 -0
  407. data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +57 -57
  408. data/rust/src/kernel/vocab/entity_dispatch_order.rs +54 -54
  409. data/rust/src/kernel/vocab/field_hint.rs +19 -25
  410. data/rust/src/kernel/vocab/mod.rs +6 -6
  411. data/rust/src/kernel/vocab/query_comparator.rs +23 -24
  412. data/rust/src/kernel/vocab/refusal_template.rs +501 -297
  413. data/rust/src/lib.rs +50 -0
  414. data/rust/src/main.rs +4 -1
  415. data/rust/web/Cargo.toml +36 -0
  416. data/rust/web/clippy.toml +4 -0
  417. metadata +85 -15
  418. data/examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb +0 -36
  419. data/lib/hecks/adapters/driven/google_authentication.adapter +0 -3
  420. data/lib/hecks/adapters/driven/google_authentication.rb +0 -99
  421. data/lib/hecks/adapters/driven/mock_stripe_adapter.adapter +0 -3
  422. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +0 -32
  423. data/lib/hecks/ports/authentication.port +0 -6
  424. data/lib/hecks/ports/authentication.rb +0 -67
  425. data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +0 -255
  426. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +0 -22
  427. data/rust/host/src/approval.rs +0 -652
@@ -15,15 +15,14 @@ module Hecks
15
15
  module Examination
16
16
  # What every fact is until an examination finds otherwise.
17
17
  NEUTRAL = {
18
- capable: false, held: 0, forks: 0, contested: 0, edges: 0, bound: 0, candidates: 0,
19
- audited: false, rehearsal_needed: false, rehearsal_recorded: false,
18
+ capable: false, held: 0, forks: 0, contested: 0, bound: 0, candidates: 0,
20
19
  drifted: false, loadable: false, shape_kept: false
21
20
  }.freeze
22
21
 
23
22
  # Examines the domain a change was asked for.
24
23
  #
25
24
  # @param held [Hash] the `Era` record: `operation`, `domain`, and whichever of `winners`,
26
- # `era`, `aggregates` and the rehearsal fields the request carried
25
+ # `era` and `aggregates` the request carried
27
26
  # @return [Hash{Symbol => Hash}] every fact, as `{ value: x }`, and the request's own
28
27
  # `operation`, which the reactions to the examination read
29
28
  # @raise [Runtime::NotFound] if the domain cannot be loaded or has no such era
@@ -90,26 +89,6 @@ module Hecks
90
89
  { candidates: compaction.candidates.size, bound: compaction.bound.size }
91
90
  end
92
91
 
93
- def examine_approve_translation(held)
94
- domain = HeldDomain.open(plain(held[:domain]))
95
- return {} unless domain.capable?
96
-
97
- domain.reading do |lineage|
98
- eras = domain.held_eras(lineage)
99
- finding = eras.empty? ? nil : EdgeAudit.call(domain, lineage, eras)
100
- next { capable: true, held: eras.size } unless finding
101
-
102
- { capable: true, held: eras.size, edges: finding.leaving, audited: finding.ok }.merge(rehearsal_facts(finding, held))
103
- end
104
- end
105
-
106
- def rehearsal_facts(finding, held)
107
- {
108
- rehearsal_needed: Translation::ApprovalFile.needs_rehearsal?(finding.edge),
109
- rehearsal_recorded: Translation::ApprovalFile.rehearsed?(rehearsal_block(held))
110
- }
111
- end
112
-
113
92
  # How many eras, before the latest, do not have exactly one edge leading to the next.
114
93
  def forks_in(domain, eras)
115
94
  eras.each_cons(2).count do |from, to|
@@ -18,6 +18,8 @@ module Hecks
18
18
  # a domain that holds no era answers that it holds none, and only `hold_first` holds one.
19
19
  # What a reading refuses is a `Runtime::NotFound`, the refusal a launcher words as an answer.
20
20
  module Readings
21
+ AUDIT_PASSED = "AUDIT PASSED \u2014 review the samples above; intent is yours to approve."
22
+
21
23
  include Scaffolding
22
24
  include Attestation
23
25
 
@@ -112,17 +114,7 @@ module Hecks
112
114
  return "#{held.bluebook.name} stands at era 1 — no edge to audit." unless finding
113
115
  raise Runtime::NotFound, "#{finding.report}\nAUDIT REFUSED." unless finding.ok
114
116
 
115
- [finding.report, audit_verdict(finding.edge, path)].join("\n")
116
- end
117
-
118
- def audit_verdict(edge, path)
119
- if Translation::ApprovalFile.needs_rehearsal?(edge)
120
- "AUDIT PASSED — this edge carries a compute or rekey rule, and the samples above are its ONLY " \
121
- "verification. If they show what you intended, rehearse it against a snapshot and run " \
122
- "`hecks approve_translation #{path} --confirm` with the rehearsal; the mint refuses until then."
123
- else
124
- "AUDIT PASSED — review the samples above; intent is yours to approve."
125
- end
117
+ [finding.report, AUDIT_PASSED].join("\n")
126
118
  end
127
119
  end
128
120
  end
@@ -42,17 +42,6 @@ module Hecks
42
42
  end
43
43
  end
44
44
 
45
- # The rehearsal a compute or rekey edge is approved on, as the block the file carries. A
46
- # rehearsal that names no host version ran on this one, so it records this release.
47
- def rehearsal_block(held)
48
- block = { "snapshot" => plain(held[:snapshot]), "host_version" => plain(held[:host_version]),
49
- "result" => plain(held[:rehearsal]), "at" => plain(held[:rehearsed_at]) }.compact
50
- return nil if block.empty?
51
-
52
- block["host_version"] ||= Hecks::VERSION
53
- block
54
- end
55
-
56
45
  # The era as stored, digest unchecked: a text that drifted is what re-attesting is for.
57
46
  def raw_era(domain, lineage, ordinal)
58
47
  present = lineage.db.exec("SELECT to_regclass('hecks_eras') AS present")[0]["present"]
@@ -45,7 +45,7 @@ module Hecks
45
45
  refusals, after = edge ? @store.audit(@subject, edge) : [[], {}]
46
46
  rust = RustAudit.call(@subject, after)
47
47
  report = AuditReport.new(minting: minting, edge: edge, states: after, ruby: refusals, rust: rust)
48
- answer(edge, report, (refusals + rust.violations).uniq, limits(edge, rust, report))
48
+ answer(edge, report, (refusals + rust.violations).uniq, limits(rust, report))
49
49
  end
50
50
 
51
51
  private
@@ -82,7 +82,7 @@ module Hecks
82
82
  def copy_facts = census.facts.merge(copy_empty: flag(copy_empty?))
83
83
 
84
84
  def edge_facts(edge)
85
- { minting: plain(minting), edge_present: flag(!edge.nil?), edge_approved: flag(approved?(edge)) }
85
+ { minting: plain(minting), edge_present: flag(!edge.nil?) }
86
86
  end
87
87
 
88
88
  def eras = @eras ||= @store.eras(@subject)
@@ -97,16 +97,9 @@ module Hecks
97
97
  before == @subject.label ? "none" : "next"
98
98
  end
99
99
 
100
- def approved?(edge)
101
- return false unless edge
102
-
103
- !Translation::ApprovalFile.needs_rehearsal?(edge) ||
104
- !Translation::ApprovalFile.applicable(@subject.directory, edge).nil?
105
- end
106
-
107
- def limits(edge, rust, report)
100
+ def limits(rust, report)
108
101
  engine = rust.ran ? [] : [ENGINE_LIMIT]
109
- engine + report.limits + ALWAYS + @store.limits(edge) + [journal_limit] + attached_limits +
102
+ engine + report.limits + ALWAYS + [journal_limit] + attached_limits +
110
103
  (@subject.held.capable? ? [] : [binding_note])
111
104
  end
112
105
 
@@ -65,15 +65,6 @@ module Hecks
65
65
  [refusals, after]
66
66
  end
67
67
 
68
- # @param edge [Bluebook::Translation] the edge
69
- # @return [Array<Hash>] what memory cannot apply, as report limits
70
- def limits(edge)
71
- return [] unless edge && Translation::ApprovalFile.needs_rehearsal?(edge)
72
-
73
- [{ what: "the edge's compute and rekey rules",
74
- why: "they are SQL, which only a postgres copy runs; memory leaves those fields as stored" }]
75
- end
76
-
77
68
  private
78
69
 
79
70
  def records(name) = @document.dig("records", name.to_s) || {}
@@ -42,10 +42,6 @@ module Hecks
42
42
  end
43
43
  end
44
44
 
45
- # @param _edge [Bluebook::Translation] unused
46
- # @return [Array<Hash>] none: a postgres copy runs the compiled rules itself
47
- def limits(_edge) = []
48
-
49
45
  private
50
46
 
51
47
  def schema_candidates(subject)
@@ -170,6 +170,12 @@ Hecks.behaviors "Codebase" do
170
170
  expect refused: "a port is 1 to 65535"
171
171
  end
172
172
 
173
+ test "Compose refuses a port that is not one" do
174
+ tests "Compose", on: "CorpusRun"
175
+ input port: { value: 70_000 }, run: { value: "compose" }
176
+ expect refused: "a port is 1 to 65535"
177
+ end
178
+
173
179
  test "ServeQueryIrMcp refuses a run that is not named" do
174
180
  tests "ServeQueryIrMcp", on: "CorpusRun"
175
181
  input run: { value: "" }
@@ -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 }
@@ -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 }
@@ -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
@@ -558,7 +550,7 @@ policy "RecordTheEra" do
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.
@@ -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, matches: :not_empty
592
- end
593
-
594
- value_object "HostVersion" do
595
- attribute :value, String, matches: :present
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" }
@@ -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
@@ -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
@@ -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.
@@ -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"]