hecks 2.9.0 → 3.0.1

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 (600) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +51 -6
  3. data/lib/hecks/adapters/driven/heki/journal.rb +1 -1
  4. data/lib/hecks/adapters/driven/lambda/client.rb +1 -1
  5. data/lib/hecks/adapters/driven/lambda.rb +1 -1
  6. data/lib/hecks/adapters/driven/memory.rb +16 -3
  7. data/lib/hecks/adapters/driven/postgres/reconnect.rb +6 -2
  8. data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
  9. data/lib/hecks/adapters/driven/postgres.rb +13 -4
  10. data/lib/hecks/adapters/driven/prism.rb +41 -8
  11. data/lib/hecks/adapters/driven/tenant_provisioner.rb +73 -16
  12. data/lib/hecks/behaviors/expectations.rb +1 -1
  13. data/lib/hecks/behaviors.rb +1 -1
  14. data/lib/hecks/bench/cli.rb +62 -0
  15. data/lib/hecks/bench/environment.rb +71 -0
  16. data/lib/hecks/bench/postgres_probe.rb +30 -0
  17. data/lib/hecks/bench/report.rb +76 -0
  18. data/lib/hecks/bench/ruby_runner.rb +93 -0
  19. data/lib/hecks/bench/run.rb +55 -0
  20. data/lib/hecks/bench/rust_runner.rb +101 -0
  21. data/lib/hecks/bench/stats.rb +46 -0
  22. data/lib/hecks/bench/suite.rb +98 -0
  23. data/lib/hecks/bench/workload.rb +89 -0
  24. data/lib/hecks/bench.rb +17 -0
  25. data/lib/hecks/bluebook/assembly/contracts.rb +2 -0
  26. data/lib/hecks/bluebook/attribute.rb +1 -1
  27. data/lib/hecks/bluebook/behaviour/aggregate.rb +30 -1
  28. data/lib/hecks/bluebook/behaviour/domain_port.rb +7 -0
  29. data/lib/hecks/bluebook/chapter.rb +6 -2
  30. data/lib/hecks/bluebook/domain_port.rb +36 -5
  31. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +10 -0
  32. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +8 -0
  33. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -1
  34. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +31 -3
  35. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +122 -3
  36. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +1 -1
  37. data/lib/hecks/bluebook/dsl/query_builder.rb +27 -1
  38. data/lib/hecks/bluebook/dsl/rule_reference.rb +1 -1
  39. data/lib/hecks/bluebook/dsl/world_builder.rb +29 -2
  40. data/lib/hecks/bluebook/expression/canonical_form.rb +1 -1
  41. data/lib/hecks/bluebook/expression/resolver.rb +3 -2
  42. data/lib/hecks/bluebook/hexagon.rb +13 -5
  43. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +1 -0
  44. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +4 -1
  45. data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
  46. data/lib/hecks/bluebook/meta_validator.rb +9 -4
  47. data/lib/hecks/bluebook/model_check.rb +23 -0
  48. data/lib/hecks/bluebook/pattern_subset.rb +38 -0
  49. data/lib/hecks/bluebook/query.rb +20 -5
  50. data/lib/hecks/bluebook/smoke_test.rb +1 -1
  51. data/lib/hecks/canonical_json.rb +30 -0
  52. data/lib/hecks/chapters.rb +102 -0
  53. data/lib/hecks/cli/behaviors.rb +61 -0
  54. data/lib/hecks/cli/canonicalise.rb +25 -0
  55. data/lib/hecks/cli/check_engine_agreement.rb +32 -0
  56. data/lib/hecks/cli/check_era.rb +88 -0
  57. data/lib/hecks/cli/console.rb +66 -0
  58. data/lib/hecks/cli/deploy_template_diff.rb +40 -0
  59. data/lib/hecks/cli/doc_coverage.rb +32 -0
  60. data/lib/hecks/cli/document.rb +2 -2
  61. data/lib/hecks/cli/expression_projection.rb +41 -0
  62. data/lib/hecks/cli/follow.rb +88 -0
  63. data/lib/hecks/cli/history.rb +44 -0
  64. data/lib/hecks/cli/ir.rb +1 -1
  65. data/lib/hecks/cli/mcp.rb +3 -3
  66. data/lib/hecks/cli/model_check.rb +15 -8
  67. data/lib/hecks/cli/pattern_cases.rb +47 -0
  68. data/lib/hecks/cli/present.rb +39 -0
  69. data/lib/hecks/cli/project_cli.rb +224 -32
  70. data/lib/hecks/cli/project_diagrams.rb +4 -3
  71. data/lib/hecks/cli/project_glossary.rb +44 -0
  72. data/lib/hecks/cli/reference.rb +46 -0
  73. data/lib/hecks/cli/refresh_projections.rb +44 -0
  74. data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +150 -0
  75. data/lib/hecks/cli/release.rb +70 -0
  76. data/lib/hecks/cli/release_gem.rb +59 -0
  77. data/lib/hecks/cli/rspec_io_parallel_files.rb +137 -0
  78. data/lib/hecks/cli/rspec_shard_files.rb +66 -0
  79. data/lib/hecks/cli/run.rb +3 -3
  80. data/lib/hecks/cli/seed_semantics_corpus.rb +71 -0
  81. data/lib/hecks/cli/serve_query_ir_mcp.rb +30 -0
  82. data/lib/hecks/cli/shape.rb +70 -0
  83. data/lib/hecks/cli/smoke_http.rb +230 -0
  84. data/lib/hecks/cli/smoke_test.rb +5 -3
  85. data/lib/hecks/cli/spec_example.rb +27 -0
  86. data/lib/hecks/cli/statements.rb +32 -0
  87. data/lib/hecks/cli/stores.rb +4 -5
  88. data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
  89. data/lib/hecks/cli.rb +201 -52
  90. data/lib/hecks/codemod.rb +324 -0
  91. data/lib/hecks/corpus.rb +423 -0
  92. data/lib/hecks/deploy/bluebook/deploy.bluebook +591 -23
  93. data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -4
  94. data/lib/hecks/deploy/oidc.json +82 -2
  95. data/lib/hecks/doc/reference.rb +351 -0
  96. data/lib/hecks/doors/cli_door.rb +196 -0
  97. data/lib/hecks/doors/cli_runner.rb +297 -0
  98. data/lib/hecks/{facade → doors}/command_request.rb +1 -1
  99. data/lib/hecks/{facade → doors}/handle.rb +2 -2
  100. data/lib/hecks/{facade → doors}/json_door.rb +4 -4
  101. data/lib/hecks/doors/launcher_options.rb +129 -0
  102. data/lib/hecks/{cli → doors}/mcp_door.rb +7 -7
  103. data/lib/hecks/doors/mcp_door_scope.rb +97 -0
  104. data/lib/hecks/{facade/surface → doors/ruby_door}/aggregate_door.rb +8 -3
  105. data/lib/hecks/{facade/surface → doors/ruby_door}/chapter.rb +3 -3
  106. data/lib/hecks/{facade/surface.rb → doors/ruby_door.rb} +36 -5
  107. data/lib/hecks/doors.rb +61 -0
  108. data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +1 -1
  109. data/lib/hecks/embryonaut_bluebook.rb +1 -1
  110. data/lib/hecks/engine_agreement.rb +156 -0
  111. data/lib/hecks/facade.rb +24 -37
  112. data/lib/hecks/forms/app.rb +6 -6
  113. data/lib/hecks/forms/banking_presentation.rb +50 -0
  114. data/lib/hecks/forms/field_shape.rb +2 -1
  115. data/lib/hecks/forms/port_argument.rb +1 -1
  116. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +393 -0
  117. data/lib/hecks/fuzzing/combination_miner.rb +86 -0
  118. data/lib/hecks/fuzzing/concurrent_dispatch.rb +214 -0
  119. data/lib/hecks/fuzzing/coverage_campaign.rb +143 -0
  120. data/lib/hecks/fuzzing/differential.rb +156 -0
  121. data/lib/hecks/fuzzing/domain_generator.rb +615 -0
  122. data/lib/hecks/fuzzing/era_boundary.rb +71 -0
  123. data/lib/hecks/fuzzing/form_census.rb +136 -0
  124. data/lib/hecks/fuzzing/generated_domain_check.rb +93 -0
  125. data/lib/hecks/fuzzing/invalid_value_generator.rb +64 -0
  126. data/lib/hecks/fuzzing/isolated_boot.rb +301 -0
  127. data/lib/hecks/fuzzing/nondeterministic.rb +51 -0
  128. data/lib/hecks/fuzzing/outside_world.rb +45 -0
  129. data/lib/hecks/fuzzing/persistence_parity.rb +102 -0
  130. data/lib/hecks/fuzzing/properties/corrections.rb +88 -0
  131. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +314 -0
  132. data/lib/hecks/fuzzing/properties/guards.rb +190 -0
  133. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +300 -0
  134. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +93 -0
  135. data/lib/hecks/fuzzing/properties/outbox.rb +89 -0
  136. data/lib/hecks/fuzzing/properties/querying.rb +175 -0
  137. data/lib/hecks/fuzzing/properties.rb +162 -0
  138. data/lib/hecks/fuzzing/qa_settings.rb +123 -0
  139. data/lib/hecks/fuzzing/replay.rb +505 -0
  140. data/lib/hecks/fuzzing/rotation_priority.rb +48 -0
  141. data/lib/hecks/fuzzing/rust_gap_manifest.rb +108 -0
  142. data/lib/hecks/fuzzing/self_consistency.rb +339 -0
  143. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +385 -0
  144. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +132 -0
  145. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +95 -0
  146. data/lib/hecks/fuzzing/sequence_generator/picker.rb +77 -0
  147. data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +109 -0
  148. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +237 -0
  149. data/lib/hecks/fuzzing/sequence_generator.rb +189 -0
  150. data/lib/hecks/fuzzing/shrinker.rb +166 -0
  151. data/lib/hecks/fuzzing/structural_skips.rb +33 -0
  152. data/lib/hecks/fuzzing/sweep_depth.rb +43 -0
  153. data/lib/hecks/fuzzing/target_capabilities.rb +163 -0
  154. data/lib/hecks/fuzzing/value_generator.rb +216 -0
  155. data/lib/hecks/fuzzing.rb +23 -0
  156. data/lib/hecks/grammar/evolve.rb +336 -0
  157. data/lib/hecks/hecks/adapters/codebase/codemods.rb +45 -0
  158. data/lib/hecks/hecks/adapters/codebase/conformance.rb +71 -0
  159. data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +202 -0
  160. data/lib/hecks/hecks/adapters/codebase/gem_registry.rb +80 -0
  161. data/lib/hecks/hecks/adapters/codebase/kernel_tables.rb +54 -0
  162. data/lib/hecks/hecks/adapters/codebase/language.rb +240 -0
  163. data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +102 -0
  164. data/lib/hecks/hecks/adapters/codebase/publishing.rb +142 -0
  165. data/lib/hecks/hecks/adapters/codebase/regeneration.rb +67 -0
  166. data/lib/hecks/hecks/adapters/codebase/release_facts.rb +90 -0
  167. data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +83 -0
  168. data/lib/hecks/hecks/adapters/codebase/secret_vault.rb +36 -0
  169. data/lib/hecks/hecks/adapters/codebase/source_tree.adapter +7 -0
  170. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +189 -0
  171. data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +71 -0
  172. data/lib/hecks/hecks/adapters/codebase/style.rb +171 -0
  173. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +55 -0
  174. data/lib/hecks/hecks/adapters/codebase/test_suite.rb +165 -0
  175. data/lib/hecks/hecks/adapters/codebase/tree.rb +111 -0
  176. data/lib/hecks/hecks/adapters/console_capture.rb +79 -0
  177. data/lib/hecks/hecks/adapters/deploy_toolchain.adapter +7 -0
  178. data/lib/hecks/hecks/adapters/deploy_toolchain.rb +108 -0
  179. data/lib/hecks/hecks/adapters/git.adapter +7 -0
  180. data/lib/hecks/hecks/adapters/git.rb +102 -0
  181. data/lib/hecks/hecks/adapters/host_http.adapter +7 -0
  182. data/lib/hecks/hecks/adapters/host_http.rb +65 -0
  183. data/lib/hecks/hecks/adapters/in_process_boot.adapter +7 -0
  184. data/lib/hecks/hecks/adapters/in_process_boot.rb +197 -0
  185. data/lib/hecks/hecks/adapters/in_process_operations.rb +202 -0
  186. data/lib/hecks/hecks/adapters/journal_store/changes.rb +143 -0
  187. data/lib/hecks/hecks/adapters/journal_store/compaction.rb +145 -0
  188. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +132 -0
  189. data/lib/hecks/hecks/adapters/journal_store/examination.rb +135 -0
  190. data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +163 -0
  191. data/lib/hecks/hecks/adapters/journal_store/readings.rb +187 -0
  192. data/lib/hecks/hecks/adapters/journal_store.adapter +7 -0
  193. data/lib/hecks/hecks/adapters/journal_store.rb +64 -0
  194. data/lib/hecks/hecks/adapters/local_files.adapter +7 -0
  195. data/lib/hecks/hecks/adapters/local_files.rb +46 -0
  196. data/lib/hecks/hecks/adapters/pg_admin.adapter +7 -0
  197. data/lib/hecks/hecks/adapters/pg_admin.rb +245 -0
  198. data/lib/hecks/hecks/adapters/process_pool.adapter +7 -0
  199. data/lib/hecks/hecks/adapters/process_pool.rb +119 -0
  200. data/lib/hecks/hecks/adapters/rust_toolchain.adapter +7 -0
  201. data/lib/hecks/hecks/adapters/rust_toolchain.rb +179 -0
  202. data/lib/hecks/hecks/adapters/rust_workspace.rb +150 -0
  203. data/lib/hecks/hecks/adapters/shell.adapter +7 -0
  204. data/lib/hecks/hecks/adapters/shell.rb +49 -0
  205. data/lib/hecks/hecks/adapters/terminal.adapter +7 -0
  206. data/lib/hecks/hecks/adapters/terminal.rb +74 -0
  207. data/lib/hecks/hecks/codebase.behaviors +172 -0
  208. data/lib/hecks/hecks/codebase.bluebook +2453 -0
  209. data/lib/hecks/hecks/context_map.hecksagon +13 -0
  210. data/lib/hecks/hecks/custodian.behaviors +179 -0
  211. data/lib/hecks/hecks/custodian.bluebook +1847 -0
  212. data/lib/hecks/hecks/deploy.behaviors +74 -0
  213. data/lib/hecks/hecks/deploy.world +12 -0
  214. data/lib/hecks/hecks/environments/memory.world +10 -0
  215. data/lib/hecks/hecks/governance.world +7 -0
  216. data/lib/hecks/hecks/hecks.behaviors +62 -0
  217. data/lib/hecks/hecks/hecks.bluebook +124 -0
  218. data/lib/hecks/hecks/hecks.hecksagon +390 -0
  219. data/lib/hecks/hecks/hecks.world +42 -0
  220. data/lib/hecks/kernel_capabilities.rb +194 -0
  221. data/lib/hecks/language/bluebook/bluebook.bluebook +11 -0
  222. data/lib/hecks/language/bluebook/query.bluebook +7 -0
  223. data/lib/hecks/language/bluebook/vocabulary.bluebook +4 -4
  224. data/lib/hecks/language/hecksagon/domain_port.bluebook +10 -0
  225. data/lib/hecks/language/hecksagon/hecksagon.bluebook +20 -0
  226. data/lib/hecks/mcp_stdio_guard.rb +2 -2
  227. data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
  228. data/lib/hecks/persistence_legacy_fixture.rb +113 -0
  229. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +8 -5
  230. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +4 -1
  231. data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +15 -2
  232. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +1 -1
  233. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +1 -1
  234. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +1 -1
  235. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +32 -15
  236. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +15 -5
  237. data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +227 -0
  238. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +1 -1
  239. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +43 -24
  240. data/lib/hecks/ports/persistence/plugins/era/translation.rb +1 -0
  241. data/lib/hecks/ports/persistence/state_codec.rb +24 -5
  242. data/lib/hecks/projection_files.rb +285 -0
  243. data/lib/hecks/projections/bootstrap_table.rb +1 -1
  244. data/lib/hecks/projections/deploy/fargate.rb +5 -5
  245. data/lib/hecks/projections/deploy/lambda.rb +43 -32
  246. data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
  247. data/lib/hecks/projections/deploy/preview/template.rb +1 -1
  248. data/lib/hecks/projections/deploy/scripts/deploy-service.sh.tmpl +1 -1
  249. data/lib/hecks/projections/deploy/scripts/expected-era.header +1 -1
  250. data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +3 -3
  251. data/lib/hecks/projections/deploy/scripts/smoke-after-deploy.sh.tmpl +1 -1
  252. data/lib/hecks/projections/deploy/shared.rb +1 -1
  253. data/lib/hecks/projections/diagrams.rb +3 -3
  254. data/lib/hecks/projections/model/deviations.rb +1 -1
  255. data/lib/hecks/projections/parser_table.rb +4 -4
  256. data/lib/hecks/projections/reference.rb +2 -3
  257. data/lib/hecks/projections/rust_vocabulary.rb +1 -1
  258. data/lib/hecks/projector/cli_projector.rb +106 -37
  259. data/lib/hecks/projector.rb +1 -1
  260. data/lib/hecks/quality_control/adapters/agent.adapter +7 -0
  261. data/lib/hecks/quality_control/adapters/agent.rb +58 -0
  262. data/lib/hecks/quality_control/adapters/angle_tools.adapter +7 -0
  263. data/lib/hecks/quality_control/adapters/angle_tools.rb +15 -0
  264. data/lib/hecks/quality_control/adapters/clearance_recorder.rb +36 -0
  265. data/lib/hecks/quality_control/adapters/clearance_tools.adapter +7 -0
  266. data/lib/hecks/quality_control/adapters/clearance_tools.rb +17 -0
  267. data/lib/hecks/quality_control/adapters/git_pr.adapter +7 -0
  268. data/lib/hecks/quality_control/adapters/git_pr.rb +226 -0
  269. data/lib/hecks/quality_control/adapters/github_checks.adapter +9 -0
  270. data/lib/hecks/quality_control/adapters/github_checks.rb +83 -0
  271. data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +56 -0
  272. data/lib/hecks/quality_control/adapters/github_issues.adapter +7 -0
  273. data/lib/hecks/quality_control/adapters/github_issues.rb +49 -0
  274. data/lib/hecks/quality_control/adapters/qa_tool.rb +59 -0
  275. data/lib/hecks/quality_control/adapters/sweep_tools.adapter +7 -0
  276. data/lib/hecks/quality_control/adapters/sweep_tools.rb +51 -0
  277. data/lib/hecks/quality_control/adapters/target_tools.adapter +7 -0
  278. data/lib/hecks/quality_control/adapters/target_tools.rb +43 -0
  279. data/lib/hecks/quality_control/cli/child.rb +45 -0
  280. data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +45 -0
  281. data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +248 -0
  282. data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +163 -0
  283. data/lib/hecks/quality_control/cli/qa_generated_domains.rb +450 -0
  284. data/lib/hecks/quality_control/cli/qa_log_bug.rb +195 -0
  285. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +220 -0
  286. data/lib/hecks/quality_control/cli/qa_open_pr.rb +305 -0
  287. data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +154 -0
  288. data/lib/hecks/quality_control/cli/qa_postgres_role.rb +159 -0
  289. data/lib/hecks/quality_control/cli/qa_pr_check.rb +232 -0
  290. data/lib/hecks/quality_control/cli/qa_seed_angles.rb +142 -0
  291. data/lib/hecks/quality_control/cli/qa_seed_targets.rb +69 -0
  292. data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +280 -0
  293. data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +329 -0
  294. data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +92 -0
  295. data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +117 -0
  296. data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +175 -0
  297. data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +60 -0
  298. data/lib/hecks/quality_control/cli/qa_sweep.rb +611 -0
  299. data/lib/hecks/quality_control/cli/qa_tick.rb +274 -0
  300. data/lib/hecks/quality_control/quality_control.bluebook +2224 -0
  301. data/lib/hecks/quality_control/quality_control.hecksagon +13 -0
  302. data/lib/hecks/quality_control/quality_control.ports.hecksagon +54 -0
  303. data/lib/hecks/query_ir.rb +346 -0
  304. data/lib/hecks/query_ir_mcp.rb +198 -0
  305. data/lib/hecks/release/runner/ci_publisher.rb +2 -2
  306. data/lib/hecks/release/runner/clean_tree.rb +42 -0
  307. data/lib/hecks/release/runner/console.rb +6 -0
  308. data/lib/hecks/release/runner/gem_publisher.rb +14 -7
  309. data/lib/hecks/release/runner/npm_publisher.rb +6 -36
  310. data/lib/hecks/release/runner/preflight.rb +26 -2
  311. data/lib/hecks/release/runner/published.rb +8 -26
  312. data/lib/hecks/release/runner/tagger.rb +30 -15
  313. data/lib/hecks/release/runner.rb +57 -6
  314. data/lib/hecks/router/namespace_installer.rb +3 -3
  315. data/lib/hecks/runtime/adapter_lookup.rb +124 -0
  316. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +4 -0
  317. data/lib/hecks/runtime/dependency_planning.rb +20 -2
  318. data/lib/hecks/runtime/dispatcher.rb +53 -3
  319. data/lib/hecks/runtime/interpreting.rb +3 -0
  320. data/lib/hecks/runtime/loader.rb +65 -12
  321. data/lib/hecks/runtime/outbox.rb +1 -1
  322. data/lib/hecks/runtime/policy_interpreter.rb +5 -2
  323. data/lib/hecks/runtime/port_operation_interpreter.rb +2 -10
  324. data/lib/hecks/runtime/query_interpreter.rb +77 -0
  325. data/lib/hecks/runtime/reaction_outcome.rb +89 -0
  326. data/lib/hecks/runtime/refusal_wording.rb +23 -1
  327. data/lib/hecks/runtime/registry/verification.rb +163 -4
  328. data/lib/hecks/runtime/registry.rb +57 -3
  329. data/lib/hecks/runtime/remote_dispatcher.rb +31 -2
  330. data/lib/hecks/runtime/value/coercion.rb +23 -135
  331. data/lib/hecks/runtime/value/field_checks.rb +172 -0
  332. data/lib/hecks/runtime/value.rb +4 -1
  333. data/lib/hecks/runtime.rb +20 -6
  334. data/lib/hecks/rust_build/conformance.rb +158 -0
  335. data/lib/hecks/rust_build/conformance_fuzz.rb +71 -0
  336. data/lib/hecks/rust_build/coverage.rb +218 -0
  337. data/lib/hecks/rust_build/native_build.rb +124 -0
  338. data/lib/hecks/rust_build/project_rust/root_mod.rb +120 -0
  339. data/lib/hecks/rust_build/project_rust.rb +332 -0
  340. data/lib/hecks/rust_build/wasm.rb +105 -0
  341. data/lib/hecks/rust_build/wasm_browser.rb +113 -0
  342. data/lib/hecks/rust_build.rb +144 -0
  343. data/lib/hecks/storehouse.rb +16 -16
  344. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +2 -2
  345. data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +1 -1
  346. data/lib/hecks/three_zero/forms.yml +127 -0
  347. data/lib/hecks/three_zero.rb +12 -0
  348. data/lib/hecks/tools/argument_gate_matrix.rb +316 -0
  349. data/lib/hecks/tools/comment_style.rb +1070 -0
  350. data/lib/hecks/tools/corpus_report.rb +87 -0
  351. data/lib/hecks/tools/deploy_recipe.rb +255 -0
  352. data/lib/hecks/tools/deploy_recipe_lint.rb +282 -0
  353. data/lib/hecks/tools/drop_implicit_append_fields.rb +95 -0
  354. data/lib/hecks/tools/era_projection_backfill.rb +94 -0
  355. data/lib/hecks/tools/era_reattest.rb +146 -0
  356. data/lib/hecks/tools/evolve_run.rb +189 -0
  357. data/lib/hecks/tools/fuzz_sweep.rb +373 -0
  358. data/lib/hecks/tools/heki_compaction.rb +100 -0
  359. data/lib/hecks/tools/hoist_local_givens.rb +246 -0
  360. data/lib/hecks/tools/journal_compaction.rb +89 -0
  361. data/lib/hecks/tools/oidc_manifests.rb +70 -0
  362. data/lib/hecks/tools/query_ir_run.rb +81 -0
  363. data/lib/hecks/tools/regeneration_run.rb +166 -0
  364. data/lib/hecks/tools/rust_comment_style.rb +642 -0
  365. data/lib/hecks/tools/sequence_script.rb +62 -0
  366. data/lib/hecks/tools/tail_merge.rb +117 -0
  367. data/lib/hecks/tools/tenant_provisioning.rb +142 -0
  368. data/lib/hecks/tools/translation_audit.rb +208 -0
  369. data/lib/hecks/tools/translation_scaffold.rb +131 -0
  370. data/lib/hecks/tools.rb +86 -0
  371. data/lib/hecks/version.rb +1 -1
  372. data/lib/hecks.rb +32 -15
  373. data/qa/settings.yml +66 -0
  374. data/rust/.cargo/config.toml +6 -0
  375. data/rust/.gitignore +2 -0
  376. data/rust/Cargo.lock +54 -0
  377. data/rust/Cargo.toml +61 -0
  378. data/rust/build/.cargo/config.toml +3 -0
  379. data/rust/build/.gitignore +1 -0
  380. data/rust/build/Cargo.lock +7 -0
  381. data/rust/build/Cargo.toml +19 -0
  382. data/rust/build/src/build_artifact.rs +47 -0
  383. data/rust/build/src/cargo_sync.rs +248 -0
  384. data/rust/build/src/json.rs +421 -0
  385. data/rust/build/src/lineage_pass.rs +285 -0
  386. data/rust/build/src/main.rs +51 -0
  387. data/rust/build/src/optional_pass.rs +150 -0
  388. data/rust/build/src/pipeline.rs +264 -0
  389. data/rust/build/src/reserved_names.rs +76 -0
  390. data/rust/build/src/resolve.rs +124 -0
  391. data/rust/build/src/root.rs +25 -0
  392. data/rust/build/src/sidecars.rs +73 -0
  393. data/rust/build/src/subprocess.rs +51 -0
  394. data/rust/build/src/tmp.rs +31 -0
  395. data/rust/codegen/.cargo/config.toml +3 -0
  396. data/rust/codegen/.gitignore +1 -0
  397. data/rust/codegen/Cargo.lock +7 -0
  398. data/rust/codegen/Cargo.toml +20 -0
  399. data/rust/codegen/src/attr.rs +32 -0
  400. data/rust/codegen/src/bridging.rs +481 -0
  401. data/rust/codegen/src/commands.rs +1226 -0
  402. data/rust/codegen/src/constraints.rs +109 -0
  403. data/rust/codegen/src/dependency_planning.rs +209 -0
  404. data/rust/codegen/src/domain_generator.rs +1288 -0
  405. data/rust/codegen/src/exemplar.rs +230 -0
  406. data/rust/codegen/src/expr_emitter.rs +87 -0
  407. data/rust/codegen/src/fielded.rs +192 -0
  408. data/rust/codegen/src/hecks_naming.rs +33 -0
  409. data/rust/codegen/src/json.rs +335 -0
  410. data/rust/codegen/src/json_codec.rs +697 -0
  411. data/rust/codegen/src/literal.rs +207 -0
  412. data/rust/codegen/src/main.rs +290 -0
  413. data/rust/codegen/src/manifest.rs +227 -0
  414. data/rust/codegen/src/mutations.rs +784 -0
  415. data/rust/codegen/src/naming.rs +286 -0
  416. data/rust/codegen/src/ports.rs +208 -0
  417. data/rust/codegen/src/prelude.rs +116 -0
  418. data/rust/codegen/src/queries.rs +786 -0
  419. data/rust/codegen/src/reactions.rs +532 -0
  420. data/rust/codegen/src/read_models.rs +697 -0
  421. data/rust/codegen/src/reference_specs.rs +40 -0
  422. data/rust/codegen/src/registry.rs +966 -0
  423. data/rust/codegen/src/reserved_names.rs +76 -0
  424. data/rust/codegen/src/shared.rs +93 -0
  425. data/rust/codegen/src/skip_reason.rs +25 -0
  426. data/rust/codegen/src/types.rs +362 -0
  427. data/rust/host/.cargo/config.toml +3 -0
  428. data/rust/host/.gitignore +1 -0
  429. data/rust/host/Cargo.lock +4297 -0
  430. data/rust/host/Cargo.toml +61 -0
  431. data/rust/host/HECKS_RELEASE +1 -0
  432. data/rust/host/rds-ca-bundle.pem +2736 -0
  433. data/rust/host/src/api.rs +1596 -0
  434. data/rust/host/src/approval.rs +652 -0
  435. data/rust/host/src/auth.rs +1287 -0
  436. data/rust/host/src/bin/expr_harness.rs +46 -0
  437. data/rust/host/src/bin/lineage_harness.rs +119 -0
  438. data/rust/host/src/bin/mint_harness.rs +135 -0
  439. data/rust/host/src/checkout.rs +265 -0
  440. data/rust/host/src/dispatch.rs +1443 -0
  441. data/rust/host/src/expr_json.rs +1117 -0
  442. data/rust/host/src/field_hints.rs +52 -0
  443. data/rust/host/src/ir.rs +733 -0
  444. data/rust/host/src/journal.rs +874 -0
  445. data/rust/host/src/lambda_client.rs +378 -0
  446. data/rust/host/src/log.rs +147 -0
  447. data/rust/host/src/main.rs +474 -0
  448. data/rust/host/src/mint.rs +1865 -0
  449. data/rust/host/src/payments/keystore.rs +330 -0
  450. data/rust/host/src/payments/tests.rs +1400 -0
  451. data/rust/host/src/payments.rs +767 -0
  452. data/rust/host/src/presentation.rs +698 -0
  453. data/rust/host/src/presentation_write.rs +1431 -0
  454. data/rust/host/src/query_step.rs +149 -0
  455. data/rust/host/src/rate_limit.rs +904 -0
  456. data/rust/host/src/reference_transform.rs +241 -0
  457. data/rust/host/src/reference_validate.rs +338 -0
  458. data/rust/host/src/resend.rs +296 -0
  459. data/rust/host/src/secrets.rs +106 -0
  460. data/rust/host/src/server.rs +663 -0
  461. data/rust/host/src/storage_shape.rs +175 -0
  462. data/rust/host/src/test_pg.rs +40 -0
  463. data/rust/host/src/ui_schema.rs +1351 -0
  464. data/rust/host/src/wasm_runner.rs +191 -0
  465. data/rust/host/src/web/newsletter/cooldown.rs +126 -0
  466. data/rust/host/src/web/newsletter/tests.rs +104 -0
  467. data/rust/host/src/web/newsletter.rs +310 -0
  468. data/rust/host/src/web/newsletter_send.rs +357 -0
  469. data/rust/host/src/web/registrations.rs +1505 -0
  470. data/rust/host/src/web.rs +2937 -0
  471. data/rust/lsp/.gitignore +1 -0
  472. data/rust/lsp/Cargo.lock +7 -0
  473. data/rust/lsp/Cargo.toml +16 -0
  474. data/rust/lsp/README.md +133 -0
  475. data/rust/lsp/src/diagnostics.rs +165 -0
  476. data/rust/lsp/src/json.rs +385 -0
  477. data/rust/lsp/src/main.rs +399 -0
  478. data/rust/lsp/src/outline.rs +177 -0
  479. data/rust/lsp/src/rpc.rs +67 -0
  480. data/rust/parser/.cargo/config.toml +5 -0
  481. data/rust/parser/.gitignore +1 -0
  482. data/rust/parser/Cargo.lock +7 -0
  483. data/rust/parser/Cargo.toml +21 -0
  484. data/rust/parser/src/build/closed_sets.rs +27 -0
  485. data/rust/parser/src/build/identity.rs +276 -0
  486. data/rust/parser/src/build/mod.rs +12 -0
  487. data/rust/parser/src/build/naming.rs +141 -0
  488. data/rust/parser/src/build/pattern_subset.rs +161 -0
  489. data/rust/parser/src/build/query_derive.rs +72 -0
  490. data/rust/parser/src/build/query_inference.rs +269 -0
  491. data/rust/parser/src/build/query_options.rs +100 -0
  492. data/rust/parser/src/build/read_model.rs +94 -0
  493. data/rust/parser/src/build/references.rs +32 -0
  494. data/rust/parser/src/canonical.rs +114 -0
  495. data/rust/parser/src/diag.rs +55 -0
  496. data/rust/parser/src/emit.rs +953 -0
  497. data/rust/parser/src/expr/ast_json.rs +147 -0
  498. data/rust/parser/src/expr/evaluator.rs +81 -0
  499. data/rust/parser/src/expr/mod.rs +84 -0
  500. data/rust/parser/src/expr/resolver.rs +497 -0
  501. data/rust/parser/src/ir.rs +387 -0
  502. data/rust/parser/src/keywords.rs +585 -0
  503. data/rust/parser/src/lex.rs +662 -0
  504. data/rust/parser/src/main.rs +252 -0
  505. data/rust/parser/src/parse/aggregate.rs +612 -0
  506. data/rust/parser/src/parse/chapter.rs +517 -0
  507. data/rust/parser/src/parse/command.rs +637 -0
  508. data/rust/parser/src/parse/domain_port.rs +127 -0
  509. data/rust/parser/src/parse/entity.rs +527 -0
  510. data/rust/parser/src/parse/file.rs +67 -0
  511. data/rust/parser/src/parse/hecksagon.rs +231 -0
  512. data/rust/parser/src/parse/lifecycle.rs +162 -0
  513. data/rust/parser/src/parse/mod.rs +1262 -0
  514. data/rust/parser/src/parse/policy.rs +87 -0
  515. data/rust/parser/src/parse/process_manager.rs +305 -0
  516. data/rust/parser/src/parse/query.rs +100 -0
  517. data/rust/parser/src/parse/read_model.rs +214 -0
  518. data/rust/parser/src/parse/value_object.rs +250 -0
  519. data/rust/parser/src/ruby_value.rs +422 -0
  520. data/rust/project/bridging.rb +257 -0
  521. data/rust/project/commands.rb +877 -0
  522. data/rust/project/constraints.rb +86 -0
  523. data/rust/project/dependency_planning.rb +178 -0
  524. data/rust/project/domain_generator.rb +980 -0
  525. data/rust/project/exemplar.rb +148 -0
  526. data/rust/project/expr_emitter.rb +72 -0
  527. data/rust/project/fielded.rb +141 -0
  528. data/rust/project/json_codec.rb +641 -0
  529. data/rust/project/mutations.rb +721 -0
  530. data/rust/project/naming.rb +205 -0
  531. data/rust/project/ports.rb +65 -0
  532. data/rust/project/queries.rb +493 -0
  533. data/rust/project/reactions.rb +317 -0
  534. data/rust/project/read_models.rb +690 -0
  535. data/rust/project/reference_specs.rb +27 -0
  536. data/rust/project/registry.rb +396 -0
  537. data/rust/project/skip_reason.rb +29 -0
  538. data/rust/project/types.rb +225 -0
  539. data/rust/project/write_if_changed.rb +83 -0
  540. data/rust/project.rb +30 -0
  541. data/rust/project_rust_pipeline.rb +383 -0
  542. data/rust/src/exemplar/commands.rs +279 -0
  543. data/rust/src/exemplar/constraints.rs +18 -0
  544. data/rust/src/exemplar/fielded.rs +280 -0
  545. data/rust/src/exemplar/json.rs +277 -0
  546. data/rust/src/exemplar/mod.rs +17 -0
  547. data/rust/src/exemplar/mutations.rs +80 -0
  548. data/rust/src/exemplar/queries.rs +33 -0
  549. data/rust/src/exemplar/reactions.rs +88 -0
  550. data/rust/src/exemplar/read_models.rs +48 -0
  551. data/rust/src/exemplar/registry.rs +166 -0
  552. data/rust/src/exemplar/types.rs +44 -0
  553. data/rust/src/kernel/attribute_shapes/composite.rs +88 -0
  554. data/rust/src/kernel/attribute_shapes/list.rs +18 -0
  555. data/rust/src/kernel/attribute_shapes/mod.rs +44 -0
  556. data/rust/src/kernel/attribute_shapes/optional.rs +9 -0
  557. data/rust/src/kernel/attribute_shapes/scalar.rs +39 -0
  558. data/rust/src/kernel/cli.rs +585 -0
  559. data/rust/src/kernel/dispatch.rs +1090 -0
  560. data/rust/src/kernel/expr.rs +458 -0
  561. data/rust/src/kernel/expression_operators/arithmetic.rs +128 -0
  562. data/rust/src/kernel/expression_operators/comparison.rs +48 -0
  563. data/rust/src/kernel/expression_operators/enumeration.rs +232 -0
  564. data/rust/src/kernel/expression_operators/logical.rs +13 -0
  565. data/rust/src/kernel/expression_operators/membership.rs +18 -0
  566. data/rust/src/kernel/expression_operators/mod.rs +68 -0
  567. data/rust/src/kernel/expression_operators/pattern_match.rs +73 -0
  568. data/rust/src/kernel/expression_operators/positional.rs +126 -0
  569. data/rust/src/kernel/expression_operators/presence.rs +101 -0
  570. data/rust/src/kernel/expression_operators/sign_test.rs +16 -0
  571. data/rust/src/kernel/expression_operators/sized.rs +35 -0
  572. data/rust/src/kernel/expression_operators/text.rs +79 -0
  573. data/rust/src/kernel/expression_operators/to_string.rs +18 -0
  574. data/rust/src/kernel/json.rs +779 -0
  575. data/rust/src/kernel/mod.rs +133 -0
  576. data/rust/src/kernel/named_query.rs +219 -0
  577. data/rust/src/kernel/orchestrate.rs +1810 -0
  578. data/rust/src/kernel/pattern.rs +307 -0
  579. data/rust/src/kernel/query_comparators.rs +206 -0
  580. data/rust/src/kernel/query_ordering.rs +103 -0
  581. data/rust/src/kernel/read_model.rs +914 -0
  582. data/rust/src/kernel/reference_lookup.rs +149 -0
  583. data/rust/src/kernel/repository.rs +468 -0
  584. data/rust/src/kernel/routing.rs +612 -0
  585. data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +118 -0
  586. data/rust/src/kernel/vocab/entity_dispatch_order.rs +114 -0
  587. data/rust/src/kernel/vocab/field_hint.rs +70 -0
  588. data/rust/src/kernel/vocab/mod.rs +20 -0
  589. data/rust/src/kernel/vocab/query_comparator.rs +65 -0
  590. data/rust/src/kernel/vocab/refusal_template.rs +1592 -0
  591. data/rust/src/lib.rs +8 -0
  592. data/rust/src/main.rs +16 -0
  593. data/rust/web/.gitignore +1 -0
  594. data/rust/web/Cargo.lock +119 -0
  595. data/rust/web/Cargo.toml +18 -0
  596. data/rust/web/src/lib.rs +8 -0
  597. metadata +477 -12
  598. data/lib/hecks/facade/cli_door.rb +0 -96
  599. data/lib/hecks/facade/cli_runner.rb +0 -127
  600. data/lib/hecks/mcp_door_scope.rb +0 -95
@@ -0,0 +1,280 @@
1
+ //! Exemplar shapes for rust/project/fielded.rb (see mod.rs).
2
+ //!
3
+ //! Each `Fielded::field` arm shape is a standalone leaf so both outer skeletons can reuse it.
4
+ #![allow(dead_code, unused_variables)]
5
+
6
+ fn tmpl_value_expr_placeholder(v: &i64) -> crate::kernel::Value {
7
+ crate::kernel::Value::Int(*v)
8
+ }
9
+
10
+ struct TmplListOptionalHost {
11
+ tmpl_ident: Option<Vec<i64>>,
12
+ }
13
+ impl TmplListOptionalHost {
14
+ fn arm(&self) -> Option<crate::kernel::Field<'_>> {
15
+ use crate::kernel::Field;
16
+ use crate::kernel::Value;
17
+ match "x" {
18
+ // TMPL:fielded_arm_list_optional BEGIN
19
+ "tmpl_field" => self.tmpl_ident.as_ref().map(|v| Field::Value(Value::List(v.len()))).or(Some(Field::Value(Value::Nil))),
20
+ // TMPL:fielded_arm_list_optional END
21
+ _ => None,
22
+ }
23
+ }
24
+ }
25
+
26
+ struct TmplListHost {
27
+ tmpl_ident: Vec<i64>,
28
+ }
29
+ impl TmplListHost {
30
+ fn arm(&self) -> Option<crate::kernel::Field<'_>> {
31
+ use crate::kernel::Field;
32
+ use crate::kernel::Value;
33
+ match "x" {
34
+ // TMPL:fielded_arm_list BEGIN
35
+ "tmpl_field" => Some(Field::Value(Value::List(self.tmpl_ident.len()))),
36
+ // TMPL:fielded_arm_list END
37
+ _ => None,
38
+ }
39
+ }
40
+ }
41
+
42
+ struct TmplOptionalScalarHost {
43
+ tmpl_ident: Option<i64>,
44
+ }
45
+ impl TmplOptionalScalarHost {
46
+ fn arm(&self) -> Option<crate::kernel::Field<'_>> {
47
+ use crate::kernel::Field;
48
+ use crate::kernel::Value;
49
+ match "x" {
50
+ // TMPL:fielded_arm_optional_scalar BEGIN
51
+ "tmpl_field" => self.tmpl_ident.as_ref().map(|v| Field::Value(tmpl_value_expr_placeholder(v))).or(Some(Field::Value(Value::Nil))),
52
+ // TMPL:fielded_arm_optional_scalar END
53
+ _ => None,
54
+ }
55
+ }
56
+ }
57
+
58
+ struct TmplNestedInner;
59
+ impl crate::kernel::Fielded for TmplNestedInner {
60
+ fn field(&self, name: &str) -> Option<crate::kernel::Field<'_>> {
61
+ None
62
+ }
63
+ }
64
+ struct TmplOptionalNestedHost {
65
+ tmpl_ident: Option<TmplNestedInner>,
66
+ }
67
+ impl TmplOptionalNestedHost {
68
+ fn arm(&self) -> Option<crate::kernel::Field<'_>> {
69
+ use crate::kernel::Field;
70
+ use crate::kernel::Value;
71
+ match "x" {
72
+ // TMPL:fielded_arm_optional_nested BEGIN
73
+ "tmpl_field" => self.tmpl_ident.as_ref().map(|v| Field::Nested(v)).or(Some(Field::Value(Value::Nil))),
74
+ // TMPL:fielded_arm_optional_nested END
75
+ _ => None,
76
+ }
77
+ }
78
+ }
79
+
80
+ struct TmplScalarHost {
81
+ tmpl_ident: i64,
82
+ }
83
+ impl TmplScalarHost {
84
+ fn arm(&self) -> Option<crate::kernel::Field<'_>> {
85
+ use crate::kernel::Field;
86
+ match "x" {
87
+ // TMPL:fielded_arm_scalar BEGIN
88
+ "tmpl_field" => Some(Field::Value(tmpl_value_expr_placeholder(&self.tmpl_ident))),
89
+ // TMPL:fielded_arm_scalar END
90
+ _ => None,
91
+ }
92
+ }
93
+ }
94
+
95
+ struct TmplNestedHost {
96
+ tmpl_ident: TmplNestedInner,
97
+ }
98
+ impl TmplNestedHost {
99
+ fn arm(&self) -> Option<crate::kernel::Field<'_>> {
100
+ use crate::kernel::Field;
101
+ match "x" {
102
+ // TMPL:fielded_arm_nested BEGIN
103
+ "tmpl_field" => Some(Field::Nested(&self.tmpl_ident)),
104
+ // TMPL:fielded_arm_nested END
105
+ _ => None,
106
+ }
107
+ }
108
+ }
109
+
110
+ struct TmplLifecycleHost {
111
+ tmpl_ident: String,
112
+ }
113
+ impl TmplLifecycleHost {
114
+ fn arm(&self) -> Option<crate::kernel::Field<'_>> {
115
+ use crate::kernel::Field;
116
+ use crate::kernel::Value;
117
+ match "x" {
118
+ // TMPL:fielded_lifecycle_arm BEGIN
119
+ "tmpl_field" => Some(Field::Value(Value::Str(self.tmpl_ident.clone()))),
120
+ // TMPL:fielded_lifecycle_arm END
121
+ _ => None,
122
+ }
123
+ }
124
+ }
125
+
126
+ // Plain `bool` flag field read by `corrects` givens, like the lifecycle arm.
127
+ struct TmplCorrectsFlagHost {
128
+ tmpl_ident: bool,
129
+ }
130
+ impl TmplCorrectsFlagHost {
131
+ fn arm(&self) -> Option<crate::kernel::Field<'_>> {
132
+ use crate::kernel::Field;
133
+ use crate::kernel::Value;
134
+ match "x" {
135
+ // TMPL:fielded_corrects_flag_arm BEGIN
136
+ "tmpl_field" => Some(Field::Value(Value::Bool(self.tmpl_ident))),
137
+ // TMPL:fielded_corrects_flag_arm END
138
+ _ => None,
139
+ }
140
+ }
141
+ }
142
+
143
+ // The marker is the whole placeholder arm line at column 0: `render` never reindents, so leading
144
+ // whitespace would double up with Ruby's already-indented arm block.
145
+ // The two skeletons use distinct types because a second `impl Fielded` on one type is an error.
146
+ fn tmpl_arms_block() -> Option<crate::kernel::Field<'static>> {
147
+ None
148
+ }
149
+
150
+ // `Fielded::items`: list elements for the enumeration operators, as nested or scalar fields.
151
+ fn tmpl_items_block() -> Option<Vec<crate::kernel::Field<'static>>> {
152
+ None
153
+ }
154
+
155
+ // `Fielded::as_scalar`: a single-attribute object reads as that attribute, else `None`.
156
+ fn tmpl_as_scalar_placeholder() -> Option<crate::kernel::Value> {
157
+ None
158
+ }
159
+
160
+ struct TmplItemsNestedHost {
161
+ tmpl_ident: Vec<TmplNestedInner>,
162
+ }
163
+ impl TmplItemsNestedHost {
164
+ fn arm(&self) -> Option<Vec<crate::kernel::Field<'_>>> {
165
+ #[allow(unused_imports)]
166
+ use crate::kernel::{Field, Value};
167
+ match "x" {
168
+ // TMPL:fielded_items_arm_list_nested BEGIN
169
+ "tmpl_field" => Some(self.tmpl_ident.iter().map(|v| Field::Nested(v)).collect()),
170
+ // TMPL:fielded_items_arm_list_nested END
171
+ _ => None,
172
+ }
173
+ }
174
+ }
175
+
176
+ struct TmplItemsScalarHost {
177
+ tmpl_ident: Vec<i64>,
178
+ }
179
+ impl TmplItemsScalarHost {
180
+ fn arm(&self) -> Option<Vec<crate::kernel::Field<'_>>> {
181
+ #[allow(unused_imports)]
182
+ use crate::kernel::{Field, Value};
183
+ match "x" {
184
+ // TMPL:fielded_items_arm_list_scalar BEGIN
185
+ "tmpl_field" => Some(self.tmpl_ident.iter().map(|v| Field::Value(tmpl_value_expr_placeholder(v))).collect()),
186
+ // TMPL:fielded_items_arm_list_scalar END
187
+ _ => None,
188
+ }
189
+ }
190
+ }
191
+
192
+ struct TmplItemsOptionalNestedHost {
193
+ tmpl_ident: Option<Vec<TmplNestedInner>>,
194
+ }
195
+ impl TmplItemsOptionalNestedHost {
196
+ fn arm(&self) -> Option<Vec<crate::kernel::Field<'_>>> {
197
+ #[allow(unused_imports)]
198
+ use crate::kernel::{Field, Value};
199
+ match "x" {
200
+ // TMPL:fielded_items_arm_list_optional_nested BEGIN
201
+ "tmpl_field" => self.tmpl_ident.as_ref().map(|items| items.iter().map(|v| Field::Nested(v)).collect()),
202
+ // TMPL:fielded_items_arm_list_optional_nested END
203
+ _ => None,
204
+ }
205
+ }
206
+ }
207
+
208
+ struct TmplItemsOptionalScalarHost {
209
+ tmpl_ident: Option<Vec<i64>>,
210
+ }
211
+ impl TmplItemsOptionalScalarHost {
212
+ fn arm(&self) -> Option<Vec<crate::kernel::Field<'_>>> {
213
+ #[allow(unused_imports)]
214
+ use crate::kernel::{Field, Value};
215
+ match "x" {
216
+ // TMPL:fielded_items_arm_list_optional_scalar BEGIN
217
+ "tmpl_field" => self.tmpl_ident.as_ref().map(|items| items.iter().map(|v| Field::Value(tmpl_value_expr_placeholder(v))).collect()),
218
+ // TMPL:fielded_items_arm_list_optional_scalar END
219
+ _ => None,
220
+ }
221
+ }
222
+ }
223
+
224
+ struct TmplFlatType;
225
+ struct TmplRecordType;
226
+
227
+ // The conditional `use crate::kernel::Value;` marker is the real statement, so leaving it
228
+ // unsubstituted is harmless. `#[allow(unused_imports)]` sits before the fence to stay out of it.
229
+ #[allow(unused_imports)]
230
+ // TMPL:fielded_flat BEGIN
231
+ impl crate::kernel::Fielded for TmplFlatType {
232
+ fn field(&self, name: &str) -> Option<crate::kernel::Field<'_>> {
233
+ use crate::kernel::Field;
234
+ use crate::kernel::Value;
235
+ match name {
236
+ "tmpl_arms_placeholder" => tmpl_arms_block(),
237
+ _ => None,
238
+ }
239
+ }
240
+
241
+ fn items(&self, name: &str) -> Option<Vec<crate::kernel::Field<'_>>> {
242
+ #[allow(unused_imports)]
243
+ use crate::kernel::{Field, Value};
244
+ match name {
245
+ "tmpl_items_placeholder" => tmpl_items_block(),
246
+ _ => None,
247
+ }
248
+ }
249
+
250
+ fn as_scalar(&self) -> Option<crate::kernel::Value> {
251
+ tmpl_as_scalar_placeholder()
252
+ }
253
+ }
254
+ // TMPL:fielded_flat END
255
+
256
+ #[allow(unused_imports)]
257
+ // TMPL:fielded_record BEGIN
258
+ impl crate::kernel::Fielded for TmplRecordType {
259
+ fn field(&self, name: &str) -> Option<crate::kernel::Field<'_>> {
260
+ use crate::kernel::{Field, Value};
261
+ match name {
262
+ "tmpl_arms_placeholder" => tmpl_arms_block(),
263
+ _ => None,
264
+ }
265
+ }
266
+
267
+ fn items(&self, name: &str) -> Option<Vec<crate::kernel::Field<'_>>> {
268
+ #[allow(unused_imports)]
269
+ use crate::kernel::{Field, Value};
270
+ match name {
271
+ "tmpl_items_placeholder" => tmpl_items_block(),
272
+ _ => None,
273
+ }
274
+ }
275
+
276
+ fn as_scalar(&self) -> Option<crate::kernel::Value> {
277
+ tmpl_as_scalar_placeholder()
278
+ }
279
+ }
280
+ // TMPL:fielded_record END
@@ -0,0 +1,277 @@
1
+ // Exemplar shapes for rust/project/json_codec.rb; see mod.rs.
2
+ // Kept out of the fenced region so its prose is not baked into every generated codec.
3
+ #![allow(dead_code, unused_variables)]
4
+
5
+ use crate::exemplar::types::TmplKind;
6
+
7
+ // An `impl` block is a complete top-level item and needs no `tmpl_*_host` wrapper.
8
+ // TMPL:closed_set_codec BEGIN
9
+ impl TmplKind {
10
+ pub fn to_json(&self) -> crate::kernel::Json {
11
+ let member = match self {
12
+ // TMPL:closed_set_codec:TO_JSON_ARM BEGIN
13
+ TmplKind::TmplMemberA => "tmpl_member_a",
14
+ // TMPL:closed_set_codec:TO_JSON_ARM END
15
+ };
16
+ crate::kernel::Json::obj(vec![("tmpl_field_name", crate::kernel::Json::str(member))])
17
+ }
18
+
19
+ pub fn from_json(v: &crate::kernel::Json) -> Result<Self, crate::kernel::Refusal> {
20
+ // A `one_of` closed set is admission-checked on the raw offered
21
+ // value, no shape check first — `Value::Admission#admit_member`
22
+ // runs on whatever `Value::Coercion#fields_for` auto-wrapped into
23
+ // the sole attribute's slot (a bare Array, a Bool, anything), never
24
+ // on a value already known to be a String. `v.dig` gives the same
25
+ // tolerant unwrap Ruby's own `fields_for` does: the wrapped
26
+ // `{"tmpl_field_name": ...}` shape's inner value if `v` is an
27
+ // object, or `v` itself untouched if it isn't (matching
28
+ // `fields_for`'s single-field auto-wrap of a bare scalar/array/
29
+ // whatever). Only then is admission checked — a non-member value
30
+ // refuses `InvariantViolation`, matching Ruby's own refusal kind,
31
+ // never `TypeMismatch` for a shape a member set never declared.
32
+ //
33
+ // BUG#14 (qa/bluebook/quality_control.bluebook) — a missing field
34
+ // is not "a shape a member set never declared" the way a present-
35
+ // but-wrong value is; it is `Value::Coercion#check_required_fields`
36
+ // (runtime/value/coercion.rb) firing, and that check runs before
37
+ // `admit_member` in `validate!`'s own order. A caller-supplied
38
+ // `null` for a required command argument of this type is translated
39
+ // by `required_composite_argument_expr` (json_codec.rb, BUG#4) into
40
+ // an empty object — "build the value object from no fields at all",
41
+ // matching `Value::Coercion#nil_argument`'s own `build(value_object,
42
+ // {}, aggregate)` exactly — so `v.dig` above finding nothing is
43
+ // genuinely indistinguishable, at this point, from a Hash-shaped
44
+ // caller argument that simply never named the sole field's own key
45
+ // either way: both are that field's own absence, not a member
46
+ // mismatch.
47
+ // Without this explicit null check, that absence would still fall
48
+ // through to the admission match below, stringified as
49
+ // `Json::Null`'s own `ruby_to_s` (never a real member), so a
50
+ // required-but-omitted closed-set argument would misreport
51
+ // `InvariantViolation` where Ruby raises `TypeMismatch`
52
+ // ("{type}.{field} expects {expected}, got nil" — the same
53
+ // `numeric_field` wording `required_field_expr` already gives
54
+ // every other composite field's own missing-key case).
55
+ let candidate = v.dig("tmpl_field_name").cloned().unwrap_or(crate::kernel::Json::Null);
56
+ if matches!(candidate, crate::kernel::Json::Null) {
57
+ return Err(crate::kernel::Refusal::TypeMismatch("tmpl_null_field_message".to_string()));
58
+ }
59
+ match candidate.ruby_to_s().as_str() {
60
+ // TMPL:closed_set_codec:FROM_JSON_ARM BEGIN
61
+ "tmpl_member_a" => Ok(TmplKind::TmplMemberA),
62
+ // TMPL:closed_set_codec:FROM_JSON_ARM END
63
+ _ => Err(crate::kernel::Refusal::InvariantViolation(
64
+ crate::kernel::refusal_wording::InvariantViolationClosedSetMemberArgs {
65
+ r#type: "tmpl_closed_set_type",
66
+ admitted: &["tmpl_closed_set_member_a"],
67
+ offered: candidate.inspect().as_str(),
68
+ }
69
+ .render_args(),
70
+ )),
71
+ }
72
+ }
73
+ }
74
+ // TMPL:closed_set_codec END
75
+
76
+ fn tmpl_json_value_placeholder() -> crate::kernel::Json {
77
+ crate::kernel::Json::Null
78
+ }
79
+
80
+ // Standalone rather than nested so several outers can reuse it without copying its source.
81
+ fn tmpl_to_json_field_host() -> Vec<(String, crate::kernel::Json)> {
82
+ vec![
83
+ // TMPL:to_json_field BEGIN
84
+ ("tmpl_field_name".to_string(), tmpl_json_value_placeholder()),
85
+ // TMPL:to_json_field END
86
+ ]
87
+ }
88
+
89
+ // A distinct type from `TmplKind`: two `impl TmplKind` blocks in one module would collide.
90
+ #[derive(Clone)]
91
+ struct TmplTableRow {
92
+ tmpl_field: i64,
93
+ }
94
+
95
+ const TMPL_TABLE: &[TmplTableRow] = &[];
96
+
97
+ // Function-call placeholders; the marker sits flush left because plain `render` never reindents.
98
+ fn tmpl_to_json_fields_block() -> (String, crate::kernel::Json) {
99
+ (String::new(), crate::kernel::Json::Null)
100
+ }
101
+
102
+ fn tmpl_from_json_conditions() -> bool {
103
+ true
104
+ }
105
+
106
+ // TMPL:closed_set_table_codec BEGIN
107
+ impl TmplTableRow {
108
+ pub fn to_json(&self) -> crate::kernel::Json {
109
+ crate::kernel::Json::Object(vec![
110
+ tmpl_to_json_fields_block()
111
+ ])
112
+ }
113
+
114
+ pub fn from_json(v: &crate::kernel::Json) -> Result<Self, crate::kernel::Refusal> {
115
+ for row in TMPL_TABLE {
116
+ if tmpl_from_json_conditions() {
117
+ return Ok(row.clone());
118
+ }
119
+ }
120
+ Err(crate::kernel::Refusal::TypeMismatch(format!("TmplTableRow: no member matches {:?}", v)))
121
+ }
122
+ }
123
+ // TMPL:closed_set_table_codec END
124
+
125
+ // Stands in for `Json::as_str`/`as_i64`/`as_f64`; a bare associated item would not compile.
126
+ fn tmpl_accessor_fn(j: &crate::kernel::Json) -> Option<i64> {
127
+ j.as_i64()
128
+ }
129
+
130
+ fn tmpl_from_json_condition_host(v: &crate::kernel::Json, row: &TmplTableRow) -> bool {
131
+ // TMPL:closed_set_table_from_json_condition BEGIN
132
+ v.get("tmpl_field_name").and_then(tmpl_accessor_fn) == Some(row.tmpl_field)
133
+ // TMPL:closed_set_table_from_json_condition END
134
+ }
135
+
136
+ fn tmpl_rhs_placeholder() -> i64 {
137
+ 0
138
+ }
139
+
140
+ struct TmplFieldAssignmentHost {
141
+ tmpl_ident: i64,
142
+ }
143
+ impl TmplFieldAssignmentHost {
144
+ fn build() -> Self {
145
+ Self {
146
+ // TMPL:field_assignment BEGIN
147
+ tmpl_ident: tmpl_rhs_placeholder(),
148
+ // TMPL:field_assignment END
149
+ }
150
+ }
151
+ }
152
+
153
+ struct TmplFlatType2 {
154
+ tmpl_ident: i64,
155
+ }
156
+
157
+ fn tmpl_to_json_field_block() -> (String, crate::kernel::Json) {
158
+ (String::new(), crate::kernel::Json::Null)
159
+ }
160
+
161
+ // TMPL:to_json_flat BEGIN
162
+ impl TmplFlatType2 {
163
+ pub fn to_json(&self) -> crate::kernel::Json {
164
+ crate::kernel::Json::Object(vec![
165
+ tmpl_to_json_field_block()
166
+ ])
167
+ }
168
+ }
169
+ // TMPL:to_json_flat END
170
+
171
+ struct TmplFlatType3 {
172
+ tmpl_ident: i64,
173
+ }
174
+
175
+ fn tmpl_to_json_field_block_sparse() -> (String, crate::kernel::Json) {
176
+ (String::new(), crate::kernel::Json::Null)
177
+ }
178
+
179
+ // Drops `(key, Json::Null)` entries so an unset optional arg is an absent key, as in Ruby's
180
+ // `payload: args`. Command args only: records keep `null` for "declared, not set".
181
+ // TMPL:to_json_flat_sparse BEGIN
182
+ impl TmplFlatType3 {
183
+ pub fn to_json(&self) -> crate::kernel::Json {
184
+ crate::kernel::Json::Object(
185
+ vec![tmpl_to_json_field_block_sparse()]
186
+ .into_iter()
187
+ .filter(|(_, v)| !matches!(v, crate::kernel::Json::Null))
188
+ .collect(),
189
+ )
190
+ }
191
+ }
192
+ // TMPL:to_json_flat_sparse END
193
+
194
+ // The unknown-argument preamble is a full check block or empty; the no-op `let` keeps the
195
+ // exemplar compiling. Backs both `emit_from_json_flat` and `emit_from_json_state`.
196
+ // TMPL:from_json_flat BEGIN
197
+ impl TmplFlatType2 {
198
+ pub fn from_json(v: &crate::kernel::Json) -> Result<Self, crate::kernel::Refusal> {
199
+ let _tmpl_unknown_check_placeholder = ();
200
+ Ok(Self {
201
+ tmpl_ident: tmpl_rhs_placeholder(),
202
+ })
203
+ }
204
+ }
205
+ // TMPL:from_json_flat END
206
+
207
+ // `TIER1_LINE` is nested because only this one outer uses it. Method name and coercion are
208
+ // placeholders: the shape backs both strict `extract_id` and `extract_id_lenient`.
209
+ struct TmplExtractIdType;
210
+ // TMPL:extract_id BEGIN
211
+ impl TmplExtractIdType {
212
+ pub fn tmpl_extract_id_name(v: &crate::kernel::Json) -> Result<String, crate::kernel::Refusal> {
213
+ let by_identity = (|| -> Option<String> {
214
+ // TMPL:extract_id:TIER1_LINE BEGIN
215
+ let c0 = v.dig("tmpl_path")?.tmpl_id_coercion().ok()?;
216
+ // TMPL:extract_id:TIER1_LINE END
217
+ Some(tmpl_tier1_join_placeholder())
218
+ })();
219
+ let by_id_key = v.get("id").and_then(|j| j.tmpl_id_coercion().ok());
220
+ let by_reference_key = v.get("tmpl_reference_key").and_then(|j| j.tmpl_id_coercion().ok());
221
+
222
+ by_identity.or(by_id_key).or(by_reference_key).ok_or_else(|| {
223
+ crate::kernel::Refusal::TypeMismatch("tmpl_error_text".to_string())
224
+ })
225
+ }
226
+ }
227
+ // TMPL:extract_id END
228
+
229
+ fn tmpl_tier1_join_placeholder() -> String {
230
+ String::new()
231
+ }
232
+
233
+ // A real trait method so the exemplar compiles with the placeholder in place; codegen
234
+ // substitutes the method name only.
235
+ trait TmplIdCoercion {
236
+ fn tmpl_id_coercion(&self) -> Result<String, crate::kernel::Refusal>;
237
+ }
238
+ impl TmplIdCoercion for crate::kernel::Json {
239
+ fn tmpl_id_coercion(&self) -> Result<String, crate::kernel::Refusal> {
240
+ self.to_id_component()
241
+ }
242
+ }
243
+
244
+ // `element_of`'s `wants`, joined with ", ". Infallible: it is only read for a refusal
245
+ // message, so a missing path part yields an empty string.
246
+ struct TmplExtractWantsType;
247
+ // TMPL:extract_wants BEGIN
248
+ impl TmplExtractWantsType {
249
+ pub fn extract_wants(v: &crate::kernel::Json) -> String {
250
+ (|| -> Option<String> {
251
+ // TMPL:extract_wants:TIER1_LINE BEGIN
252
+ let c0 = v.dig("tmpl_path")?.to_id_component().ok()?;
253
+ // TMPL:extract_wants:TIER1_LINE END
254
+ Some(tmpl_wants_join_placeholder())
255
+ })()
256
+ .unwrap_or_default()
257
+ }
258
+ }
259
+ // TMPL:extract_wants END
260
+
261
+ fn tmpl_wants_join_placeholder() -> String {
262
+ String::new()
263
+ }
264
+
265
+ // Same shape as `extract_id`, over an already-built value instead of raw JSON.
266
+ struct TmplSelfIdentityType;
267
+ // TMPL:self_identity BEGIN
268
+ impl TmplSelfIdentityType {
269
+ pub fn identity(&self) -> String {
270
+ tmpl_identity_body_placeholder()
271
+ }
272
+ }
273
+ // TMPL:self_identity END
274
+
275
+ fn tmpl_identity_body_placeholder() -> String {
276
+ String::new()
277
+ }
@@ -0,0 +1,17 @@
1
+ // Compile-checked Rust for every shape rust/project/*.rb emits; exemplar.rb slices the fenced
2
+ // `// TMPL:<id> BEGIN` / `END` regions and substitutes real names for the `tmpl_` vocabulary.
3
+ //
4
+ // `tmpl_*_host` functions only give fenced fragments real types and are never called, hence
5
+ // the allow below. Built under `#[cfg(test)]` only, never into a release artifact.
6
+ #![allow(dead_code, unused_variables)]
7
+
8
+ pub mod commands;
9
+ pub mod constraints;
10
+ pub mod fielded;
11
+ pub mod json;
12
+ pub mod mutations;
13
+ pub mod queries;
14
+ pub mod reactions;
15
+ pub mod read_models;
16
+ pub mod registry;
17
+ pub mod types;
@@ -0,0 +1,80 @@
1
+ // Exemplar shapes for rust/project/mutations.rb; see mod.rs.
2
+ // Hosts take `record: &mut Tmpl...`, not `&mut self`, as the generated mutation closures do.
3
+ #![allow(dead_code, unused_variables)]
4
+
5
+ struct TmplElement {
6
+ tmpl_field: i64,
7
+ }
8
+ struct TmplRecordHost {
9
+ tmpl_field: Vec<TmplElement>,
10
+ }
11
+ fn tmpl_fields_placeholder() -> TmplElement {
12
+ TmplElement { tmpl_field: 0 }
13
+ }
14
+ fn tmpl_mutation_append_host(record: &mut TmplRecordHost) {
15
+ // TMPL:mutation_append BEGIN
16
+ record.tmpl_field.push(tmpl_fields_placeholder());
17
+ // TMPL:mutation_append END
18
+ }
19
+
20
+ struct TmplScalarHost2 {
21
+ tmpl_field: i64,
22
+ }
23
+ fn tmpl_rhs_placeholder2() -> i64 {
24
+ 0
25
+ }
26
+ fn tmpl_mutation_set_plain_host(record: &mut TmplScalarHost2) {
27
+ // TMPL:mutation_set_plain BEGIN
28
+ record.tmpl_field = tmpl_rhs_placeholder2();
29
+ // TMPL:mutation_set_plain END
30
+ }
31
+
32
+ fn tmpl_optional_rhs_placeholder() -> Option<i64> {
33
+ None
34
+ }
35
+ fn tmpl_mutation_set_unwrap_or_default_host(record: &mut TmplScalarHost2) {
36
+ // TMPL:mutation_set_unwrap_or_default BEGIN
37
+ record.tmpl_field = tmpl_optional_rhs_placeholder().unwrap_or_default();
38
+ // TMPL:mutation_set_unwrap_or_default END
39
+ }
40
+
41
+ struct TmplOptionScalarHost {
42
+ tmpl_field: Option<i64>,
43
+ }
44
+ fn tmpl_mutation_set_wrapped_host(record: &mut TmplOptionScalarHost) {
45
+ // TMPL:mutation_set_wrapped BEGIN
46
+ record.tmpl_field = Some(tmpl_rhs_placeholder2());
47
+ // TMPL:mutation_set_wrapped END
48
+ }
49
+
50
+ struct TmplArithmeticHost {
51
+ tmpl_field: i64,
52
+ }
53
+ fn tmpl_current_placeholder() -> i64 {
54
+ 0
55
+ }
56
+ fn tmpl_updated_placeholder() -> i64 {
57
+ 0
58
+ }
59
+ fn tmpl_mutation_arithmetic_host(record: &mut TmplArithmeticHost) {
60
+ // TMPL:mutation_arithmetic BEGIN
61
+ { let current = tmpl_current_placeholder(); record.tmpl_field = tmpl_updated_placeholder(); }
62
+ // TMPL:mutation_arithmetic END
63
+ }
64
+
65
+ // `remove:` on an entity list matches on the entity's identity field, not whole-element
66
+ // equality; `retain` keeps every element whose identity differs from the offered value.
67
+ struct TmplRemoveElement {
68
+ tmpl_id_field: i64,
69
+ }
70
+ struct TmplRemoveHost {
71
+ tmpl_field: Vec<TmplRemoveElement>,
72
+ }
73
+ fn tmpl_remove_match_placeholder() -> i64 {
74
+ 0
75
+ }
76
+ fn tmpl_mutation_remove_host(record: &mut TmplRemoveHost) {
77
+ // TMPL:mutation_remove BEGIN
78
+ record.tmpl_field.retain(|item| item.tmpl_id_field != tmpl_remove_match_placeholder());
79
+ // TMPL:mutation_remove END
80
+ }
@@ -0,0 +1,33 @@
1
+ // Exemplar shape for rust/project/registry.rb's `emit_query_table`; see mod.rs.
2
+ #![allow(dead_code, unused_variables)]
3
+
4
+ // A `const` cannot call a function, so the row is a real literal substituted wholesale.
5
+ // TMPL:query_table BEGIN
6
+ pub const QUERIES: &[crate::kernel::QueryDef] = &[
7
+ crate::kernel::QueryDef {
8
+ verb: "tmpl_verb",
9
+ aggregate: "tmpl_aggregate",
10
+ conditions: &[
11
+ crate::kernel::QueryCondition {
12
+ field: "tmpl_field",
13
+ comparator: crate::kernel::query_comparators::QueryComparator::Eq,
14
+ value: crate::kernel::QueryConditionValue::Literal("tmpl_literal"),
15
+ },
16
+ ],
17
+ reference_hop_conditions: &[
18
+ crate::kernel::read_model::ReferenceHopCondition {
19
+ via_field: "tmpl_via_field",
20
+ target_aggregate: "tmpl_target_aggregate",
21
+ through: &[crate::kernel::read_model::HopStep { via_field: "tmpl_via_field", target_aggregate: "tmpl_target_aggregate" }],
22
+ inner_field: "tmpl_inner_field",
23
+ inner_comparator: crate::kernel::query_comparators::QueryComparator::Eq,
24
+ inner_value: crate::kernel::QueryConditionValue::Literal("tmpl_literal"),
25
+ },
26
+ ],
27
+ order_by: Some(crate::kernel::query_ordering::OrderBy { field: "tmpl_order_field", descending: true, nulls: crate::kernel::query_ordering::NullsMode::Last }),
28
+ offset: Some(crate::kernel::query_ordering::Offset::Literal(1)),
29
+ limit: Some(crate::kernel::query_ordering::Limit::Literal(5)),
30
+ authorization: Some(crate::kernel::named_query::TenantAuth { query_name: "tmpl_query_name", tenant_field: "tmpl_tenant_field", policy: "tmpl_policy" }),
31
+ },
32
+ ];
33
+ // TMPL:query_table END