hecks 2.8.0 → 3.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.
- checksums.yaml +4 -4
- data/exe/hecks +50 -7
- data/lib/hecks/adapters/driven/claude_code.rb +4 -104
- data/lib/hecks/adapters/driven/d1.rb +44 -237
- data/lib/hecks/adapters/driven/folder.rb +17 -76
- data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
- data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
- data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
- data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
- data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
- data/lib/hecks/adapters/driven/heki.rb +13 -42
- data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
- data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
- data/lib/hecks/adapters/driven/lambda.rb +10 -84
- data/lib/hecks/adapters/driven/local_storage.rb +5 -40
- data/lib/hecks/adapters/driven/memory.rb +32 -100
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
- data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
- data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
- data/lib/hecks/adapters/driven/postgres/reconnect.rb +10 -32
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
- data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
- data/lib/hecks/adapters/driven/postgres.rb +149 -136
- data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
- data/lib/hecks/adapters/driven/prism.rb +48 -38
- data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
- data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
- data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
- data/lib/hecks/adapters/driven/sqlite.rb +128 -65
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +76 -62
- data/lib/hecks/adapters/driven.rb +5 -36
- data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
- data/lib/hecks/behaviors/dsl.rb +7 -25
- data/lib/hecks/behaviors/expectations.rb +32 -142
- data/lib/hecks/behaviors/ir.rb +7 -20
- data/lib/hecks/behaviors/rspec.rb +6 -17
- data/lib/hecks/behaviors/runner.rb +10 -34
- data/lib/hecks/behaviors.rb +4 -8
- data/lib/hecks/bench/cli.rb +62 -0
- data/lib/hecks/bench/environment.rb +71 -0
- data/lib/hecks/bench/postgres_probe.rb +30 -0
- data/lib/hecks/bench/report.rb +76 -0
- data/lib/hecks/bench/ruby_runner.rb +93 -0
- data/lib/hecks/bench/run.rb +55 -0
- data/lib/hecks/bench/rust_runner.rb +101 -0
- data/lib/hecks/bench/stats.rb +46 -0
- data/lib/hecks/bench/suite.rb +98 -0
- data/lib/hecks/bench/workload.rb +89 -0
- data/lib/hecks/bench.rb +17 -0
- data/lib/hecks/bluebook/aggregate.rb +9 -75
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
- data/lib/hecks/bluebook/assembly/build.rb +4 -15
- data/lib/hecks/bluebook/assembly/contract.rb +15 -136
- data/lib/hecks/bluebook/assembly/contracts.rb +56 -174
- data/lib/hecks/bluebook/assembly/marks.rb +31 -223
- data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
- data/lib/hecks/bluebook/assembly.rb +6 -45
- data/lib/hecks/bluebook/attribute.rb +12 -61
- data/lib/hecks/bluebook/behaviour/aggregate.rb +39 -39
- data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
- data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
- data/lib/hecks/bluebook/behaviour/command.rb +14 -66
- data/lib/hecks/bluebook/behaviour/domain_port.rb +11 -20
- data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
- data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
- data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
- data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
- data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
- data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
- data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
- data/lib/hecks/bluebook/capabilities.rb +17 -49
- data/lib/hecks/bluebook/chapter.rb +16 -50
- data/lib/hecks/bluebook/command.rb +23 -81
- data/lib/hecks/bluebook/domain_port.rb +49 -67
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +96 -708
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +63 -169
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +3 -1
- data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
- data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +42 -89
- data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +148 -197
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
- data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
- data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
- data/lib/hecks/bluebook/dsl/query_builder.rb +38 -43
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
- data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
- data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
- data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
- data/lib/hecks/bluebook/dsl/world_builder.rb +46 -111
- data/lib/hecks/bluebook/entity.rb +13 -71
- data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
- data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
- data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
- data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
- data/lib/hecks/bluebook/expression/resolver.rb +39 -661
- data/lib/hecks/bluebook/hexagon.rb +18 -33
- data/lib/hecks/bluebook/lifecycle.rb +5 -16
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
- data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
- data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
- data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -176
- data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -306
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
- data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
- data/lib/hecks/bluebook/meta_validator.rb +87 -352
- data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
- data/lib/hecks/bluebook/model_check.rb +122 -596
- data/lib/hecks/bluebook/pattern_subset.rb +49 -69
- data/lib/hecks/bluebook/process_manager.rb +13 -83
- data/lib/hecks/bluebook/project_loader.rb +3 -39
- data/lib/hecks/bluebook/project_register.rb +12 -60
- data/lib/hecks/bluebook/query.rb +27 -51
- data/lib/hecks/bluebook/read_model.rb +57 -81
- data/lib/hecks/bluebook/reference.rb +7 -41
- data/lib/hecks/bluebook/smoke_test.rb +9 -99
- data/lib/hecks/bluebook/synthesizer.rb +13 -62
- data/lib/hecks/bluebook/translation.rb +26 -62
- data/lib/hecks/bluebook/value_object.rb +11 -36
- data/lib/hecks/bluebook.rb +5 -22
- data/lib/hecks/cache_dir.rb +4 -23
- data/lib/hecks/canonical_json.rb +30 -0
- data/lib/hecks/chapters.rb +102 -0
- data/lib/hecks/cli/behaviors.rb +61 -0
- data/lib/hecks/cli/canonicalise.rb +25 -0
- data/lib/hecks/cli/check_engine_agreement.rb +32 -0
- data/lib/hecks/cli/check_era.rb +88 -0
- data/lib/hecks/cli/console.rb +66 -0
- data/lib/hecks/cli/deploy_template_diff.rb +40 -0
- data/lib/hecks/cli/doc_coverage.rb +32 -0
- data/lib/hecks/cli/document.rb +5 -23
- data/lib/hecks/cli/expression_projection.rb +41 -0
- data/lib/hecks/cli/follow.rb +88 -0
- data/lib/hecks/cli/history.rb +44 -0
- data/lib/hecks/cli/ir.rb +4 -6
- data/lib/hecks/cli/mcp.rb +5 -6
- data/lib/hecks/cli/model_check.rb +24 -88
- data/lib/hecks/cli/pattern_cases.rb +47 -0
- data/lib/hecks/cli/present.rb +39 -0
- data/lib/hecks/cli/project_cli.rb +223 -64
- data/lib/hecks/cli/project_diagrams.rb +4 -10
- data/lib/hecks/cli/project_glossary.rb +44 -0
- data/lib/hecks/cli/reference.rb +46 -0
- data/lib/hecks/cli/refresh_projections.rb +44 -0
- data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +150 -0
- data/lib/hecks/cli/release.rb +70 -0
- data/lib/hecks/cli/release_gem.rb +59 -0
- data/lib/hecks/cli/rspec_io_parallel_files.rb +137 -0
- data/lib/hecks/cli/rspec_shard_files.rb +66 -0
- data/lib/hecks/cli/run.rb +15 -61
- data/lib/hecks/cli/seed_semantics_corpus.rb +71 -0
- data/lib/hecks/cli/serve_query_ir_mcp.rb +30 -0
- data/lib/hecks/cli/shape.rb +70 -0
- data/lib/hecks/cli/smoke_http.rb +230 -0
- data/lib/hecks/cli/smoke_test.rb +7 -19
- data/lib/hecks/cli/spec_example.rb +27 -0
- data/lib/hecks/cli/statements.rb +32 -0
- data/lib/hecks/cli/stores.rb +4 -6
- data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
- data/lib/hecks/cli.rb +216 -73
- data/lib/hecks/codemod.rb +324 -0
- data/lib/hecks/construct.rb +8 -34
- data/lib/hecks/corpus.rb +423 -0
- data/lib/hecks/deploy/bluebook/deploy.bluebook +617 -158
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -11
- data/lib/hecks/deploy/oidc.json +82 -2
- data/lib/hecks/doc/reference.rb +351 -0
- data/lib/hecks/doors/cli_door.rb +196 -0
- data/lib/hecks/doors/cli_runner.rb +297 -0
- data/lib/hecks/{facade → doors}/command_request.rb +14 -34
- data/lib/hecks/doors/handle.rb +206 -0
- data/lib/hecks/doors/json_door.rb +132 -0
- data/lib/hecks/doors/launcher_options.rb +129 -0
- data/lib/hecks/{cli → doors}/mcp_door.rb +25 -120
- data/lib/hecks/doors/mcp_door_scope.rb +97 -0
- data/lib/hecks/doors/ruby_door/aggregate_door.rb +162 -0
- data/lib/hecks/doors/ruby_door/chapter.rb +72 -0
- data/lib/hecks/doors/ruby_door.rb +77 -0
- data/lib/hecks/doors.rb +61 -0
- data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
- data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
- data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
- data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
- data/lib/hecks/embryonaut_bluebook.rb +5 -72
- data/lib/hecks/engine_agreement.rb +156 -0
- data/lib/hecks/facade.rb +23 -51
- data/lib/hecks/forms/app.rb +21 -76
- data/lib/hecks/forms/banking_presentation.rb +50 -0
- data/lib/hecks/forms/command_form_renderer.rb +10 -29
- data/lib/hecks/forms/field_renderer.rb +17 -156
- data/lib/hecks/forms/field_shape.rb +31 -222
- data/lib/hecks/forms/html.rb +12 -47
- data/lib/hecks/forms/index_renderer.rb +1 -4
- data/lib/hecks/forms/page.rb +3 -9
- data/lib/hecks/forms/params.rb +14 -60
- data/lib/hecks/forms/port_argument.rb +2 -19
- data/lib/hecks/forms/query_form_renderer.rb +4 -79
- data/lib/hecks/forms/record_renderer.rb +8 -75
- data/lib/hecks/forms/record_table.rb +7 -50
- data/lib/hecks/forms/reference_options.rb +3 -30
- data/lib/hecks/forms/value_object_shape.rb +8 -35
- data/lib/hecks/forms.rb +5 -33
- data/lib/hecks/fqn.rb +5 -12
- data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
- data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
- data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
- data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
- data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
- data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
- data/lib/hecks/framework.rb +11 -80
- data/lib/hecks/freezer.rb +5 -39
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +393 -0
- data/lib/hecks/fuzzing/combination_miner.rb +86 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +214 -0
- data/lib/hecks/fuzzing/coverage_campaign.rb +143 -0
- data/lib/hecks/fuzzing/differential.rb +156 -0
- data/lib/hecks/fuzzing/domain_generator.rb +615 -0
- data/lib/hecks/fuzzing/era_boundary.rb +71 -0
- data/lib/hecks/fuzzing/form_census.rb +136 -0
- data/lib/hecks/fuzzing/generated_domain_check.rb +93 -0
- data/lib/hecks/fuzzing/invalid_value_generator.rb +64 -0
- data/lib/hecks/fuzzing/isolated_boot.rb +301 -0
- data/lib/hecks/fuzzing/nondeterministic.rb +51 -0
- data/lib/hecks/fuzzing/outside_world.rb +45 -0
- data/lib/hecks/fuzzing/persistence_parity.rb +102 -0
- data/lib/hecks/fuzzing/properties/corrections.rb +88 -0
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +314 -0
- data/lib/hecks/fuzzing/properties/guards.rb +190 -0
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +300 -0
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +93 -0
- data/lib/hecks/fuzzing/properties/outbox.rb +89 -0
- data/lib/hecks/fuzzing/properties/querying.rb +175 -0
- data/lib/hecks/fuzzing/properties.rb +162 -0
- data/lib/hecks/fuzzing/qa_settings.rb +123 -0
- data/lib/hecks/fuzzing/replay.rb +505 -0
- data/lib/hecks/fuzzing/rotation_priority.rb +48 -0
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +108 -0
- data/lib/hecks/fuzzing/self_consistency.rb +339 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +385 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +132 -0
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +95 -0
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +77 -0
- data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +109 -0
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +237 -0
- data/lib/hecks/fuzzing/sequence_generator.rb +189 -0
- data/lib/hecks/fuzzing/shrinker.rb +166 -0
- data/lib/hecks/fuzzing/structural_skips.rb +33 -0
- data/lib/hecks/fuzzing/sweep_depth.rb +43 -0
- data/lib/hecks/fuzzing/target_capabilities.rb +163 -0
- data/lib/hecks/fuzzing/value_generator.rb +216 -0
- data/lib/hecks/fuzzing.rb +23 -0
- data/lib/hecks/grammar/evolve.rb +336 -0
- data/lib/hecks/grammar/expression.bluebook +15 -40
- data/lib/hecks/grammar/translation.bluebook +3 -6
- data/lib/hecks/grammar.rb +16 -41
- data/lib/hecks/hecks/adapters/codebase/codemods.rb +45 -0
- data/lib/hecks/hecks/adapters/codebase/conformance.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +202 -0
- data/lib/hecks/hecks/adapters/codebase/gem_registry.rb +80 -0
- data/lib/hecks/hecks/adapters/codebase/kernel_tables.rb +54 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +240 -0
- data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +102 -0
- data/lib/hecks/hecks/adapters/codebase/publishing.rb +142 -0
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +67 -0
- data/lib/hecks/hecks/adapters/codebase/release_facts.rb +90 -0
- data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +83 -0
- data/lib/hecks/hecks/adapters/codebase/secret_vault.rb +36 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.adapter +7 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +189 -0
- data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/style.rb +171 -0
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +55 -0
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +165 -0
- data/lib/hecks/hecks/adapters/codebase/tree.rb +111 -0
- data/lib/hecks/hecks/adapters/console_capture.rb +79 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.rb +108 -0
- data/lib/hecks/hecks/adapters/git.adapter +7 -0
- data/lib/hecks/hecks/adapters/git.rb +102 -0
- data/lib/hecks/hecks/adapters/host_http.adapter +7 -0
- data/lib/hecks/hecks/adapters/host_http.rb +65 -0
- data/lib/hecks/hecks/adapters/in_process_boot.adapter +7 -0
- data/lib/hecks/hecks/adapters/in_process_boot.rb +197 -0
- data/lib/hecks/hecks/adapters/in_process_operations.rb +202 -0
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +143 -0
- data/lib/hecks/hecks/adapters/journal_store/compaction.rb +145 -0
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +132 -0
- data/lib/hecks/hecks/adapters/journal_store/examination.rb +135 -0
- data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +163 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +187 -0
- data/lib/hecks/hecks/adapters/journal_store.adapter +7 -0
- data/lib/hecks/hecks/adapters/journal_store.rb +64 -0
- data/lib/hecks/hecks/adapters/local_files.adapter +7 -0
- data/lib/hecks/hecks/adapters/local_files.rb +46 -0
- data/lib/hecks/hecks/adapters/pg_admin.adapter +7 -0
- data/lib/hecks/hecks/adapters/pg_admin.rb +245 -0
- data/lib/hecks/hecks/adapters/process_pool.adapter +7 -0
- data/lib/hecks/hecks/adapters/process_pool.rb +119 -0
- data/lib/hecks/hecks/adapters/rust_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +179 -0
- data/lib/hecks/hecks/adapters/rust_workspace.rb +150 -0
- data/lib/hecks/hecks/adapters/shell.adapter +7 -0
- data/lib/hecks/hecks/adapters/shell.rb +49 -0
- data/lib/hecks/hecks/adapters/terminal.adapter +7 -0
- data/lib/hecks/hecks/adapters/terminal.rb +74 -0
- data/lib/hecks/hecks/codebase.behaviors +172 -0
- data/lib/hecks/hecks/codebase.bluebook +2453 -0
- data/lib/hecks/hecks/context_map.hecksagon +13 -0
- data/lib/hecks/hecks/custodian.behaviors +179 -0
- data/lib/hecks/hecks/custodian.bluebook +1847 -0
- data/lib/hecks/hecks/deploy.behaviors +74 -0
- data/lib/hecks/hecks/deploy.world +12 -0
- data/lib/hecks/hecks/environments/memory.world +10 -0
- data/lib/hecks/hecks/governance.world +7 -0
- data/lib/hecks/hecks/hecks.behaviors +62 -0
- data/lib/hecks/hecks/hecks.bluebook +124 -0
- data/lib/hecks/hecks/hecks.hecksagon +390 -0
- data/lib/hecks/hecks/hecks.world +42 -0
- data/lib/hecks/ir.rb +14 -83
- data/lib/hecks/kernel_capabilities.rb +194 -0
- data/lib/hecks/language/adapter.bluebook +2 -7
- data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
- data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
- data/lib/hecks/language/bluebook/bluebook.bluebook +26 -83
- data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
- data/lib/hecks/language/bluebook/command.bluebook +27 -144
- data/lib/hecks/language/bluebook/entity.bluebook +24 -97
- data/lib/hecks/language/bluebook/policy.bluebook +16 -67
- data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
- data/lib/hecks/language/bluebook/projection.bluebook +126 -60
- data/lib/hecks/language/bluebook/query.bluebook +19 -43
- data/lib/hecks/language/bluebook/shape.bluebook +23 -73
- data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
- data/lib/hecks/language/bluebook/vocabulary.bluebook +83 -198
- data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
- data/lib/hecks/language/hecksagon/domain_port.bluebook +14 -19
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +26 -25
- data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
- data/lib/hecks/language/oidc.json +35 -0
- data/lib/hecks/language/port.bluebook +4 -17
- data/lib/hecks/language/translation/translation.bluebook +3 -9
- data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
- data/lib/hecks/language/world/wiring.bluebook +1 -3
- data/lib/hecks/language/world/world.bluebook +5 -7
- data/lib/hecks/literal.rb +8 -50
- data/lib/hecks/mcp_stdio_guard.rb +4 -41
- data/lib/hecks/naming.rb +29 -137
- data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
- data/lib/hecks/persistence_legacy_fixture.rb +113 -0
- data/lib/hecks/ports/access_control.rb +7 -23
- data/lib/hecks/ports/agent/answers.rb +5 -23
- data/lib/hecks/ports/agent.rb +47 -172
- data/lib/hecks/ports/authentication.rb +12 -39
- data/lib/hecks/ports/authorization.rb +16 -43
- data/lib/hecks/ports/clock.rb +5 -45
- data/lib/hecks/ports/extraction.rb +7 -12
- data/lib/hecks/ports/identity_assignment.rb +8 -29
- data/lib/hecks/ports/identity_generation.rb +6 -29
- data/lib/hecks/ports/identity_resolution.rb +2 -10
- data/lib/hecks/ports/key_vault.rb +9 -45
- data/lib/hecks/ports/persistence/append_only.rb +61 -64
- data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
- data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
- data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
- data/lib/hecks/ports/persistence/plugin.rb +13 -42
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +44 -144
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +20 -85
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +18 -24
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +19 -76
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +43 -127
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +131 -555
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
- data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +227 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +50 -47
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +1 -0
- data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
- data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
- data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
- data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
- data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
- data/lib/hecks/ports/persistence/state_codec.rb +47 -108
- data/lib/hecks/ports/persistence.rb +7 -14
- data/lib/hecks/ports/projection.rb +42 -84
- data/lib/hecks/ports/query/in_memory.rb +10 -58
- data/lib/hecks/ports/query/ordering.rb +11 -32
- data/lib/hecks/ports/query.rb +14 -37
- data/lib/hecks/ports.rb +2 -8
- data/lib/hecks/projection_files.rb +285 -0
- data/lib/hecks/projections/bootstrap_table.rb +12 -44
- data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
- data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
- data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
- data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
- data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
- data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
- data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
- data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
- data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
- data/lib/hecks/projections/deploy/fargate.rb +40 -207
- data/lib/hecks/projections/deploy/lambda.rb +191 -708
- data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
- data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
- data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
- data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
- data/lib/hecks/projections/deploy/preview/script.rb +2 -14
- data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
- data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
- data/lib/hecks/projections/deploy/preview/template.rb +3 -59
- data/lib/hecks/projections/deploy/preview.rb +2 -67
- data/lib/hecks/projections/deploy/scripts/deploy-service.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts/expected-era.header +1 -1
- data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +3 -3
- data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
- data/lib/hecks/projections/deploy/scripts/smoke-after-deploy.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts.rb +4 -57
- data/lib/hecks/projections/deploy/shared.rb +48 -147
- data/lib/hecks/projections/deploy/smoke.rb +4 -61
- data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
- data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
- data/lib/hecks/projections/deploy/template_diff.rb +5 -57
- data/lib/hecks/projections/diagrams.rb +22 -584
- data/lib/hecks/projections/glossary/html.rb +14 -130
- data/lib/hecks/projections/glossary/markdown.rb +8 -69
- data/lib/hecks/projections/glossary/mermaid.rb +9 -66
- data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
- data/lib/hecks/projections/glossary/sentences.rb +14 -159
- data/lib/hecks/projections/glossary.rb +30 -222
- data/lib/hecks/projections/ir.rb +3 -10
- data/lib/hecks/projections/model/deviations.rb +16 -43
- data/lib/hecks/projections/model.rb +12 -51
- data/lib/hecks/projections/oidc.rb +12 -56
- data/lib/hecks/projections/parser_table.rb +13 -32
- data/lib/hecks/projections/reference.rb +4 -18
- data/lib/hecks/projections/rust_vocabulary.rb +13 -251
- data/lib/hecks/projections/shape.rb +3 -29
- data/lib/hecks/projections/statements.rb +7 -86
- data/lib/hecks/projections/vocabulary.rb +6 -22
- data/lib/hecks/projections.rb +2 -16
- data/lib/hecks/projector/cli_projector.rb +154 -400
- data/lib/hecks/projector/docs_projector.rb +10 -201
- data/lib/hecks/projector/exporter.rb +42 -134
- data/lib/hecks/projector/ir_projector.rb +2 -9
- data/lib/hecks/projector/narrate_projector.rb +15 -189
- data/lib/hecks/projector/target.rb +13 -76
- data/lib/hecks/projector.rb +30 -121
- data/lib/hecks/quality_control/adapters/agent.adapter +7 -0
- data/lib/hecks/quality_control/adapters/agent.rb +58 -0
- data/lib/hecks/quality_control/adapters/angle_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/angle_tools.rb +15 -0
- data/lib/hecks/quality_control/adapters/clearance_recorder.rb +36 -0
- data/lib/hecks/quality_control/adapters/clearance_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/clearance_tools.rb +17 -0
- data/lib/hecks/quality_control/adapters/git_pr.adapter +7 -0
- data/lib/hecks/quality_control/adapters/git_pr.rb +226 -0
- data/lib/hecks/quality_control/adapters/github_checks.adapter +9 -0
- data/lib/hecks/quality_control/adapters/github_checks.rb +83 -0
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +56 -0
- data/lib/hecks/quality_control/adapters/github_issues.adapter +7 -0
- data/lib/hecks/quality_control/adapters/github_issues.rb +49 -0
- data/lib/hecks/quality_control/adapters/qa_tool.rb +59 -0
- data/lib/hecks/quality_control/adapters/sweep_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/sweep_tools.rb +51 -0
- data/lib/hecks/quality_control/adapters/target_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/target_tools.rb +43 -0
- data/lib/hecks/quality_control/cli/child.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +248 -0
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +163 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains.rb +450 -0
- data/lib/hecks/quality_control/cli/qa_log_bug.rb +195 -0
- data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +220 -0
- data/lib/hecks/quality_control/cli/qa_open_pr.rb +305 -0
- data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +154 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +159 -0
- data/lib/hecks/quality_control/cli/qa_pr_check.rb +232 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles.rb +142 -0
- data/lib/hecks/quality_control/cli/qa_seed_targets.rb +69 -0
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +280 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +329 -0
- data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +92 -0
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +117 -0
- data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +175 -0
- data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_sweep.rb +611 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +274 -0
- data/lib/hecks/quality_control/quality_control.bluebook +2224 -0
- data/lib/hecks/quality_control/quality_control.hecksagon +13 -0
- data/lib/hecks/quality_control/quality_control.ports.hecksagon +54 -0
- data/lib/hecks/query_ir.rb +346 -0
- data/lib/hecks/query_ir_mcp.rb +198 -0
- data/lib/hecks/query_specification/common/comparators.rb +5 -26
- data/lib/hecks/query_specification/common/comparison.rb +35 -143
- data/lib/hecks/query_specification/common/dsl.rb +8 -24
- data/lib/hecks/query_specification/common/null_policy.rb +20 -70
- data/lib/hecks/query_specification/common/options.rb +2 -6
- data/lib/hecks/query_specification/common/where_clause.rb +2 -10
- data/lib/hecks/query_specification/field_path.rb +37 -77
- data/lib/hecks/query_specification/hop_path.rb +12 -76
- data/lib/hecks/release/gem_pin.rb +2 -26
- data/lib/hecks/release/runner/ci_publisher.rb +5 -8
- data/lib/hecks/release/runner/clean_tree.rb +42 -0
- data/lib/hecks/release/runner/commands.rb +2 -4
- data/lib/hecks/release/runner/console.rb +6 -0
- data/lib/hecks/release/runner/gem_publisher.rb +15 -9
- data/lib/hecks/release/runner/npm_publisher.rb +9 -53
- data/lib/hecks/release/runner/preflight.rb +29 -20
- data/lib/hecks/release/runner/published.rb +8 -26
- data/lib/hecks/release/runner/tagger.rb +31 -23
- data/lib/hecks/release/runner.rb +60 -38
- data/lib/hecks/rendering.rb +4 -26
- data/lib/hecks/router/namespace_installer.rb +15 -39
- data/lib/hecks/router.rb +4 -8
- data/lib/hecks/runtime/adapter_lookup.rb +124 -0
- data/lib/hecks/runtime/aggregate_lock.rb +8 -33
- data/lib/hecks/runtime/boot_gates.rb +3 -18
- data/lib/hecks/runtime/caller.rb +19 -59
- data/lib/hecks/runtime/capability_graph.rb +5 -21
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +27 -160
- data/lib/hecks/runtime/command_interpreter.rb +124 -306
- data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
- data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
- data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
- data/lib/hecks/runtime/command_rules/emission.rb +8 -21
- data/lib/hecks/runtime/command_rules/references.rb +23 -202
- data/lib/hecks/runtime/dependency_planning.rb +50 -104
- data/lib/hecks/runtime/dispatcher.rb +134 -243
- data/lib/hecks/runtime/entity_element.rb +40 -462
- data/lib/hecks/runtime/entity_interpreter.rb +64 -219
- data/lib/hecks/runtime/errors.rb +32 -115
- data/lib/hecks/runtime/event.rb +3 -25
- data/lib/hecks/runtime/identity.rb +18 -154
- data/lib/hecks/runtime/instance.rb +18 -150
- data/lib/hecks/runtime/interpreting.rb +14 -70
- data/lib/hecks/runtime/invocation.rb +28 -164
- data/lib/hecks/runtime/loader.rb +109 -194
- data/lib/hecks/runtime/outbox.rb +39 -262
- data/lib/hecks/runtime/policy_interpreter.rb +43 -202
- data/lib/hecks/runtime/port_operation_interpreter.rb +28 -97
- data/lib/hecks/runtime/query_interpreter.rb +122 -187
- data/lib/hecks/runtime/reaction_invocation.rb +36 -138
- data/lib/hecks/runtime/reaction_outcome.rb +89 -0
- data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
- data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
- data/lib/hecks/runtime/reference_hop.rb +8 -81
- data/lib/hecks/runtime/refusal_wording.rb +28 -87
- data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
- data/lib/hecks/runtime/registry/verification.rb +213 -227
- data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
- data/lib/hecks/runtime/registry.rb +156 -247
- data/lib/hecks/runtime/remote_dispatcher.rb +68 -154
- data/lib/hecks/runtime/routing.rb +4 -15
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
- data/lib/hecks/runtime/saga_interpreter.rb +79 -263
- data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
- data/lib/hecks/runtime/tenant_check.rb +6 -68
- data/lib/hecks/runtime/tenant_scope.rb +3 -28
- data/lib/hecks/runtime/value/admission.rb +16 -67
- data/lib/hecks/runtime/value/coercion.rb +162 -760
- data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
- data/lib/hecks/runtime/value/field_checks.rb +172 -0
- data/lib/hecks/runtime/value.rb +15 -84
- data/lib/hecks/runtime.rb +35 -69
- data/lib/hecks/rust_build/conformance.rb +158 -0
- data/lib/hecks/rust_build/conformance_fuzz.rb +71 -0
- data/lib/hecks/rust_build/coverage.rb +218 -0
- data/lib/hecks/rust_build/native_build.rb +124 -0
- data/lib/hecks/rust_build/project_rust/root_mod.rb +120 -0
- data/lib/hecks/rust_build/project_rust.rb +332 -0
- data/lib/hecks/rust_build/wasm.rb +105 -0
- data/lib/hecks/rust_build/wasm_browser.rb +113 -0
- data/lib/hecks/rust_build.rb +144 -0
- data/lib/hecks/storehouse.rb +155 -582
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +10 -34
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
- data/lib/hecks/three_zero/forms.yml +127 -0
- data/lib/hecks/three_zero.rb +12 -0
- data/lib/hecks/tools/argument_gate_matrix.rb +316 -0
- data/lib/hecks/tools/comment_style.rb +1070 -0
- data/lib/hecks/tools/corpus_report.rb +87 -0
- data/lib/hecks/tools/deploy_recipe.rb +255 -0
- data/lib/hecks/tools/deploy_recipe_lint.rb +282 -0
- data/lib/hecks/tools/drop_implicit_append_fields.rb +95 -0
- data/lib/hecks/tools/era_projection_backfill.rb +94 -0
- data/lib/hecks/tools/era_reattest.rb +146 -0
- data/lib/hecks/tools/evolve_run.rb +189 -0
- data/lib/hecks/tools/fuzz_sweep.rb +373 -0
- data/lib/hecks/tools/heki_compaction.rb +100 -0
- data/lib/hecks/tools/hoist_local_givens.rb +246 -0
- data/lib/hecks/tools/journal_compaction.rb +89 -0
- data/lib/hecks/tools/oidc_manifests.rb +70 -0
- data/lib/hecks/tools/query_ir_run.rb +81 -0
- data/lib/hecks/tools/regeneration_run.rb +166 -0
- data/lib/hecks/tools/rust_comment_style.rb +642 -0
- data/lib/hecks/tools/sequence_script.rb +62 -0
- data/lib/hecks/tools/tail_merge.rb +117 -0
- data/lib/hecks/tools/tenant_provisioning.rb +142 -0
- data/lib/hecks/tools/translation_audit.rb +208 -0
- data/lib/hecks/tools/translation_scaffold.rb +131 -0
- data/lib/hecks/tools.rb +86 -0
- data/lib/hecks/vendoring/git_environment.rb +2 -8
- data/lib/hecks/vendoring/git_source.rb +4 -10
- data/lib/hecks/vendoring.rb +7 -46
- data/lib/hecks/version.rb +3 -14
- data/lib/hecks.rb +52 -90
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
- data/qa/settings.yml +66 -0
- data/rust/.cargo/config.toml +6 -0
- data/rust/.gitignore +2 -0
- data/rust/Cargo.lock +54 -0
- data/rust/Cargo.toml +61 -0
- data/rust/build/.cargo/config.toml +3 -0
- data/rust/build/.gitignore +1 -0
- data/rust/build/Cargo.lock +7 -0
- data/rust/build/Cargo.toml +19 -0
- data/rust/build/src/build_artifact.rs +47 -0
- data/rust/build/src/cargo_sync.rs +248 -0
- data/rust/build/src/json.rs +421 -0
- data/rust/build/src/lineage_pass.rs +285 -0
- data/rust/build/src/main.rs +51 -0
- data/rust/build/src/optional_pass.rs +150 -0
- data/rust/build/src/pipeline.rs +264 -0
- data/rust/build/src/reserved_names.rs +76 -0
- data/rust/build/src/resolve.rs +124 -0
- data/rust/build/src/root.rs +25 -0
- data/rust/build/src/sidecars.rs +73 -0
- data/rust/build/src/subprocess.rs +51 -0
- data/rust/build/src/tmp.rs +31 -0
- data/rust/codegen/.cargo/config.toml +3 -0
- data/rust/codegen/.gitignore +1 -0
- data/rust/codegen/Cargo.lock +7 -0
- data/rust/codegen/Cargo.toml +20 -0
- data/rust/codegen/src/attr.rs +32 -0
- data/rust/codegen/src/bridging.rs +481 -0
- data/rust/codegen/src/commands.rs +1226 -0
- data/rust/codegen/src/constraints.rs +109 -0
- data/rust/codegen/src/dependency_planning.rs +209 -0
- data/rust/codegen/src/domain_generator.rs +1288 -0
- data/rust/codegen/src/exemplar.rs +230 -0
- data/rust/codegen/src/expr_emitter.rs +87 -0
- data/rust/codegen/src/fielded.rs +192 -0
- data/rust/codegen/src/hecks_naming.rs +33 -0
- data/rust/codegen/src/json.rs +335 -0
- data/rust/codegen/src/json_codec.rs +697 -0
- data/rust/codegen/src/literal.rs +207 -0
- data/rust/codegen/src/main.rs +290 -0
- data/rust/codegen/src/manifest.rs +227 -0
- data/rust/codegen/src/mutations.rs +784 -0
- data/rust/codegen/src/naming.rs +286 -0
- data/rust/codegen/src/ports.rs +208 -0
- data/rust/codegen/src/prelude.rs +116 -0
- data/rust/codegen/src/queries.rs +786 -0
- data/rust/codegen/src/reactions.rs +532 -0
- data/rust/codegen/src/read_models.rs +697 -0
- data/rust/codegen/src/reference_specs.rs +40 -0
- data/rust/codegen/src/registry.rs +966 -0
- data/rust/codegen/src/reserved_names.rs +76 -0
- data/rust/codegen/src/shared.rs +93 -0
- data/rust/codegen/src/skip_reason.rs +25 -0
- data/rust/codegen/src/types.rs +362 -0
- data/rust/host/.cargo/config.toml +3 -0
- data/rust/host/.gitignore +1 -0
- data/rust/host/Cargo.lock +4297 -0
- data/rust/host/Cargo.toml +61 -0
- data/rust/host/HECKS_RELEASE +1 -0
- data/rust/host/rds-ca-bundle.pem +2736 -0
- data/rust/host/src/api.rs +1596 -0
- data/rust/host/src/approval.rs +652 -0
- data/rust/host/src/auth.rs +1287 -0
- data/rust/host/src/bin/expr_harness.rs +46 -0
- data/rust/host/src/bin/lineage_harness.rs +119 -0
- data/rust/host/src/bin/mint_harness.rs +135 -0
- data/rust/host/src/checkout.rs +265 -0
- data/rust/host/src/dispatch.rs +1443 -0
- data/rust/host/src/expr_json.rs +1117 -0
- data/rust/host/src/field_hints.rs +52 -0
- data/rust/host/src/ir.rs +733 -0
- data/rust/host/src/journal.rs +874 -0
- data/rust/host/src/lambda_client.rs +378 -0
- data/rust/host/src/log.rs +147 -0
- data/rust/host/src/main.rs +474 -0
- data/rust/host/src/mint.rs +1865 -0
- data/rust/host/src/payments/keystore.rs +330 -0
- data/rust/host/src/payments/tests.rs +1400 -0
- data/rust/host/src/payments.rs +767 -0
- data/rust/host/src/presentation.rs +698 -0
- data/rust/host/src/presentation_write.rs +1431 -0
- data/rust/host/src/query_step.rs +149 -0
- data/rust/host/src/rate_limit.rs +904 -0
- data/rust/host/src/reference_transform.rs +241 -0
- data/rust/host/src/reference_validate.rs +338 -0
- data/rust/host/src/resend.rs +296 -0
- data/rust/host/src/secrets.rs +106 -0
- data/rust/host/src/server.rs +663 -0
- data/rust/host/src/storage_shape.rs +175 -0
- data/rust/host/src/test_pg.rs +40 -0
- data/rust/host/src/ui_schema.rs +1351 -0
- data/rust/host/src/wasm_runner.rs +191 -0
- data/rust/host/src/web/newsletter/cooldown.rs +126 -0
- data/rust/host/src/web/newsletter/tests.rs +104 -0
- data/rust/host/src/web/newsletter.rs +310 -0
- data/rust/host/src/web/newsletter_send.rs +357 -0
- data/rust/host/src/web/registrations.rs +1505 -0
- data/rust/host/src/web.rs +2937 -0
- data/rust/lsp/.gitignore +1 -0
- data/rust/lsp/Cargo.lock +7 -0
- data/rust/lsp/Cargo.toml +16 -0
- data/rust/lsp/README.md +133 -0
- data/rust/lsp/src/diagnostics.rs +165 -0
- data/rust/lsp/src/json.rs +385 -0
- data/rust/lsp/src/main.rs +399 -0
- data/rust/lsp/src/outline.rs +177 -0
- data/rust/lsp/src/rpc.rs +67 -0
- data/rust/parser/.cargo/config.toml +5 -0
- data/rust/parser/.gitignore +1 -0
- data/rust/parser/Cargo.lock +7 -0
- data/rust/parser/Cargo.toml +21 -0
- data/rust/parser/src/build/closed_sets.rs +27 -0
- data/rust/parser/src/build/identity.rs +276 -0
- data/rust/parser/src/build/mod.rs +12 -0
- data/rust/parser/src/build/naming.rs +141 -0
- data/rust/parser/src/build/pattern_subset.rs +161 -0
- data/rust/parser/src/build/query_derive.rs +72 -0
- data/rust/parser/src/build/query_inference.rs +269 -0
- data/rust/parser/src/build/query_options.rs +100 -0
- data/rust/parser/src/build/read_model.rs +94 -0
- data/rust/parser/src/build/references.rs +32 -0
- data/rust/parser/src/canonical.rs +114 -0
- data/rust/parser/src/diag.rs +55 -0
- data/rust/parser/src/emit.rs +953 -0
- data/rust/parser/src/expr/ast_json.rs +147 -0
- data/rust/parser/src/expr/evaluator.rs +81 -0
- data/rust/parser/src/expr/mod.rs +84 -0
- data/rust/parser/src/expr/resolver.rs +497 -0
- data/rust/parser/src/ir.rs +387 -0
- data/rust/parser/src/keywords.rs +585 -0
- data/rust/parser/src/lex.rs +662 -0
- data/rust/parser/src/main.rs +252 -0
- data/rust/parser/src/parse/aggregate.rs +612 -0
- data/rust/parser/src/parse/chapter.rs +517 -0
- data/rust/parser/src/parse/command.rs +637 -0
- data/rust/parser/src/parse/domain_port.rs +127 -0
- data/rust/parser/src/parse/entity.rs +527 -0
- data/rust/parser/src/parse/file.rs +67 -0
- data/rust/parser/src/parse/hecksagon.rs +231 -0
- data/rust/parser/src/parse/lifecycle.rs +162 -0
- data/rust/parser/src/parse/mod.rs +1262 -0
- data/rust/parser/src/parse/policy.rs +87 -0
- data/rust/parser/src/parse/process_manager.rs +305 -0
- data/rust/parser/src/parse/query.rs +100 -0
- data/rust/parser/src/parse/read_model.rs +214 -0
- data/rust/parser/src/parse/value_object.rs +250 -0
- data/rust/parser/src/ruby_value.rs +422 -0
- data/rust/project/bridging.rb +257 -0
- data/rust/project/commands.rb +877 -0
- data/rust/project/constraints.rb +86 -0
- data/rust/project/dependency_planning.rb +178 -0
- data/rust/project/domain_generator.rb +980 -0
- data/rust/project/exemplar.rb +148 -0
- data/rust/project/expr_emitter.rb +72 -0
- data/rust/project/fielded.rb +141 -0
- data/rust/project/json_codec.rb +641 -0
- data/rust/project/mutations.rb +721 -0
- data/rust/project/naming.rb +205 -0
- data/rust/project/ports.rb +65 -0
- data/rust/project/queries.rb +493 -0
- data/rust/project/reactions.rb +317 -0
- data/rust/project/read_models.rb +690 -0
- data/rust/project/reference_specs.rb +27 -0
- data/rust/project/registry.rb +396 -0
- data/rust/project/skip_reason.rb +29 -0
- data/rust/project/types.rb +225 -0
- data/rust/project/write_if_changed.rb +83 -0
- data/rust/project.rb +30 -0
- data/rust/project_rust_pipeline.rb +383 -0
- data/rust/src/exemplar/commands.rs +279 -0
- data/rust/src/exemplar/constraints.rs +18 -0
- data/rust/src/exemplar/fielded.rs +280 -0
- data/rust/src/exemplar/json.rs +277 -0
- data/rust/src/exemplar/mod.rs +17 -0
- data/rust/src/exemplar/mutations.rs +80 -0
- data/rust/src/exemplar/queries.rs +33 -0
- data/rust/src/exemplar/reactions.rs +88 -0
- data/rust/src/exemplar/read_models.rs +48 -0
- data/rust/src/exemplar/registry.rs +166 -0
- data/rust/src/exemplar/types.rs +44 -0
- data/rust/src/kernel/attribute_shapes/composite.rs +88 -0
- data/rust/src/kernel/attribute_shapes/list.rs +18 -0
- data/rust/src/kernel/attribute_shapes/mod.rs +44 -0
- data/rust/src/kernel/attribute_shapes/optional.rs +9 -0
- data/rust/src/kernel/attribute_shapes/scalar.rs +39 -0
- data/rust/src/kernel/cli.rs +585 -0
- data/rust/src/kernel/dispatch.rs +1090 -0
- data/rust/src/kernel/expr.rs +458 -0
- data/rust/src/kernel/expression_operators/arithmetic.rs +128 -0
- data/rust/src/kernel/expression_operators/comparison.rs +48 -0
- data/rust/src/kernel/expression_operators/enumeration.rs +232 -0
- data/rust/src/kernel/expression_operators/logical.rs +13 -0
- data/rust/src/kernel/expression_operators/membership.rs +18 -0
- data/rust/src/kernel/expression_operators/mod.rs +68 -0
- data/rust/src/kernel/expression_operators/pattern_match.rs +73 -0
- data/rust/src/kernel/expression_operators/positional.rs +126 -0
- data/rust/src/kernel/expression_operators/presence.rs +101 -0
- data/rust/src/kernel/expression_operators/sign_test.rs +16 -0
- data/rust/src/kernel/expression_operators/sized.rs +35 -0
- data/rust/src/kernel/expression_operators/text.rs +79 -0
- data/rust/src/kernel/expression_operators/to_string.rs +18 -0
- data/rust/src/kernel/json.rs +779 -0
- data/rust/src/kernel/mod.rs +133 -0
- data/rust/src/kernel/named_query.rs +219 -0
- data/rust/src/kernel/orchestrate.rs +1810 -0
- data/rust/src/kernel/pattern.rs +307 -0
- data/rust/src/kernel/query_comparators.rs +206 -0
- data/rust/src/kernel/query_ordering.rs +103 -0
- data/rust/src/kernel/read_model.rs +914 -0
- data/rust/src/kernel/reference_lookup.rs +149 -0
- data/rust/src/kernel/repository.rs +468 -0
- data/rust/src/kernel/routing.rs +612 -0
- data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +118 -0
- data/rust/src/kernel/vocab/entity_dispatch_order.rs +114 -0
- data/rust/src/kernel/vocab/field_hint.rs +70 -0
- data/rust/src/kernel/vocab/mod.rs +20 -0
- data/rust/src/kernel/vocab/query_comparator.rs +65 -0
- data/rust/src/kernel/vocab/refusal_template.rs +1592 -0
- data/rust/src/lib.rs +8 -0
- data/rust/src/main.rs +16 -0
- data/rust/web/.gitignore +1 -0
- data/rust/web/Cargo.lock +119 -0
- data/rust/web/Cargo.toml +18 -0
- data/rust/web/src/lib.rs +8 -0
- metadata +478 -12
- data/lib/hecks/facade/cli_door.rb +0 -178
- data/lib/hecks/facade/cli_runner.rb +0 -271
- data/lib/hecks/facade/handle.rb +0 -293
- data/lib/hecks/facade/json_door.rb +0 -247
- data/lib/hecks/facade/surface/aggregate_door.rb +0 -222
- data/lib/hecks/facade/surface/chapter.rb +0 -116
- data/lib/hecks/facade/surface.rb +0 -61
- data/lib/hecks/mcp_door_scope.rb +0 -176
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require_relative "../naming"
|
|
2
|
+
require_relative "adapter_lookup"
|
|
2
3
|
require_relative "../ports/query"
|
|
3
4
|
require_relative "../ports/query/ordering"
|
|
4
5
|
require_relative "../query_specification/field_path"
|
|
@@ -11,109 +12,70 @@ require_relative "value"
|
|
|
11
12
|
|
|
12
13
|
module Hecks
|
|
13
14
|
module Runtime
|
|
14
|
-
# Answers one declared aggregate or entity query against a
|
|
15
|
-
#
|
|
16
|
-
# when the store can answer directly, falling back to interpreting
|
|
17
|
-
# wheres/order_by/limit/offset over every loaded record itself.
|
|
18
|
-
# #reference_call/#reference_interpret are a separate, deliberately
|
|
19
|
-
# naive re-implementation of the same evaluation, used only as the
|
|
20
|
-
# fuzzer's oracle to catch divergence between adapters and this
|
|
21
|
-
# interpreter's own native path.
|
|
15
|
+
# Answers one declared aggregate or entity query against a repository, using a
|
|
16
|
+
# native adapter hook when the store has one and interpreting the query otherwise.
|
|
22
17
|
class QueryInterpreter
|
|
23
18
|
attr_reader :registry
|
|
24
19
|
|
|
25
|
-
# @param registry [Runtime::Registry] the booted registry queries are answered
|
|
26
|
-
# against
|
|
27
20
|
def initialize(registry)
|
|
28
21
|
@registry = registry
|
|
29
22
|
end
|
|
30
23
|
|
|
31
24
|
# Answers one declared aggregate or entity query, preferring a native adapter
|
|
32
|
-
# hook and falling back to interpreting
|
|
25
|
+
# hook and falling back to interpreting it over every loaded record.
|
|
33
26
|
#
|
|
34
|
-
# @param
|
|
35
|
-
# @
|
|
36
|
-
# @param query_name [String] the query's declared name, or an entity query's
|
|
37
|
-
# dotted `"Entity.Query"` name
|
|
38
|
-
# @param args [Hash{Symbol => Object}] the query's declared arguments
|
|
39
|
-
# @return [Array<Hash>] one frozen Hash per matching record, its state with
|
|
40
|
-
# `:id` merged in last
|
|
27
|
+
# @param query_name [String] a declared name, or an entity query's `"Entity.Query"`
|
|
28
|
+
# @return [Array<Hash>] one frozen Hash per matching record, `:id` merged in last
|
|
41
29
|
# @raise [Runtime::UnknownVerb] if `query_name` names no declared query
|
|
42
|
-
# @raise [Runtime::TypeMismatch] if an argument cannot be coerced to its
|
|
43
|
-
# declared type
|
|
30
|
+
# @raise [Runtime::TypeMismatch] if an argument cannot be coerced to its type
|
|
44
31
|
# @raise [Runtime::WiringError] if the aggregate's repository cannot be resolved
|
|
45
32
|
def call(domain, aggregate, query_name, args)
|
|
46
33
|
return entity_rows(domain, aggregate, query_name, args) if query_name.include?(".")
|
|
47
34
|
|
|
48
35
|
declared = declared_query(aggregate, query_name)
|
|
49
36
|
args = normalize_args(aggregate, declared, args)
|
|
37
|
+
if (port = aggregate.query_binding(declared.name))
|
|
38
|
+
return answered_from_outside(aggregate, declared, args, port)
|
|
39
|
+
end
|
|
40
|
+
|
|
50
41
|
declared = TenantScope.apply(declared, args)
|
|
51
|
-
#
|
|
52
|
-
#
|
|
53
|
-
# the outer query. It does not reach the hop's own inner
|
|
54
|
-
# sub-query against the target aggregate — a hop's target may
|
|
55
|
-
# not even declare the same tenant boundary, and propagating one
|
|
56
|
-
# aggregate's tenant scope onto an unrelated aggregate's own
|
|
57
|
-
# query is a real design question of its own, not answered here.
|
|
42
|
+
# Applied after TenantScope so its tenant clause rides through as an ordinary
|
|
43
|
+
# local clause; it is deliberately not propagated into the hop's inner query.
|
|
58
44
|
declared = ReferenceHop.apply(declared, args, registry: @registry, domain: domain, aggregate: aggregate)
|
|
59
45
|
|
|
60
46
|
repository = @registry.repository(domain, aggregate)
|
|
61
|
-
# `registry:`
|
|
62
|
-
# can look its target aggregate up — see
|
|
63
|
-
# QuerySpecification::Common::Comparison#none_in_state? for the
|
|
64
|
-
# comparator itself, and for why an ordinary aggregate-level
|
|
65
|
-
# Memory query needs the registry passed explicitly rather than
|
|
66
|
-
# closing over an instance variable.
|
|
47
|
+
# `registry:` lets a `none_in_state` where-clause look up its target aggregate.
|
|
67
48
|
if (native = Ports::Query.execute(repository, declared, args,
|
|
68
49
|
context: { domain: domain, aggregate: aggregate, registry: @registry }))
|
|
69
50
|
records = native
|
|
70
|
-
# `
|
|
71
|
-
# Instance#to_h
|
|
72
|
-
#
|
|
73
|
-
# wrapped value sitting in `record.state[:id]` already; merging
|
|
74
|
-
# it over a `{id:}.merge(state)` would let it silently
|
|
75
|
-
# clobber the correct bare identity this row is supposed to
|
|
76
|
-
# carry.
|
|
77
|
-
# A query row is an answer, not a handle. Mutating one edits
|
|
78
|
-
# nobody's state and silently disagrees with the store.
|
|
51
|
+
# `id` merges last so an aggregate attribute named `id` cannot clobber the
|
|
52
|
+
# bare identity (see Instance#to_h). Rows are frozen: a mutated row would
|
|
53
|
+
# edit nobody's state and disagree with the store.
|
|
79
54
|
return Freezer.deep(records.map { |record| record.state.merge(id: record.id) })
|
|
80
55
|
end
|
|
81
56
|
|
|
82
57
|
Freezer.deep(interpret(repository.all, declared, args, domain: domain))
|
|
83
58
|
end
|
|
84
59
|
|
|
85
|
-
# The reference answer
|
|
86
|
-
#
|
|
87
|
-
# generated ask through both paths and treats a difference as a
|
|
88
|
-
# finding: the differential gate the retired cross-runtime harness
|
|
89
|
-
# should always have been, aimed where the divergence actually
|
|
90
|
-
# lives — between the engines inside this one runtime.
|
|
60
|
+
# The reference answer: this interpreter's own evaluation, never a native hook.
|
|
61
|
+
# The fuzzer's query oracle diffs it against #call.
|
|
91
62
|
#
|
|
92
|
-
#
|
|
93
|
-
#
|
|
94
|
-
# partition/fold/in-clause. Sharing that algorithm would have made
|
|
95
|
-
# this oracle blind to exactly the code the hop feature adds: every
|
|
96
|
-
# phase of a shared fold would still get diffed against the native
|
|
97
|
-
# adapters, but the fold itself — the empty candidate set, a
|
|
98
|
-
# duplicate id, a dangling reference, a chain's inside-out
|
|
99
|
-
# resolution order — would only ever be compared against itself.
|
|
63
|
+
# Hop clauses use a deliberately naive walk (reference_where_holds?), not
|
|
64
|
+
# ReferenceHop's fold; sharing that would blind the oracle to it.
|
|
100
65
|
#
|
|
101
|
-
# @
|
|
102
|
-
# @param aggregate [Bluebook::Aggregate] the aggregate the query is declared on
|
|
103
|
-
# @param query_name [String] the query's declared name, or an entity query's
|
|
104
|
-
# dotted `"Entity.Query"` name
|
|
105
|
-
# @param args [Hash{Symbol => Object}] the query's declared arguments
|
|
106
|
-
# @return [Array<Hash>] one Hash per matching record, its state with `:id`
|
|
107
|
-
# merged in last
|
|
66
|
+
# @return [Array<Hash>] one Hash per matching record, `:id` merged in last
|
|
108
67
|
# @raise [Runtime::UnknownVerb] if `query_name` names no declared query
|
|
109
|
-
# @raise [Runtime::TypeMismatch] if an argument cannot be coerced to its
|
|
110
|
-
# declared type
|
|
111
|
-
# @raise [Runtime::WiringError] if the aggregate's repository cannot be resolved
|
|
68
|
+
# @raise [Runtime::TypeMismatch] if an argument cannot be coerced to its type
|
|
112
69
|
def reference_call(domain, aggregate, query_name, args)
|
|
113
70
|
return entity_rows(domain, aggregate, query_name, args) if query_name.include?(".")
|
|
114
71
|
|
|
115
72
|
declared = declared_query(aggregate, query_name)
|
|
116
73
|
args = normalize_args(aggregate, declared, args)
|
|
74
|
+
# No records to interpret: the adapter is the only answer there is, and the reference
|
|
75
|
+
# takes it through the same shape check, so a diff against #call sees only the adapter.
|
|
76
|
+
port = aggregate.query_binding(declared.name)
|
|
77
|
+
return answered_from_outside(aggregate, declared, args, port) if port
|
|
78
|
+
|
|
117
79
|
declared = TenantScope.apply(declared, args)
|
|
118
80
|
reference_interpret(@registry.repository(domain, aggregate).all, declared, args,
|
|
119
81
|
domain: domain, shape: aggregate)
|
|
@@ -121,6 +83,73 @@ module Hecks
|
|
|
121
83
|
|
|
122
84
|
private
|
|
123
85
|
|
|
86
|
+
# Asks the port's adapter the question the hecksagon bound to this query, by the query's
|
|
87
|
+
# snake-cased name and with its arguments as plain data. Each row of the answer is built as
|
|
88
|
+
# the value object the query `returns`, so an answer that is not that shape is refused
|
|
89
|
+
# before it enters the domain. The aggregate's records are never read.
|
|
90
|
+
#
|
|
91
|
+
# @return [Array<Hash>] the rows as the returned value object's fields, frozen
|
|
92
|
+
# @raise [Runtime::WiringError] if no adapter answers the port or the adapter lacks the method
|
|
93
|
+
# @raise [Runtime::TypeMismatch, Runtime::InvariantViolation, Runtime::UnknownArgument,
|
|
94
|
+
# Runtime::AbsentArgument] naming the query, if the answer is not its declared shape
|
|
95
|
+
def answered_from_outside(aggregate, declared, args, port)
|
|
96
|
+
asked = "#{aggregate.hecks_name}.#{declared.name}"
|
|
97
|
+
refuse_offered_arguments!(declared, args, asked)
|
|
98
|
+
adapter = AdapterLookup.call(@registry, port.name, asked: asked)
|
|
99
|
+
method = Naming.snake(declared.name)
|
|
100
|
+
# The real adapter's class is what must answer; a fuzz replay's stand-in refuses instead.
|
|
101
|
+
klass = AdapterLookup.adapter_class(@registry, port.name, asked: asked)
|
|
102
|
+
AdapterLookup.check_answers!(klass, port.name, method, declared, asked: asked)
|
|
103
|
+
|
|
104
|
+
answer = adapter.public_send(method, **Value.materialize(args))
|
|
105
|
+
Freezer.deep(shaped(aggregate, declared, answer, asked))
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Refuses arguments the adapter cannot be handed: a required one left out, or one the query
|
|
109
|
+
# does not declare. The adapter is asked by keyword, so either would otherwise reach it as a
|
|
110
|
+
# raw ArgumentError.
|
|
111
|
+
#
|
|
112
|
+
# @raise [Runtime::AbsentArgument] if a non-optional declared argument is missing
|
|
113
|
+
# @raise [Runtime::UnknownArgument] if `args` names an argument the query does not declare
|
|
114
|
+
def refuse_offered_arguments!(declared, args, asked)
|
|
115
|
+
names = declared.attributes.map { |attribute| attribute.name.to_sym }
|
|
116
|
+
offered = args.keys.map(&:to_sym)
|
|
117
|
+
unknown = (offered - names).sort
|
|
118
|
+
unless unknown.empty?
|
|
119
|
+
raise UnknownArgument, RefusalWording.render_site("UnknownArgument", "unknown_args",
|
|
120
|
+
command: asked, unknown: unknown, declared: names)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
required = declared.attributes.reject(&:optional?).map { |attribute| attribute.name.to_sym }
|
|
124
|
+
absent = (required - offered).sort
|
|
125
|
+
return if absent.empty?
|
|
126
|
+
|
|
127
|
+
raise AbsentArgument, RefusalWording.render_site("AbsentArgument", "absent_args",
|
|
128
|
+
command: asked, absent: absent, declared: names)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Builds the adapter's answer as the declared value object: one row, or a list of rows for
|
|
132
|
+
# `returns list_of(...)`. A refusal keeps its class and gains the query's name.
|
|
133
|
+
def shaped(aggregate, declared, answer, asked)
|
|
134
|
+
value_object = Value.value_object_for(aggregate, declared.returns_name) or
|
|
135
|
+
raise WiringError, "#{asked} returns #{declared.returns_name.inspect}, which the aggregate " \
|
|
136
|
+
"declares no value object for"
|
|
137
|
+
offered = declared.returns_list? ? answer : [answer]
|
|
138
|
+
unless offered.is_a?(Array) && offered.all?(Hash)
|
|
139
|
+
raise TypeMismatch, "#{asked} answered outside the domain, but #{answer.class} is not " \
|
|
140
|
+
"#{declared.returns_list? ? 'a list of' : 'a'} #{value_object.hecks_name} row"
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
offered.map { |row| answered_row(value_object, row, aggregate, declared, asked) }
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# One row of an outside answer, built and validated as the returned value object.
|
|
147
|
+
def answered_row(value_object, row, aggregate, declared, asked)
|
|
148
|
+
Value.build(value_object, row, aggregate).to_h
|
|
149
|
+
rescue TypeMismatch, InvariantViolation, UnknownArgument, AbsentArgument => e
|
|
150
|
+
raise e.class, "#{asked} answered outside the domain, but not as its #{declared.returns} — #{e.message}"
|
|
151
|
+
end
|
|
152
|
+
|
|
124
153
|
def declared_query(aggregate, query_name)
|
|
125
154
|
aggregate.query(query_name) ||
|
|
126
155
|
raise(UnknownVerb, RefusalWording.render_site("UnknownVerb", "no_query",
|
|
@@ -130,25 +159,15 @@ module Hecks
|
|
|
130
159
|
def interpret(records, declared, args, domain: nil)
|
|
131
160
|
matched = records.select { |r| declared.wheres.all? { |w| where_holds?(w, r, args, domain: domain) } }
|
|
132
161
|
ordered = ordered(matched, declared.order_by, declared.null_semantics)
|
|
133
|
-
#
|
|
134
|
-
# OFFSET m`, and the order Ports::Query::InMemory#execute already
|
|
135
|
-
# applies (see that file's own comment). Without reading
|
|
136
|
-
# `declared.offset`, offset would silently vanish for any query
|
|
137
|
-
# answered here, not just come out reversed.
|
|
162
|
+
# Offset before limit, as SQL's `LIMIT n OFFSET m` and Ports::Query::InMemory do.
|
|
138
163
|
skipped = declared.offset ? ordered.drop(resolve_query_value(declared.offset.value, args).to_i) : ordered
|
|
139
164
|
capped = declared.limit ? skipped.first(resolve_query_value(declared.limit.value, args).to_i) : skipped
|
|
140
165
|
|
|
141
|
-
# id last — see the native-path comment above; same clobbering
|
|
142
|
-
# risk for the in-memory reference interpreter's own rows.
|
|
143
166
|
capped.map { |r| r.state.merge(id: r.id) }
|
|
144
167
|
end
|
|
145
168
|
|
|
146
|
-
# `interpret`
|
|
147
|
-
#
|
|
148
|
-
# reference is answered by reference_where_holds? instead of the
|
|
149
|
-
# plain FieldPath.dig(record, field) `where_holds?` uses (which
|
|
150
|
-
# has no concept of a reference at all — it would just read the
|
|
151
|
-
# raw id straight off the record and compare that).
|
|
169
|
+
# Twin of `interpret` for reference_call: hop clauses go through
|
|
170
|
+
# reference_where_holds?, which `where_holds?` cannot follow.
|
|
152
171
|
def reference_interpret(records, declared, args, domain:, shape:)
|
|
153
172
|
matched = records.select do |r|
|
|
154
173
|
declared.wheres.all? do |w|
|
|
@@ -156,24 +175,14 @@ module Hecks
|
|
|
156
175
|
end
|
|
157
176
|
end
|
|
158
177
|
ordered = ordered(matched, declared.order_by, declared.null_semantics)
|
|
159
|
-
# **Offset first, then limit** — same fix, same reasoning, as
|
|
160
|
-
# #interpret's own rows above.
|
|
161
178
|
skipped = declared.offset ? ordered.drop(resolve_query_value(declared.offset.value, args).to_i) : ordered
|
|
162
179
|
capped = declared.limit ? skipped.first(resolve_query_value(declared.limit.value, args).to_i) : skipped
|
|
163
180
|
|
|
164
|
-
# id last — same reasoning, same fix, as interpret's own rows.
|
|
165
181
|
capped.map { |r| r.state.merge(id: r.id) }
|
|
166
182
|
end
|
|
167
183
|
|
|
168
|
-
#
|
|
169
|
-
#
|
|
170
|
-
# field out of whatever it actually points at. A nil reference,
|
|
171
|
-
# or one that resolves to nothing (a dangling id), makes the
|
|
172
|
-
# whole clause false outright, whatever the comparator — "points
|
|
173
|
-
# at a client that is not active" is false for a proposal with no
|
|
174
|
-
# client at all, the same way it is false for one whose client
|
|
175
|
-
# really is active; falling through to holds?(clause, nil, args)
|
|
176
|
-
# instead would answer `ne` wrong (nil != "active" is true).
|
|
184
|
+
# Walks each reference by hand. A nil or dangling reference makes the whole clause
|
|
185
|
+
# false whatever the comparator; comparing nil directly would answer `ne` true.
|
|
177
186
|
def reference_where_holds?(clause, record, args, domain:, shape:)
|
|
178
187
|
step = QuerySpecification::HopPath.next_hop(clause.field, shape.attributes)
|
|
179
188
|
return where_holds?(clause, record, args) unless step
|
|
@@ -205,21 +214,13 @@ module Hecks
|
|
|
205
214
|
|
|
206
215
|
ordered = ordered_elements(rows, declared.order_by, declared.null_semantics,
|
|
207
216
|
parent_key, entity.identity_heads)
|
|
208
|
-
#
|
|
209
|
-
# #interpret's own rows above. `entity_rows` is the only engine
|
|
210
|
-
# for entity/sub-list queries, so a declared offset here silently
|
|
211
|
-
# vanished for every entity query, not merely one path among
|
|
212
|
-
# several.
|
|
217
|
+
# Entity queries have no native path, so offset must be applied here.
|
|
213
218
|
skipped = declared.offset ? ordered.drop(resolve_query_value(declared.offset.value, args).to_i) : ordered
|
|
214
219
|
declared.limit ? skipped.first(resolve_query_value(declared.limit.value, args).to_i) : skipped
|
|
215
220
|
end
|
|
216
221
|
|
|
217
|
-
#
|
|
218
|
-
#
|
|
219
|
-
# list attribute that holds it on the aggregate. Extracted from
|
|
220
|
-
# `entity_rows` (pure extraction, same lookups, same order, same
|
|
221
|
-
# UnknownVerb refusals) purely to separate "which declarations does
|
|
222
|
-
# this dotted name resolve to" from the row-computation that follows.
|
|
222
|
+
# Resolves a dotted name to the entity, its declared query and the list attribute
|
|
223
|
+
# holding it, refusing with UnknownVerb when any is missing.
|
|
223
224
|
def resolve_entity_query(aggregate, entity_name, query_name)
|
|
224
225
|
entity = aggregate.entities.find { |piece| piece.hecks_name == entity_name } ||
|
|
225
226
|
raise(UnknownVerb, RefusalWording.render_site("UnknownVerb", "entity_unknown",
|
|
@@ -233,35 +234,19 @@ module Hecks
|
|
|
233
234
|
[entity, declared, list_attr]
|
|
234
235
|
end
|
|
235
236
|
|
|
236
|
-
# FieldPath.dig, not
|
|
237
|
-
#
|
|
238
|
-
# segment walk every other query path already gets. Reading the whole
|
|
239
|
-
# dotted string as one key always missed — `element[:"price.cents"]`
|
|
240
|
-
# is never a real key — so a dotted where on an entity query
|
|
241
|
-
# silently matched nothing, on the only engine entity queries have.
|
|
237
|
+
# FieldPath.dig, not `element[clause.field.to_sym]`: a dotted field such as
|
|
238
|
+
# "price.cents" is never a single key.
|
|
242
239
|
def element_where_holds?(clause, element, args)
|
|
243
240
|
holds?(clause, QuerySpecification::FieldPath.dig(element, clause.field), args)
|
|
244
241
|
end
|
|
245
242
|
|
|
246
|
-
#
|
|
247
|
-
#
|
|
248
|
-
# `EntityListCoercion#hydrate_entity_list` symbolizes each element — PR A4
|
|
249
|
-
# removed the string-spelling fallback that coped with the old per-adapter
|
|
250
|
-
# shapes). It rides `comparable` for the same reason a where-clause does : an
|
|
251
|
-
# identity is a value object, and `to_s` on one is an object address — a sort key
|
|
252
|
-
# that differs run to run, which is worse than the store order it replaced.
|
|
243
|
+
# Sub-list rows are symbol-keyed because every adapter decodes through
|
|
244
|
+
# `Ports::Persistence::StateCodec`.
|
|
253
245
|
def cell(row, key) = row[key.to_sym]
|
|
254
246
|
|
|
255
|
-
#
|
|
256
|
-
# entities under different parents can share a sequence,
|
|
257
|
-
#
|
|
258
|
-
#
|
|
259
|
-
# Every key the piece is known by, in declaration order, for the same
|
|
260
|
-
# reason the parent leads: a part that ties is a part that breaks no tie.
|
|
261
|
-
# This took `identified_by`, which is the single head and is nil the
|
|
262
|
-
# moment an identity has two parts — and `cell(row, nil)` calls
|
|
263
|
-
# `nil.to_sym`, so a query against a composite piece did not sort wrongly,
|
|
264
|
-
# it raised. A piece known by one key sorts exactly as it did.
|
|
247
|
+
# Orders by parent first, then every key of the piece in declaration order: two
|
|
248
|
+
# entities under different parents can share a sequence, and a composite identity
|
|
249
|
+
# has no single head (`cell(row, nil)` would raise).
|
|
265
250
|
def ordered_elements(rows, order_by, null_semantics, parent_key, entity_keys)
|
|
266
251
|
field = order_by&.field
|
|
267
252
|
Ports::Query::Ordering.apply(
|
|
@@ -276,13 +261,8 @@ module Hecks
|
|
|
276
261
|
holds?(clause, QuerySpecification::FieldPath.dig(record, clause.field), args, record: record, domain: domain)
|
|
277
262
|
end
|
|
278
263
|
|
|
279
|
-
# The comparator table
|
|
280
|
-
# QuerySpecification::Common::Comparison
|
|
281
|
-
# Ports::Query::InMemory#holds? rather than each carrying its own
|
|
282
|
-
# copy — two copies once drifted: `none_in_state` reached only one
|
|
283
|
-
# of them, and `comparable` disagreed about value objects with two
|
|
284
|
-
# numeric members. What stays here is how a value is reached for
|
|
285
|
-
# this path: the registry is instance state rather than an argument.
|
|
264
|
+
# The comparator table is shared with Ports::Query::InMemory#holds? through
|
|
265
|
+
# QuerySpecification::Common::Comparison so the two cannot drift.
|
|
286
266
|
def holds?(clause, held, args, record: nil, domain: nil)
|
|
287
267
|
QuerySpecification::Common::Comparison.holds?(
|
|
288
268
|
clause.op, comparable(held), comparable(resolve_query_value(clause.value, args)), registry: @registry
|
|
@@ -293,49 +273,14 @@ module Hecks
|
|
|
293
273
|
value.is_a?(Symbol) ? args[value] : value
|
|
294
274
|
end
|
|
295
275
|
|
|
296
|
-
# `boundary: false
|
|
297
|
-
#
|
|
298
|
-
#
|
|
299
|
-
#
|
|
300
|
-
# says a named query's declared value-object arguments are checked
|
|
301
|
-
# the same way a command argument's own is, so a `nil` offered for
|
|
302
|
-
# a non-optional value-object-typed query attribute
|
|
303
|
-
# (Governance::RoleAssignment.AssignmentsForActor's `actor_id`, say)
|
|
304
|
-
# has to refuse — passing it through unchecked would let it through
|
|
305
|
-
# as a silent, unfiltered query instead, a real
|
|
306
|
-
# Ruby/Rust divergence the fuzzer caught (QualityControl BUG#2).
|
|
307
|
-
#
|
|
308
|
-
# `checked_vo?` true is handled by `null_vo_argument!` directly,
|
|
309
|
-
# never by routing through `Value.for_attribute(argument: true)`
|
|
310
|
-
# into the shared `Value::Coercion#nil_argument` the command door
|
|
311
|
-
# (`Interpreting#coerce_declared_arguments`) still uses — that
|
|
312
|
-
# method builds a null value object from zero fields, which
|
|
313
|
-
# succeeds (silently absorbing the null via the type's own field
|
|
314
|
-
# defaults) whenever every field happens to have one
|
|
315
|
-
# (`Lease.Expired`'s `now`, a `LeaseInstant` with a `default: 0`
|
|
316
|
-
# field; `Account.Overdrawn`/`HighBalance`/`StrictlyAbove`/
|
|
317
|
-
# `AtMost`'s `floor`/`cap`, a two-defaulted-field `Money`) and only
|
|
318
|
-
# refuses when a field has none (`Order.CostingLessThan`'s
|
|
319
|
-
# `ceiling`, a defaultless `Price`) — a real query-side divergence
|
|
320
|
-
# from Rust, which always refuses `TypeMismatch` on an explicit
|
|
321
|
-
# null argument regardless of any default (QualityControl BUG#36).
|
|
322
|
-
# `null_vo_argument!` instead treats an explicit null exactly the
|
|
323
|
-
# way `Value.fields_for` already treats any other wrong-shaped
|
|
324
|
-
# (non-Hash, non-Value) value offered for that same attribute — a
|
|
325
|
-
# single-field value object auto-wraps into `{field: nil}` (whose
|
|
326
|
-
# own `nil` is a present key, so `Value.build`'s `apply_defaults`
|
|
327
|
-
# never fills it, and `check_required_fields` refuses it exactly
|
|
328
|
-
# as any other missing required field would); a multi-field value
|
|
329
|
-
# object refuses immediately with the same `value_object_shape`
|
|
330
|
-
# wording an ordinary wrong-shaped scalar already gets. Command
|
|
331
|
-
# arguments are deliberately untouched — this is a query-only
|
|
332
|
-
# door; `nil_argument`'s own default-absorbing fallback still
|
|
333
|
-
# governs a null command argument exactly as it always has.
|
|
276
|
+
# Coerces with `boundary: false`: a query's declared argument types are not a
|
|
277
|
+
# runtime shape check. The exception is a nil for a required value-object-typed
|
|
278
|
+
# argument, which must refuse as a command argument does; passing it through
|
|
279
|
+
# would run an unfiltered query (a Ruby/Rust divergence).
|
|
334
280
|
#
|
|
335
|
-
#
|
|
336
|
-
# only
|
|
337
|
-
#
|
|
338
|
-
# through exactly as it always did.
|
|
281
|
+
# It does not use `Value::Coercion#nil_argument`, which builds a null value object
|
|
282
|
+
# from field defaults and only refuses when a field has none. `null_vo_argument!`
|
|
283
|
+
# refuses like any other wrong-shaped value. Command arguments are untouched.
|
|
339
284
|
def normalize_args(aggregate, declared, args)
|
|
340
285
|
declared.attributes.each_with_object(args.dup) do |attribute, normalized|
|
|
341
286
|
next unless normalized.key?(attribute.name)
|
|
@@ -357,10 +302,7 @@ module Hecks
|
|
|
357
302
|
!Value.value_object_for(aggregate, attribute.type).nil?
|
|
358
303
|
end
|
|
359
304
|
|
|
360
|
-
#
|
|
361
|
-
# attribute's type resolves to a real value object — see its own
|
|
362
|
-
# comment above for why this refuses unconditionally, never
|
|
363
|
-
# absorbing the null via the type's own field defaults.
|
|
305
|
+
# Refuses a nil for a value-object argument; never absorbs it via field defaults.
|
|
364
306
|
def null_vo_argument!(aggregate, attribute)
|
|
365
307
|
value_object = Value.value_object_for(aggregate, attribute.type)
|
|
366
308
|
Value.build(value_object, Value.fields_for(value_object, attribute.name, nil), aggregate)
|
|
@@ -368,15 +310,8 @@ module Hecks
|
|
|
368
310
|
|
|
369
311
|
def comparable(value) = QuerySpecification::Common::Comparison.comparable(value)
|
|
370
312
|
|
|
371
|
-
# FieldPath.dig, not
|
|
372
|
-
#
|
|
373
|
-
# single symbol key (`:"price.cents"`) that never matches anything
|
|
374
|
-
# `Instance#[]` actually holds, so a dotted order_by silently sorted
|
|
375
|
-
# by all-nil (the identity tier alone deciding every tie) on this,
|
|
376
|
-
# the reference/no-native-hook engine — the same bug already fixed
|
|
377
|
-
# for `where` (see `where_holds?` above) and for entity rows (see
|
|
378
|
-
# `ordered_elements` below), just not yet for this, the aggregate-
|
|
379
|
-
# level order_by.
|
|
313
|
+
# FieldPath.dig, not `record[field]`: a dotted order_by is one symbol key that
|
|
314
|
+
# `Instance#[]` never holds, so it would sort by all-nil.
|
|
380
315
|
def ordered(records, order_by, null_semantics = nil)
|
|
381
316
|
field = order_by&.field
|
|
382
317
|
Ports::Query::Ordering.apply(records, order_by, null_semantics,
|