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
@@ -67,6 +67,33 @@ module Hecks
67
67
  e.status
68
68
  end
69
69
 
70
+ # Runs the block captured and answers what it printed to stdout alone. What it printed to
71
+ # stderr (a domain's boot notices) goes on to the real stderr instead of into the answer, and
72
+ # a run that ended otherwise refuses with both.
73
+ #
74
+ # @yield the entry point to run
75
+ # @return [String] stdout when the entry point ended with status 0
76
+ # @raise [Failure] when it ended otherwise; the message is what it printed
77
+ def answer_apart(&)
78
+ out, err, status = synchronize { apart(&) }
79
+ raise Failure, (out + err).strip unless status.zero?
80
+
81
+ $stderr.write(err)
82
+ out
83
+ end
84
+
85
+ # Runs the block with each stream pointed at a buffer of its own, putting them back
86
+ # afterwards.
87
+ def apart(&)
88
+ saved = [$stdout, $stderr]
89
+ out = $stdout = StringIO.new
90
+ err = $stderr = StringIO.new
91
+ status = exit_status(&)
92
+ [out.string, err.string, status]
93
+ ensure
94
+ $stdout, $stderr = saved
95
+ end
96
+
70
97
  # Runs the block captured and answers its text, or refuses with it.
71
98
  #
72
99
  # @yield the entry point to run
@@ -5,6 +5,15 @@ module Hecks
5
5
  # The plan a write to AWS prints when it is refused unconfirmed or run with `dry_run`: what the
6
6
  # project's script would do, read from the script's own text, so nothing is run to say it.
7
7
  module DeployPlans
8
+ # The CloudFormation output a companion script reads its box's instance id from.
9
+ INSTANCE_STACK = /out\s+(\S+)\s+InstanceId/
10
+
11
+ # The Compose project a companion script names.
12
+ COMPOSE_PROJECT = /compose -p (\w+)/
13
+
14
+ # The absolute directory a companion script makes on the box.
15
+ MADE_DIRECTORY = %r{mkdir -p (/\S+)}
16
+
8
17
  module_function
9
18
 
10
19
  # What `preview.sh <action>` would do for a branch.
@@ -33,9 +42,9 @@ module Hecks
33
42
  # @param taskdef [String] the task definition its image and settings are read from
34
43
  # @return [String]
35
44
  def companion(text, companion, taskdef)
36
- stack = text[/out\s+(\S+)\s+InstanceId/, 1]
37
- project = text[/compose -p (\w+)/, 1] || companion
38
- directory = text[%r{mkdir -p (/\S+)}, 1]
45
+ stack = text[INSTANCE_STACK, 1]
46
+ project = text[COMPOSE_PROJECT, 1] || companion
47
+ directory = text[MADE_DIRECTORY, 1]
39
48
  place = directory ? " in #{directory}" : +""
40
49
  "roll #{companion} (Compose project #{project}#{place}) from task definition " \
41
50
  "#{taskdef} onto the box of stack #{stack || "<box stack>"} over SSM, beside the app's project, " \
@@ -10,6 +10,15 @@ module Hecks
10
10
  module Answers
11
11
  include Statuses
12
12
 
13
+ # The `SCHEMAS=` line of a data-copy script, capturing its default schema list.
14
+ COPY_SCHEMAS = /^SCHEMAS=(?:\$\{SCHEMAS:-)?"([^"]*)"/
15
+
16
+ # The data-copy script's database defaults, capturing the source's and the target's.
17
+ COPY_DATABASES = /^SRC_DB=\$\{SRC_DB:-([^}]*)\}; DST_DB=\$\{DST_DB:-([^}]*)\}/
18
+
19
+ # The last line of a service roll, capturing the taskdef and the tag it rolled.
20
+ ROLLED_LINE = /^==> rolled taskdef=(\S*) tag=(\S+)$/
21
+
13
22
  private
14
23
 
15
24
  # Runs the confirmed restore and answers what it printed.
@@ -55,7 +64,7 @@ module Hecks
55
64
  report = BluebookReport.new(File.read(File.expand_path(old)), File.read(File.expand_path(new)))
56
65
  diff_answer(report.changed? ? "changed" : "unchanged", report.text)
57
66
  rescue SystemCallError, JSON::ParserError, TypeError, KeyError => e
58
- diff_answer("unavailable", "bluebooks: could not compare #{old} and #{new} (#{e.message.lines.first.strip})")
67
+ diff_answer("unavailable", "bluebooks: could not compare #{old} and #{new} (#{Text.first_line(e.message)})")
59
68
  end
60
69
 
61
70
  # The script reads the registry and the local image; its report says what it found.
@@ -65,7 +74,7 @@ module Hecks
65
74
 
66
75
  diff_answer(text.include?("no bluebook changes.") ? "unchanged" : "changed", text)
67
76
  rescue ConsoleCapture::Failure => e
68
- diff_answer("unavailable", "bluebooks: #{e.message.lines.first.strip}; nothing to compare.")
77
+ diff_answer("unavailable", "bluebooks: #{Text.first_line(e.message)}; nothing to compare.")
69
78
  end
70
79
 
71
80
  def diff_answer(outcome, text) = { outcome: { value: outcome }, report: { value: text } }
@@ -92,7 +101,7 @@ module Hecks
92
101
  # Its schemas are the default of the `SCHEMAS=${SCHEMAS:-"..."}` line (overridable).
93
102
  def copy_plan(script, held)
94
103
  text = File.read(script)
95
- schemas = text[/^SCHEMAS=(?:\$\{SCHEMAS:-)?"([^"]*)"/, 1].to_s.split.join(", ")
104
+ schemas = text[COPY_SCHEMAS, 1].to_s.split.join(", ")
96
105
  source_db, target_db = copy_databases(text, held)
97
106
  drop = plain(held[:force]) == true ? "; force=true drops each target schema first" : ""
98
107
  "copy schemas #{schemas} from database #{source_db} on #{plain(held[:source])} into database " \
@@ -102,7 +111,7 @@ module Hecks
102
111
 
103
112
  # The source and target databases: the record's, else the script's defaults.
104
113
  def copy_databases(text, held)
105
- databases = text.match(/^SRC_DB=\$\{SRC_DB:-([^}]*)\}; DST_DB=\$\{DST_DB:-([^}]*)\}/)
114
+ databases = text.match(COPY_DATABASES)
106
115
  [database(held[:source_db]) || databases&.[](1), database(held[:target_db]) || databases&.[](2)]
107
116
  end
108
117
 
@@ -133,7 +142,7 @@ module Hecks
133
142
 
134
143
  # The taskdef and tag a service roll's last line names.
135
144
  def rolled(text)
136
- match = text.match(/^==> rolled taskdef=(\S*) tag=(\S+)$/)
145
+ match = text.match(ROLLED_LINE)
137
146
  { taskdef: wrapped(match&.[](1)), tag: wrapped(match&.[](2)) }
138
147
  end
139
148
  end
@@ -16,6 +16,9 @@ module Hecks
16
16
  def initialize(name, label, statuses, args = [], answering = []) = super
17
17
  end
18
18
 
19
+ # A path inside installed or vendored code, or git's own directory.
20
+ VENDORED_PATH = %r{/(node_modules|vendor|\.git)/}
21
+
19
22
  private
20
23
 
21
24
  # Runs one generated script, found for the record's project, from its own directory. Answers
@@ -26,7 +29,7 @@ module Hecks
26
29
  report = printed(result)
27
30
  return { report: { value: report } } if result.ok?
28
31
 
29
- answer_or_refuse(script, result.status.exitstatus, report)
32
+ answer_or_refuse(script, result.exit_code, report)
30
33
  end
31
34
 
32
35
  # What the script printed to either stream, trimmed.
@@ -47,7 +50,7 @@ module Hecks
47
50
  beside = File.join(root, name)
48
51
  return beside if File.file?(beside)
49
52
 
50
- found = Dir.glob(File.join(root, "**", name)).grep_v(%r{/(node_modules|vendor|\.git)/})
53
+ found = Dir.glob(File.join(root, "**", name)).grep_v(VENDORED_PATH)
51
54
  return found.first if found.one?
52
55
 
53
56
  raise ConsoleCapture::Failure, ambiguity(name, root, found.sort)
@@ -87,7 +90,7 @@ module Hecks
87
90
 
88
91
  def message_of(result)
89
92
  text = [result.err, result.out].map(&:strip).reject(&:empty?).join("\n")
90
- text.empty? ? "the tool ended with status #{result.status.exitstatus}" : text
93
+ text.empty? ? "the tool ended with status #{result.exit_code}" : text
91
94
  end
92
95
  end
93
96
  end
@@ -70,12 +70,12 @@ module Hecks
70
70
  # @raise [ConsoleCapture::Failure] when the tree is not a checkout, or the linter found a
71
71
  # violation; the message is its report
72
72
  def scan(**held)
73
- paths = plain(held[:makefiles]).to_s.split(",").map(&:strip).reject(&:empty?)
73
+ paths = Text.comma_list(plain(held[:makefiles]))
74
74
  { report: { value: child(:lint, paths).dig(:output, :value) } }
75
75
  end
76
76
 
77
77
  # Projects each domain's OIDC client and scope manifest into its `oidc.json`, or into one
78
- # `<chapter>.oidc.json` for each chapter of a directory that holds several, through
78
+ # `<bluebook>.oidc.json` for each bluebook of a directory that holds several, through
79
79
  # `hecks deploy oidc_manifest.project_oidc`.
80
80
  #
81
81
  # @param held [Hash] the `OidcManifest` record: `domains` (comma separated directories; every
@@ -83,7 +83,7 @@ module Hecks
83
83
  # @return [Hash{Symbol => Hash}] `output:` one line per manifest written or skipped
84
84
  # @raise [ConsoleCapture::Failure] when the tree is not a checkout
85
85
  def manifest(**held)
86
- domains = plain(held[:domains]).to_s.split(",").map(&:strip).reject(&:empty?)
86
+ domains = Text.comma_list(plain(held[:domains]))
87
87
  child(:manifest, domains)
88
88
  end
89
89
 
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hecks
4
+ module Adapters
5
+ class DesktopAlert
6
+ # One alert, and the program that shows it on this machine: `terminal-notifier` where it is
7
+ # installed, since clicking its alert opens the link; else `osascript` on macOS, whose alert
8
+ # opens Script Editor when clicked; else `notify-send`.
9
+ #
10
+ # @!attribute [r] title
11
+ # @return [String] the alert's first line
12
+ # @!attribute [r] subtitle
13
+ # @return [String] the line beneath it
14
+ # @!attribute [r] body
15
+ # @return [String] the rest
16
+ # @!attribute [r] link
17
+ # @return [String, nil] what clicking the alert opens
18
+ Alert = Struct.new(:title, :subtitle, :body, :link, keyword_init: true) do
19
+ # Shows the alert with the first program this machine has.
20
+ #
21
+ # @param shell [Shell] the adapter the program runs through
22
+ # @return [Shell::Result] how the last program tried ended; 127 when none is installed
23
+ def show(shell)
24
+ shown = shell.capture(*notifier)
25
+ status = shown.status
26
+ return shown unless status.exitstatus == 127
27
+
28
+ shell.capture(*fallback)
29
+ end
30
+
31
+ private
32
+
33
+ def notifier
34
+ ["terminal-notifier", "-title", title, "-subtitle", subtitle, "-message", body.empty? ? subtitle : body,
35
+ "-group", title, "-sound", "Glass", *(["-open", link] if link)]
36
+ end
37
+
38
+ def fallback
39
+ return ["notify-send", title, "#{subtitle}\n#{body}"] unless RUBY_PLATFORM.include?("darwin")
40
+
41
+ ["osascript", "-e", "display notification #{quoted(body)} with title #{quoted(title)} " \
42
+ "subtitle #{quoted(subtitle)} sound name \"Glass\""]
43
+ end
44
+
45
+ # An AppleScript string literal.
46
+ def quoted(text) = "\"#{text.gsub(/[\\"]/) { |char| "\\#{char}" }}\""
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,7 @@
1
+ # Required by name, not relative to this file: a fuzz or model check boots a copy of this directory,
2
+ # and the implementation must load once, from `lib/`, not from the copy.
3
+ require "hecks/hecks/adapters/desktop_alert"
4
+
5
+ Hecks.adapter "DesktopAlert" do
6
+ port "Alerts"
7
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "shell"
4
+ require_relative "console_capture"
5
+ require_relative "git"
6
+ require_relative "desktop_alert/alert"
7
+
8
+ module Hecks
9
+ module Adapters
10
+ # The `Alerts` port's adapter: says on the operator's desktop that a pushed branch is ready to
11
+ # deploy. A machine with neither a notifier nor `osascript` refuses, and the push it announces
12
+ # stands.
13
+ #
14
+ # The alert reads at a glance: the repository and "ready to deploy" as its title, the branch,
15
+ # commit and how many commits went out beneath it, and the newest commits' subjects as its body.
16
+ # Clicking it opens the branch's runs on GitHub when the remote is a GitHub repository.
17
+ class DesktopAlert
18
+ # How many commit subjects the body lists.
19
+ SUBJECTS = 3
20
+
21
+ # A GitHub remote's owner and repository, over HTTPS or SSH.
22
+ GITHUB = %r{github\.com[:/]([^/]+)/(.+?)(?:\.git)?/?\z}
23
+
24
+ # How many commits a push report says went out, captured.
25
+ COMMIT_COUNT = /(\d+) commit/
26
+
27
+ # Accepts the arguments every driven adapter is built with and keeps none of them.
28
+ #
29
+ # @param aggregate [Object, nil] unused
30
+ # @param settings [Hash] unused
31
+ # @param root [String, nil] unused
32
+ def initialize(aggregate: nil, settings: {}, root: nil)
33
+ @shell = Shell.new
34
+ @git = Git.new
35
+ end
36
+
37
+ # Shows that a branch was pushed and a deploy is ready.
38
+ #
39
+ # @param held [Hash] the `PushTrain` record: `checkout`, `branch`, `remote`, `pushed` and
40
+ # `report`
41
+ # @return [Hash{Symbol => Hash}] `report:` the alert's title and subtitle
42
+ # @raise [ConsoleCapture::Failure] when no desktop alert could be shown
43
+ def announce(**held)
44
+ alert = Alert.new(title: title(held), subtitle: subtitle(held), body: body(held), link: runs(held))
45
+ shown = alert.show(@shell)
46
+ raise ConsoleCapture::Failure, "no desktop alert was shown: #{shown.err.strip}" unless shown.ok?
47
+
48
+ { report: { value: "#{alert.title}: #{alert.subtitle}" } }
49
+ end
50
+
51
+ private
52
+
53
+ # Named by its GitHub repository, else by the main checkout's directory: a boarding is often
54
+ # made from a worktree, whose directory says nothing about the repository.
55
+ def title(held)
56
+ owner_and_name = github(held)
57
+ "#{owner_and_name ? owner_and_name.last : main_checkout(held)} is ready to deploy"
58
+ end
59
+
60
+ def main_checkout(held)
61
+ common = git(held, "rev-parse", "--path-format=absolute", "--git-common-dir")
62
+ File.basename(common.ok? ? File.dirname(common.out.strip) : plain(held[:checkout]))
63
+ end
64
+
65
+ def subtitle(held)
66
+ went_out = plain(held[:report]).to_s[COMMIT_COUNT, 1]
67
+ "#{plain(held[:remote])}/#{plain(held[:branch])} at #{plain(held[:pushed])[0, 7]}" \
68
+ "#{" · #{went_out} new" if went_out}"
69
+ end
70
+
71
+ def body(held)
72
+ listed = git(held, "log", "-#{SUBJECTS}", "--format=%s", plain(held[:pushed]))
73
+ listed.ok? ? bullets(listed.out) : ""
74
+ end
75
+
76
+ # Each line of `text` as a bullet.
77
+ def bullets(text) = text.lines.map { |line| "• #{line.strip}" }.join("\n")
78
+
79
+ # The branch's runs on GitHub, newest first, or nil for a remote that is not on GitHub.
80
+ def runs(held)
81
+ owner, name = github(held)
82
+ "https://github.com/#{owner}/#{name}/actions?query=branch%3A#{plain(held[:branch])}" if owner
83
+ end
84
+
85
+ # The remote's GitHub owner and repository, or nil.
86
+ def github(held)
87
+ url = git(held, "remote", "get-url", plain(held[:remote]))
88
+ return unless url.ok?
89
+
90
+ remote = url.out.strip
91
+ remote.match(GITHUB)&.captures
92
+ end
93
+
94
+ def git(held, *) = @git.capture(*, chdir: plain(held[:checkout]))
95
+
96
+ def plain(argument) = argument.is_a?(Hash) ? argument[:value] : argument
97
+ end
98
+ end
99
+ end
@@ -19,6 +19,9 @@ module Hecks
19
19
  # The environment variable that names the repository when no setting does.
20
20
  REPOSITORY_VARIABLE = "HECKS_FINDINGS_REPO"
21
21
 
22
+ # The end of an issue's URL, capturing its number.
23
+ ISSUE_NUMBER = %r{/issues/(\d+)\z}
24
+
22
25
  # @param aggregate [Object, nil] unused
23
26
  # @param settings [Hash] `repository:` names the `owner/name` to drive
24
27
  # @param root [String, nil] unused
@@ -35,7 +38,7 @@ module Hecks
35
38
  # issue URL
36
39
  def open_issue(**held)
37
40
  out = gh("issue", "create", "--title", plain(held[:title]).to_s, "--body", plain(held[:body]).to_s)
38
- number = out.lines.last.to_s.strip[%r{/issues/(\d+)\z}, 1]
41
+ number = Text.last_lines(out, 1)[ISSUE_NUMBER, 1]
39
42
  raise Error, "gh issue create printed no issue URL: #{out.strip.inspect}" unless number
40
43
 
41
44
  { issue_number: { value: number.to_i } }
@@ -4,10 +4,10 @@ require_relative "../../adapters/driving/json"
4
4
 
5
5
  module Hecks
6
6
  module Adapters
7
- # Gives a booted domain its first administrator through the chapter that provides
7
+ # Gives a booted domain its first administrator through the bluebook that provides
8
8
  # `"membership"`, the way a project's hand-written bootstrap script does.
9
9
  #
10
- # The chapter names its own verbs (`provides "membership", admit:, grant:, people:`), so no
10
+ # The bluebook names its own verbs (`provides "membership", admit:, grant:, people:`), so no
11
11
  # aggregate is recognised by name. Both dispatches run as a caller that asserts the role the
12
12
  # command is gated to and binds no `actor_id`: Governance checks an identified caller against
13
13
  # its role assignments, which a domain with no administrator cannot have yet, and checks an
@@ -17,10 +17,16 @@ module Hecks
17
17
  # The roles that count as an administrator besides the one the grant command is gated to.
18
18
  OWNER_ROLES = %w[Owner].freeze
19
19
 
20
- # What the refusal says when no chapter provides membership: the line to add to one.
21
- NO_MEMBERSHIP = "this domain attaches no chapter that provides \"membership\". Add a line like " \
20
+ # An email address: one `@` with no whitespace on either side.
21
+ EMAIL = /\A[^\s@]+@[^\s@]+\z/
22
+
23
+ # The part of an email address before its `@`.
24
+ LOCAL_PART = /\A[^@]+/
25
+
26
+ # What the refusal says when no bluebook provides membership: the line to add to one.
27
+ NO_MEMBERSHIP = "this domain attaches no bluebook that provides \"membership\". Add a line like " \
22
28
  "`provides \"membership\", admit: \"Person.Admit\", grant: \"Person.GrantAccess\", " \
23
- "people: \"Person.All\"` to the chapter that keeps who may sign in: admit and grant " \
29
+ "people: \"Person.All\"` to the bluebook that keeps who may sign in: admit and grant " \
24
30
  "name its commands (the grant command is gated to the administrator role), people " \
25
31
  "names the query that lists everyone (docs/running-a-rules-service.md)"
26
32
 
@@ -49,7 +55,7 @@ module Hecks
49
55
  # @param name [String, nil] their name; the part of the email before the `@` when nil
50
56
  # @param role [String, nil] the role to grant; the one the grant command is gated to when nil
51
57
  # @return [Result] what was done
52
- # @raise [Runtime::NotFound] when the domain has no membership chapter, the email is not an
58
+ # @raise [Runtime::NotFound] when the domain has no membership bluebook, the email is not an
53
59
  # email, or an administrator already exists
54
60
  def call(email:, name: nil, role: nil)
55
61
  raise Runtime::NotFound, "#{email.inspect} is not an email address" unless email?(email)
@@ -58,14 +64,14 @@ module Hecks
58
64
  verbs, gate, people = check_unadministered(provider)
59
65
 
60
66
  admitted = people.none? { |person| person[:email] == email }
61
- admit(provider, verbs.fetch(:admit), email, name || email[/\A[^@]+/]) if admitted
67
+ admit(provider, verbs.fetch(:admit), email, name || email[LOCAL_PART]) if admitted
62
68
  grant(provider, verbs.fetch(:grant), email, role || gate)
63
69
  Result.new(email: email, role: role || gate, admitted: admitted)
64
70
  end
65
71
 
66
72
  private
67
73
 
68
- def email?(email) = email.to_s.match?(/\A[^\s@]+@[^\s@]+\z/)
74
+ def email?(email) = email.to_s.match?(EMAIL)
69
75
 
70
76
  # The membership verbs, the role the grant is gated to and the people held, once no
71
77
  # administrator is found among them.
@@ -78,7 +84,8 @@ module Hecks
78
84
  end
79
85
 
80
86
  def membership_provider
81
- domain = @registry.bluebooks.values.first&.name
87
+ bluebook = @registry.first_bluebook
88
+ domain = bluebook&.name
82
89
  @registry.membership_provider_for(domain) or
83
90
  raise Runtime::NotFound, NO_MEMBERSHIP
84
91
  end
@@ -39,18 +39,18 @@ module Hecks
39
39
  # Vendors one package of the bluebook registry into a project, pinned to a release or a
40
40
  # commit, through `Hecks::EmbryonautBluebook::VendorCli`.
41
41
  #
42
- # The source is `from`, else `EMBRYONAUT_BLUEBOOKS_SRC`; the project is `root`, else the
43
- # current directory. `ALLOW_DOWNGRADE=1` lets an older release through, as for the script.
42
+ # The source is `from`, else `EMBRYONAUT_BLUEBOOKS_SRC`, else the `embryonaut_bluebooks`
43
+ # checkout beside the project; the project is `root`, else the current directory.
44
+ # `ALLOW_DOWNGRADE=1` lets an older release through, as for the script.
44
45
  #
45
46
  # @param held [Hash] the `Package` record: `package` (`name` or `name@version-or-commit`),
46
47
  # `from` and `root`
47
- # @return [Hash{Symbol => Hash}] `report:` what was vendored and whether its storage shape
48
- # changed
48
+ # @return [Hash{Symbol => Hash}] `report:` what was vendored and whether its shape changed
49
49
  # @raise [ConsoleCapture::Failure] when the source is not a git repository, or the vendoring
50
50
  # was refused (no such release, a downgrade, an era-breaking shape change)
51
51
  def pin(**held)
52
- from = plain(held[:from]) || ENV.fetch("EMBRYONAUT_BLUEBOOKS_SRC", nil)
53
52
  root = plain(held[:root]) || Dir.pwd
53
+ from = plain(held[:from]) || EmbryonautBluebook::VendorCli.default_source(root)
54
54
  require_repository!(from)
55
55
 
56
56
  { report: { value: vendored(held[:package], from, root) } }
@@ -0,0 +1,7 @@
1
+ # Required by name, not relative to this file: a fuzz or model check boots a copy of this directory,
2
+ # and the implementation must load once, from `lib/`, not from the copy.
3
+ require "hecks/hecks/adapters/git_checkout"
4
+
5
+ Hecks.adapter "GitCheckout" do
6
+ port "Reading"
7
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "git_worktrees"
4
+
5
+ module Hecks
6
+ module Adapters
7
+ # The `Reading` port's adapter for `Checkout`: answers what state a checkout is in, as text,
8
+ # so nothing needs a raw `git status`, `git diff` or `git log`. It reads and never writes.
9
+ #
10
+ # Every query takes `checkout`, a directory inside the repository (the current directory when
11
+ # absent), and answers `text:`; a refusal is a `Runtime::NotFound`.
12
+ class GitCheckout
13
+ include GitWorktrees
14
+
15
+ # How many commits `log` prints when it is given no range.
16
+ RECENT = 20
17
+
18
+ # A commit range as git writes one: names joined by `..` or `...`, never an option.
19
+ RANGE = %r{\A[0-9A-Za-z_][0-9A-Za-z_./^~@{}-]*\z}
20
+
21
+ # Accepts the arguments every driven adapter is built with and keeps none of them.
22
+ #
23
+ # @param aggregate [Object, nil] unused
24
+ # @param settings [Hash] unused
25
+ # @param root [String, nil] unused
26
+ def initialize(aggregate: nil, settings: {}, root: nil)
27
+ @git = Git.new
28
+ end
29
+
30
+ # The branch, whether the checkout is a linked worktree, where it stands against local
31
+ # `main` and `origin/main`, and each changed or untracked path.
32
+ #
33
+ # @param held [Hash] `checkout`
34
+ # @return [Hash{Symbol => String}] `text:` one `name: value` line each, then the paths
35
+ # @raise [Runtime::NotFound] when the checkout is not a repository
36
+ def status(**held)
37
+ answering(held) do
38
+ lines = ["branch: #{read("rev-parse", "--abbrev-ref", "HEAD")}", "head: #{short(read("rev-parse", "HEAD"))}",
39
+ "worktree: #{linked? ? "linked" : "primary"} (#{@checkout})",
40
+ standing("main"), standing("origin/main")].compact
41
+ changed = dirty
42
+ lines << (changed.empty? ? "clean" : "changed:") << changed.map { |line| " #{line}" }
43
+ lines.flatten.join("\n")
44
+ end
45
+ end
46
+
47
+ # What a checkout changed since a ref: the diffstat, or the paths alone.
48
+ #
49
+ # @param held [Hash] `checkout`; `since` (a ref, default `main`); `names_only` (true for the
50
+ # paths alone, not the diffstat)
51
+ # @return [Hash{Symbol => String}] `text:` the diffstat, or one path per line
52
+ # @raise [Runtime::NotFound] when the checkout or the ref is not found
53
+ def changes(**held)
54
+ answering(held) do
55
+ since = ref(plain(held[:since]) || "main")
56
+ flag = plain(held[:names_only]).to_s == "true" ? "--name-only" : "--stat"
57
+ read("diff", flag, read("merge-base", since, "HEAD"))
58
+ end
59
+ end
60
+
61
+ # The commits in a range, newest first, one `short-sha subject` line each.
62
+ #
63
+ # @param held [Hash] `checkout`; `range` (default: the last 20 commits)
64
+ # @return [Hash{Symbol => String}] `text:` the commits
65
+ # @raise [Runtime::NotFound] when the checkout or the range is not found
66
+ def log(**held)
67
+ answering(held) do
68
+ range = plain(held[:range])
69
+ read("log", "--format=%h %s", *(range ? [checked_range(range)] : ["-n", RECENT.to_s]))
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def answering(held)
76
+ settle(held)
77
+ { text: "#{yield}\n" }
78
+ rescue ConsoleCapture::Failure => e
79
+ raise Runtime::NotFound, e.message
80
+ end
81
+
82
+ def linked? = primary.path != @checkout
83
+
84
+ # How far `HEAD` is ahead of and behind a ref, or nil when the repository has no such ref.
85
+ def standing(other)
86
+ return nil unless @git.capture("rev-parse", "--verify", "--quiet", other, chdir: @checkout).ok?
87
+
88
+ behind, ahead = read("rev-list", "--left-right", "--count", "#{other}...HEAD").split.map(&:to_i)
89
+ "#{other}: ahead #{ahead}, behind #{behind}"
90
+ end
91
+
92
+ def checked_range(range)
93
+ return range if range.match?(RANGE)
94
+
95
+ raise ConsoleCapture::Failure, "#{range.inspect} is not a commit range"
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tmpdir"
4
+ require_relative "../git_worktrees"
5
+
6
+ module Hecks
7
+ module Adapters
8
+ class GitLanding
9
+ # One landing: a branch merged onto another, fast-forward when it can be and as a merge commit
10
+ # when it cannot, in the worktree that has the target checked out, else in a temporary one.
11
+ #
12
+ # It never forces anything, never pushes, and never settles a conflict: a merge that conflicts
13
+ # is aborted and refused, naming the paths in conflict, with every branch as it was.
14
+ class Merger
15
+ include GitWorktrees
16
+
17
+ # @param git [Git] the adapter every git call goes through
18
+ # @param checkout [String] the repository's top level the branch is in
19
+ # @param branch [String] the branch to land
20
+ # @param onto [String] the branch to land it on
21
+ def initialize(git, checkout, branch:, onto:)
22
+ @git = git
23
+ @checkout = checkout
24
+ @branch = ref(branch)
25
+ @onto = ref(onto)
26
+ end
27
+
28
+ # @return [Hash{Symbol => Hash}] `outcome:` (`current`, `fast_forwarded` or `merged`),
29
+ # `checkout:`, `branch:`, `landed:` (the commit the target names now) and `report:`
30
+ # @raise [ConsoleCapture::Failure] when the merge conflicts, or a tree holds
31
+ # uncommitted work
32
+ def land
33
+ tip = branch_tip(@branch)
34
+ before = branch_tip(@onto)
35
+ return answer("current", before, "#{@branch} is already on #{@onto}") if ancestor?(tip, before)
36
+
37
+ host = worktree_on(@onto)
38
+ outcome, landed = host ? integrate(host.path, before) : in_temporary_tree(before)
39
+ answer(outcome, landed, "#{@branch} #{outcome.tr("_", " ")} onto #{@onto} at #{short(landed)}")
40
+ end
41
+
42
+ private
43
+
44
+ def in_temporary_tree(before)
45
+ Dir.mktmpdir("hecks-landing") do |dir|
46
+ tree = File.join(dir, "tree")
47
+ read("worktree", "add", "--detach", tree, before)
48
+ outcome, landed = integrate(tree, before)
49
+ read("update-ref", "refs/heads/#{@onto}", landed, before)
50
+ [outcome, landed]
51
+ ensure
52
+ @git.capture("worktree", "remove", "--force", tree, chdir: @checkout)
53
+ end
54
+ end
55
+
56
+ def integrate(dir, before)
57
+ changed = dirty(dir)
58
+ raise ConsoleCapture::Failure, "#{dir} holds uncommitted work: #{changed.join(", ")}" unless changed.empty?
59
+
60
+ outcome = ancestor?(before, branch_tip(@branch)) ? fast_forward(dir) : merge_commit(dir)
61
+ [outcome, read("rev-parse", "HEAD", dir: dir)]
62
+ end
63
+
64
+ def fast_forward(dir)
65
+ read("merge", "--ff-only", @branch, dir: dir)
66
+ "fast_forwarded"
67
+ end
68
+
69
+ def merge_commit(dir)
70
+ result = @git.capture("merge", "--no-ff", "--no-edit", @branch, chdir: dir)
71
+ return "merged" if result.ok?
72
+
73
+ conflicts = @git.capture("diff", "--name-only", "--diff-filter=U", chdir: dir).out.split
74
+ @git.capture("merge", "--abort", chdir: dir)
75
+ raise ConsoleCapture::Failure, "merging #{@branch} into #{@onto} conflicts in #{conflicts.join(", ")}; nothing changed"
76
+ end
77
+
78
+ def answer(outcome, landed, report)
79
+ { outcome: { value: outcome }, checkout: { value: @checkout }, branch: { value: @branch },
80
+ landed: { value: landed }, report: { value: report } }
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,7 @@
1
+ # Required by name, not relative to this file: a fuzz or model check boots a copy of this directory,
2
+ # and the implementation must load once, from `lib/`, not from the copy.
3
+ require "hecks/hecks/adapters/git_landing"
4
+
5
+ Hecks.adapter "GitLanding" do
6
+ port "Worktrees"
7
+ end