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,38 +1,12 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module Bluebook
|
|
3
3
|
module MetaValidator
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
# The language now spells its fields exactly as the IR spells them, so the
|
|
7
|
-
# judge reads almost everything straight through: `command.givens`,
|
|
8
|
-
# `value_object.invariants`, `read_model.aggregate_heads`. What remains here
|
|
9
|
-
# is not naming drift — it is places where the IR's shape differs from the
|
|
10
|
-
# language's, and no amount of renaming would close that:
|
|
11
|
-
#
|
|
12
|
-
# transitions one declaration expands to several rows, because `from`
|
|
13
|
-
# may be a list of states
|
|
14
|
-
# value_objects the IR holds objects ; the language holds their names
|
|
15
|
-
# normalisations not on the bluebook at all — they come from the canonical
|
|
16
|
-
# form table the expression grammar keeps
|
|
17
|
-
# members plain hashes, one Member root per row, pairs per entry
|
|
18
|
-
# lifecycle one IR object feeding two separate fields
|
|
19
|
-
#
|
|
20
|
-
# Everything in this file is a difference in shape. If something here is
|
|
21
|
-
# only a difference in name, it is in the wrong file: rename the language.
|
|
4
|
+
# Reads the parts of a bluebook IR whose shape differs from the
|
|
5
|
+
# language's own, for the meta validator's walk.
|
|
22
6
|
module Readings
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
# every one of them was a fact `Assembly::Contracts` is the right place to
|
|
27
|
-
# keep: which shaper turns this list into rows. A list with no shaper reads
|
|
28
|
-
# straight off the node, which is most of them.
|
|
29
|
-
#
|
|
30
|
-
# @param category [String] the node's own construct category, such
|
|
31
|
-
# as `"Command"` or `"ValueObject"`
|
|
32
|
-
# @param list_name [String] the appendable list's own field name
|
|
33
|
-
# @param node [Object] the built IR node being judged
|
|
34
|
-
# @return [Array<Hash>] one row per element of `node`'s own
|
|
35
|
-
# `list_name`, shaped by the category's own shaper if it has one
|
|
7
|
+
# Looks up a per-category shaper (Assembly::Contracts) instead of
|
|
8
|
+
# switching on category here; a list with no shaper reads straight
|
|
9
|
+
# off the node.
|
|
36
10
|
def rows_for(category, list_name, node)
|
|
37
11
|
shaper = Assembly.contract(category).shaper(list_name)
|
|
38
12
|
return Array(node.public_send(list_name)) unless shaper
|
|
@@ -40,85 +14,33 @@ module Hecks
|
|
|
40
14
|
public_send(shaper, node)
|
|
41
15
|
end
|
|
42
16
|
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
# and nothing downstream could tell an argument from a literal of the same
|
|
46
|
-
# name.
|
|
47
|
-
#
|
|
48
|
-
# @param node [Object] the built IR node being judged (a `Query` or
|
|
49
|
-
# `ReadModel`)
|
|
50
|
-
# @return [Array<Hash{Symbol => Object}>] each declared `where`
|
|
51
|
-
# clause's own fields
|
|
17
|
+
# Reads through `to_h`, where the IR spells a symbol argument as
|
|
18
|
+
# `:ceiling`; reading the object directly loses the colon.
|
|
52
19
|
def where_rows(node) = Array(node.wheres).map(&:to_h)
|
|
53
20
|
|
|
54
|
-
# The
|
|
55
|
-
#
|
|
56
|
-
# @param node [Object] the built IR node being judged (an
|
|
57
|
-
# `Aggregate`)
|
|
58
|
-
# @return [Array<Hash{Symbol => String}>] `{name: ...}` for every
|
|
59
|
-
# declared value object
|
|
21
|
+
# The IR holds the value object itself; the language wants only its name.
|
|
60
22
|
def value_object_names(node) = node.value_objects.map { |shape| { name: shape.hecks_name } }
|
|
61
23
|
|
|
62
|
-
#
|
|
63
|
-
#
|
|
64
|
-
# language holds a row per path, and the order between them is the whole
|
|
65
|
-
# meaning, because the identity is their join.
|
|
66
|
-
#
|
|
67
|
-
# @param node [Object] the built IR node being judged (an
|
|
68
|
-
# `Aggregate` or `Entity`)
|
|
69
|
-
# @return [Array<Hash{Symbol => String}>] `{value: ...}` for every
|
|
70
|
-
# identity path part, in order
|
|
24
|
+
# One row per identity path part, in order — the join between them
|
|
25
|
+
# is the whole meaning of the identity.
|
|
71
26
|
def identity_rows(node) = node.identity_paths.map { |path| { value: path } }
|
|
72
27
|
|
|
73
|
-
#
|
|
74
|
-
#
|
|
75
|
-
# argument became indistinguishable from one carrying a literal string.
|
|
76
|
-
#
|
|
77
|
-
# @param node [Object] the built IR node being judged (a `Dispatch`)
|
|
78
|
-
# @return [Array<Hash{Symbol => Object}>] `pair_rows`' own return
|
|
79
|
-
# for `node`'s own `with_spec`
|
|
28
|
+
# Reads through `to_h`, where `Bluebook.render_value` spells a symbol
|
|
29
|
+
# argument as `:source`.
|
|
80
30
|
def with_spec_rows(node) = pair_rows(node.to_h[:with_spec])
|
|
81
31
|
|
|
82
|
-
#
|
|
83
|
-
#
|
|
84
|
-
# `compensates_with_spec` (`Assembly::Contracts`' own comment on
|
|
85
|
-
# "Dispatch"), so its own with_spec pairs live nested one hash
|
|
86
|
-
# down from where `with_spec_rows` looks. `&.dig(...)` — no
|
|
87
|
-
# compensation at all is not an error, it is `pair_rows(nil)`, empty.
|
|
88
|
-
#
|
|
89
|
-
# @param node [Object] the built IR node being judged (a `Dispatch`)
|
|
90
|
-
# @return [Array<Hash{Symbol => Object}>] `pair_rows`' own return
|
|
91
|
-
# for `node`'s own `compensates.with_spec`, `[]` when `node` has
|
|
92
|
-
# no compensation
|
|
32
|
+
# `compensates` nests its own with_spec one hash down; `&.dig` makes
|
|
33
|
+
# "no compensation" `pair_rows(nil)`, i.e. empty, not an error.
|
|
93
34
|
def compensates_with_spec_rows(node) = pair_rows(node.to_h[:compensates]&.dig(:with_spec))
|
|
94
35
|
|
|
95
|
-
# A read model carries the same options an ask does, plus its filters — see
|
|
96
|
-
# option_rows.
|
|
97
|
-
#
|
|
98
|
-
# @param node [Object] the built IR node being judged (a
|
|
99
|
-
# `ReadModel`)
|
|
100
|
-
# @return [Array<Hash{Symbol => Object}>] `option_rows`' own return,
|
|
101
|
-
# with filters included
|
|
102
36
|
def read_model_option_rows(node) = option_rows(node, filters: true)
|
|
103
37
|
|
|
104
|
-
# The canonical-form table
|
|
105
|
-
#
|
|
106
|
-
#
|
|
107
|
-
# @param _node [Object] unused; every node shares the one table
|
|
108
|
-
# @return [Array<Hash{Symbol => Object}>] `normalisation_rows`' own
|
|
109
|
-
# return
|
|
38
|
+
# The canonical-form table belongs to the expression grammar, not to
|
|
39
|
+
# any one node, so the node itself is unused.
|
|
110
40
|
def normalisation_table(_node) = normalisation_rows
|
|
111
41
|
|
|
112
|
-
# `lifecycle
|
|
113
|
-
#
|
|
114
|
-
# second unjudged, which is the whole failure this judge exists to avoid.
|
|
115
|
-
#
|
|
116
|
-
# @param node [Object] the built IR node being judged (an
|
|
117
|
-
# `Aggregate` or `Entity`)
|
|
118
|
-
# @return [Array<Hash{Symbol => Object}>] `:command`, `:from_state`,
|
|
119
|
-
# and `:to_state`, one row per declared `from` state (or one row
|
|
120
|
-
# with a `nil` `:from_state` for an unconstrained transition);
|
|
121
|
-
# `[]` if `node` declares no lifecycle
|
|
42
|
+
# One `lifecycle` declaration can list several `from` states, so it
|
|
43
|
+
# expands into one row per state (or one unconstrained row).
|
|
122
44
|
def transition_rows(node)
|
|
123
45
|
lifecycle = node.respond_to?(:lifecycle) ? node.lifecycle : nil
|
|
124
46
|
return [] unless lifecycle
|
|
@@ -131,59 +53,14 @@ module Hecks
|
|
|
131
53
|
end
|
|
132
54
|
end
|
|
133
55
|
|
|
134
|
-
# An open map
|
|
135
|
-
# value object that can hold it, so each entry becomes its own row. This is
|
|
136
|
-
# why Member and Dispatch are roots in the language rather than lists.
|
|
137
|
-
#
|
|
138
|
-
# @param map [Hash, nil] the open map to flatten, or `nil`
|
|
139
|
-
# @return [Array<Hash{Symbol => Object}>] `{key:, value:}` for every
|
|
140
|
-
# entry, `[]` when `map` is `nil`
|
|
56
|
+
# An open map has no value object to hold it, so each entry is its own row.
|
|
141
57
|
def pair_rows(map)
|
|
142
58
|
Array(map&.to_h).map { |key, value| { key: key, value: value } }
|
|
143
59
|
end
|
|
144
60
|
|
|
145
|
-
#
|
|
146
|
-
#
|
|
147
|
-
#
|
|
148
|
-
# five options, one compound (authorize names a policy and a
|
|
149
|
-
# tenant). `extra_options_to_h` already spells every one of them
|
|
150
|
-
# and drops the absent ones, so this reads that rather than
|
|
151
|
-
# naming them here — a sixth option needs no change on either
|
|
152
|
-
# side.
|
|
153
|
-
#
|
|
154
|
-
# `filters: true` adds a read model's wheres, order_by and limit —
|
|
155
|
-
# `at` tells repeated rows apart, so two wheres do not collapse.
|
|
156
|
-
#
|
|
157
|
-
# The language may hold more than `to_h` carries, and this is where that
|
|
158
|
-
# mattered. Until 2026-08-11, `ReadModel#to_h` omitted all three —
|
|
159
|
-
# `extra_options_to_h` rejects them by name, still does — so a read
|
|
160
|
-
# model's filtering had never been in the wire contract, and I first
|
|
161
|
-
# read that as a wall: if the wire cannot carry it, the language cannot
|
|
162
|
-
# hold it, and a graph assembled from the language must lose it.
|
|
163
|
-
#
|
|
164
|
-
# That was the wrong conclusion. `to_h` is a projection ; the language
|
|
165
|
-
# is the source. They have to agree about everything
|
|
166
|
-
# to_h spells, not about everything the language knows. Held as option
|
|
167
|
-
# rows, the filters survived the round trip regardless of whether the
|
|
168
|
-
# wire carried them too — which is exactly why, when a later task
|
|
169
|
-
# (Rust read-model codegen) needed `wheres`/`order_by`/`limit` on the
|
|
170
|
-
# wire for an unrelated reason, `ReadModel#to_h` could be extended to
|
|
171
|
-
# spell them (the same mechanism `Query#to_h` already used) without
|
|
172
|
-
# touching this method at all: this reads `node.wheres`/`node.
|
|
173
|
-
# order_by`/`node.limit` off the live object directly below
|
|
174
|
-
# (`filter_options`), never off `to_h`, so the wire format moving did
|
|
175
|
-
# not move this.
|
|
176
|
-
#
|
|
177
|
-
# Named `wheres`, `order_by` and `limit` so they gather back into exactly the
|
|
178
|
-
# declaration keys the assembly already reads.
|
|
179
|
-
#
|
|
180
|
-
# @param node [Object] the built IR node being judged (a `Query` or
|
|
181
|
-
# `ReadModel`)
|
|
182
|
-
# @param filters [Boolean] whether to also flatten `node`'s own
|
|
183
|
-
# `wheres`/`order_by`/`limit`
|
|
184
|
-
# @return [Array<Hash{Symbol => Object}>] `[]` if `node` answers no
|
|
185
|
-
# `extra_options_to_h`; otherwise `parts`' own rows for every
|
|
186
|
-
# option `node` carries
|
|
61
|
+
# Flattens options via `extra_options_to_h` — a new option needs no
|
|
62
|
+
# change here. `filters: true` reads wheres/order_by/limit live off
|
|
63
|
+
# the node, not `to_h`, so wire-format changes there don't affect it.
|
|
187
64
|
def option_rows(node, filters: false)
|
|
188
65
|
return [] unless node.respond_to?(:extra_options_to_h)
|
|
189
66
|
|
|
@@ -198,14 +75,7 @@ module Hecks
|
|
|
198
75
|
end
|
|
199
76
|
end
|
|
200
77
|
|
|
201
|
-
#
|
|
202
|
-
# `option_rows` expects to flatten alongside its ordinary options.
|
|
203
|
-
#
|
|
204
|
-
# @param node [Object] the built IR node being judged (a
|
|
205
|
-
# `ReadModel`)
|
|
206
|
-
# @return [Hash{Symbol => Object}] `:wheres` (`Array<Hash>`),
|
|
207
|
-
# `:order_by`, and `:limit` (each `Hash` or absent), absent keys
|
|
208
|
-
# dropped
|
|
78
|
+
# Named to match the declaration keys the assembly already reads.
|
|
209
79
|
def filter_options(node)
|
|
210
80
|
{
|
|
211
81
|
wheres: Array(node.wheres).map(&:to_h),
|
|
@@ -214,51 +84,22 @@ module Hecks
|
|
|
214
84
|
}.reject { |_, held| held.nil? || held == [] }
|
|
215
85
|
end
|
|
216
86
|
|
|
217
|
-
# Flattens one option's own value (or one element of a repeated
|
|
218
|
-
# option) into key/value rows.
|
|
219
|
-
#
|
|
220
|
-
# @param option [Symbol] the option's own name
|
|
221
|
-
# @param held [Object] the option's own value (a Hash-coercible
|
|
222
|
-
# object) — one repetition's worth, for a repeated option
|
|
223
|
-
# @param at [Integer, nil] the repetition index, for a repeated
|
|
224
|
-
# option; `nil` otherwise
|
|
225
|
-
# @return [Array<Hash{Symbol => String, Object}>] `:option`, `:key`,
|
|
226
|
-
# `:value`, and `:at` (stringified, `nil` when `at` is `nil`), one
|
|
227
|
-
# per key of `held`
|
|
228
87
|
def parts(option, held, at)
|
|
229
88
|
Hash(held).map do |key, value|
|
|
230
89
|
{ option: option.to_s, key: key.to_s, value: value, at: at&.to_s }
|
|
231
90
|
end
|
|
232
91
|
end
|
|
233
92
|
|
|
234
|
-
#
|
|
235
|
-
#
|
|
236
|
-
# (`append: { name: :name, amount: :amount }`). So an append is offered
|
|
237
|
-
# once per binding, and each one is judged.
|
|
238
|
-
#
|
|
239
|
-
# Sending `field: v(""), kind: v("argument"), source: v("")` here
|
|
240
|
-
# instead — three stubbed values — would hand every rule about what
|
|
241
|
-
# a mutation reads a blank, so it could never refuse.
|
|
242
|
-
#
|
|
243
|
-
# @param node [Object] the built IR node being judged (a `Command`)
|
|
244
|
-
# @return [Array<Hash{Symbol => Object}>] one row per binding for an
|
|
245
|
-
# append/delegate/corrects mutation, or `set_row`'s own single-row
|
|
246
|
-
# array for a set/increment/decrement
|
|
93
|
+
# append/delegate/corrects bind several fields at once, so each
|
|
94
|
+
# binding is its own row; set/increment/decrement get a single row.
|
|
247
95
|
def mutation_rows(node)
|
|
248
96
|
Array(node.mutations).flat_map do |mutation|
|
|
249
|
-
#
|
|
250
|
-
# #corrects_impl's own comments) ride the same multi-binding
|
|
251
|
-
# shape `:append` does — `with: {...}`/the assembled
|
|
252
|
-
# `as:`/`reason:`/`reverses:` hash is a field map, same as
|
|
253
|
-
# append's own `fields:`.
|
|
97
|
+
# delegate/corrects ride the same multi-binding shape append does.
|
|
254
98
|
next set_row(mutation) unless [:append, :delegate, :corrects].include?(mutation.op)
|
|
255
99
|
|
|
256
100
|
mutation.source.map do |field, argument|
|
|
257
|
-
# Spelled
|
|
258
|
-
#
|
|
259
|
-
# reads that field with. `then_set :marks, append: { direction:
|
|
260
|
-
# "out" }` binds a literal, and storing it raw made it
|
|
261
|
-
# indistinguishable from an argument called out.
|
|
101
|
+
# Spelled as Mutation#appended_fields spells it; Assembly::Marks
|
|
102
|
+
# reads this row back through the same reader.
|
|
262
103
|
{ target: mutation.target, op: mutation.op, field: field,
|
|
263
104
|
kind: argument.is_a?(Symbol) ? "argument" : "literal",
|
|
264
105
|
source: Literal.render(argument) }
|
|
@@ -266,13 +107,6 @@ module Hecks
|
|
|
266
107
|
end
|
|
267
108
|
end
|
|
268
109
|
|
|
269
|
-
# A set/increment/decrement reads one thing: a command argument, or a
|
|
270
|
-
# literal written into the bluebook.
|
|
271
|
-
#
|
|
272
|
-
# @param mutation [Bluebook::Mutation] a set/increment/decrement
|
|
273
|
-
# mutation
|
|
274
|
-
# @return [Array(Hash{Symbol => Object})] a single-element array
|
|
275
|
-
# holding `:target`, `:op`, `:field`, `:kind`, and `:source`
|
|
276
110
|
def set_row(mutation)
|
|
277
111
|
classified = mutation.to_h[:source] || {}
|
|
278
112
|
|
|
@@ -281,13 +115,8 @@ module Hecks
|
|
|
281
115
|
source: classified[:name] || encode_literal(classified[:value]) }]
|
|
282
116
|
end
|
|
283
117
|
|
|
284
|
-
# The
|
|
285
|
-
# bluebook
|
|
286
|
-
# models it because a bluebook's rules are canonicalised on the way in.
|
|
287
|
-
#
|
|
288
|
-
# @return [Array<Hash{Symbol => Object}>] one row per admitted
|
|
289
|
-
# normalisation rule (`:strategy`, `:source_token`, `:replacement`,
|
|
290
|
-
# `:boundary`, `:position`), `[]` if the table cannot be read
|
|
118
|
+
# The table belongs to the expression grammar, not to any one
|
|
119
|
+
# bluebook.
|
|
291
120
|
def normalisation_rows
|
|
292
121
|
table = Expression::CanonicalForm.table
|
|
293
122
|
return [] unless table
|
|
@@ -302,89 +131,39 @@ module Hecks
|
|
|
302
131
|
}
|
|
303
132
|
end
|
|
304
133
|
rescue StandardError
|
|
305
|
-
#
|
|
306
|
-
# produce one is not malformed.
|
|
134
|
+
# A bluebook that cannot produce this table is not malformed.
|
|
307
135
|
[]
|
|
308
136
|
end
|
|
309
137
|
|
|
310
|
-
# What the bluebook calls a node, whichever kind of thing the node is.
|
|
311
|
-
#
|
|
312
|
-
# Every construct answers `hecks_name` now, so there is nothing to sniff
|
|
313
|
-
# (`respond_to?(:hecks_name) ? … : node.name`) or choose between. This
|
|
314
|
-
# disappears entirely when the DSL stops handing the judge nodes at all.
|
|
315
|
-
#
|
|
316
|
-
# @param node [Object] the built IR node being judged
|
|
317
|
-
# @return [String] the node's own declared name
|
|
318
138
|
def declared_name(node) = node.hecks_name
|
|
319
139
|
|
|
320
|
-
#
|
|
321
|
-
#
|
|
322
|
-
#
|
|
323
|
-
#
|
|
324
|
-
# These were eight hand-written cases — `Entity.owner`, `Member.shape`, two
|
|
325
|
-
# lifecycle members twice over, and three of a query's — each one restating
|
|
326
|
-
# something `Assembly::Contracts` already declares. A parent pointer is
|
|
327
|
-
# `:parent` there ; a folded field names the object and member it lives in.
|
|
328
|
-
# So the exceptions are looked up rather than repeated, and a new fold is one
|
|
329
|
-
# line in one file instead of two lines in two.
|
|
330
|
-
#
|
|
331
|
-
# @param category [String] the node's own construct category, such
|
|
332
|
-
# as `"Command"` or `"ValueObject"`
|
|
333
|
-
# @param node [Object] the built IR node being judged
|
|
334
|
-
# @param field [Symbol] the Declare payload field to read
|
|
335
|
-
# @param parent_id [String] the id the containment walk carries in
|
|
336
|
-
# from one level up, offered when `field` is the parent pointer
|
|
337
|
-
# @return [Object] `field`'s own value: `node`'s declared name,
|
|
338
|
-
# `parent_id`, a folded member's value (`through`), the read
|
|
339
|
-
# model's own limit value, an encoded literal (`provenance`), or
|
|
340
|
-
# `node.public_send(field)`; `nil` if `node` does not respond to
|
|
341
|
-
# `field`
|
|
140
|
+
# Reads one Declare payload field off `node`, using
|
|
141
|
+
# Assembly::Contracts to find fields whose location differs from
|
|
142
|
+
# their name rather than branching per category.
|
|
342
143
|
def field_value(category, node, field, parent_id)
|
|
343
144
|
return declared_name(node) if field == :name
|
|
344
145
|
|
|
345
146
|
contract = Assembly.contract(category)
|
|
346
|
-
# A setter names its target as a string
|
|
347
|
-
# so the lookup
|
|
348
|
-
# was type-blind because it interpolated ; a Hash is not.
|
|
147
|
+
# A setter names its target as a string; Declare fields arrive as
|
|
148
|
+
# symbols, so the lookup key is normalized to a symbol either way.
|
|
349
149
|
named = field.to_sym
|
|
350
150
|
return parent_id if contract.kind_of(named) == :parent
|
|
351
151
|
|
|
352
152
|
object, member = contract.folded(named)
|
|
353
153
|
return through(node, object, member) if member
|
|
354
154
|
|
|
355
|
-
# `limit` is
|
|
356
|
-
# wraps rather than destructures, so offering it stored
|
|
357
|
-
# "#<struct LimitSpec value=3>".
|
|
155
|
+
# `limit` is an IR object, not a scalar, so its value is unwrapped.
|
|
358
156
|
return node.limit&.to_h&.fetch(:value, nil) if "#{category}.#{field}" == "Query.limit"
|
|
359
157
|
|
|
360
|
-
#
|
|
361
|
-
#
|
|
362
|
-
# meant Ruby's `Hash#to_s`, whose spelling changed under us between
|
|
363
|
-
# 3.3 and 3.4. Encoded here, the same way `default:` already is and the
|
|
364
|
-
# same way Shapes#provenance reads it back.
|
|
158
|
+
# Encoded so the hash literal doesn't get spelled through Ruby's
|
|
159
|
+
# own to_s, which is not stable across Ruby versions.
|
|
365
160
|
return encode_literal(node.provenance) if field == :provenance
|
|
366
161
|
|
|
367
|
-
# `identified_by` is not a field of any declaration — it is a list,
|
|
368
|
-
# filled by Identify one part at a time, so it is read through `identity_rows`
|
|
369
|
-
# like every other list rather than special-cased here. What this branch
|
|
370
|
-
# existed to protect is now structural : a path cannot come back as its head,
|
|
371
|
-
# because there is nowhere left that holds only a head.
|
|
372
|
-
|
|
373
162
|
node.respond_to?(field) ? node.public_send(field) : nil
|
|
374
163
|
end
|
|
375
164
|
|
|
376
|
-
#
|
|
377
|
-
#
|
|
378
|
-
# OrderBy's `direction` — and reading the object raw is how a colon or a type
|
|
379
|
-
# goes missing.
|
|
380
|
-
#
|
|
381
|
-
# @param node [Object] the built IR node being judged
|
|
382
|
-
# @param object [Symbol] the member object's own field name on
|
|
383
|
-
# `node`, such as `:lifecycle`
|
|
384
|
-
# @param member [Symbol] the field to read off that object, such as
|
|
385
|
-
# `:default`; `:transitions` returns the object itself
|
|
386
|
-
# @return [Object, nil] the member's own value, or `nil` if `node`
|
|
387
|
-
# does not respond to `object` or that object is absent
|
|
165
|
+
# Reads via `to_h` because the member names are the ones the IR
|
|
166
|
+
# spells (a Lifecycle's `default`, an OrderBy's `direction`).
|
|
388
167
|
def through(node, object, member)
|
|
389
168
|
held = node.respond_to?(object) ? node.public_send(object) : nil
|
|
390
169
|
return nil unless held
|
|
@@ -392,19 +171,9 @@ module Hecks
|
|
|
392
171
|
member == :transitions ? held : held.to_h[member]
|
|
393
172
|
end
|
|
394
173
|
|
|
395
|
-
# What a setting command writes. A setter whose source is absent is not
|
|
396
|
-
# dispatched at all — absent is not empty, and offering "" would turn every
|
|
397
|
-
# "if you declare it, declare something" rule into "you must declare it".
|
|
398
|
-
#
|
|
399
|
-
# @param category [String] the node's own construct category
|
|
400
|
-
# @param node [Object] the built IR node being judged
|
|
401
|
-
# @param target [Symbol] the setter's own target field
|
|
402
|
-
# @return [Object, nil] the target's own value: the closed set's own
|
|
403
|
-
# row count, a folded member's value (`through`), or
|
|
404
|
-
# `node.public_send(target)`; `nil` if absent
|
|
405
174
|
def setter_value(category, node, target)
|
|
406
|
-
# `rows` folds into `closed_set` and `members`
|
|
407
|
-
# member to name, so it keeps its own
|
|
175
|
+
# `rows` folds into `closed_set` and `members` with no single
|
|
176
|
+
# member to name, so it keeps its own reader.
|
|
408
177
|
return closed_set_size(node) if "#{category}.#{target}" == "ValueObject.rows"
|
|
409
178
|
|
|
410
179
|
object, member = Assembly.contract(category).folded(target.to_sym)
|
|
@@ -413,95 +182,40 @@ module Hecks
|
|
|
413
182
|
node.respond_to?(target) ? node.public_send(target) : nil
|
|
414
183
|
end
|
|
415
184
|
|
|
416
|
-
#
|
|
417
|
-
# so `rows` must stay absent rather than arrive as zero.
|
|
418
|
-
#
|
|
419
|
-
# @param node [Object] the built IR node being judged (a
|
|
420
|
-
# `ValueObject`)
|
|
421
|
-
# @return [Integer, nil] the closed set's own row count, or `nil` if
|
|
422
|
-
# `node` is not a declared closed set
|
|
185
|
+
# `nil` for "not a closed set" keeps that distinct from an empty one.
|
|
423
186
|
def closed_set_size(node)
|
|
424
187
|
return nil unless node.respond_to?(:closed_set?) && node.closed_set?
|
|
425
188
|
|
|
426
189
|
Array(node.members).size
|
|
427
190
|
end
|
|
428
191
|
|
|
429
|
-
# `Reference<Customer>` is an IR encoding
|
|
430
|
-
#
|
|
431
|
-
# that head's ID, and resolution does the rest. Encoding and decoding both
|
|
432
|
-
# live here, because this is where the IR's shape differs from the
|
|
433
|
-
# language's and nowhere else should know the spelling.
|
|
434
|
-
#
|
|
435
|
-
# @param row [Bluebook::Attribute] the attribute being offered
|
|
436
|
-
# @param aggregate_id [String] the owning head's own id, read for
|
|
437
|
-
# its chapter prefix
|
|
438
|
-
# @return [String, nil] the target head's own id, or `nil` if `row`
|
|
439
|
-
# is not a `reference_to` attribute
|
|
192
|
+
# `Reference<Customer>` is an IR encoding; the language is offered
|
|
193
|
+
# the target head's own id instead, and resolution does the rest.
|
|
440
194
|
def points_at(row, aggregate_id)
|
|
441
195
|
return nil unless row.reference?
|
|
442
196
|
|
|
443
|
-
#
|
|
444
|
-
#
|
|
445
|
-
# spelled again with a separator of its own. This is dispatched as a real
|
|
446
|
-
# reference value (`Aggregate.Reference`'s `points_at:`), resolved by
|
|
447
|
-
# `repository.find` against the target Aggregate-within-Meta record's own
|
|
448
|
-
# stored id — so it must equal what that record's identity actually
|
|
449
|
-
# derives, not a wire-format spelling. `reference_type`, below, is the
|
|
450
|
-
# separate later reader that un-derives it back into "Reference<X>".
|
|
197
|
+
# Built the same way an aggregate id itself is built (chapter +
|
|
198
|
+
# name), because `repository.find` resolves against that same id.
|
|
451
199
|
Naming.identity([aggregate_id.split(Naming::IDENTITY_JOIN).first, row.type.target_name])
|
|
452
200
|
end
|
|
453
201
|
|
|
454
|
-
#
|
|
455
|
-
#
|
|
456
|
-
# The language holds a default and a literal mutation source as text, and
|
|
457
|
-
# `to_s` threw the type away: 0.0 came back "0.0", and `{ value: "good" }`
|
|
458
|
-
# came back its inspect string with nowhere to say it had been a hash. The
|
|
459
|
-
# language already stores code as text — `canonical: "cents >= 0"` — so an
|
|
460
|
-
# encoding is in keeping; it simply has to be self-describing. That rule is
|
|
461
|
-
# now Hecks::Literal's, stated once and shared with every other
|
|
462
|
-
# to_h-bound literal field ; Shapes#decode_literal reads it back.
|
|
463
|
-
#
|
|
464
|
-
# nil stays nil rather than becoming "nil": absent is a real answer here,
|
|
465
|
-
# and the language's own field is optional.
|
|
466
|
-
#
|
|
467
|
-
# @param value [Object] the value to encode: `nil`, `Symbol`,
|
|
468
|
-
# `String`, `Hecks::StateRef`, `true`, `false`, `Integer`, `Float`,
|
|
469
|
-
# `Hash`, or `Array` (recursively)
|
|
470
|
-
# @return [String, nil] the self-describing wire spelling, or `nil`
|
|
471
|
-
# when `value` is `nil`
|
|
202
|
+
# Self-describing so the type survives the round trip (bare `to_s`
|
|
203
|
+
# can't tell 0.0 from a string); `nil` stays `nil`, a real answer.
|
|
472
204
|
def encode_literal(value) = value.nil? ? nil : Literal.render(value)
|
|
473
205
|
|
|
474
|
-
# The
|
|
475
|
-
#
|
|
476
|
-
# `points_at` built it with, not the "::" a real bluebook's own type
|
|
477
|
-
# names never carry) ; the wire format wants only the bare name.
|
|
478
|
-
#
|
|
479
|
-
# @param points_at_id [String] a target head's own id, as `points_at`
|
|
480
|
-
# built it
|
|
481
|
-
# @return [String] `"Reference<Name>"`, the bare target name
|
|
206
|
+
# The inverse of `points_at`: strips the id's chapter prefix, joined
|
|
207
|
+
# with `Naming::IDENTITY_JOIN` rather than the wire format's `::`.
|
|
482
208
|
def reference_type(points_at_id) = "Reference<#{points_at_id.to_s.split(Naming::IDENTITY_JOIN).last}>"
|
|
483
209
|
|
|
484
|
-
# One value out of a row, named by the value object's field.
|
|
485
|
-
#
|
|
486
|
-
# @param row [Hash, Object] the row to read: a Hash, an object
|
|
487
|
-
# answering `field` directly, an object answering `to_h`, or a
|
|
488
|
-
# bare scalar
|
|
489
|
-
# @param field [Symbol] the field name to read
|
|
490
|
-
# @return [Object] `row[field]` for a Hash, `row.public_send(field)`
|
|
491
|
-
# when `row` answers `field` directly, `row.to_h[field]` for
|
|
492
|
-
# anything else to_h-able, or `row` itself for a bare scalar
|
|
493
210
|
def row_value(row, field)
|
|
494
|
-
#
|
|
495
|
-
#
|
|
496
|
-
# member pair through entirely the wrong method.
|
|
211
|
+
# Hash responds to `key` and `value` too, so a Hash must be
|
|
212
|
+
# checked for before respond_to?, not after.
|
|
497
213
|
return row[field] if row.is_a?(Hash)
|
|
498
214
|
return row.public_send(field) if row.respond_to?(field)
|
|
499
|
-
# A Struct
|
|
500
|
-
#
|
|
215
|
+
# A Struct raises for a member it lacks, so it's read via to_h
|
|
216
|
+
# instead — an absent field simply reads as absent.
|
|
501
217
|
return row.to_h[field] if row.respond_to?(:to_h) && !row.is_a?(String)
|
|
502
218
|
|
|
503
|
-
# A bare scalar row — `emits` is a list of event names, and the
|
|
504
|
-
# Announcement value object has to call that string something.
|
|
505
219
|
row
|
|
506
220
|
end
|
|
507
221
|
end
|