hecks 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) 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 +427 -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 +101 -0
  12. data/lib/hecks/adapters/driven/heki/journal.rb +56 -0
  13. data/lib/hecks/adapters/driven/heki/saga_store.rb +99 -0
  14. data/lib/hecks/adapters/driven/heki/snapshot.rb +65 -0
  15. data/lib/hecks/adapters/driven/heki.adapter +4 -0
  16. data/lib/hecks/adapters/driven/heki.rb +179 -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 +145 -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 +88 -0
  28. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +207 -0
  29. data/lib/hecks/adapters/driven/postgres.adapter +5 -0
  30. data/lib/hecks/adapters/driven/postgres.rb +438 -0
  31. data/lib/hecks/adapters/driven/postgres_era.adapter +17 -0
  32. data/lib/hecks/adapters/driven/prism.adapter +3 -0
  33. data/lib/hecks/adapters/driven/prism.rb +80 -0
  34. data/lib/hecks/adapters/driven/secure_random_identity.adapter +3 -0
  35. data/lib/hecks/adapters/driven/secure_random_identity.rb +14 -0
  36. data/lib/hecks/adapters/driven/sql_query_builder.rb +221 -0
  37. data/lib/hecks/adapters/driven/sqlite/codec.rb +80 -0
  38. data/lib/hecks/adapters/driven/sqlite/projection.rb +172 -0
  39. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +192 -0
  40. data/lib/hecks/adapters/driven/sqlite.adapter +9 -0
  41. data/lib/hecks/adapters/driven/sqlite.rb +306 -0
  42. data/lib/hecks/adapters/driven/system_clock.adapter +3 -0
  43. data/lib/hecks/adapters/driven/system_clock.rb +14 -0
  44. data/lib/hecks/adapters/driven.rb +54 -0
  45. data/lib/hecks/adapters.rb +6 -0
  46. data/lib/hecks/behaviors/dsl.rb +125 -0
  47. data/lib/hecks/behaviors/expectations.rb +340 -0
  48. data/lib/hecks/behaviors/ir.rb +31 -0
  49. data/lib/hecks/behaviors/rspec.rb +42 -0
  50. data/lib/hecks/behaviors/runner.rb +96 -0
  51. data/lib/hecks/behaviors.rb +25 -0
  52. data/lib/hecks/bluebook/aggregate.rb +108 -0
  53. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +134 -0
  54. data/lib/hecks/bluebook/assembly/build.rb +48 -0
  55. data/lib/hecks/bluebook/assembly/contract.rb +112 -0
  56. data/lib/hecks/bluebook/assembly/contracts.rb +438 -0
  57. data/lib/hecks/bluebook/assembly/marks.rb +228 -0
  58. data/lib/hecks/bluebook/assembly/specializer.rb +70 -0
  59. data/lib/hecks/bluebook/assembly.rb +91 -0
  60. data/lib/hecks/bluebook/attribute.rb +96 -0
  61. data/lib/hecks/bluebook/behaviour/aggregate.rb +83 -0
  62. data/lib/hecks/bluebook/behaviour/attribute.rb +27 -0
  63. data/lib/hecks/bluebook/behaviour/chapter.rb +72 -0
  64. data/lib/hecks/bluebook/behaviour/command.rb +116 -0
  65. data/lib/hecks/bluebook/behaviour/domain_port.rb +25 -0
  66. data/lib/hecks/bluebook/behaviour/entity.rb +59 -0
  67. data/lib/hecks/bluebook/behaviour/hexagon.rb +50 -0
  68. data/lib/hecks/bluebook/behaviour/lifecycle.rb +68 -0
  69. data/lib/hecks/bluebook/behaviour/policy.rb +52 -0
  70. data/lib/hecks/bluebook/behaviour/process_manager.rb +51 -0
  71. data/lib/hecks/bluebook/behaviour/query.rb +10 -0
  72. data/lib/hecks/bluebook/behaviour/read_model.rb +29 -0
  73. data/lib/hecks/bluebook/behaviour/traits.rb +81 -0
  74. data/lib/hecks/bluebook/behaviour/value_object.rb +33 -0
  75. data/lib/hecks/bluebook/chapter.rb +78 -0
  76. data/lib/hecks/bluebook/command.rb +124 -0
  77. data/lib/hecks/bluebook/domain_port.rb +102 -0
  78. data/lib/hecks/bluebook/dsl/adapter_builder.rb +34 -0
  79. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +1018 -0
  80. data/lib/hecks/bluebook/dsl/attribute_collector.rb +348 -0
  81. data/lib/hecks/bluebook/dsl/binding_proxy.rb +71 -0
  82. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +1087 -0
  83. data/lib/hecks/bluebook/dsl/command_builder.rb +714 -0
  84. data/lib/hecks/bluebook/dsl/const_shim.rb +81 -0
  85. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +79 -0
  86. data/lib/hecks/bluebook/dsl/entity_builder.rb +430 -0
  87. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +366 -0
  88. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +163 -0
  89. data/lib/hecks/bluebook/dsl/identity_declaration.rb +191 -0
  90. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +44 -0
  91. data/lib/hecks/bluebook/dsl/malformed.rb +7 -0
  92. data/lib/hecks/bluebook/dsl/policy_builder.rb +135 -0
  93. data/lib/hecks/bluebook/dsl/port_builder.rb +39 -0
  94. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +142 -0
  95. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +306 -0
  96. data/lib/hecks/bluebook/dsl/query_builder.rb +113 -0
  97. data/lib/hecks/bluebook/dsl/read_model_builder.rb +233 -0
  98. data/lib/hecks/bluebook/dsl/rule_reference.rb +173 -0
  99. data/lib/hecks/bluebook/dsl/translation_builder.rb +243 -0
  100. data/lib/hecks/bluebook/dsl/value_object_builder.rb +178 -0
  101. data/lib/hecks/bluebook/dsl/word_gate.rb +228 -0
  102. data/lib/hecks/bluebook/dsl/world_builder.rb +117 -0
  103. data/lib/hecks/bluebook/dsl.rb +45 -0
  104. data/lib/hecks/bluebook/entity.rb +103 -0
  105. data/lib/hecks/bluebook/expression/canonical_form.rb +123 -0
  106. data/lib/hecks/bluebook/expression/evaluator.rb +304 -0
  107. data/lib/hecks/bluebook/expression/projection.json +218 -0
  108. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +233 -0
  109. data/lib/hecks/bluebook/expression/resolver.rb +781 -0
  110. data/lib/hecks/bluebook/expression.rb +13 -0
  111. data/lib/hecks/bluebook/hexagon.rb +60 -0
  112. data/lib/hecks/bluebook/lifecycle.rb +42 -0
  113. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +54 -0
  114. data/lib/hecks/bluebook/meta_validator/judge.rb +621 -0
  115. data/lib/hecks/bluebook/meta_validator/plan.rb +332 -0
  116. data/lib/hecks/bluebook/meta_validator/port_judge.rb +51 -0
  117. data/lib/hecks/bluebook/meta_validator/readings.rb +360 -0
  118. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +351 -0
  119. data/lib/hecks/bluebook/meta_validator/shapes.rb +266 -0
  120. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +255 -0
  121. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +138 -0
  122. data/lib/hecks/bluebook/meta_validator/world_judge.rb +78 -0
  123. data/lib/hecks/bluebook/meta_validator.rb +542 -0
  124. data/lib/hecks/bluebook/model_check.rb +445 -0
  125. data/lib/hecks/bluebook/pattern_subset.rb +184 -0
  126. data/lib/hecks/bluebook/policy.rb +41 -0
  127. data/lib/hecks/bluebook/process_manager.rb +128 -0
  128. data/lib/hecks/bluebook/project_discovery.rb +30 -0
  129. data/lib/hecks/bluebook/project_loader.rb +40 -0
  130. data/lib/hecks/bluebook/project_register.rb +82 -0
  131. data/lib/hecks/bluebook/query.rb +61 -0
  132. data/lib/hecks/bluebook/read_model.rb +109 -0
  133. data/lib/hecks/bluebook/reference.rb +74 -0
  134. data/lib/hecks/bluebook/smoke_test.rb +166 -0
  135. data/lib/hecks/bluebook/synthesizer.rb +95 -0
  136. data/lib/hecks/bluebook/translation.rb +92 -0
  137. data/lib/hecks/bluebook/value_object.rb +66 -0
  138. data/lib/hecks/bluebook.rb +74 -0
  139. data/lib/hecks/codemod.rb +342 -0
  140. data/lib/hecks/construct.rb +71 -0
  141. data/lib/hecks/deploy/bluebook/deploy.bluebook +219 -0
  142. data/lib/hecks/deploy/bluebook/deploy.hecksagon +4 -0
  143. data/lib/hecks/deploy/oidc.json +18 -0
  144. data/lib/hecks/doc/reference.rb +410 -0
  145. data/lib/hecks/embryonaut_bluebook.rb +75 -0
  146. data/lib/hecks/facade/cli_door.rb +119 -0
  147. data/lib/hecks/facade/cli_runner.rb +190 -0
  148. data/lib/hecks/facade/command_request.rb +105 -0
  149. data/lib/hecks/facade/handle.rb +173 -0
  150. data/lib/hecks/facade/json_door.rb +166 -0
  151. data/lib/hecks/facade/surface/aggregate_door.rb +185 -0
  152. data/lib/hecks/facade/surface/chapter.rb +107 -0
  153. data/lib/hecks/facade/surface.rb +48 -0
  154. data/lib/hecks/facade.rb +44 -0
  155. data/lib/hecks/forms/app.rb +341 -0
  156. data/lib/hecks/forms/command_form_renderer.rb +113 -0
  157. data/lib/hecks/forms/examples/banking_console.bluebook +3 -0
  158. data/lib/hecks/forms/field_renderer.rb +177 -0
  159. data/lib/hecks/forms/field_shape.rb +232 -0
  160. data/lib/hecks/forms/html.rb +84 -0
  161. data/lib/hecks/forms/index_renderer.rb +35 -0
  162. data/lib/hecks/forms/page.rb +157 -0
  163. data/lib/hecks/forms/params.rb +161 -0
  164. data/lib/hecks/forms/port_argument.rb +46 -0
  165. data/lib/hecks/forms/query_form_renderer.rb +114 -0
  166. data/lib/hecks/forms/record_renderer.rb +119 -0
  167. data/lib/hecks/forms/record_table.rb +68 -0
  168. data/lib/hecks/forms/reference_options.rb +30 -0
  169. data/lib/hecks/forms/value_object_shape.rb +46 -0
  170. data/lib/hecks/forms.rb +54 -0
  171. data/lib/hecks/fqn.rb +94 -0
  172. data/lib/hecks/framework/bluebook/compliance.bluebook +1 -0
  173. data/lib/hecks/framework/bluebook/console_settings.bluebook +489 -0
  174. data/lib/hecks/framework/bluebook/framework.hecksagon +32 -0
  175. data/lib/hecks/framework/bluebook/governance.bluebook +145 -0
  176. data/lib/hecks/framework/bluebook/identity.bluebook +90 -0
  177. data/lib/hecks/framework/oidc.json +39 -0
  178. data/lib/hecks/framework.rb +90 -0
  179. data/lib/hecks/freezer.rb +67 -0
  180. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +527 -0
  181. data/lib/hecks/fuzzing/invalid_value_generator.rb +86 -0
  182. data/lib/hecks/fuzzing/isolated_boot.rb +286 -0
  183. data/lib/hecks/fuzzing/properties.rb +1192 -0
  184. data/lib/hecks/fuzzing/replay.rb +668 -0
  185. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +93 -0
  186. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +80 -0
  187. data/lib/hecks/fuzzing/sequence_generator/picker.rb +96 -0
  188. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +250 -0
  189. data/lib/hecks/fuzzing/sequence_generator.rb +131 -0
  190. data/lib/hecks/fuzzing/value_generator.rb +200 -0
  191. data/lib/hecks/fuzzing.rb +12 -0
  192. data/lib/hecks/grammar/evolve.rb +324 -0
  193. data/lib/hecks/grammar/expression.bluebook +420 -0
  194. data/lib/hecks/grammar/expression_operators.json +1648 -0
  195. data/lib/hecks/grammar/grammar.hecksagon +20 -0
  196. data/lib/hecks/grammar/oidc.json +69 -0
  197. data/lib/hecks/grammar/translation.bluebook +203 -0
  198. data/lib/hecks/grammar.rb +178 -0
  199. data/lib/hecks/ir.rb +126 -0
  200. data/lib/hecks/language/adapter.bluebook +116 -0
  201. data/lib/hecks/language/bluebook/aggregate.bluebook +581 -0
  202. data/lib/hecks/language/bluebook/attaches/paging.bluebook +76 -0
  203. data/lib/hecks/language/bluebook/bluebook.bluebook +256 -0
  204. data/lib/hecks/language/bluebook/bluebook.hecksagon +24 -0
  205. data/lib/hecks/language/bluebook/command.bluebook +471 -0
  206. data/lib/hecks/language/bluebook/entity.bluebook +392 -0
  207. data/lib/hecks/language/bluebook/policy.bluebook +189 -0
  208. data/lib/hecks/language/bluebook/process_manager.bluebook +381 -0
  209. data/lib/hecks/language/bluebook/projection.bluebook +267 -0
  210. data/lib/hecks/language/bluebook/query.bluebook +245 -0
  211. data/lib/hecks/language/bluebook/shape.bluebook +292 -0
  212. data/lib/hecks/language/bluebook/syntax.bluebook +448 -0
  213. data/lib/hecks/language/bluebook/vocabulary.bluebook +379 -0
  214. data/lib/hecks/language/hecksagon/adapter_binding.bluebook +51 -0
  215. data/lib/hecks/language/hecksagon/domain_port.bluebook +76 -0
  216. data/lib/hecks/language/hecksagon/hecksagon.bluebook +131 -0
  217. data/lib/hecks/language/hecksagon/port_operation.bluebook +102 -0
  218. data/lib/hecks/language/oidc.json +333 -0
  219. data/lib/hecks/language/port.bluebook +120 -0
  220. data/lib/hecks/language/translation/translation.bluebook +110 -0
  221. data/lib/hecks/language/translation/translation_aggregate.bluebook +267 -0
  222. data/lib/hecks/language/world/wiring.bluebook +62 -0
  223. data/lib/hecks/language/world/world.bluebook +84 -0
  224. data/lib/hecks/literal.rb +125 -0
  225. data/lib/hecks/naming.rb +174 -0
  226. data/lib/hecks/ports/access_control.port +9 -0
  227. data/lib/hecks/ports/access_control.rb +62 -0
  228. data/lib/hecks/ports/agent/answers.rb +104 -0
  229. data/lib/hecks/ports/agent.port +8 -0
  230. data/lib/hecks/ports/agent.rb +167 -0
  231. data/lib/hecks/ports/authentication.port +6 -0
  232. data/lib/hecks/ports/authentication.rb +50 -0
  233. data/lib/hecks/ports/authorization.port +7 -0
  234. data/lib/hecks/ports/authorization.rb +62 -0
  235. data/lib/hecks/ports/clock.port +5 -0
  236. data/lib/hecks/ports/clock.rb +62 -0
  237. data/lib/hecks/ports/extraction.port +5 -0
  238. data/lib/hecks/ports/extraction.rb +37 -0
  239. data/lib/hecks/ports/identity_assignment.port +5 -0
  240. data/lib/hecks/ports/identity_assignment.rb +45 -0
  241. data/lib/hecks/ports/identity_generation.port +5 -0
  242. data/lib/hecks/ports/identity_generation.rb +49 -0
  243. data/lib/hecks/ports/identity_resolution.port +5 -0
  244. data/lib/hecks/ports/identity_resolution.rb +40 -0
  245. data/lib/hecks/ports/loading.port +4 -0
  246. data/lib/hecks/ports/loading.rb +13 -0
  247. data/lib/hecks/ports/persistence/append_only.rb +138 -0
  248. data/lib/hecks/ports/persistence/binding_policy.rb +56 -0
  249. data/lib/hecks/ports/persistence/execution.rb +23 -0
  250. data/lib/hecks/ports/persistence/null_saga_store.rb +25 -0
  251. data/lib/hecks/ports/persistence/plugin.rb +54 -0
  252. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +169 -0
  253. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +128 -0
  254. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +161 -0
  255. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +61 -0
  256. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +304 -0
  257. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +171 -0
  258. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +190 -0
  259. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +478 -0
  260. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +166 -0
  261. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +314 -0
  262. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +168 -0
  263. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +170 -0
  264. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +134 -0
  265. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +137 -0
  266. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +89 -0
  267. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +85 -0
  268. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +43 -0
  269. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +132 -0
  270. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +74 -0
  271. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +758 -0
  272. data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +120 -0
  273. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +31 -0
  274. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +46 -0
  275. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +102 -0
  276. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +46 -0
  277. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +70 -0
  278. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +72 -0
  279. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +120 -0
  280. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +183 -0
  281. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +41 -0
  282. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +28 -0
  283. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +30 -0
  284. data/lib/hecks/ports/persistence/plugins/era/translation.rb +11 -0
  285. data/lib/hecks/ports/persistence/plugins/era.rb +48 -0
  286. data/lib/hecks/ports/persistence/remote_runtime.rb +42 -0
  287. data/lib/hecks/ports/persistence/repository_factory.rb +30 -0
  288. data/lib/hecks/ports/persistence.port +4 -0
  289. data/lib/hecks/ports/persistence.rb +39 -0
  290. data/lib/hecks/ports/projection.port +4 -0
  291. data/lib/hecks/ports/projection.rb +96 -0
  292. data/lib/hecks/ports/query/in_memory.rb +60 -0
  293. data/lib/hecks/ports/query/ordering.rb +41 -0
  294. data/lib/hecks/ports/query.rb +36 -0
  295. data/lib/hecks/ports.rb +27 -0
  296. data/lib/hecks/projections/diagrams.rb +642 -0
  297. data/lib/hecks/projections/ir.rb +18 -0
  298. data/lib/hecks/projections/model/deviations.rb +98 -0
  299. data/lib/hecks/projections/model.rb +145 -0
  300. data/lib/hecks/projections/oidc.rb +110 -0
  301. data/lib/hecks/projections/parser_table.rb +159 -0
  302. data/lib/hecks/projections/reference.rb +38 -0
  303. data/lib/hecks/projections/shape.rb +44 -0
  304. data/lib/hecks/projections/statements.rb +110 -0
  305. data/lib/hecks/projections/vocabulary.rb +100 -0
  306. data/lib/hecks/projections.rb +32 -0
  307. data/lib/hecks/projector/cli_projector.rb +446 -0
  308. data/lib/hecks/projector/docs_projector.rb +321 -0
  309. data/lib/hecks/projector/exporter.rb +158 -0
  310. data/lib/hecks/projector/ir_projector.rb +18 -0
  311. data/lib/hecks/projector/narrate_projector.rb +243 -0
  312. data/lib/hecks/projector/target.rb +97 -0
  313. data/lib/hecks/projector.rb +186 -0
  314. data/lib/hecks/query_ir.rb +411 -0
  315. data/lib/hecks/query_specification/common/authorization_spec.rb +9 -0
  316. data/lib/hecks/query_specification/common/comparators.rb +25 -0
  317. data/lib/hecks/query_specification/common/comparison.rb +174 -0
  318. data/lib/hecks/query_specification/common/cursor_spec.rb +9 -0
  319. data/lib/hecks/query_specification/common/dsl.rb +58 -0
  320. data/lib/hecks/query_specification/common/inspection_spec.rb +9 -0
  321. data/lib/hecks/query_specification/common/limit_spec.rb +9 -0
  322. data/lib/hecks/query_specification/common/null_policy.rb +92 -0
  323. data/lib/hecks/query_specification/common/null_semantics.rb +11 -0
  324. data/lib/hecks/query_specification/common/offset_spec.rb +9 -0
  325. data/lib/hecks/query_specification/common/options.rb +32 -0
  326. data/lib/hecks/query_specification/common/order_by.rb +9 -0
  327. data/lib/hecks/query_specification/common/specification.rb +10 -0
  328. data/lib/hecks/query_specification/common/where_clause.rb +9 -0
  329. data/lib/hecks/query_specification/field_path.rb +107 -0
  330. data/lib/hecks/query_specification/hop_path.rb +132 -0
  331. data/lib/hecks/query_specification/read_model/specification.rb +18 -0
  332. data/lib/hecks/query_specification.rb +14 -0
  333. data/lib/hecks/rendering.rb +48 -0
  334. data/lib/hecks/router/namespace_installer.rb +157 -0
  335. data/lib/hecks/router.rb +70 -0
  336. data/lib/hecks/runtime/aggregate_lock.rb +45 -0
  337. data/lib/hecks/runtime/boot_gates.rb +41 -0
  338. data/lib/hecks/runtime/caller.rb +66 -0
  339. data/lib/hecks/runtime/capability_graph.rb +44 -0
  340. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +135 -0
  341. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +260 -0
  342. data/lib/hecks/runtime/command_interpreter.rb +497 -0
  343. data/lib/hecks/runtime/command_rules/admissibility.rb +357 -0
  344. data/lib/hecks/runtime/command_rules/arithmetic.rb +260 -0
  345. data/lib/hecks/runtime/command_rules/authorization.rb +65 -0
  346. data/lib/hecks/runtime/command_rules/emission.rb +34 -0
  347. data/lib/hecks/runtime/command_rules/references.rb +189 -0
  348. data/lib/hecks/runtime/command_rules.rb +28 -0
  349. data/lib/hecks/runtime/dependency_planning.rb +245 -0
  350. data/lib/hecks/runtime/dispatcher.rb +301 -0
  351. data/lib/hecks/runtime/entity_element.rb +253 -0
  352. data/lib/hecks/runtime/entity_interpreter.rb +299 -0
  353. data/lib/hecks/runtime/errors.rb +122 -0
  354. data/lib/hecks/runtime/event.rb +51 -0
  355. data/lib/hecks/runtime/identity.rb +156 -0
  356. data/lib/hecks/runtime/instance.rb +175 -0
  357. data/lib/hecks/runtime/interpreting.rb +90 -0
  358. data/lib/hecks/runtime/loader.rb +184 -0
  359. data/lib/hecks/runtime/policy_interpreter.rb +366 -0
  360. data/lib/hecks/runtime/port_operation_interpreter.rb +210 -0
  361. data/lib/hecks/runtime/query_interpreter.rb +286 -0
  362. data/lib/hecks/runtime/reaction_invocation.rb +253 -0
  363. data/lib/hecks/runtime/read_model_interpreter.rb +341 -0
  364. data/lib/hecks/runtime/rebuild_sweep.rb +74 -0
  365. data/lib/hecks/runtime/reference_hop.rb +99 -0
  366. data/lib/hecks/runtime/refusal_wording.rb +126 -0
  367. data/lib/hecks/runtime/registry/saga_persistence.rb +142 -0
  368. data/lib/hecks/runtime/registry/verification.rb +246 -0
  369. data/lib/hecks/runtime/registry.rb +279 -0
  370. data/lib/hecks/runtime/remote_dispatcher.rb +143 -0
  371. data/lib/hecks/runtime/routing.rb +96 -0
  372. data/lib/hecks/runtime/saga_interpreter/correlation.rb +97 -0
  373. data/lib/hecks/runtime/saga_interpreter.rb +503 -0
  374. data/lib/hecks/runtime/saga_pending_dispatch.rb +45 -0
  375. data/lib/hecks/runtime/tenant_check.rb +84 -0
  376. data/lib/hecks/runtime/tenant_scope.rb +55 -0
  377. data/lib/hecks/runtime/value/admission.rb +130 -0
  378. data/lib/hecks/runtime/value/coercion.rb +565 -0
  379. data/lib/hecks/runtime/value/invariant_violation.rb +5 -0
  380. data/lib/hecks/runtime/value.rb +125 -0
  381. data/lib/hecks/runtime.rb +107 -0
  382. data/lib/hecks/storehouse.rb +632 -0
  383. data/lib/hecks/version.rb +16 -0
  384. data/lib/hecks/vocabulary.rb +218 -0
  385. data/lib/hecks.rb +123 -6
  386. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +90 -0
  387. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +128 -0
  388. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +160 -0
  389. metadata +412 -222
  390. data/bin/hecks +0 -7
  391. data/bin/hecks-package +0 -65
  392. data/bin/hecks_console +0 -12
  393. data/bin/hecks_serverless +0 -6
  394. data/lib/cli/build.rb +0 -14
  395. data/lib/cli/command_runner.rb +0 -28
  396. data/lib/cli/console.rb +0 -10
  397. data/lib/cli/generate.rb +0 -37
  398. data/lib/cli/hecks-cli.rb +0 -27
  399. data/lib/cli/test.rb +0 -57
  400. data/lib/console/commands.rb +0 -8
  401. data/lib/console/hecks-console.rb +0 -1
  402. data/lib/packager/README.md +0 -0
  403. data/lib/packager/app_runner.rb +0 -21
  404. data/lib/packager/args.rb +0 -26
  405. data/lib/packager/compatibility/fixnum.rb +0 -6
  406. data/lib/packager/hecks.rb +0 -39
  407. data/lib/packager/query_runner.rb +0 -21
  408. data/lib/packager/resources/Dockerfile +0 -11
  409. data/lib/packager/resources/app_binary +0 -7
  410. data/lib/packager/resources/bundle_config +0 -3
  411. data/lib/packager/resources/traveling-ruby-20150715-2.2.2-linux-x86_64.tar.gz +0 -0
  412. data/lib/packager/resources/traveling-ruby-20150715-2.2.2-osx.tar.gz +0 -0
  413. data/lib/serverless/Domain +0 -32
  414. data/lib/serverless/cli.rb +0 -75
  415. data/lib/serverless/resources/command_name.js +0 -5
  416. data/lib/serverless/resources/environment.js +0 -7
  417. data/lib/serverless/resources/handler.js.tt +0 -28
  418. data/lib/serverless/resources/run_binary.js +0 -22
  419. data/lib/serverless/resources/serverless.yml +0 -20
@@ -0,0 +1,420 @@
1
+
2
+ Hecks.bluebook "Expression" do
3
+ vision "The subset of regular Ruby a predicate is allowed to be — small enough that every target can evaluate it, and carried as canonical text so no two readers can disagree about what was said."
4
+ generic
5
+
6
+ aggregate "Operator" do
7
+ description "One admitted operation — its symbol, its precedence, and how it reads in every target that must evaluate it."
8
+
9
+ # WHAT IS NOT HERE, on purpose. The outer grammar
10
+ # has two rules that are not operators: parenthesization (a structural
11
+ # strip-and-recurse, no symbol of its own) and the bare-leaf fallback
12
+ # (whatever matches nothing else falls through to the inner grammar).
13
+ # Its inner grammar has three more: integer/float/string/bool/nil/
14
+ # array literals and the dotted-lookup fallback are TERMINAL
15
+ # productions — they recognize text, they do not combine operands,
16
+ # and they have nothing meaningful to render per target (a literal's
17
+ # spelling does not differ between targets the way an operation's
18
+ # might — `rust/src/kernel/expr.rs`'s own `Expr::Array` is a LEAF
19
+ # there too, for the identical reason, not routed through
20
+ # `OperatorCategory`).
21
+ # Forcing them into this shape would stretch `renderings` and the
22
+ # Arity invariant past what they mean. They stay declared only in
23
+ # prose — named here rather than silently left out.
24
+ identified_by :symbol
25
+
26
+ attribute :symbol, OperatorSymbol
27
+ attribute :category, Category
28
+ attribute :precedence, Precedence
29
+ attribute :arity, Arity
30
+ attribute :grammar, Grammar
31
+ attribute :strategy, Strategy
32
+ attribute :position, Position
33
+ attribute :renderings, list_of(Rendering)
34
+
35
+ lifecycle :status, default: "proposed" do
36
+ transition "Admit" => "admitted", from: "proposed"
37
+ transition "Retire" => "retired", from: "admitted"
38
+ end
39
+
40
+ value_object "OperatorSymbol" do
41
+ attribute :value, String
42
+ invariant("an operator is written as something") { !value.to_s.empty? }
43
+ end
44
+
45
+ value_object "Category" do
46
+ attribute :value, String
47
+ invariant("an operator belongs to a category") { !value.to_s.empty? }
48
+ end
49
+
50
+ value_object "Precedence" do
51
+ attribute :value, Integer
52
+ invariant("precedence binds at some level") { value > 0 }
53
+ end
54
+
55
+ value_object "Arity" do
56
+ attribute :value, Integer
57
+ # WRITTEN ACROSS LINES ON PURPOSE, and this is the only predicate in the
58
+ # corpus that is. A CONTINUATION line is where extraction used to break:
59
+ # a naive line join reads `value > 0 && && value <= 3` — a different
60
+ # canonical form for the same source, waiting for the first multi-line
61
+ # rule anyone wrote. Every predicate here was kept on one line to dodge
62
+ # that. The join is continuation-aware now, so this case holds the fix:
63
+ # if it regresses, the canonical text of THIS invariant changes and the
64
+ # golden IR goes red.
65
+ invariant("an operator takes one, two or three operands") do
66
+ value > 0 &&
67
+ value <= 3
68
+ end
69
+ end
70
+
71
+ # OUTER checks a leaf against `.include?`/comparators/`!` before falling
72
+ # through to INNER's arithmetic/dotted-lookup grammar — two stacked
73
+ # grammars. Which one an operator belongs
74
+ # to is not derivable from its symbol alone (`+` reads like it could be
75
+ # either), so it is its own column rather than inferred.
76
+ value_object "Grammar" do
77
+ attribute :value, String
78
+ invariant("an operator belongs to one of the two stacked grammars") { !value.to_s.empty? }
79
+ end
80
+
81
+ # HOW the check recognizes this operator's text, not WHERE it binds
82
+ # (that's precedence) or WHEN it's tried (that's position). Four shapes
83
+ # cover every admitted operator: split at a top-level occurrence
84
+ # (`||`, comparators), strip a leading marker (`!`), strip a trailing
85
+ # suffix (`.empty?`), or match a call-with-argument pattern
86
+ # (`.include?(needle)`).
87
+ value_object "Strategy" do
88
+ attribute :value, String
89
+ invariant("an operator names how its check recognizes it") { !value.to_s.empty? }
90
+ end
91
+
92
+ # THE WITHIN-GRAMMAR CHECK ORDER — what precedence alone cannot say,
93
+ # since the six comparators all share one precedence tier and something
94
+ # still has to break the tie (grammar.md: `>=` before `<=` before `<`
95
+ # before `>` before `==` before `!=`, so `<` splitting does not fire
96
+ # inside `>=`). Scoped per `grammar`, mirroring Normalisation's own
97
+ # Position column below — each grammar starts its own count at 1.
98
+ value_object "Position" do
99
+ attribute :value, Integer
100
+ invariant("an operator sits somewhere in its grammar's check order") { value > 0 }
101
+ end
102
+
103
+ value_object "Target" do
104
+ attribute :value, String
105
+ end
106
+
107
+ value_object "Form" do
108
+ attribute :value, String
109
+ end
110
+
111
+ value_object "Rendering" do
112
+ attribute :target, String
113
+ attribute :form, String
114
+
115
+ invariant("a rendering must name its target") { !target.to_s.empty? }
116
+ invariant("a rendering must have a form") { !form.to_s.empty? }
117
+ end
118
+
119
+ command "Propose" do
120
+ role "Language designer"
121
+ goal "Put an operation forward for the sublanguage"
122
+
123
+ attribute :symbol, OperatorSymbol
124
+ attribute :category, Category
125
+ attribute :precedence, Precedence
126
+ attribute :arity, Arity
127
+ attribute :grammar, Grammar
128
+ attribute :strategy, Strategy
129
+ attribute :position, Position
130
+
131
+ given("an operator belongs to the outer or the inner grammar") do
132
+ grammar.value == "outer" || grammar.value == "inner"
133
+ end
134
+
135
+ given("an operator's check strategy is one the parser actually has") { strategy.value == "top_level_split" || strategy.value == "prefix_match" || strategy.value == "suffix_match" || strategy.value == "call_pattern_match" || strategy.value == "block_pattern_match" }
136
+
137
+ emits "OperatorProposed"
138
+ end
139
+
140
+ command "Render" do
141
+ role "Language designer"
142
+ goal "Declare how this operator reads in one target"
143
+
144
+ reference_to Operator
145
+ attribute :target, Target
146
+ attribute :form, Form
147
+
148
+ given("a retired operator takes no new renderings") { status != "retired" }
149
+
150
+ sets :renderings, append: { target: :target, form: :form }
151
+
152
+ emits "OperatorRendered"
153
+ end
154
+
155
+ command "Admit" do
156
+ role "Language designer"
157
+ goal "Accept the operation into the sublanguage"
158
+
159
+ reference_to Operator
160
+
161
+ given("an operator must read in every target before it is admitted") { renderings.size >= 1 }
162
+
163
+ emits "OperatorAdmitted"
164
+ end
165
+
166
+ command "Retire" do
167
+ role "Language designer"
168
+ goal "Remove an operation from the sublanguage"
169
+
170
+ reference_to Operator
171
+
172
+ emits "OperatorRetired"
173
+ end
174
+ end
175
+
176
+ aggregate "Normalisation" do
177
+ description "One rule that turns written source into canonical text — its boundary condition, where it sits in the order, and how it reads in every target that must apply it."
178
+
179
+ identified_by :name
180
+
181
+ attribute :name, RuleName
182
+ attribute :strategy, Strategy
183
+ attribute :source_token, SourceToken
184
+ attribute :replacement, Replacement
185
+ attribute :boundary, Boundary
186
+ attribute :position, Position
187
+ attribute :readings, list_of(Reading)
188
+
189
+ lifecycle :status, default: "proposed" do
190
+ transition "Admit" => "admitted", from: "proposed"
191
+ transition "Retire" => "retired", from: "admitted"
192
+ end
193
+
194
+ value_object "RuleName" do
195
+ attribute :value, String
196
+ invariant("a rule is named") { !value.to_s.empty? }
197
+ end
198
+
199
+ value_object "Strategy" do
200
+ attribute :value, String
201
+ invariant("a rule names a strategy") { !value.to_s.empty? }
202
+ end
203
+
204
+ value_object "SourceToken" do
205
+ attribute :value, String
206
+ end
207
+
208
+ value_object "Replacement" do
209
+ attribute :value, String
210
+ end
211
+
212
+ value_object "Boundary" do
213
+ attribute :value, String, default: "none"
214
+ invariant("a boundary condition is named") { !value.to_s.empty? }
215
+ end
216
+
217
+ value_object "Position" do
218
+ attribute :value, Integer
219
+ invariant("a rule sits somewhere in the order") { value > 0 }
220
+ end
221
+
222
+ value_object "Target" do
223
+ attribute :value, String
224
+ end
225
+
226
+ value_object "Form" do
227
+ attribute :value, String
228
+ end
229
+
230
+ value_object "Rule" do
231
+ attribute :strategy, String
232
+ attribute :source_token, String
233
+ attribute :replacement, String
234
+ attribute :boundary, String
235
+ attribute :position, Integer
236
+
237
+ member strategy: "collapse_whitespace", source_token: "", replacement: "", boundary: "none", position: 1
238
+ member strategy: "replace", source_token: ".length", replacement: ".size", boundary: "word", position: 2
239
+ end
240
+
241
+ value_object "Reading" do
242
+ attribute :target, String
243
+ attribute :form, String
244
+
245
+ invariant("a reading must name its target") { !target.to_s.empty? }
246
+ invariant("a reading must have a form") { !form.to_s.empty? }
247
+ end
248
+
249
+ command "Propose" do
250
+ role "Language designer"
251
+ goal "Put a normalisation rule forward for the canonical form"
252
+
253
+ attribute :name, RuleName
254
+ attribute :strategy, Strategy
255
+ attribute :source_token, SourceToken
256
+ attribute :replacement, Replacement
257
+ attribute :boundary, Boundary
258
+ attribute :position, Position, optional: true
259
+
260
+ given("a rule must name a linked strategy") do
261
+ strategy.value == "collapse_whitespace" || strategy.value == "replace"
262
+ end
263
+
264
+ given("a rule must state its boundary") { boundary.value == "none" || boundary.value == "word" }
265
+
266
+ emits "NormalisationProposed"
267
+ end
268
+
269
+ command "Read" do
270
+ role "Language designer"
271
+ goal "Declare how this rule reads in one target"
272
+
273
+ reference_to Normalisation
274
+ attribute :target, Target
275
+ attribute :form, Form
276
+
277
+ given("a retired rule takes no new readings") { status != "retired" }
278
+
279
+ sets :readings, append: { target: :target, form: :form }
280
+
281
+ emits "NormalisationRead"
282
+ end
283
+
284
+ command "Admit" do
285
+ role "Language designer"
286
+ goal "Accept the rule into the canonical form"
287
+
288
+ reference_to Normalisation
289
+
290
+ given("a rule must read in every target before it is admitted") { readings.size >= 1 }
291
+
292
+ emits "NormalisationAdmitted"
293
+ end
294
+
295
+ command "Retire" do
296
+ role "Language designer"
297
+ goal "Remove a rule from the canonical form"
298
+
299
+ reference_to Normalisation
300
+
301
+ emits "NormalisationRetired"
302
+ end
303
+ end
304
+
305
+ aggregate "Expression" do
306
+ description "One predicate extracted from regular Ruby — the source as written, the canonical text the evaluator runs, and the subject it reads against."
307
+
308
+ identified_by :canonical
309
+
310
+ attribute :description, Description
311
+ attribute :source, Source
312
+ attribute :canonical, Canonical
313
+ attribute :subject, Subject
314
+ attribute :role, ExpressionRole
315
+ attribute :references, list_of(Reference)
316
+
317
+ lifecycle :status, default: "extracted" do
318
+ transition "Admit" => "admitted", from: "extracted"
319
+ transition "Reject" => "rejected", from: "extracted"
320
+ end
321
+
322
+ value_object "Description" do
323
+ attribute :value, String
324
+ invariant("a predicate says what it is for") { !value.to_s.empty? }
325
+ end
326
+
327
+ value_object "Source" do
328
+ attribute :value, String
329
+ end
330
+
331
+ value_object "Canonical" do
332
+ attribute :value, String
333
+ end
334
+
335
+ value_object "Subject" do
336
+ attribute :value, String
337
+ invariant("a predicate reads against something") { !value.to_s.empty? }
338
+ end
339
+
340
+ value_object "ExpressionRole" do
341
+ attribute :value, String, default: "given"
342
+ invariant("a predicate plays a role") { !value.to_s.empty? }
343
+ end
344
+
345
+ value_object "ReferenceName" do
346
+ attribute :value, String
347
+ invariant("a reference must be named") { !value.to_s.empty? }
348
+ end
349
+
350
+ value_object "Kind" do
351
+ attribute :value, String
352
+ invariant("a reference is either an attribute or an argument") do
353
+ value.to_s == "attribute" || value.to_s == "argument"
354
+ end
355
+ end
356
+
357
+ value_object "Reason" do
358
+ attribute :value, String
359
+ invariant("a refusal gives a reason") { !value.to_s.empty? }
360
+ end
361
+
362
+ value_object "Reference" do
363
+ attribute :name, String
364
+ attribute :kind, String
365
+
366
+ invariant("a reference must be named") { !name.to_s.empty? }
367
+ invariant("a reference is either an attribute or an argument") do
368
+ kind.to_s == "attribute" || kind.to_s == "argument"
369
+ end
370
+ end
371
+
372
+ command "Extract" do
373
+ role "System"
374
+ goal "Lower a real Ruby predicate into the sublanguage"
375
+
376
+ attribute :description, Description, optional: true
377
+ attribute :source, Source
378
+ attribute :canonical, Canonical
379
+ attribute :subject, Subject
380
+
381
+ emits "ExpressionExtracted"
382
+ end
383
+
384
+ command "Note" do
385
+ role "System"
386
+ goal "Record a name the expression reads"
387
+
388
+ reference_to Expression
389
+ attribute :name, ReferenceName
390
+ attribute :kind, Kind
391
+
392
+ sets :references, append: { name: :name, kind: :kind }
393
+
394
+ emits "ReferenceNoted"
395
+ end
396
+
397
+ command "Admit" do
398
+ role "System"
399
+ goal "Accept the expression as evaluable by every target"
400
+
401
+ reference_to Expression
402
+
403
+ given("an expression must have canonical text") { !canonical.value.to_s.empty? }
404
+ given("an expression must know its subject") { !subject.value.to_s.empty? }
405
+
406
+ emits "ExpressionAdmitted"
407
+ end
408
+
409
+ command "Reject" do
410
+ role "System"
411
+ goal "Refuse a predicate that leaves the sublanguage"
412
+
413
+ reference_to Expression
414
+ attribute :reason, Reason
415
+
416
+ emits "ExpressionRejected"
417
+ end
418
+ end
419
+
420
+ end