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,94 +1,26 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module Bluebook
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
# struct format itself (this file) plus, reopened in contracts.rb, the
|
|
6
|
-
# `CONTRACTS` table of one `Contract` per construct category.
|
|
3
|
+
# Translates the language's declarations into the IR that `Build` and
|
|
4
|
+
# `Reconstruction` produce; `CONTRACTS` (contracts.rb) holds one per category.
|
|
7
5
|
class Assembly
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
# Naming a field derived is a claim, and a claim needs a kind, not just a name
|
|
12
|
-
# in a list. A bare list of names is a promise with nobody holding it: the
|
|
13
|
-
# coverage gate only asks whether a field is accounted for, so `derived:
|
|
14
|
-
# %i[version]` would satisfy it while dropping a chapter's version in
|
|
15
|
-
# silence — the exact shape of every defect this arc has found.
|
|
16
|
-
#
|
|
17
|
-
# :parent the containment tree supplies it — a `*_id`, or one of
|
|
18
|
-
# the named pointers below. Checked against the name.
|
|
19
|
-
# :children it is assembled as child constructs. Checked against the
|
|
20
|
-
# language: a category must exist whose parent is this one.
|
|
21
|
-
# [:computed, :m] the holder works it out. Checked: it must answer to `m`.
|
|
22
|
-
# [:folded, keys] several language fields are one thing in the IR, or one
|
|
23
|
-
# is spread across several. Checked: every key must appear
|
|
24
|
-
# in a real reconstructed declaration.
|
|
25
|
-
# :elsewhere not a fact about this construct at all. Allow-listed one
|
|
26
|
-
# by one, because it is the kind with no other check.
|
|
27
|
-
#
|
|
28
|
-
# Every one of those can fail. That is the whole difference.
|
|
6
|
+
# A derived claim's kind is one of :parent, :children, [:computed, method],
|
|
7
|
+
# [:folded, keys], or :elsewhere — each checked structurally, not just named.
|
|
29
8
|
Contract = Struct.new(:holder, :make, :fields, :derived, :rows, :reads, keyword_init: true) do
|
|
30
|
-
#
|
|
31
|
-
# `text(row[key])`, a single cell — which is most of them ; present names the
|
|
32
|
-
# shape, because a list needs a reader per element and a folded field is
|
|
33
|
-
# gathered rather than fetched. Same pattern as `rows`, in the other
|
|
34
|
-
# direction: declare the exceptions, default the rest.
|
|
35
|
-
#
|
|
36
|
-
# @param key [String, Symbol] the field's declaration key, as `fields` names it
|
|
37
|
-
# @return [Symbol, Array, nil] the reader named in `reads` for `key`, or `nil`
|
|
38
|
-
# when the field reads through the default single-cell reader
|
|
9
|
+
# nil means the field reads through the default single-cell reader.
|
|
39
10
|
def reader(key) = Hash(reads)[key.to_sym]
|
|
40
11
|
|
|
41
|
-
#
|
|
42
|
-
# here reads straight off the node ; one that is present names the shaper,
|
|
43
|
-
# because the IR keeps a shape the language does not — a transition whose
|
|
44
|
-
# `from` is a list is several rows, an append binds several fields at once,
|
|
45
|
-
# an open map is one row per entry.
|
|
46
|
-
#
|
|
47
|
-
# @param list [String, Symbol] the appendable list's field name
|
|
48
|
-
# @return [Symbol, nil] the shaper method named in `rows` for `list`, or `nil`
|
|
49
|
-
# when the list reads straight off the node instead
|
|
12
|
+
# nil means the list reads straight off the node.
|
|
50
13
|
def shaper(list) = Hash(rows)[list.to_sym]
|
|
51
14
|
|
|
52
|
-
# Whether `field` is one this contract accounts for, stored or derived.
|
|
53
|
-
#
|
|
54
|
-
# @param field [Symbol] the field name to check
|
|
55
|
-
# @return [Boolean] whether `field` is a key of `fields` or of `derived`
|
|
56
15
|
def declares?(field) = fields.key?(field) || derived.key?(field)
|
|
57
16
|
|
|
58
|
-
# Names the kind of derived claim `field` makes, if any.
|
|
59
|
-
#
|
|
60
|
-
# @param field [Symbol] the derived field name to check
|
|
61
|
-
# @return [Symbol, Array, nil] the kind `derived` names for `field` — `:parent`,
|
|
62
|
-
# `:children`, `:elsewhere`, `:walk`, an `[:computed, method]` or `[:folded,
|
|
63
|
-
# object, member]` pair — or `nil` when `field` is not derived
|
|
64
17
|
def kind_of(field) = derived[field]
|
|
65
18
|
|
|
66
|
-
#
|
|
67
|
-
# The language declares them (`attribute :position, Position`) so the
|
|
68
|
-
# judge can order siblings, but no constructor takes one. This is the one
|
|
69
|
-
# place that fact is stated ; `Specializer` and `Model::Deviations` read it
|
|
70
|
-
# here rather than each keeping their own `%i[position]`.
|
|
71
|
-
#
|
|
72
|
-
# @return [Array<Symbol>] every field name whose derived kind is `:walk`
|
|
19
|
+
# Every derived field the walk supplies; Specializer skips these.
|
|
73
20
|
def walked = derived.select { |_field, kind| kind == :walk }.keys
|
|
74
21
|
|
|
75
|
-
#
|
|
76
|
-
#
|
|
77
|
-
# `[:folded, :lifecycle, :field]` says the language's `state_field` is the
|
|
78
|
-
# `field` of the IR's one Lifecycle. `Readings` would otherwise have to state
|
|
79
|
-
# that fact a second time as `node.lifecycle&.field` — saying it once here
|
|
80
|
-
# drives both directions instead: the walk reads the member on the way in, and
|
|
81
|
-
# the reconstruction gathers the members back into the object on the way out.
|
|
82
|
-
#
|
|
83
|
-
# A nil member means the fold has no single member to name — `rows` is a
|
|
84
|
-
# count of what `closed_set` and `members` hold between them, and `options`
|
|
85
|
-
# spreads across eight keys. Those keep their own code, and the gate still
|
|
86
|
-
# checks the object they name is real.
|
|
87
|
-
#
|
|
88
|
-
# @param field [Symbol] the derived field name to check
|
|
89
|
-
# @return [Array(Symbol, Symbol), Array(Array<Symbol>, nil), nil] the `[object,
|
|
90
|
-
# member]` pair the field folds into — `member` is `nil` when the fold has
|
|
91
|
-
# no single member to name — or `nil` when `field` does not fold at all
|
|
22
|
+
# [object, member] a folded field lives at; member is nil when the fold
|
|
23
|
+
# has no single one to name (e.g. a count plus a list of rows).
|
|
92
24
|
def folded(field)
|
|
93
25
|
kind = derived[field]
|
|
94
26
|
return nil unless kind.is_a?(Array) && kind.first == :folded
|
|
@@ -96,20 +28,8 @@ module Hecks
|
|
|
96
28
|
[kind[1], kind[2]]
|
|
97
29
|
end
|
|
98
30
|
|
|
99
|
-
# Computed means
|
|
100
|
-
#
|
|
101
|
-
# Asking only whether the holder responds was too weak, and measurably so:
|
|
102
|
-
# `[:computed, :version]` passed, because `Bluebook` does answer to
|
|
103
|
-
# `version` — it just answers with what the constructor was handed. A field
|
|
104
|
-
# the constructor takes is stored, and calling it computed is how a chapter's
|
|
105
|
-
# version would have gone missing while the gate said yes.
|
|
106
|
-
#
|
|
107
|
-
# So a computed field is one the holder answers and the constructor does not
|
|
108
|
-
# accept. `query_name` qualifies (`Naming.snake(name)`) ; `version` cannot.
|
|
109
|
-
#
|
|
110
|
-
# @param method [Symbol] the field name to check
|
|
111
|
-
# @return [Boolean] whether `holder` answers `method` but its constructor does
|
|
112
|
-
# not accept it as a keyword
|
|
31
|
+
# Computed means the holder answers but its constructor won't accept it —
|
|
32
|
+
# respond_to? alone would also count a stored field like `version`.
|
|
113
33
|
def computes?(method)
|
|
114
34
|
return false unless holder
|
|
115
35
|
return false unless answers?(method)
|
|
@@ -117,22 +37,10 @@ module Hecks
|
|
|
117
37
|
!accepts?(method)
|
|
118
38
|
end
|
|
119
39
|
|
|
120
|
-
# Whether `holder` answers `method`, checked the way that fits how it is
|
|
121
|
-
# built: `respond_to?` for a `:declare` holder (a class, queried live) and
|
|
122
|
-
# `method_defined?` for a `:new` holder (an instance method, checked without
|
|
123
|
-
# building one).
|
|
124
|
-
#
|
|
125
|
-
# @param method [Symbol] the method name to check
|
|
126
|
-
# @return [Boolean] whether `holder` answers `method`
|
|
127
40
|
def answers?(method)
|
|
128
41
|
make == :declare ? holder.respond_to?(method) : holder.method_defined?(method)
|
|
129
42
|
end
|
|
130
43
|
|
|
131
|
-
# Whether the holder's constructor takes `keyword` as a keyword argument.
|
|
132
|
-
#
|
|
133
|
-
# @param keyword [Symbol] the keyword to check
|
|
134
|
-
# @return [Boolean] whether the holder's constructor (`.declare` or
|
|
135
|
-
# `#initialize`) accepts `keyword` as an optional or required keyword
|
|
136
44
|
def accepts?(keyword)
|
|
137
45
|
builder = make == :declare ? holder.method(:declare) : holder.instance_method(:initialize)
|
|
138
46
|
|
|
@@ -140,49 +48,20 @@ module Hecks
|
|
|
140
48
|
end
|
|
141
49
|
end
|
|
142
50
|
|
|
143
|
-
#
|
|
144
|
-
#
|
|
145
|
-
# QueryIR (a declared field the model composes instead of storing).
|
|
146
|
-
#
|
|
147
|
-
# aggregate, bluebook the bare parent link a creating command mints
|
|
148
|
-
# (ADR 0025) — exactly the `parent_key`s `Plan` reads
|
|
149
|
-
# off the language
|
|
150
|
-
# owner Entity's own text twin of that link, which is why
|
|
151
|
-
# Entity's contract claims `owner: :parent`
|
|
152
|
-
#
|
|
153
|
-
# `shape` and `handler` are not on this list — S17 (ADR 0026) made Member and
|
|
154
|
-
# Dispatch nested entities, so neither is a parent field the way
|
|
155
|
-
# `owner` is. `spec/assembly_spec` derives this set from `Plan` and the
|
|
156
|
-
# contracts directly and fails on any drift, rather than trusting this list to
|
|
157
|
-
# stay in sync with a second hand-written copy kept by the model generator.
|
|
51
|
+
# Parent-pointer fields that don't end in `_id` (ADR 0025).
|
|
52
|
+
# spec/assembly_spec derives this set independently and fails on drift.
|
|
158
53
|
PARENT_POINTERS = %i[aggregate bluebook owner].freeze
|
|
159
54
|
|
|
160
|
-
# Whether `field` is a parent pointer that does not end in `_id`.
|
|
161
|
-
#
|
|
162
|
-
# @param field [String, Symbol] the field name to check
|
|
163
|
-
# @return [Boolean] whether `field` ends with `_id`, or is one of
|
|
164
|
-
# `PARENT_POINTERS`
|
|
165
55
|
def self.parent_pointer?(field)
|
|
166
56
|
field.to_s.end_with?("_id") || PARENT_POINTERS.include?(field.to_sym)
|
|
167
57
|
end
|
|
168
58
|
|
|
169
|
-
#
|
|
170
|
-
#
|
|
171
|
-
#
|
|
172
|
-
# normalisations the canonical-form table belongs to the expression grammar.
|
|
173
|
-
# A chapter's rules are canonicalised on the way in, so the
|
|
174
|
-
# language models the table — but no chapter stores one, and
|
|
175
|
-
# `Bluebook#to_h` splices it in from Expression.
|
|
59
|
+
# Fields allowed to describe something other than their own construct.
|
|
60
|
+
# `Bluebook.normalisations` belongs to the expression grammar; `to_h` splices it in.
|
|
176
61
|
ELSEWHERE = {
|
|
177
62
|
Bluebook: %i[normalisations]
|
|
178
63
|
}.freeze
|
|
179
64
|
|
|
180
|
-
# Whether `field` is allow-listed as describing something other than
|
|
181
|
-
# `category`'s own construct — see `ELSEWHERE`.
|
|
182
|
-
#
|
|
183
|
-
# @param category [String, Symbol] the construct category name
|
|
184
|
-
# @param field [Symbol] the field name to check
|
|
185
|
-
# @return [Boolean] whether `field` is on `category`'s `ELSEWHERE` entry
|
|
186
65
|
def self.elsewhere?(category, field)
|
|
187
66
|
Array(ELSEWHERE[category.to_sym]).include?(field)
|
|
188
67
|
end
|
|
@@ -1,46 +1,11 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module Bluebook
|
|
3
|
-
# Reopened
|
|
4
|
-
#
|
|
5
|
-
# Command, ValueObject, Query, ...); see `Contract`'s own header
|
|
6
|
-
# (contract.rb) for the struct format each entry below fills in.
|
|
3
|
+
# Reopened for `CONTRACTS`, the table of each category's own `Contract`;
|
|
4
|
+
# see contract.rb for the struct format each entry below fills in.
|
|
7
5
|
class Assembly
|
|
8
|
-
# One table
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
# `Plan` already reads it — parent, fields, lists, setters. What the language
|
|
12
|
-
# cannot say is the three things Ruby needs to rebuild one, so those are here
|
|
13
|
-
# and only those:
|
|
14
|
-
#
|
|
15
|
-
# holder which class holds it
|
|
16
|
-
# make :declare for a construct that became a class, :new for an
|
|
17
|
-
# instance — the boundary `Query` sits on, since its body is
|
|
18
|
-
# inherited instance methods
|
|
19
|
-
# fields each keyword the constructor takes, as
|
|
20
|
-
# keyword => [key in the declaration, how to read it]
|
|
21
|
-
#
|
|
22
|
-
# A reader is a symbol naming a method on Marks, or :plain for a value that
|
|
23
|
-
# needs no decoding, or [:each, reader] for a list. Nothing here is a rule
|
|
24
|
-
# about whether a declaration is admissible — the language settled that on the
|
|
25
|
-
# way in. This is only how a spelling becomes an object again.
|
|
26
|
-
#
|
|
27
|
-
# Why a table and not a method per category: a hand-written branch per
|
|
28
|
-
# category can decorate a verb the language declares without the walk ever
|
|
29
|
-
# offering it, and nothing goes red, because a branch that does not exist
|
|
30
|
-
# cannot fail. An assembler with a method per category is the same shape.
|
|
31
|
-
# The table avoids it because spec/assembly_spec checks it against the
|
|
32
|
-
# language: a field the language declares that no contract consumes is a
|
|
33
|
-
# failure, not a silence.
|
|
34
|
-
#
|
|
35
|
-
# The `derived` list is how a field says it needs no assembling — a parent
|
|
36
|
-
# pointer the containment tree already knows, or something computed from what
|
|
37
|
-
# is here (`query_name` is `Naming.snake(name)`, `creates?` is whether a verb
|
|
38
|
-
# names a root). Naming one is a claim, and the coverage gate holds it.
|
|
39
|
-
#
|
|
40
|
-
# @param category [String, Symbol] the construct category name, such as
|
|
41
|
-
# `"Aggregate"` or `:Command`
|
|
42
|
-
# @return [Bluebook::Assembly::Contract] the category's field contract
|
|
43
|
-
# @raise [KeyError] if no contract is registered for `category`
|
|
6
|
+
# One table of what each category needs beyond what the language states:
|
|
7
|
+
# holder, make (:declare vs :new), and fields. spec/assembly_spec checks
|
|
8
|
+
# it against the language, so an unconsumed declared field fails loudly.
|
|
44
9
|
def self.contract(category) = CONTRACTS.fetch(category.to_s)
|
|
45
10
|
|
|
46
11
|
CONTRACTS = {
|
|
@@ -52,6 +17,7 @@ module Hecks
|
|
|
52
17
|
vision: [:vision, :plain],
|
|
53
18
|
classification: [:classification, :plain],
|
|
54
19
|
formerly_known_as: [:formerly_known_as, :plain],
|
|
20
|
+
namespace: [:namespace, :plain],
|
|
55
21
|
attaches_to: [:attaches_to, :plain],
|
|
56
22
|
provides: [:provides, :plain]
|
|
57
23
|
},
|
|
@@ -66,19 +32,10 @@ module Hecks
|
|
|
66
32
|
description: [:description, :plain],
|
|
67
33
|
identified_by: [:identified_by, :plain],
|
|
68
34
|
attributes: [:attributes, [:each, :attribute]],
|
|
69
|
-
#
|
|
70
|
-
# reference by name (S10, ADR 0025 — "Rules"). Same reader
|
|
71
|
-
# shapes ValueObject's own `invariants`/Command's own
|
|
72
|
-
# `givens` already use — `invariant` builds an Invariant,
|
|
73
|
-
# `given` a Given, the same struct AggregateBuilder#given
|
|
74
|
-
# hands a referencing command's own resolved list.
|
|
35
|
+
# Aggregate's own precondition, referenced by name from a command (ADR 0025).
|
|
75
36
|
invariants: [:invariants, [:each, :invariant]],
|
|
76
37
|
preconditions: [:preconditions, [:each, :given]],
|
|
77
|
-
#
|
|
78
|
-
# :\"reference.remote_field\"", read the same way
|
|
79
|
-
# invariants/preconditions above are: a synthetic command
|
|
80
|
-
# (Aggregate.Projects) the judge dispatches once per
|
|
81
|
-
# declaration, folded into a list on the owning aggregate.
|
|
38
|
+
# The local half of `projects :name, from: "reference.remote_field"` (ADR 0025).
|
|
82
39
|
projected_fields: [:projected_fields, [:each, :projected_field]],
|
|
83
40
|
provenance: [:provenance, :plain]
|
|
84
41
|
},
|
|
@@ -107,10 +64,7 @@ module Hecks
|
|
|
107
64
|
ensures: [:ensures, [:each, :given]],
|
|
108
65
|
mutations: [:mutations, [:each, :mutation]],
|
|
109
66
|
emits: [:emits, :plain],
|
|
110
|
-
# Lifecycle state as a command guard
|
|
111
|
-
# literal the same way `provenance`/`default:` already are;
|
|
112
|
-
# one state or an array of them, or nil for a command with
|
|
113
|
-
# no such guard.
|
|
67
|
+
# Lifecycle state as a command guard: one state, an array, or nil (ADR 0025).
|
|
114
68
|
from: [:from, :plain],
|
|
115
69
|
provenance: [:provenance, :plain]
|
|
116
70
|
},
|
|
@@ -144,6 +98,7 @@ module Hecks
|
|
|
144
98
|
wheres: [:wheres, [:each, :where_clause]],
|
|
145
99
|
order_by: [:order_by, :order_by],
|
|
146
100
|
limit: [:limit, :limit],
|
|
101
|
+
returns: [:returns, :plain],
|
|
147
102
|
# Held by the language as an open map, so every one of these reads the
|
|
148
103
|
# same way and a ninth option needs no new field on either side.
|
|
149
104
|
offset: [:offset, [:option, :offset]],
|
|
@@ -168,22 +123,15 @@ module Hecks
|
|
|
168
123
|
fields: {
|
|
169
124
|
name: [:name, :plain],
|
|
170
125
|
description: [:description, :plain],
|
|
171
|
-
# A list of paths,
|
|
172
|
-
#
|
|
173
|
-
#
|
|
174
|
-
# string, while diverging at runtime: the assembled graph would carry a
|
|
175
|
-
# String, and `element_of`'s lookup of `args["sequence"]` in a
|
|
176
|
-
# symbol-keyed payload would find nothing — refusing "Reverse acts on
|
|
177
|
-
# one LedgerEntry — pass sequence:" while sequence was in fact passed.
|
|
126
|
+
# A list of paths, like Aggregate's. Must be Symbols: a String looks
|
|
127
|
+
# identical here but a symbol-keyed args lookup downstream would find
|
|
128
|
+
# nothing, silently rejecting a value that was in fact passed.
|
|
178
129
|
identified_by: [:identified_by, :plain],
|
|
179
130
|
attributes: [:attributes, [:each, :shape_field]],
|
|
180
|
-
#
|
|
181
|
-
# already carries, one level down: a piece's own named
|
|
182
|
-
# `given`, referenced back by one of its own commands.
|
|
131
|
+
# Same shape as Aggregate's own `preconditions`, one level down (ADR 0028).
|
|
183
132
|
preconditions: [:preconditions, [:each, :given]],
|
|
184
|
-
#
|
|
185
|
-
#
|
|
186
|
-
# instance of this piece, not the aggregate's own flat state.
|
|
133
|
+
# Same shape as Aggregate's own `invariants`, checked per instance of
|
|
134
|
+
# this entity rather than the aggregate's flat state.
|
|
187
135
|
invariants: [:invariants, [:each, :invariant]]
|
|
188
136
|
},
|
|
189
137
|
rows: { transitions: :transition_rows, identified_by: :identity_rows },
|
|
@@ -220,35 +168,23 @@ module Hecks
|
|
|
220
168
|
holder: ProcessManager, make: :new,
|
|
221
169
|
fields: {
|
|
222
170
|
name: [:name, :plain],
|
|
223
|
-
#
|
|
224
|
-
#
|
|
225
|
-
# when resolving a leg s bindings. A String there finds nothing and
|
|
226
|
-
# resolves to nothing, so the wire never advanced and a drawer that
|
|
227
|
-
# should have held 2500 held 0. to_h could not show it: it stringifies.
|
|
171
|
+
# Must be a Symbol: SagaInterpreter looks it up as a symbol-keyed hash
|
|
172
|
+
# key. A String silently matches nothing, and the saga never advances.
|
|
228
173
|
correlates_by: [:correlates_by, :identity],
|
|
229
174
|
starts_on: [:starts_on, :plain],
|
|
230
175
|
ends_on: [:ends_on, :plain],
|
|
231
176
|
states: [:states, :plain]
|
|
232
177
|
},
|
|
233
178
|
reads: { states: :names },
|
|
234
|
-
#
|
|
235
|
-
#
|
|
236
|
-
#
|
|
237
|
-
# walking `Plan`'s own containment tree (`Handler`'s own
|
|
238
|
-
# `.parent == "ProcessManager"`) rather than by any field this
|
|
239
|
-
# contract itself reads — the same `:children` shape Aggregate's
|
|
240
|
-
# own `value_objects` claim already uses, one level in.
|
|
179
|
+
# `handlers` comes from the judge walking the containment tree
|
|
180
|
+
# (`Handler.parent == "ProcessManager"`), the same as Aggregate's
|
|
181
|
+
# own `value_objects` — not from any field this contract reads.
|
|
241
182
|
derived: { position: :walk, handlers: :children }
|
|
242
183
|
),
|
|
243
184
|
|
|
244
|
-
#
|
|
245
|
-
#
|
|
246
|
-
#
|
|
247
|
-
# answers each event once, so `event_type` is Handler's own real,
|
|
248
|
-
# non-positional identity (no walk-minted `position` to derive),
|
|
249
|
-
# and the process manager it belongs to is structural now — which
|
|
250
|
-
# list this element sits in, not a stored field to fold a parent
|
|
251
|
-
# pointer out of.
|
|
185
|
+
# Handler is nested under ProcessManager. `event_type` is its real
|
|
186
|
+
# identity (a saga answers each event once), so unlike other entities
|
|
187
|
+
# it has no walk-minted `position` to derive.
|
|
252
188
|
"Handler" => Contract.new(
|
|
253
189
|
holder: ProcessManagerHandler, make: :new,
|
|
254
190
|
fields: {
|
|
@@ -256,46 +192,14 @@ module Hecks
|
|
|
256
192
|
from_state: [:from_state, :plain],
|
|
257
193
|
to_state: [:to_state, :plain]
|
|
258
194
|
},
|
|
259
|
-
# `dispatches`
|
|
260
|
-
#
|
|
261
|
-
# language's own "Handler" declaration (`attribute :dispatches,
|
|
262
|
-
# list_of(Dispatch)`), consumed by the judge walking `Plan`'s
|
|
263
|
-
# own containment tree rather than by any field this contract
|
|
264
|
-
# reads.
|
|
195
|
+
# `dispatches` comes from the containment walk, like ProcessManager's
|
|
196
|
+
# own `handlers` above — not from a field this contract reads.
|
|
265
197
|
derived: { dispatches: :children }
|
|
266
198
|
),
|
|
267
199
|
|
|
268
|
-
#
|
|
269
|
-
#
|
|
270
|
-
#
|
|
271
|
-
# words). `command_name` alone is not Dispatch's own identity —
|
|
272
|
-
# items #151/#152 (`process_manager.bluebook`'s own
|
|
273
|
-
# `DispatchPosition` comment) found it collides the instant a
|
|
274
|
-
# real handler fans the same command out more than once, so
|
|
275
|
-
# `position` joins it, walk-minted the same way every other
|
|
276
|
-
# category's own `position` is (`derived: { position: :walk }`,
|
|
277
|
-
# the same entry ProcessManager's own contract carries above) —
|
|
278
|
-
# never a stored field on `DispatchSpec` itself, exactly like
|
|
279
|
-
# `handler` before it.
|
|
280
|
-
# `compensates_command_name`/`compensates_with_spec` — folded,
|
|
281
|
-
# the same kind `Lifecycle`'s own `state_field`/`default` claim
|
|
282
|
-
# (one IR object, `DispatchSpec#compensates`, feeding two
|
|
283
|
-
# separate language fields): `Readings#field_value`'s own
|
|
284
|
-
# `contract.folded` branch reads
|
|
285
|
-
# `node.compensates.to_h[:command_name]` / `[:with_spec]` for
|
|
286
|
-
# the judge's offering side, nil-safe when there is no
|
|
287
|
-
# compensation at all (`through`'s own `return nil unless
|
|
288
|
-
# held`). `compensates_with_spec` also needs its own row shaper
|
|
289
|
-
# (`compensates_with_spec_rows`, readings.rb) for the judge's
|
|
290
|
-
# list-offering side — the with_spec pairs still need one
|
|
291
|
-
# "BindCompensation" append per pair, the same reason
|
|
292
|
-
# `with_spec` itself needs `with_spec_rows`, one level deeper.
|
|
293
|
-
# `Reconstruction#dispatch` reads the two flat fields back off
|
|
294
|
-
# the row and assembles the nested `DispatchSpec` by hand — a
|
|
295
|
-
# nested object is not one of the shapes `declaration()`'s own
|
|
296
|
-
# generic per-field hash-build can produce, the identical reason
|
|
297
|
-
# `handler`/`process_manager` pass a `:children` list through
|
|
298
|
-
# `extra:` instead.
|
|
200
|
+
# Dispatch is nested under Handler, two levels deep. `command_name` alone
|
|
201
|
+
# is not identity — a handler can fan the same command out more than
|
|
202
|
+
# once, so `position` (walk-minted) disambiguates.
|
|
299
203
|
"Dispatch" => Contract.new(
|
|
300
204
|
holder: DispatchSpec, make: :new,
|
|
301
205
|
fields: {
|
|
@@ -304,6 +208,7 @@ module Hecks
|
|
|
304
208
|
},
|
|
305
209
|
rows: { with_spec: :with_spec_rows, compensates_with_spec: :compensates_with_spec_rows },
|
|
306
210
|
reads: { with_spec: [:from, :with_spec] },
|
|
211
|
+
# compensates_* fold one IR object (`DispatchSpec#compensates`) into two fields.
|
|
307
212
|
derived: {
|
|
308
213
|
position: :walk,
|
|
309
214
|
compensates_command_name: [:folded, :compensates, :command_name],
|
|
@@ -311,15 +216,9 @@ module Hecks
|
|
|
311
216
|
}
|
|
312
217
|
),
|
|
313
218
|
|
|
314
|
-
#
|
|
315
|
-
#
|
|
316
|
-
#
|
|
317
|
-
# syntax_boot.rb) reads directly, never through the meta-
|
|
318
|
-
# domain's own reconstruction, the same reason `Member`'s own
|
|
319
|
-
# entry (above) carries `holder: nil, make: nil` too. These
|
|
320
|
-
# entries exist purely so the introspection specs
|
|
321
|
-
# (assembly_spec.rb) can hold them to the same "every field
|
|
322
|
-
# claimed" discipline every other category answers to.
|
|
219
|
+
# Syntax/Keyword/Argument bypass Build/Reconstruction entirely (ADR 0026) —
|
|
220
|
+
# SyntaxBoot reads them directly. These entries exist only so assembly_spec
|
|
221
|
+
# can hold them to the same "every field claimed" discipline as the rest.
|
|
323
222
|
"Syntax" => Contract.new(
|
|
324
223
|
holder: nil, make: nil,
|
|
325
224
|
fields: { name: [:name, :plain] },
|
|
@@ -374,14 +273,18 @@ module Hecks
|
|
|
374
273
|
reference_target: [:reference_target, :plain],
|
|
375
274
|
aggregate_heads: [:aggregate_heads, [:each, :head]],
|
|
376
275
|
group_by: [:group_by, [:each, :group_by_field]],
|
|
377
|
-
#
|
|
378
|
-
#
|
|
379
|
-
# is what `Assembly::Build` needs (fed the native `to_h`
|
|
380
|
-
# value directly, already `true`/`nil`/a String), and the
|
|
381
|
-
# `reads:` entry below is what `Reconstruction` needs
|
|
382
|
-
# instead (fed the stringified meta-domain row).
|
|
276
|
+
# Scalars, not lists: `:plain` is for Build (native to_h value);
|
|
277
|
+
# the `reads:` entry below is for Reconstruction (stringified row).
|
|
383
278
|
count: [:count, :plain],
|
|
384
279
|
median_field: [:median_field, :plain],
|
|
280
|
+
sum_field: [:sum_field, :plain],
|
|
281
|
+
avg_field: [:avg_field, :plain],
|
|
282
|
+
min_field: [:min_field, :plain],
|
|
283
|
+
max_field: [:max_field, :plain],
|
|
284
|
+
percentile_field: [:percentile_field, :plain],
|
|
285
|
+
percentile_at: [:percentile_at, :plain],
|
|
286
|
+
any_field: [:any_field, :plain],
|
|
287
|
+
all_field: [:all_field, :plain],
|
|
385
288
|
# A read model inherits every option an ask has, so it reads them the
|
|
386
289
|
# same way — see Query.
|
|
387
290
|
wheres: [:wheres, [:each, :where_clause]],
|
|
@@ -394,31 +297,18 @@ module Hecks
|
|
|
394
297
|
inspection: [:inspection, [:option, :inspection]]
|
|
395
298
|
},
|
|
396
299
|
rows: { options: :read_model_option_rows },
|
|
397
|
-
# `wheres` needs its own reader
|
|
398
|
-
#
|
|
399
|
-
# `
|
|
400
|
-
# native field the way Query's does (`[:each, :where_clause]` over an
|
|
401
|
-
# absent `row[:wheres]` is `Array(nil).map { ... }`, i.e. `[]`, always).
|
|
402
|
-
# The real values, when a read model declares any, arrive through
|
|
403
|
-
# `options_of(row)`'s merge in `read_model` below (dispatched as
|
|
404
|
-
# generic Option rows, `read_model_option_rows`/`filter_options` — not
|
|
405
|
-
# as dedicated where-clause rows), which overrides this default. Until
|
|
406
|
-
# `ReadModel#to_h` spelled `wheres`/`order_by`/`limit`
|
|
407
|
-
# unconditionally, `round_trip_spec`'s own "source keys only" +compare
|
|
408
|
-
# never asked about this key at all, so the `nil`-vs-`[]` gap between
|
|
409
|
-
# this contract's default and `to_h`'s own `[]` default went unnoticed.
|
|
410
|
-
# `order_by`/`limit` need no matching entry — the generic reader's
|
|
411
|
-
# `nil` already agrees with `to_h`'s own nil-when-undeclared default
|
|
412
|
-
# for those two. `group_by` needs its own reader the same way — a
|
|
413
|
-
# rootless read model's grouping keys, added independently on main.
|
|
300
|
+
# `wheres` needs its own reader so an undeclared list defaults to `[]`,
|
|
301
|
+
# not the generic reader's `nil`; real values arrive via the options
|
|
302
|
+
# merge in `read_model` below, which overrides this default.
|
|
414
303
|
reads: { reference_name: :symbol, aggregate_heads: [:each, :head],
|
|
415
304
|
group_by: [:each, :group_by_field], wheres: [:each, :where_clause],
|
|
416
|
-
# `count` needs
|
|
417
|
-
#
|
|
418
|
-
#
|
|
419
|
-
|
|
420
|
-
#
|
|
421
|
-
|
|
305
|
+
# `count` needs boolean coercion (stringified on the wire);
|
|
306
|
+
# `median_field` needs none — the default reader already
|
|
307
|
+
# matches `to_h`'s String-or-nil.
|
|
308
|
+
count: :read_model_count,
|
|
309
|
+
# `percentile_at` needs Float coercion; every other reduction field
|
|
310
|
+
# is a Symbol-like name the default text reader already matches.
|
|
311
|
+
percentile_at: :read_model_percentile_at },
|
|
422
312
|
derived: {
|
|
423
313
|
position: :walk,
|
|
424
314
|
query_name: [:computed, :query_name],
|
|
@@ -426,17 +316,9 @@ module Hecks
|
|
|
426
316
|
}
|
|
427
317
|
),
|
|
428
318
|
|
|
429
|
-
#
|
|
430
|
-
#
|
|
431
|
-
#
|
|
432
|
-
# S17, ADR 0026 — Member is a genuine entity, nested under
|
|
433
|
-
# ValueObject (`entity "Member"`, shape.bluebook). It holds no
|
|
434
|
-
# `shape` field at all (a free-text, un-parsed spelling would suit
|
|
435
|
-
# only a standalone root ; an entity's element is
|
|
436
|
-
# never serialized as text) — only `position` (walk-minted, see
|
|
437
|
-
# `entity_own_identity`, judge.rb) and `pairs` (still an open map,
|
|
438
|
-
# still one row per entry, still why a value object cannot hold it
|
|
439
|
-
# directly).
|
|
319
|
+
# Member is nested under ValueObject. Its pairs are an open map, so it
|
|
320
|
+
# holds no `shape` field — only walk-minted `position` and `pairs`
|
|
321
|
+
# (still one row per entry, still an open map).
|
|
440
322
|
"Member" => Contract.new(
|
|
441
323
|
holder: nil, make: nil,
|
|
442
324
|
fields: {},
|