hecks 2.7.0 → 2.9.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 +11 -0
- 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 +18 -99
- 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 +4 -30
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
- data/lib/hecks/adapters/driven/postgres.rb +145 -134
- data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
- data/lib/hecks/adapters/driven/prism.rb +7 -30
- 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 +15 -37
- 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/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 +54 -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 +10 -39
- data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
- data/lib/hecks/bluebook/behaviour/chapter.rb +17 -42
- data/lib/hecks/bluebook/behaviour/command.rb +14 -66
- data/lib/hecks/bluebook/behaviour/domain_port.rb +4 -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 +38 -26
- 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 +10 -48
- data/lib/hecks/bluebook/command.rb +23 -81
- data/lib/hecks/bluebook/domain_port.rb +14 -63
- 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 +17 -65
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +86 -708
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +56 -170
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +1 -0
- 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 +12 -87
- 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 +26 -189
- 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 +11 -42
- 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 +19 -106
- 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 +37 -660
- data/lib/hecks/bluebook/hexagon.rb +5 -28
- 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 +24 -176
- data/lib/hecks/bluebook/meta_validator/shapes.rb +54 -268
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -308
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
- data/lib/hecks/bluebook/meta_validator.rb +79 -349
- data/lib/hecks/bluebook/model_check/client_profile.rb +10 -91
- data/lib/hecks/bluebook/model_check.rb +102 -600
- data/lib/hecks/bluebook/pattern_subset.rb +11 -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 +9 -48
- data/lib/hecks/bluebook/read_model.rb +57 -81
- data/lib/hecks/bluebook/reference.rb +7 -41
- data/lib/hecks/bluebook/smoke_test.rb +8 -98
- 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 +84 -0
- data/lib/hecks/cli/document.rb +86 -0
- data/lib/hecks/cli/ir.rb +45 -0
- data/lib/hecks/cli/mcp.rb +31 -0
- data/lib/hecks/cli/mcp_door.rb +366 -0
- data/lib/hecks/cli/model_check.rb +203 -0
- data/lib/hecks/cli/project_cli.rb +90 -0
- data/lib/hecks/cli/project_diagrams.rb +36 -0
- data/lib/hecks/cli/run.rb +173 -0
- data/lib/hecks/cli/smoke_test.rb +45 -0
- data/lib/hecks/cli/stores.rb +53 -0
- data/lib/hecks/cli.rb +160 -0
- data/lib/hecks/construct.rb +8 -34
- data/lib/hecks/deploy/bluebook/deploy.bluebook +33 -142
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +2 -9
- 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 +4 -71
- data/lib/hecks/facade/cli_door.rb +24 -106
- data/lib/hecks/facade/cli_runner.rb +28 -172
- data/lib/hecks/facade/command_request.rb +13 -33
- data/lib/hecks/facade/handle.rb +34 -121
- data/lib/hecks/facade/json_door.rb +31 -146
- data/lib/hecks/facade/surface/aggregate_door.rb +39 -104
- data/lib/hecks/facade/surface/chapter.rb +10 -54
- data/lib/hecks/facade/surface.rb +8 -23
- data/lib/hecks/facade.rb +10 -25
- data/lib/hecks/forms/app.rb +15 -70
- 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 +30 -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/grammar/expression.bluebook +15 -40
- data/lib/hecks/grammar/translation.bluebook +3 -6
- data/lib/hecks/grammar.rb +16 -41
- data/lib/hecks/ir.rb +14 -83
- 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 +15 -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 +12 -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 +98 -197
- data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
- data/lib/hecks/language/hecksagon/domain_port.bluebook +4 -19
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +6 -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_door_scope.rb +95 -0
- data/lib/hecks/mcp_stdio_guard.rb +4 -41
- data/lib/hecks/naming.rb +29 -137
- 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 +62 -65
- 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 +38 -141
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +16 -84
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +7 -26
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +3 -22
- 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 +18 -75
- 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 +14 -115
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +127 -554
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
- 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 +9 -25
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +22 -122
- 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.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 +23 -103
- 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/projections/bootstrap_table.rb +11 -43
- 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 +35 -202
- data/lib/hecks/projections/deploy/lambda.rb +151 -679
- 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/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 +2 -58
- data/lib/hecks/projections/deploy/preview.rb +2 -67
- data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
- data/lib/hecks/projections/deploy/scripts.rb +4 -57
- data/lib/hecks/projections/deploy/shared.rb +47 -146
- 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 +20 -582
- 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 +15 -42
- data/lib/hecks/projections/model.rb +12 -51
- data/lib/hecks/projections/oidc.rb +12 -56
- data/lib/hecks/projections/parser_table.rb +9 -28
- data/lib/hecks/projections/reference.rb +9 -16
- data/lib/hecks/projections/rust_vocabulary.rb +12 -250
- 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 +60 -375
- data/lib/hecks/projector/docs_projector.rb +10 -201
- data/lib/hecks/projector/exporter.rb +46 -138
- 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/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 +93 -0
- data/lib/hecks/release/runner/commands.rb +66 -0
- data/lib/hecks/release/runner/console.rb +52 -0
- data/lib/hecks/release/runner/gem_publisher.rb +43 -0
- data/lib/hecks/release/runner/git.rb +48 -0
- data/lib/hecks/release/runner/npm_publisher.rb +75 -0
- data/lib/hecks/release/runner/preflight.rb +104 -0
- data/lib/hecks/release/runner/published.rb +55 -0
- data/lib/hecks/release/runner/tagger.rb +80 -0
- data/lib/hecks/release/runner.rb +215 -0
- data/lib/hecks/rendering.rb +4 -26
- data/lib/hecks/router/namespace_installer.rb +12 -36
- data/lib/hecks/router.rb +4 -8
- 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 +23 -160
- data/lib/hecks/runtime/command_interpreter.rb +125 -307
- 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 +30 -102
- data/lib/hecks/runtime/dispatcher.rb +82 -241
- data/lib/hecks/runtime/entity_element.rb +40 -462
- data/lib/hecks/runtime/entity_interpreter.rb +65 -220
- 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 +11 -70
- data/lib/hecks/runtime/invocation.rb +28 -164
- data/lib/hecks/runtime/loader.rb +48 -186
- data/lib/hecks/runtime/outbox.rb +38 -261
- data/lib/hecks/runtime/policy_interpreter.rb +38 -200
- data/lib/hecks/runtime/port_operation_interpreter.rb +26 -87
- data/lib/hecks/runtime/query_interpreter.rb +45 -187
- data/lib/hecks/runtime/reaction_invocation.rb +36 -138
- data/lib/hecks/runtime/read_model_interpreter.rb +139 -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 +8 -89
- data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
- data/lib/hecks/runtime/registry/verification.rb +52 -225
- data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
- data/lib/hecks/runtime/registry.rb +103 -244
- data/lib/hecks/runtime/remote_dispatcher.rb +37 -152
- 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 +155 -641
- data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
- data/lib/hecks/runtime/value.rb +12 -84
- data/lib/hecks/runtime.rb +17 -65
- data/lib/hecks/storehouse.rb +146 -567
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +8 -32
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
- 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/vocabulary.rb +5 -0
- data/lib/hecks.rb +32 -82
- 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
- metadata +30 -59
- data/lib/hecks/bench/cli.rb +0 -74
- data/lib/hecks/bench/environment.rb +0 -100
- data/lib/hecks/bench/postgres_probe.rb +0 -41
- data/lib/hecks/bench/report.rb +0 -116
- data/lib/hecks/bench/ruby_runner.rb +0 -151
- data/lib/hecks/bench/run.rb +0 -55
- data/lib/hecks/bench/rust_runner.rb +0 -165
- data/lib/hecks/bench/stats.rb +0 -75
- data/lib/hecks/bench/suite.rb +0 -172
- data/lib/hecks/bench/workload.rb +0 -137
- data/lib/hecks/bench.rb +0 -28
- data/lib/hecks/codemod.rb +0 -443
- data/lib/hecks/corpus.rb +0 -479
- data/lib/hecks/doc/reference.rb +0 -585
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +0 -684
- data/lib/hecks/fuzzing/combination_miner.rb +0 -178
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +0 -469
- data/lib/hecks/fuzzing/coverage_campaign.rb +0 -161
- data/lib/hecks/fuzzing/differential.rb +0 -192
- data/lib/hecks/fuzzing/domain_generator.rb +0 -871
- data/lib/hecks/fuzzing/era_boundary.rb +0 -154
- data/lib/hecks/fuzzing/form_census.rb +0 -285
- data/lib/hecks/fuzzing/generated_domain_check.rb +0 -171
- data/lib/hecks/fuzzing/invalid_value_generator.rb +0 -125
- data/lib/hecks/fuzzing/isolated_boot.rb +0 -658
- data/lib/hecks/fuzzing/nondeterministic.rb +0 -79
- data/lib/hecks/fuzzing/persistence_parity.rb +0 -253
- data/lib/hecks/fuzzing/properties/corrections.rb +0 -125
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +0 -688
- data/lib/hecks/fuzzing/properties/guards.rb +0 -398
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +0 -399
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +0 -137
- data/lib/hecks/fuzzing/properties/outbox.rb +0 -180
- data/lib/hecks/fuzzing/properties/querying.rb +0 -260
- data/lib/hecks/fuzzing/properties.rb +0 -267
- data/lib/hecks/fuzzing/qa_settings.rb +0 -164
- data/lib/hecks/fuzzing/replay.rb +0 -930
- data/lib/hecks/fuzzing/rotation_priority.rb +0 -114
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +0 -139
- data/lib/hecks/fuzzing/self_consistency.rb +0 -825
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +0 -532
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +0 -171
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +0 -127
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +0 -116
- data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +0 -138
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +0 -344
- data/lib/hecks/fuzzing/sequence_generator.rb +0 -311
- data/lib/hecks/fuzzing/shrinker.rb +0 -309
- data/lib/hecks/fuzzing/structural_skips.rb +0 -53
- data/lib/hecks/fuzzing/sweep_depth.rb +0 -61
- data/lib/hecks/fuzzing/target_capabilities.rb +0 -255
- data/lib/hecks/fuzzing/value_generator.rb +0 -340
- data/lib/hecks/fuzzing.rb +0 -23
- data/lib/hecks/grammar/evolve.rb +0 -524
- data/lib/hecks/query_ir.rb +0 -482
|
@@ -6,13 +6,12 @@ require_relative "../naming"
|
|
|
6
6
|
|
|
7
7
|
module Hecks
|
|
8
8
|
module Runtime
|
|
9
|
+
# Raised when a registry can't resolve required wiring: an unbound aggregate, an
|
|
10
|
+
# unknown adapter, or a port/adapter mismatch.
|
|
9
11
|
class WiringError < StandardError; end
|
|
10
12
|
|
|
11
|
-
# The collections a boot gathers
|
|
12
|
-
#
|
|
13
|
-
# wiring gate lives in registry/verification.rb, saga persistence
|
|
14
|
-
# resolution in registry/saga_persistence.rb, and a `.world`'s project-wide
|
|
15
|
-
# defaults in registry/world_defaults.rb.
|
|
13
|
+
# The collections a boot gathers: bluebooks, hecksagons, ports, adapters, worlds, and logs.
|
|
14
|
+
# Wiring verification, saga persistence, and world defaults live under registry/.
|
|
16
15
|
class Registry
|
|
17
16
|
include Verification
|
|
18
17
|
include SagaPersistence
|
|
@@ -39,97 +38,48 @@ module Hecks
|
|
|
39
38
|
@event_log = []
|
|
40
39
|
@reaction_log = []
|
|
41
40
|
@saga_log = []
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
# `port`/`persisted_by` already are) appends here at
|
|
45
|
-
# hecksagon-build time; `Runtime::Loader.boot`'s own post-dispatcher
|
|
46
|
-
# step turns each entry into a real `Privacy::Marking.Mark`,
|
|
47
|
-
# idempotently, the same "declared here, taken effect once boot
|
|
48
|
-
# actually has a dispatcher" shape `redrive_outbox!` already has.
|
|
41
|
+
# Recorded at hecksagon-build time (AggregateDoor#mark_sensitive); Loader.boot's
|
|
42
|
+
# post-dispatch step turns each entry into a real Privacy::Marking.Mark, idempotently.
|
|
49
43
|
@pending_privacy_markings = []
|
|
50
|
-
#
|
|
51
|
-
# rust/src/kernel/orchestrate.rs
|
|
52
|
-
#
|
|
53
|
-
# equality check) — a landmine found by reading that spec before
|
|
54
|
-
# touching anything, not by hitting it. These carry the raw
|
|
55
|
-
# inputs a dispatch's own argument binding was resolved from
|
|
56
|
-
# (SagaInterpreter#deliver_saga_dispatch / PolicyInterpreter#
|
|
57
|
-
# trigger_args), for Properties.dispatch_binding_fidelity's own
|
|
58
|
-
# independent re-derivation — a fact neither existing log
|
|
59
|
-
# records at all, so there is nothing here for Rust to have
|
|
60
|
-
# matched or drifted from.
|
|
44
|
+
# Ruby-only; unlike saga_log/reaction_log (ported byte-for-byte to
|
|
45
|
+
# rust/src/kernel/orchestrate.rs, per spec/rust_conformance_spec.rb), these carry
|
|
46
|
+
# the raw dispatch-binding inputs Properties.dispatch_binding_fidelity re-derives.
|
|
61
47
|
@saga_dispatch_log = []
|
|
62
48
|
@policy_dispatch_log = []
|
|
63
49
|
@saga_instances = Hash.new { |h, k| h[k] = {} }
|
|
64
|
-
# Guards
|
|
65
|
-
#
|
|
66
|
-
# hazard this codebase's own prior audit already flagged for
|
|
67
|
-
# `Dispatcher#reenter`'s reaction-depth counter (M20: a
|
|
68
|
-
# thread-shared ivar with no lock, since fixed by moving it to
|
|
69
|
-
# `Thread.current`, dispatcher.rb), made meaningfully easier to
|
|
70
|
-
# hit here once a persistence write sits in the same critical
|
|
71
|
-
# section. Held across the in-memory
|
|
72
|
-
# mutation and the checkpoint write together, never across a
|
|
73
|
-
# saga's own dispatch cascade — see `SagaInterpreter#advance_saga`'s
|
|
74
|
-
# own comment for why that distinction matters (non-reentrant
|
|
75
|
-
# Mutex, recursive re-entry is real).
|
|
50
|
+
# Guards saga_instances' mutation+checkpoint sequence together, never held across a
|
|
51
|
+
# saga's own dispatch cascade — Mutex is non-reentrant and recursive re-entry is real.
|
|
76
52
|
@saga_mutex = Mutex.new
|
|
77
53
|
@repositories = {}
|
|
78
54
|
@projection_repositories = {}
|
|
79
55
|
@bluebook_builders = {}
|
|
80
|
-
#
|
|
81
|
-
#
|
|
82
|
-
#
|
|
83
|
-
# could race creating this Hash (Hecks/ThreadSharedIvarMutation; the
|
|
84
|
-
# same shape of hazard `Dispatcher#reenter`'s `@reaction_depth` was
|
|
85
|
-
# fixed for). Every write into it still only ever happens at boot,
|
|
86
|
-
# single-threaded (`EraResolver.check!`, a `:pre_verify` boot gate) —
|
|
87
|
-
# this only removes the race on standing up the container itself for
|
|
88
|
-
# a boot with no era-plugin domain at all, whose first touch would
|
|
89
|
-
# otherwise be a live dispatch's own `RepositoryFactory.build` read.
|
|
56
|
+
# Eager, not lazy: avoids a race where two dispatching threads could create this
|
|
57
|
+
# Hash on first access. All writes still happen at boot, single-threaded
|
|
58
|
+
# (EraResolver.check!).
|
|
90
59
|
@resolved_eras = {}
|
|
91
|
-
#
|
|
92
|
-
#
|
|
93
|
-
#
|
|
94
|
-
#
|
|
95
|
-
# `superseded_by:`, and `PostgresEra#append` refuses on it before
|
|
96
|
-
# ever issuing an INSERT — the in-process half of the era fence, the
|
|
97
|
-
# half that holds even for a connection row-level security cannot
|
|
98
|
-
# bite (BUG#24). Eager for exactly the reason `@resolved_eras` is.
|
|
60
|
+
# domain name -> the ordinal that superseded this boot's era, for an old checkout only.
|
|
61
|
+
# RepositoryFactory.build passes it to PostgresEra#append, which refuses before the
|
|
62
|
+
# INSERT — the in-process half of the era fence. Eager for the same reason as
|
|
63
|
+
# @resolved_eras.
|
|
99
64
|
@superseded_eras = {}
|
|
100
|
-
#
|
|
101
|
-
#
|
|
102
|
-
#
|
|
103
|
-
# first-access race `#resolved_eras` above does, while preserving the
|
|
104
|
-
# "same instance every call" identity `spec/runtime/capability_graph_
|
|
105
|
-
# spec.rb` already requires.
|
|
65
|
+
# Eager: CapabilityGraph.new only stores the registry reference, and eager
|
|
66
|
+
# construction avoids the same first-access race as @resolved_eras while
|
|
67
|
+
# keeping one instance per registry.
|
|
106
68
|
@capability_graph = CapabilityGraph.new(self)
|
|
107
|
-
#
|
|
108
|
-
#
|
|
109
|
-
#
|
|
110
|
-
# mutex as `@saga_mutex`: `checkpoint` (saga_interpreter.rb) calls
|
|
111
|
-
# `saga_persistence(domain)` from inside an `@saga_mutex.synchronize`
|
|
112
|
-
# block, so reusing `@saga_mutex` here would deadlock the very first
|
|
113
|
-
# time a saga advanced (a `Mutex` is not reentrant — the exact
|
|
114
|
-
# warning `@saga_mutex`'s own comment already gives for a different
|
|
115
|
-
# reason).
|
|
69
|
+
# Guards only the lazy per-domain resolution inside @saga_persistence. Must not reuse
|
|
70
|
+
# @saga_mutex: checkpoint calls saga_persistence(domain) from inside
|
|
71
|
+
# @saga_mutex.synchronize, and Mutex is not reentrant.
|
|
116
72
|
@saga_persistence = {}
|
|
117
73
|
@saga_persistence_mutex = Mutex.new
|
|
118
74
|
@outbox = Outbox::Relay.new(self)
|
|
119
75
|
end
|
|
120
76
|
|
|
121
|
-
#
|
|
122
|
-
#
|
|
123
|
-
# It can enqueue from the moment the registry exists; a Dispatcher
|
|
124
|
-
# attaches the interpreters that let it deliver. See
|
|
125
|
-
# `Runtime::Outbox`.
|
|
77
|
+
# One outbox per registry, built once here and never swapped. Can enqueue immediately;
|
|
78
|
+
# a Dispatcher attaches the interpreters that let it deliver (see Runtime::Outbox).
|
|
126
79
|
attr_reader :outbox
|
|
127
80
|
|
|
128
|
-
#
|
|
129
|
-
#
|
|
130
|
-
# several files (`language/bluebook/*.bluebook`, all `Hecks.bluebook "Bluebook"`)
|
|
131
|
-
# needs its declarations to accumulate into one builder rather than each
|
|
132
|
-
# file minting its own and silently discarding the one before.
|
|
81
|
+
# Stays open for the life of the registry, keyed by chapter name, so a chapter split
|
|
82
|
+
# across several files (language/bluebook/*.bluebook) accumulates into one builder.
|
|
133
83
|
#
|
|
134
84
|
# @param name [String, Symbol] the chapter name the builder accumulates
|
|
135
85
|
# declarations for
|
|
@@ -142,19 +92,9 @@ module Hecks
|
|
|
142
92
|
@bluebook_builders[name.to_s] ||= yield
|
|
143
93
|
end
|
|
144
94
|
|
|
145
|
-
# Boot-time-only, single-threaded
|
|
146
|
-
#
|
|
147
|
-
#
|
|
148
|
-
# `.adapter`/`.world`/`.translation` run inside while a `.bluebook`/
|
|
149
|
-
# `.hecksagon`/`.world` file is being `Kernel.load`ed — i.e. strictly
|
|
150
|
-
# during `Loader.boot`/`.boot_files`, before `dispatcher_for` ever
|
|
151
|
-
# hands this registry to a live, multi-threaded caller. Nothing
|
|
152
|
-
# downstream of boot ever calls these — verified by grepping every
|
|
153
|
-
# call site in lib/ and spec/ before writing this — so unlike
|
|
154
|
-
# `#resolved_eras`/`#capability_graph`/`#saga_persistence` (each
|
|
155
|
-
# reachable from live dispatch, and fixed for real above/in
|
|
156
|
-
# registry/saga_persistence.rb) there is no concurrent caller for
|
|
157
|
-
# `Hecks/ThreadSharedIvarMutation` to actually be warning about here.
|
|
95
|
+
# Boot-time-only, single-threaded: every add_* below runs from Hecks.collect while a
|
|
96
|
+
# .bluebook/.hecksagon/.world file is being Kernel.loaded, strictly during Loader.boot,
|
|
97
|
+
# before dispatcher_for hands this registry to a live, multi-threaded caller.
|
|
158
98
|
# rubocop:disable Hecks/ThreadSharedIvarMutation
|
|
159
99
|
# Registers a loaded chapter, keyed by its own declared name.
|
|
160
100
|
#
|
|
@@ -162,29 +102,19 @@ module Hecks
|
|
|
162
102
|
# @return [Bluebook::Chapter] `item`, unchanged
|
|
163
103
|
def add_bluebook(item) = @bluebooks[item.name] = item
|
|
164
104
|
|
|
165
|
-
#
|
|
166
|
-
#
|
|
167
|
-
#
|
|
168
|
-
#
|
|
169
|
-
#
|
|
170
|
-
#
|
|
171
|
-
#
|
|
172
|
-
# here too; that alone is not a problem. What this exists to let
|
|
173
|
-
# `refuse_cross_package_bluebook_merge!` (registry/verification.rb)
|
|
174
|
-
# catch is TWO UNRELATED PACKAGES accumulating into the same name by
|
|
175
|
-
# coincidence — a stale vendored fork's own copy of a real gem's
|
|
176
|
-
# chapter, still reachable on the load path, silently merging its
|
|
177
|
-
# aggregates into the real one via this exact accumulation mechanism.
|
|
105
|
+
# Tracks which .bluebook file(s) contributed to a chapter name (a boot-time loading
|
|
106
|
+
# fact, never Rust-mirrored) so refuse_cross_package_bluebook_merge! can catch two
|
|
107
|
+
# unrelated packages accumulating into the same name by coincidence.
|
|
108
|
+
#
|
|
109
|
+
# @param name [String, Symbol] the chapter name the file contributed to
|
|
110
|
+
# @param path [String] the `.bluebook` file that declared it
|
|
111
|
+
# @return [Array<String>] every path recorded for that chapter, `path` last
|
|
178
112
|
def record_bluebook_source(name, path)
|
|
179
113
|
(@bluebook_sources[name.to_s] ||= []) << path
|
|
180
114
|
end
|
|
181
115
|
|
|
182
|
-
#
|
|
183
|
-
# .
|
|
184
|
-
# now load in more than one block for the same domain (base file
|
|
185
|
-
# plus an `environments/<name>.hecksagon` overlay), and the second
|
|
186
|
-
# block should add to what the first declared, not silently
|
|
187
|
-
# discard it.
|
|
116
|
+
# Merges into any wiring already registered for the domain rather than replacing it,
|
|
117
|
+
# so a base .hecksagon file plus an environments/<name>.hecksagon overlay both take effect.
|
|
188
118
|
#
|
|
189
119
|
# @param item [Bluebook::Hecksagon] the declared wiring to register
|
|
190
120
|
# @return [void]
|
|
@@ -226,16 +156,10 @@ module Hecks
|
|
|
226
156
|
# @return [Bluebook::Adapter] `item`, unchanged
|
|
227
157
|
def add_adapter(item) = @adapters[item.name] = item
|
|
228
158
|
|
|
229
|
-
#
|
|
230
|
-
#
|
|
231
|
-
#
|
|
232
|
-
#
|
|
233
|
-
# for a domain a base `.world` file already declared, without
|
|
234
|
-
# restating everything the base file said. Settings merge shallow,
|
|
235
|
-
# keyed exactly the way WorldBuilder already stores them (both the
|
|
236
|
-
# bare verb key and the `"verb:adapter"` qualified key point at the
|
|
237
|
-
# same resolved hash) — an overlay's key wins over the base's same
|
|
238
|
-
# key; a key only the base declares survives untouched.
|
|
159
|
+
# Merges into any world already registered for the domain, the same shape as
|
|
160
|
+
# add_hecksagon. Settings merge shallow, keyed by verb (and "verb:adapter"); an
|
|
161
|
+
# overlay key wins over the base's same key, and a key only the base declares
|
|
162
|
+
# survives untouched.
|
|
239
163
|
#
|
|
240
164
|
# @param item [Bluebook::World] the declared world settings to register
|
|
241
165
|
# @return [void]
|
|
@@ -251,13 +175,10 @@ module Hecks
|
|
|
251
175
|
# `item` last
|
|
252
176
|
def add_translation(item) = @translations << item
|
|
253
177
|
|
|
254
|
-
# Declares one attribute of
|
|
255
|
-
#
|
|
256
|
-
#
|
|
257
|
-
#
|
|
258
|
-
# (and same thread-safety argument, above) as `add_bluebook`/`add_port`. Recorded,
|
|
259
|
-
# not dispatched: `Runtime::Loader.boot`'s own `seed_privacy_markings!` turns each
|
|
260
|
-
# entry into a real `Privacy::Marking.Mark` once a dispatcher exists.
|
|
178
|
+
# Declares one attribute of a domain's aggregate sensitive, called from a terminal
|
|
179
|
+
# has_<category>(readable_by:). Recorded, not dispatched: Loader.boot's
|
|
180
|
+
# seed_privacy_markings! turns each entry into a real Privacy::Marking.Mark once a
|
|
181
|
+
# dispatcher exists.
|
|
261
182
|
#
|
|
262
183
|
# @param domain [String] the marked attribute's own aggregate FQN, e.g.
|
|
263
184
|
# `"Site::Registration"`
|
|
@@ -272,16 +193,11 @@ module Hecks
|
|
|
272
193
|
end
|
|
273
194
|
# rubocop:enable Hecks/ThreadSharedIvarMutation
|
|
274
195
|
|
|
275
|
-
# {domain name => era ordinal}
|
|
276
|
-
#
|
|
277
|
-
# which, for an old checkout booting a held-but-superseded shape,
|
|
278
|
-
# is not the newest one. The Hash itself is stood up in `initialize`
|
|
279
|
-
# (see that comment) — this is a plain reader, not a memoizer;
|
|
280
|
-
# `Hecks/ThreadSharedIvarMutation` is the reason there is no `||=`
|
|
281
|
-
# left here to flag.
|
|
196
|
+
# {domain name => era ordinal} resolved by the boot-time era gate. Stood up eagerly
|
|
197
|
+
# in initialize; this is a plain reader, not a memoizer.
|
|
282
198
|
attr_reader :resolved_eras
|
|
283
|
-
# Domain name -> the ordinal that superseded this boot's own era, for
|
|
284
|
-
#
|
|
199
|
+
# Domain name -> the ordinal that superseded this boot's own era, for an old
|
|
200
|
+
# checkout only.
|
|
285
201
|
attr_reader :superseded_eras
|
|
286
202
|
|
|
287
203
|
# Finds a loaded chapter by name.
|
|
@@ -310,12 +226,8 @@ module Hecks
|
|
|
310
226
|
# @return [Array<String>] every declared verb, across every loaded chapter
|
|
311
227
|
def verbs = @bluebooks.values.flat_map(&:verbs).sort
|
|
312
228
|
|
|
313
|
-
# The chapter that answers a role check for `domain
|
|
314
|
-
#
|
|
315
|
-
# declares `provides "authorization"`. Nil when none does. Replaces
|
|
316
|
-
# every check for the literal name "Governance": Governance is
|
|
317
|
-
# recognised by what it declares, and a chapter that declares the
|
|
318
|
-
# same thing is recognised the same way.
|
|
229
|
+
# The chapter that answers a role check for `domain`: the domain's own chapter, or
|
|
230
|
+
# a framework member its hecksagon attaches, that declares `provides "authorization"`.
|
|
319
231
|
#
|
|
320
232
|
# @param domain [String, Symbol] the domain whose role checks are being resolved
|
|
321
233
|
# @return [Bluebook::Chapter, nil] the chapter that answers `domain`'s role
|
|
@@ -334,12 +246,9 @@ module Hecks
|
|
|
334
246
|
@bluebooks.values.select { |chapter| chapter.provides?(Bluebook::Capabilities::AUTHORIZATION) }
|
|
335
247
|
end
|
|
336
248
|
|
|
337
|
-
# The chapter that answers "who is this authenticated pair" for
|
|
338
|
-
#
|
|
339
|
-
#
|
|
340
|
-
# none does. Replaces every check for the literal name "Identity":
|
|
341
|
-
# Identity is recognised by what it declares (Register/Link/ResolvedBy),
|
|
342
|
-
# and a chapter that declares the same thing is recognised the same way.
|
|
249
|
+
# The chapter that answers "who is this authenticated pair" for `domain`: the
|
|
250
|
+
# domain's own chapter, or a framework member its hecksagon attaches, that
|
|
251
|
+
# declares `provides "identity"`.
|
|
343
252
|
#
|
|
344
253
|
# @param domain [String, Symbol] the domain whose identity chapter is being resolved
|
|
345
254
|
# @return [Bluebook::Chapter, nil] the chapter that answers `domain`'s identity
|
|
@@ -350,29 +259,19 @@ module Hecks
|
|
|
350
259
|
.find { |chapter| chapter.provides?(Bluebook::Capabilities::IDENTITY) }
|
|
351
260
|
return attached if attached
|
|
352
261
|
|
|
353
|
-
#
|
|
354
|
-
#
|
|
355
|
-
#
|
|
356
|
-
# consuming domain. The chapter is loaded; it just isn't listed
|
|
357
|
-
# on the consumer's own hexagon.
|
|
262
|
+
# Falls back to any loaded chapter: a consuming domain often wires Identity as
|
|
263
|
+
# Hecks.hecksagon "Identity" rather than via uses_framework, so it's loaded but
|
|
264
|
+
# not listed on the consumer's own hexagon.
|
|
358
265
|
@bluebooks.values.find { |chapter| chapter.provides?(Bluebook::Capabilities::IDENTITY) }
|
|
359
266
|
end
|
|
360
267
|
|
|
361
|
-
# The chapter that answers "who may sign in" for `domain
|
|
362
|
-
#
|
|
363
|
-
#
|
|
364
|
-
#
|
|
365
|
-
#
|
|
366
|
-
#
|
|
367
|
-
#
|
|
368
|
-
# recognised the same way.
|
|
369
|
-
#
|
|
370
|
-
# Vendored packages are included here and not in
|
|
371
|
-
# `authorization_provider_for` because membership is a vendored
|
|
372
|
-
# embryonaut_bluebooks chapter (`uses_embryonaut_bluebook
|
|
373
|
-
# "membership"`), not a framework member shipped inside hecks.
|
|
374
|
-
# `Naming.pascal` is the same directory-to-chapter convention
|
|
375
|
-
# `EmbryonautBluebook.load!` already uses.
|
|
268
|
+
# The chapter that answers "who may sign in" for `domain`: the domain's own
|
|
269
|
+
# chapter, a framework member, or a vendored embryonaut bluebook it attaches,
|
|
270
|
+
# that declares `provides "membership"`.
|
|
271
|
+
#
|
|
272
|
+
# Vendored packages are included here (unlike `authorization_provider_for`)
|
|
273
|
+
# because membership ships as a vendored embryonaut_bluebooks chapter, not a
|
|
274
|
+
# framework member.
|
|
376
275
|
#
|
|
377
276
|
# @param domain [String, Symbol] the domain whose sign-in aggregate is being resolved
|
|
378
277
|
# @return [Bluebook::Chapter, nil] the chapter that answers `domain`'s membership
|
|
@@ -381,12 +280,9 @@ module Hecks
|
|
|
381
280
|
vendored_provider_for(domain, Bluebook::Capabilities::MEMBERSHIP)
|
|
382
281
|
end
|
|
383
282
|
|
|
384
|
-
# The chapter that answers the guest newsletter signup for `domain
|
|
385
|
-
#
|
|
386
|
-
#
|
|
387
|
-
# "newsletter"`. Nil when none does. Newsletter is recognised by
|
|
388
|
-
# what it declares (Subscribe/AddName/Confirm/Unsubscribe), so a
|
|
389
|
-
# chapter that declares the same thing is recognised the same way.
|
|
283
|
+
# The chapter that answers the guest newsletter signup for `domain`: the domain's
|
|
284
|
+
# own chapter, a framework member, or a vendored embryonaut bluebook it attaches,
|
|
285
|
+
# that declares `provides "newsletter"`.
|
|
390
286
|
#
|
|
391
287
|
# @param domain [String, Symbol] the domain whose newsletter chapter is being resolved
|
|
392
288
|
# @return [Bluebook::Chapter, nil] the chapter that answers `domain`'s newsletter
|
|
@@ -406,9 +302,8 @@ module Hecks
|
|
|
406
302
|
vendored_provider_for(domain, Bluebook::Capabilities::NEWSLETTER_ISSUES)
|
|
407
303
|
end
|
|
408
304
|
|
|
409
|
-
# The chapter that answers scheduling sessions and
|
|
410
|
-
#
|
|
411
|
-
# it declares (`provides "registrations"`). Nil when none does.
|
|
305
|
+
# The chapter that answers scheduling sessions and registrations for `domain`,
|
|
306
|
+
# resolved the same way as `payments_provider_for`, by declaring `provides "registrations"`.
|
|
412
307
|
#
|
|
413
308
|
# @param domain [String, Symbol] the domain whose registrations chapter is being resolved
|
|
414
309
|
# @return [Bluebook::Chapter, nil] the chapter that answers `domain`'s registrations,
|
|
@@ -421,19 +316,17 @@ module Hecks
|
|
|
421
316
|
# `domain` — resolved by what it declares (`provides "payment_connection"`).
|
|
422
317
|
# Nil when none does.
|
|
423
318
|
#
|
|
424
|
-
# @param domain [String, Symbol] the domain whose payment-connection chapter is
|
|
319
|
+
# @param domain [String, Symbol] the domain whose payment-connection chapter is
|
|
320
|
+
# being resolved
|
|
425
321
|
# @return [Bluebook::Chapter, nil] the chapter that owns `domain`'s payment connection,
|
|
426
322
|
# or nil if none does
|
|
427
323
|
def payment_connection_provider_for(domain)
|
|
428
324
|
vendored_provider_for(domain, Bluebook::Capabilities::PAYMENT_CONNECTION)
|
|
429
325
|
end
|
|
430
326
|
|
|
431
|
-
# The chapter that takes payments for `domain
|
|
432
|
-
#
|
|
433
|
-
#
|
|
434
|
-
# Payments is recognised by what it declares (Initiate and the
|
|
435
|
-
# processor's two verdicts), so a chapter that declares the same
|
|
436
|
-
# thing is recognised the same way.
|
|
327
|
+
# The chapter that takes payments for `domain`: the domain's own chapter, a
|
|
328
|
+
# framework member, or a vendored embryonaut bluebook it attaches, that
|
|
329
|
+
# declares `provides "payments"`.
|
|
437
330
|
#
|
|
438
331
|
# @param domain [String, Symbol] the domain whose payments chapter is being resolved
|
|
439
332
|
# @return [Bluebook::Chapter, nil] the chapter that takes `domain`'s payments, or nil
|
|
@@ -442,14 +335,13 @@ module Hecks
|
|
|
442
335
|
vendored_provider_for(domain, Bluebook::Capabilities::PAYMENTS)
|
|
443
336
|
end
|
|
444
337
|
|
|
445
|
-
# The chapter that provides `capability` for `domain`: the domain's
|
|
446
|
-
#
|
|
447
|
-
#
|
|
448
|
-
#
|
|
449
|
-
#
|
|
450
|
-
#
|
|
451
|
-
#
|
|
452
|
-
# is loaded, it just isn't listed on the consumer's own hexagon.
|
|
338
|
+
# The chapter that provides `capability` for `domain`: the domain's own chapter,
|
|
339
|
+
# a framework member its hecksagon attaches, or a vendored embryonaut bluebook
|
|
340
|
+
# it attaches, that declares it.
|
|
341
|
+
#
|
|
342
|
+
# Falls back to any loaded chapter, since a consuming domain often wires a
|
|
343
|
+
# vendored chapter as its own `Hecks.hecksagon "Name"` rather than via
|
|
344
|
+
# `uses_embryonaut_bluebook`, so it's loaded but not listed on the consumer's hexagon.
|
|
453
345
|
#
|
|
454
346
|
# @param domain [String, Symbol] the domain the provider is resolved for
|
|
455
347
|
# @param capability [String] the capability's name, such as
|
|
@@ -481,32 +373,13 @@ module Hecks
|
|
|
481
373
|
@repositories[[domain.to_s, aggregate.hecks_name]] ||= Ports::Persistence.repository(self, domain, aggregate)
|
|
482
374
|
end
|
|
483
375
|
|
|
484
|
-
#
|
|
485
|
-
#
|
|
486
|
-
# resolved eras
|
|
487
|
-
#
|
|
488
|
-
#
|
|
489
|
-
#
|
|
490
|
-
#
|
|
491
|
-
# fresh boot's own repositories are new adapter instances too, so
|
|
492
|
-
# a Memory adapter starts empty and a durable one sees whatever
|
|
493
|
-
# it persisted — the same reading either way. Sagas rehydrate off
|
|
494
|
-
# that store again, the way `Loader.boot_files` does after
|
|
495
|
-
# `verify!`.
|
|
496
|
-
#
|
|
497
|
-
# What this is for: a test runner that would otherwise boot a runtime
|
|
498
|
-
# per test to get isolation (`Behaviors::Expectations.run_one`) — ~2s a
|
|
499
|
-
# boot, 76 chess behaviours = two and a half minutes of booting the
|
|
500
|
-
# same two files — can now boot once and reset between tests.
|
|
501
|
-
#
|
|
502
|
-
# Single-threaded caller, the same reason the `add_*` cluster above
|
|
503
|
-
# is exempt — `Behaviors::Expectations.run_one` is this method's only
|
|
504
|
-
# caller (verified by grep before writing this), and it runs one
|
|
505
|
-
# test at a time: `Runner#run` maps over tests sequentially, and
|
|
506
|
-
# `Behaviors.rspec`'s generated examples run under RSpec's own
|
|
507
|
-
# single-threaded example loop. No production dispatch path calls
|
|
508
|
-
# this at all — a live Puma worker pool never resets a registry out
|
|
509
|
-
# from under itself mid-flight.
|
|
376
|
+
# Clears everything a dispatch produced (logs, saga instances, repositories); leaves
|
|
377
|
+
# what booting the files produced (bluebooks, hecksagons, ports, adapters, worlds,
|
|
378
|
+
# resolved eras) untouched.
|
|
379
|
+
#
|
|
380
|
+
# Repositories are dropped, not emptied, so a fresh Memory adapter starts empty while
|
|
381
|
+
# a durable one still sees what it persisted. Single-threaded caller only
|
|
382
|
+
# (Behaviors::Expectations.run_one runs one test at a time).
|
|
510
383
|
#
|
|
511
384
|
# @return [Runtime::Registry] self
|
|
512
385
|
# rubocop:disable-next Hecks/ThreadSharedIvarMutation
|
|
@@ -524,10 +397,8 @@ module Hecks
|
|
|
524
397
|
self
|
|
525
398
|
end
|
|
526
399
|
|
|
527
|
-
# Built eagerly in `initialize
|
|
528
|
-
#
|
|
529
|
-
# asserts the same instance comes back every call, which this still
|
|
530
|
-
# gives, just without a lazy `||=` race on standing it up.
|
|
400
|
+
# Built eagerly in `initialize`; this is a plain reader, not a memoizer.
|
|
401
|
+
# `spec/runtime/capability_graph_spec.rb` asserts the same instance comes back every call.
|
|
531
402
|
attr_reader :capability_graph
|
|
532
403
|
|
|
533
404
|
# Resolves and memoizes the repository to read `aggregate` from — a caught-up
|
|
@@ -579,15 +450,10 @@ module Hecks
|
|
|
579
450
|
false
|
|
580
451
|
end
|
|
581
452
|
|
|
582
|
-
#
|
|
583
|
-
#
|
|
584
|
-
#
|
|
585
|
-
#
|
|
586
|
-
# the base's own bind at resolution time, not erase it outright —
|
|
587
|
-
# `Ports::Persistence::BindingPolicy.resolve`'s own "exactly one
|
|
588
|
-
# authoritative bind" check is what actually catches a genuine
|
|
589
|
-
# double-bind; this merge only concatenates, it does not itself
|
|
590
|
-
# decide which of two binds for the same aggregate wins.
|
|
453
|
+
# Concatenates every list-shaped fact from base and overlay. `binds` is additive too:
|
|
454
|
+
# an overlay rebinding an aggregate is meant to shadow the base's bind at resolution
|
|
455
|
+
# time, not erase it — `Ports::Persistence::BindingPolicy.resolve`'s "exactly one
|
|
456
|
+
# authoritative bind" check is what actually catches a genuine double-bind.
|
|
591
457
|
#
|
|
592
458
|
# @param base [Bluebook::Hecksagon] the domain's already-registered wiring
|
|
593
459
|
# @param overlay [Bluebook::Hecksagon] the newly loaded block's own wiring to
|
|
@@ -595,12 +461,8 @@ module Hecks
|
|
|
595
461
|
# @return [Bluebook::Hecksagon] a new wiring with every list-shaped fact
|
|
596
462
|
# concatenated, `base` then `overlay`
|
|
597
463
|
def merge_hecksagons(base, overlay)
|
|
598
|
-
#
|
|
599
|
-
#
|
|
600
|
-
# environment overlay). Order-independent: list facts uniq, so
|
|
601
|
-
# loading context_map before or after the domain file is the same
|
|
602
|
-
# merged hecksagon. Binds stay concatenated (BindingPolicy still
|
|
603
|
-
# refuses a genuine double-bind).
|
|
464
|
+
# Order-independent: list facts uniq, so loading context_map before or after the
|
|
465
|
+
# domain file yields the same merged hecksagon.
|
|
604
466
|
Bluebook::Hecksagon.new(
|
|
605
467
|
domain: base.domain,
|
|
606
468
|
binds: base.binds + overlay.binds,
|
|
@@ -612,13 +474,10 @@ module Hecks
|
|
|
612
474
|
)
|
|
613
475
|
end
|
|
614
476
|
|
|
615
|
-
#
|
|
616
|
-
#
|
|
617
|
-
#
|
|
618
|
-
#
|
|
619
|
-
# also declares replaces that key's whole resolved hash (the same
|
|
620
|
-
# all-or-nothing shape `WorldBuilder#method_missing` already builds
|
|
621
|
-
# each entry as), it does not deep-merge field by field within it.
|
|
477
|
+
# Scalars (`realm`, `latest`, `default_database`, `default_adapter`): the overlay's
|
|
478
|
+
# value wins when present, else the base's survives. `settings` is a shallow merge
|
|
479
|
+
# keyed by verb (and `"verb:adapter"`); an overlay key replaces the base's whole
|
|
480
|
+
# resolved hash for that key, it does not deep-merge within it.
|
|
622
481
|
#
|
|
623
482
|
# @param base [Bluebook::World] the domain's already-registered world
|
|
624
483
|
# @param overlay [Bluebook::World] the newly loaded block's own world to fold in
|