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
@@ -1,142 +1,47 @@
1
1
  require "digest"
2
2
  require "json"
3
+ require_relative "meta_validator/verdict_cache"
3
4
 
4
5
  module Hecks
5
6
  module Bluebook
6
7
  # Judges a bluebook by dispatching it into the language declared in itself.
7
- #
8
- # `lib/hecks/language/bluebook/` declares what a bluebook is —
9
- # Chapter, Root, Verb, Shape, Ask, Piece, and the rest, split across files
10
- # by domain concept and merged into one chapter at load time (see
11
- # GRAMMAR_FILES below). This replays a built IR into that domain and turns
12
- # any refusal into a Malformed, so the meta-domain is what actually judges
13
- # rather than a description sitting beside the code — for whatever rules
14
- # it carries. `spec/meta_rules_spec.rb`'s own header names the plan: port
15
- # the language's rules out of builder `raise Malformed` calls and into
16
- # `given`/`invariant` here, where they are declarations any reader of the
17
- # meta-domain can consume instead of behavior buried in a builder.
18
- #
19
- # ## This migration is partial, not done
20
- #
21
- # As of this writing the meta-domain declares 62 given/invariant/ensures
22
- # rules (`Hecks::QueryIR.collect_rules` against
23
- # `grammar_registry.bluebook("Bluebook")` enumerates them) —
24
- # `spec/meta_rule_reachability_spec.rb` is what proves, per declaration,
25
- # not per verb, that most of them still lack a spec exercising the
26
- # refusal at all (see that file's own KNOWN_GAPS for the current count).
27
- # Meanwhile `lib/hecks/bluebook/dsl/` still carries well over a hundred
28
- # `raise Malformed` calls of its own — some are genuinely pre-IR
29
- # construction errors (arity, argument shape) that cannot become
30
- # meta-domain rules, and some are exactly the semantic kind this file
31
- # claims to have moved (see `aggregate_builder.rb`'s `seal_*` passes:
32
- # a mutation into a field the aggregate never declares, a lifecycle guard
33
- # on an aggregate with no lifecycle). No doc currently inventories which
34
- # is which, or tracks migrating the latter — that inventory is the actual
35
- # next step, not a "delete the folder" thought experiment.
36
- #
37
- # So: "delete language/bluebook/ and validation stops" is true for the 62
38
- # rules actually declared here, and false for whatever a builder's own
39
- # `raise Malformed` still checks — the language does not yet own its own
40
- # enforcement end to end. The self-hosting mechanism itself is real and
41
- # is the point worth keeping : a self-description that only describes is
42
- # indistinguishable from enforcement, and the first version of this file
43
- # was deleted for exactly that reason. What is not yet real is that
44
- # self-hosting being the whole of validation.
45
- #
46
- # ## Isolation
47
- #
48
- # The meta-domain is loaded once and its registry reused ; each bluebook is
49
- # judged in a fresh in-memory store so no domain can see another's records.
8
+ # Refusals become `DSL::Malformed`; the meta-domain does the judging, not a builder.
50
9
  module MetaValidator
51
- # **The folder is the chapter**. Files are grouped by the domain concept they
52
- # describe and every one reopens the same `Hecks.bluebook "Bluebook"`.
53
- # `BluebookBuilder.build` keeps one builder open per chapter name across
54
- # calls, so the sorted folder accumulates one domain. Adding or renaming a
55
- # concept file requires no second catalog here; deterministic filename
56
- # order is the source order exported to IR.
10
+ # Deterministic file order becomes the source order exported to IR.
57
11
  GRAMMAR_DIR = File.expand_path("../language/bluebook", __dir__).freeze
58
12
  GRAMMAR_FILES = Dir.glob(File.join(GRAMMAR_DIR, "*.bluebook")).freeze
59
- # Sibling artifact languages use the same folder-is-the-chapter rule.
60
- # Their arrays are discovered, sorted source sets—not filename catalogs.
61
13
  WORLD_GRAMMAR = Dir.glob(File.expand_path("../language/world/*.bluebook", __dir__)).freeze
62
14
  HECKSAGON_GRAMMAR = Dir.glob(File.expand_path("../language/hecksagon/*.bluebook", __dir__)).freeze
63
- # so is a port — whole-project table-unification survey, item #13's
64
- # remaining builders. Backs the new PortJudge door the same way
65
- # WORLD_GRAMMAR backs WorldJudge.
15
+ # Backs PortJudge, the same door shape as WorldJudge.
66
16
  PORT_GRAMMAR = File.expand_path("../language/port.bluebook", __dir__).freeze
67
- # so is an adapter — same reasoning, one file over. Backs AdapterJudge.
17
+ # Backs AdapterJudge, one file over.
68
18
  ADAPTER_GRAMMAR = File.expand_path("../language/adapter.bluebook", __dir__).freeze
69
- # so is a translation — same reasoning, one file over. Backs
70
- # TranslationJudge.
19
+ # Backs TranslationJudge, one file over.
71
20
  TRANSLATION_GRAMMAR = Dir.glob(File.expand_path("../language/translation/*.bluebook", __dir__)).freeze
72
21
 
73
- # ADR 0026's own seam: the core does not name its extension points.
74
- #
75
- # A sub-language chapter (Paging, so far the only one) is an ordinary
76
- # bluebook — declared with the same `aggregate`/`value_object`/
77
- # `attaches_to` words every domain has, judged through the language
78
- # the normal way, not bootstrapped raw the way GRAMMAR_FILES is. What
79
- # makes it special is only where it lives: any file in this directory
80
- # is discovered and loaded here, by the directory's own existence,
81
- # never by a name this file would have to know. Add a chapter here
82
- # and it is attached ; nothing in this file changes.
22
+ # (ADR 0026) Any bluebook file placed here is auto-discovered and
23
+ # loaded as an extension chapter; nothing else in this file changes.
83
24
  ATTACHED_GRAMMAR_DIR = File.expand_path("../language/bluebook/attaches", __dir__).freeze
84
25
 
85
- # The chapters that are the language — loaded raw during bootstrap, then
86
- # judged through themselves and replaced by their own assembled graphs
87
- # (see grammar_registry). Each is named after its file : Bluebook describes
88
- # bluebooks (language/bluebook/) ; World describes worlds (world.bluebook),
89
- # and backs the WorldJudge door ; Hecksagon describes hecksagons
90
- # (hecksagon.bluebook) — declared for the same self-description reasons as
91
- # World, but without a judge door of its own : nothing dispatches a real
92
- # .hecksagon file through it yet, so HecksagonBuilder's own behavior is
93
- # unchanged. What this buys is what syntax.bluebook needed — a real shape
94
- # `subscribe`'s `fills: "subscriptions"` can point at — not new validation
95
- # on top of the corpus's existing .hecksagon files.
26
+ # The chapters loaded raw at bootstrap, then judged through themselves
27
+ # and replaced by their own self-assembled graphs.
96
28
  LANGUAGE_CHAPTERS = %w[Bluebook World Hecksagon].freeze
97
29
 
98
- # The meta-domain is itself a bluebook. Judging it while loading it would
99
- # recurse, so the load path marks the bootstrap and skips — but the skip
100
- # is only the first pass. Once every grammar file is loaded and merged,
101
- # grammar_registry judges the language through itself and keeps the
102
- # assembled result (the fixpoint, made load-bearing).
30
+ # Whether the language's own grammar is still loading raw, unjudged.
31
+ # Judging it while it loads would recurse, so the bootstrap sets this
32
+ # and the fixpoint clears it once every grammar file is merged.
103
33
  #
104
- # @return [Boolean] whether the language's own grammar is still
105
- # loading raw, unjudged
34
+ # @return [Boolean]
106
35
  def self.bootstrapping? = @bootstrapping
107
36
 
108
- # A chapter may be split across files, so it cannot be judged until
109
- # every file has been read.
110
- #
111
- # `BluebookBuilder.build` already merges — `registry.bluebook_builder
112
- # (name)` memoises one builder per chapter name, so nine files each
113
- # saying `Hecks.bluebook "Bluebook"` accumulate into one. What it
114
- # also does is call `MetaValidator.call` once per file, judging a
115
- # chapter that is still eight files short: `Aggregate`'s reference
116
- # to `Bluebook` dangles because `Bluebook` has not been declared
117
- # yet, and the load dies.
118
- #
119
- # The language's own grammar has always needed this and got it
120
- # privately, through `@bootstrapping` (see load_grammar_into) —
121
- # which is exactly why the language could not boot the way the
122
- # domains it describes boot. This is that same two-phase load,
123
- # available to anything: `Folder#load_domain` reads every
124
- # `*.bluebook` inside `defer`, then judges each composed chapter
125
- # once, before hecksagons and worlds load (DOMAIN_ORDER already
126
- # puts every chapter ahead of those).
37
+ # Whether `call` is queuing chapters instead of judging them, while a
38
+ # chapter's own files are still being merged (see `defer`).
127
39
  #
128
- # Only chapters declared inside the window are judged afterwards.
129
- # Re-judging one already assembled — a framework member pulled in
130
- # earlier by `uses_framework`, say — would re-run Assembly and hand
131
- # out a second set of classes for a graph something already holds.
132
- #
133
- # @return [Boolean] whether `call` is currently queuing chapters
134
- # instead of judging them
40
+ # @return [Boolean]
135
41
  def self.deferring? = @deferring
136
42
 
137
- # Opens the two-phase-load window: every chapter `call` sees while
138
- # the block runs is queued (see `deferred_chapters`) rather than
139
- # judged immediately.
43
+ # Queues every chapter `call` sees while the block runs, instead of
44
+ # judging them immediately (see `deferred_chapters`).
140
45
  #
141
46
  # @yield the caller's own load of every file in one chapter window
142
47
  # @return [Object] the block's own return value
@@ -173,75 +78,32 @@ module Hecks
173
78
  chapter = registry.bluebook(name)
174
79
  next unless chapter
175
80
 
176
- # A bare chapter-given left pending by any file of this
177
- # chapter (`AggregateBuilder#pending_chapter_given`) resolves
178
- # first — before anything below reads a `Given`'s fields.
179
- # `registry.bluebook_builder(name)` is the same instance every
180
- # one of this chapter's own files built onto (`#self.build`'s
181
- # own comment); it is guaranteed already open here, since it
182
- # is what produced `chapter` in the first place — the block is
183
- # dead code, never actually invoked.
81
+ # Bare chapter-level givens must resolve before anything below
82
+ # reads a `Given`'s fields. The `raise` block never runs — this
83
+ # chapter's builder is always already open by the time `chapter` exists.
184
84
  builder = registry.bluebook_builder(name) { raise "internal: no open builder for #{name}" }
185
85
  builder.resolve_pending_chapter_givens!
186
- # The entity-scoped analogue, one level down — same reason,
187
- # same timing: a bare entity-level given left pending by any
188
- # file of this chapter (`EntityBuilder#pending_chapter_entity_
189
- # given`) must resolve before anything below reads a piece's
190
- # own `Given` fields too.
86
+ # Same, one level down: entity-scoped pending givens.
191
87
  builder.resolve_pending_chapter_entity_givens!
192
88
 
193
- # `BluebookBuilder#build` skipped its own whole-chapter battery
194
- # (hops, projected fields, correlation keys, event shapes,
195
- # `with:` projections) for every file of this chapter while
196
- # `deferring?` was true, the same reason `call` below queued
197
- # instead of judging — each of those checks needs every file
198
- # loaded first (see `BluebookBuilder.validate_assembled!`'s own
199
- # comment). `chapter` here is exactly that: whatever the last
200
- # file's own `add_bluebook` left in the registry, which by now
201
- # holds every aggregate/policy/process_manager the whole
202
- # chapter declares. Run once, here, instead of once per file.
89
+ # Whole-chapter checks (hops, projected fields, event shapes) were
90
+ # skipped per file while deferring; `chapter` now holds every
91
+ # file's declarations, so they run once here instead of per file.
203
92
  DSL::BluebookBuilder.validate_assembled!(chapter)
204
93
  registry.add_bluebook(call(chapter))
205
94
  end
206
95
  end
207
96
 
208
- # `&& !@forcing_fixpoint` — see `while_forcing_fixpoint` below, whose own
209
- # window must win even while a growth spec's `while_disabled` is open,
210
- # for the reason recorded there. Uses the same stack-restore shape
211
- # `while_shadow_parsing`/`while_forcing_fixpoint` use, deliberately not
212
- # a bare env toggle (`ENV["HECKS_META_VALIDATION"] == "off"`, read
213
- # directly, with no `previous`/`ensure` of its own): the gap between
214
- # "bare toggle" and "stack-restore" is not cosmetic — a test's
215
- # temporary window could reach code it was never meant to touch. If
216
- # `grammar_registry`'s one-time lazy build (below) happens to land
217
- # inside that window, every language chapter gets cached in its raw,
218
- # never-judged form for the rest of the process — `unmark_scalar`'s
219
- # String->Integer/Boolean fix (assembly/marks.rb) never runs, so a
220
- # `Command`'s own `required: true` stays `required: "true"` forever
221
- # after, permanently memoized. Found live: an intermittent,
222
- # parallel_rspec-only ir_golden_spec.rb failure, order-dependent on
223
- # whether identifier_numeric_coercion_growth_spec.rb's
224
- # disabled-validation window raced the one lazy build in its own worker
225
- # process — reproduced in isolation by disabling validation before the
226
- # first `grammar_registry` call. `&& !@forcing_fixpoint` was the first
227
- # fix and is kept ; `@disabled` itself uses this same stack-restore
228
- # shape to close the gap for every other caller of `while_disabled`,
229
- # not just the one race that was actually observed — nothing outside
230
- # this file reads `ENV["HECKS_META_VALIDATION"]` (every growth spec
231
- # calls `while_disabled` instead), so there is no bare global left to
232
- # race.
97
+ # Whether meta-domain judging is off (ignored while a fixpoint build
98
+ # is forced).
99
+ # Stack-restored, not a bare flag, so a disabled window can never
100
+ # leak past its own scope.
233
101
  #
234
- # @return [Boolean] whether meta-domain judging is currently switched
235
- # off (and not overridden by a fixpoint build in progress)
102
+ # @return [Boolean]
236
103
  def self.disabled? = @disabled && !@forcing_fixpoint
237
104
 
238
- # The same stack-restore shape `while_shadow_parsing`/`while_forcing_
239
- # fixpoint` use. This toggle's real, intended use is a growth spec
240
- # that boots a scratch bluebook from a tempfile and wants the runtime
241
- # behaviour without the validation overhead ; that is always a single
242
- # bounded window around one boot, never a flag meant to survive past
243
- # it, so the flag itself is scoped in the same `previous`/`ensure`
244
- # shape rather than a plain assignment a caller could forget to undo.
105
+ # Runs `block` with `disabled?` true, restoring it afterward — for a
106
+ # growth spec that boots a scratch bluebook without validation overhead.
245
107
  #
246
108
  # @yield the caller's own boot, with `disabled?` true throughout
247
109
  # @return [Object] the block's own return value
@@ -253,24 +115,11 @@ module Hecks
253
115
  @disabled = previous
254
116
  end
255
117
 
256
- # ADR 0025's own prerequisite (docs/dsl-work-slices.md, S0a): a word
257
- # a later slice removes from the live grammar must still parse
258
- # frozen era text — `EraGuard.shadow_parse` (runtime/era_guard.rb)
259
- # is a plain `Kernel.eval` of stored source, run at boot, at mint,
260
- # and during tamper detection, against whatever grammar is live
261
- # today, not whatever grammar was live when that text was written.
262
- # Judging it again here would refuse history the day a spelling it
263
- # used is removed — proved with a rule that already lives only in
264
- # the meta-domain, never duplicated as a builder's own `raise
265
- # Malformed` (`vision`'s own comment: "moved to the language").
266
- #
267
- # Mirrors `defer`'s own stack-restore shape — this must never leak
268
- # past the one shadow-parse call that set it, the same reason
269
- # `ConstShim.with`/`.active?` (bluebook/dsl/const_shim.rb) restores in
270
- # an `ensure` rather than being flipped and left.
118
+ # (ADR 0025) Whether frozen era text is currently being shadow-parsed
119
+ # by `EraGuard`. Judging it again here would refuse history whenever a
120
+ # spelling it used gets removed from the live grammar.
271
121
  #
272
- # @return [Boolean] whether frozen era text is currently being
273
- # shadow-parsed
122
+ # @return [Boolean]
274
123
  def self.shadow_parsing? = @shadow_parsing
275
124
 
276
125
  # Wraps `block` with `shadow_parsing?` true, restoring it afterward.
@@ -285,13 +134,8 @@ module Hecks
285
134
  @shadow_parsing = previous
286
135
  end
287
136
 
288
- # The same stack-restore shape `while_shadow_parsing` uses, for the
289
- # same reason: whatever this wraps must never see `disabled?` answer
290
- # true, however a test elsewhere has a `while_disabled` window open at
291
- # that exact moment. Only `grammar_registry`'s own one-time build
292
- # (below) wraps itself in this — nothing else needs it, and nothing
293
- # else should reach for it just to dodge `disabled?` for a domain
294
- # bluebook, which is precisely the toggle's real, intended use.
137
+ # Wraps `block` with `disabled?` forced false, restoring it afterward.
138
+ # Only `grammar_registry`'s one-time fixpoint build uses this.
295
139
  #
296
140
  # @yield the one-time fixpoint build, with `disabled?` forced false
297
141
  # throughout
@@ -304,18 +148,18 @@ module Hecks
304
148
  @forcing_fixpoint = previous
305
149
  end
306
150
 
307
- # The same bluebook judged twice gets the same verdict, and a suite reloads
308
- # its fixtures constantly — banking alone is ~200 dispatches per build.
309
- # Keyed on the IR itself, so a changed bluebook is always re-judged.
151
+ # Process-wide judging cache, keyed on a SHA-256 digest of the judged
152
+ # artifact so a changed bluebook is always re-judged.
310
153
  #
311
- # @return [Hash{String => Array<String>}] the process-wide judging
312
- # cache, keyed by a SHA-256 digest of the judged artifact; each
313
- # value is that artifact's own list of refusal messages (`[]` when
314
- # well formed)
315
- def self.verdicts = @verdicts ||= {}
316
-
317
- # A world is not a bluebook, so it gets its own door. Same judge, same
318
- # meta-domain registry — a different artifact and a different language file.
154
+ # Seeded once per process with the chapter verdicts earlier processes
155
+ # stored (see `VerdictCache`); every other verdict starts empty.
156
+ #
157
+ # @return [Hash{String => Object}] refusal messages per digest for a
158
+ # world/port/adapter/translation (`[]` when well formed); the held
159
+ # verdict Hash for a chapter
160
+ def self.verdicts = @verdicts ||= VerdictCache.seed
161
+
162
+ # Judges `world` through the meta-domain's own `WorldJudge` door.
319
163
  #
320
164
  # @param world [Bluebook::World] the world to judge
321
165
  # @return [Bluebook::World] `world` unchanged, if well formed or
@@ -332,9 +176,7 @@ module Hecks
332
176
  "#{world.domain}'s world is not well formed; #{refusals.join('; ')}"
333
177
  end
334
178
 
335
- # A port is not a bluebook either — same door shape as call_world,
336
- # one artifact over. Whole-project table-unification survey, item
337
- # #13's remaining builders.
179
+ # Judges `port` through the meta-domain's own `PortJudge` door.
338
180
  #
339
181
  # @param port [Bluebook::Port] the port to judge
340
182
  # @return [Bluebook::Port] `port` unchanged, if well formed or while
@@ -351,9 +193,7 @@ module Hecks
351
193
  "#{port.name}'s port is not well formed; #{refusals.join('; ')}"
352
194
  end
353
195
 
354
- # An adapter is not a bluebook either — same door shape, one more
355
- # artifact over. Whole-project table-unification survey, item
356
- # #13's remaining builders.
196
+ # Judges `adapter` through the meta-domain's own `AdapterJudge` door.
357
197
  #
358
198
  # @param adapter [Bluebook::Adapter] the adapter to judge
359
199
  # @return [Bluebook::Adapter] `adapter` unchanged, if well formed or
@@ -370,17 +210,8 @@ module Hecks
370
210
  "#{adapter.name}'s adapter is not well formed; #{refusals.join('; ')}"
371
211
  end
372
212
 
373
- # A translation is not a bluebook either — same door shape, one more
374
- # artifact over (a `translations/*.bluebook` edge — `data_translation`'s
375
- # own real, established convention; there is no separate extension).
376
- # TranslationJudge walks the whole built translation (every nested
377
- # aggregate's own rule table) in one pass — only
378
- # TranslationBuilder's own top-level `build` calls this;
379
- # TranslationAggregateBuilder#build stays a plain struct constructor,
380
- # the same way `WorldJudge` judges every `Wiring` a `.world` declares
381
- # in one pass over `World::World.Declare`'s own caller, not from a
382
- # separate door per binding. Whole-project table-unification survey,
383
- # item #13's remaining builders.
213
+ # Judges `translation` through the meta-domain's own `TranslationJudge`
214
+ # door, walking every nested aggregate's own rule table in one pass.
384
215
  #
385
216
  # @param translation [Bluebook::Translation] the translation to judge
386
217
  # @return [Bluebook::Translation] `translation` unchanged, if well
@@ -390,15 +221,9 @@ module Hecks
390
221
  def self.call_translation(translation)
391
222
  return translation if disabled? || bootstrapping? || shadow_parsing?
392
223
 
393
- # `Translation`/`TranslationAggregate` are plain classes (attr_
394
- # reader, not Struct — lib/hecks/bluebook/translation.rb),
395
- # so neither carries a `.to_h`; `.inspect` is JSON-safe (a plain
396
- # string) and, unlike a Struct's own memoization-friendly `.to_h`,
397
- # doesn't need one — the small correctness cost is that its
398
- # embedded object-id prefix makes two structurally-identical
399
- # translations hash differently, so `verdicts` simply never
400
- # cache-hits here (an efficiency loss, not a correctness one —
401
- # judged fresh every time instead of memoized).
224
+ # `Translation` has no `.to_h`; `.inspect` embeds an object-id, so
225
+ # structurally-identical translations never cache-hit here (a lost
226
+ # optimization, not a correctness issue).
402
227
  key = Digest::SHA256.hexdigest(translation.inspect)
403
228
  refusals = verdicts[key] ||= TranslationJudge.new(translation).refusals
404
229
  return translation if refusals.empty?
@@ -407,45 +232,9 @@ module Hecks
407
232
  "#{translation.domain}'s translation is not well formed; #{refusals.join('; ')}"
408
233
  end
409
234
 
410
- # The language hands the graph back.
411
- #
412
- # A bluebook judged elsewhere only checks: dispatch every declaration
413
- # in, collect refusals, throw the records away — which is all a
414
- # boundary check needs. This is the one call that returns what the
415
- # meta-domain holds instead, assembled into the graph the runtime
416
- # runs, so the builder's own object graph exists only to be
417
- # dispatched — nothing keeps it. `Hecks.bluebook` registers whatever
418
- # comes back from here, so this one line is the difference between a
419
- # language that checks a domain and a language that is the source of
420
- # one: the runtime runs what the meta-domain holds, not the builder's
421
- # own graph.
422
- #
423
- # What is cached is the declarations, not the graph. A hash carries no
424
- # Ruby classes, so a second load of the same chapter re-assembles
425
- # fresh ones — the behaviour `Namespace.install` and
426
- # `spec/construct_spec` both expect. Caching the graph would hand two
427
- # boots the same classes.
428
- #
429
- # One belief stayed unlanded for a while, worth naming because it
430
- # looked so much like a wall: that the language may only hold what
431
- # `to_h` carries. `ReadModel#to_h` omitted a read model's filters
432
- # until 2026-08-11, so read-model filtering seemed impossible to read
433
- # back — and hoisted policies lost which head declared them for the
434
- # same reason. But `to_h` is a projection and the language is the
435
- # source. They must agree about everything `to_h` spells ; they need
436
- # not be the same size. Both were held even before the wire format
437
- # carried them, as declarations the wire format didn't yet see.
438
- #
439
- # The wire format did later move, for a reason unrelated to this
440
- # file — a Rust-codegen task needed `wheres`/`order_by`/`limit` on
441
- # the wire to compile a read model's real declared filtering, and the
442
- # boundary described above was never load-bearing for this mechanism
443
- # (`option_rows`/`filter_options` in meta_validator/readings.rb read
444
- # `node.wheres`/`node.order_by`/`node.limit` off the live object
445
- # directly, never off `to_h`), so extending `to_h` changed nothing
446
- # here. `ReadModel#to_h` now spells all three explicitly, the same
447
- # mechanism `Query#to_h` already used — purely additive, still
448
- # agreeing with the language about everything it spells.
235
+ # Dispatches `bluebook` into the language and returns the graph the
236
+ # meta-domain assembles from its own judged declarations, not the
237
+ # builder's original object graph.
449
238
  #
450
239
  # @param bluebook [Object] a built bluebook chapter graph (an
451
240
  # `Aggregate`/`Entity`/`ValueObject`/... instance from
@@ -464,7 +253,7 @@ module Hecks
464
253
  end
465
254
 
466
255
  key = Digest::SHA256.hexdigest(JSON.generate(bluebook.to_h))
467
- held = verdicts[key] ||= hold(bluebook)
256
+ held = verdicts[key] || (verdicts[key] = hold(bluebook).tap { |fresh| VerdictCache.record(key, fresh) })
468
257
 
469
258
  unless held[:refusals].empty?
470
259
  raise DSL::Malformed,
@@ -474,9 +263,9 @@ module Hecks
474
263
  Assembly.call(held[:declaration])
475
264
  end
476
265
 
477
- # Dispatch it in and read it back. A refused chapter has no declarations to
478
- # read — the records are half-written by definition — so it carries refusals
479
- # and nothing else.
266
+ # Dispatches `bluebook` into the meta-domain and reads the result back.
267
+ # A refused chapter carries only its refusals — the records are
268
+ # half-written by definition.
480
269
  #
481
270
  # @param bluebook [Object] a built bluebook chapter graph, as `call`
482
271
  # receives it
@@ -499,72 +288,38 @@ module Hecks
499
288
  def self.grammar_registry
500
289
  @grammar_registry ||= begin
501
290
  registry = load_grammar_into(Runtime::Registry.new)
502
- # Assigned before the fixpoint judge below: judging re-enters
503
- # grammar_registry through fresh_runtime (judge.rb) and Plan.for
504
- # (judge.rb, reconstruction.rb) — a bare ||= would still be nil
505
- # while its right-hand side evaluates, and recurse forever. That
506
- # reentrancy window is real: a caller landing here before the
507
- # fixpoint/attach below have run sees the same registry object,
508
- # correctly, but one still missing the attached chapters (Paging's
509
- # `attaches_to` among them) — see grammar_registry_ready? below.
291
+ # Assigned before the fixpoint judge below, since judging re-enters
292
+ # grammar_registry (via fresh_runtime/Plan.for) and a bare `||=`
293
+ # would still be nil mid-evaluation, recursing forever.
510
294
  @grammar_registry = registry
511
- # **The fixpoint made load-bearing**. The bootstrap loaded the language
512
- # raw ; now the language judges itself, its records are read back,
513
- # and the assembled graph replaces the raw one — so every bluebook
514
- # judged from here on is judged by the language the language itself
515
- # produced. Outside load_grammar_into on purpose : its ensure clears
516
- # @bootstrapping, and call() must see bootstrapping? == false to do
517
- # anything at all. `while_forcing_fixpoint`-wrapped so a growth
518
- # spec's own `while_disabled` window can never leave this
519
- # one-time build cached in its raw, never-judged form — see
520
- # `disabled?`'s own comment.
295
+ # The language now judges itself; every bluebook from here on is
296
+ # judged by that assembled graph, not the raw bootstrap one. Must
297
+ # run after load_grammar_into's ensure clears @bootstrapping.
521
298
  while_forcing_fixpoint do
522
299
  LANGUAGE_CHAPTERS.each { |name| registry.add_bluebook(call(registry.bluebook(name))) }
523
300
  load_attached_grammar_into(registry)
524
301
  end
525
- # Stamped last, keyed by this registry's own identity rather than
526
- # a bare boolean — a manual reset (fixpoint_spec.rb's own
527
- # `@grammar_registry = nil`) makes @grammar_registry not equal
528
- # this object_id again until a fresh build finishes, so a stale
529
- # "ready" from the previous cycle can never leak into the next.
302
+ # Keyed on this registry's object identity, not a bare boolean, so
303
+ # a manual reset can never leave a stale "ready" from the previous
304
+ # cycle.
530
305
  @grammar_ready_for = registry.object_id
531
306
  registry
532
307
  end
533
308
  end
534
309
 
535
- # A reentrant call during the fixpoint/attach window above gets a
536
- # real, correctly-mutating registry object back — no infinite loop,
537
- # no wrong data for that caller's own purposes. But anything that
538
- # memoizes a snapshot derived from it must not lock that snapshot
539
- # in forever : this is one signal such a cache can check. Found
540
- # live — SyntaxBoot.call had cached a Query keyword list missing
541
- # every Paging-attached word (limit/offset/cursor/nulls) because
542
- # something called it inside this exact window.
310
+ # Whether `grammar_registry`'s memoized singleton has finished its
311
+ # fixpoint judge and attached-chapter load.
543
312
  #
544
- # SyntaxBoot.call does not use this. Gating its cache on "the
545
- # whole registry is finished" meant nothing was cached for the
546
- # entire window, and the window is not narrow — every word routed
547
- # through `word_gate_dispatch` while the language judged itself
548
- # re-ran the ~284-dispatch syntax boot (42 times, 32 seconds, per
549
- # process — see SyntaxBoot.call's own comment). It keys its cache
550
- # on the registry's chapter set instead, which is the actual input
551
- # the snapshot is a function of. Kept here for any other derived
552
- # cache that genuinely needs "is the build finished" rather than
553
- # "have my inputs changed".
313
+ # A cache keyed on "finished" instead of its own inputs already missed
314
+ # data for a whole build window once.
554
315
  #
555
- # @return [Boolean] whether `grammar_registry`'s memoized singleton
556
- # has finished its fixpoint judge and attached-chapter load
316
+ # @return [Boolean]
557
317
  def self.grammar_registry_ready?
558
318
  @grammar_registry && @grammar_ready_for == @grammar_registry.object_id
559
319
  end
560
320
 
561
- # Attached chapters load after the fixpoint, not during bootstrap —
562
- # they are declared in the language the language just finished
563
- # judging itself through, so they are ordinary bluebooks, judged the
564
- # ordinary way (`Hecks.bluebook` → `BluebookBuilder#build` →
565
- # `MetaValidator.call`, `bootstrapping?` already false). A directory
566
- # with nothing in it loads nothing ; this is a no-op until a chapter
567
- # is added there.
321
+ # Loads every `ATTACHED_GRAMMAR_DIR` chapter file into `registry`,
322
+ # judged the ordinary way since the fixpoint has already run.
568
323
  #
569
324
  # @param registry [Runtime::Registry] the registry to load every
570
325
  # `ATTACHED_GRAMMAR_DIR` chapter file into
@@ -575,27 +330,14 @@ module Hecks
575
330
  end
576
331
  end
577
332
 
578
- # The one place the grammar's own boot sequence is spelled — ports, the
579
- # memory/prism adapters, the (now nine-file) chapter itself, then the
580
- # sibling world grammar. `grammar_registry` uses this for its memoised
581
- # singleton ; anything that needs an isolated registry (a spec wanting a
582
- # fresh store per example, say) calls this directly instead of hand-
583
- # copying the sequence.
333
+ # Loads the whole grammar (ports, adapters, every language chapter)
334
+ # into `registry`, raw and unjudged.
584
335
  #
585
- # The bootstrap guard lives here, not just around the singleton. Splitting
586
- # the chapter into several files means each file's own `Hecks.bluebook
587
- # "Bluebook"` call now runs `BluebookBuilder#build` once per file — and
588
- # `MetaValidator.call` judges whatever it is handed unless `bootstrapping?`
589
- # is true. A caller that loaded the grammar files by hand into its own
590
- # registry, without this guard, would get each file dispatched and judged
591
- # alone the moment it loaded — and a lone file like `aggregate.bluebook`
592
- # refuses immediately, since `Aggregate.Attribute` references `ValueObject`
593
- # and `Aggregate.Holds` references `Entity`, both declared in later files.
594
- # Every caller of the grammar must go through here for exactly that reason.
336
+ # The `@bootstrapping` guard matters: without it a chapter split
337
+ # across files would get judged one file at a time and refuse early.
595
338
  #
596
339
  # @param registry [Runtime::Registry] the registry to load the whole
597
- # grammar (ports, adapters, and every language chapter) into, raw
598
- # and unjudged
340
+ # grammar into, raw and unjudged
599
341
  # @return [Runtime::Registry] `registry`, unchanged in identity
600
342
  def self.load_grammar_into(registry)
601
343
  @bootstrapping = true
@@ -616,15 +358,8 @@ module Hecks
616
358
  @bootstrapping = false
617
359
  end
618
360
 
619
- # A fresh store per bluebook. The registry memoises repositories, so
620
- # reusing it let every bluebook see the records of every bluebook judged
621
- # before it. The parsed grammar is reused ; only the records are cleared.
622
- # (During grammar_registry's own fixpoint judge this clear runs on the
623
- # singleton mid-memoisation — harmless for the same reason : the grammar
624
- # is what is kept, the records were never meant to survive a judging.)
625
- # No `bind_runtime` here : judging dispatches by FQN and never opens the
626
- # door, and binding would re-install the language's own facade constants
627
- # once per judged chapter.
361
+ # A dispatcher over the shared grammar registry with its records
362
+ # cleared, so one bluebook's judging can never see another's records.
628
363
  #
629
364
  # @return [Runtime::Dispatcher] a dispatcher over the shared grammar
630
365
  # registry, with its records cleared