hecks 2.8.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 +4 -6
- 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 +17 -98
- 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 +5 -48
- 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 +31 -141
- 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 +14 -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 +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 +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 +16 -69
- 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 -194
- 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 -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 +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 +53 -267
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +43 -305
- 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 +6 -21
- data/lib/hecks/bluebook/model_check.rb +100 -597
- 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 +4 -23
- data/lib/hecks/cli/document.rb +3 -21
- data/lib/hecks/cli/ir.rb +3 -5
- data/lib/hecks/cli/mcp.rb +2 -3
- data/lib/hecks/cli/mcp_door.rb +19 -114
- data/lib/hecks/cli/model_check.rb +18 -85
- data/lib/hecks/cli/project_cli.rb +7 -40
- data/lib/hecks/cli/project_diagrams.rb +0 -7
- data/lib/hecks/cli/run.rb +12 -58
- data/lib/hecks/cli/smoke_test.rb +2 -16
- data/lib/hecks/cli/stores.rb +1 -2
- data/lib/hecks/cli.rb +18 -24
- 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 +82 -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 +9 -90
- 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 +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 +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 +6 -25
- 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 +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.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 +150 -678
- 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 +2 -15
- 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 +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/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 +3 -6
- data/lib/hecks/release/runner/commands.rb +2 -4
- data/lib/hecks/release/runner/gem_publisher.rb +2 -3
- data/lib/hecks/release/runner/npm_publisher.rb +6 -20
- data/lib/hecks/release/runner/preflight.rb +4 -19
- data/lib/hecks/release/runner/tagger.rb +2 -9
- data/lib/hecks/release/runner.rb +3 -32
- 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 +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 +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 +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 +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 +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 +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 +99 -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 +141 -568
- 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.rb +26 -81
- 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 +3 -2
|
@@ -1,44 +1,11 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module Bluebook
|
|
3
3
|
module MetaValidator
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
# ## Why a plan, not a hand-written branch per category
|
|
7
|
-
#
|
|
8
|
-
# "Which append command belongs to which list is not derivable from a
|
|
9
|
-
# name" sounds like a reason to hand-write one branch per category —
|
|
10
|
-
# and is beside the point. It is derivable from the language's own IR,
|
|
11
|
-
# because every append command declares its target:
|
|
12
|
-
#
|
|
13
|
-
# command "Argument" do
|
|
14
|
-
# reference_to Command
|
|
15
|
-
# then_set :arguments, append: { name: :name, type: :type, ... }
|
|
16
|
-
# end
|
|
17
|
-
#
|
|
18
|
-
# That one line says both things a walk needs: `Command.Argument` is the
|
|
19
|
-
# appender for the `arguments` list, and the map binds each value-object
|
|
20
|
-
# field to the command argument that fills it. Nothing is matched by name.
|
|
21
|
-
#
|
|
22
|
-
# The same reading recovers the containment tree. A command with no
|
|
23
|
-
# self-reference is the creating one, and the `*_id` argument it carries
|
|
24
|
-
# names the parent — so Bluebook -> Aggregate -> Command / ValueObject /
|
|
25
|
-
# Query / Entity, ValueObject -> Member, ProcessManager -> Handler ->
|
|
26
|
-
# Dispatch all fall out of the declarations rather than being restated here.
|
|
27
|
-
#
|
|
28
|
-
# ## Usage
|
|
29
|
-
#
|
|
30
|
-
# plan = Plan.for(MetaValidator.grammar_registry)
|
|
31
|
-
# plan.category("Command").parent # => "Aggregate"
|
|
32
|
-
# plan.category("Command").appends["rules"] # => Append(verb: "Rule", map: {...})
|
|
33
|
-
# plan.verbs # every Bluebook:: verb declared
|
|
34
|
-
#
|
|
35
|
-
# This reads the language. It does not read a bluebook and it dispatches
|
|
36
|
-
# nothing — that is the judge's job.
|
|
4
|
+
# The language's own self-description, read back as a walkable structure:
|
|
5
|
+
# which command appends to which list, and how the containment tree nests.
|
|
37
6
|
class Plan
|
|
38
7
|
# One append command: the verb, and the value-object-field -> argument map.
|
|
39
|
-
# `:map` shadows Enumerable#map on purpose
|
|
40
|
-
# itself asserts `appends["emits"].map` reads the field (a Hash),
|
|
41
|
-
# not an Enumerable#map result. Verified before disabling this cop.
|
|
8
|
+
# `:map` shadows Enumerable#map on purpose; spec/plan_spec.rb asserts on it.
|
|
42
9
|
# rubocop:disable-next Lint/StructNewOverride
|
|
43
10
|
Append = Struct.new(:verb, :map, keyword_init: true)
|
|
44
11
|
|
|
@@ -50,9 +17,8 @@ module Hecks
|
|
|
50
17
|
:appends, :alternates, :setters, :sealers, :references,
|
|
51
18
|
:identity_paths, :entity_owned,
|
|
52
19
|
keyword_init: true) do
|
|
53
|
-
# Every verb this category declares, in declaration order
|
|
54
|
-
#
|
|
55
|
-
# from this is a verb the coverage gate stops watching.
|
|
20
|
+
# Every verb this category declares, in declaration order; a verb missing
|
|
21
|
+
# here is one the coverage gate stops watching.
|
|
56
22
|
#
|
|
57
23
|
# @return [Array<String>] every command name this category declares
|
|
58
24
|
# (the creating command, every setter, appender, alternate
|
|
@@ -62,10 +28,7 @@ module Hecks
|
|
|
62
28
|
*alternates.map(&:verb), *sealers].compact
|
|
63
29
|
end
|
|
64
30
|
|
|
65
|
-
#
|
|
66
|
-
# an id is a scalar — so the judge offers it bare, where every other
|
|
67
|
-
# field goes as a one-field value object. The language answers this
|
|
68
|
-
# about itself, so declaring a new reference needs no change here.
|
|
31
|
+
# Whether `argument` on `verb` carries an ID rather than a value.
|
|
69
32
|
#
|
|
70
33
|
# @param verb [String] the command name declaring `argument`
|
|
71
34
|
# @param argument [String] the argument name to check
|
|
@@ -74,11 +37,7 @@ module Hecks
|
|
|
74
37
|
Array(references[verb.to_s]).include?(argument.to_s)
|
|
75
38
|
end
|
|
76
39
|
|
|
77
|
-
#
|
|
78
|
-
# tree.
|
|
79
|
-
#
|
|
80
|
-
# @return [Boolean] whether this category has no parent — the root
|
|
81
|
-
# of the containment tree
|
|
40
|
+
# Whether this category has no parent — the root of the containment tree.
|
|
82
41
|
def root? = parent.nil?
|
|
83
42
|
end
|
|
84
43
|
|
|
@@ -105,38 +64,12 @@ module Hecks
|
|
|
105
64
|
|
|
106
65
|
@categories[aggregate.hecks_name] = read(aggregate)
|
|
107
66
|
|
|
108
|
-
#
|
|
109
|
-
#
|
|
110
|
-
# `
|
|
111
|
-
#
|
|
112
|
-
#
|
|
113
|
-
#
|
|
114
|
-
# `Assembly::Contracts` keeps a bespoke entry for each
|
|
115
|
-
# (Member's own open-map `pairs`, Dispatch's own open-map
|
|
116
|
-
# `with_spec`), distinct from the single generic "Entity"
|
|
117
|
-
# category every ordinary real-corpus entity (LedgerEntry,
|
|
118
|
-
# Withdrawal, ...) is described through instead. Safe to
|
|
119
|
-
# walk every meta-domain aggregate's own `.entities`
|
|
120
|
-
# unconditionally — `Plan` only ever reads the meta-
|
|
121
|
-
# domain's own self-description (`Plan.for(MetaValidator.
|
|
122
|
-
# grammar_registry)`), which never declares a generic,
|
|
123
|
-
# nameless entity of its own the way a real domain's
|
|
124
|
-
# `LedgerEntry` is; the only entities the meta-domain
|
|
125
|
-
# itself ever declares are exactly the three this ADR
|
|
126
|
-
# names. `entity_owned: true` records why this is a
|
|
127
|
-
# category at all — the real runtime has no top-level
|
|
128
|
-
# aggregate named "Member" to dispatch a bare verb into,
|
|
129
|
-
# so the judge has to build a dotted one instead
|
|
130
|
-
# (see `Judge#verb_for`).
|
|
131
|
-
#
|
|
132
|
-
# Recurses — `Dispatch` nests inside `Handler`, which nests
|
|
133
|
-
# inside `ProcessManager`, two levels deep, not one. Each
|
|
134
|
-
# nested entity's own `parent` names the direct owner it was
|
|
135
|
-
# actually found under (Dispatch's is "Handler", not
|
|
136
|
-
# "ProcessManager") — `read`'s own `owner:` argument already
|
|
137
|
-
# takes whichever name is passed, so walking one level deeper
|
|
138
|
-
# each recursive call is the whole change; nothing about
|
|
139
|
-
# `read` itself needed to know how deep it was called from.
|
|
67
|
+
# Member, Handler and Dispatch are entities nested under their
|
|
68
|
+
# owning aggregate (ADR 0026), so `meta.aggregates` alone never
|
|
69
|
+
# finds them; `add_nested_entities` walks each aggregate's own
|
|
70
|
+
# `.entities`, recursing (Dispatch nests inside Handler inside
|
|
71
|
+
# ProcessManager), with `entity_owned: true` marking that this
|
|
72
|
+
# category has no top-level aggregate a bare verb can dispatch into.
|
|
140
73
|
add_nested_entities(aggregate)
|
|
141
74
|
end
|
|
142
75
|
@categories.freeze
|
|
@@ -156,16 +89,7 @@ module Hecks
|
|
|
156
89
|
def names = @categories.keys
|
|
157
90
|
|
|
158
91
|
# Every verb the language declares, spelled as the judge would
|
|
159
|
-
# dispatch it
|
|
160
|
-
# own `entity_owned` flag) has no real top-level aggregate the
|
|
161
|
-
# runtime can route a bare verb into, so it is
|
|
162
|
-
# spelled dotted here too — `Bluebook::ValueObject.Member.
|
|
163
|
-
# Declare`, `Bluebook::ProcessManager.Handler.Dispatch.Bind` —
|
|
164
|
-
# matching `Judge#verb_for`/`#dotted_prefix`'s own build
|
|
165
|
-
# exactly (recursing the same way, for the same reason: an
|
|
166
|
-
# entity-owned category's own parent may itself be entity-
|
|
167
|
-
# owned), so this stays what it already is: the judge's own
|
|
168
|
-
# coverage promise, not a second guess at it.
|
|
92
|
+
# dispatch it — entity-owned categories dotted to match `Judge#verb_for`.
|
|
169
93
|
#
|
|
170
94
|
# @return [Array<String>] every verb the language declares, dotted
|
|
171
95
|
# and prefixed with `"Bluebook::"`, such as `"Bluebook::Aggregate.
|
|
@@ -178,13 +102,8 @@ module Hecks
|
|
|
178
102
|
|
|
179
103
|
private
|
|
180
104
|
|
|
181
|
-
#
|
|
182
|
-
#
|
|
183
|
-
# two-level chain (`Dispatch`, inside `Handler`, inside
|
|
184
|
-
# `ProcessManager`). `owner` is passed down explicitly rather
|
|
185
|
-
# than re-derived, because it names whichever construct this
|
|
186
|
-
# call actually found the entity under — the direct parent, not
|
|
187
|
-
# the root.
|
|
105
|
+
# Recurses to handle ADR 0026's two-level entity chain (Dispatch inside
|
|
106
|
+
# Handler inside ProcessManager).
|
|
188
107
|
def add_nested_entities(owner)
|
|
189
108
|
owner.entities.each do |entity|
|
|
190
109
|
next if entity.commands.empty?
|
|
@@ -194,12 +113,7 @@ module Hecks
|
|
|
194
113
|
end
|
|
195
114
|
end
|
|
196
115
|
|
|
197
|
-
#
|
|
198
|
-
# mirrors `Judge#dotted_prefix` exactly (S17, ADR 0026): the
|
|
199
|
-
# plain name for an ordinary category, or its parent's own
|
|
200
|
-
# prefix with this category's name appended, for an entity-
|
|
201
|
-
# owned one, recursing because the parent may itself be
|
|
202
|
-
# entity-owned.
|
|
116
|
+
# Mirrors `Judge#dotted_prefix` exactly; must agree for entity-owned categories.
|
|
203
117
|
def dotted_prefix(name)
|
|
204
118
|
found = category(name)
|
|
205
119
|
return name unless found&.entity_owned
|
|
@@ -207,30 +121,11 @@ module Hecks
|
|
|
207
121
|
"#{dotted_prefix(found.parent)}.#{name}"
|
|
208
122
|
end
|
|
209
123
|
|
|
210
|
-
# `owner
|
|
211
|
-
#
|
|
212
|
-
# argument (read via `parent_reference_of` below), the same
|
|
213
|
-
# way it always has. An entity-level one never does — `entity
|
|
214
|
-
# "Member" do ... end`'s own creating command reaches its
|
|
215
|
-
# parent through the dotted call itself (`ValueObject.Member.
|
|
216
|
-
# Declare`), the same reason an ordinary entity's own commands
|
|
217
|
-
# never declare `reference_to` either (entity.md's own
|
|
218
|
-
# reference page states this). So the owning aggregate's name
|
|
219
|
-
# is passed in directly here, by the caller who already knows
|
|
220
|
-
# it (the same `.entities` walk that found this node), rather
|
|
221
|
-
# than derived from an argument that was never going to be
|
|
222
|
-
# there.
|
|
124
|
+
# `owner` is passed in explicitly: an entity's own creating command
|
|
125
|
+
# never carries a `reference_to` argument to derive it from.
|
|
223
126
|
def read(aggregate, owner: nil, entity_owned: false)
|
|
224
|
-
#
|
|
225
|
-
#
|
|
226
|
-
# a real entity's own commands pass too, since `entity "Member" do
|
|
227
|
-
# command "Pair" ... end end` never writes `reference_to` (an
|
|
228
|
-
# entity's commands never do — banking's own LedgerEntry.Amend
|
|
229
|
-
# doesn't either). Calling it here would have it seize on Member's
|
|
230
|
-
# own "Pair" and call that the creating command, which it is not:
|
|
231
|
-
# a Member is created by `ValueObject.Member`, its owner's own bare
|
|
232
|
-
# append command, the same way a real LedgerEntry is created by
|
|
233
|
-
# `Account.LogEntry`, never by a dotted verb of its own.
|
|
127
|
+
# entity_owned skips declaration_command: an entity's own commands
|
|
128
|
+
# never carry `reference_to`, so it would misidentify one as creating.
|
|
234
129
|
declare = entity_owned ? nil : declaration_command(aggregate)
|
|
235
130
|
parent = parent_relationship_of(aggregate)
|
|
236
131
|
parent_key = owner ? "aggregate" : parent&.name&.to_s
|
|
@@ -249,19 +144,14 @@ module Hecks
|
|
|
249
144
|
# Every command, not `rest` — the creating command carries the parent
|
|
250
145
|
# link, which is the most common reference of all.
|
|
251
146
|
references: references_in(aggregate.commands),
|
|
252
|
-
#
|
|
253
|
-
#
|
|
254
|
-
# dispatches, because the children it walks next carry it as their
|
|
255
|
-
# parent — so it derives the same join the runtime will, off the same
|
|
256
|
-
# declaration: a hand-written branch per category, disagreeing with
|
|
257
|
-
# the runtime by even one separator, would be a broken reference.
|
|
147
|
+
# Read from the language, not restated: a hand-written join here
|
|
148
|
+
# could disagree with the runtime's own by even one separator.
|
|
258
149
|
identity_paths: aggregate.identity_paths,
|
|
259
150
|
entity_owned: entity_owned
|
|
260
151
|
)
|
|
261
152
|
end
|
|
262
153
|
|
|
263
|
-
# Which arguments of which verbs carry an ID
|
|
264
|
-
# straight from the language's own IR.
|
|
154
|
+
# Which arguments of which verbs carry an ID, read straight off the IR.
|
|
265
155
|
def references_in(commands)
|
|
266
156
|
commands.each_with_object({}) do |command, found|
|
|
267
157
|
named = command.attributes.select(&:reference?).map { |attribute| attribute.name.to_s }
|
|
@@ -269,12 +159,7 @@ module Hecks
|
|
|
269
159
|
end
|
|
270
160
|
end
|
|
271
161
|
|
|
272
|
-
#
|
|
273
|
-
# Receiver references never carried that meaning; entity-owned categories
|
|
274
|
-
# prove it because every one of their commands lacks such a marker. The
|
|
275
|
-
# identity-write rule is structural and remains true after routing moves
|
|
276
|
-
# entirely into `to:`. `owner_id` is traversal context rather than stored
|
|
277
|
-
# state, so the declaration establishes every remaining identity head.
|
|
162
|
+
# `owner_id` is excluded: it's traversal context, not stored identity state.
|
|
278
163
|
def declaration_command(aggregate)
|
|
279
164
|
required = aggregate.identity_heads.map(&:to_sym) - [:owner_id]
|
|
280
165
|
candidates = aggregate.commands.select do |command|
|
|
@@ -289,19 +174,13 @@ module Hecks
|
|
|
289
174
|
"its identity fields #{required.join(', ')} — found #{candidates.map(&:hecks_name).join(', ')}"
|
|
290
175
|
end
|
|
291
176
|
|
|
292
|
-
#
|
|
293
|
-
# structural relationship is the traversal parent; command arguments may
|
|
294
|
-
# carry its identity as an ordinary value object, but do not define it.
|
|
177
|
+
# The first declared reference attribute is the traversal parent.
|
|
295
178
|
def parent_relationship_of(aggregate)
|
|
296
179
|
aggregate.attributes.find(&:reference?)
|
|
297
180
|
end
|
|
298
181
|
|
|
299
|
-
#
|
|
300
|
-
#
|
|
301
|
-
# not a field. Command.Declare carries `entity_id` as well as
|
|
302
|
-
# the parent `aggregate` reference, because an entity declares
|
|
303
|
-
# commands too, and offering either as a field would have the
|
|
304
|
-
# walk hand it a name instead of a head.
|
|
182
|
+
# Every reference argument is dropped, not just the parent link:
|
|
183
|
+
# a reference is not a field.
|
|
305
184
|
def declared_fields(declare)
|
|
306
185
|
return [] unless declare
|
|
307
186
|
|
|
@@ -314,21 +193,15 @@ module Hecks
|
|
|
314
193
|
Array(command.mutations).each do |mutation|
|
|
315
194
|
next unless mutation.op == :append
|
|
316
195
|
|
|
317
|
-
# First wins, not last.
|
|
318
|
-
#
|
|
319
|
-
# because a reference's type is not a value object and cannot go
|
|
320
|
-
# through the same verb. Overwriting would have let the one declared
|
|
321
|
-
# later silently displace the other, and the walk would have offered
|
|
322
|
-
# every ordinary attribute as a reference.
|
|
196
|
+
# First wins, not last: Aggregate.Attribute and Aggregate.Reference
|
|
197
|
+
# both extend `attributes`; overwriting would displace one silently.
|
|
323
198
|
found[mutation.target.to_s] ||= Append.new(verb: command.hecks_name, map: mutation.source)
|
|
324
199
|
end
|
|
325
200
|
end
|
|
326
201
|
end
|
|
327
202
|
|
|
328
|
-
# The appenders displaced by first-wins
|
|
329
|
-
#
|
|
330
|
-
# plan, but they are still verbs the language declares and the coverage
|
|
331
|
-
# gate has to see them.
|
|
203
|
+
# The appenders displaced by first-wins in `appends_in`; still verbs
|
|
204
|
+
# the coverage gate must see.
|
|
332
205
|
def alternates_in(commands)
|
|
333
206
|
claimed = {}
|
|
334
207
|
commands.flat_map do |command|
|
|
@@ -359,9 +232,7 @@ module Hecks
|
|
|
359
232
|
end
|
|
360
233
|
end
|
|
361
234
|
|
|
362
|
-
# Commands that change nothing — they exist to be refused.
|
|
363
|
-
# the whole-document check: dispatched once everything is declared, carrying
|
|
364
|
-
# only givens. A category with no sealer simply has no such rule.
|
|
235
|
+
# Commands that change nothing — they exist only to be refused.
|
|
365
236
|
def sealers_in(commands)
|
|
366
237
|
commands.select { |command| Array(command.mutations).empty? }.map(&:hecks_name)
|
|
367
238
|
end
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module Bluebook
|
|
3
3
|
module MetaValidator
|
|
4
|
-
# Offers a built .port to the
|
|
5
|
-
#
|
|
6
|
-
# A port is a sibling of a bluebook, the same shape WorldJudge already
|
|
7
|
-
# is one level over — its own file, its own door, judged through its
|
|
8
|
-
# own self-hosted language (port.bluebook) rather than left as a plain
|
|
9
|
-
# Ruby struct nothing checks. Whole-project table-unification survey,
|
|
10
|
-
# item #13's remaining builders.
|
|
4
|
+
# Offers a built .port to the self-hosted port language (port.bluebook).
|
|
5
|
+
# Refusals are collected in `refusals`.
|
|
11
6
|
class PortJudge
|
|
12
7
|
attr_reader :refusals
|
|
13
8
|
|