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,19 +1,11 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module Bluebook
|
|
3
3
|
module DSL
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
# `attribute`/`list_of`/`one_of` words themselves, closed-set
|
|
7
|
-
# synthesis, duplicate-name and pattern refusals, and the
|
|
8
|
-
# `identified_by` field/type resolution both a construct's own
|
|
9
|
-
# identity and a compound key are built from.
|
|
4
|
+
# Mixin for DSL builders that declare attributes: `attribute`, `list_of`, `one_of`,
|
|
5
|
+
# closed-set synthesis, and `identified_by` resolution.
|
|
10
6
|
module AttributeCollector
|
|
11
7
|
ListOf = Struct.new(:type)
|
|
12
|
-
# `:values` shadows Struct#values
|
|
13
|
-
# generated accessor returns the flat array of permitted values
|
|
14
|
-
# directly (what every caller actually wants), not Struct#values'
|
|
15
|
-
# own `[self.values]`. No caller anywhere reads the built-in
|
|
16
|
-
# behavior; verified before disabling this cop for it.
|
|
8
|
+
# `:values` shadows Struct#values so the accessor returns the flat permitted-value array.
|
|
17
9
|
# rubocop:disable-next Lint/StructNewOverride
|
|
18
10
|
OneOf = Struct.new(:values)
|
|
19
11
|
|
|
@@ -31,73 +23,20 @@ module Hecks
|
|
|
31
23
|
# @return [Array<Bluebook::ValueObject>] the value objects synthesised so far
|
|
32
24
|
def closed_sets = @closed_sets ||= []
|
|
33
25
|
|
|
34
|
-
# Declares one field on the owning construct
|
|
35
|
-
# an optionality flag, a pattern, a closed-set reference, or an inline closed set.
|
|
36
|
-
#
|
|
37
|
-
# `admits:` names a closed set that is already declared elsewhere —
|
|
26
|
+
# Declares one field on the owning construct; the type is a bare constant (ADR 0025).
|
|
38
27
|
#
|
|
39
28
|
# attribute :op, String, admits: "Vocabulary::QueryComparator"
|
|
40
29
|
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
# something new. `admits` points at a set the language already holds, so
|
|
44
|
-
# the same set can be named from many places without being written twice.
|
|
45
|
-
#
|
|
46
|
-
# Qualified, because a closed set is a value object inside an aggregate
|
|
47
|
-
# and `reference_to` reaches heads only — so this is text, checked where
|
|
48
|
-
# it is read rather than by reference resolution.
|
|
49
|
-
#
|
|
50
|
-
# And written as text, not as the constant path `Vocabulary::QueryComparator`
|
|
51
|
-
# it reads like. The constant spelling was tried — `ConstShim` returning
|
|
52
|
-
# a Module so Ruby's `::` reaches a second `const_missing` — and it
|
|
53
|
-
# cannot hold: `Facade::Surface` installs every aggregate name as a
|
|
54
|
-
# top-level constant, so the moment any facade exists, `Vocabulary`
|
|
55
|
-
# resolves to that module and the shim is never asked. A spelling that
|
|
56
|
-
# works only until a facade is built is worse than a quoted one.
|
|
30
|
+
# `admits:` names an already-declared closed set as qualified text, checked on read.
|
|
31
|
+
# `one_of:` declares an inline closed set and is only meaningful inside a `value_object`.
|
|
57
32
|
#
|
|
58
|
-
#
|
|
59
|
-
# "Attributes") — omitting it (a mint default of String) and quoting
|
|
60
|
-
# it as text both refuse now. Neither had a real reason left: no
|
|
61
|
-
# corpus attribute ever omitted the type, and `ConstShim#const_missing`
|
|
62
|
-
# (S0b) already resolves a bare, not-yet-declared constant to the
|
|
63
|
-
# same forward reference the quoted form existed for — a bareword
|
|
64
|
-
# `Name` reaches a value object named "Name" declared later in the
|
|
65
|
-
# same block, exactly what the quoted form `"Name"` would have
|
|
66
|
-
# reached — `spell`'s own `to_s` renders either one identically.
|
|
67
|
-
# Neither form appears in any frozen era text (checked directly), so
|
|
68
|
-
# both are refused unconditionally — nothing for
|
|
69
|
-
# `MetaValidator.shadow_parsing?` to answer for.
|
|
70
|
-
#
|
|
71
|
-
# The word `attribute` itself is not a real method any builder answers
|
|
72
|
-
# directly: every (context, word) Keyword row for it carries
|
|
73
|
-
# `calls: "attribute_impl"`, and `GenericDispatch` forwards the whole
|
|
74
|
-
# call here untouched. `attribute_collector_spec.rb`
|
|
75
|
-
# (`AttributeCollector has no method without a test` —
|
|
76
|
-
# dsl_coverage_spec.rb) and the bootstrap fallback
|
|
77
|
-
# (`GenericDispatch::BOOTSTRAP_CALLS_FALLBACK`) both name this same
|
|
78
|
-
# string; they must never drift apart.
|
|
79
|
-
#
|
|
80
|
-
# @param name [Symbol] the attribute's name
|
|
81
|
-
# @param type [Module, Symbol, ListOf, OneOf] the attribute's type: a bare constant
|
|
82
|
-
# (resolved by `ConstShim`), or the `ListOf`/`OneOf` wrapper `list_of`/`one_of` return
|
|
83
|
-
# when called in this same type position; quoted text is refused
|
|
84
|
-
# @param default [Object, nil] the value an omitted attribute defaults to; not type-checked
|
|
85
|
-
# here
|
|
86
|
-
# @param optional [Boolean] whether the attribute may be omitted entirely
|
|
87
|
-
# @param pattern [Regexp, String, nil] a pattern the attribute's value must match; refused
|
|
88
|
-
# if it uses a construct `PatternSubset` disallows
|
|
89
|
-
# @param admits [String, nil] the qualified name of an already-declared closed set this
|
|
90
|
-
# attribute's value may come from, such as `"Vocabulary::QueryComparator"`
|
|
91
|
-
# @param one_of [Array<String, Symbol>, nil] permitted values for a field-shaped closed
|
|
92
|
-
# set, declared inline via `one_of: [...]`; meaningful only inside a `value_object`
|
|
93
|
-
# (`ValueObjectBuilder` overrides `install_inline_closed_set`) — refused everywhere else
|
|
33
|
+
# @param type [Module, ListOf, OneOf] a bare constant or a `list_of`/`one_of` wrapper
|
|
94
34
|
# @return [void]
|
|
95
|
-
# @raise [
|
|
96
|
-
#
|
|
97
|
-
# `value_object`
|
|
35
|
+
# @raise [Malformed] on a duplicate name, a missing or quoted type, a disallowed
|
|
36
|
+
# pattern, or `one_of:` outside a `value_object`
|
|
98
37
|
def attribute_impl(name, type = UNSET, default: nil, optional: false, pattern: nil,
|
|
99
38
|
admits: nil, one_of: nil)
|
|
100
|
-
#
|
|
39
|
+
# The FieldName invariant on Root.Attribute enforces the name.
|
|
101
40
|
|
|
102
41
|
refuse_duplicate_attribute!(name)
|
|
103
42
|
|
|
@@ -106,10 +45,7 @@ module Hecks
|
|
|
106
45
|
"there is no default"
|
|
107
46
|
end
|
|
108
47
|
|
|
109
|
-
# `list_of("X")` carries
|
|
110
|
-
# bare constant is required there too, checked before it unwraps
|
|
111
|
-
# below, not after (once unwrapped, a plain String in the `type:`
|
|
112
|
-
# slot looks identical to one that legitimately belongs there).
|
|
48
|
+
# `list_of("X")` carries quoted text one level down; check it before unwrapping.
|
|
113
49
|
quoted = type.is_a?(ListOf) ? type.type : type
|
|
114
50
|
if quoted.is_a?(::String)
|
|
115
51
|
raise Malformed, "#{name}'s type #{quoted.inspect} is quoted text — give the bare constant " \
|
|
@@ -134,73 +70,24 @@ module Hecks
|
|
|
134
70
|
install_inline_closed_set(name, one_of) if one_of
|
|
135
71
|
end
|
|
136
72
|
|
|
137
|
-
# Wraps a type so `attribute_impl` records it as
|
|
138
|
-
#
|
|
139
|
-
# Called in an attribute's own type position (`attribute :x,
|
|
140
|
-
# list_of(Y)`), never through a `def list_of` any one builder
|
|
141
|
-
# answers as its own word — reached via
|
|
142
|
-
# `WordGate#word_gate_dispatch`'s "Type"-context fallback, the same
|
|
143
|
-
# one `one_of_impl` below uses. Bootstrap-reachable (every core
|
|
144
|
-
# chapter's own list-typed attributes use it), so
|
|
145
|
-
# `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK` carries a single
|
|
146
|
-
# `["Type", "list_of"]` entry rather than one per calling context —
|
|
147
|
-
# the bootstrap branch checks that key too, same reasoning as the
|
|
148
|
-
# ordinary fallback.
|
|
73
|
+
# Wraps a type so `attribute_impl` records it as list-valued: `attribute :x, list_of(Y)`.
|
|
149
74
|
#
|
|
150
|
-
#
|
|
151
|
-
#
|
|
152
|
-
# to mark the attribute list-valued
|
|
75
|
+
# Reached through WordGate's "Type"-context fallback; one `["Type", "list_of"]` entry in
|
|
76
|
+
# GenericDispatch::BOOTSTRAP_CALLS_FALLBACK covers bootstrap.
|
|
153
77
|
def list_of_impl(type) = ListOf.new(type)
|
|
154
78
|
|
|
155
|
-
# `reference_to Account` mints `:account
|
|
156
|
-
#
|
|
157
|
-
# `EntityBuilder`, `CommandBuilder#cross_reference`,
|
|
158
|
-
# `QueryBuilder`, `PortOperationBuilder`, all `include
|
|
159
|
-
# AttributeCollector`) shares, since dropping the suffix is what
|
|
160
|
-
# makes `/` a real traversal operator possible at all (ADR 0025,
|
|
161
|
-
# "References" — a hop crosses at `/`, a field walk crosses at
|
|
162
|
-
# `.`; deriving the hop name from `account_id` is what made an
|
|
163
|
-
# explicit operator impossible before).
|
|
164
|
-
#
|
|
165
|
-
# Legacy under shadow-parsing (S0a's own bridge): frozen era text
|
|
166
|
-
# was minted under the old default, and `EraGuard.shadow_parse`
|
|
167
|
-
# reconstructs a held aggregate's shape to diff against the
|
|
168
|
-
# current one — reading that text through the new default would
|
|
169
|
-
# silently reconstruct the wrong historical name, not merely
|
|
170
|
-
# refuse a spelling the way S1's `identified_by` legacy forms do.
|
|
171
|
-
# This is a mint default changing, not a syntax being removed, so
|
|
172
|
-
# there is nothing to refuse here — only a fork in what gets
|
|
173
|
-
# minted when `as:` is omitted.
|
|
79
|
+
# `reference_to Account` mints `:account`, no `_id` (ADR 0025). Under shadow-parsing the
|
|
80
|
+
# suffix is kept so frozen era text reconstructs the name it was minted under.
|
|
174
81
|
private def default_reference_name(target)
|
|
175
82
|
suffix = MetaValidator.shadow_parsing? ? "_id" : ""
|
|
176
83
|
:"#{Naming.snake(target)}#{suffix}"
|
|
177
84
|
end
|
|
178
85
|
|
|
179
|
-
#
|
|
86
|
+
# Wraps permitted values so `attribute_impl` synthesises a closed-set value object:
|
|
180
87
|
#
|
|
181
88
|
# attribute :status, one_of("open", "shut")
|
|
182
89
|
#
|
|
183
|
-
#
|
|
184
|
-
# exactly the machinery a hand-written one_of does — and so the
|
|
185
|
-
# attribute's type is still a declared value object, which is now a
|
|
186
|
-
# structural rule rather than a predicate.
|
|
187
|
-
#
|
|
188
|
-
# Wraps a list of permitted values so `attribute_impl` synthesises a closed-set value
|
|
189
|
-
# object for them.
|
|
190
|
-
#
|
|
191
|
-
# The desugaring is pinned — the same bluebook must always yield the
|
|
192
|
-
# same IR, so a plain String attribute silently discarding the
|
|
193
|
-
# values is not an outcome this spelling can produce.
|
|
194
|
-
#
|
|
195
|
-
# Reached the same way `list_of_impl` above is. Same name as
|
|
196
|
-
# `ValueObjectBuilder#one_of_impl`'s own override on purpose —
|
|
197
|
-
# that method's own `super(*values)` call (the no-block, bare
|
|
198
|
-
# type-position case) resolves by method name up the ancestor
|
|
199
|
-
# chain, and renaming only one side would silently break it.
|
|
200
|
-
#
|
|
201
|
-
# @param values [Array<String, Symbol>] the permitted values
|
|
202
|
-
# @return [Bluebook::DSL::AttributeCollector::OneOf] the wrapper `attribute_impl` reads to
|
|
203
|
-
# synthesise the closed-set value object
|
|
90
|
+
# Shares its name with `ValueObjectBuilder#one_of_impl`, whose `super` resolves by name.
|
|
204
91
|
def one_of_impl(*values) = OneOf.new(values)
|
|
205
92
|
|
|
206
93
|
private
|
|
@@ -216,46 +103,24 @@ module Hecks
|
|
|
216
103
|
)
|
|
217
104
|
end
|
|
218
105
|
|
|
219
|
-
# `one_of:`
|
|
220
|
-
#
|
|
221
|
-
# constraints already live, for the one context where it means
|
|
222
|
-
# anything: a `value_object` block, where it replaces the old
|
|
223
|
-
# `one_of do member ... end` wrapper for a single-field set (a
|
|
224
|
-
# multi-field set still writes bare `member` lines, unwrapped).
|
|
225
|
-
# `ValueObjectBuilder` overrides this; every other includer
|
|
226
|
-
# (Aggregate/Entity/Command/Query/PortOperation) inherits this
|
|
227
|
-
# refusal — those contexts already have the unchanged type-position
|
|
228
|
-
# form (`attribute :status, one_of("open", "shut")`) for an
|
|
229
|
-
# anonymous inline set, so `one_of:` naming a *field* there would be
|
|
230
|
-
# a second spelling of the same idea, not a new one.
|
|
106
|
+
# `one_of:` on a field is meaningful only inside a `value_object` (ADR 0025);
|
|
107
|
+
# ValueObjectBuilder overrides this and every other includer refuses.
|
|
231
108
|
def install_inline_closed_set(name, _values)
|
|
232
109
|
raise Malformed,
|
|
233
110
|
"#{name}'s one_of: only means something inside a value_object — name a closed set " \
|
|
234
111
|
"with the type-position one_of(...) instead"
|
|
235
112
|
end
|
|
236
113
|
|
|
237
|
-
#
|
|
238
|
-
#
|
|
239
|
-
# reader that walks `attributes` looking for one by name
|
|
240
|
-
# (`seal_mutation_targets`, `seal_query_field`, `projects`'s own
|
|
241
|
-
# local check, `Instance#[]`, ...) uses `Array#find`/`any?`, which
|
|
242
|
-
# silently answers whichever declaration happens to come first and
|
|
243
|
-
# discards the second — left unrefused, both declarations would
|
|
244
|
-
# survive into the IR, one of them permanently unreachable by name.
|
|
245
|
-
# Refused here, at the one place every owner
|
|
246
|
-
# (Aggregate/Entity/Command/Query/PortOperation/ValueObject, each
|
|
247
|
-
# `include AttributeCollector`) mints an attribute through, rather
|
|
248
|
-
# than taught to each of those readers individually.
|
|
114
|
+
# Refused where every owner mints an attribute: readers look names up with `find`/`any?`
|
|
115
|
+
# and would silently discard the second declaration.
|
|
249
116
|
def refuse_duplicate_attribute!(name)
|
|
250
117
|
return unless attributes.any? { |attribute| attribute.name == name }
|
|
251
118
|
|
|
252
119
|
raise Malformed, "#{name} is declared twice — an attribute name is declared once, not twice"
|
|
253
120
|
end
|
|
254
121
|
|
|
255
|
-
#
|
|
256
|
-
#
|
|
257
|
-
# the bluebook, and a bluebook that loads is one whose patterns carry
|
|
258
|
-
# one meaning. PatternSubset says which those are, and why each is refused.
|
|
122
|
+
# Refused at declaration: a regex whose meaning depends on the engine must not load
|
|
123
|
+
# (PatternSubset says which constructs and why).
|
|
259
124
|
def refuse_unshared_pattern(name, pattern)
|
|
260
125
|
rejection = PatternSubset.validate(pattern)
|
|
261
126
|
return unless rejection
|
|
@@ -276,27 +141,12 @@ module Hecks
|
|
|
276
141
|
type
|
|
277
142
|
end
|
|
278
143
|
|
|
279
|
-
#
|
|
280
|
-
# scalar leaves in declaration order. Named, inline and compound-key
|
|
281
|
-
# declarations therefore share one flattening rule.
|
|
144
|
+
# Each selected identity head contributes all its scalar leaves in declaration order.
|
|
282
145
|
def resolve_identity_field!(field, value_objects, context_name)
|
|
283
146
|
attr = attributes.find { |a| a.name == field }
|
|
284
147
|
|
|
285
|
-
# `:id` or
|
|
286
|
-
#
|
|
287
|
-
# fallback-identity convention. The `_id` suffix is the meta-
|
|
288
|
-
# domain's own (the `Command`/`Entity`/`Aggregate` etc. records
|
|
289
|
-
# identify by `owner_id`/`bluebook_id`/`aggregate_id`, supplied
|
|
290
|
-
# by the judge's replay rather than declared locally — see
|
|
291
|
-
# `behavior.bluebook`'s own "owner_id is not a declared
|
|
292
|
-
# attribute" comment); bare `:id` is `Instance#materialize_
|
|
293
|
-
# identity!`'s own fallback name (`@aggregate.identified_by ||
|
|
294
|
-
# :id`) made explicit rather than left implicit — declaring
|
|
295
|
-
# `identified_by :id` says out loud what omitting `identified_by`
|
|
296
|
-
# entirely already meant. `reference_to` mints the `_id` suffix
|
|
297
|
-
# for the same reason `attr.reference?` below resolves bare: an
|
|
298
|
-
# `_id`(-shaped) name is already a scalar by the language's own
|
|
299
|
-
# spelling convention, walk-supplied or locally declared alike.
|
|
148
|
+
# A bare `:id` or `_id`-suffixed name with no matching attribute is the walk-parent/
|
|
149
|
+
# fallback-identity convention (Instance#materialize_identity! falls back to `:id`).
|
|
300
150
|
return [field.to_s] if attr.nil? && (field.to_s == "id" || field.to_s.end_with?("_id"))
|
|
301
151
|
|
|
302
152
|
raise Malformed, "#{context_name}.identified_by :#{field} names no attribute #{context_name} declares" unless attr
|
|
@@ -321,26 +171,11 @@ module Hecks
|
|
|
321
171
|
"#{context_name}.identified_by #{target} mints :#{field}, but that attribute is already declared"
|
|
322
172
|
end
|
|
323
173
|
|
|
324
|
-
# `Attribute.new` directly
|
|
325
|
-
#
|
|
326
|
-
# the bluebook author typed (the type position's own quoted-text
|
|
327
|
-
# refusal is about DSL source, not internal minting), and `vo`
|
|
328
|
-
# itself can't be passed either: it is the real, already-built
|
|
329
|
-
# `ValueObject` subclass, permanently anonymous from Ruby's own
|
|
330
|
-
# `to_s` (only `hecks_name` carries its name) — `Attribute#spell`
|
|
331
|
-
# would demodulise it to "#<Class:0x...>", not "PizzaName".
|
|
174
|
+
# `Attribute.new` directly: `vo` is an anonymous class whose `to_s` would spell
|
|
175
|
+
# "#<Class:0x...>", so the demodulised `target` text is the type.
|
|
332
176
|
attributes << Attribute.new(name: field, type: target)
|
|
333
|
-
# Moved to `insert_at
|
|
334
|
-
#
|
|
335
|
-
# not left where `attribute` just appended it. Resolution happens
|
|
336
|
-
# at build time, after every other attribute in the block has
|
|
337
|
-
# already run, so appending would put the identity field last
|
|
338
|
-
# regardless of where `identified_by` was actually written.
|
|
339
|
-
# Most real bluebooks write it first (insert_at 0); one (a
|
|
340
|
-
# ScheduledPayment corpus member) writes it after a reference_to
|
|
341
|
-
# and an attribute — this matches either, producing the same
|
|
342
|
-
# result a person hand-writing `attribute field, Type` at that
|
|
343
|
-
# exact point would.
|
|
177
|
+
# Moved to `insert_at`, the attribute count when `identified_by` was called; resolution
|
|
178
|
+
# runs at build time, so appending would put the identity field last.
|
|
344
179
|
attributes.insert(insert_at, attributes.pop)
|
|
345
180
|
vo.attributes.flat_map do |attribute|
|
|
346
181
|
identity_paths_for_attribute(attribute, value_objects, context_name,
|
|
@@ -368,14 +203,8 @@ module Hecks
|
|
|
368
203
|
raise Malformed, "#{context_name}'s identity value objects form a cycle: #{cycle}"
|
|
369
204
|
end
|
|
370
205
|
|
|
371
|
-
#
|
|
372
|
-
#
|
|
373
|
-
# deriving its path only makes sense while every value object along
|
|
374
|
-
# the way wraps exactly one field itself — the same "single-field
|
|
375
|
-
# value object" ADR 0025 names this shape after. Left unrefused, a
|
|
376
|
-
# multi-field value object here would expand silently into every
|
|
377
|
-
# one of its own fields, minting an unannounced compound key
|
|
378
|
-
# nothing declared.
|
|
206
|
+
# A bare field derives one scalar, so each value object on the way must wrap exactly one
|
|
207
|
+
# field (ADR 0025); otherwise it would silently mint an unannounced compound key.
|
|
379
208
|
if nested.attributes.size != 1
|
|
380
209
|
candidates = nested.attributes.map(&:name).join(", ")
|
|
381
210
|
raise Malformed,
|
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module Bluebook
|
|
3
3
|
module DSL
|
|
4
|
-
# What a bare `Domain::Aggregate` constant resolves to inside a
|
|
5
|
-
#
|
|
6
|
-
# `const_missing`) — `method_missing` turns a bind like
|
|
7
|
-
# `Payment.persisted_by "Postgres"` into a queued `Bind`, and `#port`
|
|
8
|
-
# is the one real method, for `Aggregate.port("Name") do ... end`.
|
|
4
|
+
# What a bare `Domain::Aggregate` constant resolves to inside a `.hecksagon`/`.world`
|
|
5
|
+
# block; `method_missing` records a bind, `#port` is the one real method on this proxy.
|
|
9
6
|
class BindingProxy
|
|
10
|
-
# Mints the
|
|
11
|
-
#
|
|
12
|
-
# @param domain [Symbol, String] the domain name, the first segment of `Domain::Aggregate`
|
|
13
|
-
# @param collector [Array<Bluebook::Bind>] the list every bind made through the module's
|
|
14
|
-
# proxies is appended to
|
|
15
|
-
# @return [Module] an anonymous module whose `const_missing` answers a `BindingProxy`
|
|
16
|
-
# for `"Domain::Aggregate"`
|
|
7
|
+
# Mints the module a bare `Domain::Aggregate` constant resolves to via `const_missing`.
|
|
17
8
|
def self.namespace(domain, collector)
|
|
18
9
|
Module.new do
|
|
19
10
|
define_singleton_method(:const_missing) do |aggregate|
|
|
@@ -22,48 +13,26 @@ module Hecks
|
|
|
22
13
|
end
|
|
23
14
|
end
|
|
24
15
|
|
|
25
|
-
# @param fqn [String] the aggregate's qualified name, `"Domain::Aggregate"`
|
|
26
|
-
# @param collector [Array<Bluebook::Bind>] the list each bind made on this proxy is
|
|
27
|
-
# appended to
|
|
28
16
|
def initialize(fqn, collector)
|
|
29
17
|
@fqn = fqn
|
|
30
18
|
@collector = collector
|
|
31
19
|
end
|
|
32
20
|
|
|
33
|
-
# Declares a port on this aggregate
|
|
34
|
-
#
|
|
35
|
-
# **The aggregate-scoped port** — `Payments::Payment.port("Gateway") do
|
|
36
|
-
# ... end`, the same receiver a plain bind like `.persisted_by(...)`
|
|
37
|
-
# already reaches, because a port belongs to exactly one aggregate
|
|
38
|
-
# the same way a bind does. A real method, not method_missing : its
|
|
39
|
-
# shape (a name and a block building operations) has nothing to do
|
|
40
|
-
# with `Bind`, so it does not belong in that generic verb path.
|
|
41
|
-
#
|
|
42
|
-
# @param name [String] the port's name, such as `"Gateway"`
|
|
43
|
-
# @yield the port body, evaluated against a `DomainPortBuilder`: either `verb`/`signal`
|
|
44
|
-
# or `operation`/`tells`/`asks` blocks
|
|
45
|
-
# @return [Bluebook::DSL::BindingProxy] this proxy, so further binds can chain
|
|
46
|
-
# @raise [Bluebook::DSL::Malformed] if the current registry holds no such aggregate, or
|
|
47
|
-
# the body declares both a verb and operations, neither, or an operation the port
|
|
48
|
-
# grammar refuses
|
|
21
|
+
# Declares a port on this aggregate. A real method, not method_missing — its
|
|
22
|
+
# shape (name plus an operations block) is unrelated to `Bind`'s generic verb path.
|
|
49
23
|
def port(name, &block)
|
|
50
24
|
domain, aggregate_name = @fqn.split("::")
|
|
51
25
|
aggregate_ir = Hecks.current_registry.bluebook(domain)&.aggregate(aggregate_name) or
|
|
52
26
|
raise Malformed, "#{@fqn} declares no such aggregate — a port needs one to belong to"
|
|
53
27
|
|
|
54
|
-
#
|
|
55
|
-
#
|
|
56
|
-
#
|
|
57
|
-
# BindingProxy-minting one, which would turn a bare `Pizza` inside
|
|
58
|
-
# `reference_to Pizza` into another BindingProxy instead of a name.
|
|
28
|
+
# ConstShim's resolver is one global for the whole dynamic extent; without
|
|
29
|
+
# swapping it here, a bare `Pizza` inside `reference_to Pizza` would resolve
|
|
30
|
+
# to another BindingProxy instead of a plain name.
|
|
59
31
|
built = ConstShim.with(->(const) { const }) { DomainPortBuilder.build(name, owner: aggregate_name, &block) }
|
|
60
32
|
|
|
61
|
-
# A `verb`-shaped port is a plain `Port
|
|
62
|
-
#
|
|
63
|
-
#
|
|
64
|
-
# that call. It belongs to no aggregate IR the way an
|
|
65
|
-
# operations-shaped `DomainPort` does; the aggregate above
|
|
66
|
-
# was only needed to resolve `owner` for the operations branch.
|
|
33
|
+
# A `verb`-shaped port is a plain `Port`, the same struct `Hecks.port`
|
|
34
|
+
# registers — it belongs to no aggregate IR the way an operations-shaped
|
|
35
|
+
# `DomainPort` does, so it takes the registry's `add_port` directly.
|
|
67
36
|
if built.is_a?(Port)
|
|
68
37
|
Hecks.current_registry.add_port(built)
|
|
69
38
|
return self
|
|
@@ -77,14 +46,9 @@ module Hecks
|
|
|
77
46
|
end
|
|
78
47
|
|
|
79
48
|
def method_missing(verb, *args, **kwargs, &block)
|
|
80
|
-
#
|
|
81
|
-
#
|
|
82
|
-
#
|
|
83
|
-
# readable_by: "Privacy officer")`. No existing real
|
|
84
|
-
# `.hecksagon` bind is ever called this way (verified by
|
|
85
|
-
# grep before adding this branch — `persisted_by`/
|
|
86
|
-
# `opened_by`/every other bind always takes at least one
|
|
87
|
-
# arg), so this cannot collide with recording a `Bind`.
|
|
49
|
+
# A bare call (no args/kwargs/block) starts a Privacy marking chain instead
|
|
50
|
+
# of a Bind — no real `.hecksagon` bind is ever called with zero arguments,
|
|
51
|
+
# so this can't collide with recording one.
|
|
88
52
|
return AttributePath.new(@fqn, [verb.to_s]) if args.empty? && kwargs.empty? && !block
|
|
89
53
|
|
|
90
54
|
@collector << Bind.new(
|
|
@@ -102,32 +66,15 @@ module Hecks
|
|
|
102
66
|
def to_s = @fqn
|
|
103
67
|
end
|
|
104
68
|
|
|
105
|
-
# What a Privacy-marking chain resolves to after its first bare segment —
|
|
106
|
-
#
|
|
107
|
-
# (one segment longer), and a terminal `has_<category>(readable_by:)` records the
|
|
108
|
-
# marking and ends the chain. See `BindingProxy#method_missing`'s own header for why
|
|
109
|
-
# a bare call is unambiguously the start of one of these, never a `Bind`.
|
|
69
|
+
# What a Privacy-marking chain resolves to after its first bare segment — each
|
|
70
|
+
# bare call extends the path one segment; a terminal `has_<category>(readable_by:)` ends it.
|
|
110
71
|
class AttributePath
|
|
111
|
-
# @param fqn [String] the aggregate's own qualified name, `"Domain::Aggregate"`
|
|
112
|
-
# @param path [Array<String>] every segment named so far, e.g. `["attendee"]`
|
|
113
72
|
def initialize(fqn, path)
|
|
114
73
|
@fqn = fqn
|
|
115
74
|
@path = path
|
|
116
75
|
end
|
|
117
76
|
|
|
118
77
|
# Records a `has_<category>` marking, or extends the attribute path by one segment.
|
|
119
|
-
#
|
|
120
|
-
# @param verb [Symbol] `has_<category>` to record the marking and end the chain;
|
|
121
|
-
# any other bare name to extend the path one segment further
|
|
122
|
-
# @param readable_by [String] required only for a `has_<category>` call — the
|
|
123
|
-
# Governance role a read must hold to see this field unredacted
|
|
124
|
-
# @param args [Array] must be empty; a positional argument is refused
|
|
125
|
-
# @param kwargs [Hash] must be empty; any keyword but `readable_by:` is refused
|
|
126
|
-
# @param block [Proc, nil] must be absent; a block is refused
|
|
127
|
-
# @return [Bluebook::DSL::AttributePath, nil] a longer chain for a plain segment;
|
|
128
|
-
# `nil` (nothing further to chain) for a `has_<category>` call
|
|
129
|
-
# @raise [Malformed] if a `has_<category>` call omits `readable_by:`, or any call
|
|
130
|
-
# carries positional args or a block (neither shape this chain supports)
|
|
131
78
|
def method_missing(verb, *args, readable_by: nil, **kwargs, &block)
|
|
132
79
|
name = verb.to_s
|
|
133
80
|
return record_marking(name.delete_prefix("has_"), readable_by) if name.start_with?("has_")
|