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
|
@@ -3,16 +3,8 @@ Hecks.bluebook "Paging" do
|
|
|
3
3
|
generic
|
|
4
4
|
attaches_to "Query", "ReadModel"
|
|
5
5
|
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
# dispatches this aggregate for real. `SyntaxBoot`'s own generic
|
|
9
|
-
# discovery reads `KeywordSeed`/`ArgumentSeed`'s rows straight off the
|
|
10
|
-
# declared IR, the exact way it already reads the core's own — and
|
|
11
|
-
# dispatches them through the CORE's `Bluebook::Syntax.Keyword`/
|
|
12
|
-
# `.Argument` verbs, which is why these rows need no entity, no
|
|
13
|
-
# lifecycle, no creating command of their own here: the verb they ride
|
|
14
|
-
# already exists, and a second copy of it would be the core's own
|
|
15
|
-
# machinery duplicated for no reason.
|
|
6
|
+
# Holds grammar rows only, like `Vocabulary`: SyntaxBoot reads them off the declared IR and
|
|
7
|
+
# dispatches them through the core's `Syntax.Keyword`/`.Argument` verbs, so no commands here.
|
|
16
8
|
aggregate "Syntax" do
|
|
17
9
|
description "The rows this sub-language contributes to the core's own grammar table."
|
|
18
10
|
identified_by PagingSyntaxName, as: :name
|
|
@@ -23,11 +15,7 @@ Hecks.bluebook "Paging" do
|
|
|
23
15
|
invariant("a syntax table is named") { !value.to_s.empty? }
|
|
24
16
|
end
|
|
25
17
|
|
|
26
|
-
#
|
|
27
|
-
# not rewritten. `limit`/`offset`/`cursor`/`nulls`, on both `Query`
|
|
28
|
-
# and `ReadModel`. See syntax.bluebook's own comment at the old site
|
|
29
|
-
# for why `limit` fills a dedicated field while the other three land
|
|
30
|
-
# on the open `options` map.
|
|
18
|
+
# `limit` fills a dedicated field on Query; the other three land on the open `options` map.
|
|
31
19
|
value_object "KeywordSeed" do
|
|
32
20
|
attribute :word, String
|
|
33
21
|
attribute :context, String
|
|
@@ -68,7 +56,10 @@ Hecks.bluebook "Paging" do
|
|
|
68
56
|
member keyword: "nulls", context: "Query", at: "1", named: "", kind: "symbol", required: "true", fills: "mode"
|
|
69
57
|
|
|
70
58
|
member keyword: "limit", context: "ReadModel", at: "1", named: "", kind: "number", required: "true", fills: "value"
|
|
59
|
+
# ADR 0055's `on:`; see projection.bluebook's own "where"/"order_by" ReadModel rows.
|
|
60
|
+
member keyword: "limit", context: "ReadModel", at: "", named: "on", kind: "constant", required: "false", fills: "target"
|
|
71
61
|
member keyword: "offset", context: "ReadModel", at: "1", named: "", kind: "number", required: "true", fills: "value"
|
|
62
|
+
member keyword: "offset", context: "ReadModel", at: "", named: "on", kind: "constant", required: "false", fills: "target"
|
|
72
63
|
member keyword: "cursor", context: "ReadModel", at: "1", named: "", kind: "symbol", required: "true", fills: "value"
|
|
73
64
|
member keyword: "nulls", context: "ReadModel", at: "1", named: "", kind: "symbol", required: "true", fills: "mode"
|
|
74
65
|
end
|
|
@@ -2,17 +2,7 @@ Hecks.bluebook "Bluebook", version: "1" do
|
|
|
2
2
|
vision "The bluebook language, declared in itself. Loading a domain becomes dispatching commands into this meta-domain ; the IR it stores must equal the IR the DSL builder produces. The floor that stays hand-written is the interpreter — evaluating a predicate held as data — and IO."
|
|
3
3
|
core
|
|
4
4
|
|
|
5
|
-
# A
|
|
6
|
-
#
|
|
7
|
-
# The twelve `DeclaredIn` queries below can walk the tree a level at a time, and
|
|
8
|
-
# a caller stitching twelve reads together is a caller reimplementing this. The
|
|
9
|
-
# language already knows how to say "gather these heads around that spine" —
|
|
10
|
-
# it is what a read model IS — so the reconstruction is DECLARED rather than
|
|
11
|
-
# coded, and the shape of what comes back is a fact about the language instead
|
|
12
|
-
# of a fact about whoever wrote the reader.
|
|
13
|
-
#
|
|
14
|
-
# Spined on Bluebook because a bluebook is what you ask for. Everything else
|
|
15
|
-
# hangs off it, down to a Member's pairs and a Dispatch's bindings.
|
|
5
|
+
# A whole bluebook in one read: every declaration gathered around the chapter itself.
|
|
16
6
|
read_model "WholeBluebook" do
|
|
17
7
|
description "Every declaration of one chapter, gathered around the chapter itself — the way back, in a single read."
|
|
18
8
|
reference_to Bluebook
|
|
@@ -34,54 +24,21 @@ Hecks.bluebook "Bluebook", version: "1" do
|
|
|
34
24
|
aggregate "Bluebook" do
|
|
35
25
|
description "One .bluebook file — the root a domain declaration hangs from."
|
|
36
26
|
|
|
37
|
-
# A
|
|
38
|
-
#
|
|
39
|
-
# It was not, and the reason it was not is worth keeping : the runtime read the
|
|
40
|
-
# identity out of the payload under its head's own name, so a command that both
|
|
41
|
-
# REACHED a bluebook and carried a name could not say both, and `Normalise`
|
|
42
|
-
# could never name what it acts on. The answer at the time was to duck it —
|
|
43
|
-
# keep `name` a plain field and be reached by a minted `id` like nothing else
|
|
44
|
-
# in the language.
|
|
45
|
-
#
|
|
46
|
-
# The duck is what is gone. A command reaches its root through the REFERENCE it
|
|
47
|
-
# declares (`bluebook_id`), which is a different key from any argument it
|
|
48
|
-
# carries, so the two cannot collide however they are spelled. The fallback was
|
|
49
|
-
# hiding a lookup bug ; removing it made the bug visible, and the bug was the
|
|
50
|
-
# smaller thing.
|
|
27
|
+
# A chapter is identified by its name; commands reach it through the `bluebook_id` reference.
|
|
51
28
|
identified_by BluebookName, as: :name
|
|
52
29
|
|
|
53
30
|
attribute :vision, Vision
|
|
54
31
|
attribute :classification, Classification
|
|
55
|
-
#
|
|
56
|
-
# version: "v2"`. Held here because the language must hold everything the
|
|
57
|
-
# runtime runs on, and this was the one field it did not: the round trip sliced
|
|
58
|
-
# its comparison by the reconstruction's own keys, so a version was excluded
|
|
59
|
-
# from the check rather than failing it, and a chapter assembled purely from
|
|
60
|
-
# these records would have lost it in silence. Most chapters declare none, and
|
|
61
|
-
# ABSENT IS NOT EMPTY — an unversioned chapter offers nothing here at all.
|
|
32
|
+
# Contract version pinned per chapter, e.g. `version: "v2"`. Absent is not empty.
|
|
62
33
|
attribute :version, Version
|
|
63
|
-
# A
|
|
64
|
-
# declared fact the language carries, not just a Ruby-side accessor.
|
|
65
|
-
# Most chapters declare none, and ABSENT IS NOT EMPTY, the same
|
|
66
|
-
# reading `version` above gives.
|
|
34
|
+
# A rename is a declared fact. Absent is not empty.
|
|
67
35
|
attribute :formerly_known_as, FormerlyKnownAs
|
|
68
36
|
attribute :normalisations, list_of(NormalisationRule)
|
|
69
|
-
#
|
|
70
|
-
#
|
|
71
|
-
# contributes rows for — "Query", "ReadModel" — so SyntaxBoot's own
|
|
72
|
-
# discovery can find it without the core ever naming it back. Most
|
|
73
|
-
# chapters attach to nothing, and ABSENT IS NOT EMPTY, the same
|
|
74
|
-
# reading `version`/`formerly_known_as` above give.
|
|
37
|
+
# Core contexts a sub-language chapter contributes Syntax rows for (ADR 0026).
|
|
38
|
+
# Absent is not empty: most chapters attach to nothing.
|
|
75
39
|
attribute :attaches_to, list_of(AttachesToContext)
|
|
76
|
-
#
|
|
77
|
-
#
|
|
78
|
-
# per (capability, key, verb): `provides "authorization", grant:
|
|
79
|
-
# "RoleAssignment.Assign"` is the row (authorization, grant,
|
|
80
|
-
# RoleAssignment.Assign). The runtime's role check, boot's
|
|
81
|
-
# ungoverned-role refusal, the authorization adapter and the fuzzer
|
|
82
|
-
# all read the rows rather than the literal "Governance". Most
|
|
83
|
-
# chapters provide nothing, and ABSENT IS NOT EMPTY, the same reading
|
|
84
|
-
# `attaches_to` above gives.
|
|
40
|
+
# Capabilities this chapter answers for other domains, one row per (capability, key, verb).
|
|
41
|
+
# Absent is not empty: most chapters provide nothing.
|
|
85
42
|
attribute :provides, list_of(Provision)
|
|
86
43
|
|
|
87
44
|
value_object "Provision" do
|
|
@@ -159,11 +116,7 @@ Hecks.bluebook "Bluebook", version: "1" do
|
|
|
159
116
|
emits ChapterDeclared
|
|
160
117
|
end
|
|
161
118
|
|
|
162
|
-
#
|
|
163
|
-
# part is (Aggregate.Identify, above) — `attaches_to "Query",
|
|
164
|
-
# "ReadModel"` names any number at once, and a list is filled by a
|
|
165
|
-
# verb of its own here the same reason it is everywhere else in this
|
|
166
|
-
# language.
|
|
119
|
+
# Appends one context; `attaches_to "Query", "ReadModel"` names several at once.
|
|
167
120
|
command "Attach" do
|
|
168
121
|
role "Language"
|
|
169
122
|
goal "Name one core context this chapter's own Syntax rows attach to"
|
|
@@ -171,21 +124,13 @@ Hecks.bluebook "Bluebook", version: "1" do
|
|
|
171
124
|
attribute :context, AttachesToContext
|
|
172
125
|
|
|
173
126
|
sets :attaches_to, append: { value: :context }
|
|
174
|
-
#
|
|
175
|
-
# exactly the shape banking's own ensures already checks ("a
|
|
176
|
-
# ledger entry was posted") { ledger.size == old.ledger.size + 1
|
|
177
|
-
# } — one more row than before, never fewer, never the same.
|
|
127
|
+
# Appending grows the list by exactly one row.
|
|
178
128
|
ensures("the list grew by exactly one") { attaches_to.size == old.attaches_to.size + 1 }
|
|
179
129
|
emits ChapterAttached
|
|
180
130
|
end
|
|
181
131
|
|
|
182
|
-
#
|
|
183
|
-
#
|
|
184
|
-
# order they were written. Membership (`admit`/`grant`/`people`) and
|
|
185
|
-
# identity (`register`/`link`/`resolve`) use the same word with their
|
|
186
|
-
# own named keys; the argument table admits every key any capability
|
|
187
|
-
# declares, and `Capabilities::CONTRACTS` holds which keys a given
|
|
188
|
-
# capability must name.
|
|
132
|
+
# One row of one capability: `provides "authorization", grant: ...` offers one row per key.
|
|
133
|
+
# `Capabilities::CONTRACTS` holds which keys a capability must name.
|
|
189
134
|
command "Provide" do
|
|
190
135
|
role "Language"
|
|
191
136
|
goal "Declare one verb this chapter answers a capability with"
|
|
@@ -199,19 +144,8 @@ Hecks.bluebook "Bluebook", version: "1" do
|
|
|
199
144
|
emits CapabilityProvided
|
|
200
145
|
end
|
|
201
146
|
|
|
202
|
-
#
|
|
203
|
-
#
|
|
204
|
-
# Until these existed the meta-domain was write-only: twelve categories, 34
|
|
205
|
-
# verbs, and not one query. A bluebook could be dispatched in and never read
|
|
206
|
-
# out, which is exactly as much as JUDGING requires — offer every declaration,
|
|
207
|
-
# collect the refusals, throw the records away. It is also why the language
|
|
208
|
-
# could only validate. A store you cannot read cannot be the source of
|
|
209
|
-
# anything, and "loading a domain becomes dispatching commands into this
|
|
210
|
-
# meta-domain" — the vision at the top of this file — needs the records to
|
|
211
|
-
# come back out as the IR the runtime runs.
|
|
212
|
-
# Named to finish a sentence about the thing, the way every other query in the
|
|
213
|
-
# corpus is — pizzas COSTING LESS THAN a ceiling, orders PENDING, cards
|
|
214
|
-
# ACTIVE. So: the bluebook CALLED "Pizzas".
|
|
147
|
+
# Reads a bluebook back out, not only in.
|
|
148
|
+
# Named to finish a sentence: the bluebook CALLED "Pizzas".
|
|
215
149
|
query "Called" do
|
|
216
150
|
attribute :name, BluebookName
|
|
217
151
|
where(name: :name)
|
|
@@ -235,9 +169,7 @@ Hecks.bluebook "Bluebook", version: "1" do
|
|
|
235
169
|
emits NormalisationAttached
|
|
236
170
|
end
|
|
237
171
|
|
|
238
|
-
#
|
|
239
|
-
# they describe; SyntaxBoot discovers every aggregate-local seed table.
|
|
240
|
-
# Contexts represented here: File, Bluebook.
|
|
172
|
+
# Keyword rows for this chapter; SyntaxBoot discovers every aggregate-local seed table.
|
|
241
173
|
value_object "KeywordSeed" do
|
|
242
174
|
attribute :word, String
|
|
243
175
|
attribute :context, String, admits: "Syntax::Context"
|
|
@@ -1,19 +1,7 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
# IS — nine files, one chapter — and until MetaValidator.defer existed it
|
|
4
|
-
# could not be booted the ordinary way at all: each file was judged
|
|
5
|
-
# before its siblings had been read, so Aggregate's reference to Bluebook
|
|
6
|
-
# dangled and the load refused. It boots now, which means it can also be
|
|
7
|
-
# fuzzed, model-checked and inspected exactly like banking or pizzas.
|
|
8
|
-
#
|
|
9
|
-
# Memory because this chapter is read, never written to a store — nothing
|
|
10
|
-
# dispatches a command against the language in production. A binding
|
|
11
|
-
# still has to be DECLARED rather than defaulted, so that what answers is
|
|
12
|
-
# a stated fact rather than whatever the runtime happened to fall back on.
|
|
1
|
+
# The bluebook language as an ordinary domain, so it can be booted, fuzzed and model-checked.
|
|
2
|
+
# Memory: this chapter is read, never written to a store.
|
|
13
3
|
Hecks.hecksagon "Bluebook" do
|
|
14
|
-
#
|
|
15
|
-
# Entity.Declare, ...) — only real access control once Governance can
|
|
16
|
-
# check it against something (S8).
|
|
4
|
+
# `role "Language"` is real access control only once Governance can check it (S8).
|
|
17
5
|
uses_framework "Governance"
|
|
18
6
|
persisted_by "Memory"
|
|
19
7
|
end
|
|
@@ -4,28 +4,12 @@ Hecks.bluebook "Bluebook" do
|
|
|
4
4
|
|
|
5
5
|
reference_to Aggregate
|
|
6
6
|
|
|
7
|
-
#
|
|
8
|
-
# attribute to land in does not persist — the same lesson `disputed_by` taught
|
|
9
|
-
# on CardPayment — so the field has to exist here for Command.Declare's
|
|
10
|
-
# `entity_id` to be held at all.
|
|
7
|
+
# The entity that declared it, when one did; Command.Declare's `entity_id` needs it.
|
|
11
8
|
reference_to Entity, as: :entity_id, optional: true
|
|
12
9
|
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
# to be wrong quietly. One spelling, and the walk reads straight through.
|
|
17
|
-
# THE IMMEDIATE OWNER, AND ITS NAME. Almost every chapter declares a
|
|
18
|
-
# `Declare` ; the owner is what tells one from another.
|
|
19
|
-
#
|
|
20
|
-
# `owner_id` NOT `aggregate_id` : a command declared on an ENTITY is that
|
|
21
|
-
# entity's, not its aggregate's — `Banking:Account:LedgerEntry:Amend` is
|
|
22
|
-
# LedgerEntry's Amend, and `Banking:Account:LedgerEntry` is what tells it
|
|
23
|
-
# apart from a same-named command on some OTHER entity of the same
|
|
24
|
-
# aggregate. `aggregate_id` (kept, below, as data) still names the true
|
|
25
|
-
# root, for the DeclaredIn walk that gathers every command under a
|
|
26
|
-
# chapter’s aggregate whichever piece declared it ; `owner_id` names only
|
|
27
|
-
# whichever declared THIS one. `owner_id` is not a declared attribute —
|
|
28
|
-
# it is the WALK's immediate parent, read the same way `position` is.
|
|
10
|
+
# Field names match the IR's so the judge can walk it without a translation table.
|
|
11
|
+
# `owner_id` is the walk's immediate parent (an entity's command belongs to the entity);
|
|
12
|
+
# `aggregate_id` still names the true root for the DeclaredIn walk.
|
|
29
13
|
identified_by :owner_id, :name
|
|
30
14
|
|
|
31
15
|
attribute :name, CommandName
|
|
@@ -35,19 +19,11 @@ Hecks.bluebook "Bluebook" do
|
|
|
35
19
|
attribute :references, EventName, optional: true
|
|
36
20
|
attribute :attributes, list_of(Argument)
|
|
37
21
|
attribute :givens, list_of(Rule)
|
|
38
|
-
#
|
|
39
|
-
# side of the mutations: a given says what must hold to begin, an
|
|
40
|
-
# ensures says what must hold to have finished. Meyer's third leg.
|
|
22
|
+
# Postconditions: same Rule shape as givens, checked after the mutations.
|
|
41
23
|
attribute :ensures, list_of(Rule)
|
|
42
24
|
attribute :mutations, list_of(Change)
|
|
43
25
|
attribute :provenance, CommandText
|
|
44
|
-
#
|
|
45
|
-
# the same shape `provenance`/`default:` already carry (`from:
|
|
46
|
-
# "open"` or `from: ["open", "frozen"]`, encoded and decoded the
|
|
47
|
-
# same way any other Ruby literal on this construct is), not a
|
|
48
|
-
# dedicated list-of-value-object the way `givens` is — the guard
|
|
49
|
-
# names no target state and moves nothing, so it needs no Rule-
|
|
50
|
-
# shaped predicate at all, only the states it admits.
|
|
26
|
+
# Lifecycle guard as a literal (`from: "open"` or `from: ["open", "frozen"]`); ADR 0025.
|
|
51
27
|
attribute :from, CommandText, optional: true
|
|
52
28
|
|
|
53
29
|
value_object "CommandName" do
|
|
@@ -57,15 +33,11 @@ Hecks.bluebook "Bluebook" do
|
|
|
57
33
|
|
|
58
34
|
value_object "Actor" do
|
|
59
35
|
attribute :value, String
|
|
60
|
-
#
|
|
61
|
-
# role, and the hand-written CommandBuilder never required one. Whether
|
|
62
|
-
# role/goal are mandatory is a language decision — the meta-domain found
|
|
63
|
-
# the drift the moment it enforced uniformly.
|
|
36
|
+
# Optional: many commands declare no role or goal, and the builder never required one.
|
|
64
37
|
end
|
|
65
38
|
|
|
66
39
|
value_object "Goal" do
|
|
67
40
|
attribute :value, String
|
|
68
|
-
# RELAXED — see Actor above.
|
|
69
41
|
end
|
|
70
42
|
|
|
71
43
|
value_object "EventName" do
|
|
@@ -82,10 +54,9 @@ Hecks.bluebook "Bluebook" do
|
|
|
82
54
|
attribute :list, String
|
|
83
55
|
attribute :optional, String, optional: true
|
|
84
56
|
attribute :pattern, String, optional: true
|
|
85
|
-
#
|
|
57
|
+
# A declaration with no default has none.
|
|
86
58
|
attribute :default, String, optional: true
|
|
87
|
-
# The closed set this value must belong to
|
|
88
|
-
# the same declaration, spelled for a command's arguments.
|
|
59
|
+
# The closed set this value must belong to (see Aggregate::Field).
|
|
89
60
|
attribute :admits, String, optional: true
|
|
90
61
|
attribute :relationship, String, optional: true
|
|
91
62
|
end
|
|
@@ -97,32 +68,17 @@ Hecks.bluebook "Bluebook" do
|
|
|
97
68
|
|
|
98
69
|
value_object "Change" do
|
|
99
70
|
attribute :target, String
|
|
100
|
-
# The same word, one aggregate over. `OpName` used to carry
|
|
101
|
-
# `set || append || increment || decrement` in an invariant — Vocabulary's
|
|
102
|
-
# MutationOp written out a second time, one level in, with nothing
|
|
103
|
-
# comparing the two. Naming the set is the whole of what that invariant was
|
|
104
|
-
# trying to say, and it says it where the set actually lives.
|
|
105
71
|
attribute :op, String, admits: "Vocabulary::MutationOp"
|
|
106
72
|
attribute :field, String
|
|
107
73
|
attribute :kind, String
|
|
108
74
|
attribute :source, String
|
|
109
75
|
end
|
|
110
76
|
|
|
111
|
-
#
|
|
112
|
-
# generic text value object and the alternatives all meant something else —
|
|
113
|
-
# RuleText is a predicate, FieldRef is a field, ArgType is a type. Reusing one
|
|
114
|
-
# of those would read as a lie, the way `bluebook_id` typed AggregateName did.
|
|
77
|
+
# Plain string holder for an aggregate id; the other text value objects mean something else.
|
|
115
78
|
value_object "CommandText" do
|
|
116
79
|
attribute :value, String
|
|
117
80
|
end
|
|
118
|
-
#
|
|
119
|
-
# reference IS the query.
|
|
120
|
-
# WHERE IT SITS AMONG ITS SIBLINGS. Declaration order is a FACT ABOUT THE
|
|
121
|
-
# SOURCE — the IR is a contract read straight from this file,
|
|
122
|
-
# field for field AND INDEX FOR INDEX. So the language HOLDS it, instead of
|
|
123
|
-
# inheriting it from whatever order a store happens to iterate: an ask that
|
|
124
|
-
# does not say how it is ordered is answered in identity order, which is
|
|
125
|
-
# right for every other ask and fatal for the one that is the SOURCE.
|
|
81
|
+
# Declaration order is a fact about the source, so the language holds it, not the store.
|
|
126
82
|
value_object "Position" do
|
|
127
83
|
attribute :value, Integer
|
|
128
84
|
end
|
|
@@ -139,18 +95,12 @@ Hecks.bluebook "Bluebook" do
|
|
|
139
95
|
goal "Open a command on an aggregate"
|
|
140
96
|
|
|
141
97
|
reference_to Aggregate
|
|
142
|
-
#
|
|
143
|
-
# Command for both — an entity's commands are Command objects — so the
|
|
144
|
-
# language uses the same Command, and says which piece declared it when a piece
|
|
145
|
-
# did. Absent for an aggregate's own commands, and ABSENT is not EMPTY.
|
|
98
|
+
# Declared on an aggregate or one of its entities; absent for an aggregate's own commands.
|
|
146
99
|
reference_to Entity, as: :entity_id, optional: true
|
|
147
100
|
attribute :name, CommandName
|
|
148
101
|
attribute :role, Actor, optional: true
|
|
149
102
|
attribute :goal, Goal, optional: true
|
|
150
|
-
# See Aggregate.Declare's own `provenance` — identical shape, one
|
|
151
|
-
# level down.
|
|
152
103
|
attribute :provenance, CommandText, optional: true
|
|
153
|
-
# See this aggregate's own `from` field comment, above.
|
|
154
104
|
attribute :from, CommandText, optional: true
|
|
155
105
|
|
|
156
106
|
attribute :position, Position, optional: true
|
|
@@ -175,18 +125,9 @@ Hecks.bluebook "Bluebook" do
|
|
|
175
125
|
attribute :optional, ArgType, optional: true
|
|
176
126
|
attribute :pattern, ArgType, optional: true
|
|
177
127
|
attribute :default, ArgType, optional: true
|
|
178
|
-
# The closed set this argument's value must belong to
|
|
179
|
-
# Aggregate.Attribute, which carries the same word for a head's attributes.
|
|
128
|
+
# The closed set this argument's value must belong to (see Aggregate.Attribute).
|
|
180
129
|
attribute :admits, ArgType, optional: true
|
|
181
|
-
#
|
|
182
|
-
# entity's own reference-typed attribute (`sets :field` importing a
|
|
183
|
-
# `reference_to`/`has_many`/`has_one`/`belongs_to` field rather than
|
|
184
|
-
# retyping it) — see Aggregate.Attribute, which carries the same word
|
|
185
|
-
# for a head's own attributes. Missing here, a round trip through the
|
|
186
|
-
# self-hosted meta-domain silently dropped it for every command
|
|
187
|
-
# argument, even though the live DSL builder set it correctly in
|
|
188
|
-
# memory (CommandBuilder#resolve_bare_set!) — the wire just never
|
|
189
|
-
# carried it back.
|
|
130
|
+
# Marks an argument minted from the owner's reference-typed attribute.
|
|
190
131
|
attribute :relationship, ArgType, optional: true
|
|
191
132
|
|
|
192
133
|
sets :attributes, append: { name: :name, type: :type, list: :list, default: :default, optional: :optional, pattern: :pattern, admits: :admits, relationship: :relationship }
|
|
@@ -194,32 +135,19 @@ Hecks.bluebook "Bluebook" do
|
|
|
194
135
|
emits ArgumentAttached
|
|
195
136
|
end
|
|
196
137
|
|
|
197
|
-
# An argument
|
|
198
|
-
# `reference_to`, written on a command instead of on the head.
|
|
199
|
-
#
|
|
200
|
-
# `Argument` types its type as text, so a reference argument arrived as the
|
|
201
|
-
# STRING "Reference<Customer>" and the language held a spelling rather than a
|
|
202
|
-
# reference. That left "a reference points at a declared head" enforceable
|
|
203
|
-
# only by a `raise Malformed` in the DSL, for three of the four places the
|
|
204
|
-
# word can be written. As a reference it is a consequence of the model here
|
|
205
|
-
# too, exactly as Aggregate.Reference made it one on a head.
|
|
138
|
+
# An argument pointing at another aggregate's head, typed as a reference, not text.
|
|
206
139
|
command "Reference" do
|
|
207
140
|
role "Language"
|
|
208
141
|
goal "Attach an argument that points at another aggregate's head"
|
|
209
142
|
|
|
210
143
|
reference_to Aggregate, as: :points_at
|
|
211
|
-
# No `given`
|
|
212
|
-
# invariant, and a value object's invariant fires during coercion — before
|
|
213
|
-
# any given is reached. A rule that cannot be the one to refuse is
|
|
214
|
-
# decoration, and this language has paid for that mistake before.
|
|
144
|
+
# No `given` on the name: ArgName's invariant fires first, during coercion.
|
|
215
145
|
attribute :name, ArgName
|
|
216
146
|
attribute :list, ArgType
|
|
217
147
|
attribute :optional, ArgType, optional: true
|
|
218
148
|
attribute :pattern, ArgType, optional: true
|
|
219
149
|
attribute :default, ArgType, optional: true
|
|
220
150
|
attribute :admits, ArgType, optional: true
|
|
221
|
-
# See Argument's own :relationship, just above — the same gap, one
|
|
222
|
-
# verb over.
|
|
223
151
|
attribute :relationship, ArgType, optional: true
|
|
224
152
|
|
|
225
153
|
sets :attributes, append: { name: :name, type: :points_at, list: :list, default: :default, optional: :optional, pattern: :pattern, admits: :admits, relationship: :relationship }
|
|
@@ -276,10 +204,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
276
204
|
goal "Attach one mutation to the command"
|
|
277
205
|
|
|
278
206
|
attribute :target, FieldRef
|
|
279
|
-
#
|
|
280
|
-
# what the IR holds ; THIS is what a caller hands in, so this is where a
|
|
281
|
-
# bad op has to be refused — `OpName`'s deleted invariant was refusing
|
|
282
|
-
# exactly here, and the link has to reach the same door to replace it.
|
|
207
|
+
# Named on the argument: this is what a caller hands in, so a bad op is refused here.
|
|
283
208
|
attribute :op, OpName, admits: "Vocabulary::MutationOp"
|
|
284
209
|
attribute :field, FieldRef
|
|
285
210
|
attribute :kind, FieldRef
|
|
@@ -297,11 +222,6 @@ Hecks.bluebook "Bluebook" do
|
|
|
297
222
|
attribute :value, String
|
|
298
223
|
end
|
|
299
224
|
|
|
300
|
-
# THE SET IT ADMITS IS NAMED, NOT RESTATED. This carried
|
|
301
|
-
# `set || append || increment || decrement` — Vocabulary::MutationOp written
|
|
302
|
-
# out a second time, one level in, which is exactly the kind of copy
|
|
303
|
-
# that drifts. `Change.op` now says `admits:
|
|
304
|
-
# Vocabulary::MutationOp`, so there is no second list left to drift.
|
|
305
225
|
value_object "OpName" do
|
|
306
226
|
attribute :value, String
|
|
307
227
|
end
|
|
@@ -310,9 +230,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
310
230
|
role "Language"
|
|
311
231
|
goal "Name the aggregate this command reaches through"
|
|
312
232
|
|
|
313
|
-
#
|
|
314
|
-
# field of the same name inside a given, so a once-only rule cannot read
|
|
315
|
-
# the state it guards unless the two differ.
|
|
233
|
+
# Named `root`, not `references`: an argument shadows the aggregate field of that name.
|
|
316
234
|
attribute :root, EventName
|
|
317
235
|
|
|
318
236
|
given("a command names what it acts on") { !root.value.to_s.empty? }
|
|
@@ -336,9 +254,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
336
254
|
emits AnnouncementNamed
|
|
337
255
|
end
|
|
338
256
|
|
|
339
|
-
#
|
|
340
|
-
# they describe; SyntaxBoot discovers every aggregate-local seed table.
|
|
341
|
-
# Contexts represented here: Command.
|
|
257
|
+
# Keyword rows for this chapter; SyntaxBoot discovers aggregate-local seed tables.
|
|
342
258
|
value_object "KeywordSeed" do
|
|
343
259
|
attribute :word, String
|
|
344
260
|
attribute :context, String, admits: "Syntax::Context"
|
|
@@ -357,37 +273,18 @@ Hecks.bluebook "Bluebook" do
|
|
|
357
273
|
member word: "reference_to", context: "Command", body: "none", inner: "", opens: "", fills: "references", calls: "reference_to_impl"
|
|
358
274
|
member word: "given", context: "Command", body: "source", inner: "", opens: "", fills: "givens", resolves_via: "hash_chain", calls: "given_impl"
|
|
359
275
|
member word: "sets", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", calls: "sets_impl"
|
|
360
|
-
#
|
|
361
|
-
#
|
|
362
|
-
# renamed-away spelling as a row of its own AND a was:" rule), kept
|
|
363
|
-
# here refusing live ONLY so `MetaValidator.shadow_parsing?` can still
|
|
364
|
-
# read frozen era text that used it (CommandBuilder#then_set_impl's
|
|
365
|
-
# own comment).
|
|
276
|
+
# Deprecated spelling of `sets`, still refused live so MetaValidator.shadow_parsing? can
|
|
277
|
+
# read frozen era text that used it.
|
|
366
278
|
member word: "then_set", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", status: "deprecated", calls: "then_set_impl"
|
|
367
|
-
#
|
|
368
|
-
# (CommandBuilder#delegates_to_impl's own comment gives the full
|
|
369
|
-
# reasoning) — a new word, not a migrated one.
|
|
279
|
+
# Synchronous handoff into one nested entity command (CommandBuilder#delegates_to_impl).
|
|
370
280
|
member word: "delegates_to", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", calls: "delegates_to_impl"
|
|
371
281
|
member word: "emits", context: "Command", body: "none", inner: "", opens: "", fills: "emits"
|
|
372
|
-
# A
|
|
373
|
-
# `sets` (`append: { knights: state(:knights) }`, `to: state(:ply)`)
|
|
374
|
-
# and names the record's own field as that mutation's source; it
|
|
375
|
-
# fills nothing of its own, the `sets` it sits in fills `mutations`.
|
|
282
|
+
# A value written inside a `sets` (`to: state(:ply)`); it fills nothing of its own.
|
|
376
283
|
member word: "state", context: "Command", body: "none", inner: "", opens: "", fills: "mutations"
|
|
377
284
|
member word: "attribute", context: "Command", body: "none", inner: "", opens: "", fills: "attributes", calls: "attribute_impl"
|
|
378
285
|
member word: "ensures", context: "Command", body: "source", inner: "", opens: "", fills: "ensures"
|
|
379
|
-
#
|
|
380
|
-
#
|
|
381
|
-
# sagas only compensate their OWN anticipated failures, eras only
|
|
382
|
-
# reinterpret stored shape, and the event log stays append-only —
|
|
383
|
-
# so nothing existing lets a command say "this is amending a fact
|
|
384
|
-
# we already announced, and here is why"). STORED AS A MUTATION,
|
|
385
|
-
# not a new Command field — the same reasoning `delegates_to`'s own
|
|
386
|
-
# comment gives in full: `mutations:` is ALREADY a fully round-
|
|
387
|
-
# tripped part of the self-hosted meta-domain's own contract, and a
|
|
388
|
-
# genuinely new top-level Command field is not. `corrects` rides the
|
|
389
|
-
# SAME multi-binding wire shape `append`/`delegate` already use
|
|
390
|
-
# (CommandBuilder#corrects_impl's own comment has the rest).
|
|
286
|
+
# Amends a specific past event. Stored as a mutation so it round-trips with the other
|
|
287
|
+
# mutation words (CommandBuilder#corrects_impl).
|
|
391
288
|
member word: "corrects", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", calls: "corrects_impl"
|
|
392
289
|
|
|
393
290
|
end
|
|
@@ -436,14 +333,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
436
333
|
member keyword: "then_set", context: "Command", at: "", named: "remove", kind: "literal", required: "false", fills: "source", selects: "op=remove"
|
|
437
334
|
member keyword: "delegates_to", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "target"
|
|
438
335
|
member keyword: "delegates_to", context: "Command", at: "", named: "with", kind: "literal", required: "false", fills: "source", selects: "op=delegate"
|
|
439
|
-
#
|
|
440
|
-
# `emits Account::AccountFrozen`, same `kind: "constant"` +
|
|
441
|
-
# `kind: "text"` pair `on`'s own row in `policy.bluebook` carries
|
|
442
|
-
# — both stay admitted, the old spelling not refused, for the
|
|
443
|
-
# same reason (event names aren't 100% corpus-migrated the way
|
|
444
|
-
# command references are). `CommandBuilder#emits` (hand-written,
|
|
445
|
-
# no `calls:` needed — the single-fill path already invokes it by
|
|
446
|
-
# its own word name) resolves either shape via `Naming.event_ref`.
|
|
336
|
+
# A bare constant (`emits Account::AccountFrozen`) or text; both go through Naming.event_ref.
|
|
447
337
|
member keyword: "emits", context: "Command", at: "1", named: "", kind: "constant", required: "true", fills: "emits"
|
|
448
338
|
member keyword: "emits", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "emits"
|
|
449
339
|
member keyword: "state", context: "Command", at: "1", named: "", kind: "symbol", required: "true", fills: "source"
|
|
@@ -454,14 +344,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
454
344
|
member keyword: "attribute", context: "Command", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
|
|
455
345
|
member keyword: "attribute", context: "Command", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
|
|
456
346
|
member keyword: "attribute", context: "Command", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
|
|
457
|
-
# `
|
|
458
|
-
# only positional and the only required-by-the-grammar argument;
|
|
459
|
-
# `reason` is required IN PRACTICE (CommandBuilder#corrects_impl
|
|
460
|
-
# refuses its absence by hand, the same way `sets` refuses two ops
|
|
461
|
-
# at once — a fact about runtime state, not a pure per-row fill, so
|
|
462
|
-
# it stays hand-enforced rather than declared `required: "true"`
|
|
463
|
-
# here, which would only gate the row's OWN presence, not a sibling
|
|
464
|
-
# kwarg's).
|
|
347
|
+
# `reason` is required in practice; CommandBuilder#corrects_impl refuses its absence.
|
|
465
348
|
member keyword: "corrects", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "target"
|
|
466
349
|
member keyword: "corrects", context: "Command", at: "", named: "as", kind: "symbol", required: "false", fills: "source"
|
|
467
350
|
member keyword: "corrects", context: "Command", at: "", named: "reason", kind: "text", required: "false", fills: "source"
|