hecks 2.8.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/exe/hecks +4 -6
- data/lib/hecks/adapters/driven/claude_code.rb +4 -104
- data/lib/hecks/adapters/driven/d1.rb +44 -237
- data/lib/hecks/adapters/driven/folder.rb +17 -76
- data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
- data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
- data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
- data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
- data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
- data/lib/hecks/adapters/driven/heki.rb +13 -42
- data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
- data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
- data/lib/hecks/adapters/driven/lambda.rb +10 -84
- data/lib/hecks/adapters/driven/local_storage.rb +5 -40
- data/lib/hecks/adapters/driven/memory.rb +17 -98
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
- data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
- data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
- data/lib/hecks/adapters/driven/postgres/reconnect.rb +4 -30
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
- data/lib/hecks/adapters/driven/postgres.rb +145 -134
- data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
- data/lib/hecks/adapters/driven/prism.rb +7 -30
- data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
- data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
- data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
- data/lib/hecks/adapters/driven/sqlite.rb +128 -65
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +5 -48
- data/lib/hecks/adapters/driven.rb +5 -36
- data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
- data/lib/hecks/behaviors/dsl.rb +7 -25
- data/lib/hecks/behaviors/expectations.rb +31 -141
- data/lib/hecks/behaviors/ir.rb +7 -20
- data/lib/hecks/behaviors/rspec.rb +6 -17
- data/lib/hecks/behaviors/runner.rb +10 -34
- data/lib/hecks/behaviors.rb +4 -8
- data/lib/hecks/bluebook/aggregate.rb +9 -75
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
- data/lib/hecks/bluebook/assembly/build.rb +4 -15
- data/lib/hecks/bluebook/assembly/contract.rb +15 -136
- data/lib/hecks/bluebook/assembly/contracts.rb +54 -174
- data/lib/hecks/bluebook/assembly/marks.rb +31 -223
- data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
- data/lib/hecks/bluebook/assembly.rb +6 -45
- data/lib/hecks/bluebook/attribute.rb +12 -61
- data/lib/hecks/bluebook/behaviour/aggregate.rb +10 -39
- data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
- data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
- data/lib/hecks/bluebook/behaviour/command.rb +14 -66
- data/lib/hecks/bluebook/behaviour/domain_port.rb +4 -20
- data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
- data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
- data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
- data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
- data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
- data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
- data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
- data/lib/hecks/bluebook/capabilities.rb +17 -49
- data/lib/hecks/bluebook/chapter.rb +10 -48
- data/lib/hecks/bluebook/command.rb +23 -81
- data/lib/hecks/bluebook/domain_port.rb +14 -63
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +86 -708
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +56 -170
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +1 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
- data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +12 -87
- data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +26 -194
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
- data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
- data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
- data/lib/hecks/bluebook/dsl/query_builder.rb +11 -42
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
- data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
- data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
- data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
- data/lib/hecks/bluebook/dsl/world_builder.rb +19 -111
- data/lib/hecks/bluebook/entity.rb +13 -71
- data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
- data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
- data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
- data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
- data/lib/hecks/bluebook/expression/resolver.rb +37 -660
- data/lib/hecks/bluebook/hexagon.rb +5 -28
- data/lib/hecks/bluebook/lifecycle.rb +5 -16
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
- data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
- data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
- data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +24 -176
- data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +43 -305
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
- data/lib/hecks/bluebook/meta_validator.rb +79 -349
- data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
- data/lib/hecks/bluebook/model_check.rb +100 -597
- data/lib/hecks/bluebook/pattern_subset.rb +11 -69
- data/lib/hecks/bluebook/process_manager.rb +13 -83
- data/lib/hecks/bluebook/project_loader.rb +3 -39
- data/lib/hecks/bluebook/project_register.rb +12 -60
- data/lib/hecks/bluebook/query.rb +9 -48
- data/lib/hecks/bluebook/read_model.rb +57 -81
- data/lib/hecks/bluebook/reference.rb +7 -41
- data/lib/hecks/bluebook/smoke_test.rb +8 -98
- data/lib/hecks/bluebook/synthesizer.rb +13 -62
- data/lib/hecks/bluebook/translation.rb +26 -62
- data/lib/hecks/bluebook/value_object.rb +11 -36
- data/lib/hecks/bluebook.rb +5 -22
- data/lib/hecks/cache_dir.rb +4 -23
- data/lib/hecks/cli/document.rb +3 -21
- data/lib/hecks/cli/ir.rb +3 -5
- data/lib/hecks/cli/mcp.rb +2 -3
- data/lib/hecks/cli/mcp_door.rb +19 -114
- data/lib/hecks/cli/model_check.rb +18 -85
- data/lib/hecks/cli/project_cli.rb +7 -40
- data/lib/hecks/cli/project_diagrams.rb +0 -7
- data/lib/hecks/cli/run.rb +12 -58
- data/lib/hecks/cli/smoke_test.rb +2 -16
- data/lib/hecks/cli/stores.rb +1 -2
- data/lib/hecks/cli.rb +18 -24
- data/lib/hecks/construct.rb +8 -34
- data/lib/hecks/deploy/bluebook/deploy.bluebook +33 -142
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +2 -9
- data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
- data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
- data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
- data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
- data/lib/hecks/embryonaut_bluebook.rb +4 -71
- data/lib/hecks/facade/cli_door.rb +24 -106
- data/lib/hecks/facade/cli_runner.rb +28 -172
- data/lib/hecks/facade/command_request.rb +13 -33
- data/lib/hecks/facade/handle.rb +34 -121
- data/lib/hecks/facade/json_door.rb +31 -146
- data/lib/hecks/facade/surface/aggregate_door.rb +39 -104
- data/lib/hecks/facade/surface/chapter.rb +10 -54
- data/lib/hecks/facade/surface.rb +8 -23
- data/lib/hecks/facade.rb +10 -25
- data/lib/hecks/forms/app.rb +15 -70
- data/lib/hecks/forms/command_form_renderer.rb +10 -29
- data/lib/hecks/forms/field_renderer.rb +17 -156
- data/lib/hecks/forms/field_shape.rb +30 -222
- data/lib/hecks/forms/html.rb +12 -47
- data/lib/hecks/forms/index_renderer.rb +1 -4
- data/lib/hecks/forms/page.rb +3 -9
- data/lib/hecks/forms/params.rb +14 -60
- data/lib/hecks/forms/port_argument.rb +2 -19
- data/lib/hecks/forms/query_form_renderer.rb +4 -79
- data/lib/hecks/forms/record_renderer.rb +8 -75
- data/lib/hecks/forms/record_table.rb +7 -50
- data/lib/hecks/forms/reference_options.rb +3 -30
- data/lib/hecks/forms/value_object_shape.rb +8 -35
- data/lib/hecks/forms.rb +5 -33
- data/lib/hecks/fqn.rb +5 -12
- data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
- data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
- data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
- data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
- data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
- data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
- data/lib/hecks/framework.rb +11 -80
- data/lib/hecks/freezer.rb +5 -39
- data/lib/hecks/grammar/expression.bluebook +15 -40
- data/lib/hecks/grammar/translation.bluebook +3 -6
- data/lib/hecks/grammar.rb +16 -41
- data/lib/hecks/ir.rb +14 -83
- data/lib/hecks/language/adapter.bluebook +2 -7
- data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
- data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
- data/lib/hecks/language/bluebook/bluebook.bluebook +15 -83
- data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
- data/lib/hecks/language/bluebook/command.bluebook +27 -144
- data/lib/hecks/language/bluebook/entity.bluebook +24 -97
- data/lib/hecks/language/bluebook/policy.bluebook +16 -67
- data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
- data/lib/hecks/language/bluebook/projection.bluebook +126 -60
- data/lib/hecks/language/bluebook/query.bluebook +12 -43
- data/lib/hecks/language/bluebook/shape.bluebook +23 -73
- data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
- data/lib/hecks/language/bluebook/vocabulary.bluebook +82 -197
- data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
- data/lib/hecks/language/hecksagon/domain_port.bluebook +4 -19
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +6 -25
- data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
- data/lib/hecks/language/oidc.json +35 -0
- data/lib/hecks/language/port.bluebook +4 -17
- data/lib/hecks/language/translation/translation.bluebook +3 -9
- data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
- data/lib/hecks/language/world/wiring.bluebook +1 -3
- data/lib/hecks/language/world/world.bluebook +5 -7
- data/lib/hecks/literal.rb +8 -50
- data/lib/hecks/mcp_door_scope.rb +9 -90
- data/lib/hecks/mcp_stdio_guard.rb +4 -41
- data/lib/hecks/naming.rb +29 -137
- data/lib/hecks/ports/access_control.rb +7 -23
- data/lib/hecks/ports/agent/answers.rb +5 -23
- data/lib/hecks/ports/agent.rb +47 -172
- data/lib/hecks/ports/authentication.rb +12 -39
- data/lib/hecks/ports/authorization.rb +16 -43
- data/lib/hecks/ports/clock.rb +5 -45
- data/lib/hecks/ports/extraction.rb +7 -12
- data/lib/hecks/ports/identity_assignment.rb +8 -29
- data/lib/hecks/ports/identity_generation.rb +6 -29
- data/lib/hecks/ports/identity_resolution.rb +2 -10
- data/lib/hecks/ports/key_vault.rb +9 -45
- data/lib/hecks/ports/persistence/append_only.rb +61 -64
- data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
- data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
- data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
- data/lib/hecks/ports/persistence/plugin.rb +13 -42
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +38 -141
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +16 -84
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +3 -22
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +18 -75
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +14 -115
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +127 -554
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +9 -25
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
- data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
- data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
- data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
- data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
- data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
- data/lib/hecks/ports/persistence/state_codec.rb +23 -103
- data/lib/hecks/ports/persistence.rb +7 -14
- data/lib/hecks/ports/projection.rb +42 -84
- data/lib/hecks/ports/query/in_memory.rb +10 -58
- data/lib/hecks/ports/query/ordering.rb +11 -32
- data/lib/hecks/ports/query.rb +14 -37
- data/lib/hecks/ports.rb +2 -8
- data/lib/hecks/projections/bootstrap_table.rb +11 -43
- data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
- data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
- data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
- data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
- data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
- data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
- data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
- data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
- data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
- data/lib/hecks/projections/deploy/fargate.rb +35 -202
- data/lib/hecks/projections/deploy/lambda.rb +150 -678
- data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
- data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
- data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
- data/lib/hecks/projections/deploy/preview/script.rb +2 -14
- data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
- data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
- data/lib/hecks/projections/deploy/preview/template.rb +2 -58
- data/lib/hecks/projections/deploy/preview.rb +2 -67
- data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
- data/lib/hecks/projections/deploy/scripts.rb +4 -57
- data/lib/hecks/projections/deploy/shared.rb +47 -146
- data/lib/hecks/projections/deploy/smoke.rb +4 -61
- data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
- data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
- data/lib/hecks/projections/deploy/template_diff.rb +5 -57
- data/lib/hecks/projections/diagrams.rb +20 -582
- data/lib/hecks/projections/glossary/html.rb +14 -130
- data/lib/hecks/projections/glossary/markdown.rb +8 -69
- data/lib/hecks/projections/glossary/mermaid.rb +9 -66
- data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
- data/lib/hecks/projections/glossary/sentences.rb +14 -159
- data/lib/hecks/projections/glossary.rb +30 -222
- data/lib/hecks/projections/ir.rb +3 -10
- data/lib/hecks/projections/model/deviations.rb +15 -42
- data/lib/hecks/projections/model.rb +12 -51
- data/lib/hecks/projections/oidc.rb +12 -56
- data/lib/hecks/projections/parser_table.rb +9 -28
- data/lib/hecks/projections/reference.rb +2 -15
- data/lib/hecks/projections/rust_vocabulary.rb +12 -250
- data/lib/hecks/projections/shape.rb +3 -29
- data/lib/hecks/projections/statements.rb +7 -86
- data/lib/hecks/projections/vocabulary.rb +6 -22
- data/lib/hecks/projections.rb +2 -16
- data/lib/hecks/projector/cli_projector.rb +60 -375
- data/lib/hecks/projector/docs_projector.rb +10 -201
- data/lib/hecks/projector/exporter.rb +42 -134
- data/lib/hecks/projector/ir_projector.rb +2 -9
- data/lib/hecks/projector/narrate_projector.rb +15 -189
- data/lib/hecks/projector/target.rb +13 -76
- data/lib/hecks/projector.rb +30 -121
- data/lib/hecks/query_specification/common/comparators.rb +5 -26
- data/lib/hecks/query_specification/common/comparison.rb +35 -143
- data/lib/hecks/query_specification/common/dsl.rb +8 -24
- data/lib/hecks/query_specification/common/null_policy.rb +20 -70
- data/lib/hecks/query_specification/common/options.rb +2 -6
- data/lib/hecks/query_specification/common/where_clause.rb +2 -10
- data/lib/hecks/query_specification/field_path.rb +37 -77
- data/lib/hecks/query_specification/hop_path.rb +12 -76
- data/lib/hecks/release/gem_pin.rb +2 -26
- data/lib/hecks/release/runner/ci_publisher.rb +3 -6
- data/lib/hecks/release/runner/commands.rb +2 -4
- data/lib/hecks/release/runner/gem_publisher.rb +2 -3
- data/lib/hecks/release/runner/npm_publisher.rb +6 -20
- data/lib/hecks/release/runner/preflight.rb +4 -19
- data/lib/hecks/release/runner/tagger.rb +2 -9
- data/lib/hecks/release/runner.rb +3 -32
- data/lib/hecks/rendering.rb +4 -26
- data/lib/hecks/router/namespace_installer.rb +12 -36
- data/lib/hecks/router.rb +4 -8
- data/lib/hecks/runtime/aggregate_lock.rb +8 -33
- data/lib/hecks/runtime/boot_gates.rb +3 -18
- data/lib/hecks/runtime/caller.rb +19 -59
- data/lib/hecks/runtime/capability_graph.rb +5 -21
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +23 -160
- data/lib/hecks/runtime/command_interpreter.rb +124 -306
- data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
- data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
- data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
- data/lib/hecks/runtime/command_rules/emission.rb +8 -21
- data/lib/hecks/runtime/command_rules/references.rb +23 -202
- data/lib/hecks/runtime/dependency_planning.rb +30 -102
- data/lib/hecks/runtime/dispatcher.rb +82 -241
- data/lib/hecks/runtime/entity_element.rb +40 -462
- data/lib/hecks/runtime/entity_interpreter.rb +64 -219
- data/lib/hecks/runtime/errors.rb +32 -115
- data/lib/hecks/runtime/event.rb +3 -25
- data/lib/hecks/runtime/identity.rb +18 -154
- data/lib/hecks/runtime/instance.rb +18 -150
- data/lib/hecks/runtime/interpreting.rb +11 -70
- data/lib/hecks/runtime/invocation.rb +28 -164
- data/lib/hecks/runtime/loader.rb +48 -186
- data/lib/hecks/runtime/outbox.rb +38 -261
- data/lib/hecks/runtime/policy_interpreter.rb +38 -200
- data/lib/hecks/runtime/port_operation_interpreter.rb +26 -87
- data/lib/hecks/runtime/query_interpreter.rb +45 -187
- data/lib/hecks/runtime/reaction_invocation.rb +36 -138
- data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
- data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
- data/lib/hecks/runtime/reference_hop.rb +8 -81
- data/lib/hecks/runtime/refusal_wording.rb +8 -89
- data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
- data/lib/hecks/runtime/registry/verification.rb +52 -225
- data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
- data/lib/hecks/runtime/registry.rb +99 -244
- data/lib/hecks/runtime/remote_dispatcher.rb +37 -152
- data/lib/hecks/runtime/routing.rb +4 -15
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
- data/lib/hecks/runtime/saga_interpreter.rb +79 -263
- data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
- data/lib/hecks/runtime/tenant_check.rb +6 -68
- data/lib/hecks/runtime/tenant_scope.rb +3 -28
- data/lib/hecks/runtime/value/admission.rb +16 -67
- data/lib/hecks/runtime/value/coercion.rb +155 -641
- data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
- data/lib/hecks/runtime/value.rb +12 -84
- data/lib/hecks/runtime.rb +17 -65
- data/lib/hecks/storehouse.rb +141 -568
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +8 -32
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
- data/lib/hecks/vendoring/git_environment.rb +2 -8
- data/lib/hecks/vendoring/git_source.rb +4 -10
- data/lib/hecks/vendoring.rb +7 -46
- data/lib/hecks/version.rb +3 -14
- data/lib/hecks.rb +26 -81
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
- metadata +3 -2
|
@@ -1,67 +1,18 @@
|
|
|
1
1
|
Hecks.bluebook "Bluebook" do
|
|
2
2
|
aggregate "Syntax" do
|
|
3
|
-
#
|
|
3
|
+
# How a bluebook is spelled: every word, the body it opens and the field it fills.
|
|
4
|
+
# Declarations only, so there are no commands; spec/syntax_conformance_spec reads it.
|
|
4
5
|
#
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
# type and a cardinality. Nothing anywhere said that the field is SPELLED
|
|
8
|
-
# `identified_by`, that a block opens with `do`, or that a symbol argument
|
|
9
|
-
# starts with `:`. Grep this directory for keyword, token or syntax before
|
|
10
|
-
# this file existed and the only hit was a comment.
|
|
11
|
-
#
|
|
12
|
-
# That gap is why the parser could not be projected, and it is also where the
|
|
13
|
-
# bugs were. When `identified_by` became `list_of(IdentityPath)` the projected
|
|
14
|
-
# struct regenerated to a list of strings with nobody touching it, and was
|
|
15
|
-
# correct. The HAND-WRITTEN halves broke : a hand-written parser could not read
|
|
16
|
-
# `identified_by do` at all and swallowed whole aggregate bodies in silence,
|
|
17
|
-
# and a dispatcher that read the field as a scalar got nothing on an array
|
|
18
|
-
# and fell through to a minted `"id"`. The declared half survived. The
|
|
19
|
-
# undeclared halves did not.
|
|
20
|
-
#
|
|
21
|
-
# DECLARATIONS, NOT RUNTIME STATE — the same reading as Vocabulary beside it,
|
|
22
|
-
# and no commands for the same reason. A domain does not declare its own
|
|
23
|
-
# syntax ; the syntax is fixed when the language is defined. Nothing
|
|
24
|
-
# dispatches this, `Plan` skips it by construction (a category with nothing
|
|
25
|
-
# to offer contributes nothing), and `spec/syntax_conformance_spec` READS it
|
|
26
|
-
# from the IR and holds each builder to it in both directions.
|
|
27
|
-
#
|
|
28
|
-
# WHY THE KEYWORD BELONGS TO THE CATEGORY AND NOT TO A RECORD. The word
|
|
29
|
-
# `aggregate` is a fact about the Aggregate CATEGORY, not about
|
|
30
|
-
# `Pizzas::Pizza` — and the meta-domain's records are instances. So there is
|
|
31
|
-
# nothing for a dispatched syntax to hang off, and this is a closed set.
|
|
32
|
-
#
|
|
33
|
-
# WHAT IS NOT HERE. Only the `.bluebook` surface. `.port`, `.adapter`,
|
|
34
|
-
# `.hecksagon`, `.world` and `translations/*.bluebook` are SIBLING artifacts
|
|
35
|
-
# with their own builders and their own files ; a parser projected from this
|
|
36
|
-
# reads bluebooks, and half-covering the siblings would say less than naming
|
|
37
|
-
# the exclusion does.
|
|
38
|
-
#
|
|
39
|
-
# THIS IS ALSO WHY THE GENERIC-BLUEBOOK-READER ARC STOPS HERE.
|
|
40
|
-
# A generic reader driven by THIS table
|
|
41
|
-
# covers every keyword whose argument-binding this table can
|
|
42
|
-
# express (M1-M7), down to `member`'s and `sets`' pairs, which turned out
|
|
43
|
-
# to need a schema correction rather than new machinery. What stays
|
|
44
|
-
# outside the table either isn't ONE shape a bigger table
|
|
45
|
-
# would close (`attribute`, three separate irregularities) or isn't
|
|
46
|
-
# covered by this table AT ALL : `.hecksagon`/`.world`'s open adapter-verb
|
|
47
|
-
# vocabulary is the one truly PERMANENT exclusion, for the same reason
|
|
48
|
-
# named above — a verb's schema is not even contained in the file being
|
|
49
|
-
# parsed, registered instead by host application code
|
|
50
|
-
# (`Hecks.port("post") { verb "posted_by" }`), so no table this file
|
|
51
|
-
# could hold would ever be enough.
|
|
6
|
+
# Covers the `.bluebook` surface only; `.hecksagon` and `.world` adapter verbs are
|
|
7
|
+
# registered by host code, so no table here could hold them.
|
|
52
8
|
description "How a bluebook is SPELLED — every word the surface admits, the body it may open, and the field it fills. The layer every other file in this directory does not have."
|
|
53
9
|
|
|
54
10
|
belongs_to Bluebook
|
|
55
11
|
|
|
56
|
-
#
|
|
57
|
-
# as a vocabulary does.
|
|
12
|
+
# Identified by name alone; a syntax hangs under no other thing.
|
|
58
13
|
identified_by SyntaxName, as: :name
|
|
59
14
|
|
|
60
|
-
#
|
|
61
|
-
# "Keyword"`/`entity "Argument"`, below), entities rather than
|
|
62
|
-
# closed-set value-object members. `list_of(...)` forward-references
|
|
63
|
-
# them the same way banking's own `attribute :ledger,
|
|
64
|
-
# list_of(LedgerEntry)` names LedgerEntry before it is declared.
|
|
15
|
+
# Keyword and Argument are nested entities, forward-referenced by `list_of`.
|
|
65
16
|
attribute :keywords, list_of(Keyword)
|
|
66
17
|
attribute :arguments, list_of(Argument)
|
|
67
18
|
|
|
@@ -70,19 +21,9 @@ Hecks.bluebook "Bluebook" do
|
|
|
70
21
|
invariant("a syntax is named") { !value.to_s.empty? }
|
|
71
22
|
end
|
|
72
23
|
|
|
73
|
-
#
|
|
74
|
-
#
|
|
75
|
-
#
|
|
76
|
-
# category, which is why this is its own set rather than a list of the
|
|
77
|
-
# thirteen.
|
|
78
|
-
#
|
|
79
|
-
# `Lifecycle` is a DECLARED FOLD — contracts.rb folds state_field,
|
|
80
|
-
# state_start and transitions onto whichever of Aggregate or Entity opened
|
|
81
|
-
# it — so a word typed there fills a field of the ENCLOSING category, not of
|
|
82
|
-
# a Lifecycle that does not exist.
|
|
83
|
-
#
|
|
84
|
-
# `Type` is the second argument of `attribute`, which is a place words are
|
|
85
|
-
# spelled (`list_of`, `one_of`) and so is a context like any other.
|
|
24
|
+
# Where a word may be typed. Not always a category: `OneOf`, `Lifecycle` and `Type`
|
|
25
|
+
# are bodies without one, and `File` is the outside of every body.
|
|
26
|
+
# A word in `Lifecycle` fills a field of the enclosing Aggregate or Entity.
|
|
86
27
|
value_object "Context" do
|
|
87
28
|
attribute :name, String,
|
|
88
29
|
one_of: ["File", "Bluebook", "Aggregate", "Entity", "Command", "Query", "ValueObject", "OneOf",
|
|
@@ -91,142 +32,58 @@ Hecks.bluebook "Bluebook" do
|
|
|
91
32
|
"TranslationAggregate"]
|
|
92
33
|
end
|
|
93
34
|
|
|
94
|
-
#
|
|
95
|
-
#
|
|
96
|
-
#
|
|
97
|
-
#
|
|
98
|
-
#
|
|
99
|
-
# `given("…") { balance >= amount }`, `identified_by :name`.
|
|
100
|
-
# Recovered through Ports::Extraction, which is why `number.value`
|
|
101
|
-
# needs no method called `number` to exist.
|
|
102
|
-
# rows a body of `member` rows and nothing else — `one_of do … end`
|
|
103
|
-
# none no block at all
|
|
104
|
-
#
|
|
105
|
-
# A `source` body IS the thing the word declares : `given`'s body is the
|
|
106
|
-
# rule's canonical text, `identified_by`'s body is the identity paths. A
|
|
107
|
-
# `keywords` or `rows` body fills the record the word opens.
|
|
35
|
+
# What a word's block is:
|
|
36
|
+
# keywords nested words, `aggregate "X" do … end`
|
|
37
|
+
# source never called; its text is the declaration, `given("…") { … }`
|
|
38
|
+
# rows `member` rows only, `one_of do … end`
|
|
39
|
+
# none no block
|
|
108
40
|
value_object "Body" do
|
|
109
41
|
attribute :name, String, one_of: ["none", "keywords", "source", "rows"]
|
|
110
42
|
end
|
|
111
43
|
|
|
112
|
-
#
|
|
113
|
-
#
|
|
114
|
-
# `deprecated` — a word still read but on its way out, which an operator
|
|
115
|
-
# never needed because nothing outside this repo writes expressions yet.
|
|
116
|
-
# A row DEFAULTS to admitted, so the table below stays a table of words
|
|
117
|
-
# rather than a table of words-with-ceremony; only a word entering or
|
|
118
|
-
# leaving the language spells its status. The projections read this:
|
|
119
|
-
# a proposed or retired word reaches no generated parser table, so to
|
|
120
|
-
# every projected reader it simply does not exist — the operator rule,
|
|
121
|
-
# at the syntax layer.
|
|
44
|
+
# Where a word stands in its life. A row defaults to admitted; a proposed or retired
|
|
45
|
+
# word reaches no generated parser table.
|
|
122
46
|
value_object "Status" do
|
|
123
47
|
attribute :name, String, one_of: ["proposed", "admitted", "deprecated", "retired"]
|
|
124
48
|
end
|
|
125
49
|
|
|
126
|
-
#
|
|
127
|
-
#
|
|
128
|
-
#
|
|
129
|
-
# one: `hash_chain` (an ordered chain of flat pools, first match
|
|
130
|
-
# wins — `given` on Command), `owner_keyed` (one pool keyed by
|
|
131
|
-
# declaring owner, needing `disambiguator` below to pick among more
|
|
132
|
-
# than one candidate — `given` on Aggregate), `sibling_scan` (a
|
|
133
|
-
# live scan over already-built sibling objects, no separate pool at
|
|
134
|
-
# all — `invariant` on ValueObject). BLANK for every OTHER word —
|
|
135
|
-
# most of the language declares once and is never referenced back,
|
|
136
|
-
# so `Keyword#resolves_via` stays optional rather than forcing every
|
|
137
|
-
# existing row to spell "none."
|
|
50
|
+
# Which shared resolution primitive (Hecks::Bluebook::DSL::RuleReference) a word's bare
|
|
51
|
+
# form resolves through: an ordered chain of pools, one pool keyed by owner, or a scan
|
|
52
|
+
# of sibling objects. Blank for words that are never referenced back.
|
|
138
53
|
value_object "ResolutionScope" do
|
|
139
54
|
attribute :name, String, one_of: ["hash_chain", "owner_keyed", "sibling_scan"]
|
|
140
55
|
end
|
|
141
56
|
|
|
142
|
-
#
|
|
143
|
-
#
|
|
144
|
-
# registered — `declared_by:` is the only one that exists today
|
|
145
|
-
# (`AggregateBuilder#given`'s own chapter-wide sharing,
|
|
146
|
-
# docs/implemented/resolution-rules/chapter-given.md). A closed set of one,
|
|
147
|
-
# deliberately, not a boolean flag — the SAME reason `Body`/`Status`
|
|
148
|
-
# above are closed sets rather than booleans even where today's
|
|
149
|
-
# count is small: a second disambiguator kind, if this family ever
|
|
150
|
-
# grows one, is a new MEMBER of this set, not a second attribute.
|
|
57
|
+
# The keyword a bare reference may supply to pick among `owner_keyed` candidates.
|
|
58
|
+
# A closed set rather than a flag, so a second kind is a new member.
|
|
151
59
|
value_object "Disambiguator" do
|
|
152
60
|
attribute :name, String, one_of: ["declared_by"]
|
|
153
61
|
end
|
|
154
62
|
|
|
155
|
-
#
|
|
156
|
-
#
|
|
157
|
-
# field they fill means.
|
|
158
|
-
#
|
|
159
|
-
# `literal` is the widest : a default is written so its TYPE survives — `0`
|
|
160
|
-
# rather than `"0"`, `0.0` rather than `"0.0"` — which is what LiteralText is
|
|
161
|
-
# about, and why it is not `text`.
|
|
63
|
+
# What an argument looks like when typed; lexical, not semantic.
|
|
64
|
+
# `literal` keeps its type (`0` rather than `"0"`), which is why it is not `text`.
|
|
162
65
|
value_object "ArgumentKind" do
|
|
163
66
|
attribute :name, String,
|
|
164
67
|
one_of: ["text", "symbol", "number", "flag", "literal", "constant", "pairs", "list"]
|
|
165
68
|
end
|
|
166
69
|
|
|
167
|
-
#
|
|
168
|
-
#
|
|
169
|
-
#
|
|
170
|
-
#
|
|
171
|
-
#
|
|
172
|
-
# fields ONE pair, contributing two NAMED SUB-FIELDS to the single
|
|
173
|
-
# compound this keyword invocation is already building — the
|
|
174
|
-
# same role a positional argument plays, just sourced from a
|
|
175
|
-
# pair instead of a bare token. `on`'s `transition:` sets
|
|
176
|
-
# `from_state`/`to_state` on the ProcessManagerHandler its
|
|
177
|
-
# OWN `event_type` argument is also filling ; Lifecycle's
|
|
178
|
-
# `transition` sets `command`/`to_state` on the Transition
|
|
179
|
-
# its own `from:` argument also fills.
|
|
180
|
-
# elements EACH pair independently becomes a NEW compound, appended to
|
|
181
|
-
# the keyword's own list field (`where`'s own `fills:
|
|
182
|
-
# "wheres"`, declared at the Keyword level, same as
|
|
183
|
-
# `attribute`'s). `where(balance: {gte: 100}, status: "open")`
|
|
184
|
-
# is two WhereClauses from one line, not one.
|
|
185
|
-
# verbatim each pair is captured as-is, key and value both left as
|
|
186
|
-
# text — `dispatch`'s `with:` : resolution (`:name` reference
|
|
187
|
-
# vs literal) happens at DISPATCH time, not parse time, so
|
|
188
|
-
# there is nothing to interpret here at all.
|
|
189
|
-
# sibling the pair's KEY names a field of an ALREADY-DECLARED sibling
|
|
190
|
-
# construct — `member`'s keys are the enclosing value
|
|
191
|
-
# object's own attributes ; `sets`' `append:` keys are the
|
|
192
|
-
# target entity/value-object's own attributes. Not a static
|
|
193
|
-
# fact this table can enumerate (the valid keys differ per
|
|
194
|
-
# domain) — named here so a reader knows to resolve
|
|
195
|
-
# dynamically rather than assume an omission.
|
|
70
|
+
# What a `pairs` argument's pairs do:
|
|
71
|
+
# fields one pair supplying two named sub-fields of the compound being built
|
|
72
|
+
# elements each pair becomes a new compound appended to the keyword's list field
|
|
73
|
+
# verbatim each pair kept as text; resolved at dispatch time, not parse time
|
|
74
|
+
# sibling the key names a field of an already-declared sibling; resolved dynamically
|
|
196
75
|
value_object "PairsShape" do
|
|
197
76
|
attribute :name, String, one_of: ["fields", "elements", "verbatim", "sibling"]
|
|
198
77
|
end
|
|
199
78
|
|
|
200
|
-
#
|
|
201
|
-
#
|
|
202
|
-
# those rows describe. SyntaxBoot discovers and combines those local tables
|
|
203
|
-
# automatically; this aggregate owns only the live Keyword/Argument records
|
|
204
|
-
# and the genuinely shared lexical vocabulary below.
|
|
205
|
-
|
|
79
|
+
# Spelling rows live in each aggregate's own KeywordSeed and ArgumentSeed; SyntaxBoot
|
|
80
|
+
# combines them. This aggregate owns the live records and the shared vocabulary.
|
|
206
81
|
|
|
207
|
-
#
|
|
208
|
-
#
|
|
209
|
-
# model checker can finally see it" (the ADR's own words). A value
|
|
210
|
-
# object has no identity, so it cannot transition — it can only be
|
|
211
|
-
# replaced wholesale (this file's own prior header, before this
|
|
212
|
-
# slice) — so Keyword and Argument become genuine ENTITIES of
|
|
213
|
-
# Syntax, each carrying a real `lifecycle :status`.
|
|
214
|
-
#
|
|
215
|
-
# THE REAL RECORD, not the source. The aggregate-local `KeywordSeed` rows
|
|
216
|
-
# are what get WRITTEN — hand-typed grammar data, still the
|
|
217
|
-
# natural way to spell ~106 static facts. `Keyword` is what gets
|
|
218
|
-
# READ : `SyntaxBoot` (meta_validator/syntax_boot.rb) dispatches one
|
|
219
|
-
# `Syntax.Keyword` per seed row, once, at boot, into a REAL "Bluebook"
|
|
220
|
-
# domain runtime — the same distinction `Reconstruction`/`Judge`
|
|
221
|
-
# already draw everywhere else between what a chapter DECLARES and
|
|
222
|
-
# what gets DISPATCHED from it, just run once more, for the
|
|
223
|
-
# language's own grammar table this time.
|
|
82
|
+
# Keyword and Argument are entities so each can carry a real `lifecycle :status`.
|
|
83
|
+
# SyntaxBoot dispatches one `Syntax.Keyword` per seed row at boot.
|
|
224
84
|
#
|
|
225
|
-
#
|
|
226
|
-
#
|
|
227
|
-
# its own (the same word is legitimately admitted in more than one
|
|
228
|
-
# context), and declaration order is a fact about the SOURCE the
|
|
229
|
-
# language already holds deliberately elsewhere.
|
|
85
|
+
# Identified by position: the same word is legitimately admitted in more than one
|
|
86
|
+
# context, so no other field is unique.
|
|
230
87
|
value_object "KeywordPosition" do
|
|
231
88
|
attribute :value, Integer
|
|
232
89
|
end
|
|
@@ -243,47 +100,18 @@ Hecks.bluebook "Bluebook" do
|
|
|
243
100
|
attribute :opens, KeywordSeedText
|
|
244
101
|
attribute :fills, KeywordSeedText
|
|
245
102
|
attribute :was, KeywordSeedText, optional: true
|
|
246
|
-
#
|
|
247
|
-
# RuleReference) this word's own bare form resolves through, once
|
|
248
|
-
# it has one — see `ResolutionScope`'s own comment, above, for the
|
|
249
|
-
# three real values and which existing word declares each.
|
|
250
|
-
# BLANK for every other word.
|
|
103
|
+
# The shared primitive this word's bare form resolves through; see `ResolutionScope`.
|
|
251
104
|
attribute :resolves_via, KeywordSeedText, admits: "Syntax::ResolutionScope", optional: true
|
|
252
|
-
#
|
|
253
|
-
# when `resolves_via` is `owner_keyed` — see `Disambiguator`'s own
|
|
254
|
-
# comment. BLANK unless `resolves_via` is `owner_keyed` AND more
|
|
255
|
-
# than one candidate can register (today: `given` on Aggregate,
|
|
256
|
-
# and `given` on Entity, one level down — chapter-wide sharing at
|
|
257
|
-
# each scope it has grown to).
|
|
105
|
+
# Blank unless `resolves_via` is `owner_keyed` and several candidates can register.
|
|
258
106
|
attribute :disambiguator, KeywordSeedText, admits: "Syntax::Disambiguator", optional: true
|
|
259
|
-
#
|
|
260
|
-
#
|
|
261
|
-
#
|
|
262
|
-
# `opens:`. NON-EMPTY names a real Ruby method this word's whole
|
|
263
|
-
# call (args, kwargs, block, untouched) forwards to instead — for
|
|
264
|
-
# words whose own logic is genuinely too complex to re-derive from
|
|
265
|
-
# argument shape alone (`attribute`'s own type-quoting/closed-set-
|
|
266
|
-
# synthesis/pattern validation). The method itself stays exactly
|
|
267
|
-
# what it always was, hand-written, unchanged — this column only
|
|
268
|
-
# says WHICH one answers the word, the same way `resolves_via`
|
|
269
|
-
# already names which shared primitive a bare reference resolves
|
|
270
|
-
# through, one level up. Read DURING bootstrap too (`WordGate`'s
|
|
271
|
-
# own `BOOTSTRAP_CALLS_FALLBACK`, a small explicit table naming
|
|
272
|
-
# the SAME (context, word) -> method pairs this column would say,
|
|
273
|
-
# since the real table doesn't exist yet at that point) — the one
|
|
274
|
-
# place in this whole arc a bootstrap fallback was worth building,
|
|
275
|
-
# because it duplicates NO logic, only a method NAME.
|
|
107
|
+
# Escape hatch: blank means `GenericDispatch` fills/opens the word directly. Non-empty
|
|
108
|
+
# names the Ruby method the whole call forwards to, for words too complex to derive
|
|
109
|
+
# from argument shape. Read during bootstrap via `WordGate`'s BOOTSTRAP_CALLS_FALLBACK.
|
|
276
110
|
attribute :calls, KeywordSeedText, optional: true
|
|
277
111
|
|
|
278
112
|
lifecycle :status, default: "admitted" do
|
|
279
|
-
#
|
|
280
|
-
#
|
|
281
|
-
# "admitted" to match every existing row's own implicit status —
|
|
282
|
-
# changing it would make every one of the ~106 rows silently
|
|
283
|
-
# start "proposed" instead. Declaring `proposed` as a state
|
|
284
|
-
# reachable from nowhere would be exactly the kind of decorative,
|
|
285
|
-
# unused declaration this whole ADR series exists to catch — so
|
|
286
|
-
# it is left out, honestly, rather than declared and unreachable.
|
|
113
|
+
# No `proposed` state: no row is declared proposed, and the default must stay
|
|
114
|
+
# "admitted" to match every existing row.
|
|
287
115
|
transition "Deprecate" => "deprecated", from: "admitted"
|
|
288
116
|
transition "Retire" => "retired", from: ["admitted", "deprecated"]
|
|
289
117
|
end
|
|
@@ -303,11 +131,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
303
131
|
end
|
|
304
132
|
end
|
|
305
133
|
|
|
306
|
-
#
|
|
307
|
-
# `identified_by :position` — positional, the SAME field name as
|
|
308
|
-
# Keyword's own on purpose: an Argument row's identity is never
|
|
309
|
-
# compared against a Keyword row's, so the shared name costs nothing
|
|
310
|
-
# and names the same fact both times.
|
|
134
|
+
# Identified by position, as Keyword is; Argument and Keyword rows are never compared.
|
|
311
135
|
value_object "ArgumentPosition" do
|
|
312
136
|
attribute :value, Integer
|
|
313
137
|
end
|
|
@@ -329,42 +153,14 @@ Hecks.bluebook "Bluebook" do
|
|
|
329
153
|
attribute :pair_value_fills, ArgumentSeedText, optional: true
|
|
330
154
|
attribute :pairs_shape, ArgumentSeedText, optional: true
|
|
331
155
|
attribute :variadic, ArgumentSeedText, optional: true
|
|
332
|
-
# Minimum positional count for a variadic form.
|
|
333
|
-
# two so one symbol can retire without retiring compound keys.
|
|
156
|
+
# Minimum positional count for a variadic form.
|
|
334
157
|
attribute :minimum, ArgumentSeedText, optional: true
|
|
335
|
-
#
|
|
336
|
-
#
|
|
337
|
-
# dispatch (slice 1, whole-project table-unification survey) reads
|
|
338
|
-
# this to decide whether a GENERATED fill method may coerce its own
|
|
339
|
-
# argument before storing it. `"false"` marks the six real
|
|
340
|
-
# exceptions a full builder-method audit found (read the real Ruby
|
|
341
|
-
# source, not inferred): `vision`/`description`(x4)/`goal` all
|
|
342
|
-
# store a `kind: "text"` argument RAW, with no `.to_s` at all —
|
|
343
|
-
# `.to_s` on an actual String is a same-object no-op for every real
|
|
344
|
-
# corpus use, but a direct Ruby API call passing something else
|
|
345
|
-
# (`vision(42)`) would see genuinely different stored behavior, so
|
|
346
|
-
# this couldn't be assumed uniform across every text-kind row the
|
|
347
|
-
# way it turned out to genuinely be for every OTHER text-kind
|
|
348
|
-
# argument in the whole grammar.
|
|
158
|
+
# Absent means the uniform kind-driven coercion (text -> .to_s, symbol -> .to_sym).
|
|
159
|
+
# "false" marks the words (`vision`, `description`, `goal`) that store a text argument raw.
|
|
349
160
|
attribute :coerce, ArgumentSeedText, optional: true
|
|
350
|
-
#
|
|
351
|
-
#
|
|
352
|
-
#
|
|
353
|
-
# message a real word's own hand-written method raised on a blank
|
|
354
|
-
# value BEFORE storing it (`Translation#retired`: "a retired needs
|
|
355
|
-
# an aggregate name"; `TranslationAggregate#drop`: "a drop needs a
|
|
356
|
-
# name") — `required: "true"` alone only gates Ruby's own ARITY
|
|
357
|
-
# (an argument omitted entirely), never a present-but-blank one,
|
|
358
|
-
# so this is a genuinely separate fact the table did not already
|
|
359
|
-
# carry. Most `required: "true"` rows do NOT raise on blank
|
|
360
|
-
# (confirmed by reading every one migrated in slice 1 —
|
|
361
|
-
# `Policy#on`/`ProcessManager#correlates_by`/etc. all accept and
|
|
362
|
-
# store an empty string same as any other), so this could not be
|
|
363
|
-
# assumed uniform from `required:` either. Carries the REAL text
|
|
364
|
-
# rather than a generated one — refusal wording is itself a
|
|
365
|
-
# checked contract in this codebase (item #2, whole-project
|
|
366
|
-
# table-unification survey, `RefusalWording::TEMPLATES`), not
|
|
367
|
-
# throwaway UX text a generic template could safely replace.
|
|
161
|
+
# Absent means a blank value is stored like any other. Non-empty is the exact Malformed
|
|
162
|
+
# message raised on a blank value; `required` only gates arity. Refusal wording is a
|
|
163
|
+
# checked contract (`RefusalWording::TEMPLATES`), so the real text is carried.
|
|
368
164
|
attribute :blank_message, ArgumentSeedText, optional: true
|
|
369
165
|
|
|
370
166
|
lifecycle :status, default: "admitted" do
|
|
@@ -395,10 +191,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
395
191
|
attribute :value, String
|
|
396
192
|
end
|
|
397
193
|
|
|
398
|
-
#
|
|
399
|
-
# describes its own single surface, not several — so unlike every
|
|
400
|
-
# other aggregate's own creating command, this carries no `position`:
|
|
401
|
-
# there are no siblings to order among.
|
|
194
|
+
# There is only ever one Syntax record, so this carries no `position`.
|
|
402
195
|
command "Declare" do
|
|
403
196
|
role "Language"
|
|
404
197
|
goal "Open the language's own syntax table"
|
|
@@ -412,12 +205,8 @@ Hecks.bluebook "Bluebook" do
|
|
|
412
205
|
emits SyntaxDeclared
|
|
413
206
|
end
|
|
414
207
|
|
|
415
|
-
#
|
|
416
|
-
#
|
|
417
|
-
# only LOCATES) — so, mirroring `ValueObject.Member`/`ProcessManager.
|
|
418
|
-
# Handler`, this is a bare, aggregate-level append. `position` is
|
|
419
|
-
# minted by `SyntaxBoot` as the seed row's own index — the same walk-
|
|
420
|
-
# index convention Member's own `position` already uses.
|
|
208
|
+
# An entity is never created by its own dotted verb, so this is an aggregate-level append.
|
|
209
|
+
# `position` is minted by `SyntaxBoot` as the seed row's index.
|
|
421
210
|
command "Keyword" do
|
|
422
211
|
role "Language"
|
|
423
212
|
goal "Admit one word the bluebook surface accepts"
|