hecks 5.0.0 → 6.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 (1277) hide show
  1. checksums.yaml +4 -4
  2. data/examples/pizzas/bluebook/pizzas.bluebook +1 -0
  3. data/exe/hecks +14 -2
  4. data/lib/hecks/adapters/driven/claude_code.rb +1 -1
  5. data/lib/hecks/adapters/driven/d1.rb +2 -1
  6. data/lib/hecks/adapters/driven/folder.rb +35 -28
  7. data/lib/hecks/adapters/driven/folder_overlay.rb +51 -0
  8. data/lib/hecks/adapters/driven/google_authentication.adapter +3 -0
  9. data/lib/hecks/adapters/driven/google_authentication.rb +99 -0
  10. data/lib/hecks/adapters/driven/governance_authorization.rb +32 -36
  11. data/lib/hecks/adapters/driven/heki/journal.rb +45 -0
  12. data/lib/hecks/adapters/driven/identity_registry.rb +1 -1
  13. data/lib/hecks/adapters/driven/in_memory_ordering.rb +3 -2
  14. data/lib/hecks/adapters/driven/key_keeper.rb +42 -0
  15. data/lib/hecks/adapters/driven/lambda/client.rb +8 -2
  16. data/lib/hecks/adapters/driven/lambda/remote_dispatcher.rb +185 -0
  17. data/lib/hecks/adapters/driven/lambda.rb +14 -2
  18. data/lib/hecks/adapters/driven/memory/dispatch_claims.rb +25 -0
  19. data/lib/hecks/adapters/driven/memory.rb +15 -4
  20. data/lib/hecks/adapters/driven/postgres/codec.rb +1 -1
  21. data/lib/hecks/adapters/driven/postgres/journal.rb +46 -0
  22. data/lib/hecks/adapters/driven/postgres/outbox.rb +31 -5
  23. data/lib/hecks/adapters/driven/postgres/projection.rb +43 -0
  24. data/lib/hecks/adapters/driven/postgres/repository.rb +1 -1
  25. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +2 -1
  26. data/lib/hecks/adapters/driven/postgres/set_dialect.rb +44 -0
  27. data/lib/hecks/adapters/driven/postgres.adapter +8 -0
  28. data/lib/hecks/adapters/driven/postgres.rb +8 -3
  29. data/lib/hecks/adapters/driven/postgres_dump/connection.rb +57 -0
  30. data/lib/hecks/adapters/driven/postgres_dump.rb +117 -0
  31. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/boot.rb +6 -3
  32. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/class_methods.rb +1 -1
  33. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/dialect.rb +1 -1
  34. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/chain_sql.rb +8 -4
  35. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/domain_rename.rb +2 -2
  36. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/era_integrity.rb +2 -2
  37. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/era_store.rb +3 -3
  38. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/mint_transaction.rb +2 -2
  39. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/sql_templates.rb +6 -2
  40. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/tail_merge.rb +1 -1
  41. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage.rb +1 -1
  42. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage_manager/context.rb +15 -5
  43. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage_manager/coverage_check.rb +13 -11
  44. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage_manager/era_resolver.rb +23 -6
  45. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage_manager/merge_coordinator.rb +2 -2
  46. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage_manager/minter.rb +12 -9
  47. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage_manager/refusals.rb +13 -1
  48. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage_manager.rb +6 -6
  49. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/query_phases.rb +8 -2
  50. data/lib/hecks/adapters/driven/postgres_era.adapter +7 -1
  51. data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era.rb +14 -13
  52. data/lib/hecks/adapters/driven/prism.rb +4 -3
  53. data/lib/hecks/adapters/driven/projection/read_model_walk.rb +126 -0
  54. data/lib/hecks/adapters/driven/projection/row_decoding.rb +57 -0
  55. data/lib/hecks/adapters/driven/set_transform/assignments.rb +101 -0
  56. data/lib/hecks/adapters/driven/set_transform/expressions.rb +138 -0
  57. data/lib/hecks/adapters/driven/set_transform.rb +81 -0
  58. data/lib/hecks/adapters/driven/sql_keyset.rb +61 -0
  59. data/lib/hecks/adapters/driven/sql_query_builder.rb +28 -9
  60. data/lib/hecks/adapters/driven/sqlite/codec.rb +1 -1
  61. data/lib/hecks/adapters/driven/sqlite/ddl.rb +7 -0
  62. data/lib/hecks/adapters/driven/sqlite/dialect.rb +2 -1
  63. data/lib/hecks/adapters/driven/sqlite/dispatch_claims.rb +28 -0
  64. data/lib/hecks/adapters/driven/sqlite/journal.rb +46 -0
  65. data/lib/hecks/adapters/driven/sqlite/outbox.rb +3 -2
  66. data/lib/hecks/adapters/driven/sqlite/projection.rb +9 -135
  67. data/lib/hecks/adapters/driven/sqlite/repository.rb +1 -1
  68. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +16 -4
  69. data/lib/hecks/adapters/driven/sqlite/set_dialect.rb +39 -0
  70. data/lib/hecks/adapters/driven/sqlite.adapter +2 -0
  71. data/lib/hecks/adapters/driven/sqlite.rb +11 -2
  72. data/lib/hecks/adapters/driven.rb +8 -3
  73. data/lib/hecks/adapters/driving/cli.rb +1 -1
  74. data/lib/hecks/adapters/driving/cli_runner/answers.rb +23 -16
  75. data/lib/hecks/adapters/driving/cli_runner/resolution.rb +25 -24
  76. data/lib/hecks/adapters/driving/cli_runner/settling.rb +9 -5
  77. data/lib/hecks/adapters/driving/cli_runner/streaming.rb +1 -1
  78. data/lib/hecks/adapters/driving/cli_runner/suggestions.rb +15 -7
  79. data/lib/hecks/adapters/driving/cli_runner/verb_names.rb +49 -0
  80. data/lib/hecks/adapters/driving/cli_runner.rb +4 -2
  81. data/lib/hecks/adapters/driving/github_webhook.rb +2 -1
  82. data/lib/hecks/adapters/driving/handle/verb_methods.rb +46 -0
  83. data/lib/hecks/adapters/driving/handle.rb +9 -17
  84. data/lib/hecks/adapters/driving/json.rb +11 -8
  85. data/lib/hecks/adapters/driving/launcher_options.rb +37 -32
  86. data/lib/hecks/adapters/driving/mcp_scope/env_problems.rb +3 -1
  87. data/lib/hecks/adapters/driving/mcp_scope.rb +8 -7
  88. data/lib/hecks/adapters/driving/newcomer.rb +6 -5
  89. data/lib/hecks/adapters/driving/ruby/aggregate_module.rb +13 -12
  90. data/lib/hecks/adapters/driving/ruby/bulk_verbs.rb +127 -0
  91. data/lib/hecks/adapters/driving/ruby/{chapter.rb → declaration.rb} +27 -27
  92. data/lib/hecks/adapters/driving/ruby/query_rows.rb +27 -0
  93. data/lib/hecks/adapters/driving/ruby.rb +25 -24
  94. data/lib/hecks/adapters/driving/usage_cache.rb +14 -3
  95. data/lib/hecks/assembly.rb +101 -0
  96. data/lib/hecks/behaviors/dsl.rb +13 -3
  97. data/lib/hecks/behaviors/expectations/boot.rb +7 -6
  98. data/lib/hecks/behaviors/expectations/checks.rb +1 -1
  99. data/lib/hecks/behaviors/expectations/dispatching.rb +10 -9
  100. data/lib/hecks/behaviors/expectations/qualify.rb +9 -9
  101. data/lib/hecks/behaviors/expectations.rb +24 -10
  102. data/lib/hecks/behaviors/ir.rb +4 -2
  103. data/lib/hecks/behaviors/rspec.rb +1 -1
  104. data/lib/hecks/behaviors/runner.rb +31 -4
  105. data/lib/hecks/bench/environment.rb +6 -2
  106. data/lib/hecks/bench/postgres_probe.rb +3 -1
  107. data/lib/hecks/bench/report.rb +4 -1
  108. data/lib/hecks/bench/suite.rb +9 -3
  109. data/lib/hecks/bluebook/acknowledgements.rb +81 -0
  110. data/lib/hecks/bluebook/aggregate.rb +13 -4
  111. data/lib/hecks/bluebook/ask_resolution.rb +17 -17
  112. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +8 -5
  113. data/lib/hecks/bluebook/assembly/contracts/structure.rb +11 -7
  114. data/lib/hecks/bluebook/assembly/marks.rb +10 -1
  115. data/lib/hecks/bluebook/assembly/scalars.rb +8 -2
  116. data/lib/hecks/bluebook/assembly/specializer.rb +2 -2
  117. data/lib/hecks/bluebook/assembly.rb +10 -10
  118. data/lib/hecks/bluebook/behaviour/aggregate.rb +2 -1
  119. data/lib/hecks/bluebook/behaviour/attribute.rb +12 -0
  120. data/lib/hecks/bluebook/behaviour/command.rb +1 -1
  121. data/lib/hecks/bluebook/behaviour/{chapter.rb → declaration.rb} +17 -17
  122. data/lib/hecks/bluebook/behaviour/domain_port.rb +1 -1
  123. data/lib/hecks/bluebook/behaviour/entity.rb +1 -0
  124. data/lib/hecks/bluebook/behaviour/hecksagon.rb +8 -1
  125. data/lib/hecks/bluebook/behaviour/process_manager.rb +4 -1
  126. data/lib/hecks/bluebook/behaviour/query.rb +5 -0
  127. data/lib/hecks/bluebook/behaviour/read_model.rb +4 -1
  128. data/lib/hecks/bluebook/behaviour/traits.rb +13 -0
  129. data/lib/hecks/bluebook/capabilities/attribute_values.rb +17 -16
  130. data/lib/hecks/bluebook/capabilities/package_declared.rb +65 -0
  131. data/lib/hecks/bluebook/capabilities.rb +32 -132
  132. data/lib/hecks/bluebook/command.rb +22 -7
  133. data/lib/hecks/bluebook/context_map.rb +104 -0
  134. data/lib/hecks/bluebook/{chapter.rb → declaration.rb} +13 -13
  135. data/lib/hecks/bluebook/dsl/adapter_builder.rb +28 -4
  136. data/lib/hecks/bluebook/dsl/aggregate_builder/draining.rb +2 -2
  137. data/lib/hecks/bluebook/dsl/aggregate_builder/one_of_reference.rb +54 -0
  138. data/lib/hecks/bluebook/dsl/aggregate_builder/query_field_sealing.rb +11 -2
  139. data/lib/hecks/bluebook/dsl/aggregate_builder/query_sealing.rb +15 -5
  140. data/lib/hecks/bluebook/dsl/aggregate_builder/relationships.rb +21 -3
  141. data/lib/hecks/bluebook/dsl/aggregate_builder/rules.rb +22 -22
  142. data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +2 -2
  143. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +27 -22
  144. data/lib/hecks/bluebook/dsl/bluebook_builder/pending_givens.rb +22 -22
  145. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/computed_sources.rb +27 -21
  146. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb +3 -5
  147. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/event_shapes.rb +5 -4
  148. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/fan_out_rows.rb +3 -3
  149. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/hop_tails.rb +13 -5
  150. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/projected_fields.rb +4 -4
  151. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/provisions.rb +38 -84
  152. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/query_hops.rb +5 -5
  153. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/references.rb +6 -6
  154. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/with_projections.rb +6 -6
  155. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +3 -3
  156. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +67 -67
  157. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -0
  158. data/lib/hecks/bluebook/dsl/command_builder/folded_sets.rb +48 -0
  159. data/lib/hecks/bluebook/dsl/command_builder.rb +28 -15
  160. data/lib/hecks/bluebook/dsl/context_map_builder.rb +73 -0
  161. data/lib/hecks/bluebook/dsl/entity_builder/rules.rb +17 -17
  162. data/lib/hecks/bluebook/dsl/entity_builder/scope.rb +3 -3
  163. data/lib/hecks/bluebook/dsl/entity_builder/sealing.rb +2 -2
  164. data/lib/hecks/bluebook/dsl/entity_builder.rb +3 -3
  165. data/lib/hecks/bluebook/dsl/hecksagon_builder/{chapter_scope.rb → bluebook_scope.rb} +14 -14
  166. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +33 -27
  167. data/lib/hecks/bluebook/dsl/identity_declaration.rb +6 -2
  168. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +4 -1
  169. data/lib/hecks/bluebook/dsl/query_builder.rb +14 -8
  170. data/lib/hecks/bluebook/dsl/read_model_builder/sealing.rb +6 -11
  171. data/lib/hecks/bluebook/dsl/read_model_builder.rb +1 -2
  172. data/lib/hecks/bluebook/dsl/word_gate.rb +2 -1
  173. data/lib/hecks/bluebook/dsl/world_builder.rb +2 -2
  174. data/lib/hecks/bluebook/dsl.rb +3 -2
  175. data/lib/hecks/bluebook/expression/ast_json/emitters.rb +4 -0
  176. data/lib/hecks/bluebook/expression/ast_json.rb +5 -3
  177. data/lib/hecks/bluebook/expression/ast_reader/blocks.rb +41 -0
  178. data/lib/hecks/bluebook/expression/ast_reader.rb +2 -10
  179. data/lib/hecks/bluebook/expression/canonical_form.rb +9 -4
  180. data/lib/hecks/bluebook/expression/evaluator/parser.rb +4 -1
  181. data/lib/hecks/bluebook/expression/evaluator.rb +13 -9
  182. data/lib/hecks/bluebook/expression/projection.json +6 -0
  183. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +50 -2
  184. data/lib/hecks/bluebook/expression/resolver/lookups.rb +2 -1
  185. data/lib/hecks/bluebook/expression/resolver/operations.rb +1 -0
  186. data/lib/hecks/bluebook/expression/resolver/parsing.rb +21 -15
  187. data/lib/hecks/bluebook/expression/resolver/scanning.rb +4 -1
  188. data/lib/hecks/bluebook/expression.rb +1 -1
  189. data/lib/hecks/bluebook/hecksagon.rb +48 -23
  190. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +4 -1
  191. data/lib/hecks/bluebook/meta_validator/judge/cells.rb +1 -1
  192. data/lib/hecks/bluebook/meta_validator/judge/identity.rb +2 -1
  193. data/lib/hecks/bluebook/meta_validator/modes.rb +27 -27
  194. data/lib/hecks/bluebook/meta_validator/plan.rb +5 -5
  195. data/lib/hecks/bluebook/meta_validator/readings/fields.rb +3 -3
  196. data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +11 -3
  197. data/lib/hecks/bluebook/meta_validator/reconstruction/reading.rb +1 -1
  198. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +19 -19
  199. data/lib/hecks/bluebook/meta_validator/shapes.rb +6 -1
  200. data/lib/hecks/bluebook/meta_validator/syntax_boot/disk_cache.rb +18 -15
  201. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +21 -15
  202. data/lib/hecks/bluebook/meta_validator/verdict_cache/prebuilt.rb +4 -1
  203. data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +11 -10
  204. data/lib/hecks/bluebook/meta_validator.rb +25 -22
  205. data/lib/hecks/bluebook/model_check/aggregate_checks.rb +68 -0
  206. data/lib/hecks/bluebook/model_check/ask_checks.rb +6 -5
  207. data/lib/hecks/bluebook/model_check/client_profile.rb +8 -42
  208. data/lib/hecks/bluebook/model_check/context_checks.rb +97 -0
  209. data/lib/hecks/bluebook/model_check/context_map_checks.rb +158 -0
  210. data/lib/hecks/bluebook/model_check/lifecycle_checks.rb +27 -5
  211. data/lib/hecks/bluebook/model_check/one_of_checks.rb +106 -0
  212. data/lib/hecks/bluebook/model_check/orphan_checks.rb +129 -0
  213. data/lib/hecks/bluebook/model_check/redundant_relationships.rb +38 -0
  214. data/lib/hecks/bluebook/model_check/reference_checks.rb +11 -1
  215. data/lib/hecks/bluebook/model_check/saga_checks.rb +8 -3
  216. data/lib/hecks/bluebook/model_check/verbs.rb +4 -4
  217. data/lib/hecks/bluebook/model_check.rb +32 -12
  218. data/lib/hecks/bluebook/named_pattern.rb +12 -1
  219. data/lib/hecks/bluebook/one_of_union.rb +35 -0
  220. data/lib/hecks/bluebook/pattern_subset.rb +12 -3
  221. data/lib/hecks/bluebook/project_loader.rb +3 -2
  222. data/lib/hecks/bluebook/project_register.rb +21 -5
  223. data/lib/hecks/bluebook/query.rb +4 -1
  224. data/lib/hecks/bluebook/read_model.rb +5 -5
  225. data/lib/hecks/bluebook/reference.rb +3 -3
  226. data/lib/hecks/bluebook/smoke_test.rb +15 -13
  227. data/lib/hecks/bluebook/synthesizer.rb +48 -13
  228. data/lib/hecks/bluebook/translation_expression/parser.rb +14 -5
  229. data/lib/hecks/bluebook.rb +6 -3
  230. data/lib/hecks/bulk/bluebook/adapters/row_sweeper.adapter +7 -0
  231. data/lib/hecks/bulk/bluebook/bulk.behaviors +18 -0
  232. data/lib/hecks/bulk/bluebook/bulk.bluebook +126 -0
  233. data/lib/hecks/bulk/bluebook/bulk.hecksagon +11 -0
  234. data/lib/hecks/bulk/bluebook/bulk.ports.hecksagon +13 -0
  235. data/lib/hecks/bulk/plan.rb +60 -0
  236. data/lib/hecks/bulk/row_sweeper.rb +34 -0
  237. data/lib/hecks/bulk/set_arguments.rb +68 -0
  238. data/lib/hecks/bulk/set_eligibility.rb +50 -0
  239. data/lib/hecks/bulk/set_planner.rb +100 -0
  240. data/lib/hecks/bulk/set_sweep.rb +78 -0
  241. data/lib/hecks/bulk/sweep.rb +67 -0
  242. data/lib/hecks/cli/check_era.rb +6 -6
  243. data/lib/hecks/cli/command_table.rb +2 -2
  244. data/lib/hecks/cli/console.rb +11 -6
  245. data/lib/hecks/cli/document.rb +14 -9
  246. data/lib/hecks/cli/domain_writer.rb +4 -1
  247. data/lib/hecks/cli/expected_era.rb +139 -0
  248. data/lib/hecks/cli/expression_projection.rb +2 -2
  249. data/lib/hecks/cli/follow.rb +3 -3
  250. data/lib/hecks/cli/history.rb +4 -1
  251. data/lib/hecks/cli/interview_draft.rb +8 -1
  252. data/lib/hecks/cli/interview_record.rb +7 -3
  253. data/lib/hecks/cli/interview_run.rb +7 -5
  254. data/lib/hecks/cli/interview_session/proposals.rb +5 -2
  255. data/lib/hecks/cli/interview_session.rb +3 -2
  256. data/lib/hecks/cli/interview_shape/lifecycle.rb +92 -0
  257. data/lib/hecks/cli/interview_shape.rb +19 -73
  258. data/lib/hecks/cli/model_check/examination.rb +63 -14
  259. data/lib/hecks/cli/model_check/sources.rb +4 -2
  260. data/lib/hecks/cli/model_check.rb +1 -1
  261. data/lib/hecks/cli/persistence_notice.rb +45 -0
  262. data/lib/hecks/cli/present.rb +1 -1
  263. data/lib/hecks/cli/project_cli/launcher_source.rb +11 -9
  264. data/lib/hecks/cli/project_cli/templates.rb +24 -3
  265. data/lib/hecks/cli/project_cli.rb +11 -13
  266. data/lib/hecks/cli/project_diagrams.rb +20 -20
  267. data/lib/hecks/cli/project_glossary.rb +14 -14
  268. data/lib/hecks/cli/reference.rb +1 -1
  269. data/lib/hecks/cli/refresh_projections.rb +16 -11
  270. data/lib/hecks/cli/run.rb +27 -5
  271. data/lib/hecks/cli/seed_semantics_corpus.rb +14 -4
  272. data/lib/hecks/cli/shape.rb +3 -4
  273. data/lib/hecks/cli/smoke_http/transport.rb +3 -2
  274. data/lib/hecks/cli/statements.rb +7 -7
  275. data/lib/hecks/cli/stores.rb +70 -2
  276. data/lib/hecks/cli/stress_concurrency_specs/reporting.rb +4 -1
  277. data/lib/hecks/codemod.rb +3 -3
  278. data/lib/hecks/composer/adapters/claude_composer.rb +3 -2
  279. data/lib/hecks/composer/agent.rb +1 -1
  280. data/lib/hecks/composer/assistant.rb +2 -2
  281. data/lib/hecks/composer/behavior_run.rb +7 -1
  282. data/lib/hecks/composer/bluebook/composer.bluebook +18 -25
  283. data/lib/hecks/composer/bluebook/composer.hecksagon +1 -1
  284. data/lib/hecks/composer/board.rb +6 -6
  285. data/lib/hecks/composer/board_edit/command_text.rb +4 -1
  286. data/lib/hecks/composer/board_edit/source.rb +18 -9
  287. data/lib/hecks/composer/board_edit.rb +2 -2
  288. data/lib/hecks/composer/check.rb +22 -22
  289. data/lib/hecks/composer/domains.rb +1 -1
  290. data/lib/hecks/composer/live.rb +19 -13
  291. data/lib/hecks/composer/outline.rb +4 -1
  292. data/lib/hecks/composer/page.html +1 -1
  293. data/lib/hecks/composer/panels.rb +6 -3
  294. data/lib/hecks/composer/parse.rb +53 -36
  295. data/lib/hecks/composer/session.rb +22 -16
  296. data/lib/hecks/composer/toolbox.rb +9 -6
  297. data/lib/hecks/composer/web.rb +3 -2
  298. data/lib/hecks/composer/workbench.rb +12 -9
  299. data/lib/hecks/composer.rb +1 -1
  300. data/lib/hecks/construct.rb +7 -7
  301. data/lib/hecks/corpus/adapters.rb +2 -1
  302. data/lib/hecks/corpus/routes.rb +25 -5
  303. data/lib/hecks/corpus/rust.rb +59 -24
  304. data/lib/hecks/corpus/sources.rb +12 -11
  305. data/lib/hecks/corpus/worlds.rb +2 -1
  306. data/lib/hecks/corpus.rb +30 -22
  307. data/lib/hecks/deploy/bluebook/deploy.bluebook +304 -518
  308. data/lib/hecks/doc/reference/harvester.rb +4 -1
  309. data/lib/hecks/doc/reference/readme.rb +11 -6
  310. data/lib/hecks/doc/reference/rendering.rb +11 -5
  311. data/lib/hecks/doc/reference.rb +7 -5
  312. data/lib/hecks/embryonaut_bluebook/lock.rb +5 -1
  313. data/lib/hecks/embryonaut_bluebook/manifest.rb +7 -1
  314. data/lib/hecks/embryonaut_bluebook/registry/changelog.rb +4 -1
  315. data/lib/hecks/embryonaut_bluebook/registry/versions.rb +13 -2
  316. data/lib/hecks/embryonaut_bluebook/registry.rb +5 -2
  317. data/lib/hecks/embryonaut_bluebook/shape.rb +1 -1
  318. data/lib/hecks/embryonaut_bluebook/vendor.rb +5 -2
  319. data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +15 -1
  320. data/lib/hecks/embryonaut_bluebook.rb +26 -12
  321. data/lib/hecks/engine_agreement.rb +4 -1
  322. data/lib/hecks/forms/app/commands.rb +35 -2
  323. data/lib/hecks/forms/app/records.rb +12 -12
  324. data/lib/hecks/forms/app/responses.rb +1 -1
  325. data/lib/hecks/forms/app.rb +22 -19
  326. data/lib/hecks/forms/command_form_renderer.rb +2 -2
  327. data/lib/hecks/forms/field_controls.rb +6 -1
  328. data/lib/hecks/forms/field_shape.rb +14 -6
  329. data/lib/hecks/forms/html.rb +8 -7
  330. data/lib/hecks/forms/html_pattern.rb +80 -0
  331. data/lib/hecks/forms/index_renderer.rb +11 -11
  332. data/lib/hecks/forms/params.rb +2 -1
  333. data/lib/hecks/forms/port_argument.rb +4 -1
  334. data/lib/hecks/forms/query_form_renderer.rb +1 -1
  335. data/lib/hecks/forms/record_renderer.rb +2 -2
  336. data/lib/hecks/forms/record_table.rb +1 -1
  337. data/lib/hecks/forms/reference_options.rb +2 -1
  338. data/lib/hecks/forms/text_shape.rb +4 -1
  339. data/lib/hecks/forms/value_object_shape.rb +1 -1
  340. data/lib/hecks/forms.rb +7 -7
  341. data/lib/hecks/fqn.rb +8 -2
  342. data/lib/hecks/framework/bluebook/change.bluebook +10 -15
  343. data/lib/hecks/framework/bluebook/change.hecksagon +1 -1
  344. data/lib/hecks/framework/bluebook/compliance.bluebook +27 -126
  345. data/lib/hecks/framework/bluebook/console_settings.bluebook +199 -114
  346. data/lib/hecks/framework/bluebook/framework.hecksagon +7 -0
  347. data/lib/hecks/framework/bluebook/governance.bluebook +36 -14
  348. data/lib/hecks/framework/bluebook/identity.bluebook +1 -1
  349. data/lib/hecks/framework/bluebook/privacy.bluebook +123 -19
  350. data/lib/hecks/framework/bluebook/privacy.key_keeper.adapter +7 -0
  351. data/lib/hecks/framework/bluebook/privacy.ports.hecksagon +19 -0
  352. data/lib/hecks/framework/compliance.oidc.json +6 -36
  353. data/lib/hecks/framework/console_settings.oidc.json +39 -24
  354. data/lib/hecks/framework/privacy.oidc.json +25 -0
  355. data/lib/hecks/framework.rb +24 -8
  356. data/lib/hecks/framework_bluebooks.rb +156 -0
  357. data/lib/hecks/freezer.rb +7 -1
  358. data/lib/hecks/fuzzing/combination_miner.rb +9 -6
  359. data/lib/hecks/fuzzing/concurrent_dispatch/world_copy.rb +3 -1
  360. data/lib/hecks/fuzzing/concurrent_dispatch.rb +2 -2
  361. data/lib/hecks/fuzzing/domain_generator.rb +8 -3
  362. data/lib/hecks/fuzzing/era_boundary.rb +1 -1
  363. data/lib/hecks/fuzzing/failure_triage.rb +13 -6
  364. data/lib/hecks/fuzzing/form_census/{chapter_forms.rb → bluebook_forms.rb} +12 -12
  365. data/lib/hecks/fuzzing/form_census.rb +14 -12
  366. data/lib/hecks/fuzzing/generated_domain_check.rb +2 -1
  367. data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +5 -5
  368. data/lib/hecks/fuzzing/isolated_boot/scratch_schema.rb +19 -9
  369. data/lib/hecks/fuzzing/isolated_boot/worlds.rb +13 -8
  370. data/lib/hecks/fuzzing/isolated_boot.rb +4 -5
  371. data/lib/hecks/fuzzing/mutation/checks.rb +2 -1
  372. data/lib/hecks/fuzzing/mutation/finders.rb +25 -8
  373. data/lib/hecks/fuzzing/mutation/observation.rb +3 -1
  374. data/lib/hecks/fuzzing/mutation/source_map.rb +3 -1
  375. data/lib/hecks/fuzzing/nondeterministic.rb +10 -4
  376. data/lib/hecks/fuzzing/outside_world.rb +1 -1
  377. data/lib/hecks/fuzzing/projection_agreement/binding.rb +63 -0
  378. data/lib/hecks/fuzzing/projection_agreement/comparison.rb +104 -0
  379. data/lib/hecks/fuzzing/projection_agreement.rb +68 -0
  380. data/lib/hecks/fuzzing/properties/aggregation_recompute.rb +1 -1
  381. data/lib/hecks/fuzzing/properties/bulk_parity.rb +118 -0
  382. data/lib/hecks/fuzzing/properties/catalog.rb +7 -0
  383. data/lib/hecks/fuzzing/properties/cursor_walks.rb +56 -0
  384. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +39 -1
  385. data/lib/hecks/fuzzing/properties/group_by_recompute.rb +6 -2
  386. data/lib/hecks/fuzzing/properties/grouped_reduction_recompute.rb +88 -0
  387. data/lib/hecks/fuzzing/properties/guards.rb +4 -1
  388. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +12 -2
  389. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +2 -1
  390. data/lib/hecks/fuzzing/properties/mutation_recompute.rb +3 -2
  391. data/lib/hecks/fuzzing/properties/piece_invariants.rb +3 -2
  392. data/lib/hecks/fuzzing/properties/query_rows.rb +5 -3
  393. data/lib/hecks/fuzzing/properties/querying.rb +6 -3
  394. data/lib/hecks/fuzzing/properties/read_model_names.rb +8 -2
  395. data/lib/hecks/fuzzing/properties/read_models.rb +2 -1
  396. data/lib/hecks/fuzzing/properties/refusals.rb +35 -0
  397. data/lib/hecks/fuzzing/properties/role_checks.rb +3 -2
  398. data/lib/hecks/fuzzing/properties/set_transform_parity.rb +73 -0
  399. data/lib/hecks/fuzzing/properties/tenant_scope.rb +3 -2
  400. data/lib/hecks/fuzzing/properties.rb +6 -0
  401. data/lib/hecks/fuzzing/qa_settings.rb +4 -4
  402. data/lib/hecks/fuzzing/replay/fan_out.rb +4 -3
  403. data/lib/hecks/fuzzing/replay/filters.rb +2 -2
  404. data/lib/hecks/fuzzing/replay/guard_check.rb +2 -2
  405. data/lib/hecks/fuzzing/replay/mutation_trace.rb +23 -10
  406. data/lib/hecks/fuzzing/replay/observation.rb +11 -7
  407. data/lib/hecks/fuzzing/replay/read_only_steps.rb +40 -3
  408. data/lib/hecks/fuzzing/replay/refusal_trace.rb +44 -0
  409. data/lib/hecks/fuzzing/replay/role_check.rb +2 -2
  410. data/lib/hecks/fuzzing/replay/session.rb +38 -18
  411. data/lib/hecks/fuzzing/replay/validation_reports.rb +61 -0
  412. data/lib/hecks/fuzzing/replay.rb +2 -2
  413. data/lib/hecks/fuzzing/rust_gap_manifest.rb +3 -3
  414. data/lib/hecks/fuzzing/self_consistency/saga_redelivery.rb +18 -8
  415. data/lib/hecks/fuzzing/self_consistency/sagas.rb +2 -2
  416. data/lib/hecks/fuzzing/self_consistency/value_objects.rb +9 -2
  417. data/lib/hecks/fuzzing/self_consistency.rb +4 -8
  418. data/lib/hecks/fuzzing/sequence_generator/adversary/argument_mutations.rb +15 -5
  419. data/lib/hecks/fuzzing/sequence_generator/adversary/caller_draw.rb +14 -10
  420. data/lib/hecks/fuzzing/sequence_generator/adversary/precedence_mutations.rb +1 -1
  421. data/lib/hecks/fuzzing/sequence_generator/argument_drawing.rb +2 -1
  422. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +21 -13
  423. data/lib/hecks/fuzzing/sequence_generator/picker.rb +1 -1
  424. data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +3 -3
  425. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +2 -2
  426. data/lib/hecks/fuzzing/sequence_generator.rb +1 -2
  427. data/lib/hecks/fuzzing/shrinker.rb +4 -1
  428. data/lib/hecks/fuzzing/value_generator.rb +14 -8
  429. data/lib/hecks/fuzzing.rb +1 -0
  430. data/lib/hecks/grammar/dialects.rb +56 -0
  431. data/lib/hecks/grammar/evolve/arguments.rb +1 -1
  432. data/lib/hecks/grammar/evolve/keywords.rb +1 -1
  433. data/lib/hecks/grammar/evolve/seeds.rb +34 -8
  434. data/lib/hecks/grammar/expression.bluebook +3 -0
  435. data/lib/hecks/grammar/expression_operators.json +1071 -1
  436. data/lib/hecks/grammar/operators.rb +45 -22
  437. data/lib/hecks/grammar/translation.bluebook +2 -0
  438. data/lib/hecks/grammar/translation_ledger.rb +45 -0
  439. data/lib/hecks/grammar/translation_rules.json +646 -0
  440. data/lib/hecks/grammar.rb +27 -23
  441. data/lib/hecks/hecks/adapters/claude_agents.adapter +7 -0
  442. data/lib/hecks/hecks/adapters/claude_agents.rb +119 -0
  443. data/lib/hecks/hecks/adapters/claude_transcript.rb +71 -0
  444. data/lib/hecks/hecks/adapters/codebase/cache_clearing.rb +32 -0
  445. data/lib/hecks/hecks/adapters/codebase/cargo_tests.rb +50 -0
  446. data/lib/hecks/hecks/adapters/codebase/composing.rb +3 -2
  447. data/lib/hecks/hecks/adapters/codebase/conformance.rb +17 -1
  448. data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +1 -1
  449. data/lib/hecks/hecks/adapters/codebase/declarations.rb +144 -0
  450. data/lib/hecks/hecks/adapters/codebase/inspection.rb +5 -4
  451. data/lib/hecks/hecks/adapters/codebase/language.rb +1 -0
  452. data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +7 -1
  453. data/lib/hecks/hecks/adapters/codebase/previewing.rb +62 -0
  454. data/lib/hecks/hecks/adapters/codebase/promotion/gate.rb +1 -1
  455. data/lib/hecks/hecks/adapters/codebase/reading.rb +94 -0
  456. data/lib/hecks/hecks/adapters/codebase/regeneration.rb +6 -2
  457. data/lib/hecks/hecks/adapters/codebase/release_facts.rb +1 -1
  458. data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +5 -2
  459. data/lib/hecks/hecks/adapters/codebase/search.rb +91 -0
  460. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +37 -2
  461. data/lib/hecks/hecks/adapters/codebase/static_directory.rb +59 -0
  462. data/lib/hecks/hecks/adapters/codebase/style.rb +2 -2
  463. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +30 -11
  464. data/lib/hecks/hecks/adapters/codebase/test_suite.rb +41 -3
  465. data/lib/hecks/hecks/adapters/console_capture.rb +27 -0
  466. data/lib/hecks/hecks/adapters/deploy_plans.rb +12 -3
  467. data/lib/hecks/hecks/adapters/deploy_toolchain/answers.rb +14 -5
  468. data/lib/hecks/hecks/adapters/deploy_toolchain/scripts.rb +6 -3
  469. data/lib/hecks/hecks/adapters/deploy_toolchain.rb +3 -3
  470. data/lib/hecks/hecks/adapters/desktop_alert/alert.rb +50 -0
  471. data/lib/hecks/hecks/adapters/desktop_alert.adapter +7 -0
  472. data/lib/hecks/hecks/adapters/desktop_alert.rb +99 -0
  473. data/lib/hecks/hecks/adapters/finding_github.rb +4 -1
  474. data/lib/hecks/hecks/adapters/first_admin.rb +16 -9
  475. data/lib/hecks/hecks/adapters/git.rb +5 -5
  476. data/lib/hecks/hecks/adapters/git_checkout.adapter +7 -0
  477. data/lib/hecks/hecks/adapters/git_checkout.rb +99 -0
  478. data/lib/hecks/hecks/adapters/git_landing/merger.rb +85 -0
  479. data/lib/hecks/hecks/adapters/git_landing.adapter +7 -0
  480. data/lib/hecks/hecks/adapters/git_landing.rb +103 -0
  481. data/lib/hecks/hecks/adapters/git_launcher.adapter +7 -0
  482. data/lib/hecks/hecks/adapters/git_launcher.rb +82 -0
  483. data/lib/hecks/hecks/adapters/git_refs.rb +8 -4
  484. data/lib/hecks/hecks/adapters/git_train/bench.rb +76 -0
  485. data/lib/hecks/hecks/adapters/git_train/carriage.rb +116 -0
  486. data/lib/hecks/hecks/adapters/git_train/local_branch.rb +69 -0
  487. data/lib/hecks/hecks/adapters/git_train/reading.rb +26 -0
  488. data/lib/hecks/hecks/adapters/git_train/survey.rb +60 -0
  489. data/lib/hecks/hecks/adapters/git_train.adapter +7 -0
  490. data/lib/hecks/hecks/adapters/git_train.rb +88 -0
  491. data/lib/hecks/hecks/adapters/git_worktrees.rb +81 -0
  492. data/lib/hecks/hecks/adapters/host_http.rb +5 -4
  493. data/lib/hecks/hecks/adapters/in_process_access.rb +3 -2
  494. data/lib/hecks/hecks/adapters/in_process_boot.rb +62 -35
  495. data/lib/hecks/hecks/adapters/in_process_operations.rb +30 -4
  496. data/lib/hecks/hecks/adapters/journal_store/changes.rb +7 -7
  497. data/lib/hecks/hecks/adapters/journal_store/compaction.rb +14 -7
  498. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +9 -7
  499. data/lib/hecks/hecks/adapters/journal_store/examination.rb +3 -3
  500. data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +17 -5
  501. data/lib/hecks/hecks/adapters/journal_store/readings/attestation.rb +3 -3
  502. data/lib/hecks/hecks/adapters/journal_store/readings/scaffolding.rb +7 -4
  503. data/lib/hecks/hecks/adapters/journal_store/readings.rb +2 -2
  504. data/lib/hecks/hecks/adapters/journal_store.rb +2 -2
  505. data/lib/hecks/hecks/adapters/ledger/chain.rb +63 -0
  506. data/lib/hecks/hecks/adapters/ledger/journal.rb +105 -0
  507. data/lib/hecks/hecks/adapters/ledger.adapter +7 -0
  508. data/lib/hecks/hecks/adapters/ledger.rb +89 -0
  509. data/lib/hecks/hecks/adapters/local_files.rb +15 -1
  510. data/lib/hecks/hecks/adapters/pg_admin.rb +7 -1
  511. data/lib/hecks/hecks/adapters/rails_app_files.rb +64 -0
  512. data/lib/hecks/hecks/adapters/rehearsal/audit_report.rb +4 -1
  513. data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +9 -9
  514. data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +2 -2
  515. data/lib/hecks/hecks/adapters/rehearsal/postgres_census.rb +4 -4
  516. data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +3 -3
  517. data/lib/hecks/hecks/adapters/rehearsal/postgres_store.rb +4 -1
  518. data/lib/hecks/hecks/adapters/rehearsal/rust_audit.rb +1 -1
  519. data/lib/hecks/hecks/adapters/rehearsal/subject.rb +34 -5
  520. data/lib/hecks/hecks/adapters/rust_toolchain.rb +5 -3
  521. data/lib/hecks/hecks/adapters/settings_reading.adapter +7 -0
  522. data/lib/hecks/hecks/adapters/settings_reading.rb +142 -0
  523. data/lib/hecks/hecks/adapters/shell.rb +3 -0
  524. data/lib/hecks/hecks/adapters/site_toolchain.rb +8 -8
  525. data/lib/hecks/hecks/adapters/world_clearing.rb +2 -1
  526. data/lib/hecks/hecks/agents.bluebook +246 -0
  527. data/lib/hecks/hecks/codebase.behaviors +13 -1
  528. data/lib/hecks/hecks/codebase.bluebook +554 -586
  529. data/lib/hecks/hecks/composer.behaviors +10 -10
  530. data/lib/hecks/hecks/context_map.hecksagon +7 -6
  531. data/lib/hecks/hecks/custodian.behaviors +96 -1
  532. data/lib/hecks/hecks/custodian.bluebook +553 -157
  533. data/lib/hecks/hecks/deploy.behaviors +1 -1
  534. data/lib/hecks/hecks/deploy.world +3 -4
  535. data/lib/hecks/hecks/hecks.behaviors +2 -2
  536. data/lib/hecks/hecks/hecks.bluebook +9 -14
  537. data/lib/hecks/hecks/hecks.contextmap +25 -0
  538. data/lib/hecks/hecks/hecks.hecksagon +139 -6
  539. data/lib/hecks/hecks/hecks.world +22 -21
  540. data/lib/hecks/hecks/ledger.bluebook +190 -0
  541. data/lib/hecks/hecks/rehearsal.bluebook +43 -77
  542. data/lib/hecks/hecks/shapes.json +17 -0
  543. data/lib/hecks/hecks/site.behaviors +1 -1
  544. data/lib/hecks/hecks/site.world +3 -3
  545. data/lib/hecks/hecks/tooling.bluebook +170 -174
  546. data/lib/hecks/hecks/translations/2-148748.bluebook +2 -0
  547. data/lib/hecks/hecks/translations/2-15a2e4.bluebook +2 -0
  548. data/lib/hecks/hecks/translations/2-1b447c.bluebook +5 -0
  549. data/lib/hecks/hecks/translations/2-240474.bluebook +2 -0
  550. data/lib/hecks/hecks/translations/2-44446d.bluebook +2 -0
  551. data/lib/hecks/hecks/translations/2-46ca26.bluebook +2 -0
  552. data/lib/hecks/hecks/translations/2-473eab.bluebook +2 -0
  553. data/lib/hecks/hecks/translations/2-75cc28.bluebook +2 -0
  554. data/lib/hecks/hecks/translations/2-781c07.bluebook +2 -0
  555. data/lib/hecks/hecks/translations/2-84c18b.bluebook +2 -0
  556. data/lib/hecks/hecks/translations/2-aa5fff.bluebook +2 -0
  557. data/lib/hecks/hecks/translations/2-bfdb48.bluebook +2 -0
  558. data/lib/hecks/hecks/translations/2-cd96d8.bluebook +10 -0
  559. data/lib/hecks/hecks/translations/2-d43f71.bluebook +2 -0
  560. data/lib/hecks/hecks/translations/2-eea577.bluebook +2 -0
  561. data/lib/hecks/hecks/translations/2-f53248.bluebook +2 -0
  562. data/lib/hecks/hecks/translations/2-fbb677.bluebook +2 -0
  563. data/lib/hecks/hecks/translations/2-ffdf12.bluebook +6 -0
  564. data/lib/hecks/ir.rb +8 -1
  565. data/lib/hecks/kernel_capabilities/templates.rb +4 -3
  566. data/lib/hecks/kernel_capabilities.rb +6 -6
  567. data/lib/hecks/language/adapter.bluebook +61 -0
  568. data/lib/hecks/language/bluebook/aggregate.bluebook +36 -6
  569. data/lib/hecks/language/bluebook/attaches/paging.bluebook +1 -1
  570. data/lib/hecks/language/bluebook/bluebook.behaviors +6 -6
  571. data/lib/hecks/language/bluebook/bluebook.bluebook +28 -51
  572. data/lib/hecks/language/bluebook/bluebook.hecksagon +1 -1
  573. data/lib/hecks/language/bluebook/command.bluebook +34 -2
  574. data/lib/hecks/language/bluebook/entity.bluebook +2 -2
  575. data/lib/hecks/language/bluebook/policy.behaviors +2 -2
  576. data/lib/hecks/language/bluebook/policy.bluebook +3 -3
  577. data/lib/hecks/language/bluebook/process_manager.bluebook +3 -3
  578. data/lib/hecks/language/bluebook/projection.bluebook +11 -10
  579. data/lib/hecks/language/bluebook/query.bluebook +1 -0
  580. data/lib/hecks/language/bluebook/shape.bluebook +1 -1
  581. data/lib/hecks/language/bluebook/syntax.bluebook +3 -1
  582. data/lib/hecks/language/bluebook/vocabulary.bluebook +287 -6
  583. data/lib/hecks/language/context_map/context_map.bluebook +90 -0
  584. data/lib/hecks/language/hecksagon/domain_port.bluebook +2 -2
  585. data/lib/hecks/language/hecksagon/hecksagon.bluebook +8 -8
  586. data/lib/hecks/language/oidc.json +10 -0
  587. data/lib/hecks/language/port.bluebook +1 -1
  588. data/lib/hecks/language/sentence/sentence.bluebook +210 -0
  589. data/lib/hecks/language/world/world.bluebook +6 -6
  590. data/lib/hecks/literal.rb +8 -2
  591. data/lib/hecks/naming.rb +44 -14
  592. data/lib/hecks/persistence_legacy_fixture/postgres_stores.rb +7 -6
  593. data/lib/hecks/persistence_legacy_fixture/regenerate.rb +6 -2
  594. data/lib/hecks/ports/access_control.rb +2 -2
  595. data/lib/hecks/ports/agent/answers.rb +2 -2
  596. data/lib/hecks/ports/agent.rb +2 -2
  597. data/lib/hecks/ports/authentication.port +6 -0
  598. data/lib/hecks/ports/authentication.rb +67 -0
  599. data/lib/hecks/ports/authorization.rb +3 -3
  600. data/lib/hecks/ports/dispatch.port +5 -0
  601. data/lib/hecks/ports/dispatch.rb +28 -0
  602. data/lib/hecks/ports/key_vault.rb +9 -6
  603. data/lib/hecks/ports/loading.rb +23 -7
  604. data/lib/hecks/ports/persistence/append_only.rb +18 -1
  605. data/lib/hecks/ports/persistence/binding_policy.rb +70 -11
  606. data/lib/hecks/ports/persistence/codec_boundary.rb +3 -2
  607. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +10 -10
  608. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +4 -5
  609. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +11 -11
  610. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +1 -1
  611. data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +6 -6
  612. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -3
  613. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +1 -1
  614. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +32 -19
  615. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +2 -2
  616. data/lib/hecks/ports/persistence/plugins/era.rb +0 -1
  617. data/lib/hecks/ports/persistence/remote_runtime.rb +3 -2
  618. data/lib/hecks/ports/persistence/set_statement.rb +29 -0
  619. data/lib/hecks/ports/persistence/set_transforming.rb +30 -0
  620. data/lib/hecks/ports/persistence/state_codec.rb +3 -3
  621. data/lib/hecks/ports/persistence.rb +0 -4
  622. data/lib/hecks/ports/projection.rb +4 -1
  623. data/lib/hecks/ports/query/cursor.rb +131 -0
  624. data/lib/hecks/ports/query/in_memory.rb +17 -10
  625. data/lib/hecks/ports/query.rb +4 -2
  626. data/lib/hecks/ports.rb +1 -0
  627. data/lib/hecks/projection_files/expression_tables.rb +3 -3
  628. data/lib/hecks/projection_files/sentence_table.rb +17 -0
  629. data/lib/hecks/projection_files.rb +16 -13
  630. data/lib/hecks/projections/bootstrap_table.rb +3 -3
  631. data/lib/hecks/projections/command_schema/shape.rb +95 -0
  632. data/lib/hecks/projections/command_schema.rb +74 -0
  633. data/lib/hecks/projections/context_map_diagram.rb +135 -0
  634. data/lib/hecks/projections/context_relationships.rb +125 -0
  635. data/lib/hecks/projections/deploy/box/access.rb +7 -4
  636. data/lib/hecks/projections/deploy/box/caddy.rb +2 -1
  637. data/lib/hecks/projections/deploy/box/compose.rb +4 -8
  638. data/lib/hecks/projections/deploy/box/edge.rb +2 -1
  639. data/lib/hecks/projections/deploy/box/hosting.rb +4 -2
  640. data/lib/hecks/projections/deploy/box/hosting_parts.rb +27 -12
  641. data/lib/hecks/projections/deploy/box/logging.rb +2 -3
  642. data/lib/hecks/projections/deploy/box/roll_recipe.rb +1 -3
  643. data/lib/hecks/projections/deploy/box/roll_scripts.rb +1 -16
  644. data/lib/hecks/projections/deploy/box/settings/containers.rb +29 -15
  645. data/lib/hecks/projections/deploy/box/settings/patterns.rb +5 -6
  646. data/lib/hecks/projections/deploy/box/settings/types.rb +5 -10
  647. data/lib/hecks/projections/deploy/box/settings.rb +9 -8
  648. data/lib/hecks/projections/deploy/box/stack_yaml.rb +10 -14
  649. data/lib/hecks/projections/deploy/box/templates/box.yaml.tmpl +0 -1
  650. data/lib/hecks/projections/deploy/box/templates/deploy-service.sh.tmpl +16 -3
  651. data/lib/hecks/projections/deploy/box/templates/hosting.mk.tmpl +7 -6
  652. data/lib/hecks/projections/deploy/box/templates/render-compose-taskdef.sh.tmpl +2 -6
  653. data/lib/hecks/projections/deploy/box/templates/render-compose.sh.tmpl +2 -6
  654. data/lib/hecks/projections/deploy/box.rb +16 -9
  655. data/lib/hecks/projections/deploy/fargate/assembly.rb +7 -2
  656. data/lib/hecks/projections/deploy/fargate/cdn/options.rb +4 -1
  657. data/lib/hecks/projections/deploy/fargate/check.rb +3 -1
  658. data/lib/hecks/projections/deploy/fargate/containers/rendering.rb +8 -5
  659. data/lib/hecks/projections/deploy/fargate/containers/routing.rb +2 -1
  660. data/lib/hecks/projections/deploy/fargate/monitoring/reading.rb +4 -1
  661. data/lib/hecks/projections/deploy/fargate/sections.rb +7 -4
  662. data/lib/hecks/projections/deploy/fargate/settings/ids.rb +4 -1
  663. data/lib/hecks/projections/deploy/fargate/settings/tuning.rb +13 -4
  664. data/lib/hecks/projections/deploy/fargate/stack/blocks.rb +6 -1
  665. data/lib/hecks/projections/deploy/fargate/stack/readers.rb +2 -1
  666. data/lib/hecks/projections/deploy/fargate/stack.rb +11 -6
  667. data/lib/hecks/projections/deploy/fargate/yaml.rb +10 -3
  668. data/lib/hecks/projections/deploy/fargate.rb +8 -3
  669. data/lib/hecks/projections/deploy/lambda/stack/blocks.rb +4 -2
  670. data/lib/hecks/projections/deploy/lambda/stack/deploy_chain.rb +2 -1
  671. data/lib/hecks/projections/deploy/lambda/stack/reading.rb +12 -9
  672. data/lib/hecks/projections/deploy/lambda/stack/reading_web.rb +7 -2
  673. data/lib/hecks/projections/deploy/lambda/stack/web.rb +2 -1
  674. data/lib/hecks/projections/deploy/lambda.rb +8 -3
  675. data/lib/hecks/projections/deploy/preview/containers.rb +14 -1
  676. data/lib/hecks/projections/deploy/preview/preview.sh.erb +2 -2
  677. data/lib/hecks/projections/deploy/preview/routing_yaml.rb +8 -6
  678. data/lib/hecks/projections/deploy/preview/settings.rb +23 -5
  679. data/lib/hecks/projections/deploy/preview/task_yaml.rb +1 -1
  680. data/lib/hecks/projections/deploy/preview/yaml_text.rb +2 -1
  681. data/lib/hecks/projections/deploy/scripts/settings.rb +5 -2
  682. data/lib/hecks/projections/deploy/shared.rb +12 -1
  683. data/lib/hecks/projections/deploy/shared_database_instance.rb +1 -1
  684. data/lib/hecks/projections/deploy/smoke.rb +3 -1
  685. data/lib/hecks/projections/deploy/template_diff/normalizer.rb +4 -1
  686. data/lib/hecks/projections/deploy/templates/lambda/mint_era_shared.tmpl +2 -2
  687. data/lib/hecks/projections/deploy/templates/lambda/nat_comment_oauth.tmpl +1 -1
  688. data/lib/hecks/projections/deploy/vercel.rb +1 -1
  689. data/lib/hecks/projections/diagrams/dispatch.rb +5 -3
  690. data/lib/hecks/projections/diagrams/statecharts.rb +8 -3
  691. data/lib/hecks/projections/diagrams/structure.rb +9 -6
  692. data/lib/hecks/projections/diagrams.rb +9 -7
  693. data/lib/hecks/projections/glossary/entries.rb +4 -4
  694. data/lib/hecks/projections/glossary/html/page.rb +4 -1
  695. data/lib/hecks/projections/glossary/html/parser.rb +13 -4
  696. data/lib/hecks/projections/glossary/html/sections.rb +4 -1
  697. data/lib/hecks/projections/glossary/html.rb +10 -3
  698. data/lib/hecks/projections/glossary/markdown.rb +4 -3
  699. data/lib/hecks/projections/glossary/mermaid.rb +8 -5
  700. data/lib/hecks/projections/glossary/sections.rb +1 -1
  701. data/lib/hecks/projections/glossary/sensitivity.rb +11 -4
  702. data/lib/hecks/projections/glossary/sentences/actions.rb +5 -2
  703. data/lib/hecks/projections/glossary/sentences/queries.rb +2 -1
  704. data/lib/hecks/projections/glossary/sentences/value_objects.rb +15 -6
  705. data/lib/hecks/projections/glossary/sentences.rb +6 -3
  706. data/lib/hecks/projections/glossary/slugs.rb +8 -1
  707. data/lib/hecks/projections/glossary.rb +3 -3
  708. data/lib/hecks/projections/model.rb +10 -6
  709. data/lib/hecks/projections/oidc.rb +19 -7
  710. data/lib/hecks/projections/parser_table.rb +10 -10
  711. data/lib/hecks/projections/phrase_table.rb +105 -0
  712. data/lib/hecks/projections/plain_english.rb +14 -4
  713. data/lib/hecks/projections/rails_app.rb +77 -0
  714. data/lib/hecks/projections/reference.rb +2 -2
  715. data/lib/hecks/projections/rust_vocabulary/arguments.rb +1 -1
  716. data/lib/hecks/projections/rust_vocabulary/tables.rb +20 -0
  717. data/lib/hecks/projections/rust_vocabulary.rb +14 -17
  718. data/lib/hecks/projections/site/admin.rb +7 -7
  719. data/lib/hecks/projections/site/admin_cms.rb +1 -1
  720. data/lib/hecks/projections/site/cms_editor/blocks.rb +5 -2
  721. data/lib/hecks/projections/site/cms_editor/checks.rb +9 -6
  722. data/lib/hecks/projections/site/cms_editor/color.rb +4 -1
  723. data/lib/hecks/projections/site/cms_editor/composition.rb +20 -18
  724. data/lib/hecks/projections/site/cms_editor/destructive.rb +4 -1
  725. data/lib/hecks/projections/site/cms_editor/drafts.rb +6 -2
  726. data/lib/hecks/projections/site/cms_editor/key_kinds.rb +4 -1
  727. data/lib/hecks/projections/site/cms_editor/limits.rb +1 -1
  728. data/lib/hecks/projections/site/cms_editor/media.rb +1 -1
  729. data/lib/hecks/projections/site/cms_editor/moment.rb +3 -1
  730. data/lib/hecks/projections/site/cms_editor/pickers.rb +1 -1
  731. data/lib/hecks/projections/site/cms_editor/preview.rb +10 -4
  732. data/lib/hecks/projections/site/cms_editor/relations.rb +3 -2
  733. data/lib/hecks/projections/site/cms_editor/scale_checks.rb +32 -25
  734. data/lib/hecks/projections/site/cms_editor/scheduling.rb +1 -1
  735. data/lib/hecks/projections/site/cms_editor/schema.rb +31 -29
  736. data/lib/hecks/projections/site/cms_editor/setting.rb +34 -27
  737. data/lib/hecks/projections/site/cms_editor/targets.rb +9 -6
  738. data/lib/hecks/projections/site/cms_editor/templates/src/app.ts.tmpl +3 -3
  739. data/lib/hecks/projections/site/cms_editor/templates/src/commands.ts.tmpl +2 -2
  740. data/lib/hecks/projections/site/cms_editor/templates/src/host.ts.tmpl +1 -1
  741. data/lib/hecks/projections/site/cms_editor/templates/src/media/handler.ts.tmpl +4 -4
  742. data/lib/hecks/projections/site/cms_editor/templates/src/names.ts.tmpl +14 -14
  743. data/lib/hecks/projections/site/cms_editor/templates/src/schema.ts.tmpl +12 -12
  744. data/lib/hecks/projections/site/cms_editor/templates/src/ui/pages.ts.tmpl +12 -12
  745. data/lib/hecks/projections/site/cms_editor/templates/src/ui/pickers.ts.tmpl +1 -1
  746. data/lib/hecks/projections/site/cms_editor/templates/src/ui/schedule.ts.tmpl +2 -2
  747. data/lib/hecks/projections/site/cms_editor/templates/src/ui/shell.ts.tmpl +11 -11
  748. data/lib/hecks/projections/site/cms_editor/templates/src/ui/world.ts.tmpl +3 -3
  749. data/lib/hecks/projections/site/cms_editor/theme_checks.rb +8 -2
  750. data/lib/hecks/projections/site/cms_editor.rb +19 -16
  751. data/lib/hecks/projections/site/edge/checks.rb +1 -1
  752. data/lib/hecks/projections/site/edge/function_checks.rb +1 -1
  753. data/lib/hecks/projections/site/edge/function_code.rb +4 -1
  754. data/lib/hecks/projections/site/edge/pattern.rb +4 -1
  755. data/lib/hecks/projections/site/edge/route_checks.rb +2 -2
  756. data/lib/hecks/projections/site/edge/rules.rb +1 -1
  757. data/lib/hecks/projections/site/edge.rb +14 -8
  758. data/lib/hecks/projections/site/live_edge.rb +2 -2
  759. data/lib/hecks/projections/site/payload/fields/definitions.rb +1 -1
  760. data/lib/hecks/projections/site/payload/lifecycle/text.rb +1 -1
  761. data/lib/hecks/projections/site/payload/model.rb +16 -12
  762. data/lib/hecks/projections/site/payload/specs.rb +4 -2
  763. data/lib/hecks/projections/site/payload_driver.rb +9 -8
  764. data/lib/hecks/projections/site/probe.rb +12 -3
  765. data/lib/hecks/projections/site/regions.rb +9 -1
  766. data/lib/hecks/projections/site/role_probe.rb +7 -7
  767. data/lib/hecks/projections/site/root_rows.rb +4 -4
  768. data/lib/hecks/projections/site/routes_ts/listings.rb +13 -6
  769. data/lib/hecks/projections/site/routes_ts.rb +6 -3
  770. data/lib/hecks/projections/site/site_admin.rb +1 -1
  771. data/lib/hecks/projections/site/site_cdn.rb +3 -2
  772. data/lib/hecks/projections/site/site_host.rb +1 -1
  773. data/lib/hecks/projections/site/site_root.rb +4 -4
  774. data/lib/hecks/projections/site/table/checks.rb +4 -1
  775. data/lib/hecks/projections/site/table/navigation_checks.rb +2 -2
  776. data/lib/hecks/projections/site/table/row_builder.rb +7 -7
  777. data/lib/hecks/projections/site/table/row_defaults.rb +1 -1
  778. data/lib/hecks/projections/site/table.rb +32 -26
  779. data/lib/hecks/projections/statements/actions.rb +4 -1
  780. data/lib/hecks/projections/statements/relationships.rb +15 -2
  781. data/lib/hecks/projections/statements.rb +2 -2
  782. data/lib/hecks/projections/vocabulary.rb +6 -6
  783. data/lib/hecks/projections/world_skeleton.rb +68 -0
  784. data/lib/hecks/projections.rb +5 -0
  785. data/lib/hecks/projector/cli_audience.rb +12 -9
  786. data/lib/hecks/projector/cli_projector/claims.rb +8 -8
  787. data/lib/hecks/projector/cli_projector/command_specs.rb +9 -5
  788. data/lib/hecks/projector/cli_projector/listing.rb +20 -8
  789. data/lib/hecks/projector/cli_projector/option_specs.rb +1 -1
  790. data/lib/hecks/projector/cli_projector/query_specs.rb +1 -1
  791. data/lib/hecks/projector/cli_projector/usage.rb +12 -8
  792. data/lib/hecks/projector/cli_projector.rb +2 -2
  793. data/lib/hecks/projector/docs_projector/behaviour.rb +5 -4
  794. data/lib/hecks/projector/docs_projector/closing.rb +3 -3
  795. data/lib/hecks/projector/docs_projector.rb +12 -7
  796. data/lib/hecks/projector/exporter/adapters.rb +15 -2
  797. data/lib/hecks/projector/exporter/bindings.rb +39 -134
  798. data/lib/hecks/projector/exporter/plugins.rb +55 -0
  799. data/lib/hecks/projector/exporter.rb +2 -0
  800. data/lib/hecks/projector/narrate_projector/commands.rb +4 -3
  801. data/lib/hecks/projector/narrate_projector/reactions.rb +2 -2
  802. data/lib/hecks/projector/narrate_projector.rb +9 -8
  803. data/lib/hecks/projector/target.rb +8 -8
  804. data/lib/hecks/projector.rb +9 -9
  805. data/lib/hecks/quality_control/adapters/agent.rb +2 -1
  806. data/lib/hecks/quality_control/adapters/github_checks.adapter +1 -1
  807. data/lib/hecks/quality_control/adapters/github_issues.adapter +1 -1
  808. data/lib/hecks/quality_control/adapters/github_issues.rb +6 -2
  809. data/lib/hecks/quality_control/adapters/target_tools.rb +9 -3
  810. data/lib/hecks/quality_control/cli/child.rb +1 -0
  811. data/lib/hecks/quality_control/cli/qa_domain_novelty/verdict.rb +1 -1
  812. data/lib/hecks/quality_control/cli/qa_generated_domains/evaluation.rb +12 -2
  813. data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +4 -1
  814. data/lib/hecks/quality_control/cli/qa_generated_domains.rb +4 -1
  815. data/lib/hecks/quality_control/cli/qa_log_bug/proof.rb +16 -3
  816. data/lib/hecks/quality_control/cli/qa_mine_combinations/booting.rb +4 -2
  817. data/lib/hecks/quality_control/cli/qa_mutate.rb +161 -0
  818. data/lib/hecks/quality_control/cli/qa_sweep/all_mode/report.rb +4 -1
  819. data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +2 -1
  820. data/lib/hecks/quality_control/cli/qa_sweep.rb +4 -1
  821. data/lib/hecks/quality_control/cli/qa_tick/output.rb +28 -26
  822. data/lib/hecks/quality_control/cli/qa_tick/preflight.rb +12 -3
  823. data/lib/hecks/quality_control/cli/qa_tick.rb +24 -8
  824. data/lib/hecks/quality_control/quality_control.bluebook +93 -92
  825. data/lib/hecks/quality_control/quality_control.hecksagon +3 -3
  826. data/lib/hecks/quality_control/quality_control.ports.hecksagon +3 -2
  827. data/lib/hecks/query_ir/rules.rb +9 -9
  828. data/lib/hecks/query_ir/touchpoints.rb +5 -2
  829. data/lib/hecks/query_ir.rb +3 -3
  830. data/lib/hecks/query_specification/common/comparison.rb +1 -1
  831. data/lib/hecks/query_specification/common/dsl.rb +3 -4
  832. data/lib/hecks/query_specification/hop_path.rb +7 -4
  833. data/lib/hecks/rails_app/bluebook/rails_app.bluebook +60 -0
  834. data/lib/hecks/rails_app/bluebook/rails_app.hecksagon +4 -0
  835. data/lib/hecks/refused.rb +104 -0
  836. data/lib/hecks/release/approval.rb +9 -2
  837. data/lib/hecks/release/gem_pin.rb +7 -3
  838. data/lib/hecks/release/lane.rb +1 -1
  839. data/lib/hecks/release/runner/clean_tree.rb +4 -1
  840. data/lib/hecks/release/runner/console.rb +2 -1
  841. data/lib/hecks/router/aggregate_reader.rb +3 -4
  842. data/lib/hecks/router/namespace_installer.rb +31 -17
  843. data/lib/hecks/router.rb +2 -10
  844. data/lib/hecks/runtime/adapter_lookup.rb +30 -7
  845. data/lib/hecks/runtime/adapter_namespace.rb +21 -0
  846. data/lib/hecks/runtime/asking.rb +30 -0
  847. data/lib/hecks/runtime/caller.rb +22 -0
  848. data/lib/hecks/runtime/capability_graph.rb +2 -1
  849. data/lib/hecks/runtime/collecting.rb +86 -0
  850. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +13 -8
  851. data/lib/hecks/runtime/command_interpreter/delegation.rb +46 -17
  852. data/lib/hecks/runtime/command_interpreter/hydration.rb +17 -21
  853. data/lib/hecks/runtime/command_interpreter/list_mutations.rb +2 -1
  854. data/lib/hecks/runtime/command_interpreter/persisting.rb +13 -12
  855. data/lib/hecks/runtime/command_interpreter.rb +17 -10
  856. data/lib/hecks/runtime/command_rules/admissibility.rb +17 -10
  857. data/lib/hecks/runtime/command_rules/authorization.rb +8 -6
  858. data/lib/hecks/runtime/command_rules/guard_state.rb +10 -10
  859. data/lib/hecks/runtime/command_rules/invariants.rb +3 -1
  860. data/lib/hecks/runtime/command_rules/missing_reference.rb +25 -0
  861. data/lib/hecks/runtime/command_rules/one_of_references.rb +44 -0
  862. data/lib/hecks/runtime/command_rules/references.rb +14 -14
  863. data/lib/hecks/runtime/command_rules.rb +2 -0
  864. data/lib/hecks/runtime/declarations.rb +66 -0
  865. data/lib/hecks/runtime/dependency_planning/analyzer.rb +2 -1
  866. data/lib/hecks/runtime/dependency_planning/expression_reads.rb +3 -2
  867. data/lib/hecks/runtime/dependency_planning/mutation_analysis.rb +2 -1
  868. data/lib/hecks/runtime/dispatch_claim.rb +72 -0
  869. data/lib/hecks/runtime/dispatch_context.rb +41 -0
  870. data/lib/hecks/runtime/dispatcher/queries.rb +17 -0
  871. data/lib/hecks/runtime/dispatcher/routing.rb +34 -12
  872. data/lib/hecks/runtime/dispatcher/validating.rb +73 -0
  873. data/lib/hecks/runtime/dispatcher.rb +39 -23
  874. data/lib/hecks/runtime/entity_element/location.rb +15 -7
  875. data/lib/hecks/runtime/entity_element/mutations.rb +4 -1
  876. data/lib/hecks/runtime/entity_interpreter/enforcement.rb +1 -1
  877. data/lib/hecks/runtime/entity_interpreter/locating.rb +1 -1
  878. data/lib/hecks/runtime/entity_interpreter/saving.rb +5 -5
  879. data/lib/hecks/runtime/entity_interpreter.rb +11 -4
  880. data/lib/hecks/runtime/errors.rb +30 -17
  881. data/lib/hecks/runtime/identity.rb +9 -0
  882. data/lib/hecks/runtime/instance.rb +3 -2
  883. data/lib/hecks/runtime/interpreting.rb +63 -6
  884. data/lib/hecks/runtime/invocation_builder.rb +7 -4
  885. data/lib/hecks/runtime/invocation_facts.rb +13 -8
  886. data/lib/hecks/runtime/loader/boot_steps.rb +3 -2
  887. data/lib/hecks/runtime/loader/described.rb +4 -0
  888. data/lib/hecks/runtime/loader.rb +52 -62
  889. data/lib/hecks/runtime/outbox/redrive.rb +105 -0
  890. data/lib/hecks/runtime/outbox/relay.rb +11 -39
  891. data/lib/hecks/runtime/outbox/runnable.rb +60 -0
  892. data/lib/hecks/runtime/outbox.rb +15 -1
  893. data/lib/hecks/runtime/policy_interpreter/arguments.rb +7 -1
  894. data/lib/hecks/runtime/policy_interpreter/fan_out.rb +8 -35
  895. data/lib/hecks/runtime/policy_interpreter.rb +8 -0
  896. data/lib/hecks/runtime/port_operation_interpreter.rb +27 -13
  897. data/lib/hecks/runtime/query_interpreter/outside_answer.rb +1 -1
  898. data/lib/hecks/runtime/query_interpreter/paging.rb +42 -0
  899. data/lib/hecks/runtime/query_interpreter/plugin_answer.rb +54 -0
  900. data/lib/hecks/runtime/query_interpreter/store_specification.rb +32 -0
  901. data/lib/hecks/runtime/query_interpreter.rb +16 -9
  902. data/lib/hecks/runtime/reaction_invocation/target_resolution.rb +10 -4
  903. data/lib/hecks/runtime/reaction_invocation.rb +5 -2
  904. data/lib/hecks/runtime/read_model_interpreter/head_ordering.rb +1 -1
  905. data/lib/hecks/runtime/read_model_interpreter/reductions.rb +23 -15
  906. data/lib/hecks/runtime/read_model_interpreter/shaping.rb +18 -7
  907. data/lib/hecks/runtime/read_model_interpreter.rb +5 -2
  908. data/lib/hecks/runtime/reference_hop.rb +3 -2
  909. data/lib/hecks/runtime/refusal_wording.rb +15 -6
  910. data/lib/hecks/runtime/registry/adapter_capabilities.rb +43 -0
  911. data/lib/hecks/runtime/registry/ask_verification.rb +15 -4
  912. data/lib/hecks/runtime/registry/{chapter_verification.rb → bluebook_verification.rb} +23 -23
  913. data/lib/hecks/runtime/registry/context_maps.rb +30 -0
  914. data/lib/hecks/runtime/registry/declarations.rb +8 -6
  915. data/lib/hecks/runtime/registry/durability_warnings.rb +18 -2
  916. data/lib/hecks/runtime/registry/hecksagon_rules.rb +27 -24
  917. data/lib/hecks/runtime/registry/plugin_query_verification.rb +45 -0
  918. data/lib/hecks/runtime/registry/providers.rb +34 -99
  919. data/lib/hecks/runtime/registry/query_verification.rb +30 -21
  920. data/lib/hecks/runtime/registry/runtime_state.rb +4 -3
  921. data/lib/hecks/runtime/registry/saga_persistence.rb +7 -16
  922. data/lib/hecks/runtime/registry/verification.rb +9 -5
  923. data/lib/hecks/runtime/registry/world_defaults.rb +8 -5
  924. data/lib/hecks/runtime/registry.rb +52 -27
  925. data/lib/hecks/runtime/row_sweep.rb +104 -0
  926. data/lib/hecks/runtime/saga_interpreter/compensation.rb +5 -4
  927. data/lib/hecks/runtime/saga_interpreter/delivery.rb +13 -10
  928. data/lib/hecks/runtime/saga_interpreter/redrive.rb +141 -0
  929. data/lib/hecks/runtime/saga_interpreter/transitions.rb +35 -6
  930. data/lib/hecks/runtime/saga_interpreter.rb +36 -4
  931. data/lib/hecks/runtime/saga_pending_dispatch.rb +4 -2
  932. data/lib/hecks/runtime/scalar_field.rb +73 -0
  933. data/lib/hecks/runtime/tenant_scope.rb +2 -1
  934. data/lib/hecks/runtime/validation.rb +24 -0
  935. data/lib/hecks/runtime/value/admission.rb +11 -11
  936. data/lib/hecks/runtime/value/coercion.rb +7 -7
  937. data/lib/hecks/runtime/value/field_checks.rb +13 -13
  938. data/lib/hecks/runtime/value/invariant_violation.rb +4 -1
  939. data/lib/hecks/runtime/value/references.rb +7 -4
  940. data/lib/hecks/runtime/value/validation.rb +7 -4
  941. data/lib/hecks/runtime/wasm_plugin.rb +98 -0
  942. data/lib/hecks/runtime.rb +14 -14
  943. data/lib/hecks/rust_build/command_schemas.rb +27 -0
  944. data/lib/hecks/rust_build/conformance/surface.rb +50 -7
  945. data/lib/hecks/rust_build/conformance.rb +25 -3
  946. data/lib/hecks/rust_build/conformance_fuzz.rb +2 -2
  947. data/lib/hecks/rust_build/domain_name.rb +4 -1
  948. data/lib/hecks/rust_build/host.rb +15 -9
  949. data/lib/hecks/rust_build/native_build.rb +2 -1
  950. data/lib/hecks/rust_build/prebuilt_binary.rb +25 -5
  951. data/lib/hecks/rust_build/project_rust/codegen_run.rb +11 -10
  952. data/lib/hecks/rust_build/project_rust/domain_loader.rb +15 -2
  953. data/lib/hecks/rust_build/project_rust/root_mod/notes.rb +1 -1
  954. data/lib/hecks/rust_build/project_rust/target_ir.rb +12 -3
  955. data/lib/hecks/rust_build/project_rust.rb +39 -19
  956. data/lib/hecks/rust_build/target_dir.rb +40 -0
  957. data/lib/hecks/rust_build/wasm.rb +46 -17
  958. data/lib/hecks/rust_build/wasm_browser.rb +8 -2
  959. data/lib/hecks/rust_build.rb +29 -2
  960. data/lib/hecks/sentence_form.rb +212 -0
  961. data/lib/hecks/served_options.rb +2 -1
  962. data/lib/hecks/shape_ledger.rb +149 -0
  963. data/lib/hecks/site/bluebook/site.bluebook +39 -62
  964. data/lib/hecks/site/bluebook/site.ports.hecksagon +1 -1
  965. data/lib/hecks/sme/bluebook/sme.bluebook +7 -1
  966. data/lib/hecks/storehouse/audit.rb +4 -1
  967. data/lib/hecks/storehouse/bluebook_words.rb +35 -0
  968. data/lib/hecks/storehouse/dispatching.rb +6 -3
  969. data/lib/hecks/storehouse/introspection.rb +4 -4
  970. data/lib/hecks/storehouse/querying.rb +2 -2
  971. data/lib/hecks/storehouse.rb +14 -4
  972. data/lib/hecks/switches.rb +21 -0
  973. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +5 -9
  974. data/lib/hecks/text.rb +57 -0
  975. data/lib/hecks/tickets/bluebook/tickets.bluebook +30 -51
  976. data/lib/hecks/tickets/bluebook/tickets.hecksagon +1 -1
  977. data/lib/hecks/tickets/bluebook/tickets.ports.hecksagon +1 -1
  978. data/lib/hecks/tools/argument_gate_matrix/dispatching.rb +1 -1
  979. data/lib/hecks/tools/argument_gate_matrix/rows.rb +7 -7
  980. data/lib/hecks/tools/argument_gate_matrix/violations.rb +1 -1
  981. data/lib/hecks/tools/argument_gate_matrix.rb +3 -3
  982. data/lib/hecks/tools/ci_gate_decision.rb +5 -2
  983. data/lib/hecks/tools/ci_gates.rb +1 -1
  984. data/lib/hecks/tools/comment_style/caps_words.rb +11 -8
  985. data/lib/hecks/tools/comment_style/dictionary.rb +7 -2
  986. data/lib/hecks/tools/comment_style/fixing.rb +10 -5
  987. data/lib/hecks/tools/comment_style/long_blocks.rb +1 -1
  988. data/lib/hecks/tools/comment_style/masking.rb +5 -5
  989. data/lib/hecks/tools/comment_style/run.rb +4 -1
  990. data/lib/hecks/tools/comment_style/source_file.rb +10 -3
  991. data/lib/hecks/tools/comment_style/structure_checks.rb +13 -4
  992. data/lib/hecks/tools/comment_style/text_checks.rb +1 -1
  993. data/lib/hecks/tools/comment_style.rb +25 -2
  994. data/lib/hecks/tools/deploy_recipe/generation.rb +1 -1
  995. data/lib/hecks/tools/deploy_recipe/targets.rb +1 -1
  996. data/lib/hecks/tools/deploy_recipe/worlds.rb +15 -9
  997. data/lib/hecks/tools/deploy_recipe.rb +17 -10
  998. data/lib/hecks/tools/deploy_recipe_lint/fixtures.rb +1 -1
  999. data/lib/hecks/tools/deploy_recipe_lint/makefile.rb +7 -1
  1000. data/lib/hecks/tools/drop_implicit_append_fields.rb +4 -1
  1001. data/lib/hecks/tools/era_projection_backfill.rb +11 -6
  1002. data/lib/hecks/tools/era_reattest.rb +11 -6
  1003. data/lib/hecks/tools/fuzz_sweep/findings.rb +18 -2
  1004. data/lib/hecks/tools/fuzz_sweep/options.rb +5 -1
  1005. data/lib/hecks/tools/fuzz_sweep.rb +17 -5
  1006. data/lib/hecks/tools/gate.rb +27 -5
  1007. data/lib/hecks/tools/hoist_local_givens/rewriting.rb +3 -2
  1008. data/lib/hecks/tools/hoist_local_givens.rb +2 -4
  1009. data/lib/hecks/tools/lanes/prebuilt_workflow.rb +1 -1
  1010. data/lib/hecks/tools/lanes/rows.rb +9 -3
  1011. data/lib/hecks/tools/lanes/ruleset.rb +1 -1
  1012. data/lib/hecks/tools/lanes/watch_workflow.rb +1 -1
  1013. data/lib/hecks/tools/lanes/workflow.rb +1 -1
  1014. data/lib/hecks/tools/lanes.rb +1 -1
  1015. data/lib/hecks/tools/oidc_manifests.rb +16 -19
  1016. data/lib/hecks/tools/regeneration_run.rb +22 -17
  1017. data/lib/hecks/tools/release_only.rb +5 -2
  1018. data/lib/hecks/tools/rust_comment_style/caps_words.rb +5 -5
  1019. data/lib/hecks/tools/rust_comment_style/fixing.rb +1 -1
  1020. data/lib/hecks/tools/rust_comment_style/masking.rb +7 -4
  1021. data/lib/hecks/tools/rust_comment_style/source_file.rb +7 -2
  1022. data/lib/hecks/tools/rust_comment_style/text_checks.rb +1 -1
  1023. data/lib/hecks/tools/rust_comment_style/tokenizer.rb +4 -1
  1024. data/lib/hecks/tools/site_routes/editor_files.rb +16 -13
  1025. data/lib/hecks/tools/site_routes/root_files.rb +14 -13
  1026. data/lib/hecks/tools/site_routes/templates.rb +5 -4
  1027. data/lib/hecks/tools/site_routes.rb +18 -15
  1028. data/lib/hecks/tools/tail_merge.rb +3 -3
  1029. data/lib/hecks/tools/tenant_provisioning.rb +6 -6
  1030. data/lib/hecks/tools/tools_doc.rb +16 -16
  1031. data/lib/hecks/tools/translation_audit/domain_loading.rb +3 -3
  1032. data/lib/hecks/tools/translation_audit.rb +15 -4
  1033. data/lib/hecks/tools/translation_scaffold/reporting.rb +4 -1
  1034. data/lib/hecks/tools/translation_scaffold.rb +4 -14
  1035. data/lib/hecks/vendoring/git_source.rb +7 -4
  1036. data/lib/hecks/version.rb +1 -1
  1037. data/lib/hecks/vocabulary.rb +110 -3
  1038. data/lib/hecks.rb +37 -18
  1039. data/lib/rubocop/cop/hecks/inline_regexp.rb +29 -0
  1040. data/lib/rubocop/cop/hecks/no_transport_in_runtime.rb +78 -0
  1041. data/lib/rubocop/cop/hecks/rails_model_rules.rb +46 -0
  1042. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +1 -1
  1043. data/lib/rubocop/cop/hecks/train_wreck.rb +69 -0
  1044. data/lib/rubocop/cop/hecks/unnamed_pipeline.rb +51 -0
  1045. data/prebuilt/31cf81e12f16236ad26249be590cfea3799c9db67432e6a4ef54b801c355b6ae.marshal +0 -0
  1046. data/prebuilt/68ecb2bd3abb1a221007db4f2b0375834c13aaccac8f2b99778e8517f11aa113.marshal +0 -0
  1047. data/prebuilt/verdicts-0328c2403383837d780ad5ed81d1da351c56436b894cf9015b5d56b8f1f1bf10.json +1 -0
  1048. data/qa/settings.yml +9 -0
  1049. data/rust/Cargo.lock +8 -1
  1050. data/rust/Cargo.toml +6 -7
  1051. data/rust/build/src/binding_pass.rs +13 -17
  1052. data/rust/build/src/cargo_sync.rs +1 -1
  1053. data/rust/build/src/lineage_pass.rs +4 -71
  1054. data/rust/build/src/pipeline.rs +99 -70
  1055. data/rust/build/src/resolve.rs +85 -29
  1056. data/rust/build/src/seams_pass.rs +117 -99
  1057. data/rust/build/src/world_pass.rs +21 -12
  1058. data/rust/codegen/src/domain_generator.rs +24 -2
  1059. data/rust/codegen/src/expr_emitter.rs +6 -0
  1060. data/rust/codegen/src/json_codec.rs +48 -10
  1061. data/rust/codegen/src/main.rs +35 -34
  1062. data/rust/codegen/src/manifest.rs +1 -1
  1063. data/rust/codegen/src/naming.rs +5 -5
  1064. data/rust/codegen/src/one_of_references.rs +124 -0
  1065. data/rust/codegen/src/presenters.rs +3 -3
  1066. data/rust/codegen/src/queries.rs +56 -7
  1067. data/rust/codegen/src/reactions.rs +19 -14
  1068. data/rust/codegen/src/read_models.rs +19 -14
  1069. data/rust/codegen/src/registry.rs +89 -15
  1070. data/rust/codegen/src/sidecars.rs +1 -1
  1071. data/rust/expr/Cargo.lock +54 -0
  1072. data/rust/expr/Cargo.toml +52 -0
  1073. data/rust/{src/kernel → expr/src}/attribute_shapes/composite.rs +45 -14
  1074. data/rust/{src/kernel → expr/src}/attribute_shapes/list.rs +1 -1
  1075. data/rust/{src/kernel → expr/src}/attribute_shapes/mod.rs +2 -2
  1076. data/rust/{src/kernel → expr/src}/attribute_shapes/optional.rs +1 -1
  1077. data/rust/{src/kernel → expr/src}/attribute_shapes/scalar.rs +3 -3
  1078. data/rust/{src/kernel → expr/src}/expr.rs +30 -8
  1079. data/rust/{src/kernel → expr/src}/expression_operators/arithmetic.rs +41 -18
  1080. data/rust/{src/kernel → expr/src}/expression_operators/comparison.rs +54 -8
  1081. data/rust/{src/kernel → expr/src}/expression_operators/enumeration.rs +73 -6
  1082. data/rust/{src/kernel → expr/src}/expression_operators/logical.rs +2 -2
  1083. data/rust/expr/src/expression_operators/membership.rs +33 -0
  1084. data/rust/{src/kernel → expr/src}/expression_operators/mod.rs +2 -2
  1085. data/rust/expr/src/expression_operators/pattern_match.rs +179 -0
  1086. data/rust/{src/kernel → expr/src}/expression_operators/positional.rs +8 -6
  1087. data/rust/{src/kernel → expr/src}/expression_operators/presence.rs +7 -6
  1088. data/rust/{src/kernel → expr/src}/expression_operators/sign_test.rs +14 -4
  1089. data/rust/{src/kernel → expr/src}/expression_operators/sized.rs +16 -9
  1090. data/rust/{src/kernel → expr/src}/expression_operators/text.rs +30 -17
  1091. data/rust/{src/kernel → expr/src}/expression_operators/to_string.rs +8 -6
  1092. data/rust/expr/src/lib.rs +17 -0
  1093. data/rust/expr/src/refusal.rs +62 -0
  1094. data/rust/expr/src/rendering.rs +135 -0
  1095. data/rust/{src/kernel → expr/src}/ruby_float.rs +7 -6
  1096. data/rust/host/Cargo.lock +137 -123
  1097. data/rust/host/Cargo.toml +7 -3
  1098. data/rust/host/HECKS_RELEASE +1 -1
  1099. data/rust/host/core/Cargo.toml +64 -0
  1100. data/rust/host/core/clippy.toml +4 -0
  1101. data/rust/host/core/src/arg_limits.rs +48 -0
  1102. data/rust/host/core/src/clock.rs +146 -0
  1103. data/rust/host/core/src/dispatch.rs +920 -0
  1104. data/rust/host/core/src/expr_json.rs +1137 -0
  1105. data/rust/host/{src → core/src}/host.rs +13 -14
  1106. data/rust/host/{src → core/src}/ir.rs +227 -18
  1107. data/rust/host/core/src/journal.rs +126 -0
  1108. data/rust/host/{src → core/src}/lambda_client.rs +27 -96
  1109. data/rust/host/core/src/lib.rs +37 -0
  1110. data/rust/host/{src → core/src}/needs.rs +66 -20
  1111. data/rust/host/core/src/plugins.rs +269 -0
  1112. data/rust/host/core/src/presentation.rs +471 -0
  1113. data/rust/host/{src → core/src}/presentation_write.rs +75 -43
  1114. data/rust/host/{src → core/src}/query_step.rs +54 -16
  1115. data/rust/host/{src → core/src}/reference_validate.rs +6 -6
  1116. data/rust/host/{src → core/src}/storage_shape.rs +2 -2
  1117. data/rust/host/core/src/store/memory.rs +635 -0
  1118. data/rust/host/core/src/store.rs +418 -0
  1119. data/rust/host/{src → core/src}/ui_schema.rs +8 -8
  1120. data/rust/host/core/src/validation.rs +129 -0
  1121. data/rust/host/core/src/wasm_runner.rs +410 -0
  1122. data/rust/host/fuzz/.gitignore +4 -0
  1123. data/rust/host/fuzz/Cargo.lock +4479 -0
  1124. data/rust/host/fuzz/Cargo.toml +42 -0
  1125. data/rust/host/fuzz/README.md +55 -0
  1126. data/rust/host/fuzz/fuzz_targets/postgres_equivalence.rs +24 -0
  1127. data/rust/host/fuzz/src/backend.rs +273 -0
  1128. data/rust/host/fuzz/src/equivalence.rs +195 -0
  1129. data/rust/host/fuzz/src/footprint.rs +182 -0
  1130. data/rust/host/fuzz/src/lib.rs +17 -0
  1131. data/rust/host/fuzz/src/ops.rs +345 -0
  1132. data/rust/host/fuzz/tests/smoke.rs +50 -0
  1133. data/rust/host/src/api.rs +316 -105
  1134. data/rust/host/src/auth/google_signin.rs +183 -0
  1135. data/rust/host/src/auth.rs +527 -370
  1136. data/rust/host/src/aws_lambda_invoker.rs +61 -0
  1137. data/rust/host/src/bin/expr_harness.rs +9 -4
  1138. data/rust/host/src/bin/ledger.rs +84 -0
  1139. data/rust/host/src/bin/lineage_harness.rs +17 -21
  1140. data/rust/host/src/bin/mint_harness.rs +11 -36
  1141. data/rust/host/src/bin/validate_harness.rs +1 -6
  1142. data/rust/host/src/boot.rs +465 -174
  1143. data/rust/host/src/boundary_fuzz/ir.rs +10 -5
  1144. data/rust/host/src/boundary_fuzz/server.rs +6 -5
  1145. data/rust/host/src/checkout.rs +4 -1
  1146. data/rust/host/src/commerce_ir.rs +126 -105
  1147. data/rust/host/src/{dispatch.rs → dispatch_tests.rs} +367 -847
  1148. data/rust/host/src/extension.rs +3 -4
  1149. data/rust/host/src/hecksagon_boundary_tests.rs +149 -0
  1150. data/rust/host/src/ledger.rs +683 -0
  1151. data/rust/host/src/lib.rs +21 -28
  1152. data/rust/host/src/payments/tests.rs +136 -38
  1153. data/rust/host/src/payments.rs +36 -32
  1154. data/rust/host/src/platform_signin/extension.rs +1 -1
  1155. data/rust/host/src/platform_signin/mapping_tests.rs +12 -9
  1156. data/rust/host/src/platform_signin/session.rs +7 -14
  1157. data/rust/host/src/platform_signin/verify.rs +0 -2
  1158. data/rust/host/src/presentation_tests.rs +382 -0
  1159. data/rust/host/src/rate_limit.rs +18 -2
  1160. data/rust/host/src/server.rs +222 -43
  1161. data/rust/host/src/{journal.rs → store/journal_sql.rs} +21 -127
  1162. data/rust/host/src/{mint.rs → store/mint.rs} +12 -12
  1163. data/rust/host/src/store/postgres.rs +493 -0
  1164. data/rust/host/src/store.rs +97 -0
  1165. data/rust/host/src/store_conformance.rs +1265 -0
  1166. data/rust/host/src/web/commerce.rs +10 -18
  1167. data/rust/host/src/web/newsletter/cooldown.rs +107 -22
  1168. data/rust/host/src/web/newsletter/naming.rs +104 -0
  1169. data/rust/host/src/web/newsletter/tests.rs +53 -0
  1170. data/rust/host/src/web/newsletter.rs +73 -50
  1171. data/rust/host/src/web/newsletter_send.rs +12 -13
  1172. data/rust/host/src/web/registration_receipt.rs +2 -2
  1173. data/rust/host/src/web/registrations.rs +754 -375
  1174. data/rust/host/src/web/resend_webhook.rs +3 -3
  1175. data/rust/host/src/web/signin_tests.rs +131 -0
  1176. data/rust/host/src/web.rs +1479 -149
  1177. data/rust/lsp/README.md +27 -27
  1178. data/rust/lsp/src/diagnostics.rs +75 -15
  1179. data/rust/lsp/src/main.rs +101 -5
  1180. data/rust/parser/fuzz/Cargo.toml +2 -2
  1181. data/rust/parser/fuzz/README.md +3 -3
  1182. data/rust/parser/fuzz/fuzz_targets/{chapter.rs → bluebook.rs} +4 -4
  1183. data/rust/parser/fuzz/fuzz_targets/resolve.rs +2 -2
  1184. data/rust/parser/src/build/named_pattern.rs +22 -0
  1185. data/rust/parser/src/build/references.rs +52 -0
  1186. data/rust/parser/src/diag.rs +22 -1
  1187. data/rust/parser/src/emit.rs +68 -4
  1188. data/rust/parser/src/expr/ast_json.rs +10 -0
  1189. data/rust/parser/src/expr/resolver.rs +49 -9
  1190. data/rust/parser/src/ir.rs +34 -7
  1191. data/rust/parser/src/keywords.rs +454 -457
  1192. data/rust/parser/src/lex.rs +115 -87
  1193. data/rust/parser/src/main.rs +180 -32
  1194. data/rust/parser/src/parse/adapter.rs +28 -0
  1195. data/rust/parser/src/parse/aggregate.rs +55 -35
  1196. data/rust/parser/src/parse/command.rs +100 -15
  1197. data/rust/parser/src/parse/{chapter.rs → declaration.rs} +85 -54
  1198. data/rust/parser/src/parse/domain_port.rs +60 -9
  1199. data/rust/parser/src/parse/entity.rs +35 -32
  1200. data/rust/parser/src/parse/file.rs +1 -1
  1201. data/rust/parser/src/parse/hecksagon.rs +15 -5
  1202. data/rust/parser/src/parse/mod.rs +84 -2
  1203. data/rust/parser/src/parse/process_manager.rs +1 -1
  1204. data/rust/parser/src/parse/query.rs +13 -3
  1205. data/rust/parser/src/parse/read_model.rs +2 -1
  1206. data/rust/parser/src/phrases.rs +1258 -0
  1207. data/rust/parser/src/render_ruby.rs +540 -0
  1208. data/rust/parser/src/sentence/changes.rs +437 -0
  1209. data/rust/parser/src/sentence/command_step.rs +206 -0
  1210. data/rust/parser/src/sentence/complete.rs +276 -0
  1211. data/rust/parser/src/sentence/entity.rs +41 -0
  1212. data/rust/parser/src/sentence/examples.rs +1012 -0
  1213. data/rust/parser/src/sentence/format.rs +882 -0
  1214. data/rust/parser/src/sentence/lower.rs +1366 -0
  1215. data/rust/parser/src/sentence/mod.rs +444 -0
  1216. data/rust/parser/src/sentence/names.rs +69 -0
  1217. data/rust/parser/src/sentence/options.rs +154 -0
  1218. data/rust/parser/src/sentence/pattern.rs +433 -0
  1219. data/rust/parser/src/sentence/process.rs +196 -0
  1220. data/rust/parser/src/sentence/queries.rs +431 -0
  1221. data/rust/parser/src/sentence/report.rs +283 -0
  1222. data/rust/parser/src/sentence/token.rs +106 -0
  1223. data/rust/parser/src/sentence/values.rs +498 -0
  1224. data/rust/src/exemplar/queries.rs +1 -0
  1225. data/rust/src/exemplar/reactions.rs +1 -1
  1226. data/rust/src/exemplar/registry.rs +30 -0
  1227. data/rust/src/kernel/cli.rs +219 -19
  1228. data/rust/src/kernel/collecting.rs +174 -0
  1229. data/rust/src/kernel/dispatch.rs +55 -27
  1230. data/rust/src/kernel/mod.rs +7 -67
  1231. data/rust/src/kernel/named_query.rs +225 -11
  1232. data/rust/src/kernel/orchestrate.rs +213 -25
  1233. data/rust/src/kernel/orchestrate_guard_tests.rs +3 -0
  1234. data/rust/src/kernel/query_cursor.rs +251 -0
  1235. data/rust/src/kernel/query_ordering.rs +6 -6
  1236. data/rust/src/kernel/read_model.rs +162 -17
  1237. data/rust/src/kernel/repository.rs +107 -17
  1238. data/rust/src/kernel/vocab/mod.rs +4 -0
  1239. data/rust/src/kernel/vocab/reducer.rs +109 -0
  1240. data/rust/src/kernel/vocab/refusal_class.rs +124 -0
  1241. data/rust/src/kernel/vocab/refusal_template.rs +2 -2
  1242. data/rust/src/lib.rs +1 -1
  1243. data/rust/web/Cargo.lock +47 -0
  1244. metadata +328 -93
  1245. data/lib/hecks/chapters.rb +0 -147
  1246. data/lib/hecks/gate/stages.yml +0 -234
  1247. data/lib/hecks/hecks/governance.world +0 -7
  1248. data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +0 -137
  1249. data/lib/hecks/ports/persistence/postgres_dump/connection.rb +0 -59
  1250. data/lib/hecks/ports/persistence/postgres_dump.rb +0 -100
  1251. data/lib/hecks/projections/deploy/box/templates/tunnel-egress.yaml.tmpl +0 -11
  1252. data/lib/hecks/projector/exporter/capability_values.rb +0 -55
  1253. data/lib/hecks/runtime/remote_dispatcher.rb +0 -176
  1254. data/prebuilt/ad68f9e06c8068c2a4176b57abf3083d591d5d8980c2b3e897b97331f965b643.marshal +0 -0
  1255. data/prebuilt/ee22ec8642c4006717ba2b80f46e5efb81de459eef9dfec043e838c0ad4fd720.marshal +0 -0
  1256. data/prebuilt/verdicts-b69f5dcbba79c20daa0493476fa7c317004a30aa2bc3d3dc6a722ea70ae2b43b.json +0 -1
  1257. data/rust/host/src/clock.rs +0 -8
  1258. data/rust/host/src/expr_json.rs +0 -1983
  1259. data/rust/host/src/presentation.rs +0 -842
  1260. data/rust/host/src/wasm_runner.rs +0 -206
  1261. data/rust/src/kernel/expression_operators/membership.rs +0 -20
  1262. data/rust/src/kernel/expression_operators/pattern_match.rs +0 -108
  1263. /data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/events.rb +0 -0
  1264. /data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/head_writes.rb +0 -0
  1265. /data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/journal.rb +0 -0
  1266. /data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/base_sql.rb +0 -0
  1267. /data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/field_cache.rb +0 -0
  1268. /data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/head_compiler.rb +0 -0
  1269. /data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/merge_writes.rb +0 -0
  1270. /data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/provisioning.rb +0 -0
  1271. /data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/resumable_backfill.rb +0 -0
  1272. /data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/transform_installer.rb +0 -0
  1273. /data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/lineage/transform_sql.rb +0 -0
  1274. /data/lib/hecks/{ports/persistence/plugins/era → adapters/driven}/postgres_era/sagas.rb +0 -0
  1275. /data/rust/host/{src → core/src}/field_hints.rs +0 -0
  1276. /data/rust/host/{src → core/src}/log.rs +0 -0
  1277. /data/rust/host/{src → core/src}/reference_transform.rs +0 -0
@@ -8,26 +8,29 @@ module Hecks
8
8
  # `CliRunner`.
9
9
  module Answers
10
10
  # What a dispatch needs beyond the spec: the parsed arguments, whether `--wait` was given,
11
- # and the chapter and launcher setting the command belongs to.
12
- Invocation = Struct.new(:args, :wait, :bluebook, :launcher)
11
+ # and the bluebook and launcher setting the command belongs to.
12
+ Invocation = Struct.new(:args, :wait, :bluebook, :launcher, :text)
13
+
14
+ # The flag that asks for a command's recorded output as plain text and nothing else.
15
+ TEXT = "--text".freeze
13
16
 
14
17
  # Parses one resolved command's arguments, runs it as a query or command, and turns the
15
18
  # outcome, or the domain's refusal, into `[json_or_message, status]`. With `--wait`, a
16
19
  # question whose report names a gap (`LauncherOptions.gap_reported?`) answers status 1.
17
20
  #
18
- # @param bluebook [Bluebook::Chapter] the chapter the command belongs to
19
- # @param launcher [Hash, nil] the chapter's `launcher` world setting; nil when not opted
21
+ # @param bluebook [Bluebook::Declaration] the bluebook the command belongs to
22
+ # @param launcher [Hash, nil] the bluebook's `launcher` world setting; nil when not opted
20
23
  # in
21
24
  def dispatch(runtime, spec, name, rest, program, asking, bluebook: nil, launcher: nil) # rubocop:disable Metrics/ParameterLists -- the signature is what `call` passes
22
- args, wait = command_line(spec, rest, launcher)
25
+ args, wait, text = command_line(spec, rest, launcher)
23
26
  return answer_query(runtime, spec, args, wait, launcher) if spec[:kind] == :query
24
27
 
25
- run_command(runtime, spec, Invocation.new(args, wait, bluebook, launcher))
28
+ run_command(runtime, spec, Invocation.new(args, wait, bluebook, launcher, text))
26
29
  rescue Runtime::NotFound, Runtime::TypeMismatch => e
27
30
  # A bad argument and a missing record both need the same next step: read the help.
28
31
  ["#{e.message}\n\n #{program} #{"query " if asking}#{name} --help", 1]
29
32
  rescue *Runtime::DOMAIN_REFUSALS => e
30
- # The refusal is the chapter's own sentence, verbatim.
33
+ # The refusal is the bluebook's own sentence, verbatim.
31
34
  [e.message, 1]
32
35
  rescue StandardError => e
33
36
  # So is a wrapped tool's, when a question's adapter refuses to answer.
@@ -36,17 +39,20 @@ module Hecks
36
39
  [e.message, 1]
37
40
  end
38
41
 
39
- # The parsed arguments of a command line and whether to wait for the reactions.
42
+ # The parsed arguments of a command line, whether to wait for the reactions, and whether
43
+ # `--text` asked for the recorded output alone (which waits).
40
44
  def command_line(spec, rest, launcher)
41
- rest, wait = LauncherOptions.take_wait(spec, rest) if launcher
42
- [Cli.arguments(spec, rest), wait || LauncherOptions.settled?(launcher, spec)]
45
+ text = launcher ? rest.include?(TEXT) : false
46
+ rest, wait = LauncherOptions.take_wait(spec, rest - [TEXT]) if launcher
47
+ [Cli.arguments(spec, rest), text || wait || LauncherOptions.settled?(launcher, spec), text]
43
48
  end
44
49
 
45
50
  # Whether the error is a wrapped tool's refusal. Matched by name: the adapters belong to
46
51
  # the
47
- # Hecks chapter, which a client's runtime never loads.
52
+ # Hecks bluebook, which a client's runtime never loads.
48
53
  def tool_refusal?(error)
49
- error.class.ancestors.map(&:name).include?(CliRunner::TOOL_REFUSAL)
54
+ ancestor_names = error.class.ancestors.map(&:name)
55
+ ancestor_names.include?(CliRunner::TOOL_REFUSAL)
50
56
  end
51
57
 
52
58
  # Runs a command and answers its outcome, settled when `--wait` asks for it.
@@ -54,7 +60,9 @@ module Hecks
54
60
  args, minted = LauncherOptions.run_key(runtime, spec, invocation.args, invocation.launcher)
55
61
  handle = runtime.dispatch_flat(spec[:command], normalized_request(spec, args))
56
62
  extra = refusals_and_run(handle, minted)
57
- return settled(runtime, spec, handle, invocation.bluebook, invocation.launcher, extra) if invocation.wait
63
+ if invocation.wait
64
+ return settled(runtime, spec, handle, invocation.bluebook, invocation.launcher, extra, text: invocation.text)
65
+ end
58
66
 
59
67
  [JSON.pretty_generate(outcome(handle, extra)), 0]
60
68
  end
@@ -80,7 +88,7 @@ module Hecks
80
88
  # Runs a question and answers its rows, or its text when an adapter answered in text.
81
89
  #
82
90
  # @param wait [Boolean, nil] whether `--wait` was given: a report naming a gap then fails
83
- # @param launcher [Hash, nil] the chapter's `launcher` setting, which may name the
91
+ # @param launcher [Hash, nil] the bluebook's `launcher` setting, which may name the
84
92
  # questions that refuse a run they do not hold
85
93
  # @return [Array(String, Integer)] the answer and the status
86
94
  def answer_query(runtime, spec, args, wait, launcher = nil)
@@ -130,8 +138,7 @@ module Hecks
130
138
  # without this the answer would say nothing of it. A defect (a crash) is shown apart, as
131
139
  # `reaction_defects:`, and fails `--wait`.
132
140
  #
133
- # @param handle [Runtime::Dispatcher::Result, Runtime::RemoteDispatcher::Result] the
134
- # outcome
141
+ # @param handle [Runtime::Dispatcher::Result, Adapters::Lambda::RemoteDispatcher::Result]
135
142
  # @return [Hash] `refused_reactions:` each with the `policy`, its `trigger`, the `reason`;
136
143
  # empty when every reaction was delivered (or a remote host sent no per-step log), plus
137
144
  # `reaction_defects:` when one crashed
@@ -16,7 +16,7 @@ module Hecks
16
16
  refused = Admission.refusal(runtime.registry, "Cli")
17
17
  return { answer: [refused, 1] } if refused
18
18
 
19
- bluebook, argv, program = chapter_for(runtime, argv, program)
19
+ bluebook, argv, program = bluebook_for(runtime, argv, program)
20
20
  launcher = LauncherOptions.settings(runtime, bluebook.name)
21
21
  options = LauncherOptions.projection(launcher, program)
22
22
  cli = Projector.call(:cli, bluebook: bluebook, options: options.merge(audience(runtime, launcher)))
@@ -78,26 +78,27 @@ module Hecks
78
78
  end
79
79
 
80
80
  # What the help leaves out and points at for whoever typed the line: the maintainer's
81
- # aggregates only in a hecks checkout, and the chapters the chapter's launcher names, each
81
+ # aggregates only in a hecks checkout, and the bluebooks the bluebook's launcher names,
82
+ # each
82
83
  # with the first sentence of what it is for.
83
84
  #
84
- # @return [Hash{Symbol => Object}] `:hide` and `:chapters` (pairs of word and summary)
85
+ # @return [Hash{Symbol => Object}] `:hide` and `:bluebooks` (pairs of word and summary)
85
86
  def audience(runtime, launcher, maintainer: LauncherOptions.maintainer?,
86
87
  newcomer: !maintainer && Newcomer.applies?)
87
88
  shown = (newcomer && Newcomer.audience(launcher)) || LauncherOptions.audience(launcher, maintainer)
88
- return shown unless shown[:chapters]
89
+ return shown unless shown[:declarations]
89
90
 
90
- shown.merge(chapters: chapter_summaries(runtime, shown[:chapters]))
91
+ shown.merge(declarations: bluebook_summaries(runtime, shown[:declarations]))
91
92
  end
92
93
 
93
- # Each named chapter the domain attaches, as its word and the first sentence of its
94
+ # Each named bluebook the domain attaches, as its word and the first sentence of its
94
95
  # vision.
95
- def chapter_summaries(runtime, names)
96
- known = attached_chapters(runtime)
96
+ def bluebook_summaries(runtime, names)
97
+ known = attached_bluebooks(runtime)
97
98
  names.filter_map do |name|
98
99
  next unless known.include?(name)
99
100
 
100
- [Naming.snake(name), Projector::CliProjector.first_sentence(runtime.registry.bluebook(name).vision)]
101
+ [Naming.snake(name), Projector::CliProjector.first_sentence(runtime.bluebook(name).vision)]
101
102
  end
102
103
  end
103
104
 
@@ -111,11 +112,11 @@ module Hecks
111
112
  # Reads the entry words of a line: whether it asks a query, the bare name, and the words
112
113
  # from the name on.
113
114
  #
114
- # `query` gives queries their own namespace (`ask` is its older spelling); a chapter may
115
+ # `query` gives queries their own namespace (`ask` is its older spelling); a bluebook may
115
116
  # declare a command and a query of one name. A trailing `!` says the word is a command and
116
117
  # is not part of the name. A query answers to its bare name too; `query` is needed only
117
- # when
118
- # a command shares it.
118
+ # when a command shares it. The name may be written in the bluebook's verb form
119
+ # (`Hecks::PushTrain.board!`), which reaches the same command (see `VerbNames`).
119
120
  #
120
121
  # @return [Array(Boolean, String, Array<String>)] `asking`, `name` (nil when absent),
121
122
  # `argv`
@@ -126,7 +127,7 @@ module Hecks
126
127
  return [asking, nil, argv] if name.nil?
127
128
 
128
129
  bang = name.end_with?("!")
129
- name = name.chomp("!")
130
+ name = canonical_name(cli, name.chomp("!"))
130
131
  [asking || (!bang && query_only?(cli, name)), name, argv]
131
132
  end
132
133
 
@@ -135,21 +136,21 @@ module Hecks
135
136
  !cli[:names][:command].key?(name) && cli[:names][:question].key?(name)
136
137
  end
137
138
 
138
- # The chapter a command line speaks to: the booted domain's own, or, when the first word
139
- # names a chapter its hecksagon attaches or uses as a framework member (`deploy`,
140
- # `governance`), that chapter, with the word dropped and added to the program name.
141
- def chapter_for(runtime, argv, program)
142
- own = runtime.registry.bluebooks.values.first
143
- target = attached_chapters(runtime).find { |name| Naming.snake(name) == argv.first }
139
+ # The bluebook a command line speaks to: the booted domain's own, or, when the first word
140
+ # names a bluebook its hecksagon attaches or uses as a framework member (`deploy`,
141
+ # `governance`), that bluebook, with the word dropped and added to the program name.
142
+ def bluebook_for(runtime, argv, program)
143
+ own = runtime.first_bluebook
144
+ target = attached_bluebooks(runtime).find { |name| Naming.snake(name) == argv.first }
144
145
  return [own, argv, program] unless target
145
146
 
146
- [runtime.registry.bluebook(target), argv[1..], "#{program} #{argv.first}"]
147
+ [runtime.bluebook(target), argv[1..], "#{program} #{argv.first}"]
147
148
  end
148
149
 
149
- # The chapters the booted domain's hecksagon attaches or uses as framework members.
150
- def attached_chapters(runtime)
151
- own = runtime.registry.bluebooks.values.first
152
- Array(runtime.registry.hecksagon(own.name)&.member_chapters)
150
+ # The bluebooks the booted domain's hecksagon attaches or uses as framework members.
151
+ def attached_bluebooks(runtime)
152
+ own = runtime.first_bluebook
153
+ Array(runtime.hecksagon(own.name)&.member_bluebooks)
153
154
  end
154
155
  end
155
156
  end
@@ -6,6 +6,9 @@ module Hecks
6
6
  module CliRunner
7
7
  # The answer `--wait` gives once every reaction has run. Extended into `CliRunner`.
8
8
  module Settling
9
+ # The `Some::ErrorClass: ` an adapter's failure text opens with.
10
+ QUALIFIED_CLASS_PREFIX = /\A(\w+::)+\w+: /
11
+
9
12
  # The answer `--wait` gives: the record re-read after every reaction has run, with all its
10
13
  # events, and a status of 1 when its lifecycle ended in a failure state, a refused
11
14
  # reaction
@@ -18,7 +21,7 @@ module Hecks
18
21
  #
19
22
  # @return [Array(String, Integer)] the JSON and the status, plus (Array(String, Integer,
20
23
  # String)) why the run failed when it did
21
- def settled(runtime, spec, handle, bluebook, launcher, extra) # rubocop:disable Metrics/ParameterLists -- pinned by the callers and specs
24
+ def settled(runtime, spec, handle, bluebook, launcher, extra, text: false) # rubocop:disable Metrics/ParameterLists -- pinned by the callers and specs
22
25
  why = reactions_failed(handle)
23
26
  return finish(stateless_json(handle, extra), why) if handle.state.nil?
24
27
 
@@ -26,7 +29,7 @@ module Hecks
26
29
  state = reread(runtime, bluebook, aggregate, handle) || handle.state
27
30
  answer = settled_answer(handle, state, settled_event_names(runtime, bluebook, aggregate, handle), extra)
28
31
  why += failure_reasons(aggregate, state, launcher)
29
- settled_result(answer, LauncherOptions.report?(launcher, spec), why)
32
+ settled_result(answer, text || LauncherOptions.report?(launcher, spec), why)
30
33
  end
31
34
 
32
35
  # The settled answer as the launcher's report when it prints one, else as JSON.
@@ -55,7 +58,7 @@ module Hecks
55
58
  def failure_reasons(aggregate, state, launcher)
56
59
  return [] unless LauncherOptions.failed?(aggregate, state, launcher)
57
60
 
58
- [failure_sentence(aggregate, state, aggregate.lifecycle.field)]
61
+ [failure_sentence(aggregate, state, aggregate.lifecycle_field)]
59
62
  end
60
63
 
61
64
  # The answer of a command the launcher prints as its report: the text it recorded, with
@@ -77,7 +80,7 @@ module Hecks
77
80
  refusal = refusal[:value] if refusal.is_a?(Hash)
78
81
  return sentence if refusal.to_s.strip.empty?
79
82
 
80
- "#{sentence}: #{refusal.to_s.strip.sub(/\A(\w+::)+\w+: /, "")}"
83
+ "#{sentence}: #{refusal.to_s.strip.sub(QUALIFIED_CLASS_PREFIX, "")}"
81
84
  end
82
85
 
83
86
  # The answer and its status: 0 when nothing failed, else 1 with the reasons joined.
@@ -111,7 +114,8 @@ module Hecks
111
114
  def reread(runtime, bluebook, aggregate, handle)
112
115
  return unless aggregate && runtime.respond_to?(:registry)
113
116
 
114
- runtime.registry.repository(bluebook.name, aggregate)&.find(handle.id)&.to_h
117
+ repository = runtime.repository(bluebook.name, aggregate)
118
+ repository&.find(handle.id)&.to_h
115
119
  end
116
120
  end
117
121
  end
@@ -12,7 +12,7 @@ module Hecks
12
12
  # setting lists under `streams`, given `--stream`; `from_now` applies to the first ask
13
13
  # only.
14
14
  #
15
- # @param runtime [Runtime::Dispatcher, Runtime::RemoteDispatcher] the booted domain
15
+ # @param runtime [Runtime::Dispatcher, Adapters::Lambda::RemoteDispatcher] the domain
16
16
  # @param argv [Array<String>] as for `call`, with `--stream`
17
17
  # @param program [String] how the caller was invoked
18
18
  # @param out [IO] where each entry's line goes
@@ -2,19 +2,28 @@ module Hecks
2
2
  module Adapters
3
3
  module Driving
4
4
  module CliRunner
5
- # Words the answer for a command or question the chapter does not declare. Extended into
5
+ # Words the answer for a command or question the bluebook does not declare. Extended into
6
6
  # `CliRunner`.
7
7
  module Suggestions
8
8
  # Words the answer for an unknown command or question, suggesting up to five near names.
9
9
  # Ranked by shared prefix, which survives a dropped letter where a substring would not.
10
10
  def unknown(cli, name, asking, program)
11
- near = near_names(cli, name, asking)
11
+ near = near_names(cli, snake_form(name), asking)
12
12
  lines = ["no such #{asking ? "query" : "command"}: #{name}"]
13
- lines += ["", "did you mean:", *near.first(5).map { |candidate| " #{candidate}" }] unless near.empty?
13
+ shown = near.first(5).map { |candidate| " #{shown_name(cli, candidate, asking)}" }
14
+ lines += ["", "did you mean:", *shown] unless near.empty?
14
15
  lines += ["", " #{program}#{" query" if asking} for the full list"]
15
16
  lines.join("\n")
16
17
  end
17
18
 
19
+ # A suggested name as the listing prints it, in the bluebook's verb form. A candidate from
20
+ # the other namespace (a bare name's home) is printed as it is.
21
+ def shown_name(cli, candidate, asking)
22
+ specs = asking ? cli[:questions] : cli[:commands]
23
+ spec = specs[cli[:names][asking ? :question : :command][candidate]]
24
+ spec ? Projector::CliProjector.verb_form(spec, candidate) : candidate
25
+ end
26
+
18
27
  # The names worth suggesting: the bare name's homes first, then the names sharing a
19
28
  # prefix.
20
29
  def near_names(cli, name, asking)
@@ -29,10 +38,9 @@ module Hecks
29
38
 
30
39
  # The pool's names that share at least half of `name` (and three letters) as a prefix.
31
40
  def similar_names(pool, name)
32
- pool.map { |candidate| [shared_prefix(candidate, name), candidate] }
33
- .select { |shared, _| shared >= [name.length / 2, 3].max }
34
- .sort_by { |shared, candidate| [-shared, candidate] }
35
- .map(&:last)
41
+ scored = pool.map { |candidate| [shared_prefix(candidate, name), candidate] }
42
+ close = scored.select { |shared, _| shared >= [name.length / 2, 3].max }
43
+ close.sort_by { |shared, candidate| [-shared, candidate] }.map(&:last)
36
44
  end
37
45
 
38
46
  # The length of the prefix two words share.
@@ -0,0 +1,49 @@
1
+ module Hecks
2
+ module Adapters
3
+ module Driving
4
+ module CliRunner
5
+ # Reads the spellings a line may give a command or query. The launcher indexes them by the
6
+ # snake-case `aggregate.verb` the projection prints; the bluebook's own verb form, such as
7
+ # `Hecks::PushTrain.Board`, reaches the same one. Extended into `CliRunner`.
8
+ module VerbNames
9
+ # A realm written before the aggregate: `Hecks::`.
10
+ REALM = /\A(?:[A-Z]\w*::)+/
11
+
12
+ # The name the projection indexes a typed name under: the name itself when it is one,
13
+ # else its verb form read into snake case, else the name as typed, for the refusal to
14
+ # name.
15
+ #
16
+ # @param cli [Hash] the projection, holding the `:names` it indexes
17
+ # @param typed [String] the word typed, without its `!`
18
+ # @return [String] the indexed name, or `typed` when none matches
19
+ def canonical_name(cli, typed)
20
+ [typed, *verb_form_names(typed)].find { |name| indexed?(cli, name) } || typed
21
+ end
22
+
23
+ # A typed name as the projection spells it, to match what was typed against the names it
24
+ # indexes: `Hecks::PushTrain.bord` as `push_train.bord`.
25
+ #
26
+ # @param typed [String] the word typed, without its `!`
27
+ # @return [String] the realm dropped and each dotted segment in snake case
28
+ def snake_form(typed) = snake_segments(typed).join(".")
29
+
30
+ private
31
+
32
+ # `Hecks::PushTrain.board` as `push_train.board`; a verb that names an entity's command,
33
+ # `PushTrain.Launcher.Refresh`, also as `push_train.refresh`, the way the projection
34
+ # exposes it.
35
+ def verb_form_names(typed)
36
+ segments = snake_segments(typed)
37
+ [segments.join("."), [segments.first, segments.last].join(".")].uniq
38
+ end
39
+
40
+ def snake_segments(typed) = typed.sub(REALM, "").split(".").map { |segment| Naming.snake(segment) }
41
+
42
+ def indexed?(cli, name)
43
+ cli[:names][:command].key?(name) || cli[:names][:question].key?(name)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -11,6 +11,7 @@ require_relative "cli_runner/resolution"
11
11
  require_relative "cli_runner/settling"
12
12
  require_relative "cli_runner/streaming"
13
13
  require_relative "cli_runner/suggestions"
14
+ require_relative "cli_runner/verb_names"
14
15
 
15
16
  module Hecks
16
17
  module Adapters
@@ -25,6 +26,7 @@ module Hecks
25
26
 
26
27
  extend Resolution
27
28
  extend Suggestions
29
+ extend VerbNames
28
30
  extend Answers
29
31
  extend Settling
30
32
  extend Streaming
@@ -32,9 +34,9 @@ module Hecks
32
34
  module_function
33
35
 
34
36
  # Runs one command line against a booted domain and answers the text to print.
35
- # The booted domain's own chapter is projected, or an attached one its first word names.
37
+ # The booted domain's own bluebook is projected, or an attached one its first word names.
36
38
  #
37
- # @param runtime [Runtime::Dispatcher, Runtime::RemoteDispatcher] the booted domain
39
+ # @param runtime [Runtime::Dispatcher, Adapters::Lambda::RemoteDispatcher] the booted domain
38
40
  # @param argv [Array<String>] an optional `query` (or `ask`), the command or query name,
39
41
  # then
40
42
  # `path=value` pairs; `--help`, `-h`, `help` or nothing answers usage
@@ -40,7 +40,8 @@ module Hecks
40
40
  request = Rack::Request.new(env)
41
41
  return respond(405, error: "MethodNotAllowed", message: "POST only") unless request.post?
42
42
 
43
- body = request.body.read
43
+ stream = request.body
44
+ body = stream.read
44
45
  verify_signature!(request, body)
45
46
  route(request.get_header(EVENT_HEADER), body)
46
47
  rescue InvalidSignature => e
@@ -0,0 +1,46 @@
1
+ require_relative "../../../naming"
2
+
3
+ module Hecks
4
+ module Adapters
5
+ module Driving
6
+ class Handle
7
+ # The two names each non-creating verb gets on a handle (ADR 0120): `name!` dispatches
8
+ # and `name` answers the verb's IR command. Both are real singleton methods, not
9
+ # method_missing, so a verb named `freeze` or `send` (Account::Freeze,
10
+ # ExternalTransfer::Send) wins over the Kernel method instead of silently hitting it.
11
+ module VerbMethods
12
+ # Object methods a bare verb name never replaces: identity, introspection and
13
+ # copying, which Ruby itself, `Hash` and test doubles call on any object.
14
+ CORE_NAMES = %i[__send__ __id__ object_id class singleton_class hash equal? eql? == is_a?
15
+ kind_of? instance_of? respond_to? respond_to_missing? method_missing method
16
+ public_send instance_variable_get instance_variable_set instance_variables
17
+ define_singleton_method nil? dup clone itself tap then inspect to_s].freeze
18
+
19
+ # The names a bare verb leaves alone: every method a handle defines, plus `CORE_NAMES`.
20
+ #
21
+ # @return [Array<Symbol>] the reserved method names
22
+ def self.reserved_names
23
+ @reserved_names ||= (Handle.instance_methods(false) + Handle.private_instance_methods(false) +
24
+ private_instance_methods(false) + CORE_NAMES).uniq.freeze
25
+ end
26
+
27
+ private
28
+
29
+ def define_verb_methods
30
+ @ir.commands.reject(&:creates?).each do |command|
31
+ name = Naming.snake(command.hecks_name)
32
+ define_singleton_method("#{name}!") { |**args| run(command, **args) }
33
+ define_singleton_method(name) { command } unless keeps_its_name?(name.to_sym)
34
+ end
35
+ end
36
+
37
+ # A field reader, a method of the handle's own, or an Object method Ruby's machinery
38
+ # calls keeps its name; the verb's bang form still dispatches.
39
+ def keeps_its_name?(name)
40
+ @state.key?(name) || reader?(name) || VerbMethods.reserved_names.include?(name)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,6 +1,7 @@
1
1
  require_relative "../../naming"
2
2
  require_relative "../../runtime/caller"
3
3
  require_relative "../../ports/authorization"
4
+ require_relative "handle/verb_methods"
4
5
 
5
6
  module Hecks
6
7
  module Adapters
@@ -10,11 +11,13 @@ module Hecks
10
11
  #
11
12
  # Pizza.create_pizza!(...).add_topping!(...).purchase!(...)
12
13
  class Handle
14
+ include VerbMethods
15
+
13
16
  attr_reader :id
14
17
 
15
- # @param dispatcher [Runtime::Dispatcher, Runtime::RemoteDispatcher] the booted
18
+ # @param dispatcher [Runtime::Dispatcher, Adapters::Lambda::RemoteDispatcher] the booted
16
19
  # dispatcher this record's verbs, `events` and `reload` go through
17
- # @param domain [String] the owning chapter's name, the first half of `fqn`
20
+ # @param domain [String] the owning bluebook's name, the first half of `fqn`
18
21
  # @param aggregate [Bluebook::Aggregate] the IR of the aggregate this record is one of
19
22
  # @param instance [Runtime::Instance] the stored record; its `id` and `state` are
20
23
  # read once here and the instance itself is not retained
@@ -157,18 +160,7 @@ module Hecks
157
160
  end
158
161
 
159
162
  def reader?(name)
160
- !@ir.attribute(name).nil? || @ir.lifecycle&.field&.to_sym == name
161
- end
162
-
163
- # Real singleton methods, not method_missing: a verb named `freeze` or
164
- # `send` (both real, e.g. Account::Freeze, ExternalTransfer::Send) would
165
- # otherwise silently hit the Kernel method instead of dispatching.
166
- def define_verb_methods
167
- @ir.commands.reject(&:creates?).each do |command|
168
- define_singleton_method("#{Naming.snake(command.hecks_name)}!") do |**args|
169
- run(command, **args)
170
- end
171
- end
163
+ !@ir.attribute(name).nil? || @ir.lifecycle_field&.to_sym == name
172
164
  end
173
165
 
174
166
  # `@ir.identified_by` is only the single-head shorthand (nil for a
@@ -183,8 +175,8 @@ module Hecks
183
175
  # when called; nothing loads until then, so chains like
184
176
  # `payment.disputed_by_customer.name` stay lazy at every step.
185
177
  #
186
- # Defined before verb methods so a same-named verb wins the name on the
187
- # rare collision; `initialize` calls this first for that reason.
178
+ # A verb of the same name leaves the accessor alone (`keeps_its_name?`); only the
179
+ # verb's bang form is defined.
188
180
  #
189
181
  # The accessor is named like the attribute itself, never `<name>_id`
190
182
  # (ADR 0025) — `piece.account` and `piece[:account]` (bracket access,
@@ -195,7 +187,7 @@ module Hecks
195
187
 
196
188
  # One lazy reader for a reference attribute.
197
189
  def define_reference_accessor(attribute)
198
- target = attribute.type.resolve
190
+ target = attribute.target_aggregate
199
191
  # Cross-domain, or otherwise unresolvable — no accessor rather than a guess.
200
192
  return unless target
201
193
 
@@ -19,11 +19,11 @@ module Hecks
19
19
  # The name is checked against the current boot's IR before Ruby's constant table, so
20
20
  # a stale same-named constant from an earlier boot is never returned.
21
21
  #
22
- # @param dispatcher [Runtime::Dispatcher, Runtime::RemoteDispatcher] the booted dispatcher
23
- # @param domain [String, Symbol] the chapter name, such as `"Banking"`
22
+ # @param dispatcher [Runtime::Dispatcher, Adapters::Lambda::RemoteDispatcher] the boot
23
+ # @param domain [String, Symbol] the bluebook name, such as `"Banking"`
24
24
  # @param name [String, Symbol] the aggregate's declared name, such as `"Customer"`
25
25
  # @return [Module] the aggregate module installed at `domain::name`
26
- # @raise [Runtime::NotFound] if the chapter or its aggregate is not declared
26
+ # @raise [Runtime::NotFound] if the bluebook or its aggregate is not declared
27
27
  # @raise [NameError] if the aggregate has no facade constant (`install_driving: false`)
28
28
  def aggregate(dispatcher, domain, name)
29
29
  Admission.admit!(dispatcher.registry, "Json")
@@ -40,8 +40,9 @@ module Hecks
40
40
  # @return [String] the method name to `public_send` to the module
41
41
  # @raise [Runtime::NotFound] if the aggregate declares no creating command
42
42
  def creating_command(klass)
43
- creating = klass.ir.commands.find(&:creates?)
44
- raise Runtime::NotFound, "#{klass.ir.hecks_name} declares no creating command" unless creating
43
+ ir = klass.ir
44
+ creating = ir.commands.find(&:creates?)
45
+ raise Runtime::NotFound, "#{ir.hecks_name} declares no creating command" unless creating
45
46
 
46
47
  "#{Naming.snake(creating.hecks_name)}!"
47
48
  end
@@ -59,10 +60,11 @@ module Hecks
59
60
  # @raise [Runtime::NotFound] if no non-creating command has that method name
60
61
  def validate_command!(klass, name)
61
62
  wanted = name.to_s
62
- dispatchable = klass.ir.commands.reject(&:creates?).map { |command| "#{Naming.snake(command.hecks_name)}!" }
63
+ ir = klass.ir
64
+ dispatchable = ir.commands.reject(&:creates?).map { |command| "#{Naming.snake(command.hecks_name)}!" }
63
65
  return wanted if dispatchable.include?(wanted)
64
66
 
65
- raise Runtime::NotFound, "#{klass.ir.hecks_name} declares no command named #{wanted.inspect}"
67
+ raise Runtime::NotFound, "#{ir.hecks_name} declares no command named #{wanted.inspect}"
66
68
  end
67
69
 
68
70
  # Fetches one record by id, raising instead of answering nil on a miss.
@@ -72,7 +74,8 @@ module Hecks
72
74
  # @return [Adapters::Driving::Handle] the record in hand
73
75
  # @raise [Runtime::NotFound] if the repository holds no record with that id
74
76
  def find!(klass, id)
75
- klass.find(id) or raise Runtime::NotFound, "no #{klass.ir.hecks_name} found for id #{id.inspect}"
77
+ ir = klass.ir
78
+ klass.find(id) or raise Runtime::NotFound, "no #{ir.hecks_name} found for id #{id.inspect}"
76
79
  end
77
80
 
78
81
  # Converts every Hash key to a Symbol, at every depth of a parsed JSON body.