hecks 2.8.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/exe/hecks +50 -7
- data/lib/hecks/adapters/driven/claude_code.rb +4 -104
- data/lib/hecks/adapters/driven/d1.rb +44 -237
- data/lib/hecks/adapters/driven/folder.rb +17 -76
- data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
- data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
- data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
- data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
- data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
- data/lib/hecks/adapters/driven/heki.rb +13 -42
- data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
- data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
- data/lib/hecks/adapters/driven/lambda.rb +10 -84
- data/lib/hecks/adapters/driven/local_storage.rb +5 -40
- data/lib/hecks/adapters/driven/memory.rb +32 -100
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
- data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
- data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
- data/lib/hecks/adapters/driven/postgres/reconnect.rb +10 -32
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
- data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
- data/lib/hecks/adapters/driven/postgres.rb +149 -136
- data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
- data/lib/hecks/adapters/driven/prism.rb +48 -38
- data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
- data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
- data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
- data/lib/hecks/adapters/driven/sqlite.rb +128 -65
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +76 -62
- data/lib/hecks/adapters/driven.rb +5 -36
- data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
- data/lib/hecks/behaviors/dsl.rb +7 -25
- data/lib/hecks/behaviors/expectations.rb +32 -142
- data/lib/hecks/behaviors/ir.rb +7 -20
- data/lib/hecks/behaviors/rspec.rb +6 -17
- data/lib/hecks/behaviors/runner.rb +10 -34
- data/lib/hecks/behaviors.rb +4 -8
- data/lib/hecks/bench/cli.rb +62 -0
- data/lib/hecks/bench/environment.rb +71 -0
- data/lib/hecks/bench/postgres_probe.rb +30 -0
- data/lib/hecks/bench/report.rb +76 -0
- data/lib/hecks/bench/ruby_runner.rb +93 -0
- data/lib/hecks/bench/run.rb +55 -0
- data/lib/hecks/bench/rust_runner.rb +101 -0
- data/lib/hecks/bench/stats.rb +46 -0
- data/lib/hecks/bench/suite.rb +98 -0
- data/lib/hecks/bench/workload.rb +89 -0
- data/lib/hecks/bench.rb +17 -0
- data/lib/hecks/bluebook/aggregate.rb +9 -75
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
- data/lib/hecks/bluebook/assembly/build.rb +4 -15
- data/lib/hecks/bluebook/assembly/contract.rb +15 -136
- data/lib/hecks/bluebook/assembly/contracts.rb +56 -174
- data/lib/hecks/bluebook/assembly/marks.rb +31 -223
- data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
- data/lib/hecks/bluebook/assembly.rb +6 -45
- data/lib/hecks/bluebook/attribute.rb +12 -61
- data/lib/hecks/bluebook/behaviour/aggregate.rb +39 -39
- data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
- data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
- data/lib/hecks/bluebook/behaviour/command.rb +14 -66
- data/lib/hecks/bluebook/behaviour/domain_port.rb +11 -20
- data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
- data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
- data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
- data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
- data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
- data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
- data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
- data/lib/hecks/bluebook/capabilities.rb +17 -49
- data/lib/hecks/bluebook/chapter.rb +16 -50
- data/lib/hecks/bluebook/command.rb +23 -81
- data/lib/hecks/bluebook/domain_port.rb +49 -67
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +96 -708
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +63 -169
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +3 -1
- data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
- data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +42 -89
- data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +148 -197
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
- data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
- data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
- data/lib/hecks/bluebook/dsl/query_builder.rb +38 -43
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
- data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
- data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
- data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
- data/lib/hecks/bluebook/dsl/world_builder.rb +46 -111
- data/lib/hecks/bluebook/entity.rb +13 -71
- data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
- data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
- data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
- data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
- data/lib/hecks/bluebook/expression/resolver.rb +39 -661
- data/lib/hecks/bluebook/hexagon.rb +18 -33
- data/lib/hecks/bluebook/lifecycle.rb +5 -16
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
- data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
- data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
- data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -176
- data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -306
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
- data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
- data/lib/hecks/bluebook/meta_validator.rb +87 -352
- data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
- data/lib/hecks/bluebook/model_check.rb +122 -596
- data/lib/hecks/bluebook/pattern_subset.rb +49 -69
- data/lib/hecks/bluebook/process_manager.rb +13 -83
- data/lib/hecks/bluebook/project_loader.rb +3 -39
- data/lib/hecks/bluebook/project_register.rb +12 -60
- data/lib/hecks/bluebook/query.rb +27 -51
- data/lib/hecks/bluebook/read_model.rb +57 -81
- data/lib/hecks/bluebook/reference.rb +7 -41
- data/lib/hecks/bluebook/smoke_test.rb +9 -99
- data/lib/hecks/bluebook/synthesizer.rb +13 -62
- data/lib/hecks/bluebook/translation.rb +26 -62
- data/lib/hecks/bluebook/value_object.rb +11 -36
- data/lib/hecks/bluebook.rb +5 -22
- data/lib/hecks/cache_dir.rb +4 -23
- data/lib/hecks/canonical_json.rb +30 -0
- data/lib/hecks/chapters.rb +102 -0
- data/lib/hecks/cli/behaviors.rb +61 -0
- data/lib/hecks/cli/canonicalise.rb +25 -0
- data/lib/hecks/cli/check_engine_agreement.rb +32 -0
- data/lib/hecks/cli/check_era.rb +88 -0
- data/lib/hecks/cli/console.rb +66 -0
- data/lib/hecks/cli/deploy_template_diff.rb +40 -0
- data/lib/hecks/cli/doc_coverage.rb +32 -0
- data/lib/hecks/cli/document.rb +5 -23
- data/lib/hecks/cli/expression_projection.rb +41 -0
- data/lib/hecks/cli/follow.rb +88 -0
- data/lib/hecks/cli/history.rb +44 -0
- data/lib/hecks/cli/ir.rb +4 -6
- data/lib/hecks/cli/mcp.rb +5 -6
- data/lib/hecks/cli/model_check.rb +24 -88
- data/lib/hecks/cli/pattern_cases.rb +47 -0
- data/lib/hecks/cli/present.rb +39 -0
- data/lib/hecks/cli/project_cli.rb +223 -64
- data/lib/hecks/cli/project_diagrams.rb +4 -10
- data/lib/hecks/cli/project_glossary.rb +44 -0
- data/lib/hecks/cli/reference.rb +46 -0
- data/lib/hecks/cli/refresh_projections.rb +44 -0
- data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +150 -0
- data/lib/hecks/cli/release.rb +70 -0
- data/lib/hecks/cli/release_gem.rb +59 -0
- data/lib/hecks/cli/rspec_io_parallel_files.rb +137 -0
- data/lib/hecks/cli/rspec_shard_files.rb +66 -0
- data/lib/hecks/cli/run.rb +15 -61
- data/lib/hecks/cli/seed_semantics_corpus.rb +71 -0
- data/lib/hecks/cli/serve_query_ir_mcp.rb +30 -0
- data/lib/hecks/cli/shape.rb +70 -0
- data/lib/hecks/cli/smoke_http.rb +230 -0
- data/lib/hecks/cli/smoke_test.rb +7 -19
- data/lib/hecks/cli/spec_example.rb +27 -0
- data/lib/hecks/cli/statements.rb +32 -0
- data/lib/hecks/cli/stores.rb +4 -6
- data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
- data/lib/hecks/cli.rb +216 -73
- data/lib/hecks/codemod.rb +324 -0
- data/lib/hecks/construct.rb +8 -34
- data/lib/hecks/corpus.rb +423 -0
- data/lib/hecks/deploy/bluebook/deploy.bluebook +617 -158
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -11
- data/lib/hecks/deploy/oidc.json +82 -2
- data/lib/hecks/doc/reference.rb +351 -0
- data/lib/hecks/doors/cli_door.rb +196 -0
- data/lib/hecks/doors/cli_runner.rb +297 -0
- data/lib/hecks/{facade → doors}/command_request.rb +14 -34
- data/lib/hecks/doors/handle.rb +206 -0
- data/lib/hecks/doors/json_door.rb +132 -0
- data/lib/hecks/doors/launcher_options.rb +129 -0
- data/lib/hecks/{cli → doors}/mcp_door.rb +25 -120
- data/lib/hecks/doors/mcp_door_scope.rb +97 -0
- data/lib/hecks/doors/ruby_door/aggregate_door.rb +162 -0
- data/lib/hecks/doors/ruby_door/chapter.rb +72 -0
- data/lib/hecks/doors/ruby_door.rb +77 -0
- data/lib/hecks/doors.rb +61 -0
- data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
- data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
- data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
- data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
- data/lib/hecks/embryonaut_bluebook.rb +5 -72
- data/lib/hecks/engine_agreement.rb +156 -0
- data/lib/hecks/facade.rb +23 -51
- data/lib/hecks/forms/app.rb +21 -76
- data/lib/hecks/forms/banking_presentation.rb +50 -0
- data/lib/hecks/forms/command_form_renderer.rb +10 -29
- data/lib/hecks/forms/field_renderer.rb +17 -156
- data/lib/hecks/forms/field_shape.rb +31 -222
- data/lib/hecks/forms/html.rb +12 -47
- data/lib/hecks/forms/index_renderer.rb +1 -4
- data/lib/hecks/forms/page.rb +3 -9
- data/lib/hecks/forms/params.rb +14 -60
- data/lib/hecks/forms/port_argument.rb +2 -19
- data/lib/hecks/forms/query_form_renderer.rb +4 -79
- data/lib/hecks/forms/record_renderer.rb +8 -75
- data/lib/hecks/forms/record_table.rb +7 -50
- data/lib/hecks/forms/reference_options.rb +3 -30
- data/lib/hecks/forms/value_object_shape.rb +8 -35
- data/lib/hecks/forms.rb +5 -33
- data/lib/hecks/fqn.rb +5 -12
- data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
- data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
- data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
- data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
- data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
- data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
- data/lib/hecks/framework.rb +11 -80
- data/lib/hecks/freezer.rb +5 -39
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +393 -0
- data/lib/hecks/fuzzing/combination_miner.rb +86 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +214 -0
- data/lib/hecks/fuzzing/coverage_campaign.rb +143 -0
- data/lib/hecks/fuzzing/differential.rb +156 -0
- data/lib/hecks/fuzzing/domain_generator.rb +615 -0
- data/lib/hecks/fuzzing/era_boundary.rb +71 -0
- data/lib/hecks/fuzzing/form_census.rb +136 -0
- data/lib/hecks/fuzzing/generated_domain_check.rb +93 -0
- data/lib/hecks/fuzzing/invalid_value_generator.rb +64 -0
- data/lib/hecks/fuzzing/isolated_boot.rb +301 -0
- data/lib/hecks/fuzzing/nondeterministic.rb +51 -0
- data/lib/hecks/fuzzing/outside_world.rb +45 -0
- data/lib/hecks/fuzzing/persistence_parity.rb +102 -0
- data/lib/hecks/fuzzing/properties/corrections.rb +88 -0
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +314 -0
- data/lib/hecks/fuzzing/properties/guards.rb +190 -0
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +300 -0
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +93 -0
- data/lib/hecks/fuzzing/properties/outbox.rb +89 -0
- data/lib/hecks/fuzzing/properties/querying.rb +175 -0
- data/lib/hecks/fuzzing/properties.rb +162 -0
- data/lib/hecks/fuzzing/qa_settings.rb +123 -0
- data/lib/hecks/fuzzing/replay.rb +505 -0
- data/lib/hecks/fuzzing/rotation_priority.rb +48 -0
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +108 -0
- data/lib/hecks/fuzzing/self_consistency.rb +339 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +385 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +132 -0
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +95 -0
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +77 -0
- data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +109 -0
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +237 -0
- data/lib/hecks/fuzzing/sequence_generator.rb +189 -0
- data/lib/hecks/fuzzing/shrinker.rb +166 -0
- data/lib/hecks/fuzzing/structural_skips.rb +33 -0
- data/lib/hecks/fuzzing/sweep_depth.rb +43 -0
- data/lib/hecks/fuzzing/target_capabilities.rb +163 -0
- data/lib/hecks/fuzzing/value_generator.rb +216 -0
- data/lib/hecks/fuzzing.rb +23 -0
- data/lib/hecks/grammar/evolve.rb +336 -0
- data/lib/hecks/grammar/expression.bluebook +15 -40
- data/lib/hecks/grammar/translation.bluebook +3 -6
- data/lib/hecks/grammar.rb +16 -41
- data/lib/hecks/hecks/adapters/codebase/codemods.rb +45 -0
- data/lib/hecks/hecks/adapters/codebase/conformance.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +202 -0
- data/lib/hecks/hecks/adapters/codebase/gem_registry.rb +80 -0
- data/lib/hecks/hecks/adapters/codebase/kernel_tables.rb +54 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +240 -0
- data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +102 -0
- data/lib/hecks/hecks/adapters/codebase/publishing.rb +142 -0
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +67 -0
- data/lib/hecks/hecks/adapters/codebase/release_facts.rb +90 -0
- data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +83 -0
- data/lib/hecks/hecks/adapters/codebase/secret_vault.rb +36 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.adapter +7 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +189 -0
- data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/style.rb +171 -0
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +55 -0
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +165 -0
- data/lib/hecks/hecks/adapters/codebase/tree.rb +111 -0
- data/lib/hecks/hecks/adapters/console_capture.rb +79 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.rb +108 -0
- data/lib/hecks/hecks/adapters/git.adapter +7 -0
- data/lib/hecks/hecks/adapters/git.rb +102 -0
- data/lib/hecks/hecks/adapters/host_http.adapter +7 -0
- data/lib/hecks/hecks/adapters/host_http.rb +65 -0
- data/lib/hecks/hecks/adapters/in_process_boot.adapter +7 -0
- data/lib/hecks/hecks/adapters/in_process_boot.rb +197 -0
- data/lib/hecks/hecks/adapters/in_process_operations.rb +202 -0
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +143 -0
- data/lib/hecks/hecks/adapters/journal_store/compaction.rb +145 -0
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +132 -0
- data/lib/hecks/hecks/adapters/journal_store/examination.rb +135 -0
- data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +163 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +187 -0
- data/lib/hecks/hecks/adapters/journal_store.adapter +7 -0
- data/lib/hecks/hecks/adapters/journal_store.rb +64 -0
- data/lib/hecks/hecks/adapters/local_files.adapter +7 -0
- data/lib/hecks/hecks/adapters/local_files.rb +46 -0
- data/lib/hecks/hecks/adapters/pg_admin.adapter +7 -0
- data/lib/hecks/hecks/adapters/pg_admin.rb +245 -0
- data/lib/hecks/hecks/adapters/process_pool.adapter +7 -0
- data/lib/hecks/hecks/adapters/process_pool.rb +119 -0
- data/lib/hecks/hecks/adapters/rust_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +179 -0
- data/lib/hecks/hecks/adapters/rust_workspace.rb +150 -0
- data/lib/hecks/hecks/adapters/shell.adapter +7 -0
- data/lib/hecks/hecks/adapters/shell.rb +49 -0
- data/lib/hecks/hecks/adapters/terminal.adapter +7 -0
- data/lib/hecks/hecks/adapters/terminal.rb +74 -0
- data/lib/hecks/hecks/codebase.behaviors +172 -0
- data/lib/hecks/hecks/codebase.bluebook +2453 -0
- data/lib/hecks/hecks/context_map.hecksagon +13 -0
- data/lib/hecks/hecks/custodian.behaviors +179 -0
- data/lib/hecks/hecks/custodian.bluebook +1847 -0
- data/lib/hecks/hecks/deploy.behaviors +74 -0
- data/lib/hecks/hecks/deploy.world +12 -0
- data/lib/hecks/hecks/environments/memory.world +10 -0
- data/lib/hecks/hecks/governance.world +7 -0
- data/lib/hecks/hecks/hecks.behaviors +62 -0
- data/lib/hecks/hecks/hecks.bluebook +124 -0
- data/lib/hecks/hecks/hecks.hecksagon +390 -0
- data/lib/hecks/hecks/hecks.world +42 -0
- data/lib/hecks/ir.rb +14 -83
- data/lib/hecks/kernel_capabilities.rb +194 -0
- data/lib/hecks/language/adapter.bluebook +2 -7
- data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
- data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
- data/lib/hecks/language/bluebook/bluebook.bluebook +26 -83
- data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
- data/lib/hecks/language/bluebook/command.bluebook +27 -144
- data/lib/hecks/language/bluebook/entity.bluebook +24 -97
- data/lib/hecks/language/bluebook/policy.bluebook +16 -67
- data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
- data/lib/hecks/language/bluebook/projection.bluebook +126 -60
- data/lib/hecks/language/bluebook/query.bluebook +19 -43
- data/lib/hecks/language/bluebook/shape.bluebook +23 -73
- data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
- data/lib/hecks/language/bluebook/vocabulary.bluebook +83 -198
- data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
- data/lib/hecks/language/hecksagon/domain_port.bluebook +14 -19
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +26 -25
- data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
- data/lib/hecks/language/oidc.json +35 -0
- data/lib/hecks/language/port.bluebook +4 -17
- data/lib/hecks/language/translation/translation.bluebook +3 -9
- data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
- data/lib/hecks/language/world/wiring.bluebook +1 -3
- data/lib/hecks/language/world/world.bluebook +5 -7
- data/lib/hecks/literal.rb +8 -50
- data/lib/hecks/mcp_stdio_guard.rb +4 -41
- data/lib/hecks/naming.rb +29 -137
- data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
- data/lib/hecks/persistence_legacy_fixture.rb +113 -0
- data/lib/hecks/ports/access_control.rb +7 -23
- data/lib/hecks/ports/agent/answers.rb +5 -23
- data/lib/hecks/ports/agent.rb +47 -172
- data/lib/hecks/ports/authentication.rb +12 -39
- data/lib/hecks/ports/authorization.rb +16 -43
- data/lib/hecks/ports/clock.rb +5 -45
- data/lib/hecks/ports/extraction.rb +7 -12
- data/lib/hecks/ports/identity_assignment.rb +8 -29
- data/lib/hecks/ports/identity_generation.rb +6 -29
- data/lib/hecks/ports/identity_resolution.rb +2 -10
- data/lib/hecks/ports/key_vault.rb +9 -45
- data/lib/hecks/ports/persistence/append_only.rb +61 -64
- data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
- data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
- data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
- data/lib/hecks/ports/persistence/plugin.rb +13 -42
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +44 -144
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +20 -85
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +18 -24
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +19 -76
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +43 -127
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +131 -555
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
- data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +227 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +50 -47
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +1 -0
- data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
- data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
- data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
- data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
- data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
- data/lib/hecks/ports/persistence/state_codec.rb +47 -108
- data/lib/hecks/ports/persistence.rb +7 -14
- data/lib/hecks/ports/projection.rb +42 -84
- data/lib/hecks/ports/query/in_memory.rb +10 -58
- data/lib/hecks/ports/query/ordering.rb +11 -32
- data/lib/hecks/ports/query.rb +14 -37
- data/lib/hecks/ports.rb +2 -8
- data/lib/hecks/projection_files.rb +285 -0
- data/lib/hecks/projections/bootstrap_table.rb +12 -44
- data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
- data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
- data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
- data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
- data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
- data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
- data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
- data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
- data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
- data/lib/hecks/projections/deploy/fargate.rb +40 -207
- data/lib/hecks/projections/deploy/lambda.rb +191 -708
- data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
- data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
- data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
- data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
- data/lib/hecks/projections/deploy/preview/script.rb +2 -14
- data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
- data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
- data/lib/hecks/projections/deploy/preview/template.rb +3 -59
- data/lib/hecks/projections/deploy/preview.rb +2 -67
- data/lib/hecks/projections/deploy/scripts/deploy-service.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts/expected-era.header +1 -1
- data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +3 -3
- data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
- data/lib/hecks/projections/deploy/scripts/smoke-after-deploy.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts.rb +4 -57
- data/lib/hecks/projections/deploy/shared.rb +48 -147
- data/lib/hecks/projections/deploy/smoke.rb +4 -61
- data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
- data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
- data/lib/hecks/projections/deploy/template_diff.rb +5 -57
- data/lib/hecks/projections/diagrams.rb +22 -584
- data/lib/hecks/projections/glossary/html.rb +14 -130
- data/lib/hecks/projections/glossary/markdown.rb +8 -69
- data/lib/hecks/projections/glossary/mermaid.rb +9 -66
- data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
- data/lib/hecks/projections/glossary/sentences.rb +14 -159
- data/lib/hecks/projections/glossary.rb +30 -222
- data/lib/hecks/projections/ir.rb +3 -10
- data/lib/hecks/projections/model/deviations.rb +16 -43
- data/lib/hecks/projections/model.rb +12 -51
- data/lib/hecks/projections/oidc.rb +12 -56
- data/lib/hecks/projections/parser_table.rb +13 -32
- data/lib/hecks/projections/reference.rb +4 -18
- data/lib/hecks/projections/rust_vocabulary.rb +13 -251
- data/lib/hecks/projections/shape.rb +3 -29
- data/lib/hecks/projections/statements.rb +7 -86
- data/lib/hecks/projections/vocabulary.rb +6 -22
- data/lib/hecks/projections.rb +2 -16
- data/lib/hecks/projector/cli_projector.rb +154 -400
- data/lib/hecks/projector/docs_projector.rb +10 -201
- data/lib/hecks/projector/exporter.rb +42 -134
- data/lib/hecks/projector/ir_projector.rb +2 -9
- data/lib/hecks/projector/narrate_projector.rb +15 -189
- data/lib/hecks/projector/target.rb +13 -76
- data/lib/hecks/projector.rb +30 -121
- data/lib/hecks/quality_control/adapters/agent.adapter +7 -0
- data/lib/hecks/quality_control/adapters/agent.rb +58 -0
- data/lib/hecks/quality_control/adapters/angle_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/angle_tools.rb +15 -0
- data/lib/hecks/quality_control/adapters/clearance_recorder.rb +36 -0
- data/lib/hecks/quality_control/adapters/clearance_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/clearance_tools.rb +17 -0
- data/lib/hecks/quality_control/adapters/git_pr.adapter +7 -0
- data/lib/hecks/quality_control/adapters/git_pr.rb +226 -0
- data/lib/hecks/quality_control/adapters/github_checks.adapter +9 -0
- data/lib/hecks/quality_control/adapters/github_checks.rb +83 -0
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +56 -0
- data/lib/hecks/quality_control/adapters/github_issues.adapter +7 -0
- data/lib/hecks/quality_control/adapters/github_issues.rb +49 -0
- data/lib/hecks/quality_control/adapters/qa_tool.rb +59 -0
- data/lib/hecks/quality_control/adapters/sweep_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/sweep_tools.rb +51 -0
- data/lib/hecks/quality_control/adapters/target_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/target_tools.rb +43 -0
- data/lib/hecks/quality_control/cli/child.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +248 -0
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +163 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains.rb +450 -0
- data/lib/hecks/quality_control/cli/qa_log_bug.rb +195 -0
- data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +220 -0
- data/lib/hecks/quality_control/cli/qa_open_pr.rb +305 -0
- data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +154 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +159 -0
- data/lib/hecks/quality_control/cli/qa_pr_check.rb +232 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles.rb +142 -0
- data/lib/hecks/quality_control/cli/qa_seed_targets.rb +69 -0
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +280 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +329 -0
- data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +92 -0
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +117 -0
- data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +175 -0
- data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_sweep.rb +611 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +274 -0
- data/lib/hecks/quality_control/quality_control.bluebook +2224 -0
- data/lib/hecks/quality_control/quality_control.hecksagon +13 -0
- data/lib/hecks/quality_control/quality_control.ports.hecksagon +54 -0
- data/lib/hecks/query_ir.rb +346 -0
- data/lib/hecks/query_ir_mcp.rb +198 -0
- data/lib/hecks/query_specification/common/comparators.rb +5 -26
- data/lib/hecks/query_specification/common/comparison.rb +35 -143
- data/lib/hecks/query_specification/common/dsl.rb +8 -24
- data/lib/hecks/query_specification/common/null_policy.rb +20 -70
- data/lib/hecks/query_specification/common/options.rb +2 -6
- data/lib/hecks/query_specification/common/where_clause.rb +2 -10
- data/lib/hecks/query_specification/field_path.rb +37 -77
- data/lib/hecks/query_specification/hop_path.rb +12 -76
- data/lib/hecks/release/gem_pin.rb +2 -26
- data/lib/hecks/release/runner/ci_publisher.rb +5 -8
- data/lib/hecks/release/runner/clean_tree.rb +42 -0
- data/lib/hecks/release/runner/commands.rb +2 -4
- data/lib/hecks/release/runner/console.rb +6 -0
- data/lib/hecks/release/runner/gem_publisher.rb +15 -9
- data/lib/hecks/release/runner/npm_publisher.rb +9 -53
- data/lib/hecks/release/runner/preflight.rb +29 -20
- data/lib/hecks/release/runner/published.rb +8 -26
- data/lib/hecks/release/runner/tagger.rb +31 -23
- data/lib/hecks/release/runner.rb +60 -38
- data/lib/hecks/rendering.rb +4 -26
- data/lib/hecks/router/namespace_installer.rb +15 -39
- data/lib/hecks/router.rb +4 -8
- data/lib/hecks/runtime/adapter_lookup.rb +124 -0
- data/lib/hecks/runtime/aggregate_lock.rb +8 -33
- data/lib/hecks/runtime/boot_gates.rb +3 -18
- data/lib/hecks/runtime/caller.rb +19 -59
- data/lib/hecks/runtime/capability_graph.rb +5 -21
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +27 -160
- data/lib/hecks/runtime/command_interpreter.rb +124 -306
- data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
- data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
- data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
- data/lib/hecks/runtime/command_rules/emission.rb +8 -21
- data/lib/hecks/runtime/command_rules/references.rb +23 -202
- data/lib/hecks/runtime/dependency_planning.rb +50 -104
- data/lib/hecks/runtime/dispatcher.rb +134 -243
- data/lib/hecks/runtime/entity_element.rb +40 -462
- data/lib/hecks/runtime/entity_interpreter.rb +64 -219
- data/lib/hecks/runtime/errors.rb +32 -115
- data/lib/hecks/runtime/event.rb +3 -25
- data/lib/hecks/runtime/identity.rb +18 -154
- data/lib/hecks/runtime/instance.rb +18 -150
- data/lib/hecks/runtime/interpreting.rb +14 -70
- data/lib/hecks/runtime/invocation.rb +28 -164
- data/lib/hecks/runtime/loader.rb +109 -194
- data/lib/hecks/runtime/outbox.rb +39 -262
- data/lib/hecks/runtime/policy_interpreter.rb +43 -202
- data/lib/hecks/runtime/port_operation_interpreter.rb +28 -97
- data/lib/hecks/runtime/query_interpreter.rb +122 -187
- data/lib/hecks/runtime/reaction_invocation.rb +36 -138
- data/lib/hecks/runtime/reaction_outcome.rb +89 -0
- data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
- data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
- data/lib/hecks/runtime/reference_hop.rb +8 -81
- data/lib/hecks/runtime/refusal_wording.rb +28 -87
- data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
- data/lib/hecks/runtime/registry/verification.rb +213 -227
- data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
- data/lib/hecks/runtime/registry.rb +156 -247
- data/lib/hecks/runtime/remote_dispatcher.rb +68 -154
- data/lib/hecks/runtime/routing.rb +4 -15
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
- data/lib/hecks/runtime/saga_interpreter.rb +79 -263
- data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
- data/lib/hecks/runtime/tenant_check.rb +6 -68
- data/lib/hecks/runtime/tenant_scope.rb +3 -28
- data/lib/hecks/runtime/value/admission.rb +16 -67
- data/lib/hecks/runtime/value/coercion.rb +162 -760
- data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
- data/lib/hecks/runtime/value/field_checks.rb +172 -0
- data/lib/hecks/runtime/value.rb +15 -84
- data/lib/hecks/runtime.rb +35 -69
- data/lib/hecks/rust_build/conformance.rb +158 -0
- data/lib/hecks/rust_build/conformance_fuzz.rb +71 -0
- data/lib/hecks/rust_build/coverage.rb +218 -0
- data/lib/hecks/rust_build/native_build.rb +124 -0
- data/lib/hecks/rust_build/project_rust/root_mod.rb +120 -0
- data/lib/hecks/rust_build/project_rust.rb +332 -0
- data/lib/hecks/rust_build/wasm.rb +105 -0
- data/lib/hecks/rust_build/wasm_browser.rb +113 -0
- data/lib/hecks/rust_build.rb +144 -0
- data/lib/hecks/storehouse.rb +155 -582
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +10 -34
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
- data/lib/hecks/three_zero/forms.yml +127 -0
- data/lib/hecks/three_zero.rb +12 -0
- data/lib/hecks/tools/argument_gate_matrix.rb +316 -0
- data/lib/hecks/tools/comment_style.rb +1070 -0
- data/lib/hecks/tools/corpus_report.rb +87 -0
- data/lib/hecks/tools/deploy_recipe.rb +255 -0
- data/lib/hecks/tools/deploy_recipe_lint.rb +282 -0
- data/lib/hecks/tools/drop_implicit_append_fields.rb +95 -0
- data/lib/hecks/tools/era_projection_backfill.rb +94 -0
- data/lib/hecks/tools/era_reattest.rb +146 -0
- data/lib/hecks/tools/evolve_run.rb +189 -0
- data/lib/hecks/tools/fuzz_sweep.rb +373 -0
- data/lib/hecks/tools/heki_compaction.rb +100 -0
- data/lib/hecks/tools/hoist_local_givens.rb +246 -0
- data/lib/hecks/tools/journal_compaction.rb +89 -0
- data/lib/hecks/tools/oidc_manifests.rb +70 -0
- data/lib/hecks/tools/query_ir_run.rb +81 -0
- data/lib/hecks/tools/regeneration_run.rb +166 -0
- data/lib/hecks/tools/rust_comment_style.rb +642 -0
- data/lib/hecks/tools/sequence_script.rb +62 -0
- data/lib/hecks/tools/tail_merge.rb +117 -0
- data/lib/hecks/tools/tenant_provisioning.rb +142 -0
- data/lib/hecks/tools/translation_audit.rb +208 -0
- data/lib/hecks/tools/translation_scaffold.rb +131 -0
- data/lib/hecks/tools.rb +86 -0
- data/lib/hecks/vendoring/git_environment.rb +2 -8
- data/lib/hecks/vendoring/git_source.rb +4 -10
- data/lib/hecks/vendoring.rb +7 -46
- data/lib/hecks/version.rb +3 -14
- data/lib/hecks.rb +52 -90
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
- data/qa/settings.yml +66 -0
- data/rust/.cargo/config.toml +6 -0
- data/rust/.gitignore +2 -0
- data/rust/Cargo.lock +54 -0
- data/rust/Cargo.toml +61 -0
- data/rust/build/.cargo/config.toml +3 -0
- data/rust/build/.gitignore +1 -0
- data/rust/build/Cargo.lock +7 -0
- data/rust/build/Cargo.toml +19 -0
- data/rust/build/src/build_artifact.rs +47 -0
- data/rust/build/src/cargo_sync.rs +248 -0
- data/rust/build/src/json.rs +421 -0
- data/rust/build/src/lineage_pass.rs +285 -0
- data/rust/build/src/main.rs +51 -0
- data/rust/build/src/optional_pass.rs +150 -0
- data/rust/build/src/pipeline.rs +264 -0
- data/rust/build/src/reserved_names.rs +76 -0
- data/rust/build/src/resolve.rs +124 -0
- data/rust/build/src/root.rs +25 -0
- data/rust/build/src/sidecars.rs +73 -0
- data/rust/build/src/subprocess.rs +51 -0
- data/rust/build/src/tmp.rs +31 -0
- data/rust/codegen/.cargo/config.toml +3 -0
- data/rust/codegen/.gitignore +1 -0
- data/rust/codegen/Cargo.lock +7 -0
- data/rust/codegen/Cargo.toml +20 -0
- data/rust/codegen/src/attr.rs +32 -0
- data/rust/codegen/src/bridging.rs +481 -0
- data/rust/codegen/src/commands.rs +1226 -0
- data/rust/codegen/src/constraints.rs +109 -0
- data/rust/codegen/src/dependency_planning.rs +209 -0
- data/rust/codegen/src/domain_generator.rs +1288 -0
- data/rust/codegen/src/exemplar.rs +230 -0
- data/rust/codegen/src/expr_emitter.rs +87 -0
- data/rust/codegen/src/fielded.rs +192 -0
- data/rust/codegen/src/hecks_naming.rs +33 -0
- data/rust/codegen/src/json.rs +335 -0
- data/rust/codegen/src/json_codec.rs +697 -0
- data/rust/codegen/src/literal.rs +207 -0
- data/rust/codegen/src/main.rs +290 -0
- data/rust/codegen/src/manifest.rs +227 -0
- data/rust/codegen/src/mutations.rs +784 -0
- data/rust/codegen/src/naming.rs +286 -0
- data/rust/codegen/src/ports.rs +208 -0
- data/rust/codegen/src/prelude.rs +116 -0
- data/rust/codegen/src/queries.rs +786 -0
- data/rust/codegen/src/reactions.rs +532 -0
- data/rust/codegen/src/read_models.rs +697 -0
- data/rust/codegen/src/reference_specs.rs +40 -0
- data/rust/codegen/src/registry.rs +966 -0
- data/rust/codegen/src/reserved_names.rs +76 -0
- data/rust/codegen/src/shared.rs +93 -0
- data/rust/codegen/src/skip_reason.rs +25 -0
- data/rust/codegen/src/types.rs +362 -0
- data/rust/host/.cargo/config.toml +3 -0
- data/rust/host/.gitignore +1 -0
- data/rust/host/Cargo.lock +4297 -0
- data/rust/host/Cargo.toml +61 -0
- data/rust/host/HECKS_RELEASE +1 -0
- data/rust/host/rds-ca-bundle.pem +2736 -0
- data/rust/host/src/api.rs +1596 -0
- data/rust/host/src/approval.rs +652 -0
- data/rust/host/src/auth.rs +1287 -0
- data/rust/host/src/bin/expr_harness.rs +46 -0
- data/rust/host/src/bin/lineage_harness.rs +119 -0
- data/rust/host/src/bin/mint_harness.rs +135 -0
- data/rust/host/src/checkout.rs +265 -0
- data/rust/host/src/dispatch.rs +1443 -0
- data/rust/host/src/expr_json.rs +1117 -0
- data/rust/host/src/field_hints.rs +52 -0
- data/rust/host/src/ir.rs +733 -0
- data/rust/host/src/journal.rs +874 -0
- data/rust/host/src/lambda_client.rs +378 -0
- data/rust/host/src/log.rs +147 -0
- data/rust/host/src/main.rs +474 -0
- data/rust/host/src/mint.rs +1865 -0
- data/rust/host/src/payments/keystore.rs +330 -0
- data/rust/host/src/payments/tests.rs +1400 -0
- data/rust/host/src/payments.rs +767 -0
- data/rust/host/src/presentation.rs +698 -0
- data/rust/host/src/presentation_write.rs +1431 -0
- data/rust/host/src/query_step.rs +149 -0
- data/rust/host/src/rate_limit.rs +904 -0
- data/rust/host/src/reference_transform.rs +241 -0
- data/rust/host/src/reference_validate.rs +338 -0
- data/rust/host/src/resend.rs +296 -0
- data/rust/host/src/secrets.rs +106 -0
- data/rust/host/src/server.rs +663 -0
- data/rust/host/src/storage_shape.rs +175 -0
- data/rust/host/src/test_pg.rs +40 -0
- data/rust/host/src/ui_schema.rs +1351 -0
- data/rust/host/src/wasm_runner.rs +191 -0
- data/rust/host/src/web/newsletter/cooldown.rs +126 -0
- data/rust/host/src/web/newsletter/tests.rs +104 -0
- data/rust/host/src/web/newsletter.rs +310 -0
- data/rust/host/src/web/newsletter_send.rs +357 -0
- data/rust/host/src/web/registrations.rs +1505 -0
- data/rust/host/src/web.rs +2937 -0
- data/rust/lsp/.gitignore +1 -0
- data/rust/lsp/Cargo.lock +7 -0
- data/rust/lsp/Cargo.toml +16 -0
- data/rust/lsp/README.md +133 -0
- data/rust/lsp/src/diagnostics.rs +165 -0
- data/rust/lsp/src/json.rs +385 -0
- data/rust/lsp/src/main.rs +399 -0
- data/rust/lsp/src/outline.rs +177 -0
- data/rust/lsp/src/rpc.rs +67 -0
- data/rust/parser/.cargo/config.toml +5 -0
- data/rust/parser/.gitignore +1 -0
- data/rust/parser/Cargo.lock +7 -0
- data/rust/parser/Cargo.toml +21 -0
- data/rust/parser/src/build/closed_sets.rs +27 -0
- data/rust/parser/src/build/identity.rs +276 -0
- data/rust/parser/src/build/mod.rs +12 -0
- data/rust/parser/src/build/naming.rs +141 -0
- data/rust/parser/src/build/pattern_subset.rs +161 -0
- data/rust/parser/src/build/query_derive.rs +72 -0
- data/rust/parser/src/build/query_inference.rs +269 -0
- data/rust/parser/src/build/query_options.rs +100 -0
- data/rust/parser/src/build/read_model.rs +94 -0
- data/rust/parser/src/build/references.rs +32 -0
- data/rust/parser/src/canonical.rs +114 -0
- data/rust/parser/src/diag.rs +55 -0
- data/rust/parser/src/emit.rs +953 -0
- data/rust/parser/src/expr/ast_json.rs +147 -0
- data/rust/parser/src/expr/evaluator.rs +81 -0
- data/rust/parser/src/expr/mod.rs +84 -0
- data/rust/parser/src/expr/resolver.rs +497 -0
- data/rust/parser/src/ir.rs +387 -0
- data/rust/parser/src/keywords.rs +585 -0
- data/rust/parser/src/lex.rs +662 -0
- data/rust/parser/src/main.rs +252 -0
- data/rust/parser/src/parse/aggregate.rs +612 -0
- data/rust/parser/src/parse/chapter.rs +517 -0
- data/rust/parser/src/parse/command.rs +637 -0
- data/rust/parser/src/parse/domain_port.rs +127 -0
- data/rust/parser/src/parse/entity.rs +527 -0
- data/rust/parser/src/parse/file.rs +67 -0
- data/rust/parser/src/parse/hecksagon.rs +231 -0
- data/rust/parser/src/parse/lifecycle.rs +162 -0
- data/rust/parser/src/parse/mod.rs +1262 -0
- data/rust/parser/src/parse/policy.rs +87 -0
- data/rust/parser/src/parse/process_manager.rs +305 -0
- data/rust/parser/src/parse/query.rs +100 -0
- data/rust/parser/src/parse/read_model.rs +214 -0
- data/rust/parser/src/parse/value_object.rs +250 -0
- data/rust/parser/src/ruby_value.rs +422 -0
- data/rust/project/bridging.rb +257 -0
- data/rust/project/commands.rb +877 -0
- data/rust/project/constraints.rb +86 -0
- data/rust/project/dependency_planning.rb +178 -0
- data/rust/project/domain_generator.rb +980 -0
- data/rust/project/exemplar.rb +148 -0
- data/rust/project/expr_emitter.rb +72 -0
- data/rust/project/fielded.rb +141 -0
- data/rust/project/json_codec.rb +641 -0
- data/rust/project/mutations.rb +721 -0
- data/rust/project/naming.rb +205 -0
- data/rust/project/ports.rb +65 -0
- data/rust/project/queries.rb +493 -0
- data/rust/project/reactions.rb +317 -0
- data/rust/project/read_models.rb +690 -0
- data/rust/project/reference_specs.rb +27 -0
- data/rust/project/registry.rb +396 -0
- data/rust/project/skip_reason.rb +29 -0
- data/rust/project/types.rb +225 -0
- data/rust/project/write_if_changed.rb +83 -0
- data/rust/project.rb +30 -0
- data/rust/project_rust_pipeline.rb +383 -0
- data/rust/src/exemplar/commands.rs +279 -0
- data/rust/src/exemplar/constraints.rs +18 -0
- data/rust/src/exemplar/fielded.rs +280 -0
- data/rust/src/exemplar/json.rs +277 -0
- data/rust/src/exemplar/mod.rs +17 -0
- data/rust/src/exemplar/mutations.rs +80 -0
- data/rust/src/exemplar/queries.rs +33 -0
- data/rust/src/exemplar/reactions.rs +88 -0
- data/rust/src/exemplar/read_models.rs +48 -0
- data/rust/src/exemplar/registry.rs +166 -0
- data/rust/src/exemplar/types.rs +44 -0
- data/rust/src/kernel/attribute_shapes/composite.rs +88 -0
- data/rust/src/kernel/attribute_shapes/list.rs +18 -0
- data/rust/src/kernel/attribute_shapes/mod.rs +44 -0
- data/rust/src/kernel/attribute_shapes/optional.rs +9 -0
- data/rust/src/kernel/attribute_shapes/scalar.rs +39 -0
- data/rust/src/kernel/cli.rs +585 -0
- data/rust/src/kernel/dispatch.rs +1090 -0
- data/rust/src/kernel/expr.rs +458 -0
- data/rust/src/kernel/expression_operators/arithmetic.rs +128 -0
- data/rust/src/kernel/expression_operators/comparison.rs +48 -0
- data/rust/src/kernel/expression_operators/enumeration.rs +232 -0
- data/rust/src/kernel/expression_operators/logical.rs +13 -0
- data/rust/src/kernel/expression_operators/membership.rs +18 -0
- data/rust/src/kernel/expression_operators/mod.rs +68 -0
- data/rust/src/kernel/expression_operators/pattern_match.rs +73 -0
- data/rust/src/kernel/expression_operators/positional.rs +126 -0
- data/rust/src/kernel/expression_operators/presence.rs +101 -0
- data/rust/src/kernel/expression_operators/sign_test.rs +16 -0
- data/rust/src/kernel/expression_operators/sized.rs +35 -0
- data/rust/src/kernel/expression_operators/text.rs +79 -0
- data/rust/src/kernel/expression_operators/to_string.rs +18 -0
- data/rust/src/kernel/json.rs +779 -0
- data/rust/src/kernel/mod.rs +133 -0
- data/rust/src/kernel/named_query.rs +219 -0
- data/rust/src/kernel/orchestrate.rs +1810 -0
- data/rust/src/kernel/pattern.rs +307 -0
- data/rust/src/kernel/query_comparators.rs +206 -0
- data/rust/src/kernel/query_ordering.rs +103 -0
- data/rust/src/kernel/read_model.rs +914 -0
- data/rust/src/kernel/reference_lookup.rs +149 -0
- data/rust/src/kernel/repository.rs +468 -0
- data/rust/src/kernel/routing.rs +612 -0
- data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +118 -0
- data/rust/src/kernel/vocab/entity_dispatch_order.rs +114 -0
- data/rust/src/kernel/vocab/field_hint.rs +70 -0
- data/rust/src/kernel/vocab/mod.rs +20 -0
- data/rust/src/kernel/vocab/query_comparator.rs +65 -0
- data/rust/src/kernel/vocab/refusal_template.rs +1592 -0
- data/rust/src/lib.rs +8 -0
- data/rust/src/main.rs +16 -0
- data/rust/web/.gitignore +1 -0
- data/rust/web/Cargo.lock +119 -0
- data/rust/web/Cargo.toml +18 -0
- data/rust/web/src/lib.rs +8 -0
- metadata +478 -12
- data/lib/hecks/facade/cli_door.rb +0 -178
- data/lib/hecks/facade/cli_runner.rb +0 -271
- data/lib/hecks/facade/handle.rb +0 -293
- data/lib/hecks/facade/json_door.rb +0 -247
- data/lib/hecks/facade/surface/aggregate_door.rb +0 -222
- data/lib/hecks/facade/surface/chapter.rb +0 -116
- data/lib/hecks/facade/surface.rb +0 -61
- data/lib/hecks/mcp_door_scope.rb +0 -176
|
@@ -6,32 +6,20 @@ require_relative "../../runtime/errors"
|
|
|
6
6
|
|
|
7
7
|
module Hecks
|
|
8
8
|
module Adapters
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
# value-object member-picking Postgres/Sqlite/D1's own
|
|
12
|
-
# order_expression does (numeric member wins, else the one-field
|
|
13
|
-
# convention "value"), just walked in Ruby instead of compiled to a
|
|
14
|
-
# JSONB/json_extract path, because there is no query engine
|
|
15
|
-
# underneath any of these three to hide that walk inside.
|
|
9
|
+
# Ordering for adapters that hold decoded Ruby records (Memory, Lambda, Heki),
|
|
10
|
+
# mirroring the SQL adapters' value-object member picking.
|
|
16
11
|
module InMemoryOrdering
|
|
17
12
|
module_function
|
|
18
13
|
|
|
19
|
-
# Orders decoded records by a declared attribute, then by id as the
|
|
20
|
-
# tiebreaker.
|
|
14
|
+
# Orders decoded records by a declared attribute, then by id as the tiebreaker.
|
|
21
15
|
#
|
|
22
|
-
# order_by
|
|
23
|
-
# console's case), not framework-authored bluebook source — see
|
|
24
|
-
# postgres.rb's own all for the full reasoning. Whitelisted the
|
|
25
|
-
# identical way before FieldPath.dig ever runs.
|
|
16
|
+
# `order_by` may come from an HTTP query param, so it is checked before `FieldPath.dig`.
|
|
26
17
|
#
|
|
27
18
|
# @param records [Array<Runtime::Instance>] the records to order
|
|
28
|
-
# @param aggregate [Bluebook::Aggregate] the aggregate `records` belong to
|
|
29
|
-
#
|
|
30
|
-
# @param order_by [String, Symbol, nil] a dotted attribute path to sort by; nil returns
|
|
31
|
-
# `records` unchanged
|
|
19
|
+
# @param aggregate [Bluebook::Aggregate] the aggregate `records` belong to
|
|
20
|
+
# @param order_by [String, Symbol, nil] a dotted attribute path; nil returns `records` as-is
|
|
32
21
|
# @param direction [Symbol] `:asc` or `:desc`
|
|
33
|
-
# @return [Array<Runtime::Instance>] `records`, ordered by `order_by` then id
|
|
34
|
-
# when `order_by` is nil
|
|
22
|
+
# @return [Array<Runtime::Instance>] `records`, ordered by `order_by` then id
|
|
35
23
|
# @raise [Runtime::WiringError] if `order_by` names no attribute of `aggregate` and is
|
|
36
24
|
# not its lifecycle field
|
|
37
25
|
def ordered(records, aggregate:, order_by:, direction:)
|
|
@@ -68,13 +56,8 @@ module Hecks
|
|
|
68
56
|
vo = aggregate.value_object(attribute.type)
|
|
69
57
|
return field.to_s unless vo
|
|
70
58
|
|
|
71
|
-
# Numeric member
|
|
72
|
-
#
|
|
73
|
-
# — the same generalization `SqlQueryBuilder#query_expression`
|
|
74
|
-
# makes for the column side, kept in lockstep so Memory and SQL
|
|
75
|
-
# order the identical rows identically), and only then the bare
|
|
76
|
-
# `value` convention — now purely a backstop for the multi-field
|
|
77
|
-
# non-numeric shape neither rule can honestly pick a field for.
|
|
59
|
+
# Numeric member, else the sole attribute, else `value`; kept in lockstep with
|
|
60
|
+
# `SqlQueryBuilder#query_expression` so Memory and SQL order rows identically.
|
|
78
61
|
member = vo.attributes.find { |a| %w[Integer Float].include?(a.type) }&.name ||
|
|
79
62
|
vo.sole_attribute&.name || "value"
|
|
80
63
|
"#{name}.#{member}"
|
|
@@ -2,20 +2,8 @@ require "securerandom"
|
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
4
|
module Adapters
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
# a bluebook or an event. Cryptoshredding only works if the key
|
|
8
|
-
# genuinely leaves memory when destroyed: `destroy` deletes the Hash
|
|
9
|
-
# entry outright, not merely a flag, so a `fetch` afterward has
|
|
10
|
-
# nothing left to decrypt with.
|
|
11
|
-
#
|
|
12
|
-
# **Not crash-durable** — a process restart loses every key this
|
|
13
|
-
# adapter ever issued, along with every ciphertext under it. A
|
|
14
|
-
# deployment that needs destruction to survive a restart (or to leave
|
|
15
|
-
# a physical-destruction audit trail) backs this port with a real
|
|
16
|
-
# `KMS` or `HSM` instead; this default asks for nothing external to
|
|
17
|
-
# run, the same tradeoff `SecureRandomIdentity` already makes for
|
|
18
|
-
# identity minting.
|
|
5
|
+
# In-process `key_vault` fulfillment: key material held under opaque references.
|
|
6
|
+
# Not crash-durable; use a KMS or HSM when destruction must survive a restart.
|
|
19
7
|
module InProcessKeyVault
|
|
20
8
|
module_function
|
|
21
9
|
|
|
@@ -3,48 +3,13 @@ require "json"
|
|
|
3
3
|
module Hecks
|
|
4
4
|
module Adapters
|
|
5
5
|
class Lambda
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
# write methods. One Lambda invoke, one JSON round trip, nothing
|
|
9
|
-
# domain-specific: neither caller needs to know an AWS SDK is
|
|
10
|
-
# involved at all.
|
|
6
|
+
# The thin AWS client shared by this adapter's read methods and
|
|
7
|
+
# Runtime::RemoteDispatcher's writes: one Lambda invoke, one JSON round trip.
|
|
11
8
|
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
# exactly (bin/project_deploy: `stack_name = "hecks-#{domain_name}"`,
|
|
17
|
-
# `domain_name = File.basename(domain)`). `domain` here is the
|
|
18
|
-
# bluebook's own declared name (`Embryonaut`, not the directory);
|
|
19
|
-
# today's real corpus has directory name == declared name
|
|
20
|
-
# lowercased for every domain that deploys, so `.downcase` alone
|
|
21
|
-
# reproduces the same string bin/project_deploy computes from the
|
|
22
|
-
# directory.
|
|
23
|
-
#
|
|
24
|
-
# ## When the assumption breaks
|
|
25
|
-
#
|
|
26
|
-
# That assumption is not always true, and when it breaks nothing
|
|
27
|
-
# about it is recoverable from here. `bin/project_deploy` honours
|
|
28
|
-
# a `.world`'s own `stack_prefix`/`stack_name` — settings that
|
|
29
|
-
# exist precisely so a domain whose AWS identity predates a rename
|
|
30
|
-
# keeps targeting the stack that is actually live rather than
|
|
31
|
-
# standing up a second, empty one beside it. A real one:
|
|
32
|
-
# a client site deploys under a fixed stack name, and no
|
|
33
|
-
# value of `domain` (or of `DOMAIN_NAME`, the deployed-Lambda
|
|
34
|
-
# override callers already pass) can make this computation produce
|
|
35
|
-
# a name with no dash after "hecks". Every Ruby-side read and
|
|
36
|
-
# dispatch for that app has therefore been invoking a function
|
|
37
|
-
# that does not exist — found live, and visible in the deployed
|
|
38
|
-
# journal having never received a single row.
|
|
39
|
-
#
|
|
40
|
-
# ## Naming it explicitly
|
|
41
|
-
#
|
|
42
|
-
# So the name can be named, in the one place the rest of this
|
|
43
|
-
# deployment is already described: the `.world`'s own
|
|
44
|
-
# `persisted_by("Lambda")`/`dispatched_by("Lambda")` block, beside
|
|
45
|
-
# `region`. Given, it wins outright; absent, the computation above
|
|
46
|
-
# is unchanged, which is every domain whose stack name was never
|
|
47
|
-
# pinned.
|
|
9
|
+
# The function name defaults to `"hecks-#{domain.downcase}"`, matching
|
|
10
|
+
# `hecks deploy project`'s `stack_name` computation. A domain whose stack
|
|
11
|
+
# name doesn't follow that pattern must pass `function` explicitly, via
|
|
12
|
+
# a `.world`'s `persisted_by("Lambda")`/`dispatched_by("Lambda")` block.
|
|
48
13
|
class Client
|
|
49
14
|
# @param domain [String, Symbol] the bluebook's own declared domain name; computes
|
|
50
15
|
# the function name when `function` is not given
|
|
@@ -58,20 +23,14 @@ module Hecks
|
|
|
58
23
|
@client = Aws::Lambda::Client.new(region: region)
|
|
59
24
|
end
|
|
60
25
|
|
|
61
|
-
# The function this client actually invokes
|
|
62
|
-
#
|
|
63
|
-
# directly, since "which function did we call" is otherwise
|
|
64
|
-
# unanswerable from outside.
|
|
26
|
+
# The function this client actually invokes; used in `Runtime::WiringError`
|
|
27
|
+
# messages and worth asserting on directly in tests.
|
|
65
28
|
attr_reader :function_name
|
|
66
29
|
|
|
67
30
|
# Reads the whole domain's current state and event log from the remote function.
|
|
68
31
|
#
|
|
69
|
-
#
|
|
70
|
-
#
|
|
71
|
-
# caching here, deliberately: memoizing this across calls once
|
|
72
|
-
# silently served stale reads for a warm web process's whole
|
|
73
|
-
# lifetime after a write happened elsewhere — see Lambda#instances's
|
|
74
|
-
# own comment on the real, live bug that caught it.
|
|
32
|
+
# No caching here, deliberately: a memoized read would go stale the
|
|
33
|
+
# moment a write happens elsewhere in a long-lived process.
|
|
75
34
|
#
|
|
76
35
|
# @return [Hash{String => Object}] the parsed JSON response; the deployed function's
|
|
77
36
|
# own top-level keys (`"instances"`, `"events"`, …)
|
|
@@ -6,24 +6,8 @@ require_relative "../../runtime/instance"
|
|
|
6
6
|
|
|
7
7
|
module Hecks
|
|
8
8
|
module Adapters
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
# machinery `persisted_by("Postgres")`/`persisted_by("Memory")`
|
|
12
|
-
# already use (`Runtime::Registry#repository`, `RepositoryFactory
|
|
13
|
-
# .build`) — no new framework plumbing, just a new adapter class at
|
|
14
|
-
# the name the existing lookup already expects. See
|
|
15
|
-
# `Runtime::RemoteDispatcher` for the write-side half; the two
|
|
16
|
-
# compose through one shared `Client` per domain rather than each
|
|
17
|
-
# inventing its own AWS wiring.
|
|
18
|
-
#
|
|
19
|
-
# **Read-only, deliberately** — `append`/`project` raise rather than
|
|
20
|
-
# silently no-op. A write reaching this class would mean
|
|
21
|
-
# `Runtime::CommandInterpreter` ran locally against a Lambda-routed
|
|
22
|
-
# domain, which is exactly the bypass `Runtime::RemoteDispatcher`
|
|
23
|
-
# exists to prevent (business-rule validation must happen in Rust
|
|
24
|
-
# for these domains, not be pre-computed here against an
|
|
25
|
-
# incomplete local view). A loud failure here is the correct
|
|
26
|
-
# outcome, not a bug to route around.
|
|
9
|
+
# Read-side adapter for `persisted_by("Lambda")`; writes go through Runtime::RemoteDispatcher.
|
|
10
|
+
# Read-only: `append`/`project` raise, since a local write would bypass remote validation.
|
|
27
11
|
class Lambda
|
|
28
12
|
include Ports::Persistence::RemoteRuntime
|
|
29
13
|
|
|
@@ -50,41 +34,11 @@ module Hecks
|
|
|
50
34
|
aggregate.name
|
|
51
35
|
end
|
|
52
36
|
region = setting(settings, :region, "us-east-1")
|
|
53
|
-
#
|
|
54
|
-
# — `Client`'s own comment has the real case that needs it.
|
|
55
|
-
# Absent (every domain whose stack name was never pinned), the
|
|
56
|
-
# computation below is exactly as it was.
|
|
37
|
+
# Explicit function name, for deployments whose function is not `hecks-<domain>`.
|
|
57
38
|
function = setting(settings, :function, nil)
|
|
58
|
-
#
|
|
59
|
-
# (
|
|
60
|
-
#
|
|
61
|
-
# rust/host's own `Store::instances()` keys every record
|
|
62
|
-
# (`registry.rb`'s own `"#{a[:domain_name]}::#{a[:name]}#"`
|
|
63
|
-
# dump format, unchanged by which chapter attached it). The
|
|
64
|
-
# function to actually call is a different question: Governance
|
|
65
|
-
# and Identity aggregates are compiled into the attaching
|
|
66
|
-
# domain's own Lambda (one merged `Store` per target — Phase 0's
|
|
67
|
-
# framework-bluebook work), never a function of their own, so
|
|
68
|
-
# `settings[:domain]` is the wrong signal for `Client.new`.
|
|
69
|
-
# `root` is the boot's own directory (`Registry#root`, shared by
|
|
70
|
-
# every bluebook in one registry regardless of which one
|
|
71
|
-
# attached it) — `File.basename(root)` reproduces the exact
|
|
72
|
-
# same string `bin/project_deploy`'s own `stack_name` computes
|
|
73
|
-
# from the domain path, so the two can never name two
|
|
74
|
-
# different functions for the same deploy... on a local boot,
|
|
75
|
-
# where `root` is a real project directory. Inside the deployed
|
|
76
|
-
# Lambda itself `root` is always `/var/task` (every Lambda's own
|
|
77
|
-
# fixed code root, regardless of domain) — `File.basename` gives
|
|
78
|
-
# "task", not the domain name, and invokes the wrong function
|
|
79
|
-
# entirely. A real, live AccessDeniedException on
|
|
80
|
-
# "hecks-task" caught this: invisible through every earlier
|
|
81
|
-
# phase's own verify step, all run from a local boot, until
|
|
82
|
-
# WebFunction became the first Ruby process to ever make this
|
|
83
|
-
# exact call from inside a deployed Lambda. `DOMAIN_NAME` (set
|
|
84
|
-
# by bin/project_deploy's own WebFunction Environment) is the
|
|
85
|
-
# real, unambiguous signal in that specific context; the
|
|
86
|
-
# root-basename heuristic stays as the local-boot fallback,
|
|
87
|
-
# unchanged.
|
|
39
|
+
# `domain` only prefixes the instances lookup; the function to call is named by
|
|
40
|
+
# DOMAIN_NAME (set in a deployed Lambda, where root is always /var/task), else by
|
|
41
|
+
# root's basename, which matches hecks deploy project's stack name on a local boot.
|
|
88
42
|
function_domain = ENV["DOMAIN_NAME"] || (root ? File.basename(root) : domain)
|
|
89
43
|
@client = Client.new(domain: function_domain, region: region, function: function)
|
|
90
44
|
@prefix = "#{domain}::#{aggregate.hecks_name}#"
|
|
@@ -128,21 +82,9 @@ module Hecks
|
|
|
128
82
|
Ports::Query::InMemory.execute(instances.values, specification, args)
|
|
129
83
|
end
|
|
130
84
|
|
|
131
|
-
# `entries`/`append`/`project` — the append-only contract
|
|
132
|
-
# `Ports::Persistence::AppendOnly` requires of every adapter
|
|
133
|
-
# (raises at construction if any are missing). Answered by
|
|
134
|
-
# `Ports::Persistence::RemoteRuntime`, included above: `entries` is
|
|
135
|
-
# `[]` unconditionally (Lambda's own Postgres is already the
|
|
136
|
-
# durable store — rust/host's rehydrate-and-replay journal, Phase
|
|
137
|
-
# 1 — there is no local write-ahead log for `recover!` to replay),
|
|
138
|
-
# `append`/`project` raise rather than silently no-op.
|
|
139
|
-
|
|
140
85
|
# Reads a world setting under either a Symbol or a String key, with a fallback.
|
|
141
86
|
#
|
|
142
|
-
#
|
|
143
|
-
# string-keyed from a round-tripped export, so every read has to
|
|
144
|
-
# accept both — one helper rather than the same five lines per
|
|
145
|
-
# key.
|
|
87
|
+
# Settings arrive symbol-keyed from the DSL and string-keyed from a round-tripped export.
|
|
146
88
|
#
|
|
147
89
|
# @param settings [Hash] the world settings Hash to read from
|
|
148
90
|
# @param key [Symbol] the setting name, tried as itself and as `key.to_s`
|
|
@@ -157,21 +99,8 @@ module Hecks
|
|
|
157
99
|
|
|
158
100
|
private
|
|
159
101
|
|
|
160
|
-
#
|
|
161
|
-
#
|
|
162
|
-
# held by the registry `RUNTIME = Hecks.boot(...)` builds once
|
|
163
|
-
# per Lambda web process — WebFunction's own top-level constant,
|
|
164
|
-
# reused warm across every HTTP request that process serves, not
|
|
165
|
-
# rebuilt per request the way memoizing here would wrongly assume).
|
|
166
|
-
# A real, live bug caught this: a mutation
|
|
167
|
-
# dispatched fine (RemoteDispatcher always calls the dispatch
|
|
168
|
-
# Lambda fresh) and the very next `.all` on the same warm
|
|
169
|
-
# container kept returning the state from before that mutation,
|
|
170
|
-
# forever, until the container cold-started — memoizing here
|
|
171
|
-
# made every write invisible to every read on a warm container.
|
|
172
|
-
# Keyed by bare id (the part after "Domain::Aggregate#"), not the
|
|
173
|
-
# full "Domain::Aggregate#id" string — callers already know which
|
|
174
|
-
# aggregate they're asking this instance about.
|
|
102
|
+
# Never memoized: the adapter outlives requests on a warm container, so a cached read
|
|
103
|
+
# would hide every later write. Keyed by the bare id after "Domain::Aggregate#".
|
|
175
104
|
def instances
|
|
176
105
|
@client.read.fetch("instances", {}).filter_map do |key, state|
|
|
177
106
|
next unless key.start_with?(@prefix)
|
|
@@ -180,10 +109,7 @@ module Hecks
|
|
|
180
109
|
end.to_h
|
|
181
110
|
end
|
|
182
111
|
|
|
183
|
-
#
|
|
184
|
-
# keys (plain `JSON.parse`, no `symbolize_names:`) — decoded through
|
|
185
|
-
# the state codec (PR A3), the same IR-driven spelling every other
|
|
186
|
-
# adapter's read produces.
|
|
112
|
+
# The response is string-keyed JSON; the state codec decodes it as every adapter's read does.
|
|
187
113
|
def build_instance(id, state)
|
|
188
114
|
Runtime::Instance.new(aggregate: @aggregate, id: id, state: Ports::Persistence::StateCodec.decode(@aggregate, state))
|
|
189
115
|
end
|
|
@@ -5,36 +5,10 @@ require_relative "../../runtime/instance"
|
|
|
5
5
|
|
|
6
6
|
module Hecks
|
|
7
7
|
module Adapters
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
# `window.localStorage` at all (it is per-tab, per-origin, JS-only,
|
|
11
|
-
# unreachable over any network the way D1's own REST API is) — so
|
|
12
|
-
# this Ruby-side adapter is honestly a stand-in: in-process, ephemeral,
|
|
13
|
-
# mechanically identical to Memory. What earns it a name of its own
|
|
14
|
-
# is what it declares, not what it happens to do in Ruby: `persisted_by
|
|
15
|
-
# "LocalStorage"` says "this domain expects real, durable, single-
|
|
16
|
-
# device storage the moment it's actually running where it's meant to
|
|
17
|
-
# run" — the same distinction Heki (real local durability) already
|
|
18
|
-
# draws against Memory (deliberately ephemeral, test/example-only),
|
|
19
|
-
# one adapter over. `bin/console`, the fuzzer, `spec/`, `bin/
|
|
20
|
-
# model_check` all get a domain that boots and behaves correctly
|
|
21
|
-
# against this adapter; only a real browser gets the real durability.
|
|
22
|
-
#
|
|
23
|
-
# The real browser half lives outside this file entirely: `rust/web`'s
|
|
24
|
-
# `dispatch(json)` (docs/implemented/decisions/0015) takes an optional
|
|
25
|
-
# `"seed"` (the exact `"instances"` shape it also answers with) plus
|
|
26
|
-
# `"steps"` — a host rehydrates from a prior snapshot and replays only
|
|
27
|
-
# the new command(s), rather than the whole history every call. A
|
|
28
|
-
# page bound to this adapter is expected to hold that snapshot in
|
|
29
|
-
# `window.localStorage` itself (get on load, set after every
|
|
30
|
-
# `dispatch`) — the seed/instances round trip is the adapter, once
|
|
31
|
-
# you're in the one runtime that can actually reach the storage this
|
|
32
|
-
# name promises.
|
|
8
|
+
# Declares browser-local storage; in Ruby it behaves like Memory (in-process, ephemeral).
|
|
9
|
+
# Only a real browser page, holding the rust/web `dispatch` snapshot, gets durability.
|
|
33
10
|
class LocalStorage
|
|
34
|
-
#
|
|
35
|
-
# browser tab is exactly one origin, exactly one user; there is no
|
|
36
|
-
# second tenant this in-process Hash could ever confuse a first
|
|
37
|
-
# one with.
|
|
11
|
+
# Trivially tenant-capable, as Memory is: a browser tab is one origin and one user.
|
|
38
12
|
#
|
|
39
13
|
# @return [Boolean] true, always
|
|
40
14
|
def self.tenant_capable? = true
|
|
@@ -79,10 +53,7 @@ module Hecks
|
|
|
79
53
|
|
|
80
54
|
# Answers a declared query specification against the projected records.
|
|
81
55
|
#
|
|
82
|
-
#
|
|
83
|
-
# dialect of its own, same as Heki/Memory — a personal-scale local
|
|
84
|
-
# store answering by walking `all` is correct on day one, and
|
|
85
|
-
# nothing about a browser tab's own data volume asks for pushdown.
|
|
56
|
+
# No compiled dialect, as with Heki and Memory: walking `all` suffices at tab-sized volumes.
|
|
86
57
|
#
|
|
87
58
|
# @param specification [QuerySpecification::Common::Options,
|
|
88
59
|
# Bluebook::Behaviour::ReadModel::FilteredOptions] the declared query specification
|
|
@@ -181,13 +152,7 @@ module Hecks
|
|
|
181
152
|
|
|
182
153
|
def copy(state) = Ports::Persistence::StateCodec.copy(@aggregate, state)
|
|
183
154
|
|
|
184
|
-
#
|
|
185
|
-
# makes and states plainly (writing-an-adapter.md's own section on
|
|
186
|
-
# it): a domain bound here has no edge for its own shape to travel
|
|
187
|
-
# across if it ever changes; that must be hand-migrated, or the
|
|
188
|
-
# shape must not change. A browser-local personal store is exactly
|
|
189
|
-
# the small-adapter case that guide names as a fine place to make
|
|
190
|
-
# that trade.
|
|
155
|
+
# Deliberately not lineage_capable?, as with Heki: a shape change must be hand-migrated.
|
|
191
156
|
end
|
|
192
157
|
end
|
|
193
158
|
end
|
|
@@ -5,22 +5,13 @@ require_relative "../../runtime/instance"
|
|
|
5
5
|
|
|
6
6
|
module Hecks
|
|
7
7
|
module Adapters
|
|
8
|
-
# The default
|
|
9
|
-
#
|
|
10
|
-
# with an append-only `@entries`/`@events` log alongside it. Every
|
|
11
|
-
# behaviors suite must resolve to this one (see
|
|
12
|
-
# Behaviors::Expectations#guard_memory_only!) precisely because a fresh
|
|
13
|
-
# instance really is a fresh store, with nothing shared across tests or
|
|
14
|
-
# tenants.
|
|
8
|
+
# The default in-process adapter: a Hash of `Runtime::Instance` records
|
|
9
|
+
# per aggregate, plus an append-only `@entries`/`@events` log.
|
|
15
10
|
class Memory
|
|
16
11
|
# Reports that two tenant boots of this adapter never share state.
|
|
17
12
|
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
# two `Runtime.boot` calls build two entirely separate Registry
|
|
21
|
-
# objects and, through them, two entirely separate Memory
|
|
22
|
-
# instances, so two tenant boots never share this adapter's state
|
|
23
|
-
# by construction — nothing here needs to know "tenant" exists.
|
|
13
|
+
# Trivially true: `@records` is a plain ivar, and each `Runtime.boot`
|
|
14
|
+
# builds a wholly separate Memory instance.
|
|
24
15
|
#
|
|
25
16
|
# @return [Boolean] always true
|
|
26
17
|
def self.tenant_capable? = true
|
|
@@ -43,6 +34,7 @@ module Hecks
|
|
|
43
34
|
@events = []
|
|
44
35
|
@entries = []
|
|
45
36
|
@outbox = []
|
|
37
|
+
@outbox_deliveries = {}
|
|
46
38
|
end
|
|
47
39
|
|
|
48
40
|
# Looks up the current record for one aggregate identity.
|
|
@@ -81,11 +73,10 @@ module Hecks
|
|
|
81
73
|
|
|
82
74
|
# Records one journal entry, holding a codec copy of its state.
|
|
83
75
|
#
|
|
84
|
-
#
|
|
85
|
-
#
|
|
86
|
-
#
|
|
87
|
-
#
|
|
88
|
-
# plain-Hash shape a Heki/Sqlite/Postgres entry has.
|
|
76
|
+
# Like every durable adapter, the journal holds `StateCodec.copy` —
|
|
77
|
+
# what an encode-to-JSON then decode would hand back — never the
|
|
78
|
+
# caller's own live state objects, so an entry read back here has
|
|
79
|
+
# the same deep-symbol, plain-Hash shape a Heki/Sqlite/Postgres entry has.
|
|
89
80
|
#
|
|
90
81
|
# @param entry [Ports::Persistence::Entry] the save or delete to journal
|
|
91
82
|
# @return [Ports::Persistence::Entry] the caller's own `entry`, not the journalled copy
|
|
@@ -163,18 +154,8 @@ module Hecks
|
|
|
163
154
|
|
|
164
155
|
# Empties the records, journal, event log and outbox, keeping the adapter itself.
|
|
165
156
|
#
|
|
166
|
-
#
|
|
167
|
-
#
|
|
168
|
-
# forwards to it and only raises when the wrapped adapter doesn't
|
|
169
|
-
# respond to `reset!` at all, and nothing about "in memory" implies
|
|
170
|
-
# "cannot be cleared". Existing callers that fully re-`Hecks.boot`
|
|
171
|
-
# a domain per test case don't need this — they get a brand new
|
|
172
|
-
# `Memory` instance, with brand new empty `@records`/`@events`/
|
|
173
|
-
# `@entries`, for free. This is for the other case: a caller that
|
|
174
|
-
# deliberately keeps one booted runtime across many cases (to skip
|
|
175
|
-
# `load_domain`'s own per-boot parse/verify cost) and wants each
|
|
176
|
-
# case to start from the same clean slate `Hecks.boot` would have
|
|
177
|
-
# given it, without paying for a fresh boot to get there.
|
|
157
|
+
# Lets a caller that keeps one booted runtime across many cases reset
|
|
158
|
+
# to a clean slate without paying for a fresh boot.
|
|
178
159
|
#
|
|
179
160
|
# @return [Adapters::Memory] self, now empty
|
|
180
161
|
def reset!
|
|
@@ -182,6 +163,7 @@ module Hecks
|
|
|
182
163
|
@events = []
|
|
183
164
|
@entries = []
|
|
184
165
|
@outbox = []
|
|
166
|
+
@outbox_deliveries = {}
|
|
185
167
|
self
|
|
186
168
|
end
|
|
187
169
|
|
|
@@ -205,10 +187,11 @@ module Hecks
|
|
|
205
187
|
# was a duplicate
|
|
206
188
|
def outbox_enqueue(rows)
|
|
207
189
|
rows.filter_map do |row|
|
|
208
|
-
next nil if @
|
|
190
|
+
next nil if @outbox_deliveries.key?(row.delivery_id)
|
|
209
191
|
|
|
210
192
|
row.id = @outbox.size + 1
|
|
211
193
|
@outbox << row
|
|
194
|
+
@outbox_deliveries[row.delivery_id] = true
|
|
212
195
|
row
|
|
213
196
|
end
|
|
214
197
|
end
|
|
@@ -219,7 +202,7 @@ module Hecks
|
|
|
219
202
|
# @return [Boolean] true when the row was pending and is now claimed; false when it is
|
|
220
203
|
# unknown or not pending
|
|
221
204
|
def outbox_claim(id) # rubocop:disable Naming/PredicateMethod
|
|
222
|
-
row =
|
|
205
|
+
row = outbox_row(id)
|
|
223
206
|
return false unless row&.pending?
|
|
224
207
|
|
|
225
208
|
row.status = "claimed"
|
|
@@ -235,7 +218,7 @@ module Hecks
|
|
|
235
218
|
# @param error [String, nil] the failure description, or nil to clear it
|
|
236
219
|
# @return [Boolean] true when the row exists and was updated; false when no row has `id`
|
|
237
220
|
def outbox_settle(id, status:, error: nil) # rubocop:disable Naming/PredicateMethod
|
|
238
|
-
row =
|
|
221
|
+
row = outbox_row(id) or return false
|
|
239
222
|
row.status = status.to_s
|
|
240
223
|
row.error = error
|
|
241
224
|
true
|
|
@@ -253,74 +236,23 @@ module Hecks
|
|
|
253
236
|
|
|
254
237
|
private
|
|
255
238
|
|
|
256
|
-
#
|
|
257
|
-
# otherwise. `MetaValidator::Judge` dispatches every declaration in the
|
|
258
|
-
# self-hosted grammar into a fresh, private, never-durable `Memory`
|
|
259
|
-
# store (meta_validator.rb's own header: "each bluebook is judged in a
|
|
260
|
-
# fresh in-memory store") — and every nested-entity dispatch (a
|
|
261
|
-
# `ValueObject::Member`, then one `ValueObject::Member::Pair` per
|
|
262
|
-
# key/value pair) re-saves the whole parent aggregate, because entities
|
|
263
|
-
# have no storage of their own (S17, ADR 0026). A table of N member
|
|
264
|
-
# rows costs O(N) dispatches, each paying twice for the aggregate's own
|
|
265
|
-
# size-N state: once in `StateCodec.copy` (`append`/`project`'s own
|
|
266
|
-
# encode-then-decode round trip) and again in `Instance#initialize`'s
|
|
267
|
-
# `hydrate_with_defaults`, which re-walks and re-validates every
|
|
268
|
-
# element of an entity list on every save regardless of how many of
|
|
269
|
-
# them were already valid as of the previous one
|
|
270
|
-
# (`Value::EntityListCoercion#hydrate_entity_list` has no "already
|
|
271
|
-
# hydrated" shortcut for entity elements — only a value-object list
|
|
272
|
-
# element gets one). Both are O(N) per save, so a table of N rows
|
|
273
|
-
# costs O(N^2) total — and it is paid by every rspec worker and every
|
|
274
|
-
# `bin/*` subprocess that boots the language at all (found live: PR
|
|
275
|
-
# #738's 128-row `RefusalSiteArgument` table alone tripled this one
|
|
276
|
-
# aggregate's own save time, 6.7s -> 18.2s).
|
|
239
|
+
# Finds a held outbox row by id in constant time.
|
|
277
240
|
#
|
|
278
|
-
#
|
|
279
|
-
#
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
#
|
|
287
|
-
#
|
|
288
|
-
#
|
|
289
|
-
#
|
|
290
|
-
#
|
|
291
|
-
#
|
|
292
|
-
#
|
|
293
|
-
# same `Value.for_attribute`/`hydrate_with_defaults` machinery
|
|
294
|
-
# `StateCodec.copy` and `Instance.new`'s default (`hydrate: true`)
|
|
295
|
-
# path would otherwise redo. Every value inside it — a `Runtime::
|
|
296
|
-
# Value` (frozen through, see value.rb's own header) or a `list_of`
|
|
297
|
-
# attribute's own array (`Freezer.deep`d the moment it was built,
|
|
298
|
-
# instance.rb's own header on `Instance#dup`) — is already immutable,
|
|
299
|
-
# so a bare top-level `.dup` is exactly as safe as `Instance#dup`
|
|
300
|
-
# already trusts it to be everywhere else in this codebase; nothing
|
|
301
|
-
# below the top level is ever mutated in place. Re-deriving the same
|
|
302
|
-
# answer through the codec and through re-hydration is therefore
|
|
303
|
-
# pure, avoidable cost for this one caller — never a correctness
|
|
304
|
-
# requirement.
|
|
305
|
-
#
|
|
306
|
-
# `bootstrap_fast_path?` is the guard, and it is deliberately cheap —
|
|
307
|
-
# O(this aggregate's own declared attribute count), never O(N) — so
|
|
308
|
-
# it cannot reintroduce the very cost it exists to avoid: `StateCodec.
|
|
309
|
-
# decoded?` (the obvious-looking alternative) recurses into every
|
|
310
|
-
# `list_of` element to check it, which is exactly the O(N) walk this
|
|
311
|
-
# whole change removes. A `Hash` with every top-level key already a
|
|
312
|
-
# `Symbol` is what `Instance#state` always looks like (`Value.hydrate`
|
|
313
|
-
# refuses anything else, coercion.rb's own header), so it is checked
|
|
314
|
-
# here instead — true for the actual shape every real save has,
|
|
315
|
-
# false (falling back to the always-correct slow path) for anything
|
|
316
|
-
# that somehow doesn't.
|
|
317
|
-
#
|
|
318
|
-
# Verified empirically before landing, not just argued: instrumenting
|
|
319
|
-
# every bootstrapping-time save across a full `grammar_registry` boot
|
|
320
|
-
# and comparing this fast path's own state, journal entry, and stored
|
|
321
|
-
# `Instance` against the unmodified `StateCodec.copy` + `Instance.new
|
|
322
|
-
# (hydrate: true)` pipeline's found them equal (`==`) for every one of
|
|
323
|
-
# 6,617 saves, zero mismatches.
|
|
241
|
+
# Ids are assigned as the 1-based position at enqueue and rows are never
|
|
242
|
+
# removed, so the id is the row's index plus one.
|
|
243
|
+
def outbox_row(id)
|
|
244
|
+
return nil unless id.is_a?(Integer) && id >= 1
|
|
245
|
+
|
|
246
|
+
@outbox[id - 1]
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# Skips the codec copy and rehydration round trip while judging the
|
|
250
|
+
# self-hosted grammar (S17, ADR 0026), where re-validating already-valid
|
|
251
|
+
# entity state costs O(N) per save and O(N^2) across an N-row table.
|
|
252
|
+
# Safe only here: `entry.state` is already hydrated, validated, deep-
|
|
253
|
+
# frozen state from the same Value machinery the skipped paths rerun.
|
|
254
|
+
# The check itself must stay O(this aggregate's attribute count), not
|
|
255
|
+
# O(N), so it can't reintroduce the cost it exists to avoid.
|
|
324
256
|
def bootstrap_fast_path?(state)
|
|
325
257
|
Runtime::Value.judge_bootstrapping? && state.is_a?(Hash) && state.keys.all?(Symbol)
|
|
326
258
|
end
|
|
@@ -2,20 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
4
|
module Adapters
|
|
5
|
-
# A
|
|
6
|
-
#
|
|
7
|
-
# adapter a project pairs it with by shape alone
|
|
8
|
-
# (`create_session(event:, registration_id:, success_url:, cancel_url:)
|
|
9
|
-
# -> a URL string`), the same way `Memory` stands in for a real
|
|
10
|
-
# persistence adapter without knowing anything about the domain bound
|
|
11
|
-
# to it. Never reads `event`'s own fields — a real adapter needs the
|
|
12
|
-
# price/name inside it to build a session a payer actually sees;
|
|
13
|
-
# this only needs to look enough like one to swap in.
|
|
14
|
-
#
|
|
15
|
-
# The URL it returns carries the same `registration_id` a real
|
|
16
|
-
# webhook's metadata would, so a caller building its own signed
|
|
17
|
-
# webhook against it (a smoke test, CI) has something real to key
|
|
18
|
-
# off of — the real shape production has, minus the network hop.
|
|
5
|
+
# A network-free stand-in for a Checkout-Session-style payment adapter, matching it by
|
|
6
|
+
# method shape alone. The returned URL carries `registration_id`, as webhook metadata would.
|
|
19
7
|
class MockStripeAdapter
|
|
20
8
|
# Accepts and discards the shared adapter constructor arguments; this adapter holds no
|
|
21
9
|
# state of its own.
|
|
@@ -29,14 +17,10 @@ module Hecks
|
|
|
29
17
|
# Builds a fake checkout URL carrying `registration_id`, standing in for a real
|
|
30
18
|
# Checkout-Session call.
|
|
31
19
|
#
|
|
32
|
-
# @param event [Object] the record data a real adapter would read
|
|
33
|
-
#
|
|
34
|
-
# operation supplies as `event`) and never read here
|
|
35
|
-
# @param registration_id [String] the registration id to key a signed webhook off of;
|
|
36
|
-
# embedded in the returned URL, never read otherwise
|
|
20
|
+
# @param event [Object] the record data a real adapter would read; never read here
|
|
21
|
+
# @param registration_id [String] embedded in the returned URL, never read otherwise
|
|
37
22
|
# @param success_url [String] the base URL to redirect a successful payer to
|
|
38
|
-
# @param cancel_url [String] accepted for the shared
|
|
39
|
-
# never read
|
|
23
|
+
# @param cancel_url [String] accepted for the shared call shape and never read
|
|
40
24
|
# @return [String] `success_url` with `mock_checkout=1` and `mock_registration_id`
|
|
41
25
|
# query parameters appended
|
|
42
26
|
def create_session(event:, registration_id:, success_url:, cancel_url:)
|