hecks 3.5.0 → 3.6.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/examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb +1 -1
- data/lib/hecks/adapters/driven/claude_code.rb +11 -7
- data/lib/hecks/adapters/driven/d1/connection.rb +90 -0
- data/lib/hecks/adapters/driven/d1.rb +48 -314
- data/lib/hecks/adapters/driven/folder.rb +20 -10
- data/lib/hecks/adapters/driven/google_authentication.rb +18 -4
- data/lib/hecks/adapters/driven/governance_authorization.rb +2 -2
- data/lib/hecks/adapters/driven/heki/journal.rb +11 -10
- data/lib/hecks/adapters/driven/heki/saga_store.rb +4 -6
- data/lib/hecks/adapters/driven/heki/sagas.rb +55 -0
- data/lib/hecks/adapters/driven/heki.rb +21 -66
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +37 -12
- data/lib/hecks/adapters/driven/lambda/client.rb +1 -1
- data/lib/hecks/adapters/driven/lambda.rb +1 -8
- data/lib/hecks/adapters/driven/memory/outbox_rows.rb +76 -0
- data/lib/hecks/adapters/driven/memory/shared_elements/values.rb +117 -0
- data/lib/hecks/adapters/driven/memory/shared_elements.rb +10 -97
- data/lib/hecks/adapters/driven/memory.rb +3 -65
- data/lib/hecks/adapters/driven/postgres/codec.rb +29 -26
- data/lib/hecks/adapters/driven/postgres/ddl.rb +50 -0
- data/lib/hecks/adapters/driven/postgres/dialect.rb +93 -0
- data/lib/hecks/adapters/driven/postgres/events.rb +57 -0
- data/lib/hecks/adapters/driven/postgres/journal.rb +127 -0
- data/lib/hecks/adapters/driven/postgres/outbox.rb +39 -31
- data/lib/hecks/adapters/driven/postgres/repository.rb +190 -0
- data/lib/hecks/adapters/driven/postgres/sagas.rb +72 -0
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +13 -41
- data/lib/hecks/adapters/driven/postgres.rb +61 -528
- data/lib/hecks/adapters/driven/prism.rb +1 -1
- data/lib/hecks/adapters/driven/sql_query_builder.rb +45 -53
- data/lib/hecks/adapters/driven/sql_value_members.rb +57 -0
- data/lib/hecks/adapters/driven/sqlite/codec.rb +32 -29
- data/lib/hecks/adapters/driven/sqlite/ddl.rb +68 -0
- data/lib/hecks/adapters/driven/sqlite/dialect.rb +55 -0
- data/lib/hecks/adapters/driven/sqlite/events.rb +61 -0
- data/lib/hecks/adapters/driven/sqlite/journal.rb +125 -0
- data/lib/hecks/adapters/driven/sqlite/outbox.rb +98 -0
- data/lib/hecks/adapters/driven/sqlite/projection.rb +82 -63
- data/lib/hecks/adapters/driven/sqlite/repository.rb +146 -0
- data/lib/hecks/adapters/driven/sqlite/sagas.rb +69 -0
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +8 -55
- data/lib/hecks/adapters/driven/sqlite.rb +36 -513
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +13 -7
- data/lib/hecks/adapters/driving/github_webhook.rb +11 -8
- data/lib/hecks/behaviors/dsl.rb +17 -12
- data/lib/hecks/behaviors/expectations/boot.rb +81 -0
- data/lib/hecks/behaviors/expectations/checks.rb +178 -0
- data/lib/hecks/behaviors/expectations/dispatching.rb +93 -0
- data/lib/hecks/behaviors/expectations/qualify.rb +81 -0
- data/lib/hecks/behaviors/expectations.rb +39 -355
- data/lib/hecks/behaviors/rspec.rb +12 -12
- data/lib/hecks/behaviors/runner.rb +20 -11
- data/lib/hecks/bench/cli.rb +16 -13
- data/lib/hecks/bench/environment.rb +1 -1
- data/lib/hecks/bench/report.rb +11 -7
- data/lib/hecks/bench/ruby_runner.rb +13 -8
- data/lib/hecks/bench/rust_runner.rb +19 -11
- data/lib/hecks/bench/suite.rb +48 -20
- data/lib/hecks/bench/workload.rb +42 -31
- data/lib/hecks/bluebook/aggregate.rb +15 -21
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +18 -21
- data/lib/hecks/bluebook/assembly/build.rb +12 -7
- data/lib/hecks/bluebook/assembly/contracts/read_models.rb +70 -0
- data/lib/hecks/bluebook/assembly/contracts/rules.rb +84 -0
- data/lib/hecks/bluebook/assembly/contracts/sagas.rb +109 -0
- data/lib/hecks/bluebook/assembly/contracts/structure.rb +91 -0
- data/lib/hecks/bluebook/assembly/contracts.rb +9 -319
- data/lib/hecks/bluebook/assembly/marks.rb +9 -8
- data/lib/hecks/bluebook/attribute.rb +13 -10
- data/lib/hecks/bluebook/behaviour/aggregate.rb +10 -3
- data/lib/hecks/bluebook/behaviour/read_model.rb +26 -13
- data/lib/hecks/bluebook/chapter.rb +22 -14
- data/lib/hecks/bluebook/command.rb +14 -18
- data/lib/hecks/bluebook/domain_port.rb +11 -8
- data/lib/hecks/bluebook/dsl/aggregate_builder/correction_sealing.rb +78 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/draining.rb +74 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/query_field_sealing.rb +105 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/query_sealing.rb +121 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/relationships.rb +128 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/rules.rb +84 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +61 -249
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +51 -285
- data/lib/hecks/bluebook/dsl/attribute_collector/identity_resolution.rb +113 -0
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +58 -117
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +24 -19
- data/lib/hecks/bluebook/dsl/bluebook_builder/pending_givens.rb +109 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb +105 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/event_shapes.rb +126 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/hop_tails.rb +79 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/projected_fields.rb +76 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/provisions.rb +65 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/query_hops.rb +123 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/references.rb +112 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/with_projections.rb +126 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +34 -595
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +18 -107
- data/lib/hecks/bluebook/dsl/command_builder/implicit_attributes.rb +132 -0
- data/lib/hecks/bluebook/dsl/command_builder/mutations.rb +190 -0
- data/lib/hecks/bluebook/dsl/command_builder/owner.rb +22 -0
- data/lib/hecks/bluebook/dsl/command_builder/rules.rb +57 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +60 -360
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +19 -13
- data/lib/hecks/bluebook/dsl/entity_builder/rules.rb +96 -0
- data/lib/hecks/bluebook/dsl/entity_builder/scope.rb +25 -0
- data/lib/hecks/bluebook/dsl/entity_builder/sealing.rb +94 -0
- data/lib/hecks/bluebook/dsl/entity_builder.rb +35 -169
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +53 -24
- data/lib/hecks/bluebook/dsl/hecksagon_builder/chapter_scope.rb +133 -0
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +3 -97
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +73 -73
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +7 -3
- data/lib/hecks/bluebook/dsl/need_word.rb +1 -1
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +34 -29
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +57 -41
- data/lib/hecks/bluebook/dsl/query_builder.rb +12 -15
- data/lib/hecks/bluebook/dsl/read_model_builder/sealing.rb +116 -0
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +25 -102
- data/lib/hecks/bluebook/dsl/rule_reference.rb +26 -12
- data/lib/hecks/bluebook/dsl/translation_builder.rb +24 -14
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +29 -19
- data/lib/hecks/bluebook/dsl/word_gate.rb +34 -27
- data/lib/hecks/bluebook/entity.rb +13 -17
- data/lib/hecks/bluebook/expression/ast_json/emitters.rb +93 -0
- data/lib/hecks/bluebook/expression/ast_json/emitters.rb-e +88 -0
- data/lib/hecks/bluebook/expression/ast_json.rb +49 -76
- data/lib/hecks/bluebook/expression/ast_reader.rb +95 -28
- data/lib/hecks/bluebook/expression/canonical_form.rb +6 -26
- data/lib/hecks/bluebook/expression/evaluator/parser.rb +62 -0
- data/lib/hecks/bluebook/expression/evaluator/scanning.rb +122 -0
- data/lib/hecks/bluebook/expression/evaluator.rb +11 -111
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +28 -44
- data/lib/hecks/bluebook/expression/resolver/lookups.rb +77 -0
- data/lib/hecks/bluebook/expression/resolver/operations.rb +78 -0
- data/lib/hecks/bluebook/expression/resolver/parsing.rb +110 -0
- data/lib/hecks/bluebook/expression/resolver/scanning.rb +139 -0
- data/lib/hecks/bluebook/expression/resolver/values.rb +115 -0
- data/lib/hecks/bluebook/expression/resolver.rb +16 -414
- data/lib/hecks/bluebook/{hexagon.rb → hecksagon.rb} +22 -14
- data/lib/hecks/bluebook/keyword_fields.rb +42 -0
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +7 -6
- data/lib/hecks/bluebook/meta_validator/judge/cells.rb +99 -0
- data/lib/hecks/bluebook/meta_validator/judge/dispatching.rb +111 -0
- data/lib/hecks/bluebook/meta_validator/judge/identity.rb +108 -0
- data/lib/hecks/bluebook/meta_validator/judge/walking.rb +141 -0
- data/lib/hecks/bluebook/meta_validator/judge.rb +31 -376
- data/lib/hecks/bluebook/meta_validator/modes.rb +137 -0
- data/lib/hecks/bluebook/meta_validator/plan/category.rb +44 -0
- data/lib/hecks/bluebook/meta_validator/plan/verbs.rb +73 -0
- data/lib/hecks/bluebook/meta_validator/plan.rb +38 -122
- data/lib/hecks/bluebook/meta_validator/readings/fields.rb +100 -0
- data/lib/hecks/bluebook/meta_validator/readings.rb +10 -95
- data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +89 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction/reading.rb +96 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -151
- data/lib/hecks/bluebook/meta_validator/shapes/helpers.rb +83 -0
- data/lib/hecks/bluebook/meta_validator/shapes.rb +8 -75
- data/lib/hecks/bluebook/meta_validator/syntax_boot/disk_cache.rb +77 -0
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +31 -95
- data/lib/hecks/bluebook/meta_validator/translation_judge/rules.rb +74 -0
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +15 -65
- data/lib/hecks/bluebook/meta_validator/verdict_cache/tagging.rb +63 -0
- data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +22 -43
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +8 -4
- data/lib/hecks/bluebook/meta_validator.rb +59 -175
- data/lib/hecks/bluebook/model_check/lifecycle_checks.rb +122 -0
- data/lib/hecks/bluebook/model_check/policy_checks.rb +129 -0
- data/lib/hecks/bluebook/model_check/saga_checks.rb +134 -0
- data/lib/hecks/bluebook/model_check/verbs.rb +69 -0
- data/lib/hecks/bluebook/model_check.rb +73 -413
- data/lib/hecks/bluebook/pattern_subset/refusals.rb +54 -0
- data/lib/hecks/bluebook/pattern_subset/scan.rb +58 -0
- data/lib/hecks/bluebook/pattern_subset.rb +93 -134
- data/lib/hecks/bluebook/process_manager.rb +10 -9
- data/lib/hecks/bluebook/project_discovery.rb +10 -7
- data/lib/hecks/bluebook/project_register.rb +42 -41
- data/lib/hecks/bluebook/query.rb +19 -12
- data/lib/hecks/bluebook/read_model.rb +41 -39
- data/lib/hecks/bluebook/smoke_test.rb +51 -36
- data/lib/hecks/bluebook/synthesizer.rb +13 -5
- data/lib/hecks/bluebook/translation.rb +12 -12
- data/lib/hecks/bluebook.rb +1 -1
- data/lib/hecks/chapters.rb +32 -16
- data/lib/hecks/cli/behaviors.rb +22 -15
- data/lib/hecks/cli/check_era.rb +2 -2
- data/lib/hecks/cli/command_table.rb +72 -0
- data/lib/hecks/cli/console.rb +10 -7
- data/lib/hecks/cli/deploy_template_diff.rb +22 -9
- data/lib/hecks/cli/document.rb +14 -10
- data/lib/hecks/cli/domain_stub.rb +1 -1
- data/lib/hecks/cli/domain_writer.rb +1 -1
- data/lib/hecks/cli/expression_projection.rb +8 -6
- data/lib/hecks/cli/follow.rb +10 -4
- data/lib/hecks/cli/interview_aggregate.rb +132 -0
- data/lib/hecks/cli/interview_draft.rb +16 -200
- data/lib/hecks/cli/interview_record.rb +130 -0
- data/lib/hecks/cli/interview_run.rb +19 -8
- data/lib/hecks/cli/interview_session/agent_state.rb +70 -0
- data/lib/hecks/cli/interview_session/catalog.rb +76 -0
- data/lib/hecks/cli/interview_session/manual_findings.rb +48 -0
- data/lib/hecks/cli/interview_session/proposals.rb +90 -0
- data/lib/hecks/cli/interview_session.rb +8 -205
- data/lib/hecks/cli/interview_shape.rb +13 -6
- data/lib/hecks/cli/ir.rb +8 -11
- data/lib/hecks/cli/launcher_words.rb +168 -0
- data/lib/hecks/cli/model_check/examination.rb +93 -0
- data/lib/hecks/cli/model_check/sources.rb +57 -0
- data/lib/hecks/cli/model_check.rb +28 -134
- data/lib/hecks/cli/project_cli/launcher_source.rb +177 -0
- data/lib/hecks/cli/project_cli/templates.rb +106 -0
- data/lib/hecks/cli/project_cli.rb +57 -236
- data/lib/hecks/cli/project_diagrams.rb +26 -4
- data/lib/hecks/cli/project_glossary.rb +19 -9
- data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +29 -13
- data/lib/hecks/cli/release.rb +29 -22
- data/lib/hecks/cli/release_gem.rb +12 -6
- data/lib/hecks/cli/rspec_io_parallel_files.rb +87 -30
- data/lib/hecks/cli/rspec_shard_files.rb +24 -9
- data/lib/hecks/cli/run.rb +25 -44
- data/lib/hecks/cli/run_expectations.rb +63 -0
- data/lib/hecks/cli/seed_semantics_corpus.rb +37 -17
- data/lib/hecks/cli/smoke_http/checks.rb +66 -0
- data/lib/hecks/cli/smoke_http/settings.rb +63 -0
- data/lib/hecks/cli/smoke_http/transport.rb +45 -0
- data/lib/hecks/cli/smoke_http.rb +8 -142
- data/lib/hecks/cli/smoke_test.rb +18 -4
- data/lib/hecks/cli/stores.rb +7 -4
- data/lib/hecks/cli/stress_concurrency_specs/reporting.rb +44 -0
- data/lib/hecks/cli/stress_concurrency_specs/usage.rb +28 -0
- data/lib/hecks/cli/stress_concurrency_specs.rb +82 -80
- data/lib/hecks/cli.rb +32 -208
- data/lib/hecks/codemod/runner.rb +92 -0
- data/lib/hecks/codemod/sweep.rb +94 -0
- data/lib/hecks/codemod.rb +22 -165
- data/lib/hecks/corpus/routes.rb +34 -0
- data/lib/hecks/corpus/rust.rb +193 -0
- data/lib/hecks/corpus/sources.rb +46 -0
- data/lib/hecks/corpus.rb +28 -265
- data/lib/hecks/doc/reference/coverage.rb +70 -0
- data/lib/hecks/doc/reference/harvester.rb +55 -0
- data/lib/hecks/doc/reference/readme.rb +89 -0
- data/lib/hecks/doc/reference/rendering.rb +149 -0
- data/lib/hecks/doc/reference.rb +14 -273
- data/lib/hecks/doors/cli_door/nesting.rb +34 -0
- data/lib/hecks/doors/cli_door/shorthand.rb +85 -0
- data/lib/hecks/doors/cli_door.rb +23 -95
- data/lib/hecks/doors/cli_runner/answers.rb +138 -0
- data/lib/hecks/doors/cli_runner/resolution.rb +146 -0
- data/lib/hecks/doors/cli_runner/settling.rb +115 -0
- data/lib/hecks/doors/cli_runner/streaming.rb +90 -0
- data/lib/hecks/doors/cli_runner/suggestions.rb +43 -0
- data/lib/hecks/doors/cli_runner.rb +12 -336
- data/lib/hecks/doors/command_request.rb +42 -31
- data/lib/hecks/doors/handle.rb +32 -30
- data/lib/hecks/doors/launcher_options.rb +62 -7
- data/lib/hecks/doors/mcp_door/properties.rb +47 -0
- data/lib/hecks/doors/mcp_door/tool_calls.rb +113 -0
- data/lib/hecks/doors/mcp_door/tool_definitions/auditing.rb +51 -0
- data/lib/hecks/doors/mcp_door/tool_definitions/calling.rb +69 -0
- data/lib/hecks/doors/mcp_door/tool_definitions/reading.rb +97 -0
- data/lib/hecks/doors/mcp_door/tool_definitions.rb +15 -0
- data/lib/hecks/doors/mcp_door.rb +55 -301
- data/lib/hecks/doors/mcp_door_scope/argument_policy.rb +92 -0
- data/lib/hecks/doors/mcp_door_scope/env_problems.rb +55 -0
- data/lib/hecks/doors/mcp_door_scope/presenter.rb +78 -0
- data/lib/hecks/doors/mcp_door_scope.rb +16 -172
- data/lib/hecks/doors/ruby_door/aggregate_door.rb +1 -1
- data/lib/hecks/doors/ruby_door/chapter.rb +33 -16
- data/lib/hecks/doors/ruby_door.rb +14 -11
- data/lib/hecks/doors/usage_cache.rb +14 -8
- data/lib/hecks/doors.rb +10 -4
- data/lib/hecks/embryonaut_bluebook/manifest.rb +11 -3
- data/lib/hecks/embryonaut_bluebook/registry/changelog.rb +26 -0
- data/lib/hecks/embryonaut_bluebook/registry/versions.rb +27 -0
- data/lib/hecks/embryonaut_bluebook/registry.rb +27 -37
- data/lib/hecks/embryonaut_bluebook/vendor/acceptance.rb +37 -0
- data/lib/hecks/embryonaut_bluebook/vendor.rb +22 -36
- data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +9 -6
- data/lib/hecks/embryonaut_bluebook.rb +16 -11
- data/lib/hecks/engine_agreement.rb +24 -17
- data/lib/hecks/forms/app/commands.rb +98 -0
- data/lib/hecks/forms/app/queries.rb +62 -0
- data/lib/hecks/forms/app/records.rb +67 -0
- data/lib/hecks/forms/app/responses.rb +46 -0
- data/lib/hecks/forms/app.rb +33 -221
- data/lib/hecks/forms/banking_presentation.rb +5 -0
- data/lib/hecks/forms/command_form_renderer.rb +55 -14
- data/lib/hecks/forms/field_controls.rb +95 -0
- data/lib/hecks/forms/field_renderer.rb +34 -88
- data/lib/hecks/forms/field_shape.rb +9 -34
- data/lib/hecks/forms/html.rb +1 -1
- data/lib/hecks/forms/index_renderer.rb +14 -9
- data/lib/hecks/forms/page.rb +2 -106
- data/lib/hecks/forms/page_assets.rb +88 -0
- data/lib/hecks/forms/page_script.rb +28 -0
- data/lib/hecks/forms/params.rb +17 -8
- data/lib/hecks/forms/query_form_renderer.rb +11 -7
- data/lib/hecks/forms/record_renderer.rb +28 -19
- data/lib/hecks/forms/reference_options.rb +1 -1
- data/lib/hecks/forms/text_shape.rb +40 -0
- data/lib/hecks/fqn.rb +64 -32
- data/lib/hecks/framework.rb +10 -3
- data/lib/hecks/freezer.rb +10 -1
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions/fragments.rb +61 -0
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions/productions.rb +217 -0
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +5 -194
- data/lib/hecks/fuzzing/combination_miner.rb +23 -12
- data/lib/hecks/fuzzing/concurrent_dispatch/racing.rb +64 -0
- data/lib/hecks/fuzzing/concurrent_dispatch/world_copy.rb +66 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +31 -107
- data/lib/hecks/fuzzing/coverage_campaign.rb +7 -7
- data/lib/hecks/fuzzing/differential/wire_comparison.rb +74 -0
- data/lib/hecks/fuzzing/differential.rb +59 -84
- data/lib/hecks/fuzzing/domain_generator/block_rendering.rb +70 -0
- data/lib/hecks/fuzzing/domain_generator/builder/attribute_shapes.rb +105 -0
- data/lib/hecks/fuzzing/domain_generator/builder/shapes.rb +97 -0
- data/lib/hecks/fuzzing/domain_generator/builder/wiring.rb +128 -0
- data/lib/hecks/fuzzing/domain_generator/builder.rb +105 -0
- data/lib/hecks/fuzzing/domain_generator/pruning.rb +90 -0
- data/lib/hecks/fuzzing/domain_generator/removals.rb +62 -0
- data/lib/hecks/fuzzing/domain_generator/rendering.rb +94 -0
- data/lib/hecks/fuzzing/domain_generator/tokens.rb +38 -0
- data/lib/hecks/fuzzing/domain_generator.rb +7 -555
- data/lib/hecks/fuzzing/era_boundary.rb +34 -24
- data/lib/hecks/fuzzing/form_census.rb +18 -8
- data/lib/hecks/fuzzing/generated_domain_check.rb +23 -11
- data/lib/hecks/fuzzing/isolated_boot/copying.rb +62 -0
- data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +133 -0
- data/lib/hecks/fuzzing/isolated_boot/worlds.rb +102 -0
- data/lib/hecks/fuzzing/isolated_boot.rb +25 -252
- data/lib/hecks/fuzzing/persistence_parity.rb +5 -5
- data/lib/hecks/fuzzing/properties/aggregation_recompute.rb +121 -0
- data/lib/hecks/fuzzing/properties/catalog.rb +138 -0
- data/lib/hecks/fuzzing/properties/corrections.rb +23 -20
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +64 -185
- data/lib/hecks/fuzzing/properties/group_by_recompute.rb +69 -0
- data/lib/hecks/fuzzing/properties/guards.rb +76 -108
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +66 -227
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +46 -35
- data/lib/hecks/fuzzing/properties/mutation_recompute.rb +162 -0
- data/lib/hecks/fuzzing/properties/outbox.rb +41 -24
- data/lib/hecks/fuzzing/properties/piece_invariants.rb +61 -0
- data/lib/hecks/fuzzing/properties/policy_wiring.rb +140 -0
- data/lib/hecks/fuzzing/properties/query_rows.rb +67 -0
- data/lib/hecks/fuzzing/properties/querying.rb +69 -90
- data/lib/hecks/fuzzing/properties/references.rb +100 -0
- data/lib/hecks/fuzzing/properties/tenant_scope.rb +84 -0
- data/lib/hecks/fuzzing/properties.rb +6 -119
- data/lib/hecks/fuzzing/qa_settings.rb +23 -17
- data/lib/hecks/fuzzing/replay/fan_out.rb +78 -0
- data/lib/hecks/fuzzing/replay/filters.rb +72 -0
- data/lib/hecks/fuzzing/replay/guard_check.rb +88 -0
- data/lib/hecks/fuzzing/replay/mutation_trace.rb +117 -0
- data/lib/hecks/fuzzing/replay/observation.rb +60 -0
- data/lib/hecks/fuzzing/replay/read_only_steps.rb +84 -0
- data/lib/hecks/fuzzing/replay/session.rb +151 -0
- data/lib/hecks/fuzzing/replay.rb +35 -442
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +3 -4
- data/lib/hecks/fuzzing/self_consistency/saga_redelivery.rb +133 -0
- data/lib/hecks/fuzzing/self_consistency/sagas.rb +93 -0
- data/lib/hecks/fuzzing/self_consistency/value_objects.rb +87 -0
- data/lib/hecks/fuzzing/self_consistency.rb +8 -213
- data/lib/hecks/fuzzing/sequence_generator/adversary/argument_mutations.rb +116 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary/caller_draw.rb +68 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary/identity_mutations.rb +62 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary/precedence_mutations.rb +126 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +23 -283
- data/lib/hecks/fuzzing/sequence_generator/argument_drawing.rb +78 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +69 -53
- data/lib/hecks/fuzzing/sequence_generator/identity_shaping.rb +85 -0
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +20 -16
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +12 -6
- data/lib/hecks/fuzzing/sequence_generator/prefixing.rb +45 -0
- data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +19 -8
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +43 -144
- data/lib/hecks/fuzzing/sequence_generator.rb +65 -63
- data/lib/hecks/fuzzing/shrinker.rb +33 -29
- data/lib/hecks/fuzzing/target_capabilities.rb +10 -4
- data/lib/hecks/fuzzing/value_generator.rb +27 -17
- data/lib/hecks/gate/stages.yml +10 -0
- data/lib/hecks/grammar/evolve/arguments.rb +90 -0
- data/lib/hecks/grammar/evolve/keywords.rb +81 -0
- data/lib/hecks/grammar/evolve/seeds.rb +172 -0
- data/lib/hecks/grammar/evolve.rb +22 -263
- data/lib/hecks/grammar/operators.rb +111 -0
- data/lib/hecks/grammar.rb +53 -126
- data/lib/hecks/hecks/adapters/bluebook_report.rb +6 -6
- data/lib/hecks/hecks/adapters/codebase/codemods.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +23 -9
- data/lib/hecks/hecks/adapters/codebase/language/edits.rb +75 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +30 -72
- data/lib/hecks/hecks/adapters/codebase/promotion/candidates.rb +54 -0
- data/lib/hecks/hecks/adapters/codebase/promotion/gate.rb +50 -0
- data/lib/hecks/hecks/adapters/codebase/promotion/move.rb +70 -0
- data/lib/hecks/hecks/adapters/codebase/promotion/standing.rb +88 -0
- data/lib/hecks/hecks/adapters/codebase/promotion/watch.rb +83 -0
- data/lib/hecks/hecks/adapters/codebase/promotion.rb +115 -0
- data/lib/hecks/hecks/adapters/codebase/publishing.rb +31 -12
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +43 -6
- data/lib/hecks/hecks/adapters/codebase/release_facts.rb +16 -5
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +9 -1
- data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/style.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +11 -5
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +27 -8
- data/lib/hecks/hecks/adapters/console_capture.rb +21 -17
- data/lib/hecks/hecks/adapters/cost_explorer.rb +11 -6
- data/lib/hecks/hecks/adapters/deploy_plans.rb +3 -3
- data/lib/hecks/hecks/adapters/deploy_toolchain/answers.rb +141 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain/scripts.rb +95 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain/statuses.rb +74 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.rb +21 -239
- data/lib/hecks/hecks/adapters/finding_github.rb +2 -2
- data/lib/hecks/hecks/adapters/first_admin.rb +22 -8
- data/lib/hecks/hecks/adapters/git.rb +18 -5
- data/lib/hecks/hecks/adapters/git_refs.rb +144 -0
- data/lib/hecks/hecks/adapters/github_rulesets.rb +126 -0
- data/lib/hecks/hecks/adapters/host_http.rb +16 -6
- data/lib/hecks/hecks/adapters/in_process_boot.rb +9 -5
- data/lib/hecks/hecks/adapters/in_process_operations/tailing.rb +61 -0
- data/lib/hecks/hecks/adapters/in_process_operations.rb +33 -35
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +21 -15
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +29 -12
- data/lib/hecks/hecks/adapters/journal_store/readings/attestation.rb +52 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/scaffolding.rb +52 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +5 -62
- data/lib/hecks/hecks/adapters/local_files.rb +27 -10
- data/lib/hecks/hecks/adapters/pg_admin/ownership.rb +115 -0
- data/lib/hecks/hecks/adapters/pg_admin.rb +14 -87
- data/lib/hecks/hecks/adapters/process_pool.rb +54 -22
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +12 -4
- data/lib/hecks/hecks/adapters/site_toolchain.rb +16 -7
- data/lib/hecks/hecks/adapters/terminal.rb +13 -9
- data/lib/hecks/hecks/codebase.bluebook +322 -5
- data/lib/hecks/hecks/hecks.hecksagon +16 -0
- data/lib/hecks/hecks/hecks.world +10 -2
- data/lib/hecks/kernel_capabilities/templates.rb +92 -0
- data/lib/hecks/kernel_capabilities.rb +18 -85
- data/lib/hecks/language/bluebook/vocabulary.bluebook +43 -1
- data/lib/hecks/literal/item_splitter.rb +50 -0
- data/lib/hecks/literal.rb +29 -38
- data/lib/hecks/mcp_stdio_guard.rb +8 -8
- data/lib/hecks/naming.rb +9 -3
- data/lib/hecks/persistence_legacy_fixture/postgres_stores.rb +81 -0
- data/lib/hecks/persistence_legacy_fixture/regenerate.rb +26 -66
- data/lib/hecks/persistence_legacy_fixture.rb +13 -10
- data/lib/hecks/ports/access_control.rb +13 -10
- data/lib/hecks/ports/agent/answers.rb +2 -2
- data/lib/hecks/ports/agent.rb +13 -10
- data/lib/hecks/ports/authentication.rb +13 -10
- data/lib/hecks/ports/authorization.rb +13 -10
- data/lib/hecks/ports/clock.rb +13 -10
- data/lib/hecks/ports/extraction.rb +13 -12
- data/lib/hecks/ports/identity_assignment.rb +13 -10
- data/lib/hecks/ports/identity_generation.rb +13 -10
- data/lib/hecks/ports/identity_resolution.rb +13 -10
- data/lib/hecks/ports/key_vault.rb +13 -10
- data/lib/hecks/ports/persistence/append_only.rb +5 -5
- data/lib/hecks/ports/persistence/binding_policy.rb +33 -9
- data/lib/hecks/ports/persistence/codec_boundary.rb +22 -11
- data/lib/hecks/ports/persistence/constants.rb +10 -0
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +18 -16
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +27 -18
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +52 -23
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +14 -8
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +17 -6
- data/lib/hecks/ports/persistence/plugins/era/lineage/coverage.rb +58 -0
- data/lib/hecks/ports/persistence/plugins/era/lineage/rewrite.rb +130 -0
- data/lib/hecks/ports/persistence/plugins/era/lineage/rules.rb +25 -0
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +20 -180
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/boot.rb +41 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/class_methods.rb +105 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/dialect.rb +137 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +25 -28
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/head_writes.rb +62 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/journal.rb +128 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/base_sql.rb +74 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/chain_sql.rb +169 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/domain_rename.rb +91 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_integrity.rb +99 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +0 -73
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +55 -39
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +51 -222
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/merge_writes.rb +120 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +85 -60
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +97 -181
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +19 -19
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/sql_templates.rb +88 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +77 -118
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +3 -117
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_sql.rb +116 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +3 -1
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/context.rb +38 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +43 -25
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +62 -38
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +21 -16
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +66 -86
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/refusals.rb +75 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +27 -9
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/query_phases.rb +63 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/sagas.rb +78 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +28 -482
- data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +40 -12
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +22 -15
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +39 -19
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +16 -16
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +48 -25
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +60 -99
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/path_diff.rb +57 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +21 -11
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +13 -4
- data/lib/hecks/ports/persistence/postgres_dump/connection.rb +4 -2
- data/lib/hecks/ports/persistence/postgres_dump.rb +13 -7
- data/lib/hecks/ports/persistence/repository_factory.rb +35 -11
- data/lib/hecks/ports/persistence/state_codec.rb +10 -0
- data/lib/hecks/ports/persistence.rb +1 -10
- data/lib/hecks/ports/projection.rb +34 -21
- data/lib/hecks/ports/query/in_memory.rb +16 -8
- data/lib/hecks/projection_files/expression_tables.rb +64 -0
- data/lib/hecks/projection_files/texts.rb +67 -0
- data/lib/hecks/projection_files.rb +19 -103
- data/lib/hecks/projections/bootstrap_table.rb +43 -29
- data/lib/hecks/projections/deploy/bastion_lines.rb +32 -0
- data/lib/hecks/projections/deploy/box/access.rb +73 -0
- data/lib/hecks/projections/deploy/box/caddy.rb +87 -0
- data/lib/hecks/projections/deploy/box/compose.rb +70 -0
- data/lib/hecks/projections/deploy/box/hosting.rb +4 -105
- data/lib/hecks/projections/deploy/box/hosting_parts.rb +97 -0
- data/lib/hecks/projections/deploy/box/hosting_settings.rb +1 -1
- data/lib/hecks/projections/deploy/box/roll_recipe.rb +1 -1
- data/lib/hecks/projections/deploy/box/roll_scripts.rb +135 -0
- data/lib/hecks/projections/deploy/box/settings/checks.rb +38 -0
- data/lib/hecks/projections/deploy/box/settings/containers.rb +123 -0
- data/lib/hecks/projections/deploy/box/settings/origin.rb +56 -0
- data/lib/hecks/projections/deploy/box/settings/patterns.rb +43 -0
- data/lib/hecks/projections/deploy/box/settings/types.rb +72 -0
- data/lib/hecks/projections/deploy/box/settings.rb +58 -263
- data/lib/hecks/projections/deploy/box/stack_yaml.rb +107 -0
- data/lib/hecks/projections/deploy/box/templates/MIGRATION.md.tmpl +39 -0
- data/lib/hecks/projections/deploy/box/templates/Makefile.tmpl +24 -0
- data/lib/hecks/projections/deploy/box/templates/deploy-box.sh.tmpl +41 -1
- data/lib/hecks/projections/deploy/box/templates/deploy-service.services-roll.part +2 -1
- data/lib/hecks/projections/deploy/box/templates/deploy-service.taskdef-roll.part +2 -1
- data/lib/hecks/projections/deploy/box/templates/deploy-usage-services.tmpl +4 -0
- data/lib/hecks/projections/deploy/box/templates/deploy-usage-taskdef.tmpl +5 -0
- data/lib/hecks/projections/deploy/box/templates/ecr-repository.yaml.tmpl +9 -0
- data/lib/hecks/projections/deploy/box/templates/mode-summary-services.tmpl +2 -0
- data/lib/hecks/projections/deploy/box/templates/mode-summary-taskdef.tmpl +4 -0
- data/lib/hecks/projections/deploy/box/templates/services-block.tmpl +9 -0
- data/lib/hecks/projections/deploy/box/templates/tunnel-egress.yaml.tmpl +11 -0
- data/lib/hecks/projections/deploy/box/templates/writable-secrets.yaml.tmpl +7 -0
- data/lib/hecks/projections/deploy/box.rb +33 -493
- data/lib/hecks/projections/deploy/fargate/assembly.rb +13 -142
- data/lib/hecks/projections/deploy/fargate/cdn/behaviors.rb +76 -0
- data/lib/hecks/projections/deploy/fargate/cdn/lines.rb +112 -0
- data/lib/hecks/projections/deploy/fargate/cdn/options.rb +85 -0
- data/lib/hecks/projections/deploy/fargate/cdn.rb +23 -215
- data/lib/hecks/projections/deploy/fargate/check.rb +16 -6
- data/lib/hecks/projections/deploy/fargate/containers/definition_lines.rb +61 -0
- data/lib/hecks/projections/deploy/fargate/containers/reading.rb +86 -0
- data/lib/hecks/projections/deploy/fargate/containers/rendering.rb +132 -0
- data/lib/hecks/projections/deploy/fargate/containers/routing.rb +93 -0
- data/lib/hecks/projections/deploy/fargate/containers.rb +10 -286
- data/lib/hecks/projections/deploy/fargate/extras/reading.rb +90 -0
- data/lib/hecks/projections/deploy/fargate/extras/rendering.rb +81 -0
- data/lib/hecks/projections/deploy/fargate/extras.rb +9 -158
- data/lib/hecks/projections/deploy/fargate/monitoring/alarms.rb +115 -0
- data/lib/hecks/projections/deploy/fargate/monitoring/reading.rb +84 -0
- data/lib/hecks/projections/deploy/fargate/monitoring/topic.rb +59 -0
- data/lib/hecks/projections/deploy/fargate/monitoring/warmer.rb +90 -0
- data/lib/hecks/projections/deploy/fargate/monitoring/warmer_roles.rb +76 -0
- data/lib/hecks/projections/deploy/fargate/monitoring.rb +14 -348
- data/lib/hecks/projections/deploy/fargate/sections.rb +115 -0
- data/lib/hecks/projections/deploy/fargate/settings/ids.rb +55 -0
- data/lib/hecks/projections/deploy/fargate/settings/tuning.rb +77 -0
- data/lib/hecks/projections/deploy/fargate/settings.rb +17 -104
- data/lib/hecks/projections/deploy/fargate/stack/blocks.rb +91 -0
- data/lib/hecks/projections/deploy/fargate/stack/readers.rb +87 -0
- data/lib/hecks/projections/deploy/fargate/stack/recipes.rb +106 -0
- data/lib/hecks/projections/deploy/fargate/stack.rb +146 -0
- data/lib/hecks/projections/deploy/fargate/task_sections.rb +56 -0
- data/lib/hecks/projections/deploy/fargate/yaml.rb +1 -1
- data/lib/hecks/projections/deploy/fargate.rb +51 -756
- data/lib/hecks/projections/deploy/lambda/pii.rb +49 -0
- data/lib/hecks/projections/deploy/lambda/stack/blocks.rb +118 -0
- data/lib/hecks/projections/deploy/lambda/stack/checks.rb +64 -0
- data/lib/hecks/projections/deploy/lambda/stack/deploy_chain.rb +119 -0
- data/lib/hecks/projections/deploy/lambda/stack/readers.rb +62 -0
- data/lib/hecks/projections/deploy/lambda/stack/reading.rb +170 -0
- data/lib/hecks/projections/deploy/lambda/stack/reading_web.rb +53 -0
- data/lib/hecks/projections/deploy/lambda/stack/recipes.rb +112 -0
- data/lib/hecks/projections/deploy/lambda/stack/web.rb +57 -0
- data/lib/hecks/projections/deploy/lambda/stack.rb +54 -0
- data/lib/hecks/projections/deploy/lambda.rb +77 -1885
- data/lib/hecks/projections/deploy/preview/access_yaml.rb +8 -74
- data/lib/hecks/projections/deploy/preview/containers.rb +18 -7
- data/lib/hecks/projections/deploy/preview/routing_yaml.rb +15 -87
- data/lib/hecks/projections/deploy/preview/settings.rb +7 -4
- data/lib/hecks/projections/deploy/preview/task_yaml.rb +42 -106
- data/lib/hecks/projections/deploy/preview/template.rb +11 -106
- data/lib/hecks/projections/deploy/preview/yaml_text.rb +1 -1
- data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts/settings.rb +14 -6
- data/lib/hecks/projections/deploy/scripts.rb +11 -9
- data/lib/hecks/projections/deploy/shared/rows.rb +48 -0
- data/lib/hecks/projections/deploy/shared.rb +89 -449
- data/lib/hecks/projections/deploy/smoke.rb +15 -10
- data/lib/hecks/projections/deploy/template_diff/comparer.rb +21 -147
- data/lib/hecks/projections/deploy/template_diff/normalizer.rb +60 -0
- data/lib/hecks/projections/deploy/template_diff/value_diff.rb +136 -0
- data/lib/hecks/projections/deploy/template_diff.rb +8 -3
- data/lib/hecks/projections/deploy/templates/fargate/Dockerfile.tmpl +28 -0
- data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +63 -0
- data/lib/hecks/projections/deploy/templates/fargate/always_params.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/fargate/deploy_plain.tmpl +1 -0
- data/lib/hecks/projections/deploy/templates/fargate/deploy_shared.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/fargate/mint_era_own.tmpl +44 -0
- data/lib/hecks/projections/deploy/templates/fargate/mint_era_shared.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/fargate/missing_owner.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/fargate/oauth_params.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/fargate/oauth_task_env.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/fargate/oauth_task_policy.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/fargate/owning_params.tmpl +33 -0
- data/lib/hecks/projections/deploy/templates/fargate/template.yaml.tmpl +281 -0
- data/lib/hecks/projections/deploy/templates/lambda/Makefile.tmpl +218 -0
- data/lib/hecks/projections/deploy/templates/lambda/aurora_depends.tmpl +18 -0
- data/lib/hecks/projections/deploy/templates/lambda/build_dispatch_none.tmpl +10 -0
- data/lib/hecks/projections/deploy/templates/lambda/build_pg.tmpl +15 -0
- data/lib/hecks/projections/deploy/templates/lambda/build_plain.tmpl +2 -0
- data/lib/hecks/projections/deploy/templates/lambda/build_web.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/lambda/env_blind_guard.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/lambda/mint_era_own.tmpl +122 -0
- data/lib/hecks/projections/deploy/templates/lambda/mint_era_shared.tmpl +47 -0
- data/lib/hecks/projections/deploy/templates/lambda/missing_owner.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/lambda/nat_comment_oauth.tmpl +14 -0
- data/lib/hecks/projections/deploy/templates/lambda/nat_comment_plain.tmpl +3 -0
- data/lib/hecks/projections/deploy/templates/lambda/oauth_note.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/lambda/params_oauth.tmpl +13 -0
- data/lib/hecks/projections/deploy/templates/lambda/params_shared.tmpl +33 -0
- data/lib/hecks/projections/deploy/templates/lambda/pg_native.tmpl +71 -0
- data/lib/hecks/projections/deploy/templates/lambda/pii_oac.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/lambda/pii_permission.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/lambda/pii_resources.tmpl +116 -0
- data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge.tmpl +30 -0
- data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge_oauth.tmpl +12 -0
- data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge_plain.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/lambda/rename_schema_own.tmpl +93 -0
- data/lib/hecks/projections/deploy/templates/lambda/rename_schema_shared.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/lambda/rust_oauth_env.tmpl +17 -0
- data/lib/hecks/projections/deploy/templates/lambda/rust_oauth_policy.tmpl +16 -0
- data/lib/hecks/projections/deploy/templates/lambda/rust_session_secret.tmpl +13 -0
- data/lib/hecks/projections/deploy/templates/lambda/samconfig.toml.tmpl +12 -0
- data/lib/hecks/projections/deploy/templates/lambda/shared_note.tmpl +6 -0
- data/lib/hecks/projections/deploy/templates/lambda/sync_oauth.tmpl +23 -0
- data/lib/hecks/projections/deploy/templates/lambda/template.yaml.tmpl +187 -0
- data/lib/hecks/projections/deploy/templates/lambda/translation_own.tmpl +46 -0
- data/lib/hecks/projections/deploy/templates/lambda/translation_shared.tmpl +2 -0
- data/lib/hecks/projections/deploy/templates/lambda/web_function.tmpl +207 -0
- data/lib/hecks/projections/deploy/templates/lambda/web_google_oauth_env.tmpl +12 -0
- data/lib/hecks/projections/deploy/templates/lambda/web_no_oauth_env.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/lambda/web_oauth_policy.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/lambda/webhook_secret_resource.tmpl +20 -0
- data/lib/hecks/projections/deploy/templates/preview/alb.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/preview/alb_security_group.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/preview/assume_role.tmpl +6 -0
- data/lib/hecks/projections/deploy/templates/preview/base_parameters.tmpl +24 -0
- data/lib/hecks/projections/deploy/templates/preview/cluster.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/preview/container_secret.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/preview/db_init_script.sh.tmpl +23 -0
- data/lib/hecks/projections/deploy/templates/preview/db_init_secrets.tmpl +5 -0
- data/lib/hecks/projections/deploy/templates/preview/db_init_task.tmpl +39 -0
- data/lib/hecks/projections/deploy/templates/preview/desired_count.tmpl +5 -0
- data/lib/hecks/projections/deploy/templates/preview/distribution.tmpl +24 -0
- data/lib/hecks/projections/deploy/templates/preview/execution_role.tmpl +16 -0
- data/lib/hecks/projections/deploy/templates/preview/header.tmpl +16 -0
- data/lib/hecks/projections/deploy/templates/preview/ingress.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/preview/listener.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/preview/listener_rule.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/preview/log_group.tmpl +5 -0
- data/lib/hecks/projections/deploy/templates/preview/log_options.tmpl +5 -0
- data/lib/hecks/projections/deploy/templates/preview/outputs.tmpl +14 -0
- data/lib/hecks/projections/deploy/templates/preview/service.tmpl +17 -0
- data/lib/hecks/projections/deploy/templates/preview/session_secret.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/preview/target_group.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/preview/task_definition.tmpl +15 -0
- data/lib/hecks/projections/deploy/templates/preview/task_role.tmpl +22 -0
- data/lib/hecks/projections/deploy/templates/shared/aurora_db.tmpl +52 -0
- data/lib/hecks/projections/deploy/templates/shared/bastion.tmpl +74 -0
- data/lib/hecks/projections/deploy/templates/shared/bastion_own_public.tmpl +41 -0
- data/lib/hecks/projections/deploy/templates/shared/bastion_reuse_public.tmpl +10 -0
- data/lib/hecks/projections/deploy/templates/shared/nat_gateway.tmpl +102 -0
- data/lib/hecks/projections/deploy/templates/shared/oauth_egress.tmpl +17 -0
- data/lib/hecks/projections/deploy/templates/shared/plain_db.tmpl +16 -0
- data/lib/hecks/projections/deploy/templates/shared/vpc_and_database.tmpl +67 -0
- data/lib/hecks/projections/deploy/text_template.rb +35 -0
- data/lib/hecks/projections/diagrams/dispatch.rb +114 -0
- data/lib/hecks/projections/diagrams/statecharts.rb +59 -0
- data/lib/hecks/projections/diagrams/structure.rb +114 -0
- data/lib/hecks/projections/diagrams.rb +33 -256
- data/lib/hecks/projections/glossary/entries.rb +140 -0
- data/lib/hecks/projections/glossary/html/page.rb +96 -0
- data/lib/hecks/projections/glossary/html/parser.rb +66 -0
- data/lib/hecks/projections/glossary/html/sections.rb +78 -0
- data/lib/hecks/projections/glossary/html.rb +7 -179
- data/lib/hecks/projections/glossary/index.rb +45 -0
- data/lib/hecks/projections/glossary/markdown.rb +22 -11
- data/lib/hecks/projections/glossary/mermaid.rb +44 -31
- data/lib/hecks/projections/glossary/sensitivity.rb +7 -4
- data/lib/hecks/projections/glossary/sentences/value_objects.rb +77 -0
- data/lib/hecks/projections/glossary/sentences.rb +42 -81
- data/lib/hecks/projections/glossary/slugs.rb +33 -0
- data/lib/hecks/projections/glossary.rb +22 -190
- data/lib/hecks/projections/model.rb +20 -14
- data/lib/hecks/projections/rust_vocabulary/arguments/support.rb +33 -0
- data/lib/hecks/projections/rust_vocabulary/arguments.rb +171 -0
- data/lib/hecks/projections/rust_vocabulary/enum_body.rb +114 -0
- data/lib/hecks/projections/rust_vocabulary/tests.rb +144 -0
- data/lib/hecks/projections/rust_vocabulary.rb +24 -293
- data/lib/hecks/projections/site/admin.rb +15 -9
- data/lib/hecks/projections/site/admin_cms/templates/membership.rb +115 -0
- data/lib/hecks/projections/site/admin_cms/templates/session_strategy.rb +90 -0
- data/lib/hecks/projections/site/admin_cms/templates/sso.rb +101 -0
- data/lib/hecks/projections/site/admin_cms/templates/sso_tail.rb +54 -0
- data/lib/hecks/projections/site/admin_cms/templates/users.rb +83 -0
- data/lib/hecks/projections/site/admin_cms/templates.rb +14 -369
- data/lib/hecks/projections/site/admin_cms.rb +15 -9
- data/lib/hecks/projections/site/edge/behaviours.rb +10 -6
- data/lib/hecks/projections/site/edge/checks.rb +30 -80
- data/lib/hecks/projections/site/edge/findings.rb +28 -0
- data/lib/hecks/projections/site/edge/route_checks.rb +110 -0
- data/lib/hecks/projections/site/edge/row_reader.rb +52 -0
- data/lib/hecks/projections/site/edge/rules.rb +28 -26
- data/lib/hecks/projections/site/edge.rb +20 -31
- data/lib/hecks/projections/site/live_edge.rb +9 -7
- data/lib/hecks/projections/site/payload/fields/definitions.rb +90 -0
- data/lib/hecks/projections/site/payload/fields/readers.rb +69 -0
- data/lib/hecks/projections/site/payload/fields.rb +14 -111
- data/lib/hecks/projections/site/payload/lifecycle/text.rb +84 -0
- data/lib/hecks/projections/site/payload/lifecycle/text_tail.rb +106 -0
- data/lib/hecks/projections/site/payload/lifecycle.rb +8 -166
- data/lib/hecks/projections/site/payload/model.rb +22 -22
- data/lib/hecks/projections/site/payload/specs/wire.rb +69 -0
- data/lib/hecks/projections/site/payload/specs.rb +24 -68
- data/lib/hecks/projections/site/payload_driver.rb +19 -17
- data/lib/hecks/projections/site/root_rows.rb +12 -4
- data/lib/hecks/projections/site/routes_ts/helpers.rb +79 -0
- data/lib/hecks/projections/site/routes_ts/listings.rb +75 -0
- data/lib/hecks/projections/site/routes_ts/navigation.rb +79 -0
- data/lib/hecks/projections/site/routes_ts.rb +27 -175
- data/lib/hecks/projections/site/site_admin/access.rb +104 -0
- data/lib/hecks/projections/site/site_admin/session.rb +127 -0
- data/lib/hecks/projections/site/site_admin.rb +12 -219
- data/lib/hecks/projections/site/site_cdn.rb +12 -7
- data/lib/hecks/projections/site/site_host/dockerfile.rb +75 -0
- data/lib/hecks/projections/site/site_host/templates.rb +7 -63
- data/lib/hecks/projections/site/site_root/workflow.rb +65 -0
- data/lib/hecks/projections/site/site_root.rb +3 -54
- data/lib/hecks/projections/site/table/checks.rb +28 -57
- data/lib/hecks/projections/site/table/link_builder.rb +14 -5
- data/lib/hecks/projections/site/table/navigation_checks.rb +75 -0
- data/lib/hecks/projections/site/table/row_builder.rb +31 -53
- data/lib/hecks/projections/site/table/row_defaults.rb +65 -0
- data/lib/hecks/projections/site/table.rb +9 -5
- data/lib/hecks/projections/vocabulary.rb +34 -31
- data/lib/hecks/projector/cli_audience.rb +42 -0
- data/lib/hecks/projector/cli_projector/claims.rb +149 -0
- data/lib/hecks/projector/cli_projector/command_help.rb +65 -0
- data/lib/hecks/projector/cli_projector/command_specs.rb +133 -0
- data/lib/hecks/projector/cli_projector/listing.rb +100 -0
- data/lib/hecks/projector/cli_projector/option_specs.rb +116 -0
- data/lib/hecks/projector/cli_projector/query_specs.rb +67 -0
- data/lib/hecks/projector/cli_projector/usage.rb +101 -0
- data/lib/hecks/projector/cli_projector.rb +15 -532
- data/lib/hecks/projector/docs_projector/attributes.rb +78 -0
- data/lib/hecks/projector/docs_projector/behaviour.rb +127 -0
- data/lib/hecks/projector/docs_projector/closing.rb +40 -0
- data/lib/hecks/projector/docs_projector.rb +58 -192
- data/lib/hecks/projector/exporter/bindings.rb +174 -0
- data/lib/hecks/projector/exporter/translations.rb +127 -0
- data/lib/hecks/projector/exporter.rb +8 -279
- data/lib/hecks/projector/narrate_projector/commands.rb +108 -0
- data/lib/hecks/projector/narrate_projector/reactions.rb +33 -0
- data/lib/hecks/projector/narrate_projector.rb +60 -160
- data/lib/hecks/projector.rb +22 -13
- data/lib/hecks/quality_control/adapters/agent_profile.rb +25 -16
- data/lib/hecks/quality_control/adapters/github_checks.rb +42 -6
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +1 -1
- data/lib/hecks/quality_control/adapters/github_issues.rb +22 -10
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/parsing.rb +54 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/reporting.rb +44 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/scanning.rb +119 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +28 -155
- data/lib/hecks/quality_control/cli/qa_domain_novelty/verdict.rb +76 -0
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +33 -66
- data/lib/hecks/quality_control/cli/qa_generated_domains/arguments.rb +62 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/blueprints.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/evaluation.rb +107 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +107 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/reporting.rb +97 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/shrinking.rb +70 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains.rb +43 -327
- data/lib/hecks/quality_control/cli/qa_log_bug/arguments.rb +55 -0
- data/lib/hecks/quality_control/cli/qa_log_bug/proof.rb +65 -0
- data/lib/hecks/quality_control/cli/qa_log_bug.rb +18 -81
- data/lib/hecks/quality_control/cli/qa_mine_combinations/arguments.rb +54 -0
- data/lib/hecks/quality_control/cli/qa_mine_combinations/booting.rb +96 -0
- data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +45 -109
- data/lib/hecks/quality_control/cli/qa_open_pr/arguments.rb +55 -0
- data/lib/hecks/quality_control/cli/qa_open_pr/recording.rb +79 -0
- data/lib/hecks/quality_control/cli/qa_open_pr/rules.rb +122 -0
- data/lib/hecks/quality_control/cli/qa_open_pr.rb +41 -200
- data/lib/hecks/quality_control/cli/qa_postgres_migrate/copying.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_postgres_migrate/reporting.rb +33 -0
- data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +37 -63
- data/lib/hecks/quality_control/cli/qa_postgres_role/ownership.rb +57 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +66 -71
- data/lib/hecks/quality_control/cli/qa_pr_check/checking.rb +118 -0
- data/lib/hecks/quality_control/cli/qa_pr_check/reporting.rb +54 -0
- data/lib/hecks/quality_control/cli/qa_pr_check.rb +28 -145
- data/lib/hecks/quality_control/cli/qa_seed_angles/seed.rb +80 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles.rb +13 -86
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode/children.rb +80 -0
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode/report.rb +125 -0
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +63 -193
- data/lib/hecks/quality_control/cli/qa_sweep/checks/boundary.rb +92 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks/engines.rb +92 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks/seeds.rb +86 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks/shrinking.rb +69 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +10 -248
- data/lib/hecks/quality_control/cli/qa_sweep/conclusion.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_sweep/depth.rb +61 -0
- data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +26 -13
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report/shrunk.rb +42 -0
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +40 -41
- data/lib/hecks/quality_control/cli/qa_sweep/parsing/validation.rb +70 -0
- data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +35 -65
- data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +41 -22
- data/lib/hecks/quality_control/cli/qa_sweep/scratch.rb +67 -0
- data/lib/hecks/quality_control/cli/qa_sweep/seat.rb +94 -0
- data/lib/hecks/quality_control/cli/qa_sweep/seed_loop.rb +149 -0
- data/lib/hecks/quality_control/cli/qa_sweep/target_setup.rb +115 -0
- data/lib/hecks/quality_control/cli/qa_sweep.rb +22 -445
- data/lib/hecks/quality_control/cli/qa_tick/output.rb +107 -0
- data/lib/hecks/quality_control/cli/qa_tick/preflight.rb +95 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +42 -175
- data/lib/hecks/query_ir/formatting.rb +86 -0
- data/lib/hecks/query_ir/rules.rb +132 -0
- data/lib/hecks/query_ir/touchpoints.rb +104 -0
- data/lib/hecks/query_ir.rb +33 -281
- data/lib/hecks/query_ir_mcp/tools.rb +68 -0
- data/lib/hecks/query_ir_mcp.rb +27 -71
- data/lib/hecks/query_specification/common/comparison.rb +25 -5
- data/lib/hecks/query_specification/common/dsl.rb +1 -1
- data/lib/hecks/query_specification/common/null_policy.rb +9 -6
- data/lib/hecks/query_specification/common/options.rb +21 -14
- data/lib/hecks/query_specification/field_path.rb +5 -2
- data/lib/hecks/query_specification/hop_path.rb +15 -18
- data/lib/hecks/release/lane.rb +22 -0
- data/lib/hecks/release/runner/clean_tree.rb +2 -2
- data/lib/hecks/release/runner/commands.rb +1 -1
- data/lib/hecks/release/runner/options.rb +82 -0
- data/lib/hecks/release/runner/preflight.rb +12 -7
- data/lib/hecks/release/runner/publishing.rb +86 -0
- data/lib/hecks/release/runner/tagger.rb +8 -3
- data/lib/hecks/release/runner.rb +40 -156
- data/lib/hecks/rendering.rb +13 -9
- data/lib/hecks/router/door.rb +37 -0
- data/lib/hecks/router/namespace_installer.rb +45 -83
- data/lib/hecks/router/options_proxy.rb +44 -0
- data/lib/hecks/runtime/adapter_lookup.rb +45 -24
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -8
- data/lib/hecks/runtime/command_interpreter/delegation.rb +116 -0
- data/lib/hecks/runtime/command_interpreter/enforcement.rb +38 -0
- data/lib/hecks/runtime/command_interpreter/hydration.rb +139 -0
- data/lib/hecks/runtime/command_interpreter/list_mutations.rb +98 -0
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +67 -114
- data/lib/hecks/runtime/command_interpreter/persisting.rb +96 -0
- data/lib/hecks/runtime/command_interpreter.rb +57 -352
- data/lib/hecks/runtime/command_rules/admissibility.rb +64 -147
- data/lib/hecks/runtime/command_rules/arithmetic.rb +13 -72
- data/lib/hecks/runtime/command_rules/authorization.rb +9 -9
- data/lib/hecks/runtime/command_rules/emission.rb +13 -14
- data/lib/hecks/runtime/command_rules/guard_state.rb +49 -0
- data/lib/hecks/runtime/command_rules/invariants.rb +84 -0
- data/lib/hecks/runtime/command_rules/operands.rb +88 -0
- data/lib/hecks/runtime/command_rules/references.rb +59 -57
- data/lib/hecks/runtime/command_rules/tenant_boundary.rb +69 -0
- data/lib/hecks/runtime/dependency_planning/analyzer.rb +90 -0
- data/lib/hecks/runtime/dependency_planning/expression_reads.rb +73 -0
- data/lib/hecks/runtime/dependency_planning/mutation_analysis.rb +89 -0
- data/lib/hecks/runtime/dependency_planning/rule_analysis.rb +82 -0
- data/lib/hecks/runtime/dependency_planning.rb +3 -250
- data/lib/hecks/runtime/dispatcher/queries.rb +62 -0
- data/lib/hecks/runtime/dispatcher/result.rb +55 -0
- data/lib/hecks/runtime/dispatcher/routing.rb +107 -0
- data/lib/hecks/runtime/dispatcher.rb +64 -209
- data/lib/hecks/runtime/entity_element/location.rb +124 -0
- data/lib/hecks/runtime/entity_element/mutations.rb +150 -0
- data/lib/hecks/runtime/entity_element.rb +5 -177
- data/lib/hecks/runtime/entity_interpreter/enforcement.rb +51 -0
- data/lib/hecks/runtime/entity_interpreter/locating.rb +62 -0
- data/lib/hecks/runtime/entity_interpreter/resolution.rb +42 -0
- data/lib/hecks/runtime/entity_interpreter/saving.rb +49 -0
- data/lib/hecks/runtime/entity_interpreter.rb +45 -164
- data/lib/hecks/runtime/identity.rb +15 -9
- data/lib/hecks/runtime/instance.rb +11 -7
- data/lib/hecks/runtime/interpreting.rb +16 -8
- data/lib/hecks/runtime/invocation.rb +3 -155
- data/lib/hecks/runtime/invocation_builder.rb +132 -0
- data/lib/hecks/runtime/invocation_facts.rb +87 -0
- data/lib/hecks/runtime/loader/boot_steps.rb +96 -0
- data/lib/hecks/runtime/loader/described.rb +27 -0
- data/lib/hecks/runtime/loader.rb +27 -114
- data/lib/hecks/runtime/outbox/consumer_runner.rb +40 -0
- data/lib/hecks/runtime/outbox/fanout.rb +82 -0
- data/lib/hecks/runtime/outbox/relay.rb +149 -0
- data/lib/hecks/runtime/outbox.rb +3 -214
- data/lib/hecks/runtime/policy_interpreter/arguments.rb +67 -0
- data/lib/hecks/runtime/policy_interpreter/fan_out.rb +96 -0
- data/lib/hecks/runtime/policy_interpreter.rb +22 -137
- data/lib/hecks/runtime/port_operation_interpreter.rb +18 -17
- data/lib/hecks/runtime/query_interpreter/arguments.rb +51 -0
- data/lib/hecks/runtime/query_interpreter/entity_rows.rb +82 -0
- data/lib/hecks/runtime/query_interpreter/outside_answer.rb +89 -0
- data/lib/hecks/runtime/query_interpreter.rb +43 -191
- data/lib/hecks/runtime/reaction_invocation/identities.rb +92 -0
- data/lib/hecks/runtime/reaction_invocation/target_resolution.rb +88 -0
- data/lib/hecks/runtime/reaction_invocation.rb +66 -183
- data/lib/hecks/runtime/reaction_outcome.rb +7 -3
- data/lib/hecks/runtime/read_model_interpreter/head_ordering.rb +49 -0
- data/lib/hecks/runtime/read_model_interpreter/reductions.rb +123 -0
- data/lib/hecks/runtime/read_model_interpreter/shaping.rb +100 -0
- data/lib/hecks/runtime/read_model_interpreter.rb +71 -214
- data/lib/hecks/runtime/reference_hop.rb +11 -11
- data/lib/hecks/runtime/refusal_wording.rb +11 -8
- data/lib/hecks/runtime/registry/chapter_verification.rb +84 -0
- data/lib/hecks/runtime/registry/declarations.rb +17 -0
- data/lib/hecks/runtime/registry/durability_warnings.rb +71 -0
- data/lib/hecks/runtime/registry/hecksagon_rules.rb +124 -0
- data/lib/hecks/runtime/registry/merging.rb +49 -0
- data/lib/hecks/runtime/registry/providers.rb +139 -0
- data/lib/hecks/runtime/registry/query_verification.rb +144 -0
- data/lib/hecks/runtime/registry/read_repository.rb +61 -0
- data/lib/hecks/runtime/registry/runtime_state.rb +27 -0
- data/lib/hecks/runtime/registry/saga_persistence.rb +12 -8
- data/lib/hecks/runtime/registry/verification.rb +45 -389
- data/lib/hecks/runtime/registry/world_defaults.rb +3 -3
- data/lib/hecks/runtime/registry.rb +58 -296
- data/lib/hecks/runtime/remote_dispatcher.rb +47 -31
- data/lib/hecks/runtime/saga_interpreter/compensation.rb +90 -0
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +19 -10
- data/lib/hecks/runtime/saga_interpreter/delivery.rb +147 -0
- data/lib/hecks/runtime/saga_interpreter/lifecycle.rb +63 -0
- data/lib/hecks/runtime/saga_interpreter/transitions.rb +112 -0
- data/lib/hecks/runtime/saga_interpreter.rb +41 -320
- data/lib/hecks/runtime/tenant_check.rb +14 -9
- data/lib/hecks/runtime/value/admission.rb +28 -19
- data/lib/hecks/runtime/value/coercion.rb +55 -404
- data/lib/hecks/runtime/value/entity_list_coercion.rb +27 -29
- data/lib/hecks/runtime/value/field_checks.rb +57 -100
- data/lib/hecks/runtime/value/flags.rb +65 -0
- data/lib/hecks/runtime/value/identifiers.rb +64 -0
- data/lib/hecks/runtime/value/references.rb +195 -0
- data/lib/hecks/runtime/value/shape_checks.rb +61 -0
- data/lib/hecks/runtime/value/validation.rb +125 -0
- data/lib/hecks/runtime/value.rb +18 -6
- data/lib/hecks/rust_build/conformance/surface.rb +75 -0
- data/lib/hecks/rust_build/conformance.rb +27 -59
- data/lib/hecks/rust_build/conformance_fuzz.rb +26 -15
- data/lib/hecks/rust_build/coverage.rb +32 -104
- data/lib/hecks/rust_build/coverage_parts/expected.rb +68 -0
- data/lib/hecks/rust_build/coverage_parts/printer.rb +75 -0
- data/lib/hecks/rust_build/host.rb +23 -13
- data/lib/hecks/rust_build/kernel_input.rb +19 -12
- data/lib/hecks/rust_build/native_build.rb +19 -15
- data/lib/hecks/rust_build/project_rust/domain_loader.rb +75 -0
- data/lib/hecks/rust_build/project_rust/root_mod/notes.rb +66 -0
- data/lib/hecks/rust_build/project_rust/root_mod.rb +22 -55
- data/lib/hecks/rust_build/project_rust/target_ir.rb +74 -0
- data/lib/hecks/rust_build/project_rust.rb +21 -89
- data/lib/hecks/rust_build/wasm.rb +11 -4
- data/lib/hecks/rust_build/wasm_browser.rb +7 -7
- data/lib/hecks/rust_build/write_if_changed.rb +3 -6
- data/lib/hecks/rust_build.rb +7 -3
- data/lib/hecks/storehouse/audit.rb +106 -0
- data/lib/hecks/storehouse/callers.rb +73 -0
- data/lib/hecks/storehouse/dispatching.rb +149 -0
- data/lib/hecks/storehouse/introspection.rb +145 -0
- data/lib/hecks/storehouse/querying.rb +78 -0
- data/lib/hecks/storehouse.rb +43 -451
- data/lib/hecks/tickets/bluebook/tickets.bluebook +29 -0
- data/lib/hecks/tools/argument_gate_matrix/dispatching.rb +69 -0
- data/lib/hecks/tools/argument_gate_matrix/rows.rb +121 -0
- data/lib/hecks/tools/argument_gate_matrix/violations.rb +108 -0
- data/lib/hecks/tools/argument_gate_matrix.rb +43 -212
- data/lib/hecks/tools/ci_gate_decision.rb +21 -14
- data/lib/hecks/tools/ci_gates.rb +40 -26
- data/lib/hecks/tools/comment_style/baseline.rb +41 -0
- data/lib/hecks/tools/comment_style/caps_words.rb +104 -0
- data/lib/hecks/tools/comment_style/cli.rb +121 -0
- data/lib/hecks/tools/comment_style/dictionary.rb +60 -0
- data/lib/hecks/tools/comment_style/fixing.rb +119 -0
- data/lib/hecks/tools/comment_style/long_blocks.rb +51 -0
- data/lib/hecks/tools/comment_style/masking.rb +94 -0
- data/lib/hecks/tools/comment_style/patterns.rb +61 -0
- data/lib/hecks/tools/comment_style/run.rb +161 -0
- data/lib/hecks/tools/comment_style/signature.rb +59 -0
- data/lib/hecks/tools/comment_style/source_file.rb +105 -0
- data/lib/hecks/tools/comment_style/structure_checks.rb +113 -0
- data/lib/hecks/tools/comment_style/text_checks.rb +67 -0
- data/lib/hecks/tools/comment_style/vocabulary.rb +55 -0
- data/lib/hecks/tools/comment_style/walker.rb +136 -0
- data/lib/hecks/tools/comment_style.rb +17 -1000
- data/lib/hecks/tools/corpus_report.rb +26 -16
- data/lib/hecks/tools/deploy_recipe/targets.rb +61 -0
- data/lib/hecks/tools/deploy_recipe/worlds.rb +114 -0
- data/lib/hecks/tools/deploy_recipe.rb +60 -174
- data/lib/hecks/tools/deploy_recipe_lint/checks.rb +78 -0
- data/lib/hecks/tools/deploy_recipe_lint/fixtures.rb +88 -0
- data/lib/hecks/tools/deploy_recipe_lint/makefile.rb +84 -0
- data/lib/hecks/tools/deploy_recipe_lint.rb +29 -192
- data/lib/hecks/tools/drop_implicit_append_fields.rb +20 -12
- data/lib/hecks/tools/era_projection_backfill.rb +50 -33
- data/lib/hecks/tools/era_reattest/reporting.rb +55 -0
- data/lib/hecks/tools/era_reattest.rb +32 -43
- data/lib/hecks/tools/evolve_run/arguments.rb +49 -0
- data/lib/hecks/tools/evolve_run/words.rb +60 -0
- data/lib/hecks/tools/evolve_run.rb +43 -90
- data/lib/hecks/tools/fuzz_sweep/findings.rb +106 -0
- data/lib/hecks/tools/fuzz_sweep/options.rb +69 -0
- data/lib/hecks/tools/fuzz_sweep/pool.rb +74 -0
- data/lib/hecks/tools/fuzz_sweep/reporting.rb +88 -0
- data/lib/hecks/tools/fuzz_sweep.rb +75 -273
- data/lib/hecks/tools/gate.rb +31 -16
- data/lib/hecks/tools/heki_compaction.rb +63 -42
- data/lib/hecks/tools/hoist_local_givens/rewriting.rb +119 -0
- data/lib/hecks/tools/hoist_local_givens.rb +89 -157
- data/lib/hecks/tools/journal_compaction.rb +40 -31
- data/lib/hecks/tools/lanes/files.rb +82 -0
- data/lib/hecks/tools/lanes/live.rb +41 -0
- data/lib/hecks/tools/lanes/rows.rb +45 -0
- data/lib/hecks/tools/lanes/ruleset.rb +44 -0
- data/lib/hecks/tools/lanes/watch_workflow.rb +82 -0
- data/lib/hecks/tools/lanes/workflow.rb +79 -0
- data/lib/hecks/tools/lanes.rb +71 -0
- data/lib/hecks/tools/oidc_manifests.rb +10 -9
- data/lib/hecks/tools/query_ir_run.rb +7 -3
- data/lib/hecks/tools/regeneration_run.rb +40 -26
- data/lib/hecks/tools/rust_comment_style/caps_words.rb +98 -0
- data/lib/hecks/tools/rust_comment_style/fixing.rb +102 -0
- data/lib/hecks/tools/rust_comment_style/masking.rb +85 -0
- data/lib/hecks/tools/rust_comment_style/run.rb +94 -0
- data/lib/hecks/tools/rust_comment_style/source_file.rb +71 -0
- data/lib/hecks/tools/rust_comment_style/structure.rb +79 -0
- data/lib/hecks/tools/rust_comment_style/text_checks.rb +63 -0
- data/lib/hecks/tools/rust_comment_style/tokenizer.rb +102 -0
- data/lib/hecks/tools/rust_comment_style.rb +38 -535
- data/lib/hecks/tools/sequence_script.rb +20 -14
- data/lib/hecks/tools/site_routes/cli.rb +70 -0
- data/lib/hecks/tools/site_routes/root_files.rb +59 -0
- data/lib/hecks/tools/site_routes/templates.rb +77 -0
- data/lib/hecks/tools/site_routes.rb +84 -160
- data/lib/hecks/tools/tail_merge.rb +45 -37
- data/lib/hecks/tools/tenant_provisioning.rb +45 -31
- data/lib/hecks/tools/tools_doc.rb +42 -19
- data/lib/hecks/tools/translation_audit/domain_loading.rb +71 -0
- data/lib/hecks/tools/translation_audit/edges.rb +71 -0
- data/lib/hecks/tools/translation_audit/verdicts.rb +107 -0
- data/lib/hecks/tools/translation_audit.rb +30 -161
- data/lib/hecks/tools/translation_scaffold/reporting.rb +40 -0
- data/lib/hecks/tools/translation_scaffold.rb +77 -60
- data/lib/hecks/tools.rb +1 -0
- data/lib/hecks/vendoring.rb +37 -11
- data/lib/hecks/version.rb +1 -1
- data/lib/hecks/vocabulary.rb +16 -1
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +7 -9
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +8 -6
- data/rust/.cargo/mutants.toml +8 -0
- data/rust/host/Cargo.toml +5 -0
- data/rust/host/HECKS_RELEASE +1 -1
- data/rust/host/src/auth.rs +32 -0
- data/rust/host/src/web.rs +2 -3
- data/rust/src/kernel/dispatch.rs +4 -0
- data/rust/src/kernel/dispatch_guard_tests.rs +506 -0
- data/rust/src/kernel/orchestrate.rs +4 -0
- data/rust/src/kernel/orchestrate_guard_tests.rs +708 -0
- metadata +591 -3
- /data/lib/hecks/bluebook/behaviour/{hexagon.rb → hecksagon.rb} +0 -0
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
require "forwardable"
|
|
2
|
+
require_relative "registry/declarations"
|
|
3
|
+
require_relative "registry/runtime_state"
|
|
4
|
+
require_relative "registry/providers"
|
|
5
|
+
require_relative "registry/merging"
|
|
6
|
+
require_relative "registry/read_repository"
|
|
1
7
|
require_relative "registry/verification"
|
|
2
8
|
require_relative "registry/saga_persistence"
|
|
3
9
|
require_relative "registry/world_defaults"
|
|
@@ -13,61 +19,47 @@ module Hecks
|
|
|
13
19
|
# The collections a boot gathers: bluebooks, hecksagons, ports, adapters, worlds, and logs.
|
|
14
20
|
# Wiring verification, saga persistence, and world defaults live under registry/.
|
|
15
21
|
class Registry
|
|
22
|
+
extend Forwardable
|
|
23
|
+
|
|
16
24
|
include Verification
|
|
17
25
|
include SagaPersistence
|
|
18
26
|
include WorldDefaults
|
|
27
|
+
include Providers
|
|
28
|
+
include Merging
|
|
29
|
+
include ReadRepository
|
|
19
30
|
|
|
20
31
|
# The thread-local key under which open reaction collections are kept.
|
|
21
32
|
REACTION_SINKS = :hecks_reaction_sinks
|
|
22
33
|
|
|
23
|
-
attr_reader :root, :
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
attr_reader :root, :saga_mutex
|
|
35
|
+
|
|
36
|
+
# What a boot gathers, and what a dispatch produces; each is held by `Declarations` or
|
|
37
|
+
# `RuntimeState` and read through the registry.
|
|
38
|
+
def_delegators :@declared, :bluebooks, :hecksagons, :ports, :adapters, :worlds, :translations,
|
|
39
|
+
:bluebook_sources, :pending_privacy_markings
|
|
40
|
+
def_delegators :@state, :event_log, :reaction_log, :saga_log, :saga_instances,
|
|
41
|
+
:saga_dispatch_log, :policy_dispatch_log
|
|
27
42
|
|
|
28
43
|
# @param root [String, nil] the booting project's root directory, the base
|
|
29
44
|
# a shared ports/adapters root and a `.world`'s own relative paths resolve
|
|
30
45
|
# against; nil for a registry with no such root
|
|
31
46
|
def initialize(root: nil)
|
|
32
47
|
@root = root
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
@
|
|
39
|
-
|
|
40
|
-
@
|
|
41
|
-
@event_log = []
|
|
42
|
-
@reaction_log = []
|
|
43
|
-
@reaction_events = {}.compare_by_identity
|
|
44
|
-
@saga_log = []
|
|
45
|
-
# Recorded at hecksagon-build time (AggregateDoor#mark_sensitive); Loader.boot's
|
|
46
|
-
# post-dispatch step turns each entry into a real Privacy::Marking.Mark, idempotently.
|
|
47
|
-
@pending_privacy_markings = []
|
|
48
|
-
# Ruby-only; unlike saga_log/reaction_log (ported byte-for-byte to
|
|
49
|
-
# rust/src/kernel/orchestrate.rs, per spec/rust_conformance_spec.rb), these carry
|
|
50
|
-
# the raw dispatch-binding inputs Properties.dispatch_binding_fidelity re-derives.
|
|
51
|
-
@saga_dispatch_log = []
|
|
52
|
-
@policy_dispatch_log = []
|
|
53
|
-
@saga_instances = Hash.new { |h, k| h[k] = {} }
|
|
48
|
+
# Recorded at hecksagon-build time (AggregateDoor#mark_sensitive), Loader.boot's
|
|
49
|
+
# post-dispatch step turns each pending privacy marking into a real Privacy::Marking.Mark,
|
|
50
|
+
# idempotently. `resolved_eras` and `superseded_eras` are eager, not lazy, so no two
|
|
51
|
+
# dispatching threads race to create them; all writes still happen at boot,
|
|
52
|
+
# single-threaded (EraResolver.check!).
|
|
53
|
+
@declared = Declarations.empty
|
|
54
|
+
# Ruby-only logs and the saga instances, which an `@saga_mutex` guards.
|
|
55
|
+
@state = RuntimeState.fresh
|
|
54
56
|
# Guards saga_instances' mutation+checkpoint sequence together, never held across a
|
|
55
57
|
# saga's own dispatch cascade — Mutex is non-reentrant and recursive re-entry is real.
|
|
56
|
-
@saga_mutex
|
|
58
|
+
@saga_mutex = Mutex.new
|
|
57
59
|
@repositories = {}
|
|
58
60
|
@projection_repositories = {}
|
|
59
|
-
@bluebook_builders = {}
|
|
60
|
-
# Eager, not lazy: avoids a race where two dispatching threads could create this
|
|
61
|
-
# Hash on first access. All writes still happen at boot, single-threaded
|
|
62
|
-
# (EraResolver.check!).
|
|
63
|
-
@resolved_eras = {}
|
|
64
|
-
# domain name -> the ordinal that superseded this boot's era, for an old checkout only.
|
|
65
|
-
# RepositoryFactory.build passes it to PostgresEra#append, which refuses before the
|
|
66
|
-
# INSERT — the in-process half of the era fence. Eager for the same reason as
|
|
67
|
-
# @resolved_eras.
|
|
68
|
-
@superseded_eras = {}
|
|
69
61
|
# Eager: CapabilityGraph.new only stores the registry reference, and eager
|
|
70
|
-
# construction avoids the same first-access race as
|
|
62
|
+
# construction avoids the same first-access race as `resolved_eras` while
|
|
71
63
|
# keeping one instance per registry.
|
|
72
64
|
@capability_graph = CapabilityGraph.new(self)
|
|
73
65
|
# Guards only the lazy per-domain resolution inside @saga_persistence. Must not reuse
|
|
@@ -93,7 +85,7 @@ module Hecks
|
|
|
93
85
|
# @return [Bluebook::DSL::BluebookBuilder] the builder already open for
|
|
94
86
|
# `name`, or the block's freshly minted one on the first call
|
|
95
87
|
def bluebook_builder(name)
|
|
96
|
-
@bluebook_builders[name.to_s] ||= yield
|
|
88
|
+
@declared.bluebook_builders[name.to_s] ||= yield
|
|
97
89
|
end
|
|
98
90
|
|
|
99
91
|
# Boot-time-only, single-threaded: every add_* below runs from Hecks.collect while a
|
|
@@ -104,7 +96,7 @@ module Hecks
|
|
|
104
96
|
#
|
|
105
97
|
# @param item [Bluebook::Chapter] the loaded, judged chapter
|
|
106
98
|
# @return [Bluebook::Chapter] `item`, unchanged
|
|
107
|
-
def add_bluebook(item) = @bluebooks[item.name] = item
|
|
99
|
+
def add_bluebook(item) = @declared.bluebooks[item.name] = item
|
|
108
100
|
|
|
109
101
|
# Drops a chapter and the open builder and source record that accumulated it, so the
|
|
110
102
|
# chapter can be loaded again from nothing.
|
|
@@ -112,9 +104,9 @@ module Hecks
|
|
|
112
104
|
# @param name [String, Symbol] the chapter name to forget
|
|
113
105
|
# @return [void]
|
|
114
106
|
def forget_chapter(name)
|
|
115
|
-
@bluebooks.delete(name.to_s)
|
|
116
|
-
@bluebook_builders.delete(name.to_s)
|
|
117
|
-
@bluebook_sources.delete(name.to_s)
|
|
107
|
+
@declared.bluebooks.delete(name.to_s)
|
|
108
|
+
@declared.bluebook_builders.delete(name.to_s)
|
|
109
|
+
@declared.bluebook_sources.delete(name.to_s)
|
|
118
110
|
end
|
|
119
111
|
|
|
120
112
|
# Tracks which .bluebook file(s) contributed to a chapter name (a boot-time loading
|
|
@@ -125,7 +117,7 @@ module Hecks
|
|
|
125
117
|
# @param path [String] the `.bluebook` file that declared it
|
|
126
118
|
# @return [Array<String>] every path recorded for that chapter, `path` last
|
|
127
119
|
def record_bluebook_source(name, path)
|
|
128
|
-
(@bluebook_sources[name.to_s] ||= []) << path
|
|
120
|
+
(@declared.bluebook_sources[name.to_s] ||= []) << path
|
|
129
121
|
end
|
|
130
122
|
|
|
131
123
|
# Merges into any wiring already registered for the domain rather than replacing it,
|
|
@@ -134,8 +126,8 @@ module Hecks
|
|
|
134
126
|
# @param item [Bluebook::Hecksagon] the declared wiring to register
|
|
135
127
|
# @return [void]
|
|
136
128
|
def add_hecksagon(item)
|
|
137
|
-
existing = @hecksagons[item.domain]
|
|
138
|
-
@hecksagons[item.domain] = existing ? merge_hecksagons(existing, item) : item
|
|
129
|
+
existing = @declared.hecksagons[item.domain]
|
|
130
|
+
@declared.hecksagons[item.domain] = existing ? merge_hecksagons(existing, item) : item
|
|
139
131
|
mark_bounded(item.domain) if item.bounded?
|
|
140
132
|
end
|
|
141
133
|
|
|
@@ -147,7 +139,7 @@ module Hecks
|
|
|
147
139
|
# @param name [String, Symbol] the chapter name to mark bounded
|
|
148
140
|
# @return [void]
|
|
149
141
|
def mark_bounded(name)
|
|
150
|
-
@bounded_chapters[name.to_s] = true
|
|
142
|
+
@declared.bounded_chapters[name.to_s] = true
|
|
151
143
|
end
|
|
152
144
|
|
|
153
145
|
# Says whether `name` is a bounded context — attached via `attaches`, or a consumer
|
|
@@ -155,19 +147,19 @@ module Hecks
|
|
|
155
147
|
#
|
|
156
148
|
# @param name [String, Symbol] the chapter name to check
|
|
157
149
|
# @return [Boolean] whether that chapter is bounded
|
|
158
|
-
def bounded?(name) = @bounded_chapters[name.to_s] ? true : false
|
|
150
|
+
def bounded?(name) = @declared.bounded_chapters[name.to_s] ? true : false
|
|
159
151
|
|
|
160
152
|
# Registers a loaded port, keyed by its own declared name.
|
|
161
153
|
#
|
|
162
154
|
# @param item [Bluebook::Port, Bluebook::DomainPort] the loaded port
|
|
163
155
|
# @return [Bluebook::Port, Bluebook::DomainPort] `item`, unchanged
|
|
164
|
-
def add_port(item) = @ports[item.name] = item
|
|
156
|
+
def add_port(item) = @declared.ports[item.name] = item
|
|
165
157
|
|
|
166
158
|
# Registers a loaded adapter, keyed by its own declared name.
|
|
167
159
|
#
|
|
168
160
|
# @param item [Bluebook::Adapter] the loaded, judged adapter
|
|
169
161
|
# @return [Bluebook::Adapter] `item`, unchanged
|
|
170
|
-
def add_adapter(item) = @adapters[item.name] = item
|
|
162
|
+
def add_adapter(item) = @declared.adapters[item.name] = item
|
|
171
163
|
|
|
172
164
|
# Merges into any world already registered for the domain, the same shape as
|
|
173
165
|
# add_hecksagon. Settings merge shallow, keyed by verb (and "verb:adapter"); an
|
|
@@ -177,8 +169,8 @@ module Hecks
|
|
|
177
169
|
# @param item [Bluebook::World] the declared world settings to register
|
|
178
170
|
# @return [void]
|
|
179
171
|
def add_world(item)
|
|
180
|
-
existing = @worlds[item.domain]
|
|
181
|
-
@worlds[item.domain] = existing ? merge_worlds(existing, item) : item
|
|
172
|
+
existing = @declared.worlds[item.domain]
|
|
173
|
+
@declared.worlds[item.domain] = existing ? merge_worlds(existing, item) : item
|
|
182
174
|
end
|
|
183
175
|
|
|
184
176
|
# Registers a loaded translation.
|
|
@@ -186,7 +178,7 @@ module Hecks
|
|
|
186
178
|
# @param item [Bluebook::Translation] the loaded, judged translation
|
|
187
179
|
# @return [Array<Bluebook::Translation>] every translation registered so far,
|
|
188
180
|
# `item` last
|
|
189
|
-
def add_translation(item) = @translations << item
|
|
181
|
+
def add_translation(item) = @declared.translations << item
|
|
190
182
|
|
|
191
183
|
# Declares one attribute of a domain's aggregate sensitive, called from a terminal
|
|
192
184
|
# has_<category>(readable_by:). Recorded, not dispatched: Loader.boot's
|
|
@@ -201,173 +193,41 @@ module Hecks
|
|
|
201
193
|
# @param readable_by [String] the Governance role a read must hold, unredacted
|
|
202
194
|
# @return [void]
|
|
203
195
|
def add_pending_privacy_marking(domain:, attribute_path:, category:, readable_by:)
|
|
204
|
-
@pending_privacy_markings << { domain: domain, attribute_path: attribute_path,
|
|
205
|
-
|
|
196
|
+
@declared.pending_privacy_markings << { domain: domain, attribute_path: attribute_path,
|
|
197
|
+
category: category, readable_by: readable_by }
|
|
206
198
|
end
|
|
207
199
|
# rubocop:enable Hecks/ThreadSharedIvarMutation
|
|
208
200
|
|
|
209
|
-
# {domain name => era ordinal} resolved by the boot-time era gate
|
|
210
|
-
#
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
# checkout only.
|
|
214
|
-
attr_reader :superseded_eras
|
|
201
|
+
# `resolved_eras` is {domain name => era ordinal} resolved by the boot-time era gate;
|
|
202
|
+
# `superseded_eras` is the domain name -> the ordinal that superseded this boot's own era,
|
|
203
|
+
# for an old checkout only. Stood up eagerly; plain readers, not memoizers.
|
|
204
|
+
def_delegators :@declared, :resolved_eras, :superseded_eras
|
|
215
205
|
|
|
216
206
|
# Finds a loaded chapter by name.
|
|
217
207
|
#
|
|
218
208
|
# @param name [String, Symbol] the chapter's declared name
|
|
219
209
|
# @return [Bluebook::Chapter, nil] the chapter, or nil if none is registered
|
|
220
210
|
# under `name`
|
|
221
|
-
def bluebook(name) = @bluebooks[name.to_s]
|
|
211
|
+
def bluebook(name) = @declared.bluebooks[name.to_s]
|
|
222
212
|
|
|
223
213
|
# Finds a domain's registered wiring by name.
|
|
224
214
|
#
|
|
225
215
|
# @param name [String, Symbol] the domain name
|
|
226
216
|
# @return [Bluebook::Hecksagon, nil] the domain's wiring, or nil if none is
|
|
227
217
|
# registered under `name`
|
|
228
|
-
def hecksagon(name) = @hecksagons[name.to_s]
|
|
218
|
+
def hecksagon(name) = @declared.hecksagons[name.to_s]
|
|
229
219
|
|
|
230
220
|
# Finds a domain's registered world settings by name.
|
|
231
221
|
#
|
|
232
222
|
# @param name [String, Symbol] the domain name
|
|
233
223
|
# @return [Bluebook::World, nil] the domain's world, or nil if none is
|
|
234
224
|
# registered under `name`
|
|
235
|
-
def world(name) = @worlds[name.to_s]
|
|
225
|
+
def world(name) = @declared.worlds[name.to_s]
|
|
236
226
|
|
|
237
227
|
# Every verb every loaded chapter declares, sorted.
|
|
238
228
|
#
|
|
239
229
|
# @return [Array<String>] every declared verb, across every loaded chapter
|
|
240
|
-
def verbs = @bluebooks.values.flat_map(&:verbs).sort
|
|
241
|
-
|
|
242
|
-
# The chapter that answers a role check for `domain`: the domain's own chapter, or
|
|
243
|
-
# a chapter its hecksagon attaches, that declares `provides "authorization"`.
|
|
244
|
-
#
|
|
245
|
-
# @param domain [String, Symbol] the domain whose role checks are being resolved
|
|
246
|
-
# @return [Bluebook::Chapter, nil] the chapter that answers `domain`'s role
|
|
247
|
-
# checks, or nil if none does
|
|
248
|
-
def authorization_provider_for(domain)
|
|
249
|
-
names = [domain.to_s, *Array(hecksagon(domain)&.member_chapters)]
|
|
250
|
-
names.filter_map { |name| bluebook(name) }
|
|
251
|
-
.find { |chapter| chapter.provides?(Bluebook::Capabilities::AUTHORIZATION) }
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
# Every loaded chapter declaring `provides "authorization"`.
|
|
255
|
-
#
|
|
256
|
-
# @return [Array<Bluebook::Chapter>] every loaded chapter that provides
|
|
257
|
-
# authorization
|
|
258
|
-
def authorization_providers
|
|
259
|
-
@bluebooks.values.select { |chapter| chapter.provides?(Bluebook::Capabilities::AUTHORIZATION) }
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
# The chapter that answers "who is this authenticated pair" for `domain`: the
|
|
263
|
-
# domain's own chapter, or a framework member its hecksagon attaches, that
|
|
264
|
-
# declares `provides "identity"`.
|
|
265
|
-
#
|
|
266
|
-
# @param domain [String, Symbol] the domain whose identity chapter is being resolved
|
|
267
|
-
# @return [Bluebook::Chapter, nil] the chapter that answers `domain`'s identity
|
|
268
|
-
# questions, or nil if none does
|
|
269
|
-
def identity_provider_for(domain)
|
|
270
|
-
names = [domain.to_s, *Array(hecksagon(domain)&.member_chapters)]
|
|
271
|
-
attached = names.filter_map { |name| bluebook(name) }
|
|
272
|
-
.find { |chapter| chapter.provides?(Bluebook::Capabilities::IDENTITY) }
|
|
273
|
-
return attached if attached
|
|
274
|
-
|
|
275
|
-
# Falls back to any loaded chapter: a consuming domain often wires Identity as
|
|
276
|
-
# Hecks.hecksagon "Identity" rather than via `attaches`, so it's loaded but
|
|
277
|
-
# not listed on the consumer's own hexagon.
|
|
278
|
-
@bluebooks.values.find { |chapter| chapter.provides?(Bluebook::Capabilities::IDENTITY) }
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
# The chapter that answers "who may sign in" for `domain`: the domain's own
|
|
282
|
-
# chapter, a framework member, or a vendored embryonaut bluebook it attaches,
|
|
283
|
-
# that declares `provides "membership"`.
|
|
284
|
-
#
|
|
285
|
-
# Vendored packages are included, since membership ships as a vendored
|
|
286
|
-
# embryonaut_bluebooks chapter, not a framework member.
|
|
287
|
-
#
|
|
288
|
-
# @param domain [String, Symbol] the domain whose sign-in aggregate is being resolved
|
|
289
|
-
# @return [Bluebook::Chapter, nil] the chapter that answers `domain`'s membership
|
|
290
|
-
# questions, or nil if none does
|
|
291
|
-
def membership_provider_for(domain)
|
|
292
|
-
vendored_provider_for(domain, Bluebook::Capabilities::MEMBERSHIP)
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
# The chapter that answers the guest newsletter signup for `domain`: the domain's
|
|
296
|
-
# own chapter, a framework member, or a vendored embryonaut bluebook it attaches,
|
|
297
|
-
# that declares `provides "newsletter"`.
|
|
298
|
-
#
|
|
299
|
-
# @param domain [String, Symbol] the domain whose newsletter chapter is being resolved
|
|
300
|
-
# @return [Bluebook::Chapter, nil] the chapter that answers `domain`'s newsletter
|
|
301
|
-
# signup, or nil if none does
|
|
302
|
-
def newsletter_provider_for(domain)
|
|
303
|
-
vendored_provider_for(domain, Bluebook::Capabilities::NEWSLETTER)
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
# The chapter that answers sending a newsletter issue for `domain` —
|
|
307
|
-
# resolved the same way as `newsletter_provider_for`, by what it
|
|
308
|
-
# declares (`provides "newsletter_issues"`). Nil when none does.
|
|
309
|
-
#
|
|
310
|
-
# @param domain [String, Symbol] the domain whose issue-sending chapter is being resolved
|
|
311
|
-
# @return [Bluebook::Chapter, nil] the chapter that answers `domain`'s issue sending,
|
|
312
|
-
# or nil if none does
|
|
313
|
-
def newsletter_issues_provider_for(domain)
|
|
314
|
-
vendored_provider_for(domain, Bluebook::Capabilities::NEWSLETTER_ISSUES)
|
|
315
|
-
end
|
|
316
|
-
|
|
317
|
-
# The chapter that answers scheduling sessions and registrations for `domain`,
|
|
318
|
-
# resolved the same way as `payments_provider_for`, by declaring `provides "registrations"`.
|
|
319
|
-
#
|
|
320
|
-
# @param domain [String, Symbol] the domain whose registrations chapter is being resolved
|
|
321
|
-
# @return [Bluebook::Chapter, nil] the chapter that answers `domain`'s registrations,
|
|
322
|
-
# or nil if none does
|
|
323
|
-
def registrations_provider_for(domain)
|
|
324
|
-
vendored_provider_for(domain, Bluebook::Capabilities::REGISTRATIONS)
|
|
325
|
-
end
|
|
326
|
-
|
|
327
|
-
# The chapter that owns the business's payment-processor connection for
|
|
328
|
-
# `domain` — resolved by what it declares (`provides "payment_connection"`).
|
|
329
|
-
# Nil when none does.
|
|
330
|
-
#
|
|
331
|
-
# @param domain [String, Symbol] the domain whose payment-connection chapter is
|
|
332
|
-
# being resolved
|
|
333
|
-
# @return [Bluebook::Chapter, nil] the chapter that owns `domain`'s payment connection,
|
|
334
|
-
# or nil if none does
|
|
335
|
-
def payment_connection_provider_for(domain)
|
|
336
|
-
vendored_provider_for(domain, Bluebook::Capabilities::PAYMENT_CONNECTION)
|
|
337
|
-
end
|
|
338
|
-
|
|
339
|
-
# The chapter that takes payments for `domain`: the domain's own chapter, a
|
|
340
|
-
# framework member, or a vendored embryonaut bluebook it attaches, that
|
|
341
|
-
# declares `provides "payments"`.
|
|
342
|
-
#
|
|
343
|
-
# @param domain [String, Symbol] the domain whose payments chapter is being resolved
|
|
344
|
-
# @return [Bluebook::Chapter, nil] the chapter that takes `domain`'s payments, or nil
|
|
345
|
-
# if none does
|
|
346
|
-
def payments_provider_for(domain)
|
|
347
|
-
vendored_provider_for(domain, Bluebook::Capabilities::PAYMENTS)
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
# The chapter that provides `capability` for `domain`: the domain's own chapter,
|
|
351
|
-
# a framework member its hecksagon attaches, or a vendored embryonaut bluebook
|
|
352
|
-
# it attaches, that declares it.
|
|
353
|
-
#
|
|
354
|
-
# Falls back to any loaded chapter, since a consuming domain often wires a
|
|
355
|
-
# vendored chapter as its own `Hecks.hecksagon "Name"` rather than via
|
|
356
|
-
# `attaches ... from: :vendor`, so it's loaded but not listed on the consumer's hexagon.
|
|
357
|
-
#
|
|
358
|
-
# @param domain [String, Symbol] the domain the provider is resolved for
|
|
359
|
-
# @param capability [String] the capability's name, such as
|
|
360
|
-
# `Bluebook::Capabilities::MEMBERSHIP`
|
|
361
|
-
# @return [Bluebook::Chapter, nil] the providing chapter, or nil if none loaded does
|
|
362
|
-
def vendored_provider_for(domain, capability)
|
|
363
|
-
hexagon = hecksagon(domain)
|
|
364
|
-
names = [domain.to_s, *Array(hexagon&.member_chapters)]
|
|
365
|
-
attached = names.filter_map { |name| bluebook(name) }
|
|
366
|
-
.find { |chapter| chapter.provides?(capability) }
|
|
367
|
-
return attached if attached
|
|
368
|
-
|
|
369
|
-
@bluebooks.values.find { |chapter| chapter.provides?(capability) }
|
|
370
|
-
end
|
|
230
|
+
def verbs = @declared.bluebooks.values.flat_map(&:verbs).sort
|
|
371
231
|
|
|
372
232
|
# Resolves and memoizes `aggregate`'s authoritative repository.
|
|
373
233
|
#
|
|
@@ -395,8 +255,8 @@ module Hecks
|
|
|
395
255
|
# @return [void]
|
|
396
256
|
# rubocop:disable-next Hecks/ThreadSharedIvarMutation
|
|
397
257
|
def log_reaction(record, event: nil)
|
|
398
|
-
@reaction_log << record
|
|
399
|
-
@reaction_events[record] = event if event
|
|
258
|
+
@state.reaction_log << record
|
|
259
|
+
@state.reaction_events[record] = event if event
|
|
400
260
|
Array(Thread.current[REACTION_SINKS]).each { |sink| sink << record }
|
|
401
261
|
end
|
|
402
262
|
|
|
@@ -404,7 +264,7 @@ module Hecks
|
|
|
404
264
|
#
|
|
405
265
|
# @param record [Hash{Symbol => Object}] a record `log_reaction` was given
|
|
406
266
|
# @return [String, Integer, nil] nil for a record logged without its event
|
|
407
|
-
def reaction_event(record) = @reaction_events[record]
|
|
267
|
+
def reaction_event(record) = @state.reaction_events[record]
|
|
408
268
|
|
|
409
269
|
# Collects the reactions logged on this thread while the block runs, so one dispatch
|
|
410
270
|
# reads exactly its own even when other threads dispatch on the same registry. Nested
|
|
@@ -432,13 +292,7 @@ module Hecks
|
|
|
432
292
|
# @return [Runtime::Registry] self
|
|
433
293
|
# rubocop:disable-next Hecks/ThreadSharedIvarMutation
|
|
434
294
|
def reset_runtime_state!
|
|
435
|
-
@
|
|
436
|
-
@reaction_log.clear
|
|
437
|
-
@reaction_events.clear
|
|
438
|
-
@saga_log.clear
|
|
439
|
-
@saga_dispatch_log.clear
|
|
440
|
-
@policy_dispatch_log.clear
|
|
441
|
-
@saga_instances.clear
|
|
295
|
+
@state.clear
|
|
442
296
|
@repositories = {}
|
|
443
297
|
@projection_repositories = {}
|
|
444
298
|
@outbox.log.clear
|
|
@@ -449,98 +303,6 @@ module Hecks
|
|
|
449
303
|
# Built eagerly in `initialize`; this is a plain reader, not a memoizer.
|
|
450
304
|
# `spec/runtime/capability_graph_spec.rb` asserts the same instance comes back every call.
|
|
451
305
|
attr_reader :capability_graph
|
|
452
|
-
|
|
453
|
-
# Resolves and memoizes the repository to read `aggregate` from — a caught-up
|
|
454
|
-
# projection when one is bound and current, otherwise the authoritative repository.
|
|
455
|
-
#
|
|
456
|
-
# @param domain [String, Symbol] name of the domain `aggregate` belongs to
|
|
457
|
-
# @param aggregate [Bluebook::Aggregate] the aggregate to resolve a read
|
|
458
|
-
# repository for
|
|
459
|
-
# @return [Persistence::AppendOnly] the projection repository when one is bound
|
|
460
|
-
# and caught up with the authoritative store; the authoritative repository
|
|
461
|
-
# otherwise
|
|
462
|
-
# @raise [Runtime::WiringError] if the authoritative or projection bind cannot
|
|
463
|
-
# be resolved
|
|
464
|
-
def read_repository(domain, aggregate)
|
|
465
|
-
key = [domain.to_s, aggregate.hecks_name]
|
|
466
|
-
binding = Ports::Projection.binds_for(self, domain, aggregate).first
|
|
467
|
-
return repository(domain, aggregate) unless binding
|
|
468
|
-
|
|
469
|
-
projection = (@projection_repositories[key] ||= begin
|
|
470
|
-
projection = Ports::Persistence::RepositoryFactory.build(self, domain, aggregate, binding,
|
|
471
|
-
recover: true, settings_verb: Ports::Projection::VERB)
|
|
472
|
-
projection
|
|
473
|
-
end)
|
|
474
|
-
authoritative = repository(domain, aggregate)
|
|
475
|
-
projection_current?(projection, authoritative) ? projection : authoritative
|
|
476
|
-
end
|
|
477
|
-
|
|
478
|
-
# Reports whether `projection`'s own journal entries and rows agree with
|
|
479
|
-
# `authoritative`'s, entry-for-entry.
|
|
480
|
-
#
|
|
481
|
-
# @param projection [Persistence::AppendOnly] the projection repository to check
|
|
482
|
-
# @param authoritative [Persistence::AppendOnly] the authoritative repository to
|
|
483
|
-
# check `projection` against
|
|
484
|
-
# @return [Boolean] true when `projection` holds the same entries and rows as
|
|
485
|
-
# `authoritative`, in the same order; false on any mismatch, or if comparing
|
|
486
|
-
# them raises
|
|
487
|
-
def projection_current?(projection, authoritative)
|
|
488
|
-
projected_entries = projection.entries
|
|
489
|
-
source_entries = authoritative.entries
|
|
490
|
-
return false unless projected_entries.length == source_entries.length
|
|
491
|
-
return false unless projected_entries.zip(source_entries).all? do |projected, source|
|
|
492
|
-
projected.operation == source.operation && projected.id == source.id && projected.state == source.state
|
|
493
|
-
end
|
|
494
|
-
|
|
495
|
-
projected_rows = projection.all.map(&:to_h).sort_by { |row| row.fetch(:id).to_s }
|
|
496
|
-
source_rows = authoritative.all.map(&:to_h).sort_by { |row| row.fetch(:id).to_s }
|
|
497
|
-
projected_rows == source_rows
|
|
498
|
-
rescue StandardError
|
|
499
|
-
false
|
|
500
|
-
end
|
|
501
|
-
|
|
502
|
-
# Concatenates every list-shaped fact from base and overlay. `binds` is additive too:
|
|
503
|
-
# an overlay rebinding an aggregate is meant to shadow the base's bind at resolution
|
|
504
|
-
# time, not erase it — `Ports::Persistence::BindingPolicy.resolve`'s "exactly one
|
|
505
|
-
# authoritative bind" check is what actually catches a genuine double-bind.
|
|
506
|
-
#
|
|
507
|
-
# @param base [Bluebook::Hecksagon] the domain's already-registered wiring
|
|
508
|
-
# @param overlay [Bluebook::Hecksagon] the newly loaded block's own wiring to
|
|
509
|
-
# fold in
|
|
510
|
-
# @return [Bluebook::Hecksagon] a new wiring with every list-shaped fact
|
|
511
|
-
# concatenated, `base` then `overlay`
|
|
512
|
-
def merge_hecksagons(base, overlay)
|
|
513
|
-
# Order-independent: list facts uniq, so loading context_map before or after the
|
|
514
|
-
# domain file yields the same merged hecksagon.
|
|
515
|
-
Bluebook::Hecksagon.new(
|
|
516
|
-
domain: base.domain,
|
|
517
|
-
binds: base.binds + overlay.binds,
|
|
518
|
-
subscriptions: (base.subscriptions + overlay.subscriptions).uniq,
|
|
519
|
-
attachments: (base.attachments + overlay.attachments).uniq,
|
|
520
|
-
bounded: base.bounded? || overlay.bounded?,
|
|
521
|
-
translates: (base.translates + overlay.translates).uniq
|
|
522
|
-
)
|
|
523
|
-
end
|
|
524
|
-
|
|
525
|
-
# Scalars (`realm`, `latest`, `default_database`, `default_adapter`): the overlay's
|
|
526
|
-
# value wins when present, else the base's survives. `settings` is a shallow merge
|
|
527
|
-
# keyed by verb (and `"verb:adapter"`); an overlay key replaces the base's whole
|
|
528
|
-
# resolved hash for that key, it does not deep-merge within it.
|
|
529
|
-
#
|
|
530
|
-
# @param base [Bluebook::World] the domain's already-registered world
|
|
531
|
-
# @param overlay [Bluebook::World] the newly loaded block's own world to fold in
|
|
532
|
-
# @return [Bluebook::World] a new world with `overlay`'s scalars winning when
|
|
533
|
-
# present, and `settings` shallow-merged, `overlay`'s keys winning
|
|
534
|
-
def merge_worlds(base, overlay)
|
|
535
|
-
Bluebook::World.new(
|
|
536
|
-
domain: base.domain,
|
|
537
|
-
realm: overlay.realm || base.realm,
|
|
538
|
-
latest: overlay.latest || base.latest,
|
|
539
|
-
settings: base.settings.merge(overlay.settings),
|
|
540
|
-
default_database: overlay.default_database || base.default_database,
|
|
541
|
-
default_adapter: overlay.default_adapter || base.default_adapter
|
|
542
|
-
)
|
|
543
|
-
end
|
|
544
306
|
end
|
|
545
307
|
end
|
|
546
308
|
end
|
|
@@ -82,39 +82,11 @@ module Hecks
|
|
|
82
82
|
def dispatch_flat(verb, args = {})
|
|
83
83
|
args = args.dup
|
|
84
84
|
saga_correlation = args.delete(:saga_correlation)
|
|
85
|
-
domain,
|
|
86
|
-
raise(UnknownVerb,
|
|
87
|
-
RefusalWording.render_site("UnknownVerb", "not_fully_qualified", verb: verb))
|
|
88
|
-
aggregate = @registry.bluebook(domain)&.aggregate(aggregate_name) ||
|
|
89
|
-
raise(UnknownVerb,
|
|
90
|
-
RefusalWording.render_site("UnknownVerb", "no_aggregate", domain: domain, aggregate: aggregate_name))
|
|
91
|
-
|
|
92
|
-
# Not every aggregate in a routed domain is Lambda-bound (a `compute` rule can
|
|
93
|
-
# only run against Postgres). Test the adapter's capability, not its name.
|
|
94
|
-
adapter_name = Ports::Persistence::BindingPolicy.resolve(@registry, domain, aggregate).adapter
|
|
95
|
-
unless @registry.adapter_class(adapter_name) <= Ports::Persistence::RemoteRuntime
|
|
96
|
-
return @local.dispatch_flat(verb, args.merge(saga_correlation: saga_correlation))
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
response = @client.dispatch(verb, args)
|
|
100
|
-
|
|
101
|
-
refusal = response.fetch("refusals", []).find { |r| r["verb"] == verb }
|
|
102
|
-
raise RemoteRefusal, "#{verb} refused: #{refusal['error']}" if refusal
|
|
85
|
+
domain, aggregate = resolve_aggregate(verb)
|
|
103
86
|
|
|
104
|
-
|
|
105
|
-
# aggregate name: a reaction can mutate other aggregates in the same step.
|
|
106
|
-
fqn = "#{domain}::#{aggregate.hecks_name}"
|
|
107
|
-
mutation = response.fetch("mutations", []).last&.find { |m| m["aggregate"] == fqn } ||
|
|
108
|
-
raise(WiringError,
|
|
109
|
-
"#{verb} was accepted but rust/host reported no mutation for #{fqn} — response: #{response.inspect}")
|
|
87
|
+
return @local.dispatch_flat(verb, args.merge(saga_correlation: saga_correlation)) unless remote_bound?(domain, aggregate)
|
|
110
88
|
|
|
111
|
-
|
|
112
|
-
state: JSON.parse(JSON.generate(mutation["state"]), symbolize_names: true))
|
|
113
|
-
|
|
114
|
-
Result.new(verb: verb, instance: instance, events: step_events(response),
|
|
115
|
-
refused_reactions: refused_reactions_of(response),
|
|
116
|
-
blocking_reactions: ReactionOutcome.blocking(step_reactions(response)),
|
|
117
|
-
reaction_defects: ReactionOutcome.defects(step_reactions(response)))
|
|
89
|
+
settle(verb, domain, aggregate, @client.dispatch(verb, args))
|
|
118
90
|
end
|
|
119
91
|
|
|
120
92
|
# Delegates to the local `Dispatcher`; see `Dispatcher#query`.
|
|
@@ -134,6 +106,50 @@ module Hecks
|
|
|
134
106
|
|
|
135
107
|
private
|
|
136
108
|
|
|
109
|
+
# The domain name and the aggregate a fully qualified verb names.
|
|
110
|
+
def resolve_aggregate(verb)
|
|
111
|
+
domain, aggregate_name, = Naming.split_verb(verb) ||
|
|
112
|
+
raise(UnknownVerb,
|
|
113
|
+
RefusalWording.render_site("UnknownVerb", "not_fully_qualified", verb: verb))
|
|
114
|
+
aggregate = @registry.bluebook(domain)&.aggregate(aggregate_name) ||
|
|
115
|
+
raise(UnknownVerb,
|
|
116
|
+
RefusalWording.render_site("UnknownVerb", "no_aggregate", domain: domain, aggregate: aggregate_name))
|
|
117
|
+
[domain, aggregate]
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Not every aggregate in a routed domain is Lambda-bound (a `compute` rule can
|
|
121
|
+
# only run against Postgres). Test the adapter's capability, not its name.
|
|
122
|
+
def remote_bound?(domain, aggregate)
|
|
123
|
+
adapter_name = Ports::Persistence::BindingPolicy.resolve(@registry, domain, aggregate).adapter
|
|
124
|
+
@registry.adapter_class(adapter_name) <= Ports::Persistence::RemoteRuntime
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# The result of a remote dispatch: the record the host settled and what its step caused.
|
|
128
|
+
def settle(verb, domain, aggregate, response)
|
|
129
|
+
refuse_remote!(verb, response)
|
|
130
|
+
mutation = settled_mutation(verb, "#{domain}::#{aggregate.hecks_name}", response)
|
|
131
|
+
instance = Instance.new(aggregate: aggregate, id: mutation["id"],
|
|
132
|
+
state: JSON.parse(JSON.generate(mutation["state"]), symbolize_names: true))
|
|
133
|
+
|
|
134
|
+
Result.new(verb: verb, instance: instance, events: step_events(response),
|
|
135
|
+
refused_reactions: refused_reactions_of(response),
|
|
136
|
+
blocking_reactions: ReactionOutcome.blocking(step_reactions(response)),
|
|
137
|
+
reaction_defects: ReactionOutcome.defects(step_reactions(response)))
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def refuse_remote!(verb, response)
|
|
141
|
+
refusal = response.fetch("refusals", []).find { |r| r["verb"] == verb }
|
|
142
|
+
raise RemoteRefusal, "#{verb} refused: #{refusal["error"]}" if refusal
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# `mutations` has one entry per replayed step, so `.last` is this step. Match by
|
|
146
|
+
# aggregate name: a reaction can mutate other aggregates in the same step.
|
|
147
|
+
def settled_mutation(verb, fqn, response)
|
|
148
|
+
response.fetch("mutations", []).last&.find { |m| m["aggregate"] == fqn } ||
|
|
149
|
+
raise(WiringError,
|
|
150
|
+
"#{verb} was accepted but rust/host reported no mutation for #{fqn} — response: #{response.inspect}")
|
|
151
|
+
end
|
|
152
|
+
|
|
137
153
|
# The newest step's reactions the remote runtime refused, from its `reactions_per_step`
|
|
138
154
|
# log (the whole-run `reactions` would also carry the replayed history's).
|
|
139
155
|
def refused_reactions_of(response)
|