hecks 2.8.0 → 3.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 (886) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +50 -7
  3. data/lib/hecks/adapters/driven/claude_code.rb +4 -104
  4. data/lib/hecks/adapters/driven/d1.rb +44 -237
  5. data/lib/hecks/adapters/driven/folder.rb +17 -76
  6. data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
  7. data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
  8. data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
  9. data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
  10. data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
  11. data/lib/hecks/adapters/driven/heki.rb +13 -42
  12. data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
  13. data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
  14. data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
  15. data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
  16. data/lib/hecks/adapters/driven/lambda.rb +10 -84
  17. data/lib/hecks/adapters/driven/local_storage.rb +5 -40
  18. data/lib/hecks/adapters/driven/memory.rb +32 -100
  19. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
  20. data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
  21. data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
  22. data/lib/hecks/adapters/driven/postgres/reconnect.rb +10 -32
  23. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
  24. data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
  25. data/lib/hecks/adapters/driven/postgres.rb +149 -136
  26. data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
  27. data/lib/hecks/adapters/driven/prism.rb +48 -38
  28. data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
  29. data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
  30. data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
  31. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
  32. data/lib/hecks/adapters/driven/sqlite.rb +128 -65
  33. data/lib/hecks/adapters/driven/tenant_provisioner.rb +76 -62
  34. data/lib/hecks/adapters/driven.rb +5 -36
  35. data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
  36. data/lib/hecks/behaviors/dsl.rb +7 -25
  37. data/lib/hecks/behaviors/expectations.rb +32 -142
  38. data/lib/hecks/behaviors/ir.rb +7 -20
  39. data/lib/hecks/behaviors/rspec.rb +6 -17
  40. data/lib/hecks/behaviors/runner.rb +10 -34
  41. data/lib/hecks/behaviors.rb +4 -8
  42. data/lib/hecks/bench/cli.rb +62 -0
  43. data/lib/hecks/bench/environment.rb +71 -0
  44. data/lib/hecks/bench/postgres_probe.rb +30 -0
  45. data/lib/hecks/bench/report.rb +76 -0
  46. data/lib/hecks/bench/ruby_runner.rb +93 -0
  47. data/lib/hecks/bench/run.rb +55 -0
  48. data/lib/hecks/bench/rust_runner.rb +101 -0
  49. data/lib/hecks/bench/stats.rb +46 -0
  50. data/lib/hecks/bench/suite.rb +98 -0
  51. data/lib/hecks/bench/workload.rb +89 -0
  52. data/lib/hecks/bench.rb +17 -0
  53. data/lib/hecks/bluebook/aggregate.rb +9 -75
  54. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
  55. data/lib/hecks/bluebook/assembly/build.rb +4 -15
  56. data/lib/hecks/bluebook/assembly/contract.rb +15 -136
  57. data/lib/hecks/bluebook/assembly/contracts.rb +56 -174
  58. data/lib/hecks/bluebook/assembly/marks.rb +31 -223
  59. data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
  60. data/lib/hecks/bluebook/assembly.rb +6 -45
  61. data/lib/hecks/bluebook/attribute.rb +12 -61
  62. data/lib/hecks/bluebook/behaviour/aggregate.rb +39 -39
  63. data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
  64. data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
  65. data/lib/hecks/bluebook/behaviour/command.rb +14 -66
  66. data/lib/hecks/bluebook/behaviour/domain_port.rb +11 -20
  67. data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
  68. data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
  69. data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
  70. data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
  71. data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
  72. data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
  73. data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
  74. data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
  75. data/lib/hecks/bluebook/capabilities.rb +17 -49
  76. data/lib/hecks/bluebook/chapter.rb +16 -50
  77. data/lib/hecks/bluebook/command.rb +23 -81
  78. data/lib/hecks/bluebook/domain_port.rb +49 -67
  79. data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
  80. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
  81. data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
  82. data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
  83. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +96 -708
  84. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +63 -169
  85. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +3 -1
  86. data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
  87. data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
  88. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +42 -89
  89. data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
  90. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
  91. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +148 -197
  92. data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
  93. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
  94. data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
  95. data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
  96. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
  97. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
  98. data/lib/hecks/bluebook/dsl/query_builder.rb +38 -43
  99. data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
  100. data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
  101. data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
  102. data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
  103. data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
  104. data/lib/hecks/bluebook/dsl/world_builder.rb +46 -111
  105. data/lib/hecks/bluebook/entity.rb +13 -71
  106. data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
  107. data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
  108. data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
  109. data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
  110. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
  111. data/lib/hecks/bluebook/expression/resolver.rb +39 -661
  112. data/lib/hecks/bluebook/hexagon.rb +18 -33
  113. data/lib/hecks/bluebook/lifecycle.rb +5 -16
  114. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
  115. data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
  116. data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
  117. data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
  118. data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
  119. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -176
  120. data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
  121. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -306
  122. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
  123. data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
  124. data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
  125. data/lib/hecks/bluebook/meta_validator.rb +87 -352
  126. data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
  127. data/lib/hecks/bluebook/model_check.rb +122 -596
  128. data/lib/hecks/bluebook/pattern_subset.rb +49 -69
  129. data/lib/hecks/bluebook/process_manager.rb +13 -83
  130. data/lib/hecks/bluebook/project_loader.rb +3 -39
  131. data/lib/hecks/bluebook/project_register.rb +12 -60
  132. data/lib/hecks/bluebook/query.rb +27 -51
  133. data/lib/hecks/bluebook/read_model.rb +57 -81
  134. data/lib/hecks/bluebook/reference.rb +7 -41
  135. data/lib/hecks/bluebook/smoke_test.rb +9 -99
  136. data/lib/hecks/bluebook/synthesizer.rb +13 -62
  137. data/lib/hecks/bluebook/translation.rb +26 -62
  138. data/lib/hecks/bluebook/value_object.rb +11 -36
  139. data/lib/hecks/bluebook.rb +5 -22
  140. data/lib/hecks/cache_dir.rb +4 -23
  141. data/lib/hecks/canonical_json.rb +30 -0
  142. data/lib/hecks/chapters.rb +102 -0
  143. data/lib/hecks/cli/behaviors.rb +61 -0
  144. data/lib/hecks/cli/canonicalise.rb +25 -0
  145. data/lib/hecks/cli/check_engine_agreement.rb +32 -0
  146. data/lib/hecks/cli/check_era.rb +88 -0
  147. data/lib/hecks/cli/console.rb +66 -0
  148. data/lib/hecks/cli/deploy_template_diff.rb +40 -0
  149. data/lib/hecks/cli/doc_coverage.rb +32 -0
  150. data/lib/hecks/cli/document.rb +5 -23
  151. data/lib/hecks/cli/expression_projection.rb +41 -0
  152. data/lib/hecks/cli/follow.rb +88 -0
  153. data/lib/hecks/cli/history.rb +44 -0
  154. data/lib/hecks/cli/ir.rb +4 -6
  155. data/lib/hecks/cli/mcp.rb +5 -6
  156. data/lib/hecks/cli/model_check.rb +24 -88
  157. data/lib/hecks/cli/pattern_cases.rb +47 -0
  158. data/lib/hecks/cli/present.rb +39 -0
  159. data/lib/hecks/cli/project_cli.rb +223 -64
  160. data/lib/hecks/cli/project_diagrams.rb +4 -10
  161. data/lib/hecks/cli/project_glossary.rb +44 -0
  162. data/lib/hecks/cli/reference.rb +46 -0
  163. data/lib/hecks/cli/refresh_projections.rb +44 -0
  164. data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +150 -0
  165. data/lib/hecks/cli/release.rb +70 -0
  166. data/lib/hecks/cli/release_gem.rb +59 -0
  167. data/lib/hecks/cli/rspec_io_parallel_files.rb +137 -0
  168. data/lib/hecks/cli/rspec_shard_files.rb +66 -0
  169. data/lib/hecks/cli/run.rb +15 -61
  170. data/lib/hecks/cli/seed_semantics_corpus.rb +71 -0
  171. data/lib/hecks/cli/serve_query_ir_mcp.rb +30 -0
  172. data/lib/hecks/cli/shape.rb +70 -0
  173. data/lib/hecks/cli/smoke_http.rb +230 -0
  174. data/lib/hecks/cli/smoke_test.rb +7 -19
  175. data/lib/hecks/cli/spec_example.rb +27 -0
  176. data/lib/hecks/cli/statements.rb +32 -0
  177. data/lib/hecks/cli/stores.rb +4 -6
  178. data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
  179. data/lib/hecks/cli.rb +216 -73
  180. data/lib/hecks/codemod.rb +324 -0
  181. data/lib/hecks/construct.rb +8 -34
  182. data/lib/hecks/corpus.rb +423 -0
  183. data/lib/hecks/deploy/bluebook/deploy.bluebook +617 -158
  184. data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -11
  185. data/lib/hecks/deploy/oidc.json +82 -2
  186. data/lib/hecks/doc/reference.rb +351 -0
  187. data/lib/hecks/doors/cli_door.rb +196 -0
  188. data/lib/hecks/doors/cli_runner.rb +297 -0
  189. data/lib/hecks/{facade → doors}/command_request.rb +14 -34
  190. data/lib/hecks/doors/handle.rb +206 -0
  191. data/lib/hecks/doors/json_door.rb +132 -0
  192. data/lib/hecks/doors/launcher_options.rb +129 -0
  193. data/lib/hecks/{cli → doors}/mcp_door.rb +25 -120
  194. data/lib/hecks/doors/mcp_door_scope.rb +97 -0
  195. data/lib/hecks/doors/ruby_door/aggregate_door.rb +162 -0
  196. data/lib/hecks/doors/ruby_door/chapter.rb +72 -0
  197. data/lib/hecks/doors/ruby_door.rb +77 -0
  198. data/lib/hecks/doors.rb +61 -0
  199. data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
  200. data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
  201. data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
  202. data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
  203. data/lib/hecks/embryonaut_bluebook.rb +5 -72
  204. data/lib/hecks/engine_agreement.rb +156 -0
  205. data/lib/hecks/facade.rb +23 -51
  206. data/lib/hecks/forms/app.rb +21 -76
  207. data/lib/hecks/forms/banking_presentation.rb +50 -0
  208. data/lib/hecks/forms/command_form_renderer.rb +10 -29
  209. data/lib/hecks/forms/field_renderer.rb +17 -156
  210. data/lib/hecks/forms/field_shape.rb +31 -222
  211. data/lib/hecks/forms/html.rb +12 -47
  212. data/lib/hecks/forms/index_renderer.rb +1 -4
  213. data/lib/hecks/forms/page.rb +3 -9
  214. data/lib/hecks/forms/params.rb +14 -60
  215. data/lib/hecks/forms/port_argument.rb +2 -19
  216. data/lib/hecks/forms/query_form_renderer.rb +4 -79
  217. data/lib/hecks/forms/record_renderer.rb +8 -75
  218. data/lib/hecks/forms/record_table.rb +7 -50
  219. data/lib/hecks/forms/reference_options.rb +3 -30
  220. data/lib/hecks/forms/value_object_shape.rb +8 -35
  221. data/lib/hecks/forms.rb +5 -33
  222. data/lib/hecks/fqn.rb +5 -12
  223. data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
  224. data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
  225. data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
  226. data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
  227. data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
  228. data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
  229. data/lib/hecks/framework.rb +11 -80
  230. data/lib/hecks/freezer.rb +5 -39
  231. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +393 -0
  232. data/lib/hecks/fuzzing/combination_miner.rb +86 -0
  233. data/lib/hecks/fuzzing/concurrent_dispatch.rb +214 -0
  234. data/lib/hecks/fuzzing/coverage_campaign.rb +143 -0
  235. data/lib/hecks/fuzzing/differential.rb +156 -0
  236. data/lib/hecks/fuzzing/domain_generator.rb +615 -0
  237. data/lib/hecks/fuzzing/era_boundary.rb +71 -0
  238. data/lib/hecks/fuzzing/form_census.rb +136 -0
  239. data/lib/hecks/fuzzing/generated_domain_check.rb +93 -0
  240. data/lib/hecks/fuzzing/invalid_value_generator.rb +64 -0
  241. data/lib/hecks/fuzzing/isolated_boot.rb +301 -0
  242. data/lib/hecks/fuzzing/nondeterministic.rb +51 -0
  243. data/lib/hecks/fuzzing/outside_world.rb +45 -0
  244. data/lib/hecks/fuzzing/persistence_parity.rb +102 -0
  245. data/lib/hecks/fuzzing/properties/corrections.rb +88 -0
  246. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +314 -0
  247. data/lib/hecks/fuzzing/properties/guards.rb +190 -0
  248. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +300 -0
  249. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +93 -0
  250. data/lib/hecks/fuzzing/properties/outbox.rb +89 -0
  251. data/lib/hecks/fuzzing/properties/querying.rb +175 -0
  252. data/lib/hecks/fuzzing/properties.rb +162 -0
  253. data/lib/hecks/fuzzing/qa_settings.rb +123 -0
  254. data/lib/hecks/fuzzing/replay.rb +505 -0
  255. data/lib/hecks/fuzzing/rotation_priority.rb +48 -0
  256. data/lib/hecks/fuzzing/rust_gap_manifest.rb +108 -0
  257. data/lib/hecks/fuzzing/self_consistency.rb +339 -0
  258. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +385 -0
  259. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +132 -0
  260. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +95 -0
  261. data/lib/hecks/fuzzing/sequence_generator/picker.rb +77 -0
  262. data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +109 -0
  263. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +237 -0
  264. data/lib/hecks/fuzzing/sequence_generator.rb +189 -0
  265. data/lib/hecks/fuzzing/shrinker.rb +166 -0
  266. data/lib/hecks/fuzzing/structural_skips.rb +33 -0
  267. data/lib/hecks/fuzzing/sweep_depth.rb +43 -0
  268. data/lib/hecks/fuzzing/target_capabilities.rb +163 -0
  269. data/lib/hecks/fuzzing/value_generator.rb +216 -0
  270. data/lib/hecks/fuzzing.rb +23 -0
  271. data/lib/hecks/grammar/evolve.rb +336 -0
  272. data/lib/hecks/grammar/expression.bluebook +15 -40
  273. data/lib/hecks/grammar/translation.bluebook +3 -6
  274. data/lib/hecks/grammar.rb +16 -41
  275. data/lib/hecks/hecks/adapters/codebase/codemods.rb +45 -0
  276. data/lib/hecks/hecks/adapters/codebase/conformance.rb +71 -0
  277. data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +202 -0
  278. data/lib/hecks/hecks/adapters/codebase/gem_registry.rb +80 -0
  279. data/lib/hecks/hecks/adapters/codebase/kernel_tables.rb +54 -0
  280. data/lib/hecks/hecks/adapters/codebase/language.rb +240 -0
  281. data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +102 -0
  282. data/lib/hecks/hecks/adapters/codebase/publishing.rb +142 -0
  283. data/lib/hecks/hecks/adapters/codebase/regeneration.rb +67 -0
  284. data/lib/hecks/hecks/adapters/codebase/release_facts.rb +90 -0
  285. data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +83 -0
  286. data/lib/hecks/hecks/adapters/codebase/secret_vault.rb +36 -0
  287. data/lib/hecks/hecks/adapters/codebase/source_tree.adapter +7 -0
  288. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +189 -0
  289. data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +71 -0
  290. data/lib/hecks/hecks/adapters/codebase/style.rb +171 -0
  291. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +55 -0
  292. data/lib/hecks/hecks/adapters/codebase/test_suite.rb +165 -0
  293. data/lib/hecks/hecks/adapters/codebase/tree.rb +111 -0
  294. data/lib/hecks/hecks/adapters/console_capture.rb +79 -0
  295. data/lib/hecks/hecks/adapters/deploy_toolchain.adapter +7 -0
  296. data/lib/hecks/hecks/adapters/deploy_toolchain.rb +108 -0
  297. data/lib/hecks/hecks/adapters/git.adapter +7 -0
  298. data/lib/hecks/hecks/adapters/git.rb +102 -0
  299. data/lib/hecks/hecks/adapters/host_http.adapter +7 -0
  300. data/lib/hecks/hecks/adapters/host_http.rb +65 -0
  301. data/lib/hecks/hecks/adapters/in_process_boot.adapter +7 -0
  302. data/lib/hecks/hecks/adapters/in_process_boot.rb +197 -0
  303. data/lib/hecks/hecks/adapters/in_process_operations.rb +202 -0
  304. data/lib/hecks/hecks/adapters/journal_store/changes.rb +143 -0
  305. data/lib/hecks/hecks/adapters/journal_store/compaction.rb +145 -0
  306. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +132 -0
  307. data/lib/hecks/hecks/adapters/journal_store/examination.rb +135 -0
  308. data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +163 -0
  309. data/lib/hecks/hecks/adapters/journal_store/readings.rb +187 -0
  310. data/lib/hecks/hecks/adapters/journal_store.adapter +7 -0
  311. data/lib/hecks/hecks/adapters/journal_store.rb +64 -0
  312. data/lib/hecks/hecks/adapters/local_files.adapter +7 -0
  313. data/lib/hecks/hecks/adapters/local_files.rb +46 -0
  314. data/lib/hecks/hecks/adapters/pg_admin.adapter +7 -0
  315. data/lib/hecks/hecks/adapters/pg_admin.rb +245 -0
  316. data/lib/hecks/hecks/adapters/process_pool.adapter +7 -0
  317. data/lib/hecks/hecks/adapters/process_pool.rb +119 -0
  318. data/lib/hecks/hecks/adapters/rust_toolchain.adapter +7 -0
  319. data/lib/hecks/hecks/adapters/rust_toolchain.rb +179 -0
  320. data/lib/hecks/hecks/adapters/rust_workspace.rb +150 -0
  321. data/lib/hecks/hecks/adapters/shell.adapter +7 -0
  322. data/lib/hecks/hecks/adapters/shell.rb +49 -0
  323. data/lib/hecks/hecks/adapters/terminal.adapter +7 -0
  324. data/lib/hecks/hecks/adapters/terminal.rb +74 -0
  325. data/lib/hecks/hecks/codebase.behaviors +172 -0
  326. data/lib/hecks/hecks/codebase.bluebook +2453 -0
  327. data/lib/hecks/hecks/context_map.hecksagon +13 -0
  328. data/lib/hecks/hecks/custodian.behaviors +179 -0
  329. data/lib/hecks/hecks/custodian.bluebook +1847 -0
  330. data/lib/hecks/hecks/deploy.behaviors +74 -0
  331. data/lib/hecks/hecks/deploy.world +12 -0
  332. data/lib/hecks/hecks/environments/memory.world +10 -0
  333. data/lib/hecks/hecks/governance.world +7 -0
  334. data/lib/hecks/hecks/hecks.behaviors +62 -0
  335. data/lib/hecks/hecks/hecks.bluebook +124 -0
  336. data/lib/hecks/hecks/hecks.hecksagon +390 -0
  337. data/lib/hecks/hecks/hecks.world +42 -0
  338. data/lib/hecks/ir.rb +14 -83
  339. data/lib/hecks/kernel_capabilities.rb +194 -0
  340. data/lib/hecks/language/adapter.bluebook +2 -7
  341. data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
  342. data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
  343. data/lib/hecks/language/bluebook/bluebook.bluebook +26 -83
  344. data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
  345. data/lib/hecks/language/bluebook/command.bluebook +27 -144
  346. data/lib/hecks/language/bluebook/entity.bluebook +24 -97
  347. data/lib/hecks/language/bluebook/policy.bluebook +16 -67
  348. data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
  349. data/lib/hecks/language/bluebook/projection.bluebook +126 -60
  350. data/lib/hecks/language/bluebook/query.bluebook +19 -43
  351. data/lib/hecks/language/bluebook/shape.bluebook +23 -73
  352. data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
  353. data/lib/hecks/language/bluebook/vocabulary.bluebook +83 -198
  354. data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
  355. data/lib/hecks/language/hecksagon/domain_port.bluebook +14 -19
  356. data/lib/hecks/language/hecksagon/hecksagon.bluebook +26 -25
  357. data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
  358. data/lib/hecks/language/oidc.json +35 -0
  359. data/lib/hecks/language/port.bluebook +4 -17
  360. data/lib/hecks/language/translation/translation.bluebook +3 -9
  361. data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
  362. data/lib/hecks/language/world/wiring.bluebook +1 -3
  363. data/lib/hecks/language/world/world.bluebook +5 -7
  364. data/lib/hecks/literal.rb +8 -50
  365. data/lib/hecks/mcp_stdio_guard.rb +4 -41
  366. data/lib/hecks/naming.rb +29 -137
  367. data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
  368. data/lib/hecks/persistence_legacy_fixture.rb +113 -0
  369. data/lib/hecks/ports/access_control.rb +7 -23
  370. data/lib/hecks/ports/agent/answers.rb +5 -23
  371. data/lib/hecks/ports/agent.rb +47 -172
  372. data/lib/hecks/ports/authentication.rb +12 -39
  373. data/lib/hecks/ports/authorization.rb +16 -43
  374. data/lib/hecks/ports/clock.rb +5 -45
  375. data/lib/hecks/ports/extraction.rb +7 -12
  376. data/lib/hecks/ports/identity_assignment.rb +8 -29
  377. data/lib/hecks/ports/identity_generation.rb +6 -29
  378. data/lib/hecks/ports/identity_resolution.rb +2 -10
  379. data/lib/hecks/ports/key_vault.rb +9 -45
  380. data/lib/hecks/ports/persistence/append_only.rb +61 -64
  381. data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
  382. data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
  383. data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
  384. data/lib/hecks/ports/persistence/plugin.rb +13 -42
  385. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +44 -144
  386. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
  387. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +20 -85
  388. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
  389. data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +18 -24
  390. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
  391. data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
  392. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
  393. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
  394. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
  395. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
  396. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
  397. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
  398. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +19 -76
  399. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
  400. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
  401. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
  402. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
  403. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
  404. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +43 -127
  405. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
  406. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +131 -555
  407. data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
  408. data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +227 -0
  409. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
  410. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
  411. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
  412. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
  413. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
  414. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +50 -47
  415. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
  416. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
  417. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
  418. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
  419. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
  420. data/lib/hecks/ports/persistence/plugins/era/translation.rb +1 -0
  421. data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
  422. data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
  423. data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
  424. data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
  425. data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
  426. data/lib/hecks/ports/persistence/state_codec.rb +47 -108
  427. data/lib/hecks/ports/persistence.rb +7 -14
  428. data/lib/hecks/ports/projection.rb +42 -84
  429. data/lib/hecks/ports/query/in_memory.rb +10 -58
  430. data/lib/hecks/ports/query/ordering.rb +11 -32
  431. data/lib/hecks/ports/query.rb +14 -37
  432. data/lib/hecks/ports.rb +2 -8
  433. data/lib/hecks/projection_files.rb +285 -0
  434. data/lib/hecks/projections/bootstrap_table.rb +12 -44
  435. data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
  436. data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
  437. data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
  438. data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
  439. data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
  440. data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
  441. data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
  442. data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
  443. data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
  444. data/lib/hecks/projections/deploy/fargate.rb +40 -207
  445. data/lib/hecks/projections/deploy/lambda.rb +191 -708
  446. data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
  447. data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
  448. data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
  449. data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
  450. data/lib/hecks/projections/deploy/preview/script.rb +2 -14
  451. data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
  452. data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
  453. data/lib/hecks/projections/deploy/preview/template.rb +3 -59
  454. data/lib/hecks/projections/deploy/preview.rb +2 -67
  455. data/lib/hecks/projections/deploy/scripts/deploy-service.sh.tmpl +1 -1
  456. data/lib/hecks/projections/deploy/scripts/expected-era.header +1 -1
  457. data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +3 -3
  458. data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
  459. data/lib/hecks/projections/deploy/scripts/smoke-after-deploy.sh.tmpl +1 -1
  460. data/lib/hecks/projections/deploy/scripts.rb +4 -57
  461. data/lib/hecks/projections/deploy/shared.rb +48 -147
  462. data/lib/hecks/projections/deploy/smoke.rb +4 -61
  463. data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
  464. data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
  465. data/lib/hecks/projections/deploy/template_diff.rb +5 -57
  466. data/lib/hecks/projections/diagrams.rb +22 -584
  467. data/lib/hecks/projections/glossary/html.rb +14 -130
  468. data/lib/hecks/projections/glossary/markdown.rb +8 -69
  469. data/lib/hecks/projections/glossary/mermaid.rb +9 -66
  470. data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
  471. data/lib/hecks/projections/glossary/sentences.rb +14 -159
  472. data/lib/hecks/projections/glossary.rb +30 -222
  473. data/lib/hecks/projections/ir.rb +3 -10
  474. data/lib/hecks/projections/model/deviations.rb +16 -43
  475. data/lib/hecks/projections/model.rb +12 -51
  476. data/lib/hecks/projections/oidc.rb +12 -56
  477. data/lib/hecks/projections/parser_table.rb +13 -32
  478. data/lib/hecks/projections/reference.rb +4 -18
  479. data/lib/hecks/projections/rust_vocabulary.rb +13 -251
  480. data/lib/hecks/projections/shape.rb +3 -29
  481. data/lib/hecks/projections/statements.rb +7 -86
  482. data/lib/hecks/projections/vocabulary.rb +6 -22
  483. data/lib/hecks/projections.rb +2 -16
  484. data/lib/hecks/projector/cli_projector.rb +154 -400
  485. data/lib/hecks/projector/docs_projector.rb +10 -201
  486. data/lib/hecks/projector/exporter.rb +42 -134
  487. data/lib/hecks/projector/ir_projector.rb +2 -9
  488. data/lib/hecks/projector/narrate_projector.rb +15 -189
  489. data/lib/hecks/projector/target.rb +13 -76
  490. data/lib/hecks/projector.rb +30 -121
  491. data/lib/hecks/quality_control/adapters/agent.adapter +7 -0
  492. data/lib/hecks/quality_control/adapters/agent.rb +58 -0
  493. data/lib/hecks/quality_control/adapters/angle_tools.adapter +7 -0
  494. data/lib/hecks/quality_control/adapters/angle_tools.rb +15 -0
  495. data/lib/hecks/quality_control/adapters/clearance_recorder.rb +36 -0
  496. data/lib/hecks/quality_control/adapters/clearance_tools.adapter +7 -0
  497. data/lib/hecks/quality_control/adapters/clearance_tools.rb +17 -0
  498. data/lib/hecks/quality_control/adapters/git_pr.adapter +7 -0
  499. data/lib/hecks/quality_control/adapters/git_pr.rb +226 -0
  500. data/lib/hecks/quality_control/adapters/github_checks.adapter +9 -0
  501. data/lib/hecks/quality_control/adapters/github_checks.rb +83 -0
  502. data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +56 -0
  503. data/lib/hecks/quality_control/adapters/github_issues.adapter +7 -0
  504. data/lib/hecks/quality_control/adapters/github_issues.rb +49 -0
  505. data/lib/hecks/quality_control/adapters/qa_tool.rb +59 -0
  506. data/lib/hecks/quality_control/adapters/sweep_tools.adapter +7 -0
  507. data/lib/hecks/quality_control/adapters/sweep_tools.rb +51 -0
  508. data/lib/hecks/quality_control/adapters/target_tools.adapter +7 -0
  509. data/lib/hecks/quality_control/adapters/target_tools.rb +43 -0
  510. data/lib/hecks/quality_control/cli/child.rb +45 -0
  511. data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +45 -0
  512. data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +248 -0
  513. data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +163 -0
  514. data/lib/hecks/quality_control/cli/qa_generated_domains.rb +450 -0
  515. data/lib/hecks/quality_control/cli/qa_log_bug.rb +195 -0
  516. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +220 -0
  517. data/lib/hecks/quality_control/cli/qa_open_pr.rb +305 -0
  518. data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +154 -0
  519. data/lib/hecks/quality_control/cli/qa_postgres_role.rb +159 -0
  520. data/lib/hecks/quality_control/cli/qa_pr_check.rb +232 -0
  521. data/lib/hecks/quality_control/cli/qa_seed_angles.rb +142 -0
  522. data/lib/hecks/quality_control/cli/qa_seed_targets.rb +69 -0
  523. data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +280 -0
  524. data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +329 -0
  525. data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +92 -0
  526. data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +117 -0
  527. data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +175 -0
  528. data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +60 -0
  529. data/lib/hecks/quality_control/cli/qa_sweep.rb +611 -0
  530. data/lib/hecks/quality_control/cli/qa_tick.rb +274 -0
  531. data/lib/hecks/quality_control/quality_control.bluebook +2224 -0
  532. data/lib/hecks/quality_control/quality_control.hecksagon +13 -0
  533. data/lib/hecks/quality_control/quality_control.ports.hecksagon +54 -0
  534. data/lib/hecks/query_ir.rb +346 -0
  535. data/lib/hecks/query_ir_mcp.rb +198 -0
  536. data/lib/hecks/query_specification/common/comparators.rb +5 -26
  537. data/lib/hecks/query_specification/common/comparison.rb +35 -143
  538. data/lib/hecks/query_specification/common/dsl.rb +8 -24
  539. data/lib/hecks/query_specification/common/null_policy.rb +20 -70
  540. data/lib/hecks/query_specification/common/options.rb +2 -6
  541. data/lib/hecks/query_specification/common/where_clause.rb +2 -10
  542. data/lib/hecks/query_specification/field_path.rb +37 -77
  543. data/lib/hecks/query_specification/hop_path.rb +12 -76
  544. data/lib/hecks/release/gem_pin.rb +2 -26
  545. data/lib/hecks/release/runner/ci_publisher.rb +5 -8
  546. data/lib/hecks/release/runner/clean_tree.rb +42 -0
  547. data/lib/hecks/release/runner/commands.rb +2 -4
  548. data/lib/hecks/release/runner/console.rb +6 -0
  549. data/lib/hecks/release/runner/gem_publisher.rb +15 -9
  550. data/lib/hecks/release/runner/npm_publisher.rb +9 -53
  551. data/lib/hecks/release/runner/preflight.rb +29 -20
  552. data/lib/hecks/release/runner/published.rb +8 -26
  553. data/lib/hecks/release/runner/tagger.rb +31 -23
  554. data/lib/hecks/release/runner.rb +60 -38
  555. data/lib/hecks/rendering.rb +4 -26
  556. data/lib/hecks/router/namespace_installer.rb +15 -39
  557. data/lib/hecks/router.rb +4 -8
  558. data/lib/hecks/runtime/adapter_lookup.rb +124 -0
  559. data/lib/hecks/runtime/aggregate_lock.rb +8 -33
  560. data/lib/hecks/runtime/boot_gates.rb +3 -18
  561. data/lib/hecks/runtime/caller.rb +19 -59
  562. data/lib/hecks/runtime/capability_graph.rb +5 -21
  563. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
  564. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +27 -160
  565. data/lib/hecks/runtime/command_interpreter.rb +124 -306
  566. data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
  567. data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
  568. data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
  569. data/lib/hecks/runtime/command_rules/emission.rb +8 -21
  570. data/lib/hecks/runtime/command_rules/references.rb +23 -202
  571. data/lib/hecks/runtime/dependency_planning.rb +50 -104
  572. data/lib/hecks/runtime/dispatcher.rb +134 -243
  573. data/lib/hecks/runtime/entity_element.rb +40 -462
  574. data/lib/hecks/runtime/entity_interpreter.rb +64 -219
  575. data/lib/hecks/runtime/errors.rb +32 -115
  576. data/lib/hecks/runtime/event.rb +3 -25
  577. data/lib/hecks/runtime/identity.rb +18 -154
  578. data/lib/hecks/runtime/instance.rb +18 -150
  579. data/lib/hecks/runtime/interpreting.rb +14 -70
  580. data/lib/hecks/runtime/invocation.rb +28 -164
  581. data/lib/hecks/runtime/loader.rb +109 -194
  582. data/lib/hecks/runtime/outbox.rb +39 -262
  583. data/lib/hecks/runtime/policy_interpreter.rb +43 -202
  584. data/lib/hecks/runtime/port_operation_interpreter.rb +28 -97
  585. data/lib/hecks/runtime/query_interpreter.rb +122 -187
  586. data/lib/hecks/runtime/reaction_invocation.rb +36 -138
  587. data/lib/hecks/runtime/reaction_outcome.rb +89 -0
  588. data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
  589. data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
  590. data/lib/hecks/runtime/reference_hop.rb +8 -81
  591. data/lib/hecks/runtime/refusal_wording.rb +28 -87
  592. data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
  593. data/lib/hecks/runtime/registry/verification.rb +213 -227
  594. data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
  595. data/lib/hecks/runtime/registry.rb +156 -247
  596. data/lib/hecks/runtime/remote_dispatcher.rb +68 -154
  597. data/lib/hecks/runtime/routing.rb +4 -15
  598. data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
  599. data/lib/hecks/runtime/saga_interpreter.rb +79 -263
  600. data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
  601. data/lib/hecks/runtime/tenant_check.rb +6 -68
  602. data/lib/hecks/runtime/tenant_scope.rb +3 -28
  603. data/lib/hecks/runtime/value/admission.rb +16 -67
  604. data/lib/hecks/runtime/value/coercion.rb +162 -760
  605. data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
  606. data/lib/hecks/runtime/value/field_checks.rb +172 -0
  607. data/lib/hecks/runtime/value.rb +15 -84
  608. data/lib/hecks/runtime.rb +35 -69
  609. data/lib/hecks/rust_build/conformance.rb +158 -0
  610. data/lib/hecks/rust_build/conformance_fuzz.rb +71 -0
  611. data/lib/hecks/rust_build/coverage.rb +218 -0
  612. data/lib/hecks/rust_build/native_build.rb +124 -0
  613. data/lib/hecks/rust_build/project_rust/root_mod.rb +120 -0
  614. data/lib/hecks/rust_build/project_rust.rb +332 -0
  615. data/lib/hecks/rust_build/wasm.rb +105 -0
  616. data/lib/hecks/rust_build/wasm_browser.rb +113 -0
  617. data/lib/hecks/rust_build.rb +144 -0
  618. data/lib/hecks/storehouse.rb +155 -582
  619. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +10 -34
  620. data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
  621. data/lib/hecks/three_zero/forms.yml +127 -0
  622. data/lib/hecks/three_zero.rb +12 -0
  623. data/lib/hecks/tools/argument_gate_matrix.rb +316 -0
  624. data/lib/hecks/tools/comment_style.rb +1070 -0
  625. data/lib/hecks/tools/corpus_report.rb +87 -0
  626. data/lib/hecks/tools/deploy_recipe.rb +255 -0
  627. data/lib/hecks/tools/deploy_recipe_lint.rb +282 -0
  628. data/lib/hecks/tools/drop_implicit_append_fields.rb +95 -0
  629. data/lib/hecks/tools/era_projection_backfill.rb +94 -0
  630. data/lib/hecks/tools/era_reattest.rb +146 -0
  631. data/lib/hecks/tools/evolve_run.rb +189 -0
  632. data/lib/hecks/tools/fuzz_sweep.rb +373 -0
  633. data/lib/hecks/tools/heki_compaction.rb +100 -0
  634. data/lib/hecks/tools/hoist_local_givens.rb +246 -0
  635. data/lib/hecks/tools/journal_compaction.rb +89 -0
  636. data/lib/hecks/tools/oidc_manifests.rb +70 -0
  637. data/lib/hecks/tools/query_ir_run.rb +81 -0
  638. data/lib/hecks/tools/regeneration_run.rb +166 -0
  639. data/lib/hecks/tools/rust_comment_style.rb +642 -0
  640. data/lib/hecks/tools/sequence_script.rb +62 -0
  641. data/lib/hecks/tools/tail_merge.rb +117 -0
  642. data/lib/hecks/tools/tenant_provisioning.rb +142 -0
  643. data/lib/hecks/tools/translation_audit.rb +208 -0
  644. data/lib/hecks/tools/translation_scaffold.rb +131 -0
  645. data/lib/hecks/tools.rb +86 -0
  646. data/lib/hecks/vendoring/git_environment.rb +2 -8
  647. data/lib/hecks/vendoring/git_source.rb +4 -10
  648. data/lib/hecks/vendoring.rb +7 -46
  649. data/lib/hecks/version.rb +3 -14
  650. data/lib/hecks.rb +52 -90
  651. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
  652. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
  653. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
  654. data/qa/settings.yml +66 -0
  655. data/rust/.cargo/config.toml +6 -0
  656. data/rust/.gitignore +2 -0
  657. data/rust/Cargo.lock +54 -0
  658. data/rust/Cargo.toml +61 -0
  659. data/rust/build/.cargo/config.toml +3 -0
  660. data/rust/build/.gitignore +1 -0
  661. data/rust/build/Cargo.lock +7 -0
  662. data/rust/build/Cargo.toml +19 -0
  663. data/rust/build/src/build_artifact.rs +47 -0
  664. data/rust/build/src/cargo_sync.rs +248 -0
  665. data/rust/build/src/json.rs +421 -0
  666. data/rust/build/src/lineage_pass.rs +285 -0
  667. data/rust/build/src/main.rs +51 -0
  668. data/rust/build/src/optional_pass.rs +150 -0
  669. data/rust/build/src/pipeline.rs +264 -0
  670. data/rust/build/src/reserved_names.rs +76 -0
  671. data/rust/build/src/resolve.rs +124 -0
  672. data/rust/build/src/root.rs +25 -0
  673. data/rust/build/src/sidecars.rs +73 -0
  674. data/rust/build/src/subprocess.rs +51 -0
  675. data/rust/build/src/tmp.rs +31 -0
  676. data/rust/codegen/.cargo/config.toml +3 -0
  677. data/rust/codegen/.gitignore +1 -0
  678. data/rust/codegen/Cargo.lock +7 -0
  679. data/rust/codegen/Cargo.toml +20 -0
  680. data/rust/codegen/src/attr.rs +32 -0
  681. data/rust/codegen/src/bridging.rs +481 -0
  682. data/rust/codegen/src/commands.rs +1226 -0
  683. data/rust/codegen/src/constraints.rs +109 -0
  684. data/rust/codegen/src/dependency_planning.rs +209 -0
  685. data/rust/codegen/src/domain_generator.rs +1288 -0
  686. data/rust/codegen/src/exemplar.rs +230 -0
  687. data/rust/codegen/src/expr_emitter.rs +87 -0
  688. data/rust/codegen/src/fielded.rs +192 -0
  689. data/rust/codegen/src/hecks_naming.rs +33 -0
  690. data/rust/codegen/src/json.rs +335 -0
  691. data/rust/codegen/src/json_codec.rs +697 -0
  692. data/rust/codegen/src/literal.rs +207 -0
  693. data/rust/codegen/src/main.rs +290 -0
  694. data/rust/codegen/src/manifest.rs +227 -0
  695. data/rust/codegen/src/mutations.rs +784 -0
  696. data/rust/codegen/src/naming.rs +286 -0
  697. data/rust/codegen/src/ports.rs +208 -0
  698. data/rust/codegen/src/prelude.rs +116 -0
  699. data/rust/codegen/src/queries.rs +786 -0
  700. data/rust/codegen/src/reactions.rs +532 -0
  701. data/rust/codegen/src/read_models.rs +697 -0
  702. data/rust/codegen/src/reference_specs.rs +40 -0
  703. data/rust/codegen/src/registry.rs +966 -0
  704. data/rust/codegen/src/reserved_names.rs +76 -0
  705. data/rust/codegen/src/shared.rs +93 -0
  706. data/rust/codegen/src/skip_reason.rs +25 -0
  707. data/rust/codegen/src/types.rs +362 -0
  708. data/rust/host/.cargo/config.toml +3 -0
  709. data/rust/host/.gitignore +1 -0
  710. data/rust/host/Cargo.lock +4297 -0
  711. data/rust/host/Cargo.toml +61 -0
  712. data/rust/host/HECKS_RELEASE +1 -0
  713. data/rust/host/rds-ca-bundle.pem +2736 -0
  714. data/rust/host/src/api.rs +1596 -0
  715. data/rust/host/src/approval.rs +652 -0
  716. data/rust/host/src/auth.rs +1287 -0
  717. data/rust/host/src/bin/expr_harness.rs +46 -0
  718. data/rust/host/src/bin/lineage_harness.rs +119 -0
  719. data/rust/host/src/bin/mint_harness.rs +135 -0
  720. data/rust/host/src/checkout.rs +265 -0
  721. data/rust/host/src/dispatch.rs +1443 -0
  722. data/rust/host/src/expr_json.rs +1117 -0
  723. data/rust/host/src/field_hints.rs +52 -0
  724. data/rust/host/src/ir.rs +733 -0
  725. data/rust/host/src/journal.rs +874 -0
  726. data/rust/host/src/lambda_client.rs +378 -0
  727. data/rust/host/src/log.rs +147 -0
  728. data/rust/host/src/main.rs +474 -0
  729. data/rust/host/src/mint.rs +1865 -0
  730. data/rust/host/src/payments/keystore.rs +330 -0
  731. data/rust/host/src/payments/tests.rs +1400 -0
  732. data/rust/host/src/payments.rs +767 -0
  733. data/rust/host/src/presentation.rs +698 -0
  734. data/rust/host/src/presentation_write.rs +1431 -0
  735. data/rust/host/src/query_step.rs +149 -0
  736. data/rust/host/src/rate_limit.rs +904 -0
  737. data/rust/host/src/reference_transform.rs +241 -0
  738. data/rust/host/src/reference_validate.rs +338 -0
  739. data/rust/host/src/resend.rs +296 -0
  740. data/rust/host/src/secrets.rs +106 -0
  741. data/rust/host/src/server.rs +663 -0
  742. data/rust/host/src/storage_shape.rs +175 -0
  743. data/rust/host/src/test_pg.rs +40 -0
  744. data/rust/host/src/ui_schema.rs +1351 -0
  745. data/rust/host/src/wasm_runner.rs +191 -0
  746. data/rust/host/src/web/newsletter/cooldown.rs +126 -0
  747. data/rust/host/src/web/newsletter/tests.rs +104 -0
  748. data/rust/host/src/web/newsletter.rs +310 -0
  749. data/rust/host/src/web/newsletter_send.rs +357 -0
  750. data/rust/host/src/web/registrations.rs +1505 -0
  751. data/rust/host/src/web.rs +2937 -0
  752. data/rust/lsp/.gitignore +1 -0
  753. data/rust/lsp/Cargo.lock +7 -0
  754. data/rust/lsp/Cargo.toml +16 -0
  755. data/rust/lsp/README.md +133 -0
  756. data/rust/lsp/src/diagnostics.rs +165 -0
  757. data/rust/lsp/src/json.rs +385 -0
  758. data/rust/lsp/src/main.rs +399 -0
  759. data/rust/lsp/src/outline.rs +177 -0
  760. data/rust/lsp/src/rpc.rs +67 -0
  761. data/rust/parser/.cargo/config.toml +5 -0
  762. data/rust/parser/.gitignore +1 -0
  763. data/rust/parser/Cargo.lock +7 -0
  764. data/rust/parser/Cargo.toml +21 -0
  765. data/rust/parser/src/build/closed_sets.rs +27 -0
  766. data/rust/parser/src/build/identity.rs +276 -0
  767. data/rust/parser/src/build/mod.rs +12 -0
  768. data/rust/parser/src/build/naming.rs +141 -0
  769. data/rust/parser/src/build/pattern_subset.rs +161 -0
  770. data/rust/parser/src/build/query_derive.rs +72 -0
  771. data/rust/parser/src/build/query_inference.rs +269 -0
  772. data/rust/parser/src/build/query_options.rs +100 -0
  773. data/rust/parser/src/build/read_model.rs +94 -0
  774. data/rust/parser/src/build/references.rs +32 -0
  775. data/rust/parser/src/canonical.rs +114 -0
  776. data/rust/parser/src/diag.rs +55 -0
  777. data/rust/parser/src/emit.rs +953 -0
  778. data/rust/parser/src/expr/ast_json.rs +147 -0
  779. data/rust/parser/src/expr/evaluator.rs +81 -0
  780. data/rust/parser/src/expr/mod.rs +84 -0
  781. data/rust/parser/src/expr/resolver.rs +497 -0
  782. data/rust/parser/src/ir.rs +387 -0
  783. data/rust/parser/src/keywords.rs +585 -0
  784. data/rust/parser/src/lex.rs +662 -0
  785. data/rust/parser/src/main.rs +252 -0
  786. data/rust/parser/src/parse/aggregate.rs +612 -0
  787. data/rust/parser/src/parse/chapter.rs +517 -0
  788. data/rust/parser/src/parse/command.rs +637 -0
  789. data/rust/parser/src/parse/domain_port.rs +127 -0
  790. data/rust/parser/src/parse/entity.rs +527 -0
  791. data/rust/parser/src/parse/file.rs +67 -0
  792. data/rust/parser/src/parse/hecksagon.rs +231 -0
  793. data/rust/parser/src/parse/lifecycle.rs +162 -0
  794. data/rust/parser/src/parse/mod.rs +1262 -0
  795. data/rust/parser/src/parse/policy.rs +87 -0
  796. data/rust/parser/src/parse/process_manager.rs +305 -0
  797. data/rust/parser/src/parse/query.rs +100 -0
  798. data/rust/parser/src/parse/read_model.rs +214 -0
  799. data/rust/parser/src/parse/value_object.rs +250 -0
  800. data/rust/parser/src/ruby_value.rs +422 -0
  801. data/rust/project/bridging.rb +257 -0
  802. data/rust/project/commands.rb +877 -0
  803. data/rust/project/constraints.rb +86 -0
  804. data/rust/project/dependency_planning.rb +178 -0
  805. data/rust/project/domain_generator.rb +980 -0
  806. data/rust/project/exemplar.rb +148 -0
  807. data/rust/project/expr_emitter.rb +72 -0
  808. data/rust/project/fielded.rb +141 -0
  809. data/rust/project/json_codec.rb +641 -0
  810. data/rust/project/mutations.rb +721 -0
  811. data/rust/project/naming.rb +205 -0
  812. data/rust/project/ports.rb +65 -0
  813. data/rust/project/queries.rb +493 -0
  814. data/rust/project/reactions.rb +317 -0
  815. data/rust/project/read_models.rb +690 -0
  816. data/rust/project/reference_specs.rb +27 -0
  817. data/rust/project/registry.rb +396 -0
  818. data/rust/project/skip_reason.rb +29 -0
  819. data/rust/project/types.rb +225 -0
  820. data/rust/project/write_if_changed.rb +83 -0
  821. data/rust/project.rb +30 -0
  822. data/rust/project_rust_pipeline.rb +383 -0
  823. data/rust/src/exemplar/commands.rs +279 -0
  824. data/rust/src/exemplar/constraints.rs +18 -0
  825. data/rust/src/exemplar/fielded.rs +280 -0
  826. data/rust/src/exemplar/json.rs +277 -0
  827. data/rust/src/exemplar/mod.rs +17 -0
  828. data/rust/src/exemplar/mutations.rs +80 -0
  829. data/rust/src/exemplar/queries.rs +33 -0
  830. data/rust/src/exemplar/reactions.rs +88 -0
  831. data/rust/src/exemplar/read_models.rs +48 -0
  832. data/rust/src/exemplar/registry.rs +166 -0
  833. data/rust/src/exemplar/types.rs +44 -0
  834. data/rust/src/kernel/attribute_shapes/composite.rs +88 -0
  835. data/rust/src/kernel/attribute_shapes/list.rs +18 -0
  836. data/rust/src/kernel/attribute_shapes/mod.rs +44 -0
  837. data/rust/src/kernel/attribute_shapes/optional.rs +9 -0
  838. data/rust/src/kernel/attribute_shapes/scalar.rs +39 -0
  839. data/rust/src/kernel/cli.rs +585 -0
  840. data/rust/src/kernel/dispatch.rs +1090 -0
  841. data/rust/src/kernel/expr.rs +458 -0
  842. data/rust/src/kernel/expression_operators/arithmetic.rs +128 -0
  843. data/rust/src/kernel/expression_operators/comparison.rs +48 -0
  844. data/rust/src/kernel/expression_operators/enumeration.rs +232 -0
  845. data/rust/src/kernel/expression_operators/logical.rs +13 -0
  846. data/rust/src/kernel/expression_operators/membership.rs +18 -0
  847. data/rust/src/kernel/expression_operators/mod.rs +68 -0
  848. data/rust/src/kernel/expression_operators/pattern_match.rs +73 -0
  849. data/rust/src/kernel/expression_operators/positional.rs +126 -0
  850. data/rust/src/kernel/expression_operators/presence.rs +101 -0
  851. data/rust/src/kernel/expression_operators/sign_test.rs +16 -0
  852. data/rust/src/kernel/expression_operators/sized.rs +35 -0
  853. data/rust/src/kernel/expression_operators/text.rs +79 -0
  854. data/rust/src/kernel/expression_operators/to_string.rs +18 -0
  855. data/rust/src/kernel/json.rs +779 -0
  856. data/rust/src/kernel/mod.rs +133 -0
  857. data/rust/src/kernel/named_query.rs +219 -0
  858. data/rust/src/kernel/orchestrate.rs +1810 -0
  859. data/rust/src/kernel/pattern.rs +307 -0
  860. data/rust/src/kernel/query_comparators.rs +206 -0
  861. data/rust/src/kernel/query_ordering.rs +103 -0
  862. data/rust/src/kernel/read_model.rs +914 -0
  863. data/rust/src/kernel/reference_lookup.rs +149 -0
  864. data/rust/src/kernel/repository.rs +468 -0
  865. data/rust/src/kernel/routing.rs +612 -0
  866. data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +118 -0
  867. data/rust/src/kernel/vocab/entity_dispatch_order.rs +114 -0
  868. data/rust/src/kernel/vocab/field_hint.rs +70 -0
  869. data/rust/src/kernel/vocab/mod.rs +20 -0
  870. data/rust/src/kernel/vocab/query_comparator.rs +65 -0
  871. data/rust/src/kernel/vocab/refusal_template.rs +1592 -0
  872. data/rust/src/lib.rs +8 -0
  873. data/rust/src/main.rs +16 -0
  874. data/rust/web/.gitignore +1 -0
  875. data/rust/web/Cargo.lock +119 -0
  876. data/rust/web/Cargo.toml +18 -0
  877. data/rust/web/src/lib.rs +8 -0
  878. metadata +478 -12
  879. data/lib/hecks/facade/cli_door.rb +0 -178
  880. data/lib/hecks/facade/cli_runner.rb +0 -271
  881. data/lib/hecks/facade/handle.rb +0 -293
  882. data/lib/hecks/facade/json_door.rb +0 -247
  883. data/lib/hecks/facade/surface/aggregate_door.rb +0 -222
  884. data/lib/hecks/facade/surface/chapter.rb +0 -116
  885. data/lib/hecks/facade/surface.rb +0 -61
  886. data/lib/hecks/mcp_door_scope.rb +0 -176
@@ -2,126 +2,27 @@ require_relative "generic_dispatch"
2
2
  module Hecks
3
3
  module Bluebook
4
4
  module DSL
5
- # The Ruby-side `word_gate` (`rust/parser/src/parse/mod.rs`'s own,
6
- # read there first — this is the same job, one level up: Rust's own
7
- # gate refuses a mistyped/inadmissible word directly, at the
8
- # moment it reads a line of `.bluebook` source text, before any
9
- # per-construct parsing runs. Ruby never lexes source text — a
10
- # `.bluebook` file is Ruby, so `given("x")` is already a real
11
- # method call by the time any of this code runs, and Ruby's own
12
- # method dispatch already refuses an arity mismatch on an
13
- # existing method for free. What Ruby's own dispatch does not do
14
- # is consult the self-hosted grammar table at all — a mistyped
15
- # word (`giv3n("x")`) or a word used in the wrong context
16
- # (`identified_by` inside a `command` block) just raises Ruby's
17
- # own generic `NoMethodError`, naming nothing about what the
18
- # language actually admits. This module closes that gap.
5
+ # Checks undefined DSL words against the self-hosted grammar table, dispatching admitted ones
6
+ # through `GenericDispatch` and refusing the rest with the table's own message.
19
7
  #
20
- # ## What reaches this module
21
- #
22
- # `method_missing`/`respond_to_missing?` only — a word this
23
- # builder class already answers with an ordinary `def` (or a
24
- # method a shared mixin such as `AttributeCollector` defines) never
25
- # reaches this module at all; Ruby's own method lookup finds it
26
- # first, and not every word has had its hand-written method
27
- # removed. A word the grammar admits whose builder has no
28
- # hand-written method executes for real here, via `GenericDispatch`
29
- # (item #13's full metaprogrammed dispatch, whole-project
30
- # table-unification survey) — see that module's own header for
31
- # exactly which ones, and the full account of what was verified
32
- # before each was migrated. A mistyped or wrongly-contexted word
33
- # gets the same real, helpful, table-driven refusal Rust's own
34
- # `word_gate` already gives, instead of Ruby's own generic
35
- # `NoMethodError`.
36
- #
37
- # ## `GRAMMAR_CONTEXT`
38
- #
39
- # `self.class::GRAMMAR_CONTEXT` — each including class names which
40
- # row of the self-hosted `Context` closed set it corresponds to
41
- # (`AggregateBuilder::GRAMMAR_CONTEXT = "Aggregate"`, etc.) — the
42
- # same string `word_gate`'s own `context` parameter already is on
43
- # the Rust side, read off the identical table.
44
- #
45
- # ## Bootstrapping
46
- #
47
- # Bootstrapping gated, the same reason `RuleReference#lookup`
48
- # already is (`rule_reference.rb`'s own comment has the full
49
- # story) — the meta-domain's own bootstrap calls dozens of
50
- # keywords on itself before its own grammar table exists to
51
- # check them against. For most words, this module steps aside
52
- # entirely during bootstrap (`super`, Ruby's own ordinary
53
- # `NoMethodError`) — the exact behavior every builder already had
54
- # before this module existed, and (unlike `RuleReference`) there
55
- # is deliberately no fallback covering the whole ~200-row table —
56
- # that would defeat the entire point.
57
- #
58
- # One narrow exception (item #13's full metaprogrammed dispatch,
59
- # slice 3, whole-project table-unification survey):
60
- # `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK`, an explicit table
61
- # naming the same (context, word) -> method pairs the real
62
- # `calls:` column carries, projected ahead of time into the
63
- # committed `bootstrap_table.rb` — it matters only for words both
64
- # migrated to the `calls:` shape and bootstrap-reachable
65
- # (`attribute`, for one). This is the one place in this whole arc a
66
- # bootstrap fallback was worth building despite `RuleReference`'s
67
- # own precedent against it: it duplicates no logic, only a method
68
- # name — `attribute_impl`'s own real, hand-written body is called
69
- # either way, bootstrap or not, so there is nothing here that can
70
- # drift the way a full behavioral duplicate could.
71
- #
72
- # ## `word_gate_dispatch` and the type-position fallback
73
- #
74
- # Two further pieces, both slice 5:
75
- # - `word_gate_dispatch` is the same admission+dispatch logic
76
- # `method_missing` below runs, factored out so a class with
77
- # its own class-level `method_missing` (`HecksagonBuilder`'s/
78
- # `WorldBuilder`'s genuinely open-ended verb vocabulary) can
79
- # call it directly and fall back to its own open-verb handling
80
- # only when this returns `NOT_ADMITTED` — a class-level `def`
81
- # always wins over an included module's in Ruby's own method
82
- # resolution, so their own `method_missing` is the only one
83
- # that ever runs for them, and this is what lets a real,
84
- # closed-set word (`port`/`realm`/`latest`) still reach
85
- # `GenericDispatch` despite that.
86
- # - the "Type"-position fallback inside `word_gate_dispatch`
87
- # itself, for `one_of`/`list_of` — called inside an
88
- # attribute's own type argument, with `self` as whatever
89
- # builder is currently `instance_eval`ing, never a dedicated
90
- # "Type" builder `self.class::GRAMMAR_CONTEXT` could ever
91
- # name. See that method's own comment.
8
+ # Each including class names its grammar row in `GRAMMAR_CONTEXT`. While the meta-domain
9
+ # boots there is no table, so only `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK` applies.
92
10
  module WordGate
93
- # A caller with its own class-level `method_missing`
94
- # (`HecksagonBuilder`/`WorldBuilder` — see `word_gate_dispatch`'s
95
- # own header) checks for this to tell "not a word the grammar
96
- # admits at all" apart from every other outcome below (a real
97
- # dispatch, or a raised refusal) — never raised itself, so a
98
- # caller can fall through to its own open-ended handling instead.
11
+ # Returned by `word_gate_dispatch` for a word no grammar row admits, so a caller with
12
+ # its own `method_missing` can fall back to open-ended handling.
99
13
  NOT_ADMITTED = Object.new.freeze
100
14
 
101
- # Private, matching Ruby's own convention for both (`Object`
102
- # defines them private too) — and load-bearing here, not just
103
- # style: `spec/syntax_conformance_spec.rb`'s "declares every
104
- # word X answers" check walks `public_instance_methods`, and a
105
- # public `method_missing`/`respond_to_missing?` would show up
106
- # there as two more "answered words" no row of the grammar ever
107
- # declares, on every builder this module touches.
15
+ # Private like Object's own; public ones would appear as extra "answered words" in
16
+ # spec/syntax_conformance_spec.rb, which walks `public_instance_methods`.
108
17
 
109
18
  private
110
19
 
111
20
  def method_missing(word, *args, **kwargs, &block)
112
21
  if MetaValidator.bootstrapping?
113
22
  fallback = GenericDispatch::BOOTSTRAP_CALLS_FALLBACK
114
- # Own context first, "Type" second — the same order the
115
- # ordinary (non-bootstrapping) `word_gate_dispatch` path
116
- # below checks them in, for the same reason: `list_of`/
117
- # `one_of` used in an attribute's own type position never
118
- # arrive with `self.class::GRAMMAR_CONTEXT == "Type"`.
23
+ # Own context first, then "Type", as in `word_gate_dispatch`.
119
24
  own_key = [self.class::GRAMMAR_CONTEXT, word.to_s]
120
25
  type_key = ["Type", word.to_s]
121
- # key? first, never `||` — a target method name is never
122
- # actually stored as `false`, but the fallback lookup itself
123
- # must not silently prefer "Type" over this class's own
124
- # context on the strength of a falsy-looking value.
125
26
  found = fallback.key?(own_key) || fallback.key?(type_key)
126
27
  target = fallback.key?(own_key) ? fallback[own_key] : fallback[type_key]
127
28
  return send(target, *args, **kwargs, &block) if found
@@ -135,31 +36,8 @@ module Hecks
135
36
  result
136
37
  end
137
38
 
138
- # The core admission+dispatch logic, factored out of
139
- # `method_missing` — item #13's full metaprogrammed dispatch
140
- # (slice 5, whole-project table-unification survey) — so a
141
- # class with its own class-level `method_missing`
142
- # (`HecksagonBuilder`'s/`WorldBuilder`'s genuinely open-ended
143
- # verb vocabulary, `persisted_by "Heki"`/`posted_by "Carrier"`,
144
- # can never be a closed table) can still route a word the
145
- # grammar admits through here first, falling back to its own
146
- # open-verb handling only for what this doesn't recognize at
147
- # all — unblocking `Hecksagon#port`/`World#realm`/`World#latest`,
148
- # each a real, closed-set word that happened to sit on a class
149
- # whose own `method_missing` a class-level `def` always wins
150
- # over Ruby's own module-inclusion order.
151
- #
152
- # Never raises "not admitted" — returns `NOT_ADMITTED` instead,
153
- # so the caller (this module's own `method_missing`, or one of
154
- # the two above) decides what that means for it. Does still
155
- # raise the richer, table-driven refusals below once a word is
156
- # admitted-but-unimplemented, or admitted-somewhere-else-only —
157
- # those are real, useful refusals regardless of which
158
- # `method_missing` is asking.
159
- # One ordered admission-then-dispatch pipeline (own context, then
160
- # "Type" fallback, then admitted-elsewhere check, then dispatch) —
161
- # see this method's own header comment above for the full,
162
- # order-dependent account of why each check runs where it does.
39
+ # Admission then dispatch: own context, "Type" fallback, admitted-elsewhere check,
40
+ # `GenericDispatch`. Returns `NOT_ADMITTED` for an unknown word rather than raising.
163
41
  # rubocop:disable-next Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
164
42
  def word_gate_dispatch(word, args, kwargs, block)
165
43
  context = self.class::GRAMMAR_CONTEXT
@@ -167,19 +45,9 @@ module Hecks
167
45
  keywords = rows[:keywords]
168
46
  admitted = keywords.select { |row| row[:context] == context && (row[:word] == word.to_s || row[:was] == word.to_s) }
169
47
 
170
- # **The type-position fallback** — item #13's full metaprogrammed
171
- # dispatch (slice 5). `one_of`/`list_of`, called inside an
172
- # attribute's own type argument (`attribute :x,
173
- # one_of("a","b")`), run with `self` as whatever builder is
174
- # currently instance_eval'ing — there is no dedicated "Type"
175
- # builder of its own; every attribute()-taking builder answers
176
- # these identically, through the shared `AttributeCollector`
177
- # mixin. `self.class::GRAMMAR_CONTEXT` can never actually be
178
- # "Type", so a word admitted only there would otherwise look
179
- # inadmissible everywhere. Checked only once this context has
180
- # already come up empty, so a context with its own same-named
181
- # row (`ValueObject`'s own `one_of`, the block-wrapper form)
182
- # keeps using that instead, unaffected.
48
+ # `one_of`/`list_of` in an attribute's type position run on whichever builder is
49
+ # evaluating, whose context is never "Type". Try "Type" only when its own context has
50
+ # no row, so a same-named row of its own (ValueObject's `one_of`) still wins.
183
51
  if admitted.empty?
184
52
  type_admitted = keywords.select { |row| row[:context] == "Type" && row[:word] == word.to_s }
185
53
  unless type_admitted.empty?
@@ -196,13 +64,6 @@ module Hecks
196
64
  "'#{word}' is not a word #{context} admits — legal words here: #{legal.join(', ')}"
197
65
  end
198
66
 
199
- # Item #13's full metaprogrammed dispatch — the word is
200
- # admitted here, and this builder has no hand-written method
201
- # left for it; before falling through to the "not yet
202
- # implemented" refusal every word without one still gets,
203
- # offer it to GenericDispatch — the safe, verified subset of
204
- # words whose whole behavior is now executed off this same
205
- # table, not just checked against it.
206
67
  dispatched = GenericDispatch.try(self, context, word.to_s, args, kwargs, block, rows)
207
68
  return dispatched unless dispatched.equal?(GenericDispatch::NOT_HANDLED)
208
69
 
@@ -221,15 +82,8 @@ module Hecks
221
82
  super
222
83
  end
223
84
 
224
- # A word admitted somewhere, just not in this context, still
225
- # falls through to Ruby's own `NoMethodError` rather than this
226
- # module's own richer refusal — `method_missing` fires for
227
- # every typo in the whole codebase (this class's own genuinely
228
- # private helper methods included), not just DSL keyword calls;
229
- # only raise the rich, table-driven message when the word is at
230
- # least something the grammar knows about, anywhere, so an
231
- # unrelated Ruby-level typo inside a builder's own private code
232
- # keeps its own ordinary, unconfusing `NoMethodError`.
85
+ # `method_missing` fires for every typo in a builder, so only words the grammar knows
86
+ # anywhere get the rich refusal; other typos keep Ruby's ordinary `NoMethodError`.
233
87
  def admitted_anywhere?(rows, word)
234
88
  rows.any? { |row| row[:word] == word.to_s || row[:was] == word.to_s }
235
89
  end
@@ -2,22 +2,13 @@ require_relative "word_gate"
2
2
  module Hecks
3
3
  module Bluebook
4
4
  module DSL
5
- # A generic keyword-call sink for one bind's own settings block (e.g.
6
- # `persisted_by "Heki" do dir :default end`) — every method call made
7
- # on it inside the block is recorded verbatim by name, with no fixed
8
- # vocabulary of its own; `WorldBuilder#record_binding` reads `#to_h`
9
- # back out.
5
+ # Records every keyword call made inside a bind's settings block, by name, with
6
+ # no fixed vocabulary of its own.
10
7
  class SettingsCollector
11
- # Starts with no settings recorded.
12
8
  def initialize = @values = {}
13
9
 
14
- # A call with a block records the block's own settings as a nested Hash, so a bind can
15
- # group settings (`preview do ... end`); a call without one records its argument.
16
- #
17
- # @param key [Symbol] the setting's name, recorded verbatim
18
- # @param args [Array] the setting's value: one argument is kept as is, several as an array
19
- # @param block [Proc, nil] a nested settings block, evaluated on a fresh collector
20
- # @return [Object] the value recorded under `key`
10
+ # A call with a block records its own settings as a nested Hash; a bare call
11
+ # keeps a single argument as is, several as an array.
21
12
  def method_missing(key, *args, &block)
22
13
  @values[key.to_sym] =
23
14
  if block
@@ -34,30 +25,15 @@ module Hecks
34
25
  def to_h = @values
35
26
  end
36
27
 
37
- # The aggregate-qualified mirror (#143) — a `.world` file's own
38
- # `Pizzas::Order.charged_by("Stripe") do ... end` visually mirrors the
39
- # same bind line the sibling `.hecksagon` file already writes
40
- # (`HecksagonBuilder`'s own `BindingProxy`), but `IR::World#for_verb`/
41
- # `#for_binding` key purely by verb and adapter name — the aggregate
42
- # qualifier is never read back out, it exists only for that visual
43
- # mirroring. So unlike `BindingProxy`, nothing here needs to hold onto
44
- # the resolved constant chain at all: every verb call, qualified or
45
- # not, has to land in the exact same `@settings` write path
46
- # (`WorldBuilder#record_binding`).
28
+ # Stands in for a bare aggregate constant inside a `.world` block, so a bind line
29
+ # can visually mirror its sibling `.hecksagon` spelling; the qualifier is never read back out.
47
30
  class WorldConstProxy
48
- # Mints the stand-in module a bare domain constant resolves to inside a `.world` block.
49
- #
50
- # @param builder [Bluebook::DSL::WorldBuilder] the builder every verb called through the
51
- # module's proxies records its settings on
52
- # @return [Module] an anonymous module whose `const_missing` answers a `WorldConstProxy`,
53
- # whatever aggregate name follows `::`
54
31
  def self.namespace(builder)
55
32
  Module.new do
56
33
  define_singleton_method(:const_missing) { |_aggregate| WorldConstProxy.new(builder) }
57
34
  end
58
35
  end
59
36
 
60
- # @param builder [Bluebook::DSL::WorldBuilder] the builder verb calls are recorded on
61
37
  def initialize(builder) = @builder = builder
62
38
 
63
39
  def method_missing(verb, *args, **kwargs, &block) = @builder.record_binding(verb, args, kwargs, block)
@@ -65,76 +41,36 @@ module Hecks
65
41
  def respond_to_missing?(_name, _include_private = false) = true
66
42
  end
67
43
 
68
- # Parses a `.world` file's top-level DSL block into a `World` — a
69
- # domain's own `realm`/`latest` version markers plus its adapter bind
70
- # settings, one entry per `verb("Adapter") do ... end` call (whether
71
- # written bare or aggregate-qualified through `WorldConstProxy`'s
72
- # visual mirror of a sibling `.hecksagon` file's own bind).
44
+ # Parses a `.world` file's top-level DSL block into a `World` — a domain's own
45
+ # `realm`/`latest` markers plus its adapter bind settings.
73
46
  class WorldBuilder
74
47
  GRAMMAR_CONTEXT = "World".freeze
75
48
 
76
49
  include WordGate
77
50
 
78
- # @param domain [String] name of the domain whose world this is
79
51
  def initialize(domain)
80
52
  @domain = domain
81
53
  @settings = {}
82
54
  end
83
55
 
84
- # Names the realm this world belongs to, such as `"Examples"` or `"QA"`.
85
- #
86
- # `realm_impl`/`latest_impl` answer the `realm`/`latest` words
87
- # through the table's `calls:` column — item #13's full
88
- # metaprogrammed dispatch (slice 5). Neither bootstrap-reachable
89
- # (checked directly). Reached through `WordGate`'s
90
- # `word_gate_dispatch`, called explicitly below since
91
- # `WorldBuilder`'s own class-level `method_missing` (the
92
- # open-verb catch-all beneath this) always wins over the
93
- # module's — see `word_gate.rb`'s own header for the full
94
- # mechanism.
95
- #
96
- # @param value [String, Symbol] the realm's name; blankness is judged by the world
97
- # language at `build`, not here
98
- # @return [String] the realm as stored
56
+ # Reached through `WordGate`'s `word_gate_dispatch`, called explicitly since this
57
+ # class's own `method_missing` would otherwise always win over the module's.
99
58
  def realm_impl(value)
100
59
  @realm = required(value, "realm")
101
60
  end
102
61
 
103
- # Names the bluebook version this world treats as latest, which `ProjectRegister` compares
104
- # with the bluebook's own declared `version`.
105
- #
106
- # @param value [String, Symbol, Numeric] the version marker; blankness is judged by the
107
- # world language at `build`, not here
108
- # @return [String] the version as stored
62
+ # `ProjectRegister` compares this against the bluebook's own declared `version`.
109
63
  def latest_impl(value)
110
64
  @latest = required(value, "latest version")
111
65
  end
112
66
 
113
- # Names the connection every chapter's database-taking persistence adapter uses
114
- # unless that chapter's own world settings name one.
115
- #
116
- # Answers the `default_database` word through the table's `calls:` column, the
117
- # same way `realm_impl` does. A chapter's own
118
- # `persisted_by("Adapter") { database ... }` still wins for that adapter.
119
- #
120
- # @param value [String] the connection, such as a database URL; blankness is
121
- # judged by the world language at `build`, not here
122
- # @return [String] the connection as stored
67
+ # A chapter's own `persisted_by("Adapter") { database ... }` still wins for that adapter.
123
68
  def default_database_impl(value)
124
69
  @default_database = required(value, "default database")
125
70
  end
126
71
 
127
- # Names the persistence adapter every aggregate binds to unless its own chapter's
128
- # hecksagon binds it.
129
- #
130
- # Answers the `default_adapter` word through the table's `calls:` column, the same
131
- # way `realm_impl` does. Sits between an explicit bind and the framework's
132
- # in-memory fallback; whether the adapter really is a persistence adapter is
133
- # judged at boot, where adapters are known.
134
- #
135
- # @param value [String, Symbol] the adapter's declared name, such as `"PostgresEra"`;
136
- # blankness is judged by the world language at `build`, not here
137
- # @return [String] the adapter name as stored
72
+ # Sits between an explicit bind and the framework's in-memory fallback; whether the
73
+ # adapter really is a persistence adapter is judged at boot, where adapters are known.
138
74
  def default_adapter_impl(value)
139
75
  @default_adapter = required(value, "default adapter")
140
76
  end
@@ -148,20 +84,8 @@ module Hecks
148
84
 
149
85
  def respond_to_missing?(_name, _include_private = false) = true
150
86
 
151
- # Records one bind's settings under both its verb and its `verb:adapter` key.
152
- #
153
- # A method of its own, apart from `method_missing` (#143), so
154
- # `WorldConstProxy`'s own aggregate-qualified verb calls
155
- # (`Pizzas::Order.charged_by(...)`) write into the exact same
156
- # place the bare top-level spelling (`charged_by(...)`) already
157
- # does — one write path, two spellings.
158
- #
159
- # @param verb [Symbol, String] the bind verb, such as `:persisted_by`
160
- # @param args [Array<Object>] the call's positional arguments; the first names the adapter
161
- # @param kwargs [Hash{Symbol => Object}] settings given inline as keyword arguments
162
- # @param block [Proc, nil] a settings block, evaluated against a `SettingsCollector`
163
- # @return [Hash{Symbol => Object}] the settings just recorded: `:adapter` (a String),
164
- # then the keyword arguments, then the block's settings, later ones winning
87
+ # A method of its own, apart from `method_missing`, so `WorldConstProxy`'s
88
+ # aggregate-qualified verb calls write into the same place the bare spelling does.
165
89
  def record_binding(verb, args, kwargs, block)
166
90
  collector = SettingsCollector.new
167
91
  collector.instance_eval(&block) if block
@@ -170,11 +94,6 @@ module Hecks
170
94
  @settings["#{verb}:#{args.first.to_s.downcase}"] = value
171
95
  end
172
96
 
173
- # Assembles the realm, version marker and bind settings, judged by the world language.
174
- #
175
- # @return [Bluebook::World] the world, returned once the language accepts it
176
- # @raise [Bluebook::DSL::Malformed] if the world language refuses the declaration, such
177
- # as a blank `realm`
178
97
  def build
179
98
  MetaValidator.call_world(
180
99
  World.new(domain: @domain, realm: @realm, latest: @latest, settings: @settings,
@@ -182,30 +101,46 @@ module Hecks
182
101
  )
183
102
  end
184
103
 
185
- # Evaluates a `Hecks.world` block against a fresh builder and returns the world it declared.
186
- #
187
- # `ConstShim`'s resolver, the same bridge `HecksagonBuilder`/
188
- # `BluebookBuilder` already wrap their own `instance_eval` in
189
- # (#143) — without it, `Pizzas::Order.charged_by(...)` raises
190
- # `NameError: uninitialized constant Pizzas` for every `.world`
191
- # file using the aggregate-qualified mirror form, since a bare
192
- # `Pizzas` has no real constant to resolve to.
104
+ class << self
105
+ # The builder whose block is being evaluated, so an aggregate door a facade already
106
+ # installed (a repeat boot in one process) can record a qualified bind into it.
107
+ #
108
+ # @return [Bluebook::DSL::WorldBuilder, nil] nil outside a `.world` block
109
+ attr_reader :current
110
+ end
111
+
112
+ # Wraps `instance_eval` in `ConstShim`'s resolver: without it, an aggregate-qualified
113
+ # verb call raises `NameError`, since the bare constant has nothing to resolve to.
114
+ # A bare name resolves to a namespace whose `::` reaches the proxy; a qualified path
115
+ # (`Pizzas::Order`, handed over by an installed facade chapter's `const_missing`)
116
+ # is already the aggregate, so it resolves to the proxy itself.
193
117
  #
194
- # @param domain [String] name of the domain whose world this is
195
- # @yield the world body, evaluated with the builder as `self`; may be omitted
118
+ # @param domain [String] the domain the world belongs to
119
+ # @yield the world's DSL block
196
120
  # @return [Bluebook::World] the judged world
197
- # @raise [Bluebook::DSL::Malformed] if the world language refuses the declaration
198
121
  def self.build(domain, &block)
199
122
  builder = new(domain)
200
- resolver = ->(_domain) { WorldConstProxy.namespace(builder) }
201
- ConstShim.with(resolver) { builder.instance_eval(&block) } if block
123
+ resolver = lambda do |name|
124
+ name.to_s.include?("::") ? WorldConstProxy.new(builder) : WorldConstProxy.namespace(builder)
125
+ end
126
+ evaluate(builder, resolver, &block) if block
202
127
  builder.build
203
128
  end
204
129
 
130
+ # @api private
131
+ def self.evaluate(builder, resolver, &block)
132
+ previous = @current
133
+ @current = builder
134
+ ConstShim.with(resolver) { builder.instance_eval(&block) }
135
+ ensure
136
+ @current = previous
137
+ end
138
+ private_class_method :evaluate
139
+
205
140
  private
206
141
 
207
142
  def required(value, _label)
208
- # moved to the language: Realm / Latest invariants, in world.bluebook
143
+ # Validation lives in the world language (world.bluebook), not here.
209
144
  value.to_s
210
145
  end
211
146
  end
@@ -3,28 +3,11 @@ require_relative "expression/ast_json"
3
3
 
4
4
  module Hecks
5
5
  module Bluebook
6
- # An entity, as a Ruby class — a piece of an aggregate that has an identity
7
- # of its own.
8
- #
9
- # Crossing over closes the owner chain. An entity declares commands, and
10
- # until now those commands had no owner that could state an identity: an
11
- # entity was an IR object, not a construct, so `Construct#hecks_fqn` refused
12
- # rather than answering "Deposit" and looking right. Four of banking's
13
- # commands were in that state. They can say what they are now —
14
- # `Banking::Account.Ledger.Deposit` — which is the id the judge already mints
15
- # for them.
16
- #
17
- # Not const_set, for the same reason a command is not: a name inside one
18
- # aggregate can denote more than one kind of thing, so the constant tree
19
- # cannot index it.
20
- #
21
- # It must stay structurally interchangeable with an aggregate — the runtime
22
- # builds `Instance.new(aggregate: entity)` and `CommandRules` takes either as
23
- # `declaring` — so it answers `hecks_name`, `attributes`, `attribute`,
24
- # `identified_by` and `lifecycle` exactly as an aggregate does. And it must
25
- # keep not answering `value_object`: `Value.for_attribute` sniffs for that
26
- # method to tell a piece from a head.
6
+ # An entity as a Ruby class: a piece of an aggregate that has an identity of its own.
7
+ # Not const_set, because a name inside one aggregate can denote more than one kind of thing.
27
8
  class Entity
9
+ # Stays interchangeable with an aggregate (`Instance.new(aggregate: entity)`, `CommandRules`
10
+ # `declaring`) but must not answer `value_object`, which `Value.for_attribute` sniffs for.
28
11
  extend Construct
29
12
  extend Hecks::IR
30
13
  extend Behaviour::Entity
@@ -36,32 +19,12 @@ module Hecks
36
19
  attributes: many(:attributes),
37
20
  commands: many(:commands),
38
21
  queries: many(:queries),
39
- # S17, ADR 0026 — "That is what `entity` is for, and `entity` is
40
- # declared by the language and used zero times in it" (the ADR's
41
- # own words). Dispatch nests inside Handler, so an entity's own
42
- # nested entities are part of its wire shape now, the same way
43
- # an aggregate's always were — the field the ADR names as
44
- # declared-but-unused until this slice.
45
22
  entities: many(:entities),
46
- # ADR 0028 — a piece's own `given`, the same shape
47
- # `Aggregate#preconditions` already carries (its own `emits_ir`
48
- # row, identical). A precondition shared across this piece's own
49
- # commands, declared once — a command references it back by
50
- # name; the resolved text still lands on each referencing
51
- # command's own `givens` either way, so this field is read-only
52
- # documentation of what the piece itself declared, the same
53
- # relationship `Aggregate.preconditions` already has to its own
54
- # commands.
23
+ # Read-only record of the piece's own `given`; resolved text lands on each command's
24
+ # `givens`.
55
25
  preconditions: -> { preconditions.map { |rule| Expression::AstJson.rule_row(rule) } },
56
- # A piece's own shape rule, checked against every instance of
57
- # this piece the aggregate holds (Admissibility#enforce_
58
- # invariants' own recursive walk) — the same relationship
59
- # `ValueObject#invariants` already has to its own instances,
60
- # one level up the construct tree. Not a separate enforcement
61
- # boundary; still checked at the same two points (after every
62
- # mutation, before save) the aggregate's own invariants always
63
- # were — see that method's own comment for why this does not
64
- # contradict "there is no separate entity invariant."
26
+ # Checked against every instance of this piece, at the same points as an aggregate's
27
+ # invariants.
65
28
  invariants: -> { invariants.map { |rule| Expression::AstJson.rule_row(rule) } },
66
29
  lifecycle: one(:lifecycle)
67
30
  )
@@ -73,20 +36,11 @@ module Hecks
73
36
  # Mints a new piece class for one declared entity and absorbs its fields into it.
74
37
  #
75
38
  # @param name [String, Symbol] the entity's declared name
76
- # @param description [String, nil] the entity's declared prose description
77
39
  # @param identified_by [String, Symbol, Array<String, Symbol>, nil] the identity
78
40
  # path(s) this entity is addressed by
79
- # @param attributes [Array<Bluebook::Attribute>] the entity's declared fields
80
- # @param commands [Array<Class>] the command classes (`Bluebook::Command` subclasses)
81
- # declared on this entity
82
- # @param queries [Array<Bluebook::Query>] the queries declared on this entity
83
- # @param entities [Array<Class>] the entity classes (`Bluebook::Entity` subclasses)
84
- # nested directly under this entity
85
- # @param preconditions [Array<Bluebook::Given>] this entity's own named `given`s
86
- # @param invariants [Array<Bluebook::Invariant>] the rules checked against every
87
- # instance of this entity
88
- # @param lifecycle [Bluebook::Lifecycle, nil] the entity's declared state machine,
89
- # or `nil` if it declares none
41
+ # @param commands [Array<Class>] the command classes declared on this entity
42
+ # @param entities [Array<Class>] the entity classes nested directly under this entity
43
+ # @param lifecycle [Bluebook::Lifecycle, nil] the declared state machine, or `nil`
90
44
  # @return [Class] the minted piece class (a `Bluebook::Entity` subclass)
91
45
  def declare(name:, description: nil, identified_by: nil, attributes: [],
92
46
  commands: [], queries: [], entities: [], preconditions: [], invariants: [], lifecycle: nil)
@@ -100,20 +54,8 @@ module Hecks
100
54
  piece
101
55
  end
102
56
 
103
- # Assigns what the language declares, then hands off to the
104
- # behaviour's own `settle` — derived identity and the name
105
- # indexes, neither of which the declaration states.
106
- #
107
- # @param description [String, nil] see `declare`
108
- # @param identified_by [String, Symbol, Array<String, Symbol>, nil] see `declare`
109
- # @param attributes [Array<Bluebook::Attribute>] see `declare`
110
- # @param commands [Array<Class>] see `declare`
111
- # @param queries [Array<Bluebook::Query>] see `declare`
112
- # @param entities [Array<Class>] see `declare`
113
- # @param preconditions [Array<Bluebook::Given>] see `declare`
114
- # @param invariants [Array<Bluebook::Invariant>] see `declare`
115
- # @param lifecycle [Bluebook::Lifecycle, nil] see `declare`
116
- # @return [Class] this piece's own class, self, once identity and indexes are derived
57
+ # Assigns the declared fields, then lets the behaviour's `settle` derive identity and
58
+ # indexes.
117
59
  def absorb(description:, identified_by:, attributes:, commands:, queries:, entities:, preconditions:, invariants:,
118
60
  lifecycle:)
119
61
  @description = description