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
@@ -0,0 +1,61 @@
1
+ module Hecks
2
+ # The class-free public surface, installed per boot by `Runtime::Loader.bind_runtime`.
3
+ module Doors
4
+ # The removal release of the `Facade` and `install_facade:` spellings.
5
+ REMOVAL = "3.1.0".freeze
6
+
7
+ module_function
8
+
9
+ # Resolves the boot switch from the current keyword and its deprecated spelling.
10
+ #
11
+ # @param install_doors [Boolean] the `install_doors:` keyword
12
+ # @param install_facade [Boolean, nil] the deprecated `install_facade:` keyword; nil when
13
+ # the caller did not pass it
14
+ # @return [Boolean] whether to install the Ruby door constants
15
+ def install?(install_doors, install_facade = nil)
16
+ return install_doors if install_facade.nil?
17
+
18
+ warn "[hecks] `install_facade:` is deprecated and is removed in #{REMOVAL}; use `install_doors:`"
19
+ install_facade
20
+ end
21
+ end
22
+
23
+ # Installs facade constants at top level, replacing only what it installed itself.
24
+ # A constant owned by user code or the stdlib is left alone with a warning.
25
+ module Namespace
26
+ # A live registry, mutated by `install`, so it cannot be frozen.
27
+ # rubocop:disable-next Style/MutableConstant
28
+ GENERATED = {}
29
+
30
+ module_function
31
+
32
+ # Sets `container::name` to `value`, replacing only a constant this module installed.
33
+ #
34
+ # @param container [Module] the namespace to define the constant in
35
+ # @param name [String, Symbol] the constant name
36
+ # @param value [Module] the facade module to install
37
+ # @return [Object] `value` when installed, else the foreign constant left in place
38
+ # @raise [NameError] if `name` is not a valid constant name
39
+ def install(container, name, value)
40
+ name = name.to_s
41
+
42
+ if container.const_defined?(name, false)
43
+ current = container.const_get(name)
44
+ unless GENERATED[[container, name]].equal?(current)
45
+ warn "[hecks] #{name} is already defined — leaving it alone"
46
+ return current
47
+ end
48
+ container.send(:remove_const, name)
49
+ end
50
+
51
+ container.const_set(name, value)
52
+ GENERATED[[container, name]] = value
53
+ value
54
+ end
55
+ end
56
+ end
57
+
58
+ require_relative "doors/handle"
59
+ require_relative "doors/ruby_door"
60
+ require_relative "doors/command_request"
61
+ require_relative "doors/json_door"
@@ -2,31 +2,10 @@ require "digest"
2
2
 
3
3
  module Hecks
4
4
  module EmbryonautBluebook
5
- # What a vendored package records about the release it came from:
6
- # `vendor/embryonaut_bluebooks/<name>/bluebook.lock`.
7
- #
8
- # ## File format
9
- #
10
- # One `key: value` line each for `package`, `version`, `tag`, `commit`
11
- # and `digest`, then one `shape: <Domain> <label>` line per domain:
12
- #
13
- # package: payments
14
- # version: 1.2.0
15
- # tag: payments-v1.2.0
16
- # commit: <full commit id the tag points at>
17
- # digest: <sha256 of the vendored *.bluebook files>
18
- # shape: Payments d33c23
19
- #
20
- # The digest is the sha256 of the `<sha256> <name>` lines of every
21
- # top-level `*.bluebook` file, sorted by name. The source repository's own
22
- # `bin/bluebook_digest` prints the same number for the tagged release, which
23
- # is how a vendored copy is proven to be exactly what it claims to be.
5
+ # The digest here must match the source repo's own bin/bluebook_digest
6
+ # output for the same tag, or a vendored copy cannot be trusted.
24
7
  Lock = Struct.new(:package, :version, :tag, :commit, :digest, :shape, keyword_init: true) do
25
- # Computes the content digest of a directory's `*.bluebook` files.
26
- #
27
- # @param dir [String] the directory to measure
28
- # @return [String, nil] 64 lowercase hex characters, nil when the directory holds
29
- # no bluebook file
8
+ # Sorted by name so the digest never depends on directory listing order.
30
9
  def self.digest_of(dir)
31
10
  names = Dir.children(dir).select { |name| name.end_with?(".bluebook") }.sort
32
11
  return nil if names.empty?
@@ -35,20 +14,12 @@ module Hecks
35
14
  Digest::SHA256.hexdigest(lines.join)
36
15
  end
37
16
 
38
- # Reads a lock file.
39
- #
40
- # @param path [String] the `bluebook.lock` path
41
- # @return [Lock, nil] the parsed lock, nil when the file does not exist
42
17
  def self.read(path)
43
18
  return nil unless File.file?(path)
44
19
 
45
20
  parse(File.read(path))
46
21
  end
47
22
 
48
- # Parses a lock's text.
49
- #
50
- # @param text [String] the file's content
51
- # @return [Lock] the lock, with `shape` as an Array of lines (empty when none)
52
23
  def self.parse(text)
53
24
  fields = { shape: [] }
54
25
  text.each_line do |line|
@@ -60,9 +31,6 @@ module Hecks
60
31
  new(**fields.slice(*members))
61
32
  end
62
33
 
63
- # Renders the lock as the text written to `bluebook.lock`.
64
- #
65
- # @return [String] the lines described above, newline terminated
66
34
  def to_s
67
35
  header = %i[package version tag commit digest].map { |key| "#{key}: #{self[key]}\n" }
68
36
  (header + Array(shape).map { |line| "shape: #{line}\n" }).join
@@ -2,21 +2,10 @@ require_relative "../ports/persistence/plugins/era/storage_shape"
2
2
 
3
3
  module Hecks
4
4
  module EmbryonautBluebook
5
- # The storage-shape labels of a directory of `*.bluebook` files.
6
- #
7
- # A label is what `PostgresEra` mints an era from, so a vendored package
8
- # whose label changed is one whose next deploy mints a new era. This reads
9
- # the files the way the era guard reads a held era's text: parse only, no
10
- # boot, no wiring, no database, each file loaded into a scratch registry.
5
+ # A label change here means a vendored package's next deploy mints a new PostgresEra.
11
6
  module Shape
12
7
  module_function
13
8
 
14
- # Measures every domain a directory's bluebook files declare.
15
- #
16
- # @param dir [String] a directory holding `*.bluebook` files
17
- # @return [Array<String>] one `"<Domain> <label>"` line per domain, sorted by domain name
18
- # @raise [Vendoring::Error] if the directory holds no bluebook file, or the files do
19
- # not load, the refusal a boot would raise
20
9
  def labels(dir)
21
10
  files = Dir[File.join(dir, "*.bluebook")]
22
11
  raise Vendoring::Error, "no *.bluebook files in #{dir}" if files.empty?
@@ -26,11 +15,6 @@ module Hecks
26
15
  end
27
16
  end
28
17
 
29
- # Loads bluebook files into a registry of their own.
30
- #
31
- # @param files [Array<String>] absolute bluebook file paths, in load order
32
- # @return [Runtime::Registry] the scratch registry holding what the files declared
33
- # @raise [Vendoring::Error] if any file fails to load
34
18
  def load_all(files)
35
19
  scratch = Runtime::Registry.new
36
20
  library = Ports::Loading.bootstrap
@@ -5,32 +5,8 @@ require_relative "shape"
5
5
 
6
6
  module Hecks
7
7
  module EmbryonautBluebook
8
- # Vendors one package of the bluebook registry into a consuming project.
9
- #
10
- # ## What it does
11
- #
12
- # Pins the package's top-level `bluebook/*.bluebook` files from one commit
13
- # of a local source repository into
14
- # `<root>/vendor/embryonaut_bluebooks/<name>/bluebook/`, where `load!`
15
- # resolves them. Only bluebook files are taken: a `.hecksagon`, `.port` or
16
- # `.adapter` is a wiring decision for whoever deploys, never part of the
17
- # vendored package.
18
- #
19
- # ## Releases and bare commits
20
- #
21
- # The source repository tags each release `<name>-v<X.Y.Z>` on a commit
22
- # whose `<name>/bluebook.yml` says that version. A release pin (`ref` nil for
23
- # the newest tag, `"1.2.0"`, or the tag name) also writes `bluebook.lock`,
24
- # which records version, tag, commit, content digest and storage shape, and
25
- # holds two refusals, because a production project is bound to `PostgresEra`:
26
- #
27
- # - a version lower than the vendored one, unless `allow_downgrade`;
28
- # - a storage-shape change that does not raise the version by at least a
29
- # minor, so a new era shows in the version number and not only in a hash.
30
- #
31
- # Any other commit-ish pins that commit and writes only the marker, with no
32
- # lock and no version checks. Either way nothing on disk changes when a
33
- # pin is refused or its files do not load.
8
+ # Pins a package's `bluebook/*.bluebook` files from a source repo commit; a
9
+ # release pin also refuses a downgrade or an era-breaking storage-shape change.
34
10
  class Vendor
35
11
  # A release version, `X.Y.Z`.
36
12
  VERSION = /\A\d+\.\d+\.\d+\z/
@@ -38,33 +14,17 @@ module Hecks
38
14
  # A package name is a directory name and a bluebook name stem.
39
15
  NAME = /\A[a-z][a-z0-9_]*\z/
40
16
 
41
- # What a vendoring changed.
42
- #
43
- # @!attribute [r] previous_version
44
- # @return [String, nil] the version recorded before, nil when there was none
45
- # @!attribute [r] previous_shape
46
- # @return [Array<String>, nil] the shape lines measured before, nil when there was
47
- # no earlier copy
17
+ # What a vendoring changed; previous_version/previous_shape are nil when
18
+ # there was no earlier vendored copy.
48
19
  Result = Struct.new(:package, :commit, :version, :tag, :digest, :shape,
49
20
  :previous_version, :previous_shape, :dir, keyword_init: true) do
50
- # Says whether this was a release pin, which writes a lock.
51
- #
52
- # @return [Boolean] true for a release, false for a bare commit
53
21
  def release? = !tag.nil?
54
22
 
55
- # Says whether the storage shape moved since the earlier copy.
56
- #
57
- # @return [Boolean] true when an earlier copy existed and its shape differs
58
23
  def shape_changed? = !previous_shape.nil? && previous_shape != shape
59
24
  end
60
25
 
61
- # @param name [String, Symbol] the package's directory name, such as `"payments"`
62
- # @param from [String] path of the local source repository
63
- # @param ref [String, nil] `X.Y.Z`, a release tag name, any commit-ish, or nil for the
64
- # newest release
65
- # @param root [String] the consuming project's root
66
- # @param allow_downgrade [Boolean] whether a release older than the vendored one is allowed
67
- # @raise [Vendoring::Error] if the name is not a plain package name
26
+ # `ref` accepts `X.Y.Z`, a release tag name, any commit-ish, or nil for
27
+ # the newest release.
68
28
  def initialize(name, from:, root:, ref: nil, allow_downgrade: false)
69
29
  @name = name.to_s
70
30
  raise Vendoring::Error, "#{name.inspect} is not a package name" unless @name.match?(NAME)
@@ -76,10 +36,6 @@ module Hecks
76
36
  end
77
37
 
78
38
  # Pins the package and reports what changed.
79
- #
80
- # @return [Result] the commit, version and shape now vendored
81
- # @raise [Vendoring::Error] if the release or commit is not found, the tagged commit
82
- # disagrees with its own version, the files do not load, or a refusal above applies
83
39
  def call
84
40
  tag, version = release
85
41
  previous_version, previous_shape = existing
@@ -99,9 +55,8 @@ module Hecks
99
55
 
100
56
  def package_dir = File.join(@root, "vendor", "embryonaut_bluebooks", @name)
101
57
 
102
- # Resolves what `ref` asks for into a release tag and its version.
103
- #
104
- # @return [Array(String, String), nil] tag and version for a release, nil for a bare commit
58
+ # Resolves what `ref` asks for into a release tag and its version, or nil
59
+ # for a bare commit.
105
60
  def release
106
61
  tag = release_tag
107
62
  return nil unless tag
@@ -3,21 +3,10 @@ require_relative "vendor"
3
3
 
4
4
  module Hecks
5
5
  module EmbryonautBluebook
6
- # The command line behind `bin/vendor_bluebook`.
6
+ # The command line behind `hecks vendor`; lives in the gem so a
7
+ # consuming project reaches it through its own bundle, no script to copy.
7
8
  #
8
- # It lives in the gem, not in a script, so a consuming project reaches it
9
- # through its own bundle without a copy of the script:
10
- #
11
- # bundle exec ruby -rhecks \
12
- # -e 'exit Hecks::EmbryonautBluebook::VendorCli.run(ARGV)' payments@1.2.0
13
- #
14
- # ## Usage
15
- #
16
- # vendor_bluebook <package>[@<version-or-commit>] [--from <path>] [--root <path>]
17
- #
18
- # `--from` defaults to `$EMBRYONAUT_BLUEBOOKS_SRC` and `--root` to the current
19
- # directory. `ALLOW_DOWNGRADE=1` in the environment permits a release older
20
- # than the vendored one.
9
+ # vendor_bluebook <package>[@<version-or-commit>] [--from path] [--root path]
21
10
  module VendorCli
22
11
  USAGE = "usage: vendor_bluebook <package>[@<version-or-commit>] [--from PATH] [--root PATH]".freeze
23
12
 
@@ -44,11 +33,7 @@ module Hecks
44
33
  1
45
34
  end
46
35
 
47
- # Reads the options into a hash and picks out the package argument.
48
- #
49
- # @param argv [Array<String>] the command-line arguments
50
- # @param options [Hash{Symbol => String}] receives `:from` and `:root` when given
51
- # @return [String, nil] the one positional argument, nil unless exactly one was given
36
+ # nil unless argv held exactly one positional argument.
52
37
  def self.parse(argv, options)
53
38
  parser = OptionParser.new
54
39
  parser.on("--from PATH") { |path| options[:from] = path }
@@ -1,75 +1,6 @@
1
1
  module Hecks
2
- # A vendored, external bluebook.
3
- #
4
- # ## What it is
5
- #
6
- # Same shape as Framework (framework.rb), for members that don't ship
7
- # inside hecks's own lib/ at all: a separate, independently-versioned
8
- # package (github.com/chrisyoung/embryonaut_bluebooks) that a consuming
9
- # project vendors into its own checkout, the same way a project already
10
- # vendors hecks itself (bin/vendor_hecks, vendor/hecks/).
11
- #
12
- # ## Recovered, not rebuilt
13
- #
14
- # This module and its `uses_embryonaut_bluebook`
15
- # DSL word (hecksagon_builder.rb) were built on a prior commit of this
16
- # repo (933d1dd), vendored out to a real consumer (a client site's domain,
17
- # for embryonaut_bluebooks/payments), and then lost from this repo's own
18
- # reachable history — a hard reset or rebase left no branch containing
19
- # that commit. The consumer's vendor snapshot (a `git archive` of that
20
- # commit, committed into their repo) was the only surviving copy; this
21
- # file is ported forward from it, checked against current `main`'s own
22
- # conventions rather than copied wholesale, since the two trees had
23
- # otherwise diverged for weeks in both directions.
24
- #
25
- # ## Resolution
26
- #
27
- # Resolved from the consuming registry's own root, not this gem's
28
- # __dir__ — Framework::ROOT can be a fixed, `__dir__`-relative constant
29
- # because framework members ship inside this gem; an embryonaut bluebook
30
- # ships inside the consumer's own checkout instead, at
31
- # `<registry.root>/vendor/embryonaut_bluebooks/<name>/bluebook/`. There
32
- # is no fixed answer until a registry (and its root) actually exists, so
33
- # this resolves lazily, per call — the same reason `uses_framework`
34
- # itself only runs at hecksagon-build time, when a real registry is
35
- # current.
36
- #
37
- # ## Load order
38
- #
39
- # Every `.bluebook` file in the package, sorted — not just one. Unlike a
40
- # framework member (one file, named by its own stem), a vendored package
41
- # can span several bluebook files that reopen the same `Hecks.bluebook`
42
- # (embryonaut_bluebooks/payments/bluebook/{payment,payments,policies}
43
- # .bluebook all reopen "Payments"). Load order matters — policies
44
- # .bluebook names `Payment::Succeed` and needs the aggregate already
45
- # built — and a plain alphabetical sort already gives the right order:
46
- # payment < payments < policies, the same reason that package's own
47
- # files are named to fall in that order in the first place.
48
- #
49
- # ## Scope
50
- #
51
- # Only the bluebook files — same restriction Framework draws, same
52
- # reason: a `.hecksagon`/`.port`/`.adapter` is a wiring decision
53
- # (persistence, which processor adapter is bound) that belongs to
54
- # whoever is deploying, never baked into the vendored package itself.
55
- # embryonaut_bluebooks/payments ships its own mock `.hecksagon` for its
56
- # own spec suite; a consumer declares its own separate
57
- # `Hecks.hecksagon "Payments" do ... end` to bind real storage/adapters
58
- # — see Framework's own comment for the fuller reasoning, identical here.
59
- #
60
- # ## Idempotency
61
- #
62
- # Idempotent the same way `Framework.load!` is — checked against the
63
- # bluebook this package actually declares (`Naming.pascal("payments")`
64
- # => "Payments"), not a separate ledger. A vendored package's directory
65
- # name and its declared `Hecks.bluebook` name are the one convention
66
- # this reuses from Framework rather than reinventing.
67
- #
68
- # ## Vendoring
69
- #
70
- # `vendor!` is the other direction: it pins a package from a local checkout
71
- # of the registry into a consuming project's own `vendor/` tree, and is the
72
- # one implementation behind `bin/vendor_bluebook` (see Vendoring and Vendor).
2
+ # A vendored, external bluebook: same shape as Framework, but for a
3
+ # package that ships outside hecks's own lib/ (see .load! and .vendor!).
73
4
  module EmbryonautBluebook
74
5
  autoload :Lock, File.join(__dir__, "embryonaut_bluebook/lock")
75
6
  autoload :Shape, File.join(__dir__, "embryonaut_bluebook/shape")
@@ -100,9 +31,11 @@ module Hecks
100
31
  if files.empty?
101
32
  raise Runtime::WiringError,
102
33
  "no vendored embryonaut bluebook named #{name.inspect} at #{dir} — " \
103
- "vendor it with bin/vendor_bluebook #{name}"
34
+ "vendor it with hecks vendor #{name}"
104
35
  end
105
36
 
37
+ # Loaded in the glob's alphabetical order; a package with several
38
+ # files that reopen the same bluebook is named to rely on that.
106
39
  files.each { |file| Kernel.load(file) }
107
40
  end
108
41
 
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hecks
4
+ # The grep-based gate that keeps the query engines agreeing on what a comparator means.
5
+ #
6
+ # It fails when an engine re-grows its own comparator dispatch, or when a declared comparator
7
+ # lacks a shared `Comparison` case or a cross-engine agreement spec. Every declared comparator
8
+ # is read from `Hecks::Vocabulary`, as `Common::COMPARATORS` is: one live source, no copied list.
9
+ module EngineAgreement
10
+ # The engine files that must route every comparator through `Comparison.holds?`.
11
+ ENGINE_FILES = {
12
+ "in-memory port (Memory/Heki-backed aggregate queries)" => "lib/hecks/ports/query/in_memory.rb",
13
+ "reference interpreter (entity/sub-list queries, no-native-hook fallback)" => "lib/hecks/runtime/query_interpreter.rb"
14
+ }.freeze
15
+
16
+ # Where the shared comparison logic lives.
17
+ SHARED_COMPARISON_FILE = "lib/hecks/query_specification/common/comparison.rb"
18
+
19
+ # Specs that put each comparator in front of both engines. `none_in_state` needs a second
20
+ # aggregate and a registry, so the two dedicated growth specs cover it instead.
21
+ AGREEMENT_SPEC_FILES = %w[
22
+ spec/adapters/query_agreement_spec.rb
23
+ spec/query_none_in_state_aggregate_level_growth_spec.rb
24
+ spec/query_none_in_state_growth_spec.rb
25
+ ].freeze
26
+
27
+ # What a check found.
28
+ #
29
+ # @!attribute [r] declared
30
+ # @return [Array<String>] the comparators the vocabulary declares
31
+ # @!attribute [r] problems
32
+ # @return [Array<String>] each disagreement, in words; empty when the engines agree
33
+ Finding = Struct.new(:declared, :problems)
34
+
35
+ module_function
36
+
37
+ # Checks the engines against the vocabulary.
38
+ #
39
+ # @param root [String] the checkout whose files are read
40
+ # @return [Finding] the declared comparators and every problem found
41
+ def check(root:)
42
+ require "hecks"
43
+ declared = Hecks::Vocabulary.symbols("QueryComparator").map(&:to_s)
44
+ if declared.empty?
45
+ return Finding.new(declared, ["Vocabulary::QueryComparator declared no comparators at all — " \
46
+ "vocabulary.bluebook failed to register, or Hecks::Vocabulary changed " \
47
+ "shape. Refusing to report a clean pass."])
48
+ end
49
+
50
+ problems = vocabulary_problems(declared) + engine_problems(root, declared) + shared_problems(root, declared)
51
+ Finding.new(declared, problems)
52
+ end
53
+
54
+ # @param declared [Array<String>] the declared comparators
55
+ # @return [Array<String>] a problem when the language and the runtime table disagree
56
+ def vocabulary_problems(declared)
57
+ runtime = Hecks::QuerySpecification::Common::COMPARATORS.map(&:to_s)
58
+ differ = (declared - runtime) | (runtime - declared)
59
+ return [] if differ.empty?
60
+
61
+ ["Vocabulary::QueryComparator #{declared.sort.inspect} and " \
62
+ "QuerySpecification::Common::COMPARATORS #{runtime.sort.inspect} disagree " \
63
+ "(only in one: #{differ.sort.inspect}) — the language and the runtime table it drives " \
64
+ "have drifted apart."]
65
+ end
66
+
67
+ # @param root [String] the checkout
68
+ # @param declared [Array<String>] the declared comparators
69
+ # @return [Array<String>] a problem for each engine that lost `Comparison.holds?` or grew a case
70
+ def engine_problems(root, declared)
71
+ ENGINE_FILES.flat_map do |label, relative|
72
+ source = File.read(File.join(root, relative))
73
+ found = []
74
+ unless source =~ /Comparison\.holds\?/
75
+ found << "#{relative} (#{label}) no longer calls Comparison.holds? at all — " \
76
+ "has it grown its own comparator dispatch again?"
77
+ end
78
+ declared.each do |comparator|
79
+ escaped = Regexp.escape(comparator)
80
+ next unless source =~ /when\s+"#{escaped}"/ || source =~ /when\s+:#{escaped}\b/
81
+
82
+ found << "#{relative} (#{label}) has its own `when #{comparator.inspect}` — comparator logic " \
83
+ "belongs ONLY in #{SHARED_COMPARISON_FILE}, not re-implemented per engine."
84
+ end
85
+ found
86
+ end
87
+ end
88
+
89
+ # @param root [String] the checkout
90
+ # @param declared [Array<String>] the declared comparators
91
+ # @return [Array<String>] a problem for a comparator with no shared case, or no agreement spec
92
+ def shared_problems(root, declared)
93
+ comparison = File.read(File.join(root, SHARED_COMPARISON_FILE))
94
+ specs = AGREEMENT_SPEC_FILES.map { |path| File.read(File.join(root, path)) }
95
+ missing_case = declared.reject { |comparator| comparison =~ /when\s+"#{Regexp.escape(comparator)}"/ }
96
+ missing_spec = declared.reject { |comparator| specs.any? { |text| mentions_operator?(text, comparator) } }
97
+
98
+ [missing_case_problem(missing_case), missing_spec_problem(missing_spec)].compact
99
+ end
100
+
101
+ # @param missing [Array<String>] comparators with no `when` case in the shared file
102
+ # @return [String, nil] the problem, or nil when none is missing
103
+ def missing_case_problem(missing)
104
+ return nil if missing.empty?
105
+
106
+ "#{SHARED_COMPARISON_FILE} has no `when` case for: #{missing.sort.inspect} — " \
107
+ "a declared comparator with no shared implementation falls to Comparison.holds?'s own `else`, " \
108
+ "which RAISES (by design), but only the first time anything actually asks for it at runtime. " \
109
+ "Add a `when #{missing.first.inspect} then ...` case before shipping this comparator."
110
+ end
111
+
112
+ # @param missing [Array<String>] comparators no agreement spec exercises
113
+ # @return [String, nil] the problem, or nil when none is missing
114
+ def missing_spec_problem(missing)
115
+ return nil if missing.empty?
116
+
117
+ "no example in #{AGREEMENT_SPEC_FILES.inspect} exercises: #{missing.sort.inspect} — " \
118
+ "a comparator with a case but no cross-engine spec has never actually had both engines asked " \
119
+ "the same question. Add a declared query using it, with a hand-computed expected id list, to one " \
120
+ "of those files (see spec/adapters/query_agreement_spec.rb's own header for why a hand-computed " \
121
+ "oracle, not mere pairwise agreement, is the standard)."
122
+ end
123
+
124
+ # @param text [String] a spec's source
125
+ # @param comparator [String] the comparator name, such as `"eq"`
126
+ # @return [Boolean] whether the spec puts the comparator in front of an engine
127
+ def mentions_operator?(text, comparator)
128
+ # Explicit form: the comparator as a bare hash key, bounded so `in:` cannot match
129
+ # mid-identifier.
130
+ return true if text =~ /(?<![A-Za-z0-9_])#{Regexp.escape(comparator)}(?![A-Za-z0-9_])\s*:/
131
+
132
+ # `eq` is normally implicit (`where(status: "open")`), so an example description naming it
133
+ # counts; no other comparator gets that leniency.
134
+ return false unless comparator == "eq"
135
+
136
+ text =~ /\b(?:it|describe)\s+"[^"]*\beq\b[^"]*"/i ? true : false
137
+ end
138
+
139
+ # @param finding [Finding] what a check found
140
+ # @return [String] the clean-pass line
141
+ def clean_line(finding)
142
+ "check_engine_agreement: #{finding.declared.size} declared comparator(s) " \
143
+ "(#{finding.declared.sort.join(', ')}) — every one has a shared Comparison case, a cross-engine " \
144
+ "agreement spec, and both engine files still route through Comparison.holds? alone. 0 problems."
145
+ end
146
+
147
+ # @param finding [Finding] what a check found
148
+ # @return [String] every problem, numbered, with where the mechanism is explained
149
+ def problem_lines(finding)
150
+ numbered = finding.problems.each_with_index.map { |problem, index| " #{index + 1}. #{problem}\n\n" }
151
+ ["check_engine_agreement: #{finding.problems.size} problem(s) found:\n\n", *numbered,
152
+ "See lib/hecks/query_specification/common/comparison.rb's own header for what this mechanism " \
153
+ "replaced and why a grep-based gate exists here at all."].join
154
+ end
155
+ end
156
+ end
data/lib/hecks/facade.rb CHANGED
@@ -1,59 +1,31 @@
1
- module Hecks
2
- # The class-free public surface — see facade/surface.rb for the door and
3
- # facade/handle.rb for the record in hand. Installed per boot by
4
- # `Runtime::Loader.bind_runtime`.
5
- module Facade
6
- end
1
+ # The deprecated alias shim: `Hecks::Facade` is now `Hecks::Doors` and `Doors::Surface` is
2
+ # `Doors::RubyDoor`. Both old constants still resolve and warn; they are removed in
3
+ # `Hecks::Doors::REMOVAL`.
4
+ require_relative "doors"
7
5
 
8
- # The one careful way to put something at top level.
6
+ # The root namespace; this file holds only the deprecated aliases.
7
+ module Hecks
8
+ # Resolves the constants that now live in `Doors` under their old names, warning on each use.
9
9
  #
10
- # Overwrites only what it itself installed (tracked in `GENERATED`), refuses —
11
- # with a warning, never a raise — to clobber a constant belonging to user
12
- # code or the stdlib. Which is why a chapter named `Set` never becomes a
13
- # constant, and why `Registry` keeps its own table of chapters rather than
14
- # trusting Ruby's. Each re-install replaces the previous boot's entry, so
15
- # what `GENERATED` retains is one small facade module per name, not a graph
16
- # per boot.
17
- module Namespace
18
- # Not frozen — a real registry, mutated below
19
- # (`GENERATED[[container, name]] = value`). False positive for
20
- # Style/MutableConstant.
21
- # rubocop:disable-next Style/MutableConstant
22
- GENERATED = {}
23
-
24
- module_function
10
+ # Extended onto `Hecks` and `Hecks::Doors`, ahead of `Module#const_missing`.
11
+ module DoorsAliases
12
+ # Old constant name mapped to the new one, per namespace that carried it.
13
+ RENAMED = { Hecks => { Facade: "Hecks::Doors" }, Hecks::Doors => { Surface: "Hecks::Doors::RubyDoor" } }.freeze
25
14
 
26
- # Sets `container::name` to `value`, replacing only a constant this module installed
27
- # itself and leaving any other existing constant in place with a warning.
15
+ # Answers a renamed constant with its replacement and a warning; anything else
16
+ # goes to the next `const_missing`.
28
17
  #
29
- # @param container [Module] the namespace to define the constant in; every caller in
30
- # this repository passes `Object`
31
- # @param name [String, Symbol] the constant name, such as a chapter or aggregate name
32
- # @param value [Module] the facade module to install under that name
33
- # @return [Object] `value` when it was installed; otherwise the constant already
34
- # defined under `name`, which this module does not own and did not replace
35
- # @raise [NameError] if `name` is not a valid constant name (raised by
36
- # `const_defined?`)
37
- def install(container, name, value)
38
- name = name.to_s
18
+ # @param name [Symbol] the missing constant
19
+ # @return [Module] the replacement module
20
+ def const_missing(name)
21
+ target = RENAMED.fetch(self, {})[name]
22
+ return super unless target
39
23
 
40
- if container.const_defined?(name, false)
41
- current = container.const_get(name)
42
- unless GENERATED[[container, name]].equal?(current)
43
- warn "[hecks] #{name} is already defined — leaving it alone"
44
- return current
45
- end
46
- container.send(:remove_const, name)
47
- end
48
-
49
- container.const_set(name, value)
50
- GENERATED[[container, name]] = value
51
- value
24
+ warn "[hecks] #{self}::#{name} is deprecated and is removed in #{Hecks::Doors::REMOVAL}; use #{target}"
25
+ Object.const_get(target)
52
26
  end
53
27
  end
54
- end
55
28
 
56
- require_relative "facade/handle"
57
- require_relative "facade/surface"
58
- require_relative "facade/command_request"
59
- require_relative "facade/json_door"
29
+ extend DoorsAliases
30
+ Doors.extend(DoorsAliases)
31
+ end