hecks 2.8.0 → 2.9.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 (404) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +4 -6
  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 +17 -98
  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 +4 -30
  23. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
  24. data/lib/hecks/adapters/driven/postgres.rb +145 -134
  25. data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
  26. data/lib/hecks/adapters/driven/prism.rb +7 -30
  27. data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
  28. data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
  29. data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
  30. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
  31. data/lib/hecks/adapters/driven/sqlite.rb +128 -65
  32. data/lib/hecks/adapters/driven/tenant_provisioner.rb +5 -48
  33. data/lib/hecks/adapters/driven.rb +5 -36
  34. data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
  35. data/lib/hecks/behaviors/dsl.rb +7 -25
  36. data/lib/hecks/behaviors/expectations.rb +31 -141
  37. data/lib/hecks/behaviors/ir.rb +7 -20
  38. data/lib/hecks/behaviors/rspec.rb +6 -17
  39. data/lib/hecks/behaviors/runner.rb +10 -34
  40. data/lib/hecks/behaviors.rb +4 -8
  41. data/lib/hecks/bluebook/aggregate.rb +9 -75
  42. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
  43. data/lib/hecks/bluebook/assembly/build.rb +4 -15
  44. data/lib/hecks/bluebook/assembly/contract.rb +15 -136
  45. data/lib/hecks/bluebook/assembly/contracts.rb +54 -174
  46. data/lib/hecks/bluebook/assembly/marks.rb +31 -223
  47. data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
  48. data/lib/hecks/bluebook/assembly.rb +6 -45
  49. data/lib/hecks/bluebook/attribute.rb +12 -61
  50. data/lib/hecks/bluebook/behaviour/aggregate.rb +10 -39
  51. data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
  52. data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
  53. data/lib/hecks/bluebook/behaviour/command.rb +14 -66
  54. data/lib/hecks/bluebook/behaviour/domain_port.rb +4 -20
  55. data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
  56. data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
  57. data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
  58. data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
  59. data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
  60. data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
  61. data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
  62. data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
  63. data/lib/hecks/bluebook/capabilities.rb +17 -49
  64. data/lib/hecks/bluebook/chapter.rb +10 -48
  65. data/lib/hecks/bluebook/command.rb +23 -81
  66. data/lib/hecks/bluebook/domain_port.rb +14 -63
  67. data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
  68. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
  69. data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
  70. data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
  71. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +86 -708
  72. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +56 -170
  73. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +1 -0
  74. data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
  75. data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
  76. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +12 -87
  77. data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
  78. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
  79. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +26 -194
  80. data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
  81. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
  82. data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
  83. data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
  84. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
  85. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
  86. data/lib/hecks/bluebook/dsl/query_builder.rb +11 -42
  87. data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
  88. data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
  89. data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
  90. data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
  91. data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
  92. data/lib/hecks/bluebook/dsl/world_builder.rb +19 -111
  93. data/lib/hecks/bluebook/entity.rb +13 -71
  94. data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
  95. data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
  96. data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
  97. data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
  98. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
  99. data/lib/hecks/bluebook/expression/resolver.rb +37 -660
  100. data/lib/hecks/bluebook/hexagon.rb +5 -28
  101. data/lib/hecks/bluebook/lifecycle.rb +5 -16
  102. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
  103. data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
  104. data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
  105. data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
  106. data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
  107. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +24 -176
  108. data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
  109. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +43 -305
  110. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
  111. data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
  112. data/lib/hecks/bluebook/meta_validator.rb +79 -349
  113. data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
  114. data/lib/hecks/bluebook/model_check.rb +100 -597
  115. data/lib/hecks/bluebook/pattern_subset.rb +11 -69
  116. data/lib/hecks/bluebook/process_manager.rb +13 -83
  117. data/lib/hecks/bluebook/project_loader.rb +3 -39
  118. data/lib/hecks/bluebook/project_register.rb +12 -60
  119. data/lib/hecks/bluebook/query.rb +9 -48
  120. data/lib/hecks/bluebook/read_model.rb +57 -81
  121. data/lib/hecks/bluebook/reference.rb +7 -41
  122. data/lib/hecks/bluebook/smoke_test.rb +8 -98
  123. data/lib/hecks/bluebook/synthesizer.rb +13 -62
  124. data/lib/hecks/bluebook/translation.rb +26 -62
  125. data/lib/hecks/bluebook/value_object.rb +11 -36
  126. data/lib/hecks/bluebook.rb +5 -22
  127. data/lib/hecks/cache_dir.rb +4 -23
  128. data/lib/hecks/cli/document.rb +3 -21
  129. data/lib/hecks/cli/ir.rb +3 -5
  130. data/lib/hecks/cli/mcp.rb +2 -3
  131. data/lib/hecks/cli/mcp_door.rb +19 -114
  132. data/lib/hecks/cli/model_check.rb +18 -85
  133. data/lib/hecks/cli/project_cli.rb +7 -40
  134. data/lib/hecks/cli/project_diagrams.rb +0 -7
  135. data/lib/hecks/cli/run.rb +12 -58
  136. data/lib/hecks/cli/smoke_test.rb +2 -16
  137. data/lib/hecks/cli/stores.rb +1 -2
  138. data/lib/hecks/cli.rb +18 -24
  139. data/lib/hecks/construct.rb +8 -34
  140. data/lib/hecks/deploy/bluebook/deploy.bluebook +33 -142
  141. data/lib/hecks/deploy/bluebook/deploy.hecksagon +2 -9
  142. data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
  143. data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
  144. data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
  145. data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
  146. data/lib/hecks/embryonaut_bluebook.rb +4 -71
  147. data/lib/hecks/facade/cli_door.rb +24 -106
  148. data/lib/hecks/facade/cli_runner.rb +28 -172
  149. data/lib/hecks/facade/command_request.rb +13 -33
  150. data/lib/hecks/facade/handle.rb +34 -121
  151. data/lib/hecks/facade/json_door.rb +31 -146
  152. data/lib/hecks/facade/surface/aggregate_door.rb +39 -104
  153. data/lib/hecks/facade/surface/chapter.rb +10 -54
  154. data/lib/hecks/facade/surface.rb +8 -23
  155. data/lib/hecks/facade.rb +10 -25
  156. data/lib/hecks/forms/app.rb +15 -70
  157. data/lib/hecks/forms/command_form_renderer.rb +10 -29
  158. data/lib/hecks/forms/field_renderer.rb +17 -156
  159. data/lib/hecks/forms/field_shape.rb +30 -222
  160. data/lib/hecks/forms/html.rb +12 -47
  161. data/lib/hecks/forms/index_renderer.rb +1 -4
  162. data/lib/hecks/forms/page.rb +3 -9
  163. data/lib/hecks/forms/params.rb +14 -60
  164. data/lib/hecks/forms/port_argument.rb +2 -19
  165. data/lib/hecks/forms/query_form_renderer.rb +4 -79
  166. data/lib/hecks/forms/record_renderer.rb +8 -75
  167. data/lib/hecks/forms/record_table.rb +7 -50
  168. data/lib/hecks/forms/reference_options.rb +3 -30
  169. data/lib/hecks/forms/value_object_shape.rb +8 -35
  170. data/lib/hecks/forms.rb +5 -33
  171. data/lib/hecks/fqn.rb +5 -12
  172. data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
  173. data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
  174. data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
  175. data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
  176. data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
  177. data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
  178. data/lib/hecks/framework.rb +11 -80
  179. data/lib/hecks/freezer.rb +5 -39
  180. data/lib/hecks/grammar/expression.bluebook +15 -40
  181. data/lib/hecks/grammar/translation.bluebook +3 -6
  182. data/lib/hecks/grammar.rb +16 -41
  183. data/lib/hecks/ir.rb +14 -83
  184. data/lib/hecks/language/adapter.bluebook +2 -7
  185. data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
  186. data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
  187. data/lib/hecks/language/bluebook/bluebook.bluebook +15 -83
  188. data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
  189. data/lib/hecks/language/bluebook/command.bluebook +27 -144
  190. data/lib/hecks/language/bluebook/entity.bluebook +24 -97
  191. data/lib/hecks/language/bluebook/policy.bluebook +16 -67
  192. data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
  193. data/lib/hecks/language/bluebook/projection.bluebook +126 -60
  194. data/lib/hecks/language/bluebook/query.bluebook +12 -43
  195. data/lib/hecks/language/bluebook/shape.bluebook +23 -73
  196. data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
  197. data/lib/hecks/language/bluebook/vocabulary.bluebook +82 -197
  198. data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
  199. data/lib/hecks/language/hecksagon/domain_port.bluebook +4 -19
  200. data/lib/hecks/language/hecksagon/hecksagon.bluebook +6 -25
  201. data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
  202. data/lib/hecks/language/oidc.json +35 -0
  203. data/lib/hecks/language/port.bluebook +4 -17
  204. data/lib/hecks/language/translation/translation.bluebook +3 -9
  205. data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
  206. data/lib/hecks/language/world/wiring.bluebook +1 -3
  207. data/lib/hecks/language/world/world.bluebook +5 -7
  208. data/lib/hecks/literal.rb +8 -50
  209. data/lib/hecks/mcp_door_scope.rb +9 -90
  210. data/lib/hecks/mcp_stdio_guard.rb +4 -41
  211. data/lib/hecks/naming.rb +29 -137
  212. data/lib/hecks/ports/access_control.rb +7 -23
  213. data/lib/hecks/ports/agent/answers.rb +5 -23
  214. data/lib/hecks/ports/agent.rb +47 -172
  215. data/lib/hecks/ports/authentication.rb +12 -39
  216. data/lib/hecks/ports/authorization.rb +16 -43
  217. data/lib/hecks/ports/clock.rb +5 -45
  218. data/lib/hecks/ports/extraction.rb +7 -12
  219. data/lib/hecks/ports/identity_assignment.rb +8 -29
  220. data/lib/hecks/ports/identity_generation.rb +6 -29
  221. data/lib/hecks/ports/identity_resolution.rb +2 -10
  222. data/lib/hecks/ports/key_vault.rb +9 -45
  223. data/lib/hecks/ports/persistence/append_only.rb +61 -64
  224. data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
  225. data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
  226. data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
  227. data/lib/hecks/ports/persistence/plugin.rb +13 -42
  228. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +38 -141
  229. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
  230. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +16 -84
  231. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
  232. data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +3 -22
  233. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
  234. data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
  235. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
  236. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
  237. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
  238. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
  239. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
  240. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
  241. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +18 -75
  242. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
  243. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
  244. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
  245. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
  246. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
  247. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +14 -115
  248. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
  249. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +127 -554
  250. data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
  251. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
  252. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
  253. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
  254. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
  255. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
  256. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +9 -25
  257. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
  258. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
  259. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
  260. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
  261. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
  262. data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
  263. data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
  264. data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
  265. data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
  266. data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
  267. data/lib/hecks/ports/persistence/state_codec.rb +23 -103
  268. data/lib/hecks/ports/persistence.rb +7 -14
  269. data/lib/hecks/ports/projection.rb +42 -84
  270. data/lib/hecks/ports/query/in_memory.rb +10 -58
  271. data/lib/hecks/ports/query/ordering.rb +11 -32
  272. data/lib/hecks/ports/query.rb +14 -37
  273. data/lib/hecks/ports.rb +2 -8
  274. data/lib/hecks/projections/bootstrap_table.rb +11 -43
  275. data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
  276. data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
  277. data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
  278. data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
  279. data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
  280. data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
  281. data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
  282. data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
  283. data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
  284. data/lib/hecks/projections/deploy/fargate.rb +35 -202
  285. data/lib/hecks/projections/deploy/lambda.rb +150 -678
  286. data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
  287. data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
  288. data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
  289. data/lib/hecks/projections/deploy/preview/script.rb +2 -14
  290. data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
  291. data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
  292. data/lib/hecks/projections/deploy/preview/template.rb +2 -58
  293. data/lib/hecks/projections/deploy/preview.rb +2 -67
  294. data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
  295. data/lib/hecks/projections/deploy/scripts.rb +4 -57
  296. data/lib/hecks/projections/deploy/shared.rb +47 -146
  297. data/lib/hecks/projections/deploy/smoke.rb +4 -61
  298. data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
  299. data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
  300. data/lib/hecks/projections/deploy/template_diff.rb +5 -57
  301. data/lib/hecks/projections/diagrams.rb +20 -582
  302. data/lib/hecks/projections/glossary/html.rb +14 -130
  303. data/lib/hecks/projections/glossary/markdown.rb +8 -69
  304. data/lib/hecks/projections/glossary/mermaid.rb +9 -66
  305. data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
  306. data/lib/hecks/projections/glossary/sentences.rb +14 -159
  307. data/lib/hecks/projections/glossary.rb +30 -222
  308. data/lib/hecks/projections/ir.rb +3 -10
  309. data/lib/hecks/projections/model/deviations.rb +15 -42
  310. data/lib/hecks/projections/model.rb +12 -51
  311. data/lib/hecks/projections/oidc.rb +12 -56
  312. data/lib/hecks/projections/parser_table.rb +9 -28
  313. data/lib/hecks/projections/reference.rb +2 -15
  314. data/lib/hecks/projections/rust_vocabulary.rb +12 -250
  315. data/lib/hecks/projections/shape.rb +3 -29
  316. data/lib/hecks/projections/statements.rb +7 -86
  317. data/lib/hecks/projections/vocabulary.rb +6 -22
  318. data/lib/hecks/projections.rb +2 -16
  319. data/lib/hecks/projector/cli_projector.rb +60 -375
  320. data/lib/hecks/projector/docs_projector.rb +10 -201
  321. data/lib/hecks/projector/exporter.rb +42 -134
  322. data/lib/hecks/projector/ir_projector.rb +2 -9
  323. data/lib/hecks/projector/narrate_projector.rb +15 -189
  324. data/lib/hecks/projector/target.rb +13 -76
  325. data/lib/hecks/projector.rb +30 -121
  326. data/lib/hecks/query_specification/common/comparators.rb +5 -26
  327. data/lib/hecks/query_specification/common/comparison.rb +35 -143
  328. data/lib/hecks/query_specification/common/dsl.rb +8 -24
  329. data/lib/hecks/query_specification/common/null_policy.rb +20 -70
  330. data/lib/hecks/query_specification/common/options.rb +2 -6
  331. data/lib/hecks/query_specification/common/where_clause.rb +2 -10
  332. data/lib/hecks/query_specification/field_path.rb +37 -77
  333. data/lib/hecks/query_specification/hop_path.rb +12 -76
  334. data/lib/hecks/release/gem_pin.rb +2 -26
  335. data/lib/hecks/release/runner/ci_publisher.rb +3 -6
  336. data/lib/hecks/release/runner/commands.rb +2 -4
  337. data/lib/hecks/release/runner/gem_publisher.rb +2 -3
  338. data/lib/hecks/release/runner/npm_publisher.rb +6 -20
  339. data/lib/hecks/release/runner/preflight.rb +4 -19
  340. data/lib/hecks/release/runner/tagger.rb +2 -9
  341. data/lib/hecks/release/runner.rb +3 -32
  342. data/lib/hecks/rendering.rb +4 -26
  343. data/lib/hecks/router/namespace_installer.rb +12 -36
  344. data/lib/hecks/router.rb +4 -8
  345. data/lib/hecks/runtime/aggregate_lock.rb +8 -33
  346. data/lib/hecks/runtime/boot_gates.rb +3 -18
  347. data/lib/hecks/runtime/caller.rb +19 -59
  348. data/lib/hecks/runtime/capability_graph.rb +5 -21
  349. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
  350. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +23 -160
  351. data/lib/hecks/runtime/command_interpreter.rb +124 -306
  352. data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
  353. data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
  354. data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
  355. data/lib/hecks/runtime/command_rules/emission.rb +8 -21
  356. data/lib/hecks/runtime/command_rules/references.rb +23 -202
  357. data/lib/hecks/runtime/dependency_planning.rb +30 -102
  358. data/lib/hecks/runtime/dispatcher.rb +82 -241
  359. data/lib/hecks/runtime/entity_element.rb +40 -462
  360. data/lib/hecks/runtime/entity_interpreter.rb +64 -219
  361. data/lib/hecks/runtime/errors.rb +32 -115
  362. data/lib/hecks/runtime/event.rb +3 -25
  363. data/lib/hecks/runtime/identity.rb +18 -154
  364. data/lib/hecks/runtime/instance.rb +18 -150
  365. data/lib/hecks/runtime/interpreting.rb +11 -70
  366. data/lib/hecks/runtime/invocation.rb +28 -164
  367. data/lib/hecks/runtime/loader.rb +48 -186
  368. data/lib/hecks/runtime/outbox.rb +38 -261
  369. data/lib/hecks/runtime/policy_interpreter.rb +38 -200
  370. data/lib/hecks/runtime/port_operation_interpreter.rb +26 -87
  371. data/lib/hecks/runtime/query_interpreter.rb +45 -187
  372. data/lib/hecks/runtime/reaction_invocation.rb +36 -138
  373. data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
  374. data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
  375. data/lib/hecks/runtime/reference_hop.rb +8 -81
  376. data/lib/hecks/runtime/refusal_wording.rb +8 -89
  377. data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
  378. data/lib/hecks/runtime/registry/verification.rb +52 -225
  379. data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
  380. data/lib/hecks/runtime/registry.rb +99 -244
  381. data/lib/hecks/runtime/remote_dispatcher.rb +37 -152
  382. data/lib/hecks/runtime/routing.rb +4 -15
  383. data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
  384. data/lib/hecks/runtime/saga_interpreter.rb +79 -263
  385. data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
  386. data/lib/hecks/runtime/tenant_check.rb +6 -68
  387. data/lib/hecks/runtime/tenant_scope.rb +3 -28
  388. data/lib/hecks/runtime/value/admission.rb +16 -67
  389. data/lib/hecks/runtime/value/coercion.rb +155 -641
  390. data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
  391. data/lib/hecks/runtime/value.rb +12 -84
  392. data/lib/hecks/runtime.rb +17 -65
  393. data/lib/hecks/storehouse.rb +141 -568
  394. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +8 -32
  395. data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
  396. data/lib/hecks/vendoring/git_environment.rb +2 -8
  397. data/lib/hecks/vendoring/git_source.rb +4 -10
  398. data/lib/hecks/vendoring.rb +7 -46
  399. data/lib/hecks/version.rb +3 -14
  400. data/lib/hecks.rb +26 -81
  401. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
  402. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
  403. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
  404. metadata +3 -2
@@ -1,67 +1,18 @@
1
1
  Hecks.bluebook "Bluebook" do
2
2
  aggregate "Syntax" do
3
- # HOW A BLUEBOOK IS SPELLED — the layer the language did not have.
3
+ # How a bluebook is spelled: every word, the body it opens and the field it fills.
4
+ # Declarations only, so there are no commands; spec/syntax_conformance_spec reads it.
4
5
  #
5
- # Every other file in this directory declares SHAPE. `Aggregate` has an
6
- # `identified_by` that is a `list_of(IdentityPath)` ; `Field` has a name, a
7
- # type and a cardinality. Nothing anywhere said that the field is SPELLED
8
- # `identified_by`, that a block opens with `do`, or that a symbol argument
9
- # starts with `:`. Grep this directory for keyword, token or syntax before
10
- # this file existed and the only hit was a comment.
11
- #
12
- # That gap is why the parser could not be projected, and it is also where the
13
- # bugs were. When `identified_by` became `list_of(IdentityPath)` the projected
14
- # struct regenerated to a list of strings with nobody touching it, and was
15
- # correct. The HAND-WRITTEN halves broke : a hand-written parser could not read
16
- # `identified_by do` at all and swallowed whole aggregate bodies in silence,
17
- # and a dispatcher that read the field as a scalar got nothing on an array
18
- # and fell through to a minted `"id"`. The declared half survived. The
19
- # undeclared halves did not.
20
- #
21
- # DECLARATIONS, NOT RUNTIME STATE — the same reading as Vocabulary beside it,
22
- # and no commands for the same reason. A domain does not declare its own
23
- # syntax ; the syntax is fixed when the language is defined. Nothing
24
- # dispatches this, `Plan` skips it by construction (a category with nothing
25
- # to offer contributes nothing), and `spec/syntax_conformance_spec` READS it
26
- # from the IR and holds each builder to it in both directions.
27
- #
28
- # WHY THE KEYWORD BELONGS TO THE CATEGORY AND NOT TO A RECORD. The word
29
- # `aggregate` is a fact about the Aggregate CATEGORY, not about
30
- # `Pizzas::Pizza` — and the meta-domain's records are instances. So there is
31
- # nothing for a dispatched syntax to hang off, and this is a closed set.
32
- #
33
- # WHAT IS NOT HERE. Only the `.bluebook` surface. `.port`, `.adapter`,
34
- # `.hecksagon`, `.world` and `translations/*.bluebook` are SIBLING artifacts
35
- # with their own builders and their own files ; a parser projected from this
36
- # reads bluebooks, and half-covering the siblings would say less than naming
37
- # the exclusion does.
38
- #
39
- # THIS IS ALSO WHY THE GENERIC-BLUEBOOK-READER ARC STOPS HERE.
40
- # A generic reader driven by THIS table
41
- # covers every keyword whose argument-binding this table can
42
- # express (M1-M7), down to `member`'s and `sets`' pairs, which turned out
43
- # to need a schema correction rather than new machinery. What stays
44
- # outside the table either isn't ONE shape a bigger table
45
- # would close (`attribute`, three separate irregularities) or isn't
46
- # covered by this table AT ALL : `.hecksagon`/`.world`'s open adapter-verb
47
- # vocabulary is the one truly PERMANENT exclusion, for the same reason
48
- # named above — a verb's schema is not even contained in the file being
49
- # parsed, registered instead by host application code
50
- # (`Hecks.port("post") { verb "posted_by" }`), so no table this file
51
- # could hold would ever be enough.
6
+ # Covers the `.bluebook` surface only; `.hecksagon` and `.world` adapter verbs are
7
+ # registered by host code, so no table here could hold them.
52
8
  description "How a bluebook is SPELLED — every word the surface admits, the body it may open, and the field it fills. The layer every other file in this directory does not have."
53
9
 
54
10
  belongs_to Bluebook
55
11
 
56
- # ITS NAME, and nothing else — a syntax hangs under no other thing, exactly
57
- # as a vocabulary does.
12
+ # Identified by name alone; a syntax hangs under no other thing.
58
13
  identified_by SyntaxName, as: :name
59
14
 
60
- # S14, ADR 0026 — Keyword/Argument nested here (see `entity
61
- # "Keyword"`/`entity "Argument"`, below), entities rather than
62
- # closed-set value-object members. `list_of(...)` forward-references
63
- # them the same way banking's own `attribute :ledger,
64
- # list_of(LedgerEntry)` names LedgerEntry before it is declared.
15
+ # Keyword and Argument are nested entities, forward-referenced by `list_of`.
65
16
  attribute :keywords, list_of(Keyword)
66
17
  attribute :arguments, list_of(Argument)
67
18
 
@@ -70,19 +21,9 @@ Hecks.bluebook "Bluebook" do
70
21
  invariant("a syntax is named") { !value.to_s.empty? }
71
22
  end
72
23
 
73
- # WHERE A WORD MAY BE TYPED. Mostly a category, but not always : `OneOf`,
74
- # `Lifecycle` and `Type` are bodies with no category of their own, and `File`
75
- # is the outside of every body. A context is not the same question as a
76
- # category, which is why this is its own set rather than a list of the
77
- # thirteen.
78
- #
79
- # `Lifecycle` is a DECLARED FOLD — contracts.rb folds state_field,
80
- # state_start and transitions onto whichever of Aggregate or Entity opened
81
- # it — so a word typed there fills a field of the ENCLOSING category, not of
82
- # a Lifecycle that does not exist.
83
- #
84
- # `Type` is the second argument of `attribute`, which is a place words are
85
- # spelled (`list_of`, `one_of`) and so is a context like any other.
24
+ # Where a word may be typed. Not always a category: `OneOf`, `Lifecycle` and `Type`
25
+ # are bodies without one, and `File` is the outside of every body.
26
+ # A word in `Lifecycle` fills a field of the enclosing Aggregate or Entity.
86
27
  value_object "Context" do
87
28
  attribute :name, String,
88
29
  one_of: ["File", "Bluebook", "Aggregate", "Entity", "Command", "Query", "ValueObject", "OneOf",
@@ -91,142 +32,58 @@ Hecks.bluebook "Bluebook" do
91
32
  "TranslationAggregate"]
92
33
  end
93
34
 
94
- # WHAT A WORD'S BLOCK IS, and the three answers are genuinely different
95
- # things to a parser :
96
- #
97
- # keywords a nested body of more words — `aggregate "X" do … end`
98
- # source a block that is NEVER CALLED. Its text is the declaration —
99
- # `given("…") { balance >= amount }`, `identified_by :name`.
100
- # Recovered through Ports::Extraction, which is why `number.value`
101
- # needs no method called `number` to exist.
102
- # rows a body of `member` rows and nothing else — `one_of do … end`
103
- # none no block at all
104
- #
105
- # A `source` body IS the thing the word declares : `given`'s body is the
106
- # rule's canonical text, `identified_by`'s body is the identity paths. A
107
- # `keywords` or `rows` body fills the record the word opens.
35
+ # What a word's block is:
36
+ # keywords nested words, `aggregate "X" do … end`
37
+ # source never called; its text is the declaration, `given("…") { … }`
38
+ # rows `member` rows only, `one_of do … end`
39
+ # none no block
108
40
  value_object "Body" do
109
41
  attribute :name, String, one_of: ["none", "keywords", "source", "rows"]
110
42
  end
111
43
 
112
- # WHERE A WORD STANDS IN ITS OWN LIFE. The same shape the expression
113
- # grammar's Operator carries (proposed → admitted → retired), plus
114
- # `deprecated` — a word still read but on its way out, which an operator
115
- # never needed because nothing outside this repo writes expressions yet.
116
- # A row DEFAULTS to admitted, so the table below stays a table of words
117
- # rather than a table of words-with-ceremony; only a word entering or
118
- # leaving the language spells its status. The projections read this:
119
- # a proposed or retired word reaches no generated parser table, so to
120
- # every projected reader it simply does not exist — the operator rule,
121
- # at the syntax layer.
44
+ # Where a word stands in its life. A row defaults to admitted; a proposed or retired
45
+ # word reaches no generated parser table.
122
46
  value_object "Status" do
123
47
  attribute :name, String, one_of: ["proposed", "admitted", "deprecated", "retired"]
124
48
  end
125
49
 
126
- # WHICH OF THE THREE SHARED RESOLUTION PRIMITIVES (Hecks::
127
- # Bluebook::DSL::RuleReference — a "declared once, referenced by
128
- # name" family word's own bare form resolves through, once it has
129
- # one: `hash_chain` (an ordered chain of flat pools, first match
130
- # wins — `given` on Command), `owner_keyed` (one pool keyed by
131
- # declaring owner, needing `disambiguator` below to pick among more
132
- # than one candidate — `given` on Aggregate), `sibling_scan` (a
133
- # live scan over already-built sibling objects, no separate pool at
134
- # all — `invariant` on ValueObject). BLANK for every OTHER word —
135
- # most of the language declares once and is never referenced back,
136
- # so `Keyword#resolves_via` stays optional rather than forcing every
137
- # existing row to spell "none."
50
+ # Which shared resolution primitive (Hecks::Bluebook::DSL::RuleReference) a word's bare
51
+ # form resolves through: an ordered chain of pools, one pool keyed by owner, or a scan
52
+ # of sibling objects. Blank for words that are never referenced back.
138
53
  value_object "ResolutionScope" do
139
54
  attribute :name, String, one_of: ["hash_chain", "owner_keyed", "sibling_scan"]
140
55
  end
141
56
 
142
- # WHICH DISAMBIGUATOR KEYWORD a bare reference may supply when its
143
- # own `resolves_via` is `owner_keyed` and more than one candidate is
144
- # registered — `declared_by:` is the only one that exists today
145
- # (`AggregateBuilder#given`'s own chapter-wide sharing,
146
- # docs/implemented/resolution-rules/chapter-given.md). A closed set of one,
147
- # deliberately, not a boolean flag — the SAME reason `Body`/`Status`
148
- # above are closed sets rather than booleans even where today's
149
- # count is small: a second disambiguator kind, if this family ever
150
- # grows one, is a new MEMBER of this set, not a second attribute.
57
+ # The keyword a bare reference may supply to pick among `owner_keyed` candidates.
58
+ # A closed set rather than a flag, so a second kind is a new member.
151
59
  value_object "Disambiguator" do
152
60
  attribute :name, String, one_of: ["declared_by"]
153
61
  end
154
62
 
155
- # WHAT AN ARGUMENT LOOKS LIKE WHEN IT IS TYPED. Lexical, not semantic — two
156
- # arguments of the same kind are read the same way and mean whatever the
157
- # field they fill means.
158
- #
159
- # `literal` is the widest : a default is written so its TYPE survives — `0`
160
- # rather than `"0"`, `0.0` rather than `"0.0"` — which is what LiteralText is
161
- # about, and why it is not `text`.
63
+ # What an argument looks like when typed; lexical, not semantic.
64
+ # `literal` keeps its type (`0` rather than `"0"`), which is why it is not `text`.
162
65
  value_object "ArgumentKind" do
163
66
  attribute :name, String,
164
67
  one_of: ["text", "symbol", "number", "flag", "literal", "constant", "pairs", "list"]
165
68
  end
166
69
 
167
- # WHAT A `pairs` ARGUMENT'S OWN PAIR(S) DO. Found by tracing every real
168
- # `pairs` reader (parse_where_line, parse_pm_handler, parse_lifecycle,
169
- # parse_with_hash, `one_of`'s member builder, `sets`' append: builder) —
170
- # four genuinely different shapes were hiding under one `kind`:
171
- #
172
- # fields ONE pair, contributing two NAMED SUB-FIELDS to the single
173
- # compound this keyword invocation is already building — the
174
- # same role a positional argument plays, just sourced from a
175
- # pair instead of a bare token. `on`'s `transition:` sets
176
- # `from_state`/`to_state` on the ProcessManagerHandler its
177
- # OWN `event_type` argument is also filling ; Lifecycle's
178
- # `transition` sets `command`/`to_state` on the Transition
179
- # its own `from:` argument also fills.
180
- # elements EACH pair independently becomes a NEW compound, appended to
181
- # the keyword's own list field (`where`'s own `fills:
182
- # "wheres"`, declared at the Keyword level, same as
183
- # `attribute`'s). `where(balance: {gte: 100}, status: "open")`
184
- # is two WhereClauses from one line, not one.
185
- # verbatim each pair is captured as-is, key and value both left as
186
- # text — `dispatch`'s `with:` : resolution (`:name` reference
187
- # vs literal) happens at DISPATCH time, not parse time, so
188
- # there is nothing to interpret here at all.
189
- # sibling the pair's KEY names a field of an ALREADY-DECLARED sibling
190
- # construct — `member`'s keys are the enclosing value
191
- # object's own attributes ; `sets`' `append:` keys are the
192
- # target entity/value-object's own attributes. Not a static
193
- # fact this table can enumerate (the valid keys differ per
194
- # domain) — named here so a reader knows to resolve
195
- # dynamically rather than assume an omission.
70
+ # What a `pairs` argument's pairs do:
71
+ # fields one pair supplying two named sub-fields of the compound being built
72
+ # elements each pair becomes a new compound appended to the keyword's list field
73
+ # verbatim each pair kept as text; resolved at dispatch time, not parse time
74
+ # sibling the key names a field of an already-declared sibling; resolved dynamically
196
75
  value_object "PairsShape" do
197
76
  attribute :name, String, one_of: ["fields", "elements", "verbatim", "sibling"]
198
77
  end
199
78
 
200
- # THE SPELLINGS LIVE WITH THEIR DOMAIN CONCEPTS. Each aggregate declares
201
- # its own KeywordSeed and ArgumentSeed value objects beside the behavior
202
- # those rows describe. SyntaxBoot discovers and combines those local tables
203
- # automatically; this aggregate owns only the live Keyword/Argument records
204
- # and the genuinely shared lexical vocabulary below.
205
-
79
+ # Spelling rows live in each aggregate's own KeywordSeed and ArgumentSeed; SyntaxBoot
80
+ # combines them. This aggregate owns the live records and the shared vocabulary.
206
81
 
207
- # S14, ADR 0026 — "`Status` becomes a real `lifecycle` with declared
208
- # transitions, so the ordering is enforced by declaration and the
209
- # model checker can finally see it" (the ADR's own words). A value
210
- # object has no identity, so it cannot transition — it can only be
211
- # replaced wholesale (this file's own prior header, before this
212
- # slice) — so Keyword and Argument become genuine ENTITIES of
213
- # Syntax, each carrying a real `lifecycle :status`.
214
- #
215
- # THE REAL RECORD, not the source. The aggregate-local `KeywordSeed` rows
216
- # are what get WRITTEN — hand-typed grammar data, still the
217
- # natural way to spell ~106 static facts. `Keyword` is what gets
218
- # READ : `SyntaxBoot` (meta_validator/syntax_boot.rb) dispatches one
219
- # `Syntax.Keyword` per seed row, once, at boot, into a REAL "Bluebook"
220
- # domain runtime — the same distinction `Reconstruction`/`Judge`
221
- # already draw everywhere else between what a chapter DECLARES and
222
- # what gets DISPATCHED from it, just run once more, for the
223
- # language's own grammar table this time.
82
+ # Keyword and Argument are entities so each can carry a real `lifecycle :status`.
83
+ # SyntaxBoot dispatches one `Syntax.Keyword` per seed row at boot.
224
84
  #
225
- # `identified_by :position` — POSITIONAL, the same reason Member's
226
- # own is (S17): a keyword row has no other field guaranteed unique on
227
- # its own (the same word is legitimately admitted in more than one
228
- # context), and declaration order is a fact about the SOURCE the
229
- # language already holds deliberately elsewhere.
85
+ # Identified by position: the same word is legitimately admitted in more than one
86
+ # context, so no other field is unique.
230
87
  value_object "KeywordPosition" do
231
88
  attribute :value, Integer
232
89
  end
@@ -243,47 +100,18 @@ Hecks.bluebook "Bluebook" do
243
100
  attribute :opens, KeywordSeedText
244
101
  attribute :fills, KeywordSeedText
245
102
  attribute :was, KeywordSeedText, optional: true
246
- # WHICH SHARED PRIMITIVE (Hecks::Bluebook::DSL::
247
- # RuleReference) this word's own bare form resolves through, once
248
- # it has one — see `ResolutionScope`'s own comment, above, for the
249
- # three real values and which existing word declares each.
250
- # BLANK for every other word.
103
+ # The shared primitive this word's bare form resolves through; see `ResolutionScope`.
251
104
  attribute :resolves_via, KeywordSeedText, admits: "Syntax::ResolutionScope", optional: true
252
- # WHICH DISAMBIGUATOR keyword argument a bare reference may supply
253
- # when `resolves_via` is `owner_keyed` — see `Disambiguator`'s own
254
- # comment. BLANK unless `resolves_via` is `owner_keyed` AND more
255
- # than one candidate can register (today: `given` on Aggregate,
256
- # and `given` on Entity, one level down — chapter-wide sharing at
257
- # each scope it has grown to).
105
+ # Blank unless `resolves_via` is `owner_keyed` and several candidates can register.
258
106
  attribute :disambiguator, KeywordSeedText, admits: "Syntax::Disambiguator", optional: true
259
- # THE ESCAPE HATCH — item #13's full metaprogrammed dispatch (slice
260
- # 3, whole-project table-unification survey). BLANK for every word
261
- # `GenericDispatch` fills/opens/zero-args directly off `fills:`/
262
- # `opens:`. NON-EMPTY names a real Ruby method this word's whole
263
- # call (args, kwargs, block, untouched) forwards to instead — for
264
- # words whose own logic is genuinely too complex to re-derive from
265
- # argument shape alone (`attribute`'s own type-quoting/closed-set-
266
- # synthesis/pattern validation). The method itself stays exactly
267
- # what it always was, hand-written, unchanged — this column only
268
- # says WHICH one answers the word, the same way `resolves_via`
269
- # already names which shared primitive a bare reference resolves
270
- # through, one level up. Read DURING bootstrap too (`WordGate`'s
271
- # own `BOOTSTRAP_CALLS_FALLBACK`, a small explicit table naming
272
- # the SAME (context, word) -> method pairs this column would say,
273
- # since the real table doesn't exist yet at that point) — the one
274
- # place in this whole arc a bootstrap fallback was worth building,
275
- # because it duplicates NO logic, only a method NAME.
107
+ # Escape hatch: blank means `GenericDispatch` fills/opens the word directly. Non-empty
108
+ # names the Ruby method the whole call forwards to, for words too complex to derive
109
+ # from argument shape. Read during bootstrap via `WordGate`'s BOOTSTRAP_CALLS_FALLBACK.
276
110
  attribute :calls, KeywordSeedText, optional: true
277
111
 
278
112
  lifecycle :status, default: "admitted" do
279
- # NOT `proposed` : nothing in the real table is ever declared
280
- # proposed today, and the lifecycle's own default has to stay
281
- # "admitted" to match every existing row's own implicit status —
282
- # changing it would make every one of the ~106 rows silently
283
- # start "proposed" instead. Declaring `proposed` as a state
284
- # reachable from nowhere would be exactly the kind of decorative,
285
- # unused declaration this whole ADR series exists to catch — so
286
- # it is left out, honestly, rather than declared and unreachable.
113
+ # No `proposed` state: no row is declared proposed, and the default must stay
114
+ # "admitted" to match every existing row.
287
115
  transition "Deprecate" => "deprecated", from: "admitted"
288
116
  transition "Retire" => "retired", from: ["admitted", "deprecated"]
289
117
  end
@@ -303,11 +131,7 @@ Hecks.bluebook "Bluebook" do
303
131
  end
304
132
  end
305
133
 
306
- # S14, ADR 0026 — same reason Keyword's own is, one construct over.
307
- # `identified_by :position` — positional, the SAME field name as
308
- # Keyword's own on purpose: an Argument row's identity is never
309
- # compared against a Keyword row's, so the shared name costs nothing
310
- # and names the same fact both times.
134
+ # Identified by position, as Keyword is; Argument and Keyword rows are never compared.
311
135
  value_object "ArgumentPosition" do
312
136
  attribute :value, Integer
313
137
  end
@@ -329,42 +153,14 @@ Hecks.bluebook "Bluebook" do
329
153
  attribute :pair_value_fills, ArgumentSeedText, optional: true
330
154
  attribute :pairs_shape, ArgumentSeedText, optional: true
331
155
  attribute :variadic, ArgumentSeedText, optional: true
332
- # Minimum positional count for a variadic form. `identified_by` uses
333
- # two so one symbol can retire without retiring compound keys.
156
+ # Minimum positional count for a variadic form.
334
157
  attribute :minimum, ArgumentSeedText, optional: true
335
- # ABSENT means "apply the uniform, kind-driven coercion" (text ->
336
- # .to_s, symbol -> .to_sym) — item #13's full metaprogrammed
337
- # dispatch (slice 1, whole-project table-unification survey) reads
338
- # this to decide whether a GENERATED fill method may coerce its own
339
- # argument before storing it. `"false"` marks the six real
340
- # exceptions a full builder-method audit found (read the real Ruby
341
- # source, not inferred): `vision`/`description`(x4)/`goal` all
342
- # store a `kind: "text"` argument RAW, with no `.to_s` at all —
343
- # `.to_s` on an actual String is a same-object no-op for every real
344
- # corpus use, but a direct Ruby API call passing something else
345
- # (`vision(42)`) would see genuinely different stored behavior, so
346
- # this couldn't be assumed uniform across every text-kind row the
347
- # way it turned out to genuinely be for every OTHER text-kind
348
- # argument in the whole grammar.
158
+ # Absent means the uniform kind-driven coercion (text -> .to_s, symbol -> .to_sym).
159
+ # "false" marks the words (`vision`, `description`, `goal`) that store a text argument raw.
349
160
  attribute :coerce, ArgumentSeedText, optional: true
350
- # ABSENT means "an empty value is stored same as any other" — item
351
- # #13's full metaprogrammed dispatch (slice 2, whole-project
352
- # table-unification survey). NON-EMPTY names the exact Malformed
353
- # message a real word's own hand-written method raised on a blank
354
- # value BEFORE storing it (`Translation#retired`: "a retired needs
355
- # an aggregate name"; `TranslationAggregate#drop`: "a drop needs a
356
- # name") — `required: "true"` alone only gates Ruby's own ARITY
357
- # (an argument omitted entirely), never a present-but-blank one,
358
- # so this is a genuinely separate fact the table did not already
359
- # carry. Most `required: "true"` rows do NOT raise on blank
360
- # (confirmed by reading every one migrated in slice 1 —
361
- # `Policy#on`/`ProcessManager#correlates_by`/etc. all accept and
362
- # store an empty string same as any other), so this could not be
363
- # assumed uniform from `required:` either. Carries the REAL text
364
- # rather than a generated one — refusal wording is itself a
365
- # checked contract in this codebase (item #2, whole-project
366
- # table-unification survey, `RefusalWording::TEMPLATES`), not
367
- # throwaway UX text a generic template could safely replace.
161
+ # Absent means a blank value is stored like any other. Non-empty is the exact Malformed
162
+ # message raised on a blank value; `required` only gates arity. Refusal wording is a
163
+ # checked contract (`RefusalWording::TEMPLATES`), so the real text is carried.
368
164
  attribute :blank_message, ArgumentSeedText, optional: true
369
165
 
370
166
  lifecycle :status, default: "admitted" do
@@ -395,10 +191,7 @@ Hecks.bluebook "Bluebook" do
395
191
  attribute :value, String
396
192
  end
397
193
 
398
- # THE SYNTAX RECORD ITSELF. There is only ever one — the language
399
- # describes its own single surface, not several — so unlike every
400
- # other aggregate's own creating command, this carries no `position`:
401
- # there are no siblings to order among.
194
+ # There is only ever one Syntax record, so this carries no `position`.
402
195
  command "Declare" do
403
196
  role "Language"
404
197
  goal "Open the language's own syntax table"
@@ -412,12 +205,8 @@ Hecks.bluebook "Bluebook" do
412
205
  emits SyntaxDeclared
413
206
  end
414
207
 
415
- # THE KEYWORD'S OWN CREATION. An entity is never created through its
416
- # own dotted verb (S17's own finding, EntityInterpreter#element_of
417
- # only LOCATES) — so, mirroring `ValueObject.Member`/`ProcessManager.
418
- # Handler`, this is a bare, aggregate-level append. `position` is
419
- # minted by `SyntaxBoot` as the seed row's own index — the same walk-
420
- # index convention Member's own `position` already uses.
208
+ # An entity is never created by its own dotted verb, so this is an aggregate-level append.
209
+ # `position` is minted by `SyntaxBoot` as the seed row's index.
421
210
  command "Keyword" do
422
211
  role "Language"
423
212
  goal "Admit one word the bluebook surface accepts"