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
|
@@ -1,70 +1,15 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module Bluebook
|
|
3
3
|
module MetaValidator
|
|
4
|
-
# A bluebook rebuilt from the meta-domain, in the shape the builder produces.
|
|
5
|
-
#
|
|
6
|
-
# This is the second half of the claim at the top of bluebook.bluebook —
|
|
7
|
-
# "loading a domain becomes dispatching commands into this meta-domain ; the
|
|
8
|
-
# IR it stores must equal the IR the DSL builder produces". The judge is the
|
|
9
|
-
# first half. This reads the records back and assembles `to_h`.
|
|
10
|
-
#
|
|
11
|
-
# ## One table, both directions
|
|
12
|
-
#
|
|
13
|
-
# It is the inverse of the walk and shares its plan: the walk reads a node's
|
|
14
|
-
# lists through the command that appends to each, and this reads them back out
|
|
15
|
-
# of the rows those commands wrote. The retired `experiment/replay.rb` needed
|
|
16
|
-
# 420 hand-written lines because the dispatch half was hand-written too; there
|
|
17
|
-
# is nothing to hand-write when both directions are one table.
|
|
18
|
-
#
|
|
19
|
-
# This file is the traversal. The hashes at its tips, and the encodings they
|
|
20
|
-
# undo, are in Shapes.
|
|
21
|
-
#
|
|
22
|
-
# The parent key of every level is read from the language's own plan, the same
|
|
23
|
-
# Plan the walk dispatches from — so the two directions really are one table,
|
|
24
|
-
# which is what the header above has always claimed.
|
|
25
|
-
#
|
|
26
|
-
# ## Reads level by level, not through the read model
|
|
27
|
-
#
|
|
28
|
-
# It reads level by level, through `DeclaredIn`, and not through the read
|
|
29
|
-
# model — which is the difference between a reconstruction that can be the
|
|
30
|
-
# source and one that can only be a check.
|
|
31
|
-
#
|
|
32
|
-
# `Meta.whole_bluebook` gathers a chapter in a single read, and it sorts:
|
|
33
|
-
# `ReadModelInterpreter#matching` ends `.sort_by(&:id)` deliberately, because
|
|
34
|
-
# a store's iteration order is an accident, and a read model returning store
|
|
35
|
-
# order would let that accident leak into an answer.
|
|
36
|
-
# Right for a read model, fatal here — the order a bluebook declares its
|
|
37
|
-
# commands in is a fact about the source, and the IR is a contract field for
|
|
38
|
-
# field and index for index ; the export carries that order verbatim.
|
|
39
|
-
# `DeclaredIn` preserves it (spec/executes_spec says so), so this asks each
|
|
40
|
-
# level for its own children rather than filtering one sorted gather.
|
|
41
|
-
#
|
|
42
|
-
# ## What it cannot rebuild
|
|
43
|
-
#
|
|
44
|
-
# What it cannot rebuild matters as much as what it can, and
|
|
45
|
-
# spec/round_trip_spec pins the difference as an exact set: a field the language
|
|
46
|
-
# does not hold appears there as a named gap, and a field it stops holding
|
|
47
|
-
# appears as a failure.
|
|
4
|
+
# A bluebook rebuilt from the meta-domain, in the shape the DSL builder's `to_h` produces.
|
|
5
|
+
# Reads level by level through `DeclaredIn`, not the read model, to preserve declared order.
|
|
48
6
|
class Reconstruction
|
|
49
7
|
include Readings
|
|
50
8
|
include Shapes
|
|
51
9
|
|
|
52
10
|
# Reads one judged chapter back out of `runtime` and assembles it.
|
|
53
|
-
#
|
|
54
|
-
# @param runtime [Runtime::Dispatcher] the dispatcher holding the
|
|
55
|
-
# judge's own records
|
|
56
|
-
# @param chapter [String] the chapter's own `hecks_name`
|
|
57
|
-
# @return [Hash{Symbol => Object}] the reconstructed IR, in the
|
|
58
|
-
# shape the DSL builder's own `to_h` produces
|
|
59
|
-
# @raise [Runtime::NotFound] if `runtime` holds no bluebook named
|
|
60
|
-
# `chapter`
|
|
61
11
|
def self.of(runtime, chapter) = new(runtime, chapter).to_h
|
|
62
12
|
|
|
63
|
-
# @param runtime [Runtime::Dispatcher] the dispatcher holding the
|
|
64
|
-
# judge's own records
|
|
65
|
-
# @param chapter [String] the chapter's own `hecks_name`
|
|
66
|
-
# @raise [Runtime::NotFound] if `runtime` holds no bluebook named
|
|
67
|
-
# `chapter`
|
|
68
13
|
def initialize(runtime, chapter)
|
|
69
14
|
@runtime = runtime
|
|
70
15
|
@plan = Plan.for(MetaValidator.grammar_registry)
|
|
@@ -99,17 +44,8 @@ module Hecks
|
|
|
99
44
|
@runtime.query("Bluebook::#{category}.DeclaredIn", key.to_sym => { value: parent_id.to_s })
|
|
100
45
|
end
|
|
101
46
|
|
|
102
|
-
# One declaration, built from the contract.
|
|
103
|
-
#
|
|
104
|
-
# There were eleven methods here, one per category, each spelling out the same
|
|
105
|
-
# keys `Assembly::Contracts` already names — which is the shape the judge used
|
|
106
|
-
# to have and paid fourteen unoffered verbs for. The keys come from the table
|
|
107
|
-
# now, and the exceptions come from its `reads:` column: a list needs a reader
|
|
108
|
-
# per element, a folded field is gathered rather than fetched, and everything
|
|
109
|
-
# else is one cell.
|
|
110
|
-
#
|
|
111
|
-
# `extra` is what the containment supplies — children, and the folded objects
|
|
112
|
-
# a row cannot hold on its own.
|
|
47
|
+
# One declaration, built from the contract's field table. `extra` supplies
|
|
48
|
+
# children and folded objects a row cannot hold on its own.
|
|
113
49
|
def declaration(category, row, extra = {})
|
|
114
50
|
contract = Assembly.contract(category)
|
|
115
51
|
|
|
@@ -130,10 +66,8 @@ module Hecks
|
|
|
130
66
|
end
|
|
131
67
|
end
|
|
132
68
|
|
|
133
|
-
#
|
|
134
|
-
#
|
|
135
|
-
# more than the element: an attribute's type came in as the ID of whatever it
|
|
136
|
-
# names, so reading it back needs the row it belongs to.
|
|
69
|
+
# `Shapes`'s own readers, called by name. `:each_with_id` also passes the
|
|
70
|
+
# row, since an attribute's type arrives as the ID of what it names.
|
|
137
71
|
def read_shaped(spec, key, row)
|
|
138
72
|
shape, named = spec
|
|
139
73
|
|
|
@@ -170,20 +104,14 @@ module Hecks
|
|
|
170
104
|
cell
|
|
171
105
|
end
|
|
172
106
|
|
|
173
|
-
# An aggregate's own verbs
|
|
174
|
-
# the parent link
|
|
175
|
-
# against, so the entity ones have to be told apart by `entity_id`. Rejecting
|
|
176
|
-
# from an ordered read keeps the order.
|
|
107
|
+
# An aggregate's own verbs/asks, told apart from an entity's by `entity_id`;
|
|
108
|
+
# both carry the same parent link. Selecting from an ordered read keeps order.
|
|
177
109
|
def own(category, aggregate_id)
|
|
178
110
|
declared(category, aggregate_id).select { |row| text(row[:entity_id]).to_s == "" }
|
|
179
111
|
end
|
|
180
112
|
|
|
181
|
-
# A piece's own verbs
|
|
182
|
-
#
|
|
183
|
-
# name this piece. `row[:aggregate]` — an entity row's own `reference_to
|
|
184
|
-
# Aggregate` (bare, no `_id` since ADR 0025) — not `entity_id`, which
|
|
185
|
-
# stays suffixed below : that one is Command/Query's own explicit `as:`,
|
|
186
|
-
# never touched by the rename.
|
|
113
|
+
# A piece's own verbs/asks: no `DeclaredIn` is keyed by entity, so this
|
|
114
|
+
# queries by `row[:aggregate]` and filters the results by `entity_id`.
|
|
187
115
|
def within(category, row)
|
|
188
116
|
declared(category, text(row[:aggregate]))
|
|
189
117
|
.select { |held| text(held[:entity_id]).to_s == row[:id].to_s }
|
|
@@ -199,16 +127,10 @@ module Hecks
|
|
|
199
127
|
attributes: Array(row[:attributes]).map { |field| attribute(field, id) },
|
|
200
128
|
value_objects: declared("ValueObject", id).map { |shape| value_object(shape) },
|
|
201
129
|
commands: own("Command", id).map { |verb| command(verb) },
|
|
202
|
-
#
|
|
203
|
-
#
|
|
204
|
-
# `rule` reader `command`'s own givens/ensures already use
|
|
205
|
-
# (Assembly::Contracts' generic `declaration()` path), read
|
|
206
|
-
# here by hand because `aggregate(row)` itself is hand-typed,
|
|
207
|
-
# unlike `command`/`value_object`/`query` below.
|
|
130
|
+
# Read by hand, not via `declaration()`, since this method builds its
|
|
131
|
+
# hash directly; `rule` is the same reader `command`'s own uses.
|
|
208
132
|
invariants: Array(row[:invariants]).map { |held| rule(held) },
|
|
209
133
|
preconditions: Array(row[:preconditions]).map { |held| rule(held) },
|
|
210
|
-
# S12, ADR 0025 — same reason invariants/preconditions are
|
|
211
|
-
# read by hand two lines up: `aggregate(row)` is hand-typed.
|
|
212
134
|
projected_fields: Array(row[:projected_fields]).map { |held| projected_field(held) },
|
|
213
135
|
lifecycle: lifecycle(row),
|
|
214
136
|
entities: direct_entities(id, id).map { |piece| entity(piece) },
|
|
@@ -221,32 +143,12 @@ module Hecks
|
|
|
221
143
|
|
|
222
144
|
def closed_set_of(row) = !text(row[:rows]).nil?
|
|
223
145
|
|
|
224
|
-
# A closed set's admitted rows
|
|
225
|
-
#
|
|
226
|
-
# ValueObject), created by `ValueObject.Member` (an ordinary append,
|
|
227
|
-
# the same way `Account.LogEntry` creates a LedgerEntry) and mutated
|
|
228
|
-
# by its own dotted `ValueObject.Member.Pair`. Its data therefore
|
|
229
|
-
# lives inline on the value object's own dispatched state — same as
|
|
230
|
-
# any other entity list — not behind a separate `DeclaredIn` query:
|
|
231
|
-
# there is no such query any more, because there is no top-level
|
|
232
|
-
# "Member" aggregate left to hold one. Pairs are still an open map,
|
|
233
|
-
# which no value object can hold, so they still come back one pair
|
|
234
|
-
# at a time.
|
|
146
|
+
# A closed set's admitted rows live inline on the value object's own
|
|
147
|
+
# dispatched state, one member at a time, not behind a `DeclaredIn` query.
|
|
235
148
|
def members_row(row) = members_of(row)
|
|
236
149
|
|
|
237
|
-
# The key is stringified, never the value
|
|
238
|
-
#
|
|
239
|
-
# (lib/hecks/bluebook/value_object.rb, L7 docs/audits/
|
|
240
|
-
# 2026-08-11-bug-triage.md). `Pair.value` is declared `String`
|
|
241
|
-
# (shape.bluebook), but a real pair can hold whatever native Ruby
|
|
242
|
-
# type the source member line actually wrote (`StatementFrequency`'s
|
|
243
|
-
# own `retention_months: 84`, examples/banking/bluebook/
|
|
244
|
-
# statements.bluebook) — `text` already unwraps the stored Value to
|
|
245
|
-
# that real type, so calling `.to_s` here erased it a second time,
|
|
246
|
-
# on the side spec/round_trip_spec.rb compares straight against a
|
|
247
|
-
# fresh raw load (`Reconstruction.of` directly, no Assembly in
|
|
248
|
-
# between): `declared 84, read back "84"` the moment `to_h` stopped
|
|
249
|
-
# erasing it on the other side and this one kept erasing it alone.
|
|
150
|
+
# The key is stringified, never the value: a pair's value keeps whatever
|
|
151
|
+
# native Ruby type the source line actually wrote.
|
|
250
152
|
def members_of(value_object_row)
|
|
251
153
|
Array(value_object_row[:members]).map do |member|
|
|
252
154
|
Array(member[:pairs]).map { |pair| [text(pair[:key]).to_s, text(pair[:value])] }
|
|
@@ -257,15 +159,8 @@ module Hecks
|
|
|
257
159
|
|
|
258
160
|
def query(row) = declaration("Query", row).merge(options_of(row))
|
|
259
161
|
|
|
260
|
-
# Every
|
|
261
|
-
#
|
|
262
|
-
# root aggregate, nested or not (Dispatch and Handler both carry
|
|
263
|
-
# `aggregate: process_manager_id`) — `owner` is the field that
|
|
264
|
-
# actually tells them apart : `Judge#nest_entities`'s own
|
|
265
|
-
# comment explains why it is the one to repurpose. Called with
|
|
266
|
-
# `owner_id == root_id` for an aggregate's own direct entities
|
|
267
|
-
# (Handler), and with `owner_id == some entity's own id` for
|
|
268
|
-
# that entity's own nested ones (Dispatch, owned by Handler).
|
|
162
|
+
# Every entity sharing one root aggregate; `owner` (not the root id) tells
|
|
163
|
+
# a direct entity apart from one nested further in.
|
|
269
164
|
def direct_entities(root_id, owner_id)
|
|
270
165
|
declared("Entity", root_id).select { |held| text(held[:owner]).to_s == owner_id.to_s }
|
|
271
166
|
end
|
|
@@ -274,42 +169,19 @@ module Hecks
|
|
|
274
169
|
{
|
|
275
170
|
name: text(row[:name]),
|
|
276
171
|
description: text(row[:description]),
|
|
277
|
-
# The same shape as an aggregate's now. It was a String here and a
|
|
278
|
-
# Symbol there — the IR was not uniform about it, and only a round trip
|
|
279
|
-
# ever said so.
|
|
280
172
|
identified_by: identity_paths(row),
|
|
281
|
-
# `text(row[:aggregate])` — the owning aggregate, the same one
|
|
282
|
-
# `Judge#owning_aggregate_ref` resolved this piece's own
|
|
283
|
-
# attribute types against on the way in, so reconstruction reads
|
|
284
|
-
# a value-object-typed attribute back the identical way an
|
|
285
|
-
# aggregate's own is (`Shapes#shape_field`'s own comment).
|
|
286
173
|
attributes: Array(row[:attributes]).map { |field| shape_field(field, text(row[:aggregate])) },
|
|
287
|
-
# ADR 0028 — the same shape `aggregate(row)`'s own
|
|
288
|
-
# `preconditions:` reads two hand-typed methods up, read by
|
|
289
|
-
# hand for the identical reason: `entity(row)` is hand-typed
|
|
290
|
-
# too, unlike `command`/`value_object`/`query`.
|
|
291
174
|
preconditions: Array(row[:preconditions]).map { |held| rule(held) },
|
|
292
|
-
# Round 7 — the same shape `aggregate(row)`'s own
|
|
293
|
-
# `invariants:` reads, one level down: a piece's own shape
|
|
294
|
-
# rule, checked against every instance of this piece.
|
|
295
175
|
invariants: Array(row[:invariants]).map { |held| rule(held) },
|
|
296
176
|
commands: within("Command", row).map { |verb| command(verb) },
|
|
297
177
|
queries: within("Query", row).map { |ask| query(ask) },
|
|
298
|
-
# S17, ADR 0026 — Dispatch, inside Handler : an entity's own
|
|
299
|
-
# nested entities, found the same way its own direct ones
|
|
300
|
-
# were one level up.
|
|
301
178
|
entities: direct_entities(text(row[:aggregate]), row[:id]).map { |piece| entity(piece) },
|
|
302
|
-
# An entity has its own state machine, and the language has held it all
|
|
303
|
-
# along — Entity.Lifecycle and Entity.Transition were two of the fourteen
|
|
304
|
-
# verbs that started firing when the judge became a walk. Only the
|
|
305
|
-
# reconstruction had never asked for them.
|
|
306
179
|
lifecycle: lifecycle(row)
|
|
307
180
|
}
|
|
308
181
|
end
|
|
309
182
|
|
|
310
183
|
# Assembled from three fields, because the IR keeps one object where the
|
|
311
|
-
# language keeps the parts
|
|
312
|
-
# in the other direction.
|
|
184
|
+
# language keeps the parts.
|
|
313
185
|
def lifecycle(row)
|
|
314
186
|
field = text(row[:state_field])
|
|
315
187
|
return nil if field.to_s.empty?
|
|
@@ -323,45 +195,21 @@ module Hecks
|
|
|
323
195
|
|
|
324
196
|
def policy(row) = declaration("Policy", row)
|
|
325
197
|
|
|
326
|
-
#
|
|
327
|
-
#
|
|
328
|
-
# ordinary append, the same way `Account.LogEntry` creates a
|
|
329
|
-
# LedgerEntry) and mutated by its own dotted `ProcessManager.
|
|
330
|
-
# Handler.Dispatch`/`...Dispatch.Bind`. Its data therefore lives
|
|
331
|
-
# inline on the process manager's own dispatched state — same as
|
|
332
|
-
# any other entity list — not behind a separate `DeclaredIn`
|
|
333
|
-
# query : there is no such query any more, the same fix
|
|
334
|
-
# `Reconstruction#members_of` already made for Member.
|
|
198
|
+
# A process manager's handlers live inline on its own dispatched state,
|
|
199
|
+
# not behind a `DeclaredIn` query.
|
|
335
200
|
def process_manager(row)
|
|
336
201
|
declaration("ProcessManager", row,
|
|
337
202
|
handlers: Array(row[:handlers]).map { |leg| handler(leg) })
|
|
338
203
|
end
|
|
339
204
|
|
|
340
|
-
#
|
|
341
|
-
# Handler, its data lives inline on the handler row this method
|
|
342
|
-
# was just handed (`row` here is one element of `handlers`,
|
|
343
|
-
# above), not behind any query either.
|
|
205
|
+
# A handler's dispatches, nested one level further in, the same way.
|
|
344
206
|
def handler(row)
|
|
345
207
|
declaration("Handler", row,
|
|
346
208
|
dispatches: Array(row[:dispatches]).map { |leg| dispatch(leg) })
|
|
347
209
|
end
|
|
348
210
|
|
|
349
|
-
# `compensates`
|
|
350
|
-
#
|
|
351
|
-
# why), assembled by hand into the shape its own field actually
|
|
352
|
-
# is — `declaration()`'s generic per-field hash-build has no
|
|
353
|
-
# way to turn two cells into a second object, so this reads
|
|
354
|
-
# them directly and passes the result through `extra:`, the
|
|
355
|
-
# same seam `handler`/`process_manager` already use for a
|
|
356
|
-
# `:children` shape a flat Contract cannot describe.
|
|
357
|
-
# `compensates_command_name` absent means no compensation at
|
|
358
|
-
# all — a plain dispatch with nothing to undo. A plain hash, the
|
|
359
|
-
# same declaration shape `to_h` spells for everything else in
|
|
360
|
-
# this file (this file's own top comment) — never a real
|
|
361
|
-
# `DispatchSpec` here; `Assembly#dispatch` is the one place a
|
|
362
|
-
# declaration hash becomes the real object, and building it
|
|
363
|
-
# twice, in two different shapes, is exactly the kind of drift
|
|
364
|
-
# this whole arc exists to remove.
|
|
211
|
+
# `compensates` folds two flat fields on this row into one object; an
|
|
212
|
+
# absent `compensates_command_name` means a plain dispatch with nothing to undo.
|
|
365
213
|
def dispatch(row)
|
|
366
214
|
name = text(row[:compensates_command_name])
|
|
367
215
|
compensates = name && { command_name: name, with_spec: pairs(row[:compensates_with_spec]) }
|