hecks 0.2.0 → 0.3.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 (408) hide show
  1. checksums.yaml +5 -5
  2. data/lib/hecks/adapters/driven/claude_code.adapter +3 -0
  3. data/lib/hecks/adapters/driven/claude_code.rb +127 -0
  4. data/lib/hecks/adapters/driven/d1.adapter +12 -0
  5. data/lib/hecks/adapters/driven/d1.rb +403 -0
  6. data/lib/hecks/adapters/driven/folder.adapter +3 -0
  7. data/lib/hecks/adapters/driven/folder.rb +199 -0
  8. data/lib/hecks/adapters/driven/google_authentication.adapter +3 -0
  9. data/lib/hecks/adapters/driven/google_authentication.rb +100 -0
  10. data/lib/hecks/adapters/driven/governance_authorization.adapter +3 -0
  11. data/lib/hecks/adapters/driven/governance_authorization.rb +62 -0
  12. data/lib/hecks/adapters/driven/heki/journal.rb +51 -0
  13. data/lib/hecks/adapters/driven/heki/saga_store.rb +0 -0
  14. data/lib/hecks/adapters/driven/heki/snapshot.rb +38 -0
  15. data/lib/hecks/adapters/driven/heki.adapter +4 -0
  16. data/lib/hecks/adapters/driven/heki.rb +148 -0
  17. data/lib/hecks/adapters/driven/identity_registry.adapter +3 -0
  18. data/lib/hecks/adapters/driven/identity_registry.rb +26 -0
  19. data/lib/hecks/adapters/driven/in_memory_ordering.rb +51 -0
  20. data/lib/hecks/adapters/driven/lambda/client.rb +63 -0
  21. data/lib/hecks/adapters/driven/lambda.adapter +4 -0
  22. data/lib/hecks/adapters/driven/lambda.rb +131 -0
  23. data/lib/hecks/adapters/driven/memory.adapter +3 -0
  24. data/lib/hecks/adapters/driven/memory.rb +103 -0
  25. data/lib/hecks/adapters/driven/mock_stripe_adapter.adapter +3 -0
  26. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +28 -0
  27. data/lib/hecks/adapters/driven/postgres/codec.rb +80 -0
  28. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +168 -0
  29. data/lib/hecks/adapters/driven/postgres.adapter +5 -0
  30. data/lib/hecks/adapters/driven/postgres.rb +391 -0
  31. data/lib/hecks/adapters/driven/postgres_era/lineage/era_store.rb +171 -0
  32. data/lib/hecks/adapters/driven/postgres_era/lineage/field_cache.rb +190 -0
  33. data/lib/hecks/adapters/driven/postgres_era/lineage/head_compiler.rb +429 -0
  34. data/lib/hecks/adapters/driven/postgres_era/lineage/mint_transaction.rb +166 -0
  35. data/lib/hecks/adapters/driven/postgres_era/lineage/provisioning.rb +286 -0
  36. data/lib/hecks/adapters/driven/postgres_era/lineage/resumable_backfill.rb +168 -0
  37. data/lib/hecks/adapters/driven/postgres_era/lineage/tail_merge.rb +163 -0
  38. data/lib/hecks/adapters/driven/postgres_era/lineage/transform_installer.rb +114 -0
  39. data/lib/hecks/adapters/driven/postgres_era/lineage.rb +137 -0
  40. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/coverage_check.rb +89 -0
  41. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolver.rb +82 -0
  42. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/merge_coordinator.rb +43 -0
  43. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/minter.rb +132 -0
  44. data/lib/hecks/adapters/driven/postgres_era/lineage_manager.rb +74 -0
  45. data/lib/hecks/adapters/driven/postgres_era.adapter +6 -0
  46. data/lib/hecks/adapters/driven/postgres_era.rb +671 -0
  47. data/lib/hecks/adapters/driven/prism.adapter +3 -0
  48. data/lib/hecks/adapters/driven/prism.rb +80 -0
  49. data/lib/hecks/adapters/driven/secure_random_identity.adapter +3 -0
  50. data/lib/hecks/adapters/driven/secure_random_identity.rb +14 -0
  51. data/lib/hecks/adapters/driven/sql_query_builder.rb +221 -0
  52. data/lib/hecks/adapters/driven/sqlite/codec.rb +63 -0
  53. data/lib/hecks/adapters/driven/sqlite/projection.rb +105 -0
  54. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +180 -0
  55. data/lib/hecks/adapters/driven/sqlite.adapter +9 -0
  56. data/lib/hecks/adapters/driven/sqlite.rb +285 -0
  57. data/lib/hecks/adapters/driven/system_clock.adapter +3 -0
  58. data/lib/hecks/adapters/driven/system_clock.rb +14 -0
  59. data/lib/hecks/adapters/driven.rb +36 -0
  60. data/lib/hecks/adapters.rb +6 -0
  61. data/lib/hecks/behaviors/dsl.rb +96 -0
  62. data/lib/hecks/behaviors/expectations.rb +280 -0
  63. data/lib/hecks/behaviors/ir.rb +31 -0
  64. data/lib/hecks/behaviors/rspec.rb +42 -0
  65. data/lib/hecks/behaviors/runner.rb +96 -0
  66. data/lib/hecks/behaviors.rb +25 -0
  67. data/lib/hecks/bluebook/aggregate.rb +108 -0
  68. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +134 -0
  69. data/lib/hecks/bluebook/assembly/build.rb +48 -0
  70. data/lib/hecks/bluebook/assembly/contract.rb +112 -0
  71. data/lib/hecks/bluebook/assembly/contracts.rb +409 -0
  72. data/lib/hecks/bluebook/assembly/marks.rb +227 -0
  73. data/lib/hecks/bluebook/assembly/specializer.rb +70 -0
  74. data/lib/hecks/bluebook/assembly.rb +78 -0
  75. data/lib/hecks/bluebook/attribute.rb +96 -0
  76. data/lib/hecks/bluebook/behaviour/aggregate.rb +83 -0
  77. data/lib/hecks/bluebook/behaviour/attribute.rb +27 -0
  78. data/lib/hecks/bluebook/behaviour/chapter.rb +72 -0
  79. data/lib/hecks/bluebook/behaviour/command.rb +116 -0
  80. data/lib/hecks/bluebook/behaviour/domain_port.rb +25 -0
  81. data/lib/hecks/bluebook/behaviour/entity.rb +59 -0
  82. data/lib/hecks/bluebook/behaviour/hexagon.rb +50 -0
  83. data/lib/hecks/bluebook/behaviour/lifecycle.rb +51 -0
  84. data/lib/hecks/bluebook/behaviour/policy.rb +52 -0
  85. data/lib/hecks/bluebook/behaviour/process_manager.rb +38 -0
  86. data/lib/hecks/bluebook/behaviour/query.rb +10 -0
  87. data/lib/hecks/bluebook/behaviour/read_model.rb +29 -0
  88. data/lib/hecks/bluebook/behaviour/traits.rb +81 -0
  89. data/lib/hecks/bluebook/behaviour/value_object.rb +33 -0
  90. data/lib/hecks/bluebook/chapter.rb +68 -0
  91. data/lib/hecks/bluebook/command.rb +124 -0
  92. data/lib/hecks/bluebook/domain_port.rb +102 -0
  93. data/lib/hecks/bluebook/dsl/adapter_builder.rb +34 -0
  94. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +906 -0
  95. data/lib/hecks/bluebook/dsl/attribute_collector.rb +327 -0
  96. data/lib/hecks/bluebook/dsl/binding_proxy.rb +71 -0
  97. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +1018 -0
  98. data/lib/hecks/bluebook/dsl/command_builder.rb +626 -0
  99. data/lib/hecks/bluebook/dsl/const_shim.rb +81 -0
  100. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +79 -0
  101. data/lib/hecks/bluebook/dsl/entity_builder.rb +305 -0
  102. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +366 -0
  103. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +163 -0
  104. data/lib/hecks/bluebook/dsl/identity_declaration.rb +191 -0
  105. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +44 -0
  106. data/lib/hecks/bluebook/dsl/malformed.rb +7 -0
  107. data/lib/hecks/bluebook/dsl/policy_builder.rb +120 -0
  108. data/lib/hecks/bluebook/dsl/port_builder.rb +30 -0
  109. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +142 -0
  110. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +207 -0
  111. data/lib/hecks/bluebook/dsl/query_builder.rb +113 -0
  112. data/lib/hecks/bluebook/dsl/read_model_builder.rb +233 -0
  113. data/lib/hecks/bluebook/dsl/rule_reference.rb +172 -0
  114. data/lib/hecks/bluebook/dsl/translation_builder.rb +243 -0
  115. data/lib/hecks/bluebook/dsl/value_object_builder.rb +178 -0
  116. data/lib/hecks/bluebook/dsl/word_gate.rb +221 -0
  117. data/lib/hecks/bluebook/dsl/world_builder.rb +77 -0
  118. data/lib/hecks/bluebook/dsl.rb +45 -0
  119. data/lib/hecks/bluebook/entity.rb +103 -0
  120. data/lib/hecks/bluebook/expression/canonical_form.rb +55 -0
  121. data/lib/hecks/bluebook/expression/evaluator.rb +261 -0
  122. data/lib/hecks/bluebook/expression/projection.json +170 -0
  123. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +233 -0
  124. data/lib/hecks/bluebook/expression/resolver.rb +630 -0
  125. data/lib/hecks/bluebook/expression.rb +13 -0
  126. data/lib/hecks/bluebook/hexagon.rb +60 -0
  127. data/lib/hecks/bluebook/lifecycle.rb +42 -0
  128. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +54 -0
  129. data/lib/hecks/bluebook/meta_validator/judge.rb +559 -0
  130. data/lib/hecks/bluebook/meta_validator/plan.rb +332 -0
  131. data/lib/hecks/bluebook/meta_validator/port_judge.rb +47 -0
  132. data/lib/hecks/bluebook/meta_validator/readings.rb +350 -0
  133. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +312 -0
  134. data/lib/hecks/bluebook/meta_validator/shapes.rb +246 -0
  135. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +255 -0
  136. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +138 -0
  137. data/lib/hecks/bluebook/meta_validator/world_judge.rb +78 -0
  138. data/lib/hecks/bluebook/meta_validator.rb +452 -0
  139. data/lib/hecks/bluebook/model_check.rb +318 -0
  140. data/lib/hecks/bluebook/pattern_subset.rb +120 -0
  141. data/lib/hecks/bluebook/policy.rb +41 -0
  142. data/lib/hecks/bluebook/process_manager.rb +86 -0
  143. data/lib/hecks/bluebook/project_discovery.rb +30 -0
  144. data/lib/hecks/bluebook/project_loader.rb +40 -0
  145. data/lib/hecks/bluebook/project_register.rb +82 -0
  146. data/lib/hecks/bluebook/query.rb +61 -0
  147. data/lib/hecks/bluebook/read_model.rb +109 -0
  148. data/lib/hecks/bluebook/reference.rb +74 -0
  149. data/lib/hecks/bluebook/smoke_test.rb +166 -0
  150. data/lib/hecks/bluebook/synthesizer.rb +95 -0
  151. data/lib/hecks/bluebook/translation.rb +92 -0
  152. data/lib/hecks/bluebook/value_object.rb +58 -0
  153. data/lib/hecks/bluebook.rb +74 -0
  154. data/lib/hecks/codemod.rb +342 -0
  155. data/lib/hecks/construct.rb +71 -0
  156. data/lib/hecks/deploy/bluebook/deploy.bluebook +219 -0
  157. data/lib/hecks/deploy/bluebook/deploy.hecksagon +4 -0
  158. data/lib/hecks/deploy/oidc.json +18 -0
  159. data/lib/hecks/doc/reference.rb +389 -0
  160. data/lib/hecks/embryonaut_bluebook.rb +75 -0
  161. data/lib/hecks/facade/cli_door.rb +116 -0
  162. data/lib/hecks/facade/cli_runner.rb +190 -0
  163. data/lib/hecks/facade/command_request.rb +105 -0
  164. data/lib/hecks/facade/handle.rb +173 -0
  165. data/lib/hecks/facade/json_door.rb +154 -0
  166. data/lib/hecks/facade/surface/aggregate_door.rb +185 -0
  167. data/lib/hecks/facade/surface/chapter.rb +107 -0
  168. data/lib/hecks/facade/surface.rb +48 -0
  169. data/lib/hecks/facade.rb +44 -0
  170. data/lib/hecks/forms/app.rb +300 -0
  171. data/lib/hecks/forms/command_form_renderer.rb +113 -0
  172. data/lib/hecks/forms/examples/banking_console.bluebook +3 -0
  173. data/lib/hecks/forms/field_renderer.rb +170 -0
  174. data/lib/hecks/forms/field_shape.rb +232 -0
  175. data/lib/hecks/forms/html.rb +53 -0
  176. data/lib/hecks/forms/index_renderer.rb +35 -0
  177. data/lib/hecks/forms/page.rb +157 -0
  178. data/lib/hecks/forms/params.rb +132 -0
  179. data/lib/hecks/forms/query_form_renderer.rb +114 -0
  180. data/lib/hecks/forms/record_renderer.rb +115 -0
  181. data/lib/hecks/forms/record_table.rb +63 -0
  182. data/lib/hecks/forms/reference_options.rb +30 -0
  183. data/lib/hecks/forms/value_object_shape.rb +46 -0
  184. data/lib/hecks/forms.rb +54 -0
  185. data/lib/hecks/fqn.rb +94 -0
  186. data/lib/hecks/framework/bluebook/compliance.bluebook +1 -0
  187. data/lib/hecks/framework/bluebook/console_settings.bluebook +489 -0
  188. data/lib/hecks/framework/bluebook/framework.hecksagon +32 -0
  189. data/lib/hecks/framework/bluebook/governance.bluebook +130 -0
  190. data/lib/hecks/framework/bluebook/identity.bluebook +90 -0
  191. data/lib/hecks/framework/oidc.json +39 -0
  192. data/lib/hecks/framework.rb +90 -0
  193. data/lib/hecks/freezer.rb +67 -0
  194. data/lib/hecks/fuzzing/invalid_value_generator.rb +86 -0
  195. data/lib/hecks/fuzzing/isolated_boot.rb +92 -0
  196. data/lib/hecks/fuzzing/properties.rb +1146 -0
  197. data/lib/hecks/fuzzing/replay.rb +635 -0
  198. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +93 -0
  199. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +54 -0
  200. data/lib/hecks/fuzzing/sequence_generator/picker.rb +96 -0
  201. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +185 -0
  202. data/lib/hecks/fuzzing/sequence_generator.rb +130 -0
  203. data/lib/hecks/fuzzing/value_generator.rb +177 -0
  204. data/lib/hecks/fuzzing.rb +12 -0
  205. data/lib/hecks/grammar/evolve.rb +291 -0
  206. data/lib/hecks/grammar/expression.bluebook +417 -0
  207. data/lib/hecks/grammar/expression_operators.json +1152 -0
  208. data/lib/hecks/grammar/grammar.hecksagon +20 -0
  209. data/lib/hecks/grammar/oidc.json +69 -0
  210. data/lib/hecks/grammar/translation.bluebook +203 -0
  211. data/lib/hecks/grammar.rb +178 -0
  212. data/lib/hecks/ir.rb +126 -0
  213. data/lib/hecks/language/adapter.bluebook +116 -0
  214. data/lib/hecks/language/bluebook/aggregate.bluebook +581 -0
  215. data/lib/hecks/language/bluebook/attaches/paging.bluebook +76 -0
  216. data/lib/hecks/language/bluebook/bluebook.bluebook +256 -0
  217. data/lib/hecks/language/bluebook/bluebook.hecksagon +24 -0
  218. data/lib/hecks/language/bluebook/command.bluebook +437 -0
  219. data/lib/hecks/language/bluebook/entity.bluebook +316 -0
  220. data/lib/hecks/language/bluebook/policy.bluebook +172 -0
  221. data/lib/hecks/language/bluebook/process_manager.bluebook +264 -0
  222. data/lib/hecks/language/bluebook/projection.bluebook +267 -0
  223. data/lib/hecks/language/bluebook/query.bluebook +245 -0
  224. data/lib/hecks/language/bluebook/shape.bluebook +292 -0
  225. data/lib/hecks/language/bluebook/syntax.bluebook +447 -0
  226. data/lib/hecks/language/bluebook/vocabulary.bluebook +364 -0
  227. data/lib/hecks/language/hecksagon/adapter_binding.bluebook +51 -0
  228. data/lib/hecks/language/hecksagon/domain_port.bluebook +76 -0
  229. data/lib/hecks/language/hecksagon/hecksagon.bluebook +131 -0
  230. data/lib/hecks/language/hecksagon/port_operation.bluebook +102 -0
  231. data/lib/hecks/language/oidc.json +313 -0
  232. data/lib/hecks/language/port.bluebook +92 -0
  233. data/lib/hecks/language/translation/translation.bluebook +110 -0
  234. data/lib/hecks/language/translation/translation_aggregate.bluebook +267 -0
  235. data/lib/hecks/language/world/wiring.bluebook +62 -0
  236. data/lib/hecks/language/world/world.bluebook +84 -0
  237. data/lib/hecks/literal.rb +125 -0
  238. data/lib/hecks/naming.rb +121 -0
  239. data/lib/hecks/ports/access_control.port +4 -0
  240. data/lib/hecks/ports/access_control.rb +62 -0
  241. data/lib/hecks/ports/agent/answers.rb +104 -0
  242. data/lib/hecks/ports/agent.port +4 -0
  243. data/lib/hecks/ports/agent.rb +167 -0
  244. data/lib/hecks/ports/authentication.port +4 -0
  245. data/lib/hecks/ports/authentication.rb +50 -0
  246. data/lib/hecks/ports/authorization.port +4 -0
  247. data/lib/hecks/ports/authorization.rb +59 -0
  248. data/lib/hecks/ports/clock.port +4 -0
  249. data/lib/hecks/ports/clock.rb +62 -0
  250. data/lib/hecks/ports/extraction.port +4 -0
  251. data/lib/hecks/ports/extraction.rb +37 -0
  252. data/lib/hecks/ports/identity_assignment.port +4 -0
  253. data/lib/hecks/ports/identity_assignment.rb +45 -0
  254. data/lib/hecks/ports/identity_generation.port +4 -0
  255. data/lib/hecks/ports/identity_generation.rb +49 -0
  256. data/lib/hecks/ports/identity_resolution.port +4 -0
  257. data/lib/hecks/ports/identity_resolution.rb +40 -0
  258. data/lib/hecks/ports/loading.port +4 -0
  259. data/lib/hecks/ports/loading.rb +13 -0
  260. data/lib/hecks/ports/persistence/append_only.rb +102 -0
  261. data/lib/hecks/ports/persistence/binding_policy.rb +56 -0
  262. data/lib/hecks/ports/persistence/execution.rb +18 -0
  263. data/lib/hecks/ports/persistence/lineage.rb +277 -0
  264. data/lib/hecks/ports/persistence/null_saga_store.rb +25 -0
  265. data/lib/hecks/ports/persistence/remote_runtime.rb +42 -0
  266. data/lib/hecks/ports/persistence/repository_factory.rb +30 -0
  267. data/lib/hecks/ports/persistence.port +4 -0
  268. data/lib/hecks/ports/persistence.rb +39 -0
  269. data/lib/hecks/ports/projection.port +4 -0
  270. data/lib/hecks/ports/projection.rb +76 -0
  271. data/lib/hecks/ports/query/in_memory.rb +60 -0
  272. data/lib/hecks/ports/query/ordering.rb +41 -0
  273. data/lib/hecks/ports/query.rb +36 -0
  274. data/lib/hecks/ports.rb +27 -0
  275. data/lib/hecks/projections/diagrams.rb +413 -0
  276. data/lib/hecks/projections/ir.rb +18 -0
  277. data/lib/hecks/projections/model/deviations.rb +98 -0
  278. data/lib/hecks/projections/model.rb +145 -0
  279. data/lib/hecks/projections/oidc.rb +110 -0
  280. data/lib/hecks/projections/parser_table.rb +159 -0
  281. data/lib/hecks/projections/reference.rb +38 -0
  282. data/lib/hecks/projections/shape.rb +31 -0
  283. data/lib/hecks/projections/statements.rb +110 -0
  284. data/lib/hecks/projections/vocabulary.rb +100 -0
  285. data/lib/hecks/projections.rb +32 -0
  286. data/lib/hecks/projector/cli_projector.rb +437 -0
  287. data/lib/hecks/projector/docs_projector.rb +321 -0
  288. data/lib/hecks/projector/exporter.rb +141 -0
  289. data/lib/hecks/projector/ir_projector.rb +18 -0
  290. data/lib/hecks/projector/narrate_projector.rb +243 -0
  291. data/lib/hecks/projector/target.rb +97 -0
  292. data/lib/hecks/projector.rb +186 -0
  293. data/lib/hecks/query_ir.rb +392 -0
  294. data/lib/hecks/query_specification/common/authorization_spec.rb +9 -0
  295. data/lib/hecks/query_specification/common/comparators.rb +25 -0
  296. data/lib/hecks/query_specification/common/comparison.rb +174 -0
  297. data/lib/hecks/query_specification/common/cursor_spec.rb +9 -0
  298. data/lib/hecks/query_specification/common/dsl.rb +58 -0
  299. data/lib/hecks/query_specification/common/inspection_spec.rb +9 -0
  300. data/lib/hecks/query_specification/common/limit_spec.rb +9 -0
  301. data/lib/hecks/query_specification/common/null_policy.rb +80 -0
  302. data/lib/hecks/query_specification/common/null_semantics.rb +11 -0
  303. data/lib/hecks/query_specification/common/offset_spec.rb +9 -0
  304. data/lib/hecks/query_specification/common/options.rb +32 -0
  305. data/lib/hecks/query_specification/common/order_by.rb +9 -0
  306. data/lib/hecks/query_specification/common/specification.rb +10 -0
  307. data/lib/hecks/query_specification/common/where_clause.rb +9 -0
  308. data/lib/hecks/query_specification/field_path.rb +89 -0
  309. data/lib/hecks/query_specification/hop_path.rb +130 -0
  310. data/lib/hecks/query_specification/read_model/specification.rb +18 -0
  311. data/lib/hecks/query_specification.rb +14 -0
  312. data/lib/hecks/rendering.rb +48 -0
  313. data/lib/hecks/router/namespace_installer.rb +157 -0
  314. data/lib/hecks/router.rb +70 -0
  315. data/lib/hecks/runtime/caller.rb +50 -0
  316. data/lib/hecks/runtime/capability_graph.rb +44 -0
  317. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +124 -0
  318. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +248 -0
  319. data/lib/hecks/runtime/command_interpreter.rb +413 -0
  320. data/lib/hecks/runtime/command_rules/admissibility.rb +307 -0
  321. data/lib/hecks/runtime/command_rules/arithmetic.rb +254 -0
  322. data/lib/hecks/runtime/command_rules/authorization.rb +64 -0
  323. data/lib/hecks/runtime/command_rules/emission.rb +34 -0
  324. data/lib/hecks/runtime/command_rules/references.rb +181 -0
  325. data/lib/hecks/runtime/command_rules.rb +28 -0
  326. data/lib/hecks/runtime/dependency_planning.rb +231 -0
  327. data/lib/hecks/runtime/dispatcher.rb +286 -0
  328. data/lib/hecks/runtime/entity_element.rb +253 -0
  329. data/lib/hecks/runtime/entity_interpreter.rb +228 -0
  330. data/lib/hecks/runtime/era_check.rb +136 -0
  331. data/lib/hecks/runtime/era_guard/shape_diff.rb +128 -0
  332. data/lib/hecks/runtime/era_guard.rb +193 -0
  333. data/lib/hecks/runtime/era_tamper.rb +61 -0
  334. data/lib/hecks/runtime/errors.rb +100 -0
  335. data/lib/hecks/runtime/event.rb +51 -0
  336. data/lib/hecks/runtime/identity.rb +128 -0
  337. data/lib/hecks/runtime/instance.rb +120 -0
  338. data/lib/hecks/runtime/interpreting.rb +69 -0
  339. data/lib/hecks/runtime/loader.rb +143 -0
  340. data/lib/hecks/runtime/policy_interpreter.rb +366 -0
  341. data/lib/hecks/runtime/port_operation_interpreter.rb +210 -0
  342. data/lib/hecks/runtime/query_interpreter.rb +254 -0
  343. data/lib/hecks/runtime/reaction_invocation.rb +245 -0
  344. data/lib/hecks/runtime/read_model_interpreter.rb +266 -0
  345. data/lib/hecks/runtime/rebuild_sweep.rb +74 -0
  346. data/lib/hecks/runtime/reference_hop.rb +99 -0
  347. data/lib/hecks/runtime/refusal_wording.rb +124 -0
  348. data/lib/hecks/runtime/registry/saga_persistence.rb +70 -0
  349. data/lib/hecks/runtime/registry/verification.rb +158 -0
  350. data/lib/hecks/runtime/registry.rb +218 -0
  351. data/lib/hecks/runtime/remote_dispatcher.rb +143 -0
  352. data/lib/hecks/runtime/routing.rb +96 -0
  353. data/lib/hecks/runtime/saga_interpreter/correlation.rb +97 -0
  354. data/lib/hecks/runtime/saga_interpreter.rb +301 -0
  355. data/lib/hecks/runtime/storage_shape.rb +120 -0
  356. data/lib/hecks/runtime/tenant_check.rb +84 -0
  357. data/lib/hecks/runtime/tenant_scope.rb +55 -0
  358. data/lib/hecks/runtime/value/admission.rb +112 -0
  359. data/lib/hecks/runtime/value/coercion.rb +500 -0
  360. data/lib/hecks/runtime/value/invariant_violation.rb +5 -0
  361. data/lib/hecks/runtime/value.rb +125 -0
  362. data/lib/hecks/runtime.rb +95 -0
  363. data/lib/hecks/translation/audit/approval_digest.rb +31 -0
  364. data/lib/hecks/translation/audit/layer_one.rb +37 -0
  365. data/lib/hecks/translation/audit/layer_two.rb +77 -0
  366. data/lib/hecks/translation/audit/unfed_report.rb +42 -0
  367. data/lib/hecks/translation/audit.rb +70 -0
  368. data/lib/hecks/translation/reattest.rb +72 -0
  369. data/lib/hecks/translation/rule_compiler.rb +120 -0
  370. data/lib/hecks/translation/scaffold/differ.rb +183 -0
  371. data/lib/hecks/translation/scaffold/renderer.rb +41 -0
  372. data/lib/hecks/translation/scaffold/writer.rb +28 -0
  373. data/lib/hecks/translation/scaffold.rb +30 -0
  374. data/lib/hecks/translation.rb +11 -0
  375. data/lib/hecks/version.rb +16 -0
  376. data/lib/hecks/vocabulary.rb +213 -0
  377. data/lib/hecks.rb +118 -6
  378. metadata +401 -222
  379. data/bin/hecks +0 -7
  380. data/bin/hecks-package +0 -65
  381. data/bin/hecks_console +0 -12
  382. data/bin/hecks_serverless +0 -6
  383. data/lib/cli/build.rb +0 -14
  384. data/lib/cli/command_runner.rb +0 -28
  385. data/lib/cli/console.rb +0 -10
  386. data/lib/cli/generate.rb +0 -37
  387. data/lib/cli/hecks-cli.rb +0 -27
  388. data/lib/cli/test.rb +0 -57
  389. data/lib/console/commands.rb +0 -8
  390. data/lib/console/hecks-console.rb +0 -1
  391. data/lib/packager/README.md +0 -0
  392. data/lib/packager/app_runner.rb +0 -21
  393. data/lib/packager/args.rb +0 -26
  394. data/lib/packager/compatibility/fixnum.rb +0 -6
  395. data/lib/packager/hecks.rb +0 -39
  396. data/lib/packager/query_runner.rb +0 -21
  397. data/lib/packager/resources/Dockerfile +0 -11
  398. data/lib/packager/resources/app_binary +0 -7
  399. data/lib/packager/resources/bundle_config +0 -3
  400. data/lib/packager/resources/traveling-ruby-20150715-2.2.2-linux-x86_64.tar.gz +0 -0
  401. data/lib/packager/resources/traveling-ruby-20150715-2.2.2-osx.tar.gz +0 -0
  402. data/lib/serverless/Domain +0 -32
  403. data/lib/serverless/cli.rb +0 -75
  404. data/lib/serverless/resources/command_name.js +0 -5
  405. data/lib/serverless/resources/environment.js +0 -7
  406. data/lib/serverless/resources/handler.js.tt +0 -28
  407. data/lib/serverless/resources/run_binary.js +0 -22
  408. data/lib/serverless/resources/serverless.yml +0 -20
@@ -0,0 +1,102 @@
1
+ Hecks.bluebook "Hecksagon" do
2
+ aggregate "PortOperation" do
3
+ description "One operation a port exposes — the same shape a command's payload has (attributes in, an event out) with none of a command's given/ensures/sets : a port operation is the translation boundary itself, not a second place business rules live. Those stay on whichever command a policy triggers in reaction to the event it emits."
4
+
5
+ identified_by OperationName, as: :name
6
+
7
+ attribute :attributes, list_of(PortOperationField)
8
+ attribute :emits, list_of(EmittedEvent)
9
+
10
+ # THE TWO ENDINGS OF AN `asks`, held by the language about itself.
11
+ #
12
+ # `emits` above is what an inbound `tells` says once the fact is in.
13
+ # These two are the outbound half: what the adapter came back with, and
14
+ # what it said instead. Singular where `emits` is a list, because an ask
15
+ # has exactly one of each — a call that could answer two different ways
16
+ # is two calls.
17
+ #
18
+ # Empty on every `tells`, which is why neither carries an invariant
19
+ # demanding a value; `PortOperationBuilder` refuses the wrong word for
20
+ # the direction long before a record gets here.
21
+ attribute :answers, AnsweringEvent
22
+ attribute :refuses, RefusingEvent
23
+
24
+ value_object "OperationName" do
25
+ attribute :value, String
26
+ invariant("an operation is named") { !value.to_s.empty? }
27
+ end
28
+
29
+ value_object "PortOperationField" do
30
+ attribute :name, String
31
+ attribute :type, String
32
+ end
33
+
34
+ value_object "EmittedEvent" do
35
+ attribute :value, String
36
+ invariant("an emitted event is named") { !value.to_s.empty? }
37
+ end
38
+
39
+ value_object "AnsweringEvent" do
40
+ attribute :value, String
41
+ end
42
+
43
+ value_object "RefusingEvent" do
44
+ attribute :value, String
45
+ end
46
+
47
+ # HOW PORTOPERATION IS SPELLED. These rows live with the concept
48
+ # they describe; SyntaxBoot discovers every aggregate-local seed table.
49
+ # Contexts represented here: PortOperation.
50
+ value_object "KeywordSeed" do
51
+ attribute :word, String
52
+ attribute :context, String, admits: "Syntax::Context"
53
+ attribute :body, String, admits: "Syntax::Body"
54
+ attribute :inner, String
55
+ attribute :opens, String
56
+ attribute :fills, String
57
+ attribute :status, String, default: "admitted", admits: "Syntax::Status"
58
+ attribute :was, String
59
+ attribute :resolves_via, String, default: "", admits: "Syntax::ResolutionScope"
60
+ attribute :disambiguator, String, default: "", admits: "Syntax::Disambiguator"
61
+
62
+ member word: "reference_to", context: "PortOperation", body: "none", inner: "", opens: "", fills: "attributes", calls: "reference_to_impl"
63
+ member word: "attribute", context: "PortOperation", body: "none", inner: "", opens: "", fills: "attributes", calls: "attribute_impl"
64
+ member word: "emits", context: "PortOperation", body: "none", inner: "", opens: "", fills: "emits"
65
+ member word: "answers", context: "PortOperation", body: "none", inner: "", opens: "", fills: "answers"
66
+ member word: "refuses", context: "PortOperation", body: "none", inner: "", opens: "", fills: "refuses"
67
+
68
+ end
69
+
70
+ value_object "ArgumentSeed" do
71
+ attribute :keyword, String
72
+ attribute :context, String, admits: "Syntax::Context"
73
+ attribute :at, String
74
+ attribute :named, String
75
+ attribute :kind, String, admits: "Syntax::ArgumentKind"
76
+ attribute :required, String
77
+ attribute :fills, String
78
+ attribute :selects, String
79
+ attribute :pair_key_fills, String
80
+ attribute :pair_value_fills, String
81
+ attribute :pairs_shape, String, admits: "Syntax::PairsShape"
82
+ attribute :status, String, default: "admitted", admits: "Syntax::Status"
83
+ attribute :variadic, String
84
+ attribute :coerce, String
85
+ attribute :blank_message, String
86
+
87
+ member keyword: "reference_to", context: "PortOperation", at: "1", named: "", kind: "constant", required: "true", fills: "type"
88
+ member keyword: "reference_to", context: "PortOperation", at: "", named: "as", kind: "symbol", required: "false", fills: "name"
89
+ member keyword: "attribute", context: "PortOperation", at: "1", named: "", kind: "symbol", required: "true", fills: "name"
90
+ member keyword: "attribute", context: "PortOperation", at: "2", named: "", kind: "constant", required: "true", fills: "type"
91
+ member keyword: "attribute", context: "PortOperation", at: "", named: "default", kind: "literal", required: "false", fills: "default"
92
+ member keyword: "attribute", context: "PortOperation", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
93
+ member keyword: "attribute", context: "PortOperation", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
94
+ member keyword: "attribute", context: "PortOperation", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
95
+ member keyword: "attribute", context: "PortOperation", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
96
+ member keyword: "emits", context: "PortOperation", at: "1", named: "", kind: "text", required: "true", fills: "emits"
97
+ member keyword: "answers", context: "PortOperation", at: "1", named: "", kind: "text", required: "true", fills: "answers"
98
+ member keyword: "refuses", context: "PortOperation", at: "1", named: "", kind: "text", required: "true", fills: "refuses"
99
+
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,313 @@
1
+ {
2
+ "audience": "Bluebook",
3
+ "scopes": [
4
+ {
5
+ "scope": "bluebook:aggregate.attribute",
6
+ "verb": "Bluebook::Aggregate.Attribute",
7
+ "role": "Language"
8
+ },
9
+ {
10
+ "scope": "bluebook:aggregate.declare",
11
+ "verb": "Bluebook::Aggregate.Declare",
12
+ "role": "Language"
13
+ },
14
+ {
15
+ "scope": "bluebook:aggregate.holds",
16
+ "verb": "Bluebook::Aggregate.Holds",
17
+ "role": "Language"
18
+ },
19
+ {
20
+ "scope": "bluebook:aggregate.identify",
21
+ "verb": "Bluebook::Aggregate.Identify",
22
+ "role": "Language"
23
+ },
24
+ {
25
+ "scope": "bluebook:aggregate.invariant",
26
+ "verb": "Bluebook::Aggregate.Invariant",
27
+ "role": "Language"
28
+ },
29
+ {
30
+ "scope": "bluebook:aggregate.lifecycle",
31
+ "verb": "Bluebook::Aggregate.Lifecycle",
32
+ "role": "Language"
33
+ },
34
+ {
35
+ "scope": "bluebook:aggregate.precondition",
36
+ "verb": "Bluebook::Aggregate.Precondition",
37
+ "role": "Language"
38
+ },
39
+ {
40
+ "scope": "bluebook:aggregate.projects",
41
+ "verb": "Bluebook::Aggregate.Projects",
42
+ "role": "Language"
43
+ },
44
+ {
45
+ "scope": "bluebook:aggregate.reference",
46
+ "verb": "Bluebook::Aggregate.Reference",
47
+ "role": "Language"
48
+ },
49
+ {
50
+ "scope": "bluebook:aggregate.seal",
51
+ "verb": "Bluebook::Aggregate.Seal",
52
+ "role": "Language"
53
+ },
54
+ {
55
+ "scope": "bluebook:aggregate.transition",
56
+ "verb": "Bluebook::Aggregate.Transition",
57
+ "role": "Language"
58
+ },
59
+ {
60
+ "scope": "bluebook:aggregate.value",
61
+ "verb": "Bluebook::Aggregate.Value",
62
+ "role": "Language"
63
+ },
64
+ {
65
+ "scope": "bluebook:bluebook.attach",
66
+ "verb": "Bluebook::Bluebook.Attach",
67
+ "role": "Language"
68
+ },
69
+ {
70
+ "scope": "bluebook:bluebook.declare",
71
+ "verb": "Bluebook::Bluebook.Declare",
72
+ "role": "Language"
73
+ },
74
+ {
75
+ "scope": "bluebook:bluebook.normalise",
76
+ "verb": "Bluebook::Bluebook.Normalise",
77
+ "role": "Language"
78
+ },
79
+ {
80
+ "scope": "bluebook:command.acts_on",
81
+ "verb": "Bluebook::Command.ActsOn",
82
+ "role": "Language"
83
+ },
84
+ {
85
+ "scope": "bluebook:command.announce",
86
+ "verb": "Bluebook::Command.Announce",
87
+ "role": "Language"
88
+ },
89
+ {
90
+ "scope": "bluebook:command.argument",
91
+ "verb": "Bluebook::Command.Argument",
92
+ "role": "Language"
93
+ },
94
+ {
95
+ "scope": "bluebook:command.change",
96
+ "verb": "Bluebook::Command.Change",
97
+ "role": "Language"
98
+ },
99
+ {
100
+ "scope": "bluebook:command.declare",
101
+ "verb": "Bluebook::Command.Declare",
102
+ "role": "Language"
103
+ },
104
+ {
105
+ "scope": "bluebook:command.ensure",
106
+ "verb": "Bluebook::Command.Ensure",
107
+ "role": "Language"
108
+ },
109
+ {
110
+ "scope": "bluebook:command.reference",
111
+ "verb": "Bluebook::Command.Reference",
112
+ "role": "Language"
113
+ },
114
+ {
115
+ "scope": "bluebook:command.rule",
116
+ "verb": "Bluebook::Command.Rule",
117
+ "role": "Language"
118
+ },
119
+ {
120
+ "scope": "bluebook:entity.attribute",
121
+ "verb": "Bluebook::Entity.Attribute",
122
+ "role": "Language"
123
+ },
124
+ {
125
+ "scope": "bluebook:entity.declare",
126
+ "verb": "Bluebook::Entity.Declare",
127
+ "role": "Language"
128
+ },
129
+ {
130
+ "scope": "bluebook:entity.identify",
131
+ "verb": "Bluebook::Entity.Identify",
132
+ "role": "Language"
133
+ },
134
+ {
135
+ "scope": "bluebook:entity.invariant",
136
+ "verb": "Bluebook::Entity.Invariant",
137
+ "role": "Language"
138
+ },
139
+ {
140
+ "scope": "bluebook:entity.lifecycle",
141
+ "verb": "Bluebook::Entity.Lifecycle",
142
+ "role": "Language"
143
+ },
144
+ {
145
+ "scope": "bluebook:entity.precondition",
146
+ "verb": "Bluebook::Entity.Precondition",
147
+ "role": "Language"
148
+ },
149
+ {
150
+ "scope": "bluebook:entity.seal",
151
+ "verb": "Bluebook::Entity.Seal",
152
+ "role": "Language"
153
+ },
154
+ {
155
+ "scope": "bluebook:entity.transition",
156
+ "verb": "Bluebook::Entity.Transition",
157
+ "role": "Language"
158
+ },
159
+ {
160
+ "scope": "bluebook:policy.bind",
161
+ "verb": "Bluebook::Policy.Bind",
162
+ "role": "Language"
163
+ },
164
+ {
165
+ "scope": "bluebook:policy.declare",
166
+ "verb": "Bluebook::Policy.Declare",
167
+ "role": "Language"
168
+ },
169
+ {
170
+ "scope": "bluebook:process_manager.declare",
171
+ "verb": "Bluebook::ProcessManager.Declare",
172
+ "role": "Language"
173
+ },
174
+ {
175
+ "scope": "bluebook:process_manager.handler",
176
+ "verb": "Bluebook::ProcessManager.Handler",
177
+ "role": "Language"
178
+ },
179
+ {
180
+ "scope": "bluebook:process_manager.handler.dispatch",
181
+ "verb": "Bluebook::ProcessManager.Handler.Dispatch",
182
+ "role": "Language"
183
+ },
184
+ {
185
+ "scope": "bluebook:process_manager.handler.dispatch.bind",
186
+ "verb": "Bluebook::ProcessManager.Handler.Dispatch.Bind",
187
+ "role": "Language"
188
+ },
189
+ {
190
+ "scope": "bluebook:process_manager.state",
191
+ "verb": "Bluebook::ProcessManager.State",
192
+ "role": "Language"
193
+ },
194
+ {
195
+ "scope": "bluebook:query.argument",
196
+ "verb": "Bluebook::Query.Argument",
197
+ "role": "Language"
198
+ },
199
+ {
200
+ "scope": "bluebook:query.declare",
201
+ "verb": "Bluebook::Query.Declare",
202
+ "role": "Language"
203
+ },
204
+ {
205
+ "scope": "bluebook:query.filter",
206
+ "verb": "Bluebook::Query.Filter",
207
+ "role": "Language"
208
+ },
209
+ {
210
+ "scope": "bluebook:query.option",
211
+ "verb": "Bluebook::Query.Option",
212
+ "role": "Language"
213
+ },
214
+ {
215
+ "scope": "bluebook:read_model.count",
216
+ "verb": "Bluebook::ReadModel.Count",
217
+ "role": "Language"
218
+ },
219
+ {
220
+ "scope": "bluebook:read_model.declare",
221
+ "verb": "Bluebook::ReadModel.Declare",
222
+ "role": "Language"
223
+ },
224
+ {
225
+ "scope": "bluebook:read_model.gather",
226
+ "verb": "Bluebook::ReadModel.Gather",
227
+ "role": "Language"
228
+ },
229
+ {
230
+ "scope": "bluebook:read_model.group_by",
231
+ "verb": "Bluebook::ReadModel.GroupBy",
232
+ "role": "Language"
233
+ },
234
+ {
235
+ "scope": "bluebook:read_model.median",
236
+ "verb": "Bluebook::ReadModel.Median",
237
+ "role": "Language"
238
+ },
239
+ {
240
+ "scope": "bluebook:read_model.option",
241
+ "verb": "Bluebook::ReadModel.Option",
242
+ "role": "Language"
243
+ },
244
+ {
245
+ "scope": "bluebook:syntax.argument",
246
+ "verb": "Bluebook::Syntax.Argument",
247
+ "role": "Language"
248
+ },
249
+ {
250
+ "scope": "bluebook:syntax.argument.deprecate",
251
+ "verb": "Bluebook::Syntax.Argument.Deprecate",
252
+ "role": "Language"
253
+ },
254
+ {
255
+ "scope": "bluebook:syntax.argument.retire",
256
+ "verb": "Bluebook::Syntax.Argument.Retire",
257
+ "role": "Language"
258
+ },
259
+ {
260
+ "scope": "bluebook:syntax.declare",
261
+ "verb": "Bluebook::Syntax.Declare",
262
+ "role": "Language"
263
+ },
264
+ {
265
+ "scope": "bluebook:syntax.keyword",
266
+ "verb": "Bluebook::Syntax.Keyword",
267
+ "role": "Language"
268
+ },
269
+ {
270
+ "scope": "bluebook:syntax.keyword.deprecate",
271
+ "verb": "Bluebook::Syntax.Keyword.Deprecate",
272
+ "role": "Language"
273
+ },
274
+ {
275
+ "scope": "bluebook:syntax.keyword.retire",
276
+ "verb": "Bluebook::Syntax.Keyword.Retire",
277
+ "role": "Language"
278
+ },
279
+ {
280
+ "scope": "bluebook:value_object.assert",
281
+ "verb": "Bluebook::ValueObject.Assert",
282
+ "role": "Language"
283
+ },
284
+ {
285
+ "scope": "bluebook:value_object.close",
286
+ "verb": "Bluebook::ValueObject.Close",
287
+ "role": "Language"
288
+ },
289
+ {
290
+ "scope": "bluebook:value_object.declare",
291
+ "verb": "Bluebook::ValueObject.Declare",
292
+ "role": "Language"
293
+ },
294
+ {
295
+ "scope": "bluebook:value_object.field",
296
+ "verb": "Bluebook::ValueObject.Field",
297
+ "role": "Language"
298
+ },
299
+ {
300
+ "scope": "bluebook:value_object.member",
301
+ "verb": "Bluebook::ValueObject.Member",
302
+ "role": "Language"
303
+ },
304
+ {
305
+ "scope": "bluebook:value_object.member.pair",
306
+ "verb": "Bluebook::ValueObject.Member.Pair",
307
+ "role": "Language"
308
+ }
309
+ ],
310
+ "roles": [
311
+ "Language"
312
+ ]
313
+ }
@@ -0,0 +1,92 @@
1
+ Hecks.bluebook "Port" do
2
+ vision "The .port language, declared in itself. A port names one resource door a domain's own aggregates call by verb — persisted_by, posted_by, whatever a chapter spells — bound to a real driven adapter at the world level. A sibling artifact to the bluebook, not part of one: the same port name is reused across every domain that needs the same kind of door."
3
+ core
4
+
5
+ aggregate "Port" do
6
+ description "One .port — a resource door a domain's own aggregates call by verb, and whether calling it answers with a value (reply) or fires an effect with nothing to hand back (effect)."
7
+
8
+ identified_by PortName, as: :name
9
+
10
+ attribute :verb, PortVerb
11
+ attribute :signal, PortSignal
12
+
13
+ value_object "PortName" do
14
+ attribute :value, String
15
+ invariant("a port names itself") { !value.to_s.empty? }
16
+ end
17
+
18
+ value_object "PortVerb" do
19
+ attribute :value, String
20
+ invariant("a port's verb says something") { !value.to_s.empty? }
21
+ end
22
+
23
+ value_object "PortSignal" do
24
+ attribute :value, String, one_of: ["reply", "effect"]
25
+ end
26
+
27
+ command "Declare" do
28
+ role "Deployment"
29
+ goal "Open a resource door a domain's own aggregates may call by verb"
30
+
31
+ attribute :name, PortName
32
+ # OPTIONAL — real, pre-existing PortBuilder behavior (spec/dsl_spec
33
+ # .rb's own "signal says whether the domain gets a value back..."
34
+ # builds a port with only `signal`, never calling `verb` at all;
35
+ # `def verb(value)` has no default, unlike `signal`'s `:reply`).
36
+ # Same asymmetry world.bluebook's own Declare command already has
37
+ # for `realm`/`latest`.
38
+ attribute :verb, PortVerb, optional: true
39
+ attribute :signal, PortSignal
40
+
41
+ sets :name
42
+ sets :verb
43
+ sets :signal
44
+
45
+ emits "PortDeclared"
46
+ end
47
+
48
+ # HOW PORT IS SPELLED. These rows live with the concept
49
+ # they describe; SyntaxBoot discovers every aggregate-local seed table.
50
+ # Contexts represented here: File, Port.
51
+ value_object "KeywordSeed" do
52
+ attribute :word, String
53
+ attribute :context, String, admits: "Syntax::Context"
54
+ attribute :body, String, admits: "Syntax::Body"
55
+ attribute :inner, String
56
+ attribute :opens, String
57
+ attribute :fills, String
58
+ attribute :status, String, default: "admitted", admits: "Syntax::Status"
59
+ attribute :was, String
60
+ attribute :resolves_via, String, default: "", admits: "Syntax::ResolutionScope"
61
+ attribute :disambiguator, String, default: "", admits: "Syntax::Disambiguator"
62
+
63
+ member word: "port", context: "File", body: "keywords", inner: "Port", opens: "Port", fills: ""
64
+ member word: "verb", context: "Port", body: "none", inner: "", opens: "", fills: "verb"
65
+ member word: "signal", context: "Port", body: "none", inner: "", opens: "", fills: "signal"
66
+
67
+ end
68
+
69
+ value_object "ArgumentSeed" do
70
+ attribute :keyword, String
71
+ attribute :context, String, admits: "Syntax::Context"
72
+ attribute :at, String
73
+ attribute :named, String
74
+ attribute :kind, String, admits: "Syntax::ArgumentKind"
75
+ attribute :required, String
76
+ attribute :fills, String
77
+ attribute :selects, String
78
+ attribute :pair_key_fills, String
79
+ attribute :pair_value_fills, String
80
+ attribute :pairs_shape, String, admits: "Syntax::PairsShape"
81
+ attribute :status, String, default: "admitted", admits: "Syntax::Status"
82
+ attribute :variadic, String
83
+ attribute :coerce, String
84
+ attribute :blank_message, String
85
+
86
+ member keyword: "port", context: "File", at: "1", named: "", kind: "text", required: "true", fills: "name"
87
+ member keyword: "verb", context: "Port", at: "1", named: "", kind: "text", required: "true", fills: "verb"
88
+ member keyword: "signal", context: "Port", at: "1", named: "", kind: "symbol", required: "true", fills: "signal"
89
+
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,110 @@
1
+ Hecks.bluebook "Translation" do
2
+ aggregate "Translation" do
3
+ description "One translations/*.bluebook edge — a domain moving from one pinned era to the next, aggregate by aggregate."
4
+
5
+ identified_by :domain, :from, :to
6
+
7
+ attribute :domain, TranslationDomainName
8
+ attribute :from, TranslationEraName
9
+ attribute :to, TranslationEraName
10
+ attribute :retired, list_of(TranslationName)
11
+
12
+ value_object "TranslationDomainName" do
13
+ attribute :value, String
14
+ invariant("a translation names its domain") { !value.to_s.empty? }
15
+ end
16
+
17
+ value_object "TranslationEraName" do
18
+ attribute :value, String
19
+ invariant("a translation names its own era") { !value.to_s.empty? }
20
+ end
21
+
22
+ value_object "TranslationName" do
23
+ attribute :value, String
24
+ invariant("a name says something") { !value.to_s.empty? }
25
+ end
26
+
27
+ # ARBITRARY, UNVALIDATED CAPTURE — `convert`'s own `values:` table and
28
+ # `backfill`'s own `default:` are open-ended (any literal a real
29
+ # migration needs), the same shape `AggregateBuilder#provenance`/
30
+ # `CommandBuilder#provenance` already capture as plain, unvalidated
31
+ # text (`LiteralText`, aggregate.bluebook) rather than a fixed
32
+ # attribute shape a closed self-hosted record could enumerate.
33
+ value_object "TranslationLiteralText" do
34
+ attribute :value, String
35
+ end
36
+
37
+ command "Declare" do
38
+ role "Deployment"
39
+ goal "Open a domain's own move from one pinned era to the next"
40
+
41
+ attribute :domain, TranslationDomainName
42
+ attribute :from, TranslationEraName
43
+ attribute :to, TranslationEraName
44
+
45
+ sets :domain
46
+ sets :from
47
+ sets :to
48
+
49
+ emits "TranslationDeclared"
50
+ end
51
+
52
+ command "Retire" do
53
+ role "Deployment"
54
+ goal "Name an aggregate the new era drops outright, not renamed"
55
+
56
+ attribute :value, TranslationName
57
+
58
+ sets :retired, append: { value: :value }
59
+
60
+ emits "TranslationAggregateRetired"
61
+ end
62
+
63
+ # HOW TRANSLATION IS SPELLED. These rows live with the concept
64
+ # they describe; SyntaxBoot discovers every aggregate-local seed table.
65
+ # Contexts represented here: File, Translation.
66
+ value_object "KeywordSeed" do
67
+ attribute :word, String
68
+ attribute :context, String, admits: "Syntax::Context"
69
+ attribute :body, String, admits: "Syntax::Body"
70
+ attribute :inner, String
71
+ attribute :opens, String
72
+ attribute :fills, String
73
+ attribute :status, String, default: "admitted", admits: "Syntax::Status"
74
+ attribute :was, String
75
+ attribute :resolves_via, String, default: "", admits: "Syntax::ResolutionScope"
76
+ attribute :disambiguator, String, default: "", admits: "Syntax::Disambiguator"
77
+
78
+ member word: "data_translation", context: "File", body: "keywords", inner: "Translation", opens: "Translation", fills: ""
79
+ member word: "aggregate", context: "Translation", body: "keywords", inner: "TranslationAggregate", opens: "TranslationAggregate", fills: "", calls: "aggregate_impl"
80
+ member word: "retired", context: "Translation", body: "none", inner: "", opens: "", fills: "retired"
81
+
82
+ end
83
+
84
+ value_object "ArgumentSeed" do
85
+ attribute :keyword, String
86
+ attribute :context, String, admits: "Syntax::Context"
87
+ attribute :at, String
88
+ attribute :named, String
89
+ attribute :kind, String, admits: "Syntax::ArgumentKind"
90
+ attribute :required, String
91
+ attribute :fills, String
92
+ attribute :selects, String
93
+ attribute :pair_key_fills, String
94
+ attribute :pair_value_fills, String
95
+ attribute :pairs_shape, String, admits: "Syntax::PairsShape"
96
+ attribute :status, String, default: "admitted", admits: "Syntax::Status"
97
+ attribute :variadic, String
98
+ attribute :coerce, String
99
+ attribute :blank_message, String
100
+
101
+ member keyword: "data_translation", context: "File", at: "1", named: "", kind: "text", required: "true", fills: "name"
102
+ member keyword: "data_translation", context: "File", at: "", named: "from", kind: "text", required: "true", fills: "from"
103
+ member keyword: "data_translation", context: "File", at: "", named: "to", kind: "text", required: "true", fills: "to"
104
+ member keyword: "aggregate", context: "Translation", at: "1", named: "", kind: "text", required: "true", fills: "name"
105
+ member keyword: "aggregate", context: "Translation", at: "", named: "was", kind: "text", required: "false", fills: "was"
106
+ member keyword: "retired", context: "Translation", at: "1", named: "", kind: "text", required: "true", fills: "name", blank_message: "a retired needs an aggregate name"
107
+
108
+ end
109
+ end
110
+ end