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
@@ -74,12 +74,9 @@ module Hecks
74
74
 
75
75
  def hecksagon_names_in(path) = File.read(path).scan(HECKSAGON_NAME).flatten
76
76
 
77
- # Deletes every `translations/*.bluebook` in the copy. A compute/rekey translation
78
- # edge refuses to boot under any non-lineage-capable adapter (only `PostgresEra`
79
- # answers `lineage_capable? == true`), so every other mode strips it here rather
80
- # than tripping that refusal. Safe to drop: an ephemeral, zero-history boot never
81
- # has a pre-existing era-1 row to translate — the edge only matters at mint time,
82
- # against a real database, never here.
77
+ # Deletes every `translations/*.bluebook` in the copy. Safe to drop: an ephemeral,
78
+ # zero-history boot never has a pre-existing era-1 row to translate; the edge only
79
+ # matters at mint time, against a real database, never here.
83
80
  def strip_translations!(copy)
84
81
  Dir.glob(File.join(copy, "**", "translations", "*.bluebook")).each { |path| File.delete(path) }
85
82
  end
@@ -1,4 +1,4 @@
1
- require_relative "../../query_specification/common/comparators"
1
+ require_relative "../../vocabulary"
2
2
  require_relative "../../query_specification/common/where_clause"
3
3
  require_relative "../../query_specification/field_path"
4
4
  require_relative "../../ports/query/in_memory"
@@ -9,10 +9,6 @@ module Hecks
9
9
  # Answers the ad hoc `{aggregate:, field:, op:, value:}` filter steps that bypass the
10
10
  # declared query DSL.
11
11
  module Filters
12
- # Mirrors QuerySpecification::Common::COMPARATORS, not the Rust
13
- # kernel's own comparator enum, which is missing `none_in_state` and has drifted.
14
- FILTER_COMPARATORS = Hecks::QuerySpecification::Common::COMPARATORS.map(&:to_s).freeze
15
-
16
12
  # Answers one ad hoc filter step, the mirror image of kernel/cli.rs's own
17
13
  # `run_filter`, calling the same production `Ports::Query::InMemory` rather than
18
14
  # re-deriving comparator behavior by hand. Sorted by id ascending regardless,
@@ -31,7 +27,7 @@ module Hecks
31
27
 
32
28
  # A malformed ad-hoc ask is a fault (C8.3), not a bare RuntimeError.
33
29
  def check_comparator!(comparator)
34
- return if FILTER_COMPARATORS.include?(comparator)
30
+ return if Hecks::Vocabulary.fetch("QueryComparator").include?(comparator)
35
31
 
36
32
  raise Bluebook::Expression::EvaluationError, "unknown query comparator #{comparator.inspect}"
37
33
  end
@@ -84,6 +84,20 @@ pre_push:
84
84
  title: comment blocks, no run of comment lines past ADR 0075's cap
85
85
  run: [bundle, exec, exe/hecks, style_run.check_comments, "paths=lib,spec,examples", only=long_block, --wait]
86
86
  blocked: a comment block ran past the cap; shorten it.
87
+ - &check_rust_fmt
88
+ id: rust_fmt
89
+ title: rustfmt, every Rust crate laid out as `cargo fmt` would
90
+ run:
91
+ - sh
92
+ - -ec
93
+ - |
94
+ # The main crate's generated modules are not committed, so cargo fmt would stop at a
95
+ # missing file on a fresh checkout; its hand-written entry points are named instead.
96
+ rustfmt --check --edition 2021 rust/src/main.rs rust/src/kernel/mod.rs rust/tests/*.rs
97
+ for crate in parser codegen lsp host web build; do
98
+ cargo fmt --check --manifest-path "rust/$crate/Cargo.toml"
99
+ done
100
+ blocked: a Rust file is not laid out as rustfmt has it; run `cargo fmt` in its crate (rust/src/exemplar is exempt, it is text templates). Generated Rust is laid out by its generators, so fix the generator, not the output.
87
101
 
88
102
  # The checks a push of only unguarded lanes (`main`) runs in place of pre_push. The slow suite is
89
103
  # skipped there; the style checks are not, since an offense that lands on `main` is a red CI run,
@@ -140,6 +154,17 @@ ci:
140
154
  - *check_comment_style
141
155
  - *check_comment_blocks
142
156
  - *check_codegen_drift
157
+ - *check_rust_fmt
158
+ - id: rust_clippy
159
+ title: clippy, every Rust crate with its warnings as errors
160
+ run:
161
+ - sh
162
+ - -ec
163
+ - |
164
+ for crate in . parser codegen lsp host web build; do
165
+ cargo clippy --all-targets --manifest-path "rust/$crate/Cargo.toml" -- -D warnings
166
+ done
167
+ blocked: clippy found a warning in a Rust crate, under the strict `[lints.clippy]` table of its Cargo.toml. The main crate needs rust/src/generated, so run `hecks regenerate_corpus --confirm` first on a fresh checkout. Fix the code, or allow a lint at the one site with a line saying why; a warning in generated Rust is fixed in its generator.
143
168
  - id: lint_deploy_recipes
144
169
  title: generated deploy recipes, a command with no checked exit status or no echo
145
170
  run: [bundle, exec, exe/hecks, deploy, makefile_check.lint, --wait]
@@ -157,15 +157,9 @@ module Hecks
157
157
  # First `end` after the opener is the block's own — member rows sit bare (ADR 0025).
158
158
  def keyword_blocks(source) = seed_blocks(source, "KeywordSeed")
159
159
 
160
- # The first KeywordSeed block's source text.
161
- def keyword_block(source) = seed_block(source, "KeywordSeed", required: true)
162
-
163
160
  # ArgumentSeed blocks; see keyword_blocks for why the first bare end
164
161
  # after the opener is already the block's own.
165
162
  def argument_blocks(source) = seed_blocks(source, "ArgumentSeed")
166
-
167
- # The first ArgumentSeed block's source text.
168
- def argument_block(source) = seed_block(source, "ArgumentSeed", required: true)
169
163
  end
170
164
  end
171
165
  end
@@ -96,9 +96,6 @@ module Hecks
96
96
  end
97
97
  end
98
98
 
99
- # Narrow compatibility entry point for single-file callers; syntax_paths is normal.
100
- def syntax_path = syntax_paths.first
101
-
102
99
  # Resolves the file(s) a call should search or write.
103
100
  def paths_for(path) = path ? Array(path) : syntax_paths
104
101
 
@@ -23,7 +23,7 @@ Hecks.bluebook "Translation" do
23
23
  # "retired" is the edge-level declaration (TranslationBuilder#retired).
24
24
  value_object "Kind" do
25
25
  attribute :value, String,
26
- one_of: ["rename", "move", "convert", "drop", "retype", "retired", "compute", "rekey",
26
+ one_of: ["rename", "move", "convert", "drop", "retype", "retired", "derive", "rekey_to",
27
27
  "backfill", "unresolved"]
28
28
  end
29
29
 
@@ -0,0 +1,56 @@
1
+ require_relative "corpus_tasks"
2
+
3
+ module Hecks
4
+ module Adapters
5
+ module Codebase
6
+ # What Codebase's `CorpusRun` asks of the working tree to open the Composer: serve its editor
7
+ # over one domain directory, on the loopback address only, until the server is stopped.
8
+ #
9
+ # The server hook is the one `CorpusTasks` has, so a spec replaces both servers the same way.
10
+ module Composing
11
+ # Every operation this family carries out.
12
+ OPERATIONS = %w[compose].freeze
13
+
14
+ # The port the editor listens on when none is named.
15
+ DEFAULT_PORT = 4570
16
+
17
+ # The directory the editor opens when none is named, relative to the checkout.
18
+ DEFAULT_WORKSPACE = "examples/pizzas/bluebook".freeze
19
+
20
+ # The only address the editor binds: it carries no authentication.
21
+ HOST = "127.0.0.1".freeze
22
+
23
+ module_function
24
+
25
+ # Opens the editor.
26
+ #
27
+ # @param operation [String] `compose`
28
+ # @param held [Hash] the `CorpusRun` record's fields: `port`, `domains` (the directory)
29
+ # @param tree [Tree] the working tree, already known to be a hecks checkout
30
+ # @param shell [#capture, nil] unused
31
+ # @return [String] a note that the server stopped
32
+ def call(operation, held, tree, shell: nil)
33
+ _ = [operation, shell]
34
+ require "hecks/composer/web"
35
+ fields = held.transform_values { |value| value.is_a?(Hash) ? value[:value] : value }
36
+ workspace = File.expand_path(fields[:domains] || DEFAULT_WORKSPACE, tree.root)
37
+ port = fields[:port] || DEFAULT_PORT
38
+ warn "composer over #{workspace} on http://#{HOST}:#{port}/composer - no authentication, " \
39
+ "no CSRF protection, no caller identity; do not expose beyond localhost"
40
+ app = Composer::Web.app(workspace: workspace)
41
+ (CorpusTasks.web_server || method(:serve)).call(app: app, port: port, host: HOST)
42
+ "composed on port #{port}, now stopped"
43
+ end
44
+
45
+ # @param app [#call] the Rack app
46
+ # @param port [Integer] the port
47
+ # @param host [String] the address to bind
48
+ # @return [void]
49
+ def serve(app:, port:, host:)
50
+ require "rackup"
51
+ Rackup::Server.start(app: app, Host: host, Port: port, server: "webrick")
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -11,6 +11,7 @@ require_relative "inspection"
11
11
  require_relative "codemods"
12
12
  require_relative "test_suite"
13
13
  require_relative "corpus_tasks"
14
+ require_relative "composing"
14
15
  require_relative "publishing"
15
16
  require_relative "promotion"
16
17
  require_relative "../git"
@@ -183,7 +184,8 @@ module Hecks
183
184
  # The task families, each carrying out the operations it lists.
184
185
  FAMILIES = [Codebase::Language, Codebase::KernelTables, Codebase::Conformance, Codebase::Regeneration,
185
186
  Codebase::Gate, Codebase::Style, Codebase::Inspection, Codebase::Codemods, Codebase::TestSuite,
186
- Codebase::CorpusTasks, Codebase::Publishing, Codebase::Promotion].freeze
187
+ Codebase::CorpusTasks, Codebase::Composing, Codebase::Publishing,
188
+ Codebase::Promotion].freeze
187
189
  private_constant :FAMILIES
188
190
 
189
191
  # The facts of a promotion or a watch, naming the operation so policies can tell them apart.
@@ -117,32 +117,6 @@ module Hecks
117
117
  def apply_compaction(held, kind)
118
118
  Compaction.new(plain(held[:domain]), aggregates: names(held[:aggregates]), kind: kind).apply!.join("\n")
119
119
  end
120
-
121
- # Writes `translations/<edge>.approval`; the host reads it at its next boot.
122
- def apply_approve_translation(held)
123
- domain = HeldDomain.open(plain(held[:domain]))
124
- finding = domain.reading { |lineage| audited_edge(domain, lineage) }
125
- document = approval_document(domain, finding, held)
126
- path = Translation::ApprovalFile.write!(domain.directory, finding.edge, document)
127
- "approval of edge #{document["edge"]} written to #{path} (digest #{document["edge_digest"][0, 12]}…, " \
128
- "by #{document["approved_by"]}). Commit it with the edge; the host applies it at its next boot."
129
- end
130
-
131
- def approval_document(domain, finding, held)
132
- Translation::ApprovalFile.build(
133
- edge: finding.edge, approved_by: Git.new.identity(chdir: domain.directory),
134
- approved_at: Time.now.utc.iso8601, rehearsal: rehearsal_block(held)
135
- )
136
- end
137
-
138
- def audited_edge(domain, lineage)
139
- eras = domain.held_eras(lineage)
140
- finding = eras.empty? ? nil : EdgeAudit.call(domain, lineage, eras)
141
- raise Runtime::WiringError, "#{domain.bluebook.name} has no edge to approve" unless finding
142
- raise Runtime::WiringError, "#{finding.report}\nAUDIT REFUSED." unless finding.ok
143
-
144
- finding
145
- end
146
120
  end
147
121
  end
148
122
  end
@@ -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: "" }