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
|
@@ -7,17 +7,8 @@ Hecks.bluebook "Hecksagon" do
|
|
|
7
7
|
attribute :attributes, list_of(PortOperationField)
|
|
8
8
|
attribute :emits, list_of(EmittedEvent)
|
|
9
9
|
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
# `emits` above is what an inbound `tells` says once the fact is in.
|
|
13
|
-
# These two are the outbound half: what the adapter came back with, and
|
|
14
|
-
# what it said instead. Singular where `emits` is a list, because an ask
|
|
15
|
-
# has exactly one of each — a call that could answer two different ways
|
|
16
|
-
# is two calls.
|
|
17
|
-
#
|
|
18
|
-
# Empty on every `tells`, which is why neither carries an invariant
|
|
19
|
-
# demanding a value; `PortOperationBuilder` refuses the wrong word for
|
|
20
|
-
# the direction long before a record gets here.
|
|
10
|
+
# The two endings of an `asks`: what the adapter answered, or what it refused with.
|
|
11
|
+
# Singular because an ask has exactly one of each; empty on every `tells`, so no invariant.
|
|
21
12
|
attribute :answers, AnsweringEvent
|
|
22
13
|
attribute :refuses, RefusingEvent
|
|
23
14
|
|
|
@@ -44,9 +35,7 @@ Hecks.bluebook "Hecksagon" do
|
|
|
44
35
|
attribute :value, String
|
|
45
36
|
end
|
|
46
37
|
|
|
47
|
-
#
|
|
48
|
-
# they describe; SyntaxBoot discovers every aggregate-local seed table.
|
|
49
|
-
# Contexts represented here: PortOperation.
|
|
38
|
+
# Keyword rows for PortOperation; SyntaxBoot discovers every aggregate-local seed table.
|
|
50
39
|
value_object "KeywordSeed" do
|
|
51
40
|
attribute :word, String
|
|
52
41
|
attribute :context, String, admits: "Syntax::Context"
|
|
@@ -236,6 +236,21 @@
|
|
|
236
236
|
"verb": "Bluebook::Query.Option",
|
|
237
237
|
"role": "Language"
|
|
238
238
|
},
|
|
239
|
+
{
|
|
240
|
+
"scope": "bluebook:read_model.all",
|
|
241
|
+
"verb": "Bluebook::ReadModel.All",
|
|
242
|
+
"role": "Language"
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"scope": "bluebook:read_model.any",
|
|
246
|
+
"verb": "Bluebook::ReadModel.Any",
|
|
247
|
+
"role": "Language"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"scope": "bluebook:read_model.avg",
|
|
251
|
+
"verb": "Bluebook::ReadModel.Avg",
|
|
252
|
+
"role": "Language"
|
|
253
|
+
},
|
|
239
254
|
{
|
|
240
255
|
"scope": "bluebook:read_model.count",
|
|
241
256
|
"verb": "Bluebook::ReadModel.Count",
|
|
@@ -256,16 +271,36 @@
|
|
|
256
271
|
"verb": "Bluebook::ReadModel.GroupBy",
|
|
257
272
|
"role": "Language"
|
|
258
273
|
},
|
|
274
|
+
{
|
|
275
|
+
"scope": "bluebook:read_model.max",
|
|
276
|
+
"verb": "Bluebook::ReadModel.Max",
|
|
277
|
+
"role": "Language"
|
|
278
|
+
},
|
|
259
279
|
{
|
|
260
280
|
"scope": "bluebook:read_model.median",
|
|
261
281
|
"verb": "Bluebook::ReadModel.Median",
|
|
262
282
|
"role": "Language"
|
|
263
283
|
},
|
|
284
|
+
{
|
|
285
|
+
"scope": "bluebook:read_model.min",
|
|
286
|
+
"verb": "Bluebook::ReadModel.Min",
|
|
287
|
+
"role": "Language"
|
|
288
|
+
},
|
|
264
289
|
{
|
|
265
290
|
"scope": "bluebook:read_model.option",
|
|
266
291
|
"verb": "Bluebook::ReadModel.Option",
|
|
267
292
|
"role": "Language"
|
|
268
293
|
},
|
|
294
|
+
{
|
|
295
|
+
"scope": "bluebook:read_model.percentile",
|
|
296
|
+
"verb": "Bluebook::ReadModel.Percentile",
|
|
297
|
+
"role": "Language"
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
"scope": "bluebook:read_model.sum",
|
|
301
|
+
"verb": "Bluebook::ReadModel.Sum",
|
|
302
|
+
"role": "Language"
|
|
303
|
+
},
|
|
269
304
|
{
|
|
270
305
|
"scope": "bluebook:syntax.argument",
|
|
271
306
|
"verb": "Bluebook::Syntax.Argument",
|
|
@@ -25,14 +25,8 @@ Hecks.bluebook "Port" do
|
|
|
25
25
|
attribute :value, String, one_of: ["reply", "effect"]
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
#
|
|
29
|
-
#
|
|
30
|
-
# and `signal`, which only ever describe the door itself. Optional
|
|
31
|
-
# the same way `verb` is (a port declared with none is exactly
|
|
32
|
-
# today's pre-existing behavior, unchecked past `verify!`'s existing
|
|
33
|
-
# gates), and a plain list of method names rather than a richer
|
|
34
|
-
# shape — the same restraint `AdapterField` already takes for
|
|
35
|
-
# `field`/`secret`.
|
|
28
|
+
# The method contract: what an adapter must `respond_to?` for a dispatch through this door.
|
|
29
|
+
# A port that declares none is unchecked beyond `verify!`.
|
|
36
30
|
value_object "PortAnswer" do
|
|
37
31
|
attribute :value, String
|
|
38
32
|
invariant("an answer names a real method") { !value.to_s.empty? }
|
|
@@ -43,12 +37,7 @@ Hecks.bluebook "Port" do
|
|
|
43
37
|
goal "Open a resource door a domain's own aggregates may call by verb"
|
|
44
38
|
|
|
45
39
|
attribute :name, PortName
|
|
46
|
-
#
|
|
47
|
-
# .rb's own "signal says whether the domain gets a value back..."
|
|
48
|
-
# builds a port with only `signal`, never calling `verb` at all;
|
|
49
|
-
# `def verb(value)` has no default, unlike `signal`'s `:reply`).
|
|
50
|
-
# Same asymmetry world.bluebook's own Declare command already has
|
|
51
|
-
# for `realm`/`latest`.
|
|
40
|
+
# Optional: a port may declare only `signal`; `verb` has no default, unlike `signal`.
|
|
52
41
|
attribute :verb, PortVerb, optional: true
|
|
53
42
|
attribute :signal, PortSignal
|
|
54
43
|
|
|
@@ -71,9 +60,7 @@ Hecks.bluebook "Port" do
|
|
|
71
60
|
emits "PortAnswerAdded"
|
|
72
61
|
end
|
|
73
62
|
|
|
74
|
-
#
|
|
75
|
-
# they describe; SyntaxBoot discovers every aggregate-local seed table.
|
|
76
|
-
# Contexts represented here: File, Port.
|
|
63
|
+
# Keyword rows for File and Port; SyntaxBoot discovers every aggregate-local seed table.
|
|
77
64
|
value_object "KeywordSeed" do
|
|
78
65
|
attribute :word, String
|
|
79
66
|
attribute :context, String, admits: "Syntax::Context"
|
|
@@ -24,12 +24,8 @@ Hecks.bluebook "Translation" do
|
|
|
24
24
|
invariant("a name says something") { !value.to_s.empty? }
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
# migration needs), the same shape `AggregateBuilder#provenance`/
|
|
30
|
-
# `CommandBuilder#provenance` already capture as plain, unvalidated
|
|
31
|
-
# text (`LiteralText`, aggregate.bluebook) rather than a fixed
|
|
32
|
-
# attribute shape a closed self-hosted record could enumerate.
|
|
27
|
+
# `convert` values and `backfill` defaults are open-ended literals, so they are held as
|
|
28
|
+
# unvalidated text, like `provenance` (`LiteralText`, aggregate.bluebook).
|
|
33
29
|
value_object "TranslationLiteralText" do
|
|
34
30
|
attribute :value, String
|
|
35
31
|
end
|
|
@@ -60,9 +56,7 @@ Hecks.bluebook "Translation" do
|
|
|
60
56
|
emits "TranslationAggregateRetired"
|
|
61
57
|
end
|
|
62
58
|
|
|
63
|
-
#
|
|
64
|
-
# they describe; SyntaxBoot discovers every aggregate-local seed table.
|
|
65
|
-
# Contexts represented here: File, Translation.
|
|
59
|
+
# Syntax seed rows for the words this aggregate spells; SyntaxBoot discovers them.
|
|
66
60
|
value_object "KeywordSeed" do
|
|
67
61
|
attribute :word, String
|
|
68
62
|
attribute :context, String, admits: "Syntax::Context"
|
|
@@ -6,22 +6,8 @@ Hecks.bluebook "Translation" do
|
|
|
6
6
|
|
|
7
7
|
identified_by TranslationAggregateName, as: :name
|
|
8
8
|
|
|
9
|
-
# `
|
|
10
|
-
# field,
|
|
11
|
-
# below uses. Found live, not by inspection: reusing one value-
|
|
12
|
-
# object type for BOTH an aggregate's own identity field and a
|
|
13
|
-
# sibling non-identity field on the same aggregate broke the
|
|
14
|
-
# single-field-VO identity-unwrap path — the stored `id` came back
|
|
15
|
-
# as a stringified Hash (`"{:value=>\"Account\"}"`) instead of the
|
|
16
|
-
# bare scalar (`"Account"`), so a self-reference to this aggregate
|
|
17
|
-
# could never find the record `Declare` had just created. Reusing
|
|
18
|
-
# the SAME type across MULTIPLE identity fields (Translation's own
|
|
19
|
-
# `TranslationEraName`, for both `from` and `to`) is unaffected —
|
|
20
|
-
# confirmed directly, not assumed — so the real trigger is identity
|
|
21
|
-
# + non-identity sharing, not reuse itself. A genuine framework bug,
|
|
22
|
-
# out of scope to fix here; every other self-hosted construct in
|
|
23
|
-
# this language already avoids it by convention (a dedicated type
|
|
24
|
-
# per identity field), which this now matches too.
|
|
9
|
+
# A dedicated identity type: sharing `TranslationName` with a non-identity field breaks the
|
|
10
|
+
# single-field identity unwrap, storing the id as a stringified Hash instead of a scalar.
|
|
25
11
|
attribute :was, TranslationName, optional: true
|
|
26
12
|
|
|
27
13
|
value_object "TranslationAggregateName" do
|
|
@@ -47,11 +33,8 @@ Hecks.bluebook "Translation" do
|
|
|
47
33
|
attribute :rekeys, list_of(TranslationRekey)
|
|
48
34
|
attribute :backfills, list_of(TranslationBackfill)
|
|
49
35
|
|
|
50
|
-
# Field names
|
|
51
|
-
#
|
|
52
|
-
# TranslationJudge dispatches from, not the builder's own local
|
|
53
|
-
# parameter names (`move(old_path, to:)`'s `old_path` becomes the
|
|
54
|
-
# struct's own `from`).
|
|
36
|
+
# Field names mirror the Struct records in lib/hecks/bluebook/translation.rb, not the
|
|
37
|
+
# builder's parameter names (`move(old_path, to:)` stores `old_path` as `from`).
|
|
55
38
|
value_object "TranslationRename" do
|
|
56
39
|
attribute :from, TranslationName
|
|
57
40
|
attribute :to, TranslationName
|
|
@@ -199,9 +182,7 @@ Hecks.bluebook "Translation" do
|
|
|
199
182
|
emits "TranslationBackfillAdded"
|
|
200
183
|
end
|
|
201
184
|
|
|
202
|
-
#
|
|
203
|
-
# they describe; SyntaxBoot discovers every aggregate-local seed table.
|
|
204
|
-
# Contexts represented here: TranslationAggregate.
|
|
185
|
+
# Syntax seed rows for the words this aggregate spells; SyntaxBoot discovers them.
|
|
205
186
|
value_object "KeywordSeed" do
|
|
206
187
|
attribute :word, String
|
|
207
188
|
attribute :context, String, admits: "Syntax::Context"
|
|
@@ -7,9 +7,7 @@ Hecks.bluebook "World" do
|
|
|
7
7
|
# so the bare reference name would collide with it.
|
|
8
8
|
belongs_to World, as: :world_ref
|
|
9
9
|
|
|
10
|
-
#
|
|
11
|
-
# verb — that is what a binding IS — so the verb names the wiring, and the
|
|
12
|
-
# world says whose.
|
|
10
|
+
# One world binds one adapter per verb, so the verb names the wiring and the world says whose.
|
|
13
11
|
identified_by :world, :verb
|
|
14
12
|
|
|
15
13
|
attribute :world, WiringText
|
|
@@ -59,9 +59,8 @@ Hecks.bluebook "World" do
|
|
|
59
59
|
emits "WorldDeclared"
|
|
60
60
|
end
|
|
61
61
|
|
|
62
|
-
#
|
|
63
|
-
#
|
|
64
|
-
# Contexts represented here: File, World.
|
|
62
|
+
# Spelling rows for World keywords; SyntaxBoot discovers every
|
|
63
|
+
# aggregate-local seed table like this one.
|
|
65
64
|
value_object "KeywordSeed" do
|
|
66
65
|
attribute :word, String
|
|
67
66
|
attribute :context, String, admits: "Syntax::Context"
|
|
@@ -77,10 +76,9 @@ Hecks.bluebook "World" do
|
|
|
77
76
|
member word: "world", context: "File", body: "keywords", inner: "World", opens: "World", fills: ""
|
|
78
77
|
member word: "realm", context: "World", body: "none", inner: "", opens: "", fills: "realm", calls: "realm_impl"
|
|
79
78
|
member word: "latest", context: "World", body: "none", inner: "", opens: "", fills: "latest", calls: "latest_impl"
|
|
80
|
-
#
|
|
81
|
-
#
|
|
82
|
-
#
|
|
83
|
-
# hecksagon bind still win; see docs/implemented/reference/world.md.
|
|
79
|
+
# The connection string and persistence adapter every chapter of a
|
|
80
|
+
# project would otherwise repeat, written once here; a chapter's own
|
|
81
|
+
# world or hecksagon bind still wins.
|
|
84
82
|
member word: "default_database", context: "World", body: "none", inner: "", opens: "", fills: "default_database", calls: "default_database_impl"
|
|
85
83
|
member word: "default_adapter", context: "World", body: "none", inner: "", opens: "", fills: "default_adapter", calls: "default_adapter_impl"
|
|
86
84
|
|
data/lib/hecks/literal.rb
CHANGED
|
@@ -1,45 +1,13 @@
|
|
|
1
1
|
module Hecks
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
# Several `to_h` fields hold a value the author wrote in a bluebook —
|
|
5
|
-
# `where(status: { eq: "open" })`, `then_set append: { direction: { value:
|
|
6
|
-
# "credit" } }`, `dispatch ... with: { number: :source }`, an attribute's
|
|
7
|
-
# `default:` — as text, because the export has to stand on its own and a
|
|
8
|
-
# String field cannot say "this one was a Symbol". Every such field is the
|
|
9
|
-
# same question and now gets the same answer.
|
|
10
|
-
#
|
|
11
|
-
# It was three answers before, and they disagreed on both axes that matter.
|
|
12
|
-
# `Mutation#appended_fields` spelled a Symbol bare and everything else
|
|
13
|
-
# `inspect`; `QuerySpecification.render_value` spelled a Symbol with a colon
|
|
14
|
-
# and everything else `to_s`. So `:amount` crossed as "amount" in a mutation
|
|
15
|
-
# and ":amount" in a saga binding — the same value, two spellings, and each
|
|
16
|
-
# reader had to know which field it was looking at. Worse, `to_s`/`inspect`
|
|
17
|
-
# on a Hash is Ruby's own rendering, which moved under us: 3.3 writes
|
|
18
|
-
# `{:value=>"credit"}` and 3.4 writes `{value: "credit"}` for the identical
|
|
19
|
-
# Hash, so the wire format was silently pinned to an interpreter version.
|
|
20
|
-
#
|
|
21
|
-
# Self-describing is the rule, stated once here rather than inherited from
|
|
22
|
-
# whatever `inspect` happens to do: a symbol wears its colon, a string wears
|
|
23
|
-
# its quotes, a hash wears `{key: value}` braces, a list wears its brackets,
|
|
24
|
-
# and a number, a boolean and nil are bare. `read` is the exact inverse, and
|
|
25
|
-
# is the only thing that should ever take one of these strings apart.
|
|
26
|
-
# A mutation source that reads the record's own state — `sets :positions,
|
|
27
|
-
# append: { knights: state(:knights) }`. A bare Symbol in a mutation
|
|
28
|
-
# source always names a command argument (and imports it as one when
|
|
29
|
-
# the target's own field carries the same name — `CommandBuilder
|
|
30
|
-
# #resolve_append_fields!`); before this there was no way to say "the
|
|
31
|
-
# value this field already holds", so a command could not snapshot its
|
|
32
|
-
# own record — chess's threefold repetition needs exactly that, a
|
|
33
|
-
# position copied off the board every ply. Spelled `state(:name)` on
|
|
34
|
-
# the wire, read back by `Literal.read`; classified `kind: "state"` in
|
|
35
|
-
# a set's own source (`Behaviour::Mutation#classified_source`).
|
|
2
|
+
# A mutation source that reads the record's own state: `append: { knights: state(:knights) }`.
|
|
3
|
+
# A bare Symbol in a mutation source names a command argument, so this is the only way to say it.
|
|
36
4
|
StateRef = Struct.new(:name) do
|
|
37
5
|
def to_s = "state(:#{name})"
|
|
38
6
|
end
|
|
39
7
|
|
|
40
|
-
# The
|
|
41
|
-
#
|
|
42
|
-
#
|
|
8
|
+
# The one wire spelling for a Ruby literal captured from a bluebook: a symbol wears its
|
|
9
|
+
# colon, a string its quotes, a hash `{key: value}`, a list brackets; the rest are bare.
|
|
10
|
+
# Stated here, not left to `inspect`, whose Hash rendering differs between Ruby 3.3 and 3.4.
|
|
43
11
|
module Literal
|
|
44
12
|
module_function
|
|
45
13
|
|
|
@@ -63,16 +31,9 @@ module Hecks
|
|
|
63
31
|
end
|
|
64
32
|
end
|
|
65
33
|
|
|
66
|
-
#
|
|
67
|
-
#
|
|
68
|
-
# never rendered, and those must stay the strings they are.
|
|
34
|
+
# Parses a wire spelling back into a Ruby value; the exact inverse of `render`.
|
|
35
|
+
# A bare word stays a String, since some fields are stored as plain text, never rendered.
|
|
69
36
|
#
|
|
70
|
-
# The exact inverse of `render`'s `case`, above — one ordered guard per
|
|
71
|
-
# spelling `render` can produce (plus the bare-word tolerance this
|
|
72
|
-
# comment already explains). Each guard is a single self-contained
|
|
73
|
-
# `return`; splitting them into named predicates would just rename
|
|
74
|
-
# each line without changing what it does, and would separate this
|
|
75
|
-
# method from the `render` it is the deliberate mirror of.
|
|
76
37
|
# @param text [String, #to_s] wire spelling produced by `render`, or a bare word
|
|
77
38
|
# @return [Object] nil, true, false, Integer, Float, Symbol, StateRef, String,
|
|
78
39
|
# Hash, or Array — or `text` itself, stripped, when it matches no known spelling
|
|
@@ -131,10 +92,7 @@ module Hecks
|
|
|
131
92
|
# @return [Array<Object>] the parsed values, each read recursively via `read`
|
|
132
93
|
def read_array(raw) = split_items(raw[1..-2]).map { |item| read(item) }
|
|
133
94
|
|
|
134
|
-
#
|
|
135
|
-
# quoted string or a nested brace/bracket. Scanned rather than
|
|
136
|
-
# `String#split(", ")`, which tore `"a, b"` in half and lost the second
|
|
137
|
-
# field of anything nested.
|
|
95
|
+
# Splits on separator commas only, never one inside a quoted string or nested brace/bracket.
|
|
138
96
|
#
|
|
139
97
|
# @param body [String] the text between a literal's outer braces or brackets
|
|
140
98
|
# @return [Array<String>] each item's raw text, stripped, with empty items dropped
|
|
@@ -1,41 +1,8 @@
|
|
|
1
1
|
require "socket"
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
# speak to anything but a local parent, and it says on stderr what the
|
|
7
|
-
# process does and does not protect.
|
|
8
|
-
#
|
|
9
|
-
# ## Why a gate and not a comment
|
|
10
|
-
#
|
|
11
|
-
# Both servers have no authentication. What keeps a stranger away from
|
|
12
|
-
# them is that only a process that can spawn them can write to their
|
|
13
|
-
# stdin. That holds until someone wraps one in `socat TCP-LISTEN:... EXEC:`
|
|
14
|
-
# or an `inetd`-style listener, which hands the process a network socket
|
|
15
|
-
# as stdin/stdout without changing a line of the server. The gate turns
|
|
16
|
-
# that setup into a refusal at startup instead of an exposure nobody
|
|
17
|
-
# noticed.
|
|
18
|
-
#
|
|
19
|
-
# ## What it checks
|
|
20
|
-
#
|
|
21
|
-
# - **Arguments** — none, except `--stdio`. A `--port` or `--http` flag is
|
|
22
|
-
# refused rather than ignored, so a caller that believes it started a
|
|
23
|
-
# network server finds out immediately.
|
|
24
|
-
# - **Environment** — no `HECKS_MCP_*` variable except
|
|
25
|
-
# `HECKS_MCP_TRANSPORT=stdio`. The servers take no configuration, so an
|
|
26
|
-
# unknown option in that namespace fails closed.
|
|
27
|
-
# - **Descriptors** — stdin and stdout must not be internet-protocol sockets
|
|
28
|
-
# (`AF_INET` or `AF_INET6`). A pipe, a file, a terminal and a Unix-domain socket all pass;
|
|
29
|
-
# the last matters because some MCP clients spawn servers over a
|
|
30
|
-
# `socketpair`, which is local to the machine.
|
|
31
|
-
#
|
|
32
|
-
# ## What it does not do
|
|
33
|
-
#
|
|
34
|
-
# It does not authenticate anyone and it cannot see a proxy that copies
|
|
35
|
-
# bytes from a network socket into an ordinary pipe. It closes the
|
|
36
|
-
# configurations that announce themselves; the ADR on MCP authentication
|
|
37
|
-
# (`docs/decisions/0062-mcp-servers-need-real-authentication-before-any-network-transport.md`)
|
|
38
|
-
# covers what a network transport would need.
|
|
4
|
+
# Startup gate for the stdio MCP servers `hecks mcp` runs: refuses network sockets, extra
|
|
5
|
+
# flags and unknown `HECKS_MCP_*` variables. It is not authentication (ADR 0062).
|
|
39
6
|
module McpStdioGuard
|
|
40
7
|
ACCEPTED_ARGS = %w[--stdio].freeze
|
|
41
8
|
ENV_PREFIX = "HECKS_MCP_".freeze
|
|
@@ -71,12 +38,8 @@ module Hecks
|
|
|
71
38
|
(COMMON_NOTES + notes).map { |line| "#{server}: #{line}" }
|
|
72
39
|
end
|
|
73
40
|
|
|
74
|
-
# Refuses to continue on a non-stdio setup.
|
|
75
|
-
#
|
|
76
|
-
# A server calls this before it requires anything heavy, so a misconfigured start
|
|
77
|
-
# fails in milliseconds and before any protocol byte is answered. Everything goes
|
|
78
|
-
# to `stderr`: stdout carries the MCP protocol, and one stray line there corrupts
|
|
79
|
-
# the client's framing.
|
|
41
|
+
# Refuses to continue on a non-stdio setup. Everything goes to `stderr`: stdout
|
|
42
|
+
# carries the MCP protocol, and a stray line there corrupts the client's framing.
|
|
80
43
|
#
|
|
81
44
|
# @param server [String] the server's name, used as the line prefix
|
|
82
45
|
# @param argv [Array<String>] the command-line arguments
|
data/lib/hecks/naming.rb
CHANGED
|
@@ -1,19 +1,9 @@
|
|
|
1
1
|
module Hecks
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
# splitting, and the command/event reference rewrites — collected here so
|
|
5
|
-
# two readers never invent two different spellings for the same
|
|
6
|
-
# derivation.
|
|
2
|
+
# Derived-name and identity-joining rules: casing, pluralisation, dotted-path
|
|
3
|
+
# and verb splitting, command/event reference rewrites.
|
|
7
4
|
module Naming
|
|
8
|
-
# What separates the parts of a derived identity.
|
|
9
|
-
#
|
|
10
|
-
# An identity of several parts is their join, and the join has to be spelled the
|
|
11
|
-
# same everywhere or two readers name two different records off one declaration.
|
|
12
|
-
# It was spelled three ways at once here — "::" for an aggregate under a
|
|
13
|
-
# chapter, "." for everything under an aggregate, "#" for the three that keyed
|
|
14
|
-
# off position — and each was written where it happened to be needed. Once the
|
|
15
|
-
# runtime derived the same identity, the runtime made a fourth, and a reference
|
|
16
|
-
# that resolved by string comparison found nothing.
|
|
5
|
+
# What separates the parts of a derived identity. Every reader must spell the
|
|
6
|
+
# join the same way, or string-compared references resolve to nothing.
|
|
17
7
|
IDENTITY_JOIN = ":".freeze
|
|
18
8
|
|
|
19
9
|
module_function
|
|
@@ -35,9 +25,8 @@ module Hecks
|
|
|
35
25
|
type.to_s.split("::").last.to_s
|
|
36
26
|
end
|
|
37
27
|
|
|
38
|
-
# snake_case -> PascalCase.
|
|
39
|
-
#
|
|
40
|
-
# the IR contract: the same bluebook must always produce the same name.
|
|
28
|
+
# snake_case -> PascalCase. Names a closed-set value object synthesised from an
|
|
29
|
+
# inline attribute; the derivation is part of the IR contract.
|
|
41
30
|
#
|
|
42
31
|
# @param text [String, Symbol, #to_s] a snake_case (or already Pascal) name
|
|
43
32
|
# @return [String] the PascalCase form
|
|
@@ -56,15 +45,8 @@ module Hecks
|
|
|
56
45
|
.downcase
|
|
57
46
|
end
|
|
58
47
|
|
|
59
|
-
# An identifier as a
|
|
60
|
-
# `
|
|
61
|
-
# limit", `Back office` -> "Back office". The same two word-boundary
|
|
62
|
-
# splits `snake` uses, with a space instead of an underscore — plus
|
|
63
|
-
# the one thing `snake` cannot give back: an all-caps run stays an
|
|
64
|
-
# acronym ("ATM", "KYC") instead of being lowercased into a word
|
|
65
|
-
# nobody says ("Atm"). First word capitalized, the rest lowercased,
|
|
66
|
-
# so a headword reads as sentence case whatever casing it was
|
|
67
|
-
# declared in.
|
|
48
|
+
# An identifier as a sentence-cased phrase: `ATMCard` -> "ATM card",
|
|
49
|
+
# `daily_limit` -> "Daily limit". All-caps runs stay acronyms.
|
|
68
50
|
#
|
|
69
51
|
# @param text [String, Symbol, #to_s] a Pascal-, camel-, or snake-case identifier
|
|
70
52
|
# @return [String] the space-separated, sentence-cased phrase
|
|
@@ -81,9 +63,7 @@ module Hecks
|
|
|
81
63
|
end.join(" ")
|
|
82
64
|
end
|
|
83
65
|
|
|
84
|
-
# Joins items into
|
|
85
|
-
# every English sentence a projection writes wants; lived in
|
|
86
|
-
# `NarrateProjector` alone until a second projection needed it.
|
|
66
|
+
# Joins items into an Oxford-comma list: "A, B, and C" / "A or B".
|
|
87
67
|
#
|
|
88
68
|
# @param items [Array<#to_s>] the items to join
|
|
89
69
|
# @param conj [String] the word before the last item, such as `"and"` or `"or"`
|
|
@@ -98,9 +78,8 @@ module Hecks
|
|
|
98
78
|
end
|
|
99
79
|
end
|
|
100
80
|
|
|
101
|
-
# Picks the article for `word` by its first letter
|
|
102
|
-
#
|
|
103
|
-
# gives: a construct name is a plain word, never "hour" or "university".
|
|
81
|
+
# Picks the article for `word` by its first letter. Construct names are plain
|
|
82
|
+
# words, never "hour" or "university", so the vowel-letter heuristic holds.
|
|
104
83
|
#
|
|
105
84
|
# @param word [String, Symbol, #to_s] the word the article precedes
|
|
106
85
|
# @return [String] `"an"` if `word` starts with a vowel letter, `"a"` otherwise
|
|
@@ -108,15 +87,8 @@ module Hecks
|
|
|
108
87
|
%w[a e i o u].include?(word.to_s[0].to_s.downcase) ? "an" : "a"
|
|
109
88
|
end
|
|
110
89
|
|
|
111
|
-
# The name a collection of something takes
|
|
112
|
-
#
|
|
113
|
-
# There were two of these and one was wrong. A read model's gathered heads
|
|
114
|
-
# derived their name with a bare `"#{snake(target)}s"`, so the meta-domain's
|
|
115
|
-
# own whole-bluebook read model handed back `querys`, `entitys`, `policys`
|
|
116
|
-
# and `dispatchs` — and every check was green, because the checks compared
|
|
117
|
-
# the wrong rule against itself. Agreement is not correctness; it never was.
|
|
118
|
-
#
|
|
119
|
-
# So: one pluraliser, three rules, and every collection name flows through it.
|
|
90
|
+
# The name a collection of something takes: "y" -> "ies", sibilants take "es",
|
|
91
|
+
# everything else "s". Every collection name must flow through this one rule.
|
|
120
92
|
#
|
|
121
93
|
# @param text [String, Symbol, #to_s] a singular name
|
|
122
94
|
# @return [String] the pluralised name
|
|
@@ -128,13 +100,9 @@ module Hecks
|
|
|
128
100
|
"#{word}s"
|
|
129
101
|
end
|
|
130
102
|
|
|
131
|
-
#
|
|
132
|
-
#
|
|
133
|
-
#
|
|
134
|
-
# name wrong reads as a typo forever ; this only ever recovers a name someone
|
|
135
|
-
# already wrote as a real aggregate, so "ies -> y, trailing s dropped" is the
|
|
136
|
-
# whole rule — enough for `has_many Invoices` to resolve to the aggregate
|
|
137
|
-
# actually named Invoice.
|
|
103
|
+
# Recovers the singular aggregate name from a `has_many` plural. Deliberately
|
|
104
|
+
# crude ("ies" -> "y", sibilant "es" and trailing "s" dropped): it only has to
|
|
105
|
+
# find a name someone already wrote.
|
|
138
106
|
#
|
|
139
107
|
# @param text [String, Symbol, #to_s] a plural name
|
|
140
108
|
# @return [String] the singularised name
|
|
@@ -142,15 +110,8 @@ module Hecks
|
|
|
142
110
|
word = text.to_s
|
|
143
111
|
return "#{word[0..-4]}y" if word.length > 3 && word.end_with?("ies")
|
|
144
112
|
|
|
145
|
-
# `plural`'s
|
|
146
|
-
#
|
|
147
|
-
# itself would have suffixed with "es" comes back missing its
|
|
148
|
-
# own trailing letter ("Boxes" -> "Boxe", not "Box") once this
|
|
149
|
-
# only ever knew how to drop a bare "s". Checked before the
|
|
150
|
-
# bare-"s" rule below: stripping "es" first and confirming what
|
|
151
|
-
# is left actually ends in one of those five shapes is what
|
|
152
|
-
# keeps an ordinary "-es" word (e.g. "Invoices" -> "Invoice")
|
|
153
|
-
# from also losing a letter it never doubled.
|
|
113
|
+
# Undo `plural`'s "es" after s/x/z/ch/sh before the bare-"s" rule, so "Boxes"
|
|
114
|
+
# gives "Box" while "Invoices" still gives "Invoice".
|
|
154
115
|
return word[0..-3] if word.length > 3 && word.end_with?("es") && word[0..-3].match?(/(s|x|z|ch|sh)\z/)
|
|
155
116
|
|
|
156
117
|
return word[0..-2] if word.length > 1 && word.end_with?("s")
|
|
@@ -199,29 +160,9 @@ module Hecks
|
|
|
199
160
|
|
|
200
161
|
# Splits a domain-qualified verb into its domain, aggregate, and command parts.
|
|
201
162
|
#
|
|
202
|
-
#
|
|
203
|
-
#
|
|
204
|
-
#
|
|
205
|
-
# construction — every caller here has already prefixed the domain
|
|
206
|
-
# itself (`PolicyInterpreter#deliver`, `SagaInterpreter#qualified`,
|
|
207
|
-
# `Router#dispatch`'s own rebuilt string) before this ever runs. A
|
|
208
|
-
# third `::` segment can still show up past that boundary: a bare
|
|
209
|
-
# `ScopedConstant` naming a port operation (`command_ref`'s own
|
|
210
|
-
# comment — `Aggregate::Port::Operation`, three colon-joined
|
|
211
|
-
# segments with no `.` of its own) only gets its last `::` rewritten
|
|
212
|
-
# to `.` there, at DSL-build time, because nothing at that point
|
|
213
|
-
# knows yet whether the constant names a port operation or a
|
|
214
|
-
# domain-qualified command (`Domain::Aggregate::Command`, the other
|
|
215
|
-
# shape `command_ref` documents) — both are textually identical.
|
|
216
|
-
# Here, past the already-resolved domain boundary, any leftover
|
|
217
|
-
# `::` is unambiguous: it is that same rewrite artifact, and folding
|
|
218
|
-
# it into the dot-joined tail recovers exactly the
|
|
219
|
-
# `Aggregate::Port.Operation` shape a working port dispatch already
|
|
220
|
-
# expects (`spec/port_operation_interpreter_spec.rb`'s own
|
|
221
|
-
# `"Payments::Payment.PaymentGateway.Receive"`). `Outbox::Fanout
|
|
222
|
-
# .kind_for` and `ReactionInvocation#resolve_target` both already
|
|
223
|
-
# assume this contract on their own end; this is what actually
|
|
224
|
-
# delivers it to them.
|
|
163
|
+
# A `::` left after the domain and aggregate is the last-`::`-to-`.` rewrite
|
|
164
|
+
# `command_ref` leaves on a port operation; it folds into the dotted command
|
|
165
|
+
# tail (`Aggregate::Port.Operation`).
|
|
225
166
|
#
|
|
226
167
|
# @param verb [String, Symbol, #to_s] a `Domain::Aggregate.command` (or
|
|
227
168
|
# `.query`) path
|
|
@@ -239,26 +180,11 @@ module Hecks
|
|
|
239
180
|
[domain, aggregate, command]
|
|
240
181
|
end
|
|
241
182
|
|
|
242
|
-
# Rewrites a bare command constant's
|
|
243
|
-
#
|
|
183
|
+
# Rewrites a bare command constant's last `::` into `.`, matching a command's
|
|
184
|
+
# FQN separator (`Banking::Account::Debit` -> `Banking::Account.Debit`).
|
|
244
185
|
#
|
|
245
|
-
#
|
|
246
|
-
#
|
|
247
|
-
# text (ADR 0025, "events and reactions" — command references become
|
|
248
|
-
# first-class). Ruby's `::` joins every segment the same way a
|
|
249
|
-
# constant path always does, but a command's own `hecks_fqn` joins
|
|
250
|
-
# its aggregate with `.` (`Construct#hecks_separator`'s default,
|
|
251
|
-
# only an aggregate overrides it to `::`) — so only the last `::`
|
|
252
|
-
# becomes a `.`; everything before it (the chapter, when a domain is
|
|
253
|
-
# spelled at all: `Banking::Account::Debit`) stays `::`-joined.
|
|
254
|
-
#
|
|
255
|
-
# A string passes through unchanged, on purpose — legacy era text
|
|
256
|
-
# (S0a's own shadow-parsed spelling) already mixes `::` (domain) and
|
|
257
|
-
# `.` (command) correctly on its own, e.g. `"Banking::Account.Debit"`,
|
|
258
|
-
# and re-splitting that by content rather than by type would corrupt
|
|
259
|
-
# it (its own last `::` sits between the domain and the aggregate,
|
|
260
|
-
# not the aggregate and the command). Only an actual constant object
|
|
261
|
-
# — never seen holding a `.` of its own — needs the rewrite at all.
|
|
186
|
+
# A String or Symbol passes through: era text already mixes `::` and `.`
|
|
187
|
+
# correctly, and re-splitting it by content would corrupt it.
|
|
262
188
|
#
|
|
263
189
|
# @param value [Symbol, String, Module] the command, as a bare constant (a
|
|
264
190
|
# `ScopedConstant` module `ConstShim` resolves) or already-dotted text
|
|
@@ -271,18 +197,8 @@ module Hecks
|
|
|
271
197
|
path.empty? ? text : "#{path}.#{command}"
|
|
272
198
|
end
|
|
273
199
|
|
|
274
|
-
# The event-side twin of `command_ref
|
|
275
|
-
# event
|
|
276
|
-
#
|
|
277
|
-
# `emits Account::AccountFrozen` / `on Account::AccountFrozen` — the
|
|
278
|
-
# event-side twin of `command_ref`, above (ADR 0025, S6 — "events
|
|
279
|
-
# first-class"). Identical transform (a bare `ScopedConstant`'s last
|
|
280
|
-
# `::` becomes `.`, a String passes through unchanged for legacy
|
|
281
|
-
# `shadow_parse` text and for corpus sites this pass didn't migrate —
|
|
282
|
-
# see that method's own comment for why both rules exist), given its
|
|
283
|
-
# own name because the two references mean different things even
|
|
284
|
-
# though the rewrite is byte-identical: an event name is not a
|
|
285
|
-
# command name that happens to share a format.
|
|
200
|
+
# The event-side twin of `command_ref`. Same rewrite, separate name, because an
|
|
201
|
+
# event reference is not a command reference that happens to share a format.
|
|
286
202
|
#
|
|
287
203
|
# @param value [Symbol, String, Module] the event, as a bare constant (a
|
|
288
204
|
# `ScopedConstant` module `ConstShim` resolves) or already-dotted text
|
|
@@ -291,32 +207,8 @@ module Hecks
|
|
|
291
207
|
|
|
292
208
|
# Strips a process manager's event reference down to its bare event name.
|
|
293
209
|
#
|
|
294
|
-
# `
|
|
295
|
-
#
|
|
296
|
-
# — a process manager's own event references (ADR 0025, S6),
|
|
297
|
-
# deliberately not `event_ref` — found live, not assumed, wiring a
|
|
298
|
-
# real migrated corpus site into `bin/model_check` for the first
|
|
299
|
-
# time (2026-08-28): `SagaInterpreter#begin_saga`/`#advance_saga`
|
|
300
|
-
# match `pm.starts_on`/`pm.handler_for` against `event.name`, which
|
|
301
|
-
# `CommandRules::Emission#emit` stamps bare — a command's own
|
|
302
|
-
# `emits AccountDebited` never carries its aggregate's name at all
|
|
303
|
-
# (unlike a policy's cross-aggregate `on`, matched instead by
|
|
304
|
-
# `Naming.demodulise(event.aggregate)` split apart from the bare
|
|
305
|
-
# name — `PolicyInterpreter#policies_for`). Handing a saga's own
|
|
306
|
-
# matcher the dotted `event_ref` form ("Account.AccountDebited")
|
|
307
|
-
# would silently name an event no command in the domain ever
|
|
308
|
-
# actually emits — caught by `bin/model_check`'s own `deaf_handler`/
|
|
309
|
-
# `deaf_trigger` findings the moment a real qualified corpus site
|
|
310
|
-
# existed to trip them, not by any unit test in isolation.
|
|
311
|
-
#
|
|
312
|
-
# A qualifier is still worth writing (`Account::`) — the same
|
|
313
|
-
# provenance a reader gets from `trigger Account::Debit` — it is
|
|
314
|
-
# only not worth keeping: `demodulise` drops everything but the
|
|
315
|
-
# final segment, so `Account::AccountDebited` and a bare
|
|
316
|
-
# `AccountDebited` resolve to the identical stored string. A String
|
|
317
|
-
# passes through unchanged either way, exactly like `command_ref`'s
|
|
318
|
-
# own legacy branch — this corpus never spelled one dotted to begin
|
|
319
|
-
# with, so there is nothing here to strip.
|
|
210
|
+
# Not `event_ref`: saga matching compares against `event.name`, which is stamped
|
|
211
|
+
# bare, so a dotted "Account.AccountDebited" would name an event nothing emits.
|
|
320
212
|
#
|
|
321
213
|
# @param value [Symbol, String, Module] the event, as a bare constant (a
|
|
322
214
|
# `ScopedConstant` module `ConstShim` resolves) or already-dotted text
|