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
@@ -1,22 +1,22 @@
1
1
  module Hecks
2
2
  module Composer
3
- # The event-storming board of a chapter, on the hecksagon side: its aggregates with their
3
+ # The event-storming board of a bluebook, on the hecksagon side: its aggregates with their
4
4
  # commands, the events each command emits, and the policies that make one event trigger another
5
- # command. It is read off the booted chapter, so it always shows what the text declares; the
5
+ # command. It is read off the booted bluebook, so it always shows what the text declares; the
6
6
  # board's own edits go through {BoardEdit}, which rewrites the text.
7
7
  module Board
8
8
  module_function
9
9
 
10
- # @param chapter [Bluebook::Chapter] the booted chapter
10
+ # @param bluebook [Bluebook::Declaration] the booted bluebook
11
11
  # @param outline [Array<Hash>] the text outline (see {Outline}), which says where each note
12
12
  # is declared
13
13
  # @return [Hash] `aggregates` (each with `name`, `at` and its `commands`, each command with
14
14
  # `name`, `role`, `goal`, `emits` and `at`) and `policies` (`name`, `on`, `trigger`, `at`),
15
15
  # where `at` is `{file:, line:}` or nil, and `on` and `trigger` read `Aggregate.Name`
16
- def call(chapter, outline:)
16
+ def call(declaration, outline:)
17
17
  places = Places.new(outline)
18
- { aggregates: chapter.aggregates.map { |aggregate| aggregate_note(aggregate, places) },
19
- policies: chapter.policies.map { |policy| policy_note(policy, places) } }
18
+ { aggregates: declaration.aggregates.map { |aggregate| aggregate_note(aggregate, places) },
19
+ policies: declaration.policies.map { |policy| policy_note(policy, places) } }
20
20
  end
21
21
 
22
22
  # @api private
@@ -5,6 +5,9 @@ module Hecks
5
5
  # the key the aggregate is known by; every later one acts on a record of it. A command with an
6
6
  # event says so on a line of its own.
7
7
  module CommandText
8
+ # An `identified_by :field` line, capturing the key field's name.
9
+ IDENTIFIED_BY = /\A\s*identified_by\s+:(\w+)\s*\z/
10
+
8
11
  module_function
9
12
 
10
13
  # @param block [Array<String>] the lines of the aggregate's block, after its declaration
@@ -27,7 +30,7 @@ module Hecks
27
30
  # The attribute and `sets` that give a new record its key.
28
31
  # @api private
29
32
  def creates(block, aggregate)
30
- field = block.filter_map { |line| line[/\A\s*identified_by\s+:(\w+)\s*\z/, 1] }.first
33
+ field = block.filter_map { |line| line[IDENTIFIED_BY, 1] }.first
31
34
  type = field && block.filter_map { |line| line[/\A\s*attribute\s+:#{field},\s*([A-Za-z:]+)/, 1] }.first
32
35
  raise Refused, "#{aggregate} has no key the board can read; write its first command in the text" unless type
33
36
 
@@ -9,6 +9,15 @@ module Hecks
9
9
  # it: where a declaration is, where its block ends (found by indentation, as the bluebooks
10
10
  # are laid out), and a way to put a patched file back as one result.
11
11
  class Source
12
+ # A bluebook file's path.
13
+ BLUEBOOK_FILE = /\.bluebook\z/
14
+
15
+ # The `Hecks.bluebook "Name"` line that declares a bluebook.
16
+ BLUEBOOK_HEADER = /\A\s*Hecks\.bluebook\s+"/
17
+
18
+ # The spaces a line starts with.
19
+ LEADING_SPACES = /\A */
20
+
12
21
  # @return [Board::Places] where each aggregate, command and policy is declared
13
22
  attr_reader :places
14
23
 
@@ -16,7 +25,7 @@ module Hecks
16
25
  def initialize(stage)
17
26
  files = Workspace.files(stage)
18
27
  @places = Board::Places.new(Outline.call(stage, files))
19
- @lines = files.grep(/\.bluebook\z/).to_h { |file| [file, File.read(File.join(stage, file)).lines.map(&:chomp)] }
28
+ @lines = files.grep(BLUEBOOK_FILE).to_h { |file| [file, File.read(File.join(stage, file)).lines.map(&:chomp)] }
20
29
  end
21
30
 
22
31
  # @param at [Hash] `{file:, line:}` of a declaration
@@ -34,14 +43,14 @@ module Hecks
34
43
  # @return [Integer] how many spaces its line is indented
35
44
  def indent(at) = indent_of(@lines.fetch(at[:file])[at[:line] - 1])
36
45
 
37
- # The file and `end` of the chapter's own block, where new aggregates and policies go.
38
- # @return [Hash] `{file:, line:}` of the chapter header
39
- # @raise [Refused] if no file declares the chapter
40
- def chapter
41
- file = @lines.keys.sort.find { |path| @lines[path].any? { |line| line.match?(/\A\s*Hecks\.bluebook\s+"/) } }
42
- raise Refused, "no file declares the chapter" unless file
46
+ # The file and `end` of the bluebook's own block, where new aggregates and policies go.
47
+ # @return [Hash] `{file:, line:}` of the bluebook header
48
+ # @raise [Refused] if no file declares the bluebook
49
+ def declaration
50
+ file = @lines.keys.sort.find { |path| @lines[path].any? { |line| line.match?(BLUEBOOK_HEADER) } }
51
+ raise Refused, "no file declares the bluebook" unless file
43
52
 
44
- { file: file, line: @lines[file].index { |line| line.match?(/\A\s*Hecks\.bluebook\s+"/) } + 1 }
53
+ { file: file, line: @lines[file].index { |line| line.match?(BLUEBOOK_HEADER) } + 1 }
45
54
  end
46
55
 
47
56
  # @param file [String] a bluebook path
@@ -70,7 +79,7 @@ module Hecks
70
79
 
71
80
  private
72
81
 
73
- def indent_of(line) = line[/\A */].size
82
+ def indent_of(line) = line[LEADING_SPACES].size
74
83
 
75
84
  # The new lines, without their leading blank line when one is already above the spot.
76
85
  def spaced(lines, before, added)
@@ -41,7 +41,7 @@ module Hecks
41
41
  def add_aggregate(source, name:)
42
42
  named!(name, "an aggregate")
43
43
  refuse!("#{name} is already an aggregate") if source.places.of("aggregate", name)
44
- header = source.chapter
44
+ header = source.declaration
45
45
  source.insert(header[:file], source.block_end(header), aggregate_lines(name))
46
46
  end
47
47
 
@@ -81,7 +81,7 @@ module Hecks
81
81
  event = dotted!(on, "the event")
82
82
  target = dotted!(trigger, "the command")
83
83
  command_at(source, target[1], target[2])
84
- header = source.chapter
84
+ header = source.declaration
85
85
  source.insert(header[:file], source.block_end(header), policy_lines(name, event, target))
86
86
  end
87
87
 
@@ -13,66 +13,66 @@ module Hecks
13
13
 
14
14
  # @param dir [String] the workspace directory
15
15
  # @param buffers [Hash{String => String}] unsaved text by path relative to `dir`
16
- # @param chapter_name [String, nil] the chapter to draw; the first bluebook's when nil
16
+ # @param declaration_name [String, nil] the bluebook to draw; the first bluebook's when nil
17
17
  # @return [Hash] `diagnostic` (nil, or `{file:, line:, message:, expected:}` for the first
18
18
  # refusal), `files` (the workspace's declaration files), `outline` (see {Outline}),
19
- # `chapter` (the name drawn), `diagrams` (Mermaid text by file name), `statements` (plain
19
+ # `bluebook` (the name drawn), `diagrams` (Mermaid text by file name), `statements` (plain
20
20
  # sentences), `findings` (`{kind:, severity:, subject:, message:}` per model-check
21
21
  # finding), `wiring` (see {wiring}, nil until the workspace boots), `board` (the
22
22
  # event-storming notes, see {Board}, nil until it boots) and `elapsed_ms`
23
- def call(dir:, buffers: {}, chapter_name: nil)
23
+ def call(dir:, buffers: {}, declaration_name: nil)
24
24
  started = Process.clock_gettime(Process::CLOCK_MONOTONIC)
25
- result = Workspace.stage(dir: dir, buffers: buffers) { |stage| judge(stage, chapter_name) }
25
+ result = Workspace.stage(dir: dir, buffers: buffers) { |stage| judge(stage, declaration_name) }
26
26
  result.merge(elapsed_ms: ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - started) * 1000).round)
27
27
  end
28
28
 
29
29
  # @api private
30
- def judge(stage, chapter_name)
30
+ def judge(stage, declaration_name)
31
31
  files = Workspace.files(stage)
32
- verdict(stage, empty(files, Outline.call(stage, files)), chapter_name)
32
+ verdict(stage, empty(files, Outline.call(stage, files)), declaration_name)
33
33
  end
34
34
 
35
35
  # What the parser and the boot say of the staged text, laid over `base`.
36
36
  # @api private
37
- def verdict(stage, base, chapter_name)
37
+ def verdict(stage, base, declaration_name)
38
38
  refusal = Parse.call(stage)
39
39
  return base.merge(diagnostic: refusal) if refusal
40
40
 
41
- project(stage, base, chapter_name || Parse.bluebooks(stage).keys.first)
41
+ project(stage, base, declaration_name || Parse.bluebooks(stage).keys.first)
42
42
  rescue Parse::ParserMissing
43
43
  raise
44
44
  rescue StandardError => e
45
- base.merge(diagnostic: { file: nil, line: nil, message: e.message.lines.first.to_s.chomp, expected: [] })
45
+ base.merge(diagnostic: { file: nil, line: nil, message: Text.headline(e.message), expected: [] })
46
46
  end
47
47
 
48
48
  # @api private
49
49
  def project(stage, base, name)
50
50
  registry = Hecks.boot(stage, install_driving: false, environment: "memory").registry
51
- chapter = registry.bluebook(name)
52
- base.merge(chapter: name, wiring: wiring(registry, name), board: Board.call(chapter, outline: base[:outline]),
53
- **read(chapter, registry.hecksagon(name)))
51
+ declaration = registry.bluebook(name)
52
+ base.merge(bluebook: name, wiring: wiring(registry, name),
53
+ board: Board.call(declaration, outline: base[:outline]), **read(declaration, registry.hecksagon(name)))
54
54
  end
55
55
 
56
- # The diagrams, statements and model-check findings of a booted chapter.
56
+ # The diagrams, statements and model-check findings of a booted bluebook.
57
57
  # @api private
58
- def read(chapter, hecksagon)
59
- { diagrams: Projections::Diagrams.call(bluebook: chapter, options: { hecksagon: hecksagon }),
60
- statements: Projections::Statements.call(bluebook: chapter),
61
- findings: Bluebook::ModelCheck.call(chapter, hecksagon: hecksagon).map(&:to_h) }
58
+ def read(declaration, hecksagon)
59
+ { diagrams: Projections::Diagrams.call(bluebook: declaration, options: { hecksagon: hecksagon }),
60
+ statements: Projections::Statements.call(bluebook: declaration),
61
+ findings: Bluebook::ModelCheck.call(declaration, hecksagon: hecksagon).map(&:to_h) }
62
62
  end
63
63
 
64
- # What the chapter is wired to: the binds its hecksagon declares, the chapters it attaches,
64
+ # What the bluebook is wired to: the binds its hecksagon declares, the bluebooks it attaches,
65
65
  # the driving adapters it admits, the world's default adapter, and each declared port with
66
66
  # the adapters bound to it.
67
67
  #
68
68
  # @param registry [Runtime::Registry] a booted registry
69
- # @param name [String] the chapter's name
69
+ # @param name [String] the bluebook's name
70
70
  # @return [Hash] `binds`, `attaches`, `driving`, `default_adapter` and `ports`
71
71
  def wiring(registry, name)
72
72
  hecksagon = registry.hecksagon(name)
73
73
  {
74
74
  binds: (hecksagon&.binds || []).map { |bind| bind.to_h.slice(:aggregate, :verb, :adapter, :role) },
75
- attaches: hecksagon&.member_chapters || [],
75
+ attaches: hecksagon&.member_bluebooks || [],
76
76
  driving: hecksagon&.driving || [],
77
77
  default_adapter: registry.world(name)&.default_adapter,
78
78
  ports: Runtime::CapabilityGraph.new(registry).fulfillments
@@ -81,8 +81,8 @@ module Hecks
81
81
 
82
82
  # @api private
83
83
  def empty(files, outline)
84
- { diagnostic: nil, files: files, outline: outline, chapter: nil, diagrams: {}, statements: [],
85
- findings: [], wiring: nil, board: nil }
84
+ { diagnostic: nil, files: files, outline: outline, bluebook: nil, diagrams: {},
85
+ statements: [], findings: [], wiring: nil, board: nil }
86
86
  end
87
87
  end
88
88
  end
@@ -16,7 +16,7 @@ module Hecks
16
16
  # The groups the picker shows, in order, each with the ids it takes.
17
17
  GROUPS = [["Examples", %r{\Aexamples/[^/]+\z}],
18
18
  ["Stress domains", %r{\Aqa/stress_domains/[^/]+\z}],
19
- ["Hecks chapters", %r{\Alib/hecks/}],
19
+ ["Hecks bluebooks", %r{\Alib/hecks/}],
20
20
  ["Quality control", /\Aqa\z/],
21
21
  ["Composer fixtures", %r{\Aspec/fixtures/composer/[^/]+\z}]].freeze
22
22
 
@@ -11,8 +11,8 @@ module Hecks
11
11
  # hecksagon: the editor drives the domain, the domain keeps its records in memory, and the
12
12
  # staged copy of the files lives until `close`.
13
13
  class Live
14
- # @return [String] the chapter the workspace booted
15
- attr_reader :chapter_name
14
+ # @return [String] the bluebook the workspace booted
15
+ attr_reader :declaration_name
16
16
 
17
17
  # Stages the workspace and boots it in memory.
18
18
  #
@@ -25,7 +25,7 @@ module Hecks
25
25
  stage = Workspace.materialize(dir: dir, buffers: buffers)
26
26
  begin
27
27
  runtime = Hecks.boot(stage, install_driving: false, environment: "memory")
28
- new(stage: stage, runtime: runtime, chapter_name: Parse.bluebooks(stage).keys.first)
28
+ new(stage: stage, runtime: runtime, declaration_name: Parse.bluebooks(stage).keys.first)
29
29
  rescue StandardError, ScriptError
30
30
  FileUtils.rm_rf(stage)
31
31
  raise
@@ -34,14 +34,14 @@ module Hecks
34
34
 
35
35
  # @param stage [String] the staged directory this domain booted from
36
36
  # @param runtime [Runtime::Dispatcher] the booted domain
37
- # @param chapter_name [String] the chapter's name
38
- def initialize(stage:, runtime:, chapter_name:)
37
+ # @param declaration_name [String] the bluebook's name
38
+ def initialize(stage:, runtime:, declaration_name:)
39
39
  @stage = stage
40
40
  @runtime = runtime
41
- @chapter_name = chapter_name
41
+ @declaration_name = declaration_name
42
42
  end
43
43
 
44
- # The aggregate commands the chapter declares, each with a starter value for every argument.
44
+ # The aggregate commands the bluebook declares, each with a starter value for every argument.
45
45
  #
46
46
  # @return [Array<Hash>] per command: `verb`, `aggregate`, `command`, `goal`, `creates`,
47
47
  # `args` (`{name:, type:, optional:}` each) and `template` (argument name to starter value)
@@ -67,7 +67,7 @@ module Hecks
67
67
  # @return [Hash{String => Array<Hash>}] each aggregate's name to its records as plain rows
68
68
  def records
69
69
  aggregates.to_h do |aggregate|
70
- rows = @runtime.registry.repository(@chapter_name, aggregate).all
70
+ rows = @runtime.repository(@declaration_name, aggregate).all
71
71
  [aggregate.hecks_name, Plain.call(rows.to_a)]
72
72
  end
73
73
  end
@@ -76,7 +76,8 @@ module Hecks
76
76
  # @return [Array<Hash>] the last `limit` events, oldest first, as plain Hashes with `name`,
77
77
  # `aggregate`, `id`, `payload` and `occurred_at`
78
78
  def history(limit = 200)
79
- @runtime.events.to_a.last(limit).map { |event| Plain.call(event.to_h) }
79
+ latest = @runtime.events.to_a.last(limit)
80
+ latest.map { |event| Plain.call(event.to_h) }
80
81
  end
81
82
 
82
83
  # Removes the staged copy of the workspace. Calling it again does nothing.
@@ -87,7 +88,7 @@ module Hecks
87
88
  end
88
89
 
89
90
  # @api private
90
- def aggregates = @runtime.registry.bluebook(@chapter_name).aggregates
91
+ def aggregates = @runtime.bluebook(@declaration_name).aggregates
91
92
 
92
93
  # @api private
93
94
  def accepted(result)
@@ -97,14 +98,19 @@ module Hecks
97
98
 
98
99
  # @api private
99
100
  def refused(error)
100
- { ok: false, kind: error.class.name.to_s.split("::").last,
101
- error: error.message.lines.first.to_s.chomp }
101
+ { ok: false, kind: short_class_name(error), error: Text.headline(error.message) }
102
+ end
103
+
104
+ # @api private
105
+ def short_class_name(error)
106
+ name = error.class.name.to_s
107
+ name.split("::").last
102
108
  end
103
109
 
104
110
  # @api private
105
111
  def describe(aggregate, command)
106
112
  args = arguments(command)
107
- { verb: "#{@chapter_name}::#{aggregate.hecks_name}.#{command.hecks_name}",
113
+ { verb: "#{@declaration_name}::#{aggregate.hecks_name}.#{command.hecks_name}",
108
114
  aggregate: aggregate.hecks_name, command: command.hecks_name, goal: command.goal.to_s,
109
115
  creates: command.references.nil?, args: args, template: template(aggregate, args) }
110
116
  end
@@ -10,6 +10,9 @@ module Hecks
10
10
  DECLARATION = /\A\s*(#{KINDS.join("|")})\s+"([^"]+)"/
11
11
  SUMMARY = /\A\s*(?:goal|description)\s+"((?:[^"\\]|\\.)*)"/
12
12
 
13
+ # The path of a file that declares things: a bluebook, hecksagon, behaviors or world file.
14
+ DECLARING_FILE = /\.(bluebook|hecksagon|behaviors|world)\z/
15
+
13
16
  # How many lines below a declaration its `goal` or `description` may sit.
14
17
  REACH = 6
15
18
 
@@ -20,7 +23,7 @@ module Hecks
20
23
  # @return [Array<Hash>] `{file:, line:, kind:, name:, summary:}` for each declaration, in file
21
24
  # then line order; `line` counts from 1 and `summary` is nil when none follows
22
25
  def call(stage, files)
23
- files.grep(/\.(bluebook|hecksagon|behaviors|world)\z/).flat_map do |file|
26
+ files.grep(DECLARING_FILE).flat_map do |file|
24
27
  entries(file, File.readlines(File.join(stage, file), chomp: true))
25
28
  end
26
29
  end
@@ -735,7 +735,7 @@
735
735
  editor.on("change", (cm, change) => { if (change.origin !== "setValue") changed(); });
736
736
  editor.on("inputRead", (cm, change) => { if (/\w/.test(change.text.join("")) && state.diagnostic && state.diagnostic.expected.length) complete(); });
737
737
 
738
- // The board: the chapter as event-storming notes, one lane per aggregate, read from the check's
738
+ // The board: the bluebook as event-storming notes, one lane per aggregate, read from the check's
739
739
  // `board`. Every action on a note is one edit of the text (see BoardEdit), applied to the editor
740
740
  // like typing, so the board never holds anything the text does not.
741
741
  const NOTE = { w: 140, h: 46, pillW: 130, pillH: 26 };
@@ -1,3 +1,4 @@
1
+ require_relative "../text"
1
2
  require "digest"
2
3
  require "json"
3
4
  require_relative "live"
@@ -36,8 +37,10 @@ module Hecks
36
37
  end
37
38
 
38
39
  # @param body [Hash] `buffers`
39
- # @return [Hash] `chapter` and `commands` (see {Live#commands}), or `error`
40
- def commands(body) = with_live(body) { |live| { chapter: live.chapter_name, commands: live.commands } }
40
+ # @return [Hash] `bluebook` and `commands` (see {Live#commands}), or `error`
41
+ def commands(body)
42
+ with_live(body) { |live| { bluebook: live.declaration_name, commands: live.commands } }
43
+ end
41
44
 
42
45
  # @param body [Hash] `buffers`, `verb`, `to` and `with`
43
46
  # @return [Hash] see {Live#dispatch}, or `error` when the text does not boot
@@ -110,7 +113,7 @@ module Hecks
110
113
  def with_live(body)
111
114
  @lock.synchronize { yield live_for(body.fetch("buffers", {})) }
112
115
  rescue StandardError, ScriptError => e
113
- { error: e.message.lines.first.to_s.chomp }
116
+ { error: Text.headline(e.message) }
114
117
  end
115
118
 
116
119
  def live_for(buffers)
@@ -1,4 +1,5 @@
1
1
  require "open3"
2
+ require_relative "../sentence_form"
2
3
 
3
4
  module Hecks
4
5
  module Composer
@@ -9,75 +10,91 @@ module Hecks
9
10
  # The repository root, where the parser's build lands under `rust/parser/target/`.
10
11
  ROOT = File.expand_path("../../..", __dir__).freeze
11
12
 
13
+ # A bluebook file's path.
14
+ BLUEBOOK_FILE = /\.bluebook\z/
15
+
16
+ # A line number: digits and nothing else.
17
+ LINE_NUMBER = /\A\d+\z/
18
+
19
+ # A column then the message, as the sentence form's refusals give them: `63: this is not`.
20
+ COLUMN_PREFIX = /\A(\d+): (.*)\z/m
21
+
22
+ # A message ending in `(expected one of: a, b)`, capturing the message and the list.
23
+ EXPECTED_SUFFIX = /\A(.*) \(expected one of: (.*)\)\z/
24
+
12
25
  # Raised when no `hecks-parse` binary can be found.
13
- class ParserMissing < StandardError; end
26
+ ParserMissing = SentenceForm::ParserMissing
14
27
 
15
28
  module_function
16
29
 
17
- # Parses every bluebook in a staged workspace, one chapter at a time.
30
+ # Parses every bluebook in a staged workspace, one bluebook at a time.
18
31
  #
19
32
  # @param stage [String] a staged directory (see {Workspace.stage})
20
33
  # @return [Hash, nil] nil when everything parses; otherwise `{file:, line:, message:,
21
34
  # expected:}` for the first refusal, with `file` relative to the stage
22
35
  # @raise [ParserMissing] if `hecks-parse` is not built
23
36
  def call(stage)
24
- bluebooks(stage).each do |chapter, files|
25
- refusal = refusal_for(stage, chapter, files)
37
+ bluebooks(stage).each do |declaration, files|
38
+ refusal = refusal_for(stage, declaration, files)
26
39
  return refusal if refusal
27
40
  end
28
41
  nil
29
42
  end
30
43
 
31
44
  # @param stage [String] a staged directory
32
- # @return [Hash{String => Array<String>}] relative bluebook paths by the chapter their
45
+ # @return [Hash{String => Array<String>}] relative bluebook paths by the bluebook their
33
46
  # header names
34
47
  def bluebooks(stage)
35
- Workspace.files(stage).grep(/\.bluebook\z/).group_by { |relative| chapter_name(File.join(stage, relative)) }
36
- .reject { |name, _| name.nil? }
48
+ bluebook_files(stage).group_by { |relative| declaration_name(File.join(stage, relative)) }
49
+ .reject { |name, _| name.nil? }
37
50
  end
38
51
 
52
+ # @api private
53
+ def bluebook_files(stage) = Workspace.files(stage).grep(BLUEBOOK_FILE)
54
+
39
55
  # @param path [String] a bluebook file
40
- # @return [String, nil] the name its `Hecks.bluebook "Name"` header declares
41
- def chapter_name(path)
42
- File.foreach(path) { |line| return Regexp.last_match(1) if line =~ /\A\s*Hecks\.bluebook\s+"([^"]+)"/ }
43
- nil
44
- end
56
+ # @return [String, nil] the name its `Hecks.bluebook "Name"` or `Domain: name` header declares
57
+ def declaration_name(path) = SentenceForm.declaration_name(path)
45
58
 
46
59
  # @api private
47
- def refusal_for(stage, chapter, files)
60
+ def refusal_for(stage, declaration, files)
48
61
  paths = files.map { |relative| File.join(stage, relative) }
49
- _out, err, status = Open3.capture3(binary, "chapter", "--chapter", chapter, *paths)
62
+ _out, err, status = Open3.capture3(binary, "bluebook", "--bluebook", declaration, *paths)
50
63
  return nil if status.success?
51
64
 
52
- diagnostic(err.lines.first.to_s.chomp, stage)
65
+ first_line = err.lines.first
66
+ diagnostic(first_line.to_s.chomp, stage)
53
67
  end
54
68
 
55
- # Reads `<file>:<line>: <message>` with an optional `(expected one of: a, b, c)` suffix.
69
+ # Reads `<file>:<line>: <message>`, or `<file>:<line>:<column>: <message>` for a file written
70
+ # as sentences, with an optional `(expected one of: a, b, c)` suffix.
56
71
  # @api private
57
72
  def diagnostic(line, stage)
58
- rest = line.delete_prefix("#{stage}/")
59
- file, number, message = rest.split(":", 3)
60
- return { file: nil, line: nil, message: line, expected: [] } unless number.to_s.strip.match?(/\A\d+\z/)
61
-
62
- message = message.to_s.strip
63
- expected = []
64
- if (found = message.match(/\A(.*) \(expected one of: (.*)\)\z/))
65
- message = found[1]
66
- expected = found[2].split(", ")
67
- end
68
- { file: file, line: number.to_i, message: message, expected: expected }
73
+ file, number, message = line.delete_prefix("#{stage}/").split(":", 3)
74
+ return { file: nil, line: nil, column: nil, message: line, expected: [] } unless number.to_s.strip.match?(LINE_NUMBER)
75
+
76
+ column, message = split_column(message.to_s.strip)
77
+ message, expected = split_expected(message)
78
+ { file: file, line: number.to_i, column: column, message: message, expected: expected }
69
79
  end
70
80
 
71
- # @return [String] the path to `hecks-parse`: `HECKS_PARSE_BIN`, then the release or debug
72
- # build under `rust/parser/target/`
73
- # @raise [ParserMissing] if none exists
74
- def binary
75
- candidates = [ENV.fetch("HECKS_PARSE_BIN", nil)] +
76
- %w[release debug].map { |profile| File.join(ROOT, "rust/parser/target/#{profile}/hecks-parse") }
77
- candidates.compact.find { |path| File.executable?(path) } or
78
- raise ParserMissing, "hecks-parse is not built — run `cargo build --release " \
79
- "--manifest-path rust/parser/Cargo.toml`"
81
+ # @param message [String] a diagnostic's text after the line number
82
+ # @return [Array(Integer, String), Array(nil, String)] the column it names, and the rest
83
+ def split_column(message)
84
+ positioned = message.match(COLUMN_PREFIX)
85
+ positioned ? [positioned[1].to_i, positioned[2]] : [nil, message]
80
86
  end
87
+
88
+ # @param message [String] a diagnostic's text with its column taken off
89
+ # @return [Array(String, Array<String>)] the message, and the phrases that would have fitted
90
+ def split_expected(message)
91
+ found = message.match(EXPECTED_SUFFIX)
92
+ found ? [found[1], found[2].split(", ")] : [message, []]
93
+ end
94
+
95
+ # @return [String] the path to `hecks-parse`; see {SentenceForm.binary}
96
+ # @raise [ParserMissing] if none exists
97
+ def binary = SentenceForm.binary
81
98
  end
82
99
  end
83
100
  end
@@ -4,36 +4,39 @@ require_relative "plain"
4
4
 
5
5
  module Hecks
6
6
  module Composer
7
- # The editor's own bookkeeping, held in memory: one Composer chapter booted for the life of the
8
- # server, with a `Draft` per chapter being edited. The files on disk stay the truth; the draft
7
+ # The editor's own bookkeeping, held in memory: one Composer bluebook booted for the life of the
8
+ # server, with a `Draft` per bluebook being edited. The files on disk stay the truth; the draft
9
9
  # keeps the text last seen, the conversation about it, and what its last check said, so the
10
10
  # page can show a history and an agent's turns survive a refresh.
11
11
  class Session
12
- CHAPTER_DIR = File.expand_path("bluebook", __dir__).freeze
12
+ BLUEBOOK_DIR = File.expand_path("bluebook", __dir__).freeze
13
13
  VERB = "Composer::Draft".freeze
14
14
 
15
- # @return [Runtime::Dispatcher] the booted Composer chapter
15
+ # A `Hecks.<construct> "Name"` header, capturing the bluebook's name.
16
+ BLUEBOOK_DECLARATION = /Hecks\.\w+\s+"([A-Z][A-Za-z0-9]*)"/
17
+
18
+ # @return [Runtime::Dispatcher] the booted Composer bluebook
16
19
  attr_reader :runtime
17
20
 
18
- # Boots the Composer chapter, which admits only the `Web` driving adapter.
21
+ # Boots the Composer bluebook, which admits only the `Web` driving adapter.
19
22
  #
20
23
  # @raise [Adapters::Driving::Admission::Refused] if the hecksagon does not admit `Web`
21
24
  def initialize
22
- @runtime = Hecks.boot(CHAPTER_DIR, install_driving: false, environment: "memory")
25
+ @runtime = Hecks.boot(BLUEBOOK_DIR, install_driving: false, environment: "memory")
23
26
  Adapters::Driving::Admission.admit!(@runtime.registry, "Web")
24
27
  @sequence = Hash.new(0)
25
28
  end
26
29
 
27
- # Opens a draft for a chapter, or leaves an open one as it is.
30
+ # Opens a draft for a bluebook, or leaves an open one as it is.
28
31
  #
29
32
  # @param slug [String] the draft's name
30
- # @param chapter_name [String] the chapter's name
33
+ # @param bluebook_name [String] the bluebook's name
31
34
  # @param text [String] the text it starts from
32
35
  # @return [void]
33
- def open(slug:, chapter_name:, text:)
36
+ def open(slug:, bluebook_name:, text:)
34
37
  return if draft(slug)
35
38
 
36
- dispatch("Begin", slug: wrap(slug), chapter_name: wrap(chapter_name), text: wrap(text))
39
+ dispatch("Begin", slug: wrap(slug), bluebook_name: wrap(bluebook_name), text: wrap(text))
37
40
  end
38
41
 
39
42
  # Records the text now on screen.
@@ -53,10 +56,10 @@ module Hecks
53
56
  def record(path:, text:)
54
57
  return revise(slug: path, text: text) if draft(path)
55
58
 
56
- self.open(slug: path, chapter_name: chapter_name_in(text), text: text)
59
+ self.open(slug: path, bluebook_name: bluebook_name_in(text), text: text)
57
60
  end
58
61
 
59
- # The text a file has held, from the chapter's own events.
62
+ # The text a file has held, from the bluebook's own events.
60
63
  #
61
64
  # @param path [String] the file's path relative to the workspace
62
65
  # @return [Array<Hash>] `name`, `at` and `text` per recorded revision, newest first; empty
@@ -97,9 +100,9 @@ module Hecks
97
100
  end
98
101
 
99
102
  # @param slug [String] the draft's name
100
- # @return [Hash, nil] the draft as the chapter holds it, or nil when none is open
103
+ # @return [Hash, nil] the draft as the bluebook holds it, or nil when none is open
101
104
  def draft(slug)
102
- @runtime.registry.repository("Composer", aggregate).find(slug)&.then { |row| plain(row) }
105
+ drafts.find(slug)&.then { |row| plain(row) }
103
106
  rescue StandardError
104
107
  nil
105
108
  end
@@ -116,7 +119,7 @@ module Hecks
116
119
  private
117
120
 
118
121
  # @api private
119
- def chapter_name_in(text) = text[/Hecks\.\w+\s+"([A-Z][A-Za-z0-9]*)"/, 1] || "Workspace"
122
+ def bluebook_name_in(text) = text[BLUEBOOK_DECLARATION, 1] || "Workspace"
120
123
 
121
124
  # @api private
122
125
  def revision(event, path)
@@ -125,7 +128,10 @@ module Hecks
125
128
  { name: event[:name], at: event[:occurred_at], text: Plain.call(event[:payload])&.dig(:text) }
126
129
  end
127
130
 
128
- def aggregate = @runtime.registry.bluebook("Composer").aggregate("Draft")
131
+ def aggregate = @runtime.bluebook("Composer").aggregate("Draft")
132
+
133
+ # @api private
134
+ def drafts = @runtime.repository("Composer", aggregate)
129
135
 
130
136
  def dispatch(command, to: nil, **facts)
131
137
  @runtime.dispatch("#{VERB}.#{command}", to: to, with: facts)