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,94 +1,26 @@
1
1
  module Hecks
2
2
  module Bluebook
3
- # The rulebook translating between the language's own declarations and the
4
- # IR objects `Build`/`Reconstruction` produce from them — the `Contract`
5
- # struct format itself (this file) plus, reopened in contracts.rb, the
6
- # `CONTRACTS` table of one `Contract` per construct category.
3
+ # Translates the language's declarations into the IR that `Build` and
4
+ # `Reconstruction` produce; `CONTRACTS` (contracts.rb) holds one per category.
7
5
  class Assembly
8
- # What a construct needs that the language cannot say, and how a claim that a
9
- # field needs no assembling is checked.
10
- #
11
- # Naming a field derived is a claim, and a claim needs a kind, not just a name
12
- # in a list. A bare list of names is a promise with nobody holding it: the
13
- # coverage gate only asks whether a field is accounted for, so `derived:
14
- # %i[version]` would satisfy it while dropping a chapter's version in
15
- # silence — the exact shape of every defect this arc has found.
16
- #
17
- # :parent the containment tree supplies it — a `*_id`, or one of
18
- # the named pointers below. Checked against the name.
19
- # :children it is assembled as child constructs. Checked against the
20
- # language: a category must exist whose parent is this one.
21
- # [:computed, :m] the holder works it out. Checked: it must answer to `m`.
22
- # [:folded, keys] several language fields are one thing in the IR, or one
23
- # is spread across several. Checked: every key must appear
24
- # in a real reconstructed declaration.
25
- # :elsewhere not a fact about this construct at all. Allow-listed one
26
- # by one, because it is the kind with no other check.
27
- #
28
- # Every one of those can fail. That is the whole difference.
6
+ # A derived claim's kind is one of :parent, :children, [:computed, method],
7
+ # [:folded, keys], or :elsewhere — each checked structurally, not just named.
29
8
  Contract = Struct.new(:holder, :make, :fields, :derived, :rows, :reads, keyword_init: true) do
30
- # How a declaration key is read back off a row. Absent means the default —
31
- # `text(row[key])`, a single cell — which is most of them ; present names the
32
- # shape, because a list needs a reader per element and a folded field is
33
- # gathered rather than fetched. Same pattern as `rows`, in the other
34
- # direction: declare the exceptions, default the rest.
35
- #
36
- # @param key [String, Symbol] the field's declaration key, as `fields` names it
37
- # @return [Symbol, Array, nil] the reader named in `reads` for `key`, or `nil`
38
- # when the field reads through the default single-cell reader
9
+ # nil means the field reads through the default single-cell reader.
39
10
  def reader(key) = Hash(reads)[key.to_sym]
40
11
 
41
- # How an appendable list becomes rows the walk can offer. A list absent from
42
- # here reads straight off the node ; one that is present names the shaper,
43
- # because the IR keeps a shape the language does not — a transition whose
44
- # `from` is a list is several rows, an append binds several fields at once,
45
- # an open map is one row per entry.
46
- #
47
- # @param list [String, Symbol] the appendable list's field name
48
- # @return [Symbol, nil] the shaper method named in `rows` for `list`, or `nil`
49
- # when the list reads straight off the node instead
12
+ # nil means the list reads straight off the node.
50
13
  def shaper(list) = Hash(rows)[list.to_sym]
51
14
 
52
- # Whether `field` is one this contract accounts for, stored or derived.
53
- #
54
- # @param field [Symbol] the field name to check
55
- # @return [Boolean] whether `field` is a key of `fields` or of `derived`
56
15
  def declares?(field) = fields.key?(field) || derived.key?(field)
57
16
 
58
- # Names the kind of derived claim `field` makes, if any.
59
- #
60
- # @param field [Symbol] the derived field name to check
61
- # @return [Symbol, Array, nil] the kind `derived` names for `field` — `:parent`,
62
- # `:children`, `:elsewhere`, `:walk`, an `[:computed, method]` or `[:folded,
63
- # object, member]` pair — or `nil` when `field` is not derived
64
17
  def kind_of(field) = derived[field]
65
18
 
66
- # The fields the walk supplies — every `derived: { field => :walk }` claim.
67
- # The language declares them (`attribute :position, Position`) so the
68
- # judge can order siblings, but no constructor takes one. This is the one
69
- # place that fact is stated ; `Specializer` and `Model::Deviations` read it
70
- # here rather than each keeping their own `%i[position]`.
71
- #
72
- # @return [Array<Symbol>] every field name whose derived kind is `:walk`
19
+ # Every derived field the walk supplies; Specializer skips these.
73
20
  def walked = derived.select { |_field, kind| kind == :walk }.keys
74
21
 
75
- # Where a folded field actually lives, as [object, member].
76
- #
77
- # `[:folded, :lifecycle, :field]` says the language's `state_field` is the
78
- # `field` of the IR's one Lifecycle. `Readings` would otherwise have to state
79
- # that fact a second time as `node.lifecycle&.field` — saying it once here
80
- # drives both directions instead: the walk reads the member on the way in, and
81
- # the reconstruction gathers the members back into the object on the way out.
82
- #
83
- # A nil member means the fold has no single member to name — `rows` is a
84
- # count of what `closed_set` and `members` hold between them, and `options`
85
- # spreads across eight keys. Those keep their own code, and the gate still
86
- # checks the object they name is real.
87
- #
88
- # @param field [Symbol] the derived field name to check
89
- # @return [Array(Symbol, Symbol), Array(Array<Symbol>, nil), nil] the `[object,
90
- # member]` pair the field folds into — `member` is `nil` when the fold has
91
- # no single member to name — or `nil` when `field` does not fold at all
22
+ # [object, member] a folded field lives at; member is nil when the fold
23
+ # has no single one to name (e.g. a count plus a list of rows).
92
24
  def folded(field)
93
25
  kind = derived[field]
94
26
  return nil unless kind.is_a?(Array) && kind.first == :folded
@@ -96,20 +28,8 @@ module Hecks
96
28
  [kind[1], kind[2]]
97
29
  end
98
30
 
99
- # Computed means worked out, not merely answerable.
100
- #
101
- # Asking only whether the holder responds was too weak, and measurably so:
102
- # `[:computed, :version]` passed, because `Bluebook` does answer to
103
- # `version` — it just answers with what the constructor was handed. A field
104
- # the constructor takes is stored, and calling it computed is how a chapter's
105
- # version would have gone missing while the gate said yes.
106
- #
107
- # So a computed field is one the holder answers and the constructor does not
108
- # accept. `query_name` qualifies (`Naming.snake(name)`) ; `version` cannot.
109
- #
110
- # @param method [Symbol] the field name to check
111
- # @return [Boolean] whether `holder` answers `method` but its constructor does
112
- # not accept it as a keyword
31
+ # Computed means the holder answers but its constructor won't accept it —
32
+ # respond_to? alone would also count a stored field like `version`.
113
33
  def computes?(method)
114
34
  return false unless holder
115
35
  return false unless answers?(method)
@@ -117,22 +37,10 @@ module Hecks
117
37
  !accepts?(method)
118
38
  end
119
39
 
120
- # Whether `holder` answers `method`, checked the way that fits how it is
121
- # built: `respond_to?` for a `:declare` holder (a class, queried live) and
122
- # `method_defined?` for a `:new` holder (an instance method, checked without
123
- # building one).
124
- #
125
- # @param method [Symbol] the method name to check
126
- # @return [Boolean] whether `holder` answers `method`
127
40
  def answers?(method)
128
41
  make == :declare ? holder.respond_to?(method) : holder.method_defined?(method)
129
42
  end
130
43
 
131
- # Whether the holder's constructor takes `keyword` as a keyword argument.
132
- #
133
- # @param keyword [Symbol] the keyword to check
134
- # @return [Boolean] whether the holder's constructor (`.declare` or
135
- # `#initialize`) accepts `keyword` as an optional or required keyword
136
44
  def accepts?(keyword)
137
45
  builder = make == :declare ? holder.method(:declare) : holder.instance_method(:initialize)
138
46
 
@@ -140,49 +48,20 @@ module Hecks
140
48
  end
141
49
  end
142
50
 
143
- # The fields that point at a parent without being spelled `*_id` — the one list,
144
- # read by the assembly gate (a `:parent` claim), the model generator and
145
- # QueryIR (a declared field the model composes instead of storing).
146
- #
147
- # aggregate, bluebook the bare parent link a creating command mints
148
- # (ADR 0025) — exactly the `parent_key`s `Plan` reads
149
- # off the language
150
- # owner Entity's own text twin of that link, which is why
151
- # Entity's contract claims `owner: :parent`
152
- #
153
- # `shape` and `handler` are not on this list — S17 (ADR 0026) made Member and
154
- # Dispatch nested entities, so neither is a parent field the way
155
- # `owner` is. `spec/assembly_spec` derives this set from `Plan` and the
156
- # contracts directly and fails on any drift, rather than trusting this list to
157
- # stay in sync with a second hand-written copy kept by the model generator.
51
+ # Parent-pointer fields that don't end in `_id` (ADR 0025).
52
+ # spec/assembly_spec derives this set independently and fails on drift.
158
53
  PARENT_POINTERS = %i[aggregate bluebook owner].freeze
159
54
 
160
- # Whether `field` is a parent pointer that does not end in `_id`.
161
- #
162
- # @param field [String, Symbol] the field name to check
163
- # @return [Boolean] whether `field` ends with `_id`, or is one of
164
- # `PARENT_POINTERS`
165
55
  def self.parent_pointer?(field)
166
56
  field.to_s.end_with?("_id") || PARENT_POINTERS.include?(field.to_sym)
167
57
  end
168
58
 
169
- # The only fields allowed to claim they describe something other than the
170
- # construct they hang off, each with the reason spelled out.
171
- #
172
- # normalisations the canonical-form table belongs to the expression grammar.
173
- # A chapter's rules are canonicalised on the way in, so the
174
- # language models the table — but no chapter stores one, and
175
- # `Bluebook#to_h` splices it in from Expression.
59
+ # Fields allowed to describe something other than their own construct.
60
+ # `Bluebook.normalisations` belongs to the expression grammar; `to_h` splices it in.
176
61
  ELSEWHERE = {
177
62
  Bluebook: %i[normalisations]
178
63
  }.freeze
179
64
 
180
- # Whether `field` is allow-listed as describing something other than
181
- # `category`'s own construct — see `ELSEWHERE`.
182
- #
183
- # @param category [String, Symbol] the construct category name
184
- # @param field [Symbol] the field name to check
185
- # @return [Boolean] whether `field` is on `category`'s `ELSEWHERE` entry
186
65
  def self.elsewhere?(category, field)
187
66
  Array(ELSEWHERE[category.to_sym]).include?(field)
188
67
  end
@@ -1,46 +1,11 @@
1
1
  module Hecks
2
2
  module Bluebook
3
- # Reopened here for `CONTRACTS`/`.contract(category)` — the one table of
4
- # every construct category's own `Contract` (Bluebook, Aggregate,
5
- # Command, ValueObject, Query, ...); see `Contract`'s own header
6
- # (contract.rb) for the struct format each entry below fills in.
3
+ # Reopened for `CONTRACTS`, the table of each category's own `Contract`;
4
+ # see contract.rb for the struct format each entry below fills in.
7
5
  class Assembly
8
- # One table, where there were five hand-written mirrors of it.
9
- #
10
- # `bluebook.bluebook` already declares what every construct is made of, and
11
- # `Plan` already reads it — parent, fields, lists, setters. What the language
12
- # cannot say is the three things Ruby needs to rebuild one, so those are here
13
- # and only those:
14
- #
15
- # holder which class holds it
16
- # make :declare for a construct that became a class, :new for an
17
- # instance — the boundary `Query` sits on, since its body is
18
- # inherited instance methods
19
- # fields each keyword the constructor takes, as
20
- # keyword => [key in the declaration, how to read it]
21
- #
22
- # A reader is a symbol naming a method on Marks, or :plain for a value that
23
- # needs no decoding, or [:each, reader] for a list. Nothing here is a rule
24
- # about whether a declaration is admissible — the language settled that on the
25
- # way in. This is only how a spelling becomes an object again.
26
- #
27
- # Why a table and not a method per category: a hand-written branch per
28
- # category can decorate a verb the language declares without the walk ever
29
- # offering it, and nothing goes red, because a branch that does not exist
30
- # cannot fail. An assembler with a method per category is the same shape.
31
- # The table avoids it because spec/assembly_spec checks it against the
32
- # language: a field the language declares that no contract consumes is a
33
- # failure, not a silence.
34
- #
35
- # The `derived` list is how a field says it needs no assembling — a parent
36
- # pointer the containment tree already knows, or something computed from what
37
- # is here (`query_name` is `Naming.snake(name)`, `creates?` is whether a verb
38
- # names a root). Naming one is a claim, and the coverage gate holds it.
39
- #
40
- # @param category [String, Symbol] the construct category name, such as
41
- # `"Aggregate"` or `:Command`
42
- # @return [Bluebook::Assembly::Contract] the category's field contract
43
- # @raise [KeyError] if no contract is registered for `category`
6
+ # One table of what each category needs beyond what the language states:
7
+ # holder, make (:declare vs :new), and fields. spec/assembly_spec checks
8
+ # it against the language, so an unconsumed declared field fails loudly.
44
9
  def self.contract(category) = CONTRACTS.fetch(category.to_s)
45
10
 
46
11
  CONTRACTS = {
@@ -52,6 +17,7 @@ module Hecks
52
17
  vision: [:vision, :plain],
53
18
  classification: [:classification, :plain],
54
19
  formerly_known_as: [:formerly_known_as, :plain],
20
+ namespace: [:namespace, :plain],
55
21
  attaches_to: [:attaches_to, :plain],
56
22
  provides: [:provides, :plain]
57
23
  },
@@ -66,19 +32,10 @@ module Hecks
66
32
  description: [:description, :plain],
67
33
  identified_by: [:identified_by, :plain],
68
34
  attributes: [:attributes, [:each, :attribute]],
69
- # The aggregate boundary, and the precondition a command may
70
- # reference by name (S10, ADR 0025 — "Rules"). Same reader
71
- # shapes ValueObject's own `invariants`/Command's own
72
- # `givens` already use — `invariant` builds an Invariant,
73
- # `given` a Given, the same struct AggregateBuilder#given
74
- # hands a referencing command's own resolved list.
35
+ # Aggregate's own precondition, referenced by name from a command (ADR 0025).
75
36
  invariants: [:invariants, [:each, :invariant]],
76
37
  preconditions: [:preconditions, [:each, :given]],
77
- # S12, ADR 0025 — the local half of "projects :name, from:
78
- # :\"reference.remote_field\"", read the same way
79
- # invariants/preconditions above are: a synthetic command
80
- # (Aggregate.Projects) the judge dispatches once per
81
- # declaration, folded into a list on the owning aggregate.
38
+ # The local half of `projects :name, from: "reference.remote_field"` (ADR 0025).
82
39
  projected_fields: [:projected_fields, [:each, :projected_field]],
83
40
  provenance: [:provenance, :plain]
84
41
  },
@@ -107,10 +64,7 @@ module Hecks
107
64
  ensures: [:ensures, [:each, :given]],
108
65
  mutations: [:mutations, [:each, :mutation]],
109
66
  emits: [:emits, :plain],
110
- # Lifecycle state as a command guard (S10, ADR 0025) — a
111
- # literal the same way `provenance`/`default:` already are;
112
- # one state or an array of them, or nil for a command with
113
- # no such guard.
67
+ # Lifecycle state as a command guard: one state, an array, or nil (ADR 0025).
114
68
  from: [:from, :plain],
115
69
  provenance: [:provenance, :plain]
116
70
  },
@@ -144,6 +98,7 @@ module Hecks
144
98
  wheres: [:wheres, [:each, :where_clause]],
145
99
  order_by: [:order_by, :order_by],
146
100
  limit: [:limit, :limit],
101
+ returns: [:returns, :plain],
147
102
  # Held by the language as an open map, so every one of these reads the
148
103
  # same way and a ninth option needs no new field on either side.
149
104
  offset: [:offset, [:option, :offset]],
@@ -168,22 +123,15 @@ module Hecks
168
123
  fields: {
169
124
  name: [:name, :plain],
170
125
  description: [:description, :plain],
171
- # A list of paths, exactly as an aggregate's is, with no room left for
172
- # the two to differ. A Symbol here and a String there would look
173
- # identical to `to_h`'s byte-equality check, since both render as a
174
- # string, while diverging at runtime: the assembled graph would carry a
175
- # String, and `element_of`'s lookup of `args["sequence"]` in a
176
- # symbol-keyed payload would find nothing — refusing "Reverse acts on
177
- # one LedgerEntry — pass sequence:" while sequence was in fact passed.
126
+ # A list of paths, like Aggregate's. Must be Symbols: a String looks
127
+ # identical here but a symbol-keyed args lookup downstream would find
128
+ # nothing, silently rejecting a value that was in fact passed.
178
129
  identified_by: [:identified_by, :plain],
179
130
  attributes: [:attributes, [:each, :shape_field]],
180
- # ADR 0028 — the same shape Aggregate's own `preconditions`
181
- # already carries, one level down: a piece's own named
182
- # `given`, referenced back by one of its own commands.
131
+ # Same shape as Aggregate's own `preconditions`, one level down (ADR 0028).
183
132
  preconditions: [:preconditions, [:each, :given]],
184
- # Round 7 — the same shape Aggregate's own `invariants`
185
- # already carries, one level down: checked against every
186
- # instance of this piece, not the aggregate's own flat state.
133
+ # Same shape as Aggregate's own `invariants`, checked per instance of
134
+ # this entity rather than the aggregate's flat state.
187
135
  invariants: [:invariants, [:each, :invariant]]
188
136
  },
189
137
  rows: { transitions: :transition_rows, identified_by: :identity_rows },
@@ -220,35 +168,23 @@ module Hecks
220
168
  holder: ProcessManager, make: :new,
221
169
  fields: {
222
170
  name: [:name, :plain],
223
- # **A symbol**. `SagaInterpreter` does `event.payload[pm.correlates_by]` — a
224
- # hash lookup on a symbol-keyed payload — and `value == pm.correlates_by`
225
- # when resolving a leg s bindings. A String there finds nothing and
226
- # resolves to nothing, so the wire never advanced and a drawer that
227
- # should have held 2500 held 0. to_h could not show it: it stringifies.
171
+ # Must be a Symbol: SagaInterpreter looks it up as a symbol-keyed hash
172
+ # key. A String silently matches nothing, and the saga never advances.
228
173
  correlates_by: [:correlates_by, :identity],
229
174
  starts_on: [:starts_on, :plain],
230
175
  ends_on: [:ends_on, :plain],
231
176
  states: [:states, :plain]
232
177
  },
233
178
  reads: { states: :names },
234
- # S17, ADR 0026 — `handlers` is a real feature of the language's
235
- # own "ProcessManager" declaration now (`attribute :handlers,
236
- # list_of(Handler)`, reaction.bluebook), consumed by the judge
237
- # walking `Plan`'s own containment tree (`Handler`'s own
238
- # `.parent == "ProcessManager"`) rather than by any field this
239
- # contract itself reads — the same `:children` shape Aggregate's
240
- # own `value_objects` claim already uses, one level in.
179
+ # `handlers` comes from the judge walking the containment tree
180
+ # (`Handler.parent == "ProcessManager"`), the same as Aggregate's
181
+ # own `value_objects` — not from any field this contract reads.
241
182
  derived: { position: :walk, handlers: :children }
242
183
  ),
243
184
 
244
- # S17, ADR 0026 — Handler is a genuine entity now, nested under
245
- # ProcessManager (`entity "Handler"`, reaction.bluebook). Neither
246
- # `position` nor `handler` is a stored field: a saga
247
- # answers each event once, so `event_type` is Handler's own real,
248
- # non-positional identity (no walk-minted `position` to derive),
249
- # and the process manager it belongs to is structural now — which
250
- # list this element sits in, not a stored field to fold a parent
251
- # pointer out of.
185
+ # Handler is nested under ProcessManager. `event_type` is its real
186
+ # identity (a saga answers each event once), so unlike other entities
187
+ # it has no walk-minted `position` to derive.
252
188
  "Handler" => Contract.new(
253
189
  holder: ProcessManagerHandler, make: :new,
254
190
  fields: {
@@ -256,46 +192,14 @@ module Hecks
256
192
  from_state: [:from_state, :plain],
257
193
  to_state: [:to_state, :plain]
258
194
  },
259
- # `dispatches` — same reason ProcessManager's own `handlers`
260
- # claim, above, is `:children` : a real feature of the
261
- # language's own "Handler" declaration (`attribute :dispatches,
262
- # list_of(Dispatch)`), consumed by the judge walking `Plan`'s
263
- # own containment tree rather than by any field this contract
264
- # reads.
195
+ # `dispatches` comes from the containment walk, like ProcessManager's
196
+ # own `handlers` above — not from a field this contract reads.
265
197
  derived: { dispatches: :children }
266
198
  ),
267
199
 
268
- # S17, ADR 0026 — Dispatch is a genuine entity now, nested under
269
- # Handler (`entity "Dispatch"`, process_manager.bluebook) — two
270
- # levels deep, "no life outside its Handler" (the ADR's own
271
- # words). `command_name` alone is not Dispatch's own identity —
272
- # items #151/#152 (`process_manager.bluebook`'s own
273
- # `DispatchPosition` comment) found it collides the instant a
274
- # real handler fans the same command out more than once, so
275
- # `position` joins it, walk-minted the same way every other
276
- # category's own `position` is (`derived: { position: :walk }`,
277
- # the same entry ProcessManager's own contract carries above) —
278
- # never a stored field on `DispatchSpec` itself, exactly like
279
- # `handler` before it.
280
- # `compensates_command_name`/`compensates_with_spec` — folded,
281
- # the same kind `Lifecycle`'s own `state_field`/`default` claim
282
- # (one IR object, `DispatchSpec#compensates`, feeding two
283
- # separate language fields): `Readings#field_value`'s own
284
- # `contract.folded` branch reads
285
- # `node.compensates.to_h[:command_name]` / `[:with_spec]` for
286
- # the judge's offering side, nil-safe when there is no
287
- # compensation at all (`through`'s own `return nil unless
288
- # held`). `compensates_with_spec` also needs its own row shaper
289
- # (`compensates_with_spec_rows`, readings.rb) for the judge's
290
- # list-offering side — the with_spec pairs still need one
291
- # "BindCompensation" append per pair, the same reason
292
- # `with_spec` itself needs `with_spec_rows`, one level deeper.
293
- # `Reconstruction#dispatch` reads the two flat fields back off
294
- # the row and assembles the nested `DispatchSpec` by hand — a
295
- # nested object is not one of the shapes `declaration()`'s own
296
- # generic per-field hash-build can produce, the identical reason
297
- # `handler`/`process_manager` pass a `:children` list through
298
- # `extra:` instead.
200
+ # Dispatch is nested under Handler, two levels deep. `command_name` alone
201
+ # is not identity — a handler can fan the same command out more than
202
+ # once, so `position` (walk-minted) disambiguates.
299
203
  "Dispatch" => Contract.new(
300
204
  holder: DispatchSpec, make: :new,
301
205
  fields: {
@@ -304,6 +208,7 @@ module Hecks
304
208
  },
305
209
  rows: { with_spec: :with_spec_rows, compensates_with_spec: :compensates_with_spec_rows },
306
210
  reads: { with_spec: [:from, :with_spec] },
211
+ # compensates_* fold one IR object (`DispatchSpec#compensates`) into two fields.
307
212
  derived: {
308
213
  position: :walk,
309
214
  compensates_command_name: [:folded, :compensates, :command_name],
@@ -311,15 +216,9 @@ module Hecks
311
216
  }
312
217
  ),
313
218
 
314
- # S14, ADR 0026 — Syntax/Keyword/Argument are never built via
315
- # `Build`/`Reconstruction`'s own generic path — their own data
316
- # lives in a dedicated repository `SyntaxBoot` (meta_validator/
317
- # syntax_boot.rb) reads directly, never through the meta-
318
- # domain's own reconstruction, the same reason `Member`'s own
319
- # entry (above) carries `holder: nil, make: nil` too. These
320
- # entries exist purely so the introspection specs
321
- # (assembly_spec.rb) can hold them to the same "every field
322
- # claimed" discipline every other category answers to.
219
+ # Syntax/Keyword/Argument bypass Build/Reconstruction entirely (ADR 0026) —
220
+ # SyntaxBoot reads them directly. These entries exist only so assembly_spec
221
+ # can hold them to the same "every field claimed" discipline as the rest.
323
222
  "Syntax" => Contract.new(
324
223
  holder: nil, make: nil,
325
224
  fields: { name: [:name, :plain] },
@@ -374,14 +273,18 @@ module Hecks
374
273
  reference_target: [:reference_target, :plain],
375
274
  aggregate_heads: [:aggregate_heads, [:each, :head]],
376
275
  group_by: [:group_by, [:each, :group_by_field]],
377
- # `count`/`median_field` are `group_by`'s own two siblings —
378
- # scalars, not lists, so no `[:each, ...]` shape ; `:plain`
379
- # is what `Assembly::Build` needs (fed the native `to_h`
380
- # value directly, already `true`/`nil`/a String), and the
381
- # `reads:` entry below is what `Reconstruction` needs
382
- # instead (fed the stringified meta-domain row).
276
+ # Scalars, not lists: `:plain` is for Build (native to_h value);
277
+ # the `reads:` entry below is for Reconstruction (stringified row).
383
278
  count: [:count, :plain],
384
279
  median_field: [:median_field, :plain],
280
+ sum_field: [:sum_field, :plain],
281
+ avg_field: [:avg_field, :plain],
282
+ min_field: [:min_field, :plain],
283
+ max_field: [:max_field, :plain],
284
+ percentile_field: [:percentile_field, :plain],
285
+ percentile_at: [:percentile_at, :plain],
286
+ any_field: [:any_field, :plain],
287
+ all_field: [:all_field, :plain],
385
288
  # A read model inherits every option an ask has, so it reads them the
386
289
  # same way — see Query.
387
290
  wheres: [:wheres, [:each, :where_clause]],
@@ -394,31 +297,18 @@ module Hecks
394
297
  inspection: [:inspection, [:option, :inspection]]
395
298
  },
396
299
  rows: { options: :read_model_option_rows },
397
- # `wheres` needs its own reader for the same reason Query's does — a
398
- # list defaults to `[]`, not the generic `text(row[key])` cell reader's
399
- # `nil` — even though a read model's row never carries `wheres` as a
400
- # native field the way Query's does (`[:each, :where_clause]` over an
401
- # absent `row[:wheres]` is `Array(nil).map { ... }`, i.e. `[]`, always).
402
- # The real values, when a read model declares any, arrive through
403
- # `options_of(row)`'s merge in `read_model` below (dispatched as
404
- # generic Option rows, `read_model_option_rows`/`filter_options` — not
405
- # as dedicated where-clause rows), which overrides this default. Until
406
- # `ReadModel#to_h` spelled `wheres`/`order_by`/`limit`
407
- # unconditionally, `round_trip_spec`'s own "source keys only" +compare
408
- # never asked about this key at all, so the `nil`-vs-`[]` gap between
409
- # this contract's default and `to_h`'s own `[]` default went unnoticed.
410
- # `order_by`/`limit` need no matching entry — the generic reader's
411
- # `nil` already agrees with `to_h`'s own nil-when-undeclared default
412
- # for those two. `group_by` needs its own reader the same way — a
413
- # rootless read model's grouping keys, added independently on main.
300
+ # `wheres` needs its own reader so an undeclared list defaults to `[]`,
301
+ # not the generic reader's `nil`; real values arrive via the options
302
+ # merge in `read_model` below, which overrides this default.
414
303
  reads: { reference_name: :symbol, aggregate_heads: [:each, :head],
415
304
  group_by: [:each, :group_by_field], wheres: [:each, :where_clause],
416
- # `count` needs the boolean coercion `Shapes#read_model_count`
417
- # gives it (a stringified "true"/absent on the wire, a real
418
- # `true`/`nil` in `to_h`) — `median_field` needs none: the
419
- # default `text(row[key])` cell reader already returns the
420
- # same String-or-nil `ReadModel#to_h`'s own `&.to_s` does.
421
- count: :read_model_count },
305
+ # `count` needs boolean coercion (stringified on the wire);
306
+ # `median_field` needs none — the default reader already
307
+ # matches `to_h`'s String-or-nil.
308
+ count: :read_model_count,
309
+ # `percentile_at` needs Float coercion; every other reduction field
310
+ # is a Symbol-like name the default text reader already matches.
311
+ percentile_at: :read_model_percentile_at },
422
312
  derived: {
423
313
  position: :walk,
424
314
  query_name: [:computed, :query_name],
@@ -426,17 +316,9 @@ module Hecks
426
316
  }
427
317
  ),
428
318
 
429
- # A member's pairs are an open map, which is why Member is its own root in
430
- # the language. The IR keeps them as a plain hash on the value object, so
431
- # they are assembled with their shape rather than as a construct.
432
- # S17, ADR 0026 — Member is a genuine entity, nested under
433
- # ValueObject (`entity "Member"`, shape.bluebook). It holds no
434
- # `shape` field at all (a free-text, un-parsed spelling would suit
435
- # only a standalone root ; an entity's element is
436
- # never serialized as text) — only `position` (walk-minted, see
437
- # `entity_own_identity`, judge.rb) and `pairs` (still an open map,
438
- # still one row per entry, still why a value object cannot hold it
439
- # directly).
319
+ # Member is nested under ValueObject. Its pairs are an open map, so it
320
+ # holds no `shape` field — only walk-minted `position` and `pairs`
321
+ # (still one row per entry, still an open map).
440
322
  "Member" => Contract.new(
441
323
  holder: nil, make: nil,
442
324
  fields: {},