hecks 2.8.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (886) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +50 -7
  3. data/lib/hecks/adapters/driven/claude_code.rb +4 -104
  4. data/lib/hecks/adapters/driven/d1.rb +44 -237
  5. data/lib/hecks/adapters/driven/folder.rb +17 -76
  6. data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
  7. data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
  8. data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
  9. data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
  10. data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
  11. data/lib/hecks/adapters/driven/heki.rb +13 -42
  12. data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
  13. data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
  14. data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
  15. data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
  16. data/lib/hecks/adapters/driven/lambda.rb +10 -84
  17. data/lib/hecks/adapters/driven/local_storage.rb +5 -40
  18. data/lib/hecks/adapters/driven/memory.rb +32 -100
  19. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
  20. data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
  21. data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
  22. data/lib/hecks/adapters/driven/postgres/reconnect.rb +10 -32
  23. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
  24. data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
  25. data/lib/hecks/adapters/driven/postgres.rb +149 -136
  26. data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
  27. data/lib/hecks/adapters/driven/prism.rb +48 -38
  28. data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
  29. data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
  30. data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
  31. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
  32. data/lib/hecks/adapters/driven/sqlite.rb +128 -65
  33. data/lib/hecks/adapters/driven/tenant_provisioner.rb +76 -62
  34. data/lib/hecks/adapters/driven.rb +5 -36
  35. data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
  36. data/lib/hecks/behaviors/dsl.rb +7 -25
  37. data/lib/hecks/behaviors/expectations.rb +32 -142
  38. data/lib/hecks/behaviors/ir.rb +7 -20
  39. data/lib/hecks/behaviors/rspec.rb +6 -17
  40. data/lib/hecks/behaviors/runner.rb +10 -34
  41. data/lib/hecks/behaviors.rb +4 -8
  42. data/lib/hecks/bench/cli.rb +62 -0
  43. data/lib/hecks/bench/environment.rb +71 -0
  44. data/lib/hecks/bench/postgres_probe.rb +30 -0
  45. data/lib/hecks/bench/report.rb +76 -0
  46. data/lib/hecks/bench/ruby_runner.rb +93 -0
  47. data/lib/hecks/bench/run.rb +55 -0
  48. data/lib/hecks/bench/rust_runner.rb +101 -0
  49. data/lib/hecks/bench/stats.rb +46 -0
  50. data/lib/hecks/bench/suite.rb +98 -0
  51. data/lib/hecks/bench/workload.rb +89 -0
  52. data/lib/hecks/bench.rb +17 -0
  53. data/lib/hecks/bluebook/aggregate.rb +9 -75
  54. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
  55. data/lib/hecks/bluebook/assembly/build.rb +4 -15
  56. data/lib/hecks/bluebook/assembly/contract.rb +15 -136
  57. data/lib/hecks/bluebook/assembly/contracts.rb +56 -174
  58. data/lib/hecks/bluebook/assembly/marks.rb +31 -223
  59. data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
  60. data/lib/hecks/bluebook/assembly.rb +6 -45
  61. data/lib/hecks/bluebook/attribute.rb +12 -61
  62. data/lib/hecks/bluebook/behaviour/aggregate.rb +39 -39
  63. data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
  64. data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
  65. data/lib/hecks/bluebook/behaviour/command.rb +14 -66
  66. data/lib/hecks/bluebook/behaviour/domain_port.rb +11 -20
  67. data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
  68. data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
  69. data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
  70. data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
  71. data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
  72. data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
  73. data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
  74. data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
  75. data/lib/hecks/bluebook/capabilities.rb +17 -49
  76. data/lib/hecks/bluebook/chapter.rb +16 -50
  77. data/lib/hecks/bluebook/command.rb +23 -81
  78. data/lib/hecks/bluebook/domain_port.rb +49 -67
  79. data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
  80. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
  81. data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
  82. data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
  83. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +96 -708
  84. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +63 -169
  85. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +3 -1
  86. data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
  87. data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
  88. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +42 -89
  89. data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
  90. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
  91. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +148 -197
  92. data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
  93. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
  94. data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
  95. data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
  96. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
  97. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
  98. data/lib/hecks/bluebook/dsl/query_builder.rb +38 -43
  99. data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
  100. data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
  101. data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
  102. data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
  103. data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
  104. data/lib/hecks/bluebook/dsl/world_builder.rb +46 -111
  105. data/lib/hecks/bluebook/entity.rb +13 -71
  106. data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
  107. data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
  108. data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
  109. data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
  110. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
  111. data/lib/hecks/bluebook/expression/resolver.rb +39 -661
  112. data/lib/hecks/bluebook/hexagon.rb +18 -33
  113. data/lib/hecks/bluebook/lifecycle.rb +5 -16
  114. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
  115. data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
  116. data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
  117. data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
  118. data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
  119. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -176
  120. data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
  121. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -306
  122. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
  123. data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
  124. data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
  125. data/lib/hecks/bluebook/meta_validator.rb +87 -352
  126. data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
  127. data/lib/hecks/bluebook/model_check.rb +122 -596
  128. data/lib/hecks/bluebook/pattern_subset.rb +49 -69
  129. data/lib/hecks/bluebook/process_manager.rb +13 -83
  130. data/lib/hecks/bluebook/project_loader.rb +3 -39
  131. data/lib/hecks/bluebook/project_register.rb +12 -60
  132. data/lib/hecks/bluebook/query.rb +27 -51
  133. data/lib/hecks/bluebook/read_model.rb +57 -81
  134. data/lib/hecks/bluebook/reference.rb +7 -41
  135. data/lib/hecks/bluebook/smoke_test.rb +9 -99
  136. data/lib/hecks/bluebook/synthesizer.rb +13 -62
  137. data/lib/hecks/bluebook/translation.rb +26 -62
  138. data/lib/hecks/bluebook/value_object.rb +11 -36
  139. data/lib/hecks/bluebook.rb +5 -22
  140. data/lib/hecks/cache_dir.rb +4 -23
  141. data/lib/hecks/canonical_json.rb +30 -0
  142. data/lib/hecks/chapters.rb +102 -0
  143. data/lib/hecks/cli/behaviors.rb +61 -0
  144. data/lib/hecks/cli/canonicalise.rb +25 -0
  145. data/lib/hecks/cli/check_engine_agreement.rb +32 -0
  146. data/lib/hecks/cli/check_era.rb +88 -0
  147. data/lib/hecks/cli/console.rb +66 -0
  148. data/lib/hecks/cli/deploy_template_diff.rb +40 -0
  149. data/lib/hecks/cli/doc_coverage.rb +32 -0
  150. data/lib/hecks/cli/document.rb +5 -23
  151. data/lib/hecks/cli/expression_projection.rb +41 -0
  152. data/lib/hecks/cli/follow.rb +88 -0
  153. data/lib/hecks/cli/history.rb +44 -0
  154. data/lib/hecks/cli/ir.rb +4 -6
  155. data/lib/hecks/cli/mcp.rb +5 -6
  156. data/lib/hecks/cli/model_check.rb +24 -88
  157. data/lib/hecks/cli/pattern_cases.rb +47 -0
  158. data/lib/hecks/cli/present.rb +39 -0
  159. data/lib/hecks/cli/project_cli.rb +223 -64
  160. data/lib/hecks/cli/project_diagrams.rb +4 -10
  161. data/lib/hecks/cli/project_glossary.rb +44 -0
  162. data/lib/hecks/cli/reference.rb +46 -0
  163. data/lib/hecks/cli/refresh_projections.rb +44 -0
  164. data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +150 -0
  165. data/lib/hecks/cli/release.rb +70 -0
  166. data/lib/hecks/cli/release_gem.rb +59 -0
  167. data/lib/hecks/cli/rspec_io_parallel_files.rb +137 -0
  168. data/lib/hecks/cli/rspec_shard_files.rb +66 -0
  169. data/lib/hecks/cli/run.rb +15 -61
  170. data/lib/hecks/cli/seed_semantics_corpus.rb +71 -0
  171. data/lib/hecks/cli/serve_query_ir_mcp.rb +30 -0
  172. data/lib/hecks/cli/shape.rb +70 -0
  173. data/lib/hecks/cli/smoke_http.rb +230 -0
  174. data/lib/hecks/cli/smoke_test.rb +7 -19
  175. data/lib/hecks/cli/spec_example.rb +27 -0
  176. data/lib/hecks/cli/statements.rb +32 -0
  177. data/lib/hecks/cli/stores.rb +4 -6
  178. data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
  179. data/lib/hecks/cli.rb +216 -73
  180. data/lib/hecks/codemod.rb +324 -0
  181. data/lib/hecks/construct.rb +8 -34
  182. data/lib/hecks/corpus.rb +423 -0
  183. data/lib/hecks/deploy/bluebook/deploy.bluebook +617 -158
  184. data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -11
  185. data/lib/hecks/deploy/oidc.json +82 -2
  186. data/lib/hecks/doc/reference.rb +351 -0
  187. data/lib/hecks/doors/cli_door.rb +196 -0
  188. data/lib/hecks/doors/cli_runner.rb +297 -0
  189. data/lib/hecks/{facade → doors}/command_request.rb +14 -34
  190. data/lib/hecks/doors/handle.rb +206 -0
  191. data/lib/hecks/doors/json_door.rb +132 -0
  192. data/lib/hecks/doors/launcher_options.rb +129 -0
  193. data/lib/hecks/{cli → doors}/mcp_door.rb +25 -120
  194. data/lib/hecks/doors/mcp_door_scope.rb +97 -0
  195. data/lib/hecks/doors/ruby_door/aggregate_door.rb +162 -0
  196. data/lib/hecks/doors/ruby_door/chapter.rb +72 -0
  197. data/lib/hecks/doors/ruby_door.rb +77 -0
  198. data/lib/hecks/doors.rb +61 -0
  199. data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
  200. data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
  201. data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
  202. data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
  203. data/lib/hecks/embryonaut_bluebook.rb +5 -72
  204. data/lib/hecks/engine_agreement.rb +156 -0
  205. data/lib/hecks/facade.rb +23 -51
  206. data/lib/hecks/forms/app.rb +21 -76
  207. data/lib/hecks/forms/banking_presentation.rb +50 -0
  208. data/lib/hecks/forms/command_form_renderer.rb +10 -29
  209. data/lib/hecks/forms/field_renderer.rb +17 -156
  210. data/lib/hecks/forms/field_shape.rb +31 -222
  211. data/lib/hecks/forms/html.rb +12 -47
  212. data/lib/hecks/forms/index_renderer.rb +1 -4
  213. data/lib/hecks/forms/page.rb +3 -9
  214. data/lib/hecks/forms/params.rb +14 -60
  215. data/lib/hecks/forms/port_argument.rb +2 -19
  216. data/lib/hecks/forms/query_form_renderer.rb +4 -79
  217. data/lib/hecks/forms/record_renderer.rb +8 -75
  218. data/lib/hecks/forms/record_table.rb +7 -50
  219. data/lib/hecks/forms/reference_options.rb +3 -30
  220. data/lib/hecks/forms/value_object_shape.rb +8 -35
  221. data/lib/hecks/forms.rb +5 -33
  222. data/lib/hecks/fqn.rb +5 -12
  223. data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
  224. data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
  225. data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
  226. data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
  227. data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
  228. data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
  229. data/lib/hecks/framework.rb +11 -80
  230. data/lib/hecks/freezer.rb +5 -39
  231. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +393 -0
  232. data/lib/hecks/fuzzing/combination_miner.rb +86 -0
  233. data/lib/hecks/fuzzing/concurrent_dispatch.rb +214 -0
  234. data/lib/hecks/fuzzing/coverage_campaign.rb +143 -0
  235. data/lib/hecks/fuzzing/differential.rb +156 -0
  236. data/lib/hecks/fuzzing/domain_generator.rb +615 -0
  237. data/lib/hecks/fuzzing/era_boundary.rb +71 -0
  238. data/lib/hecks/fuzzing/form_census.rb +136 -0
  239. data/lib/hecks/fuzzing/generated_domain_check.rb +93 -0
  240. data/lib/hecks/fuzzing/invalid_value_generator.rb +64 -0
  241. data/lib/hecks/fuzzing/isolated_boot.rb +301 -0
  242. data/lib/hecks/fuzzing/nondeterministic.rb +51 -0
  243. data/lib/hecks/fuzzing/outside_world.rb +45 -0
  244. data/lib/hecks/fuzzing/persistence_parity.rb +102 -0
  245. data/lib/hecks/fuzzing/properties/corrections.rb +88 -0
  246. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +314 -0
  247. data/lib/hecks/fuzzing/properties/guards.rb +190 -0
  248. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +300 -0
  249. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +93 -0
  250. data/lib/hecks/fuzzing/properties/outbox.rb +89 -0
  251. data/lib/hecks/fuzzing/properties/querying.rb +175 -0
  252. data/lib/hecks/fuzzing/properties.rb +162 -0
  253. data/lib/hecks/fuzzing/qa_settings.rb +123 -0
  254. data/lib/hecks/fuzzing/replay.rb +505 -0
  255. data/lib/hecks/fuzzing/rotation_priority.rb +48 -0
  256. data/lib/hecks/fuzzing/rust_gap_manifest.rb +108 -0
  257. data/lib/hecks/fuzzing/self_consistency.rb +339 -0
  258. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +385 -0
  259. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +132 -0
  260. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +95 -0
  261. data/lib/hecks/fuzzing/sequence_generator/picker.rb +77 -0
  262. data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +109 -0
  263. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +237 -0
  264. data/lib/hecks/fuzzing/sequence_generator.rb +189 -0
  265. data/lib/hecks/fuzzing/shrinker.rb +166 -0
  266. data/lib/hecks/fuzzing/structural_skips.rb +33 -0
  267. data/lib/hecks/fuzzing/sweep_depth.rb +43 -0
  268. data/lib/hecks/fuzzing/target_capabilities.rb +163 -0
  269. data/lib/hecks/fuzzing/value_generator.rb +216 -0
  270. data/lib/hecks/fuzzing.rb +23 -0
  271. data/lib/hecks/grammar/evolve.rb +336 -0
  272. data/lib/hecks/grammar/expression.bluebook +15 -40
  273. data/lib/hecks/grammar/translation.bluebook +3 -6
  274. data/lib/hecks/grammar.rb +16 -41
  275. data/lib/hecks/hecks/adapters/codebase/codemods.rb +45 -0
  276. data/lib/hecks/hecks/adapters/codebase/conformance.rb +71 -0
  277. data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +202 -0
  278. data/lib/hecks/hecks/adapters/codebase/gem_registry.rb +80 -0
  279. data/lib/hecks/hecks/adapters/codebase/kernel_tables.rb +54 -0
  280. data/lib/hecks/hecks/adapters/codebase/language.rb +240 -0
  281. data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +102 -0
  282. data/lib/hecks/hecks/adapters/codebase/publishing.rb +142 -0
  283. data/lib/hecks/hecks/adapters/codebase/regeneration.rb +67 -0
  284. data/lib/hecks/hecks/adapters/codebase/release_facts.rb +90 -0
  285. data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +83 -0
  286. data/lib/hecks/hecks/adapters/codebase/secret_vault.rb +36 -0
  287. data/lib/hecks/hecks/adapters/codebase/source_tree.adapter +7 -0
  288. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +189 -0
  289. data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +71 -0
  290. data/lib/hecks/hecks/adapters/codebase/style.rb +171 -0
  291. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +55 -0
  292. data/lib/hecks/hecks/adapters/codebase/test_suite.rb +165 -0
  293. data/lib/hecks/hecks/adapters/codebase/tree.rb +111 -0
  294. data/lib/hecks/hecks/adapters/console_capture.rb +79 -0
  295. data/lib/hecks/hecks/adapters/deploy_toolchain.adapter +7 -0
  296. data/lib/hecks/hecks/adapters/deploy_toolchain.rb +108 -0
  297. data/lib/hecks/hecks/adapters/git.adapter +7 -0
  298. data/lib/hecks/hecks/adapters/git.rb +102 -0
  299. data/lib/hecks/hecks/adapters/host_http.adapter +7 -0
  300. data/lib/hecks/hecks/adapters/host_http.rb +65 -0
  301. data/lib/hecks/hecks/adapters/in_process_boot.adapter +7 -0
  302. data/lib/hecks/hecks/adapters/in_process_boot.rb +197 -0
  303. data/lib/hecks/hecks/adapters/in_process_operations.rb +202 -0
  304. data/lib/hecks/hecks/adapters/journal_store/changes.rb +143 -0
  305. data/lib/hecks/hecks/adapters/journal_store/compaction.rb +145 -0
  306. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +132 -0
  307. data/lib/hecks/hecks/adapters/journal_store/examination.rb +135 -0
  308. data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +163 -0
  309. data/lib/hecks/hecks/adapters/journal_store/readings.rb +187 -0
  310. data/lib/hecks/hecks/adapters/journal_store.adapter +7 -0
  311. data/lib/hecks/hecks/adapters/journal_store.rb +64 -0
  312. data/lib/hecks/hecks/adapters/local_files.adapter +7 -0
  313. data/lib/hecks/hecks/adapters/local_files.rb +46 -0
  314. data/lib/hecks/hecks/adapters/pg_admin.adapter +7 -0
  315. data/lib/hecks/hecks/adapters/pg_admin.rb +245 -0
  316. data/lib/hecks/hecks/adapters/process_pool.adapter +7 -0
  317. data/lib/hecks/hecks/adapters/process_pool.rb +119 -0
  318. data/lib/hecks/hecks/adapters/rust_toolchain.adapter +7 -0
  319. data/lib/hecks/hecks/adapters/rust_toolchain.rb +179 -0
  320. data/lib/hecks/hecks/adapters/rust_workspace.rb +150 -0
  321. data/lib/hecks/hecks/adapters/shell.adapter +7 -0
  322. data/lib/hecks/hecks/adapters/shell.rb +49 -0
  323. data/lib/hecks/hecks/adapters/terminal.adapter +7 -0
  324. data/lib/hecks/hecks/adapters/terminal.rb +74 -0
  325. data/lib/hecks/hecks/codebase.behaviors +172 -0
  326. data/lib/hecks/hecks/codebase.bluebook +2453 -0
  327. data/lib/hecks/hecks/context_map.hecksagon +13 -0
  328. data/lib/hecks/hecks/custodian.behaviors +179 -0
  329. data/lib/hecks/hecks/custodian.bluebook +1847 -0
  330. data/lib/hecks/hecks/deploy.behaviors +74 -0
  331. data/lib/hecks/hecks/deploy.world +12 -0
  332. data/lib/hecks/hecks/environments/memory.world +10 -0
  333. data/lib/hecks/hecks/governance.world +7 -0
  334. data/lib/hecks/hecks/hecks.behaviors +62 -0
  335. data/lib/hecks/hecks/hecks.bluebook +124 -0
  336. data/lib/hecks/hecks/hecks.hecksagon +390 -0
  337. data/lib/hecks/hecks/hecks.world +42 -0
  338. data/lib/hecks/ir.rb +14 -83
  339. data/lib/hecks/kernel_capabilities.rb +194 -0
  340. data/lib/hecks/language/adapter.bluebook +2 -7
  341. data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
  342. data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
  343. data/lib/hecks/language/bluebook/bluebook.bluebook +26 -83
  344. data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
  345. data/lib/hecks/language/bluebook/command.bluebook +27 -144
  346. data/lib/hecks/language/bluebook/entity.bluebook +24 -97
  347. data/lib/hecks/language/bluebook/policy.bluebook +16 -67
  348. data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
  349. data/lib/hecks/language/bluebook/projection.bluebook +126 -60
  350. data/lib/hecks/language/bluebook/query.bluebook +19 -43
  351. data/lib/hecks/language/bluebook/shape.bluebook +23 -73
  352. data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
  353. data/lib/hecks/language/bluebook/vocabulary.bluebook +83 -198
  354. data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
  355. data/lib/hecks/language/hecksagon/domain_port.bluebook +14 -19
  356. data/lib/hecks/language/hecksagon/hecksagon.bluebook +26 -25
  357. data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
  358. data/lib/hecks/language/oidc.json +35 -0
  359. data/lib/hecks/language/port.bluebook +4 -17
  360. data/lib/hecks/language/translation/translation.bluebook +3 -9
  361. data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
  362. data/lib/hecks/language/world/wiring.bluebook +1 -3
  363. data/lib/hecks/language/world/world.bluebook +5 -7
  364. data/lib/hecks/literal.rb +8 -50
  365. data/lib/hecks/mcp_stdio_guard.rb +4 -41
  366. data/lib/hecks/naming.rb +29 -137
  367. data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
  368. data/lib/hecks/persistence_legacy_fixture.rb +113 -0
  369. data/lib/hecks/ports/access_control.rb +7 -23
  370. data/lib/hecks/ports/agent/answers.rb +5 -23
  371. data/lib/hecks/ports/agent.rb +47 -172
  372. data/lib/hecks/ports/authentication.rb +12 -39
  373. data/lib/hecks/ports/authorization.rb +16 -43
  374. data/lib/hecks/ports/clock.rb +5 -45
  375. data/lib/hecks/ports/extraction.rb +7 -12
  376. data/lib/hecks/ports/identity_assignment.rb +8 -29
  377. data/lib/hecks/ports/identity_generation.rb +6 -29
  378. data/lib/hecks/ports/identity_resolution.rb +2 -10
  379. data/lib/hecks/ports/key_vault.rb +9 -45
  380. data/lib/hecks/ports/persistence/append_only.rb +61 -64
  381. data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
  382. data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
  383. data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
  384. data/lib/hecks/ports/persistence/plugin.rb +13 -42
  385. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +44 -144
  386. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
  387. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +20 -85
  388. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
  389. data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +18 -24
  390. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
  391. data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
  392. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
  393. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
  394. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
  395. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
  396. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
  397. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
  398. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +19 -76
  399. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
  400. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
  401. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
  402. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
  403. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
  404. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +43 -127
  405. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
  406. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +131 -555
  407. data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
  408. data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +227 -0
  409. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
  410. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
  411. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
  412. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
  413. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
  414. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +50 -47
  415. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
  416. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
  417. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
  418. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
  419. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
  420. data/lib/hecks/ports/persistence/plugins/era/translation.rb +1 -0
  421. data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
  422. data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
  423. data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
  424. data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
  425. data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
  426. data/lib/hecks/ports/persistence/state_codec.rb +47 -108
  427. data/lib/hecks/ports/persistence.rb +7 -14
  428. data/lib/hecks/ports/projection.rb +42 -84
  429. data/lib/hecks/ports/query/in_memory.rb +10 -58
  430. data/lib/hecks/ports/query/ordering.rb +11 -32
  431. data/lib/hecks/ports/query.rb +14 -37
  432. data/lib/hecks/ports.rb +2 -8
  433. data/lib/hecks/projection_files.rb +285 -0
  434. data/lib/hecks/projections/bootstrap_table.rb +12 -44
  435. data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
  436. data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
  437. data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
  438. data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
  439. data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
  440. data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
  441. data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
  442. data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
  443. data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
  444. data/lib/hecks/projections/deploy/fargate.rb +40 -207
  445. data/lib/hecks/projections/deploy/lambda.rb +191 -708
  446. data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
  447. data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
  448. data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
  449. data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
  450. data/lib/hecks/projections/deploy/preview/script.rb +2 -14
  451. data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
  452. data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
  453. data/lib/hecks/projections/deploy/preview/template.rb +3 -59
  454. data/lib/hecks/projections/deploy/preview.rb +2 -67
  455. data/lib/hecks/projections/deploy/scripts/deploy-service.sh.tmpl +1 -1
  456. data/lib/hecks/projections/deploy/scripts/expected-era.header +1 -1
  457. data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +3 -3
  458. data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
  459. data/lib/hecks/projections/deploy/scripts/smoke-after-deploy.sh.tmpl +1 -1
  460. data/lib/hecks/projections/deploy/scripts.rb +4 -57
  461. data/lib/hecks/projections/deploy/shared.rb +48 -147
  462. data/lib/hecks/projections/deploy/smoke.rb +4 -61
  463. data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
  464. data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
  465. data/lib/hecks/projections/deploy/template_diff.rb +5 -57
  466. data/lib/hecks/projections/diagrams.rb +22 -584
  467. data/lib/hecks/projections/glossary/html.rb +14 -130
  468. data/lib/hecks/projections/glossary/markdown.rb +8 -69
  469. data/lib/hecks/projections/glossary/mermaid.rb +9 -66
  470. data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
  471. data/lib/hecks/projections/glossary/sentences.rb +14 -159
  472. data/lib/hecks/projections/glossary.rb +30 -222
  473. data/lib/hecks/projections/ir.rb +3 -10
  474. data/lib/hecks/projections/model/deviations.rb +16 -43
  475. data/lib/hecks/projections/model.rb +12 -51
  476. data/lib/hecks/projections/oidc.rb +12 -56
  477. data/lib/hecks/projections/parser_table.rb +13 -32
  478. data/lib/hecks/projections/reference.rb +4 -18
  479. data/lib/hecks/projections/rust_vocabulary.rb +13 -251
  480. data/lib/hecks/projections/shape.rb +3 -29
  481. data/lib/hecks/projections/statements.rb +7 -86
  482. data/lib/hecks/projections/vocabulary.rb +6 -22
  483. data/lib/hecks/projections.rb +2 -16
  484. data/lib/hecks/projector/cli_projector.rb +154 -400
  485. data/lib/hecks/projector/docs_projector.rb +10 -201
  486. data/lib/hecks/projector/exporter.rb +42 -134
  487. data/lib/hecks/projector/ir_projector.rb +2 -9
  488. data/lib/hecks/projector/narrate_projector.rb +15 -189
  489. data/lib/hecks/projector/target.rb +13 -76
  490. data/lib/hecks/projector.rb +30 -121
  491. data/lib/hecks/quality_control/adapters/agent.adapter +7 -0
  492. data/lib/hecks/quality_control/adapters/agent.rb +58 -0
  493. data/lib/hecks/quality_control/adapters/angle_tools.adapter +7 -0
  494. data/lib/hecks/quality_control/adapters/angle_tools.rb +15 -0
  495. data/lib/hecks/quality_control/adapters/clearance_recorder.rb +36 -0
  496. data/lib/hecks/quality_control/adapters/clearance_tools.adapter +7 -0
  497. data/lib/hecks/quality_control/adapters/clearance_tools.rb +17 -0
  498. data/lib/hecks/quality_control/adapters/git_pr.adapter +7 -0
  499. data/lib/hecks/quality_control/adapters/git_pr.rb +226 -0
  500. data/lib/hecks/quality_control/adapters/github_checks.adapter +9 -0
  501. data/lib/hecks/quality_control/adapters/github_checks.rb +83 -0
  502. data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +56 -0
  503. data/lib/hecks/quality_control/adapters/github_issues.adapter +7 -0
  504. data/lib/hecks/quality_control/adapters/github_issues.rb +49 -0
  505. data/lib/hecks/quality_control/adapters/qa_tool.rb +59 -0
  506. data/lib/hecks/quality_control/adapters/sweep_tools.adapter +7 -0
  507. data/lib/hecks/quality_control/adapters/sweep_tools.rb +51 -0
  508. data/lib/hecks/quality_control/adapters/target_tools.adapter +7 -0
  509. data/lib/hecks/quality_control/adapters/target_tools.rb +43 -0
  510. data/lib/hecks/quality_control/cli/child.rb +45 -0
  511. data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +45 -0
  512. data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +248 -0
  513. data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +163 -0
  514. data/lib/hecks/quality_control/cli/qa_generated_domains.rb +450 -0
  515. data/lib/hecks/quality_control/cli/qa_log_bug.rb +195 -0
  516. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +220 -0
  517. data/lib/hecks/quality_control/cli/qa_open_pr.rb +305 -0
  518. data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +154 -0
  519. data/lib/hecks/quality_control/cli/qa_postgres_role.rb +159 -0
  520. data/lib/hecks/quality_control/cli/qa_pr_check.rb +232 -0
  521. data/lib/hecks/quality_control/cli/qa_seed_angles.rb +142 -0
  522. data/lib/hecks/quality_control/cli/qa_seed_targets.rb +69 -0
  523. data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +280 -0
  524. data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +329 -0
  525. data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +92 -0
  526. data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +117 -0
  527. data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +175 -0
  528. data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +60 -0
  529. data/lib/hecks/quality_control/cli/qa_sweep.rb +611 -0
  530. data/lib/hecks/quality_control/cli/qa_tick.rb +274 -0
  531. data/lib/hecks/quality_control/quality_control.bluebook +2224 -0
  532. data/lib/hecks/quality_control/quality_control.hecksagon +13 -0
  533. data/lib/hecks/quality_control/quality_control.ports.hecksagon +54 -0
  534. data/lib/hecks/query_ir.rb +346 -0
  535. data/lib/hecks/query_ir_mcp.rb +198 -0
  536. data/lib/hecks/query_specification/common/comparators.rb +5 -26
  537. data/lib/hecks/query_specification/common/comparison.rb +35 -143
  538. data/lib/hecks/query_specification/common/dsl.rb +8 -24
  539. data/lib/hecks/query_specification/common/null_policy.rb +20 -70
  540. data/lib/hecks/query_specification/common/options.rb +2 -6
  541. data/lib/hecks/query_specification/common/where_clause.rb +2 -10
  542. data/lib/hecks/query_specification/field_path.rb +37 -77
  543. data/lib/hecks/query_specification/hop_path.rb +12 -76
  544. data/lib/hecks/release/gem_pin.rb +2 -26
  545. data/lib/hecks/release/runner/ci_publisher.rb +5 -8
  546. data/lib/hecks/release/runner/clean_tree.rb +42 -0
  547. data/lib/hecks/release/runner/commands.rb +2 -4
  548. data/lib/hecks/release/runner/console.rb +6 -0
  549. data/lib/hecks/release/runner/gem_publisher.rb +15 -9
  550. data/lib/hecks/release/runner/npm_publisher.rb +9 -53
  551. data/lib/hecks/release/runner/preflight.rb +29 -20
  552. data/lib/hecks/release/runner/published.rb +8 -26
  553. data/lib/hecks/release/runner/tagger.rb +31 -23
  554. data/lib/hecks/release/runner.rb +60 -38
  555. data/lib/hecks/rendering.rb +4 -26
  556. data/lib/hecks/router/namespace_installer.rb +15 -39
  557. data/lib/hecks/router.rb +4 -8
  558. data/lib/hecks/runtime/adapter_lookup.rb +124 -0
  559. data/lib/hecks/runtime/aggregate_lock.rb +8 -33
  560. data/lib/hecks/runtime/boot_gates.rb +3 -18
  561. data/lib/hecks/runtime/caller.rb +19 -59
  562. data/lib/hecks/runtime/capability_graph.rb +5 -21
  563. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
  564. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +27 -160
  565. data/lib/hecks/runtime/command_interpreter.rb +124 -306
  566. data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
  567. data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
  568. data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
  569. data/lib/hecks/runtime/command_rules/emission.rb +8 -21
  570. data/lib/hecks/runtime/command_rules/references.rb +23 -202
  571. data/lib/hecks/runtime/dependency_planning.rb +50 -104
  572. data/lib/hecks/runtime/dispatcher.rb +134 -243
  573. data/lib/hecks/runtime/entity_element.rb +40 -462
  574. data/lib/hecks/runtime/entity_interpreter.rb +64 -219
  575. data/lib/hecks/runtime/errors.rb +32 -115
  576. data/lib/hecks/runtime/event.rb +3 -25
  577. data/lib/hecks/runtime/identity.rb +18 -154
  578. data/lib/hecks/runtime/instance.rb +18 -150
  579. data/lib/hecks/runtime/interpreting.rb +14 -70
  580. data/lib/hecks/runtime/invocation.rb +28 -164
  581. data/lib/hecks/runtime/loader.rb +109 -194
  582. data/lib/hecks/runtime/outbox.rb +39 -262
  583. data/lib/hecks/runtime/policy_interpreter.rb +43 -202
  584. data/lib/hecks/runtime/port_operation_interpreter.rb +28 -97
  585. data/lib/hecks/runtime/query_interpreter.rb +122 -187
  586. data/lib/hecks/runtime/reaction_invocation.rb +36 -138
  587. data/lib/hecks/runtime/reaction_outcome.rb +89 -0
  588. data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
  589. data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
  590. data/lib/hecks/runtime/reference_hop.rb +8 -81
  591. data/lib/hecks/runtime/refusal_wording.rb +28 -87
  592. data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
  593. data/lib/hecks/runtime/registry/verification.rb +213 -227
  594. data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
  595. data/lib/hecks/runtime/registry.rb +156 -247
  596. data/lib/hecks/runtime/remote_dispatcher.rb +68 -154
  597. data/lib/hecks/runtime/routing.rb +4 -15
  598. data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
  599. data/lib/hecks/runtime/saga_interpreter.rb +79 -263
  600. data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
  601. data/lib/hecks/runtime/tenant_check.rb +6 -68
  602. data/lib/hecks/runtime/tenant_scope.rb +3 -28
  603. data/lib/hecks/runtime/value/admission.rb +16 -67
  604. data/lib/hecks/runtime/value/coercion.rb +162 -760
  605. data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
  606. data/lib/hecks/runtime/value/field_checks.rb +172 -0
  607. data/lib/hecks/runtime/value.rb +15 -84
  608. data/lib/hecks/runtime.rb +35 -69
  609. data/lib/hecks/rust_build/conformance.rb +158 -0
  610. data/lib/hecks/rust_build/conformance_fuzz.rb +71 -0
  611. data/lib/hecks/rust_build/coverage.rb +218 -0
  612. data/lib/hecks/rust_build/native_build.rb +124 -0
  613. data/lib/hecks/rust_build/project_rust/root_mod.rb +120 -0
  614. data/lib/hecks/rust_build/project_rust.rb +332 -0
  615. data/lib/hecks/rust_build/wasm.rb +105 -0
  616. data/lib/hecks/rust_build/wasm_browser.rb +113 -0
  617. data/lib/hecks/rust_build.rb +144 -0
  618. data/lib/hecks/storehouse.rb +155 -582
  619. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +10 -34
  620. data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
  621. data/lib/hecks/three_zero/forms.yml +127 -0
  622. data/lib/hecks/three_zero.rb +12 -0
  623. data/lib/hecks/tools/argument_gate_matrix.rb +316 -0
  624. data/lib/hecks/tools/comment_style.rb +1070 -0
  625. data/lib/hecks/tools/corpus_report.rb +87 -0
  626. data/lib/hecks/tools/deploy_recipe.rb +255 -0
  627. data/lib/hecks/tools/deploy_recipe_lint.rb +282 -0
  628. data/lib/hecks/tools/drop_implicit_append_fields.rb +95 -0
  629. data/lib/hecks/tools/era_projection_backfill.rb +94 -0
  630. data/lib/hecks/tools/era_reattest.rb +146 -0
  631. data/lib/hecks/tools/evolve_run.rb +189 -0
  632. data/lib/hecks/tools/fuzz_sweep.rb +373 -0
  633. data/lib/hecks/tools/heki_compaction.rb +100 -0
  634. data/lib/hecks/tools/hoist_local_givens.rb +246 -0
  635. data/lib/hecks/tools/journal_compaction.rb +89 -0
  636. data/lib/hecks/tools/oidc_manifests.rb +70 -0
  637. data/lib/hecks/tools/query_ir_run.rb +81 -0
  638. data/lib/hecks/tools/regeneration_run.rb +166 -0
  639. data/lib/hecks/tools/rust_comment_style.rb +642 -0
  640. data/lib/hecks/tools/sequence_script.rb +62 -0
  641. data/lib/hecks/tools/tail_merge.rb +117 -0
  642. data/lib/hecks/tools/tenant_provisioning.rb +142 -0
  643. data/lib/hecks/tools/translation_audit.rb +208 -0
  644. data/lib/hecks/tools/translation_scaffold.rb +131 -0
  645. data/lib/hecks/tools.rb +86 -0
  646. data/lib/hecks/vendoring/git_environment.rb +2 -8
  647. data/lib/hecks/vendoring/git_source.rb +4 -10
  648. data/lib/hecks/vendoring.rb +7 -46
  649. data/lib/hecks/version.rb +3 -14
  650. data/lib/hecks.rb +52 -90
  651. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
  652. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
  653. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
  654. data/qa/settings.yml +66 -0
  655. data/rust/.cargo/config.toml +6 -0
  656. data/rust/.gitignore +2 -0
  657. data/rust/Cargo.lock +54 -0
  658. data/rust/Cargo.toml +61 -0
  659. data/rust/build/.cargo/config.toml +3 -0
  660. data/rust/build/.gitignore +1 -0
  661. data/rust/build/Cargo.lock +7 -0
  662. data/rust/build/Cargo.toml +19 -0
  663. data/rust/build/src/build_artifact.rs +47 -0
  664. data/rust/build/src/cargo_sync.rs +248 -0
  665. data/rust/build/src/json.rs +421 -0
  666. data/rust/build/src/lineage_pass.rs +285 -0
  667. data/rust/build/src/main.rs +51 -0
  668. data/rust/build/src/optional_pass.rs +150 -0
  669. data/rust/build/src/pipeline.rs +264 -0
  670. data/rust/build/src/reserved_names.rs +76 -0
  671. data/rust/build/src/resolve.rs +124 -0
  672. data/rust/build/src/root.rs +25 -0
  673. data/rust/build/src/sidecars.rs +73 -0
  674. data/rust/build/src/subprocess.rs +51 -0
  675. data/rust/build/src/tmp.rs +31 -0
  676. data/rust/codegen/.cargo/config.toml +3 -0
  677. data/rust/codegen/.gitignore +1 -0
  678. data/rust/codegen/Cargo.lock +7 -0
  679. data/rust/codegen/Cargo.toml +20 -0
  680. data/rust/codegen/src/attr.rs +32 -0
  681. data/rust/codegen/src/bridging.rs +481 -0
  682. data/rust/codegen/src/commands.rs +1226 -0
  683. data/rust/codegen/src/constraints.rs +109 -0
  684. data/rust/codegen/src/dependency_planning.rs +209 -0
  685. data/rust/codegen/src/domain_generator.rs +1288 -0
  686. data/rust/codegen/src/exemplar.rs +230 -0
  687. data/rust/codegen/src/expr_emitter.rs +87 -0
  688. data/rust/codegen/src/fielded.rs +192 -0
  689. data/rust/codegen/src/hecks_naming.rs +33 -0
  690. data/rust/codegen/src/json.rs +335 -0
  691. data/rust/codegen/src/json_codec.rs +697 -0
  692. data/rust/codegen/src/literal.rs +207 -0
  693. data/rust/codegen/src/main.rs +290 -0
  694. data/rust/codegen/src/manifest.rs +227 -0
  695. data/rust/codegen/src/mutations.rs +784 -0
  696. data/rust/codegen/src/naming.rs +286 -0
  697. data/rust/codegen/src/ports.rs +208 -0
  698. data/rust/codegen/src/prelude.rs +116 -0
  699. data/rust/codegen/src/queries.rs +786 -0
  700. data/rust/codegen/src/reactions.rs +532 -0
  701. data/rust/codegen/src/read_models.rs +697 -0
  702. data/rust/codegen/src/reference_specs.rs +40 -0
  703. data/rust/codegen/src/registry.rs +966 -0
  704. data/rust/codegen/src/reserved_names.rs +76 -0
  705. data/rust/codegen/src/shared.rs +93 -0
  706. data/rust/codegen/src/skip_reason.rs +25 -0
  707. data/rust/codegen/src/types.rs +362 -0
  708. data/rust/host/.cargo/config.toml +3 -0
  709. data/rust/host/.gitignore +1 -0
  710. data/rust/host/Cargo.lock +4297 -0
  711. data/rust/host/Cargo.toml +61 -0
  712. data/rust/host/HECKS_RELEASE +1 -0
  713. data/rust/host/rds-ca-bundle.pem +2736 -0
  714. data/rust/host/src/api.rs +1596 -0
  715. data/rust/host/src/approval.rs +652 -0
  716. data/rust/host/src/auth.rs +1287 -0
  717. data/rust/host/src/bin/expr_harness.rs +46 -0
  718. data/rust/host/src/bin/lineage_harness.rs +119 -0
  719. data/rust/host/src/bin/mint_harness.rs +135 -0
  720. data/rust/host/src/checkout.rs +265 -0
  721. data/rust/host/src/dispatch.rs +1443 -0
  722. data/rust/host/src/expr_json.rs +1117 -0
  723. data/rust/host/src/field_hints.rs +52 -0
  724. data/rust/host/src/ir.rs +733 -0
  725. data/rust/host/src/journal.rs +874 -0
  726. data/rust/host/src/lambda_client.rs +378 -0
  727. data/rust/host/src/log.rs +147 -0
  728. data/rust/host/src/main.rs +474 -0
  729. data/rust/host/src/mint.rs +1865 -0
  730. data/rust/host/src/payments/keystore.rs +330 -0
  731. data/rust/host/src/payments/tests.rs +1400 -0
  732. data/rust/host/src/payments.rs +767 -0
  733. data/rust/host/src/presentation.rs +698 -0
  734. data/rust/host/src/presentation_write.rs +1431 -0
  735. data/rust/host/src/query_step.rs +149 -0
  736. data/rust/host/src/rate_limit.rs +904 -0
  737. data/rust/host/src/reference_transform.rs +241 -0
  738. data/rust/host/src/reference_validate.rs +338 -0
  739. data/rust/host/src/resend.rs +296 -0
  740. data/rust/host/src/secrets.rs +106 -0
  741. data/rust/host/src/server.rs +663 -0
  742. data/rust/host/src/storage_shape.rs +175 -0
  743. data/rust/host/src/test_pg.rs +40 -0
  744. data/rust/host/src/ui_schema.rs +1351 -0
  745. data/rust/host/src/wasm_runner.rs +191 -0
  746. data/rust/host/src/web/newsletter/cooldown.rs +126 -0
  747. data/rust/host/src/web/newsletter/tests.rs +104 -0
  748. data/rust/host/src/web/newsletter.rs +310 -0
  749. data/rust/host/src/web/newsletter_send.rs +357 -0
  750. data/rust/host/src/web/registrations.rs +1505 -0
  751. data/rust/host/src/web.rs +2937 -0
  752. data/rust/lsp/.gitignore +1 -0
  753. data/rust/lsp/Cargo.lock +7 -0
  754. data/rust/lsp/Cargo.toml +16 -0
  755. data/rust/lsp/README.md +133 -0
  756. data/rust/lsp/src/diagnostics.rs +165 -0
  757. data/rust/lsp/src/json.rs +385 -0
  758. data/rust/lsp/src/main.rs +399 -0
  759. data/rust/lsp/src/outline.rs +177 -0
  760. data/rust/lsp/src/rpc.rs +67 -0
  761. data/rust/parser/.cargo/config.toml +5 -0
  762. data/rust/parser/.gitignore +1 -0
  763. data/rust/parser/Cargo.lock +7 -0
  764. data/rust/parser/Cargo.toml +21 -0
  765. data/rust/parser/src/build/closed_sets.rs +27 -0
  766. data/rust/parser/src/build/identity.rs +276 -0
  767. data/rust/parser/src/build/mod.rs +12 -0
  768. data/rust/parser/src/build/naming.rs +141 -0
  769. data/rust/parser/src/build/pattern_subset.rs +161 -0
  770. data/rust/parser/src/build/query_derive.rs +72 -0
  771. data/rust/parser/src/build/query_inference.rs +269 -0
  772. data/rust/parser/src/build/query_options.rs +100 -0
  773. data/rust/parser/src/build/read_model.rs +94 -0
  774. data/rust/parser/src/build/references.rs +32 -0
  775. data/rust/parser/src/canonical.rs +114 -0
  776. data/rust/parser/src/diag.rs +55 -0
  777. data/rust/parser/src/emit.rs +953 -0
  778. data/rust/parser/src/expr/ast_json.rs +147 -0
  779. data/rust/parser/src/expr/evaluator.rs +81 -0
  780. data/rust/parser/src/expr/mod.rs +84 -0
  781. data/rust/parser/src/expr/resolver.rs +497 -0
  782. data/rust/parser/src/ir.rs +387 -0
  783. data/rust/parser/src/keywords.rs +585 -0
  784. data/rust/parser/src/lex.rs +662 -0
  785. data/rust/parser/src/main.rs +252 -0
  786. data/rust/parser/src/parse/aggregate.rs +612 -0
  787. data/rust/parser/src/parse/chapter.rs +517 -0
  788. data/rust/parser/src/parse/command.rs +637 -0
  789. data/rust/parser/src/parse/domain_port.rs +127 -0
  790. data/rust/parser/src/parse/entity.rs +527 -0
  791. data/rust/parser/src/parse/file.rs +67 -0
  792. data/rust/parser/src/parse/hecksagon.rs +231 -0
  793. data/rust/parser/src/parse/lifecycle.rs +162 -0
  794. data/rust/parser/src/parse/mod.rs +1262 -0
  795. data/rust/parser/src/parse/policy.rs +87 -0
  796. data/rust/parser/src/parse/process_manager.rs +305 -0
  797. data/rust/parser/src/parse/query.rs +100 -0
  798. data/rust/parser/src/parse/read_model.rs +214 -0
  799. data/rust/parser/src/parse/value_object.rs +250 -0
  800. data/rust/parser/src/ruby_value.rs +422 -0
  801. data/rust/project/bridging.rb +257 -0
  802. data/rust/project/commands.rb +877 -0
  803. data/rust/project/constraints.rb +86 -0
  804. data/rust/project/dependency_planning.rb +178 -0
  805. data/rust/project/domain_generator.rb +980 -0
  806. data/rust/project/exemplar.rb +148 -0
  807. data/rust/project/expr_emitter.rb +72 -0
  808. data/rust/project/fielded.rb +141 -0
  809. data/rust/project/json_codec.rb +641 -0
  810. data/rust/project/mutations.rb +721 -0
  811. data/rust/project/naming.rb +205 -0
  812. data/rust/project/ports.rb +65 -0
  813. data/rust/project/queries.rb +493 -0
  814. data/rust/project/reactions.rb +317 -0
  815. data/rust/project/read_models.rb +690 -0
  816. data/rust/project/reference_specs.rb +27 -0
  817. data/rust/project/registry.rb +396 -0
  818. data/rust/project/skip_reason.rb +29 -0
  819. data/rust/project/types.rb +225 -0
  820. data/rust/project/write_if_changed.rb +83 -0
  821. data/rust/project.rb +30 -0
  822. data/rust/project_rust_pipeline.rb +383 -0
  823. data/rust/src/exemplar/commands.rs +279 -0
  824. data/rust/src/exemplar/constraints.rs +18 -0
  825. data/rust/src/exemplar/fielded.rs +280 -0
  826. data/rust/src/exemplar/json.rs +277 -0
  827. data/rust/src/exemplar/mod.rs +17 -0
  828. data/rust/src/exemplar/mutations.rs +80 -0
  829. data/rust/src/exemplar/queries.rs +33 -0
  830. data/rust/src/exemplar/reactions.rs +88 -0
  831. data/rust/src/exemplar/read_models.rs +48 -0
  832. data/rust/src/exemplar/registry.rs +166 -0
  833. data/rust/src/exemplar/types.rs +44 -0
  834. data/rust/src/kernel/attribute_shapes/composite.rs +88 -0
  835. data/rust/src/kernel/attribute_shapes/list.rs +18 -0
  836. data/rust/src/kernel/attribute_shapes/mod.rs +44 -0
  837. data/rust/src/kernel/attribute_shapes/optional.rs +9 -0
  838. data/rust/src/kernel/attribute_shapes/scalar.rs +39 -0
  839. data/rust/src/kernel/cli.rs +585 -0
  840. data/rust/src/kernel/dispatch.rs +1090 -0
  841. data/rust/src/kernel/expr.rs +458 -0
  842. data/rust/src/kernel/expression_operators/arithmetic.rs +128 -0
  843. data/rust/src/kernel/expression_operators/comparison.rs +48 -0
  844. data/rust/src/kernel/expression_operators/enumeration.rs +232 -0
  845. data/rust/src/kernel/expression_operators/logical.rs +13 -0
  846. data/rust/src/kernel/expression_operators/membership.rs +18 -0
  847. data/rust/src/kernel/expression_operators/mod.rs +68 -0
  848. data/rust/src/kernel/expression_operators/pattern_match.rs +73 -0
  849. data/rust/src/kernel/expression_operators/positional.rs +126 -0
  850. data/rust/src/kernel/expression_operators/presence.rs +101 -0
  851. data/rust/src/kernel/expression_operators/sign_test.rs +16 -0
  852. data/rust/src/kernel/expression_operators/sized.rs +35 -0
  853. data/rust/src/kernel/expression_operators/text.rs +79 -0
  854. data/rust/src/kernel/expression_operators/to_string.rs +18 -0
  855. data/rust/src/kernel/json.rs +779 -0
  856. data/rust/src/kernel/mod.rs +133 -0
  857. data/rust/src/kernel/named_query.rs +219 -0
  858. data/rust/src/kernel/orchestrate.rs +1810 -0
  859. data/rust/src/kernel/pattern.rs +307 -0
  860. data/rust/src/kernel/query_comparators.rs +206 -0
  861. data/rust/src/kernel/query_ordering.rs +103 -0
  862. data/rust/src/kernel/read_model.rs +914 -0
  863. data/rust/src/kernel/reference_lookup.rs +149 -0
  864. data/rust/src/kernel/repository.rs +468 -0
  865. data/rust/src/kernel/routing.rs +612 -0
  866. data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +118 -0
  867. data/rust/src/kernel/vocab/entity_dispatch_order.rs +114 -0
  868. data/rust/src/kernel/vocab/field_hint.rs +70 -0
  869. data/rust/src/kernel/vocab/mod.rs +20 -0
  870. data/rust/src/kernel/vocab/query_comparator.rs +65 -0
  871. data/rust/src/kernel/vocab/refusal_template.rs +1592 -0
  872. data/rust/src/lib.rs +8 -0
  873. data/rust/src/main.rs +16 -0
  874. data/rust/web/.gitignore +1 -0
  875. data/rust/web/Cargo.lock +119 -0
  876. data/rust/web/Cargo.toml +18 -0
  877. data/rust/web/src/lib.rs +8 -0
  878. metadata +478 -12
  879. data/lib/hecks/facade/cli_door.rb +0 -178
  880. data/lib/hecks/facade/cli_runner.rb +0 -271
  881. data/lib/hecks/facade/handle.rb +0 -293
  882. data/lib/hecks/facade/json_door.rb +0 -247
  883. data/lib/hecks/facade/surface/aggregate_door.rb +0 -222
  884. data/lib/hecks/facade/surface/chapter.rb +0 -116
  885. data/lib/hecks/facade/surface.rb +0 -61
  886. data/lib/hecks/mcp_door_scope.rb +0 -176
@@ -2,17 +2,7 @@ Hecks.bluebook "Bluebook", version: "1" do
2
2
  vision "The bluebook language, declared in itself. Loading a domain becomes dispatching commands into this meta-domain ; the IR it stores must equal the IR the DSL builder produces. The floor that stays hand-written is the interpreter — evaluating a predicate held as data — and IO."
3
3
  core
4
4
 
5
- # A WHOLE BLUEBOOK, handed back in one read.
6
- #
7
- # The twelve `DeclaredIn` queries below can walk the tree a level at a time, and
8
- # a caller stitching twelve reads together is a caller reimplementing this. The
9
- # language already knows how to say "gather these heads around that spine" —
10
- # it is what a read model IS — so the reconstruction is DECLARED rather than
11
- # coded, and the shape of what comes back is a fact about the language instead
12
- # of a fact about whoever wrote the reader.
13
- #
14
- # Spined on Bluebook because a bluebook is what you ask for. Everything else
15
- # hangs off it, down to a Member's pairs and a Dispatch's bindings.
5
+ # A whole bluebook in one read: every declaration gathered around the chapter itself.
16
6
  read_model "WholeBluebook" do
17
7
  description "Every declaration of one chapter, gathered around the chapter itself — the way back, in a single read."
18
8
  reference_to Bluebook
@@ -34,54 +24,22 @@ Hecks.bluebook "Bluebook", version: "1" do
34
24
  aggregate "Bluebook" do
35
25
  description "One .bluebook file — the root a domain declaration hangs from."
36
26
 
37
- # A CHAPTER IS KNOWN BY ITS NAME, which is what anyone would have said.
38
- #
39
- # It was not, and the reason it was not is worth keeping : the runtime read the
40
- # identity out of the payload under its head's own name, so a command that both
41
- # REACHED a bluebook and carried a name could not say both, and `Normalise`
42
- # could never name what it acts on. The answer at the time was to duck it —
43
- # keep `name` a plain field and be reached by a minted `id` like nothing else
44
- # in the language.
45
- #
46
- # The duck is what is gone. A command reaches its root through the REFERENCE it
47
- # declares (`bluebook_id`), which is a different key from any argument it
48
- # carries, so the two cannot collide however they are spelled. The fallback was
49
- # hiding a lookup bug ; removing it made the bug visible, and the bug was the
50
- # smaller thing.
27
+ # A chapter is identified by its name; commands reach it through the `bluebook_id` reference.
51
28
  identified_by BluebookName, as: :name
52
29
 
53
30
  attribute :vision, Vision
54
31
  attribute :classification, Classification
55
- # A domain CONTRACT version, pinned per chapter — `Hecks.bluebook "Pizzas",
56
- # version: "v2"`. Held here because the language must hold everything the
57
- # runtime runs on, and this was the one field it did not: the round trip sliced
58
- # its comparison by the reconstruction's own keys, so a version was excluded
59
- # from the check rather than failing it, and a chapter assembled purely from
60
- # these records would have lost it in silence. Most chapters declare none, and
61
- # ABSENT IS NOT EMPTY — an unversioned chapter offers nothing here at all.
32
+ # Contract version pinned per chapter, e.g. `version: "v2"`. Absent is not empty.
62
33
  attribute :version, Version
63
- # A domain's own identity can change — held here so a rename is a
64
- # declared fact the language carries, not just a Ruby-side accessor.
65
- # Most chapters declare none, and ABSENT IS NOT EMPTY, the same
66
- # reading `version` above gives.
34
+ # A rename is a declared fact. Absent is not empty.
67
35
  attribute :formerly_known_as, FormerlyKnownAs
36
+ attribute :namespace, ChapterNamespace
68
37
  attribute :normalisations, list_of(NormalisationRule)
69
- # THE SEAM ADR 0026 ADDS. A sub-language chapter (Paging, so far the
70
- # only one) names the core contexts its own `Syntax` aggregate
71
- # contributes rows for — "Query", "ReadModel" — so SyntaxBoot's own
72
- # discovery can find it without the core ever naming it back. Most
73
- # chapters attach to nothing, and ABSENT IS NOT EMPTY, the same
74
- # reading `version`/`formerly_known_as` above give.
38
+ # Core contexts a sub-language chapter contributes Syntax rows for (ADR 0026).
39
+ # Absent is not empty: most chapters attach to nothing.
75
40
  attribute :attaches_to, list_of(AttachesToContext)
76
- # A CAPABILITY THIS CHAPTER ANSWERS FOR OTHER DOMAINS — declared, so
77
- # nothing downstream has to recognise the chapter BY NAME. One row
78
- # per (capability, key, verb): `provides "authorization", grant:
79
- # "RoleAssignment.Assign"` is the row (authorization, grant,
80
- # RoleAssignment.Assign). The runtime's role check, boot's
81
- # ungoverned-role refusal, the authorization adapter and the fuzzer
82
- # all read the rows rather than the literal "Governance". Most
83
- # chapters provide nothing, and ABSENT IS NOT EMPTY, the same reading
84
- # `attaches_to` above gives.
41
+ # Capabilities this chapter answers for other domains, one row per (capability, key, verb).
42
+ # Absent is not empty: most chapters provide nothing.
85
43
  attribute :provides, list_of(Provision)
86
44
 
87
45
  value_object "Provision" do
@@ -135,6 +93,12 @@ Hecks.bluebook "Bluebook", version: "1" do
135
93
  invariant("a formerly_known_as says something") { !value.to_s.empty? }
136
94
  end
137
95
 
96
+ # The Ruby module a chapter's constants install under instead of its own name.
97
+ value_object "ChapterNamespace" do
98
+ attribute :value, String
99
+ invariant("a namespace is a constant path") { value.to_s.match?(/\A[A-Z][A-Za-z0-9_]*(::[A-Z][A-Za-z0-9_]*)*\z/) }
100
+ end
101
+
138
102
  value_object "AttachesToContext" do
139
103
  attribute :value, String
140
104
  invariant("an attachment names a context") { !value.to_s.empty? }
@@ -149,21 +113,19 @@ Hecks.bluebook "Bluebook", version: "1" do
149
113
  attribute :classification, Classification, optional: true
150
114
  attribute :version, Version, optional: true
151
115
  attribute :formerly_known_as, FormerlyKnownAs, optional: true
116
+ attribute :namespace, ChapterNamespace, optional: true
152
117
 
153
118
  sets :name
154
119
  sets :vision
155
120
  sets :classification
156
121
  sets :version
157
122
  sets :formerly_known_as
123
+ sets :namespace
158
124
 
159
125
  emits ChapterDeclared
160
126
  end
161
127
 
162
- # ONE CONTEXT THE CHAPTER ATTACHES TO, appended the way one identity
163
- # part is (Aggregate.Identify, above) — `attaches_to "Query",
164
- # "ReadModel"` names any number at once, and a list is filled by a
165
- # verb of its own here the same reason it is everywhere else in this
166
- # language.
128
+ # Appends one context; `attaches_to "Query", "ReadModel"` names several at once.
167
129
  command "Attach" do
168
130
  role "Language"
169
131
  goal "Name one core context this chapter's own Syntax rows attach to"
@@ -171,21 +133,13 @@ Hecks.bluebook "Bluebook", version: "1" do
171
133
  attribute :context, AttachesToContext
172
134
 
173
135
  sets :attaches_to, append: { value: :context }
174
- # S16, ADR 0026 — the language's own self-use gate: an append is
175
- # exactly the shape banking's own ensures already checks ("a
176
- # ledger entry was posted") { ledger.size == old.ledger.size + 1
177
- # } — one more row than before, never fewer, never the same.
136
+ # Appending grows the list by exactly one row.
178
137
  ensures("the list grew by exactly one") { attaches_to.size == old.attaches_to.size + 1 }
179
138
  emits ChapterAttached
180
139
  end
181
140
 
182
- # ONE ROW OF ONE CAPABILITY — `provides "authorization", assignments:
183
- # ..., grant: ..., transitions: ...` offers three, one per key, in the
184
- # order they were written. Membership (`admit`/`grant`/`people`) and
185
- # identity (`register`/`link`/`resolve`) use the same word with their
186
- # own named keys; the argument table admits every key any capability
187
- # declares, and `Capabilities::CONTRACTS` holds which keys a given
188
- # capability must name.
141
+ # One row of one capability: `provides "authorization", grant: ...` offers one row per key.
142
+ # `Capabilities::CONTRACTS` holds which keys a capability must name.
189
143
  command "Provide" do
190
144
  role "Language"
191
145
  goal "Declare one verb this chapter answers a capability with"
@@ -199,19 +153,8 @@ Hecks.bluebook "Bluebook", version: "1" do
199
153
  emits CapabilityProvided
200
154
  end
201
155
 
202
- # THE WAY BACK.
203
- #
204
- # Until these existed the meta-domain was write-only: twelve categories, 34
205
- # verbs, and not one query. A bluebook could be dispatched in and never read
206
- # out, which is exactly as much as JUDGING requires — offer every declaration,
207
- # collect the refusals, throw the records away. It is also why the language
208
- # could only validate. A store you cannot read cannot be the source of
209
- # anything, and "loading a domain becomes dispatching commands into this
210
- # meta-domain" — the vision at the top of this file — needs the records to
211
- # come back out as the IR the runtime runs.
212
- # Named to finish a sentence about the thing, the way every other query in the
213
- # corpus is — pizzas COSTING LESS THAN a ceiling, orders PENDING, cards
214
- # ACTIVE. So: the bluebook CALLED "Pizzas".
156
+ # Reads a bluebook back out, not only in.
157
+ # Named to finish a sentence: the bluebook CALLED "Pizzas".
215
158
  query "Called" do
216
159
  attribute :name, BluebookName
217
160
  where(name: :name)
@@ -235,9 +178,7 @@ Hecks.bluebook "Bluebook", version: "1" do
235
178
  emits NormalisationAttached
236
179
  end
237
180
 
238
- # HOW BLUEBOOK IS SPELLED. These rows live with the concept
239
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
240
- # Contexts represented here: File, Bluebook.
181
+ # Keyword rows for this chapter; SyntaxBoot discovers every aggregate-local seed table.
241
182
  value_object "KeywordSeed" do
242
183
  attribute :word, String
243
184
  attribute :context, String, admits: "Syntax::Context"
@@ -253,6 +194,7 @@ Hecks.bluebook "Bluebook", version: "1" do
253
194
  member word: "bluebook", context: "File", body: "keywords", inner: "Bluebook", opens: "Bluebook", fills: ""
254
195
  member word: "vision", context: "Bluebook", body: "none", inner: "", opens: "", fills: "vision"
255
196
  member word: "formerly_known_as", context: "Bluebook", body: "none", inner: "", opens: "", fills: "formerly_known_as"
197
+ member word: "namespace", context: "Bluebook", body: "none", inner: "", opens: "", fills: "namespace"
256
198
  member word: "attaches_to", context: "Bluebook", body: "none", inner: "", opens: "", fills: "attaches_to", calls: "attaches_to_impl"
257
199
  member word: "provides", context: "Bluebook", body: "none", inner: "", opens: "", fills: "provides", calls: "provides_impl"
258
200
  member word: "core", context: "Bluebook", body: "none", inner: "", opens: "", fills: "classification"
@@ -286,6 +228,7 @@ Hecks.bluebook "Bluebook", version: "1" do
286
228
  member keyword: "bluebook", context: "File", at: "", named: "version", kind: "text", required: "false", fills: "version"
287
229
  member keyword: "vision", context: "Bluebook", at: "1", named: "", kind: "text", required: "true", fills: "vision", coerce: "false"
288
230
  member keyword: "formerly_known_as", context: "Bluebook", at: "1", named: "", kind: "text", required: "true", fills: "formerly_known_as"
231
+ member keyword: "namespace", context: "Bluebook", at: "1", named: "", kind: "text", required: "true", fills: "namespace"
289
232
  member keyword: "attaches_to", context: "Bluebook", at: "1", named: "", kind: "text", required: "true", fills: "attaches_to", variadic: "true"
290
233
  member keyword: "provides", context: "Bluebook", at: "1", named: "", kind: "text", required: "true", fills: "provides"
291
234
  member keyword: "provides", context: "Bluebook", at: "", named: "assignments", kind: "text", required: "false", fills: "provides"
@@ -1,19 +1,7 @@
1
- # THE LANGUAGE IS A DOMAIN LIKE ANY OTHER, and this is the line that
2
- # says so. `lib/hecks/language/bluebook/` describes what a bluebook
3
- # IS — nine files, one chapter — and until MetaValidator.defer existed it
4
- # could not be booted the ordinary way at all: each file was judged
5
- # before its siblings had been read, so Aggregate's reference to Bluebook
6
- # dangled and the load refused. It boots now, which means it can also be
7
- # fuzzed, model-checked and inspected exactly like banking or pizzas.
8
- #
9
- # Memory because this chapter is read, never written to a store — nothing
10
- # dispatches a command against the language in production. A binding
11
- # still has to be DECLARED rather than defaulted, so that what answers is
12
- # a stated fact rather than whatever the runtime happened to fall back on.
1
+ # The bluebook language as an ordinary domain, so it can be booted, fuzzed and model-checked.
2
+ # Memory: this chapter is read, never written to a store.
13
3
  Hecks.hecksagon "Bluebook" do
14
- # Several constructs here declare `role "Language"` (Aggregate.Declare,
15
- # Entity.Declare, ...) — only real access control once Governance can
16
- # check it against something (S8).
4
+ # `role "Language"` is real access control only once Governance can check it (S8).
17
5
  uses_framework "Governance"
18
6
  persisted_by "Memory"
19
7
  end
@@ -4,28 +4,12 @@ Hecks.bluebook "Bluebook" do
4
4
 
5
5
  reference_to Aggregate
6
6
 
7
- # WHICH PIECE DECLARED IT, when a piece did. A command argument with no
8
- # attribute to land in does not persist — the same lesson `disputed_by` taught
9
- # on CardPayment — so the field has to exist here for Command.Declare's
10
- # `entity_id` to be held at all.
7
+ # The entity that declared it, when one did; Command.Declare's `entity_id` needs it.
11
8
  reference_to Entity, as: :entity_id, optional: true
12
9
 
13
- # SPELLED AS THE IR SPELLS THEM. The judge walks a built IR and offers each
14
- # field by name, so a field named differently here would need a translation
15
- # table between two vocabularies for the same thing — and a table is a place
16
- # to be wrong quietly. One spelling, and the walk reads straight through.
17
- # THE IMMEDIATE OWNER, AND ITS NAME. Almost every chapter declares a
18
- # `Declare` ; the owner is what tells one from another.
19
- #
20
- # `owner_id` NOT `aggregate_id` : a command declared on an ENTITY is that
21
- # entity's, not its aggregate's — `Banking:Account:LedgerEntry:Amend` is
22
- # LedgerEntry's Amend, and `Banking:Account:LedgerEntry` is what tells it
23
- # apart from a same-named command on some OTHER entity of the same
24
- # aggregate. `aggregate_id` (kept, below, as data) still names the true
25
- # root, for the DeclaredIn walk that gathers every command under a
26
- # chapter’s aggregate whichever piece declared it ; `owner_id` names only
27
- # whichever declared THIS one. `owner_id` is not a declared attribute —
28
- # it is the WALK's immediate parent, read the same way `position` is.
10
+ # Field names match the IR's so the judge can walk it without a translation table.
11
+ # `owner_id` is the walk's immediate parent (an entity's command belongs to the entity);
12
+ # `aggregate_id` still names the true root for the DeclaredIn walk.
29
13
  identified_by :owner_id, :name
30
14
 
31
15
  attribute :name, CommandName
@@ -35,19 +19,11 @@ Hecks.bluebook "Bluebook" do
35
19
  attribute :references, EventName, optional: true
36
20
  attribute :attributes, list_of(Argument)
37
21
  attribute :givens, list_of(Rule)
38
- # THE POSTCONDITIONS — same Rule shape as givens, checked on the other
39
- # side of the mutations: a given says what must hold to begin, an
40
- # ensures says what must hold to have finished. Meyer's third leg.
22
+ # Postconditions: same Rule shape as givens, checked after the mutations.
41
23
  attribute :ensures, list_of(Rule)
42
24
  attribute :mutations, list_of(Change)
43
25
  attribute :provenance, CommandText
44
- # LIFECYCLE STATE AS A COMMAND GUARD (S10, ADR 0025) — a LITERAL,
45
- # the same shape `provenance`/`default:` already carry (`from:
46
- # "open"` or `from: ["open", "frozen"]`, encoded and decoded the
47
- # same way any other Ruby literal on this construct is), not a
48
- # dedicated list-of-value-object the way `givens` is — the guard
49
- # names no target state and moves nothing, so it needs no Rule-
50
- # shaped predicate at all, only the states it admits.
26
+ # Lifecycle guard as a literal (`from: "open"` or `from: ["open", "frozen"]`); ADR 0025.
51
27
  attribute :from, CommandText, optional: true
52
28
 
53
29
  value_object "CommandName" do
@@ -57,15 +33,11 @@ Hecks.bluebook "Bluebook" do
57
33
 
58
34
  value_object "Actor" do
59
35
  attribute :value, String
60
- # RELAXED for the experiment : banking leaves 19 of 40 commands without a
61
- # role, and the hand-written CommandBuilder never required one. Whether
62
- # role/goal are mandatory is a language decision — the meta-domain found
63
- # the drift the moment it enforced uniformly.
36
+ # Optional: many commands declare no role or goal, and the builder never required one.
64
37
  end
65
38
 
66
39
  value_object "Goal" do
67
40
  attribute :value, String
68
- # RELAXED — see Actor above.
69
41
  end
70
42
 
71
43
  value_object "EventName" do
@@ -82,10 +54,9 @@ Hecks.bluebook "Bluebook" do
82
54
  attribute :list, String
83
55
  attribute :optional, String, optional: true
84
56
  attribute :pattern, String, optional: true
85
- # optional: a declaration with no default has none (C3.7 — a value object's fields arrive or it refuses)
57
+ # A declaration with no default has none.
86
58
  attribute :default, String, optional: true
87
- # The closed set this value must belong to — see Aggregate::Field, which is
88
- # the same declaration, spelled for a command's arguments.
59
+ # The closed set this value must belong to (see Aggregate::Field).
89
60
  attribute :admits, String, optional: true
90
61
  attribute :relationship, String, optional: true
91
62
  end
@@ -97,32 +68,17 @@ Hecks.bluebook "Bluebook" do
97
68
 
98
69
  value_object "Change" do
99
70
  attribute :target, String
100
- # The same word, one aggregate over. `OpName` used to carry
101
- # `set || append || increment || decrement` in an invariant — Vocabulary's
102
- # MutationOp written out a second time, one level in, with nothing
103
- # comparing the two. Naming the set is the whole of what that invariant was
104
- # trying to say, and it says it where the set actually lives.
105
71
  attribute :op, String, admits: "Vocabulary::MutationOp"
106
72
  attribute :field, String
107
73
  attribute :kind, String
108
74
  attribute :source, String
109
75
  end
110
76
 
111
- # A plain string holder, for the id of the aggregate above. Command had no
112
- # generic text value object and the alternatives all meant something else —
113
- # RuleText is a predicate, FieldRef is a field, ArgType is a type. Reusing one
114
- # of those would read as a lie, the way `bluebook_id` typed AggregateName did.
77
+ # Plain string holder for an aggregate id; the other text value objects mean something else.
115
78
  value_object "CommandText" do
116
79
  attribute :value, String
117
80
  end
118
- # The way back: everything DECLARED IN the aggregate above. The parent
119
- # reference IS the query.
120
- # WHERE IT SITS AMONG ITS SIBLINGS. Declaration order is a FACT ABOUT THE
121
- # SOURCE — the IR is a contract read straight from this file,
122
- # field for field AND INDEX FOR INDEX. So the language HOLDS it, instead of
123
- # inheriting it from whatever order a store happens to iterate: an ask that
124
- # does not say how it is ordered is answered in identity order, which is
125
- # right for every other ask and fatal for the one that is the SOURCE.
81
+ # Declaration order is a fact about the source, so the language holds it, not the store.
126
82
  value_object "Position" do
127
83
  attribute :value, Integer
128
84
  end
@@ -139,18 +95,12 @@ Hecks.bluebook "Bluebook" do
139
95
  goal "Open a command on an aggregate"
140
96
 
141
97
  reference_to Aggregate
142
- # DECLARED ON AN AGGREGATE, or on one of its ENTITIES. The IR uses the same
143
- # Command for both — an entity's commands are Command objects — so the
144
- # language uses the same Command, and says which piece declared it when a piece
145
- # did. Absent for an aggregate's own commands, and ABSENT is not EMPTY.
98
+ # Declared on an aggregate or one of its entities; absent for an aggregate's own commands.
146
99
  reference_to Entity, as: :entity_id, optional: true
147
100
  attribute :name, CommandName
148
101
  attribute :role, Actor, optional: true
149
102
  attribute :goal, Goal, optional: true
150
- # See Aggregate.Declare's own `provenance` — identical shape, one
151
- # level down.
152
103
  attribute :provenance, CommandText, optional: true
153
- # See this aggregate's own `from` field comment, above.
154
104
  attribute :from, CommandText, optional: true
155
105
 
156
106
  attribute :position, Position, optional: true
@@ -175,18 +125,9 @@ Hecks.bluebook "Bluebook" do
175
125
  attribute :optional, ArgType, optional: true
176
126
  attribute :pattern, ArgType, optional: true
177
127
  attribute :default, ArgType, optional: true
178
- # The closed set this argument's value must belong to — see
179
- # Aggregate.Attribute, which carries the same word for a head's attributes.
128
+ # The closed set this argument's value must belong to (see Aggregate.Attribute).
180
129
  attribute :admits, ArgType, optional: true
181
- # Whether this argument was minted verbatim from the owning aggregate/
182
- # entity's own reference-typed attribute (`sets :field` importing a
183
- # `reference_to`/`has_many`/`has_one`/`belongs_to` field rather than
184
- # retyping it) — see Aggregate.Attribute, which carries the same word
185
- # for a head's own attributes. Missing here, a round trip through the
186
- # self-hosted meta-domain silently dropped it for every command
187
- # argument, even though the live DSL builder set it correctly in
188
- # memory (CommandBuilder#resolve_bare_set!) — the wire just never
189
- # carried it back.
130
+ # Marks an argument minted from the owner's reference-typed attribute.
190
131
  attribute :relationship, ArgType, optional: true
191
132
 
192
133
  sets :attributes, append: { name: :name, type: :type, list: :list, default: :default, optional: :optional, pattern: :pattern, admits: :admits, relationship: :relationship }
@@ -194,32 +135,19 @@ Hecks.bluebook "Bluebook" do
194
135
  emits ArgumentAttached
195
136
  end
196
137
 
197
- # An argument that points at ANOTHER aggregate's head — the same word
198
- # `reference_to`, written on a command instead of on the head.
199
- #
200
- # `Argument` types its type as text, so a reference argument arrived as the
201
- # STRING "Reference<Customer>" and the language held a spelling rather than a
202
- # reference. That left "a reference points at a declared head" enforceable
203
- # only by a `raise Malformed` in the DSL, for three of the four places the
204
- # word can be written. As a reference it is a consequence of the model here
205
- # too, exactly as Aggregate.Reference made it one on a head.
138
+ # An argument pointing at another aggregate's head, typed as a reference, not text.
206
139
  command "Reference" do
207
140
  role "Language"
208
141
  goal "Attach an argument that points at another aggregate's head"
209
142
 
210
143
  reference_to Aggregate, as: :points_at
211
- # No `given` that the name is present : ArgName already carries that
212
- # invariant, and a value object's invariant fires during coercion — before
213
- # any given is reached. A rule that cannot be the one to refuse is
214
- # decoration, and this language has paid for that mistake before.
144
+ # No `given` on the name: ArgName's invariant fires first, during coercion.
215
145
  attribute :name, ArgName
216
146
  attribute :list, ArgType
217
147
  attribute :optional, ArgType, optional: true
218
148
  attribute :pattern, ArgType, optional: true
219
149
  attribute :default, ArgType, optional: true
220
150
  attribute :admits, ArgType, optional: true
221
- # See Argument's own :relationship, just above — the same gap, one
222
- # verb over.
223
151
  attribute :relationship, ArgType, optional: true
224
152
 
225
153
  sets :attributes, append: { name: :name, type: :points_at, list: :list, default: :default, optional: :optional, pattern: :pattern, admits: :admits, relationship: :relationship }
@@ -276,10 +204,7 @@ Hecks.bluebook "Bluebook" do
276
204
  goal "Attach one mutation to the command"
277
205
 
278
206
  attribute :target, FieldRef
279
- # NAMED ON THE ARGUMENT, not only on the Change row it fills. The row is
280
- # what the IR holds ; THIS is what a caller hands in, so this is where a
281
- # bad op has to be refused — `OpName`'s deleted invariant was refusing
282
- # exactly here, and the link has to reach the same door to replace it.
207
+ # Named on the argument: this is what a caller hands in, so a bad op is refused here.
283
208
  attribute :op, OpName, admits: "Vocabulary::MutationOp"
284
209
  attribute :field, FieldRef
285
210
  attribute :kind, FieldRef
@@ -297,11 +222,6 @@ Hecks.bluebook "Bluebook" do
297
222
  attribute :value, String
298
223
  end
299
224
 
300
- # THE SET IT ADMITS IS NAMED, NOT RESTATED. This carried
301
- # `set || append || increment || decrement` — Vocabulary::MutationOp written
302
- # out a second time, one level in, which is exactly the kind of copy
303
- # that drifts. `Change.op` now says `admits:
304
- # Vocabulary::MutationOp`, so there is no second list left to drift.
305
225
  value_object "OpName" do
306
226
  attribute :value, String
307
227
  end
@@ -310,9 +230,7 @@ Hecks.bluebook "Bluebook" do
310
230
  role "Language"
311
231
  goal "Name the aggregate this command reaches through"
312
232
 
313
- # NAMED `root`, not `references` : a command argument SHADOWS the aggregate
314
- # field of the same name inside a given, so a once-only rule cannot read
315
- # the state it guards unless the two differ.
233
+ # Named `root`, not `references`: an argument shadows the aggregate field of that name.
316
234
  attribute :root, EventName
317
235
 
318
236
  given("a command names what it acts on") { !root.value.to_s.empty? }
@@ -336,9 +254,7 @@ Hecks.bluebook "Bluebook" do
336
254
  emits AnnouncementNamed
337
255
  end
338
256
 
339
- # HOW COMMAND IS SPELLED. These rows live with the concept
340
- # they describe; SyntaxBoot discovers every aggregate-local seed table.
341
- # Contexts represented here: Command.
257
+ # Keyword rows for this chapter; SyntaxBoot discovers aggregate-local seed tables.
342
258
  value_object "KeywordSeed" do
343
259
  attribute :word, String
344
260
  attribute :context, String, admits: "Syntax::Context"
@@ -357,37 +273,18 @@ Hecks.bluebook "Bluebook" do
357
273
  member word: "reference_to", context: "Command", body: "none", inner: "", opens: "", fills: "references", calls: "reference_to_impl"
358
274
  member word: "given", context: "Command", body: "source", inner: "", opens: "", fills: "givens", resolves_via: "hash_chain", calls: "given_impl"
359
275
  member word: "sets", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", calls: "sets_impl"
360
- # RENAMED spelling of `sets`, above — its own dedicated, deprecated row
361
- # (not `sets`'s own `was:`, syntax_conformance_spec.rb's own "no
362
- # renamed-away spelling as a row of its own AND a was:" rule), kept
363
- # here refusing live ONLY so `MetaValidator.shadow_parsing?` can still
364
- # read frozen era text that used it (CommandBuilder#then_set_impl's
365
- # own comment).
276
+ # Deprecated spelling of `sets`, still refused live so MetaValidator.shadow_parsing? can
277
+ # read frozen era text that used it.
366
278
  member word: "then_set", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", status: "deprecated", calls: "then_set_impl"
367
- # A command's synchronous handoff into one nested entity command
368
- # (CommandBuilder#delegates_to_impl's own comment gives the full
369
- # reasoning) — a new word, not a migrated one.
279
+ # Synchronous handoff into one nested entity command (CommandBuilder#delegates_to_impl).
370
280
  member word: "delegates_to", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", calls: "delegates_to_impl"
371
281
  member word: "emits", context: "Command", body: "none", inner: "", opens: "", fills: "emits"
372
- # A VALUE, NOT A DECLARATION — `state(:field)` is written INSIDE a
373
- # `sets` (`append: { knights: state(:knights) }`, `to: state(:ply)`)
374
- # and names the record's own field as that mutation's source; it
375
- # fills nothing of its own, the `sets` it sits in fills `mutations`.
282
+ # A value written inside a `sets` (`to: state(:ply)`); it fills nothing of its own.
376
283
  member word: "state", context: "Command", body: "none", inner: "", opens: "", fills: "mutations"
377
284
  member word: "attribute", context: "Command", body: "none", inner: "", opens: "", fills: "attributes", calls: "attribute_impl"
378
285
  member word: "ensures", context: "Command", body: "source", inner: "", opens: "", fills: "ensures"
379
- # RETROACTIVE CORRECTION — a command that amends a specific past
380
- # event rather than acting fresh (see this domain's own ADR on why:
381
- # sagas only compensate their OWN anticipated failures, eras only
382
- # reinterpret stored shape, and the event log stays append-only —
383
- # so nothing existing lets a command say "this is amending a fact
384
- # we already announced, and here is why"). STORED AS A MUTATION,
385
- # not a new Command field — the same reasoning `delegates_to`'s own
386
- # comment gives in full: `mutations:` is ALREADY a fully round-
387
- # tripped part of the self-hosted meta-domain's own contract, and a
388
- # genuinely new top-level Command field is not. `corrects` rides the
389
- # SAME multi-binding wire shape `append`/`delegate` already use
390
- # (CommandBuilder#corrects_impl's own comment has the rest).
286
+ # Amends a specific past event. Stored as a mutation so it round-trips with the other
287
+ # mutation words (CommandBuilder#corrects_impl).
391
288
  member word: "corrects", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", calls: "corrects_impl"
392
289
 
393
290
  end
@@ -436,14 +333,7 @@ Hecks.bluebook "Bluebook" do
436
333
  member keyword: "then_set", context: "Command", at: "", named: "remove", kind: "literal", required: "false", fills: "source", selects: "op=remove"
437
334
  member keyword: "delegates_to", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "target"
438
335
  member keyword: "delegates_to", context: "Command", at: "", named: "with", kind: "literal", required: "false", fills: "source", selects: "op=delegate"
439
- # BARE CONSTANT ACCEPTED (ADR 0025, S6 — "events first-class"),
440
- # `emits Account::AccountFrozen`, same `kind: "constant"` +
441
- # `kind: "text"` pair `on`'s own row in `policy.bluebook` carries
442
- # — both stay admitted, the old spelling not refused, for the
443
- # same reason (event names aren't 100% corpus-migrated the way
444
- # command references are). `CommandBuilder#emits` (hand-written,
445
- # no `calls:` needed — the single-fill path already invokes it by
446
- # its own word name) resolves either shape via `Naming.event_ref`.
336
+ # A bare constant (`emits Account::AccountFrozen`) or text; both go through Naming.event_ref.
447
337
  member keyword: "emits", context: "Command", at: "1", named: "", kind: "constant", required: "true", fills: "emits"
448
338
  member keyword: "emits", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "emits"
449
339
  member keyword: "state", context: "Command", at: "1", named: "", kind: "symbol", required: "true", fills: "source"
@@ -454,14 +344,7 @@ Hecks.bluebook "Bluebook" do
454
344
  member keyword: "attribute", context: "Command", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
455
345
  member keyword: "attribute", context: "Command", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
456
346
  member keyword: "attribute", context: "Command", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
457
- # `corrects` — see the KeywordSeed row's own comment. `event` is the
458
- # only positional and the only required-by-the-grammar argument;
459
- # `reason` is required IN PRACTICE (CommandBuilder#corrects_impl
460
- # refuses its absence by hand, the same way `sets` refuses two ops
461
- # at once — a fact about runtime state, not a pure per-row fill, so
462
- # it stays hand-enforced rather than declared `required: "true"`
463
- # here, which would only gate the row's OWN presence, not a sibling
464
- # kwarg's).
347
+ # `reason` is required in practice; CommandBuilder#corrects_impl refuses its absence.
465
348
  member keyword: "corrects", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "target"
466
349
  member keyword: "corrects", context: "Command", at: "", named: "as", kind: "symbol", required: "false", fills: "source"
467
350
  member keyword: "corrects", context: "Command", at: "", named: "reason", kind: "text", required: "false", fills: "source"