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,35 +3,14 @@ require_relative "../projector"
|
|
|
3
3
|
|
|
4
4
|
module Hecks
|
|
5
5
|
module Projections
|
|
6
|
-
# The model classes, projected from the
|
|
7
|
-
#
|
|
8
|
-
# A construct's holding half — its readers, its emission, a
|
|
9
|
-
# constructor that assigns declared fields and hands off — restates
|
|
10
|
-
# what `bluebook.bluebook` already says, three times over in Ruby.
|
|
11
|
-
# This renders it instead.
|
|
12
|
-
#
|
|
13
|
-
# **Only the holding half**. `Behaviour::X` is hand-written and permanent,
|
|
14
|
-
# and `settle` is the seam: everything a declaration cannot state
|
|
15
|
-
# lives behind it, so regenerating can never be lossy. That property
|
|
16
|
-
# was established construct by construct before any of this was
|
|
17
|
-
# written — the chapter looked generatable and was not, until its
|
|
18
|
-
# `@hecks_root`, ports table and child stamping moved behind `settle`.
|
|
19
|
-
#
|
|
20
|
-
# The `HOST` manifest is the honest part. The grammar states the fields;
|
|
21
|
-
# it does not state which constructs are Ruby classes rather than
|
|
22
|
-
# instances, what a constructor's defaults are, or how a value is
|
|
23
|
-
# coerced on the way in. Those are facts about Ruby, not about
|
|
24
|
-
# bluebooks, so they are declared here rather than pretended into the
|
|
25
|
-
# language — and keeping them in one table is what would let a second
|
|
26
|
-
# host swap this file rather than edit thirteen.
|
|
6
|
+
# The model classes' holding half (readers, emission, constructor), projected from the
|
|
7
|
+
# language. `Behaviour::X` stays hand-written behind `settle`, so regenerating is never lossy.
|
|
27
8
|
module Model
|
|
28
9
|
extend Projector::Target
|
|
29
10
|
|
|
30
11
|
projects_as :model, declares: "Bluebook", emits: :files
|
|
31
12
|
|
|
32
|
-
#
|
|
33
|
-
# declared field arrives as whatever the builder handed over, and
|
|
34
|
-
# each construct has always normalised its own on the way in.
|
|
13
|
+
# Per-construct Ruby facts the grammar does not state (defaults, coercion, class shape).
|
|
35
14
|
HOST = {
|
|
36
15
|
"Policy" => {
|
|
37
16
|
construct: "Policy",
|
|
@@ -42,22 +21,12 @@ module Hecks
|
|
|
42
21
|
defaults: { name: nil, on_event: "nil", trigger_command: "nil",
|
|
43
22
|
target_domain: "nil", expect_undelivered: "false", where: "nil", for_each: "nil",
|
|
44
23
|
with_spec: "[]", aggregate: "nil" },
|
|
45
|
-
#
|
|
46
|
-
# text ("true"), the builder hands over `true`, and a
|
|
47
|
-
# reconstruction hands back whichever it read; all three land
|
|
48
|
-
# as the same `true`/`false`.
|
|
24
|
+
# The language holds a flag as "true" and the builder as `true`; both become a boolean.
|
|
49
25
|
coerce: { name: ".to_s", aggregate: "&.to_s", expect_undelivered: ".to_s == \"true\"" },
|
|
50
|
-
#
|
|
51
|
-
#
|
|
52
|
-
# `DispatchSpec`'s own `with_spec` does — keys to strings, and
|
|
53
|
-
# `render_value` keeping the leading colon on a Symbol, because
|
|
54
|
-
# a binding that reads an event field and one that supplies a
|
|
55
|
-
# literal string are otherwise indistinguishable once written
|
|
56
|
-
# down (see `MetaValidator::Readings`' own note on exactly that).
|
|
26
|
+
# Bindings render like `DispatchSpec#with_spec`; `render_value` keeps a Symbol's colon
|
|
27
|
+
# so an event-field read and a literal string stay distinguishable.
|
|
57
28
|
renders: { with_spec: "-> { with_spec.map { |key, value| [key.to_s, Bluebook.render_value(value)] } }",
|
|
58
|
-
# Computed (Deviations::COMPUTED["Policy"]):
|
|
59
|
-
# form of `where`, a pure function of that text, the same
|
|
60
|
-
# `ast` every rule row carries beside its `canonical`.
|
|
29
|
+
# Computed (Deviations::COMPUTED["Policy"]): derived from `where`.
|
|
61
30
|
where_ast: "-> { where_ast }" },
|
|
62
31
|
settles: false
|
|
63
32
|
}
|
|
@@ -109,11 +78,8 @@ module Hecks
|
|
|
109
78
|
RUBY
|
|
110
79
|
end
|
|
111
80
|
|
|
112
|
-
#
|
|
113
|
-
#
|
|
114
|
-
# A computed field (Deviations::COMPUTED) is emitted too — it is
|
|
115
|
-
# model-only by definition, so it rides after the declared fields
|
|
116
|
-
# and must have a `renders` entry, there being nothing to `send`.
|
|
81
|
+
# Renders the `emits_ir` call. A computed field (Deviations::COMPUTED) rides after the
|
|
82
|
+
# declared ones and needs a `renders` entry, since there is nothing to `send`.
|
|
117
83
|
#
|
|
118
84
|
# @param bluebook [Bluebook::Chapter] the "Bluebook" chapter the construct's own
|
|
119
85
|
# attributes are read from
|
|
@@ -127,10 +93,8 @@ module Hecks
|
|
|
127
93
|
"emits_ir(\n#{fields.map { |f| " #{"#{f}:".ljust(width + 1)} #{renders.fetch(f, ":#{f}")}" }.join(",\n")}\n)"
|
|
128
94
|
end
|
|
129
95
|
|
|
130
|
-
# What the construct emits:
|
|
131
|
-
#
|
|
132
|
-
# spec/model_shape_conformance_spec compute this the same way, from
|
|
133
|
-
# the same tables, which is the point of the tables being in lib.
|
|
96
|
+
# What the construct emits: the declared attributes less every `Deviations` entry.
|
|
97
|
+
# spec/model_shape_conformance_spec computes it from the same tables.
|
|
134
98
|
#
|
|
135
99
|
# @param bluebook [Bluebook::Chapter] the "Bluebook" chapter the construct's own
|
|
136
100
|
# attributes are read from
|
|
@@ -158,10 +122,7 @@ module Hecks
|
|
|
158
122
|
accessors = host.fetch(:accessors, [])
|
|
159
123
|
return lines.join("\n") if accessors.empty?
|
|
160
124
|
|
|
161
|
-
#
|
|
162
|
-
# needs a reader, and the reason it is off the wire is carried
|
|
163
|
-
# here rather than typed in — a comment that survives
|
|
164
|
-
# regeneration is one the generator writes.
|
|
125
|
+
# The off-the-wire reason is emitted so the comment survives regeneration.
|
|
165
126
|
reasons = Deviations::OFF_THE_WIRE.fetch(host.fetch(:construct, ""), {})
|
|
166
127
|
(lines + accessors.map do |a|
|
|
167
128
|
why = reasons[a]
|
|
@@ -3,42 +3,12 @@ require_relative "../projector"
|
|
|
3
3
|
|
|
4
4
|
module Hecks
|
|
5
5
|
module Projections
|
|
6
|
-
# An OIDC client/scope manifest derived from a domain's
|
|
7
|
-
#
|
|
8
|
-
# issue a token that means anything here.
|
|
6
|
+
# An OIDC client/scope manifest derived from a domain's IR: the audience, one scope per
|
|
7
|
+
# command, and the roles those commands demand.
|
|
9
8
|
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
# `
|
|
13
|
-
# claims in, `IdentityResolution.resolve` → `Authorization.holds_role?`
|
|
14
|
-
# → a dispatch scoped by `Hecks.as_caller(role:)`. That half enforces
|
|
15
|
-
# a role per command. It just had no way to say, up front and as data,
|
|
16
|
-
# which role each command wants — every answer came from asking the
|
|
17
|
-
# live runtime one dispatch at a time.
|
|
18
|
-
#
|
|
19
|
-
# This is that catalogue, and the two are checked against each other
|
|
20
|
-
# rather than merely coexisting: `verb` here is spelled exactly as
|
|
21
|
-
# `Runtime::Dispatcher#dispatch` takes it and exactly as
|
|
22
|
-
# `Bluebook#verbs` lists it, so a scope can never name a command
|
|
23
|
-
# the domain does not have (spec/projections/oidc_projection_spec.rb
|
|
24
|
-
# holds the two lists equal), and `role` is the same string
|
|
25
|
-
# `Ports::Authorization.holds_role?` compares against a real
|
|
26
|
-
# `Governance::RoleAssignment`.
|
|
27
|
-
#
|
|
28
|
-
# ## Roles come from the commands, not from governance
|
|
29
|
-
#
|
|
30
|
-
# A command's own `role "Compliance officer"` is in the bluebook IR
|
|
31
|
-
# (`Command#role`), whereas `uses_framework "Governance"` is
|
|
32
|
-
# declared in the `.hecksagon` — which `call(bluebook:, options:)`
|
|
33
|
-
# cannot see at all. Reading the commands is both the only thing
|
|
34
|
-
# available here and the more accurate source: it says what each
|
|
35
|
-
# command actually demands, not merely which role vocabulary the
|
|
36
|
-
# application happened to mount.
|
|
37
|
-
#
|
|
38
|
-
# A command with no declared role projects `"role" => nil` rather
|
|
39
|
-
# than being dropped — an unguarded command is a real fact about the
|
|
40
|
-
# domain, and silently omitting it would make the manifest read as
|
|
41
|
-
# though the command did not exist.
|
|
9
|
+
# `verb` matches `Bluebook#verbs` and `role` matches what `Ports::Authorization.holds_role?`
|
|
10
|
+
# compares. Roles come from each command's own `role`, since `.hecksagon` is not visible here.
|
|
11
|
+
# A command with no declared role projects `"role" => nil` rather than being dropped.
|
|
42
12
|
module OIDC
|
|
43
13
|
extend Projector::Target
|
|
44
14
|
|
|
@@ -46,9 +16,8 @@ module Hecks
|
|
|
46
16
|
|
|
47
17
|
module_function
|
|
48
18
|
|
|
49
|
-
# `audience:` overrides the domain name
|
|
50
|
-
#
|
|
51
|
-
# chapter name.
|
|
19
|
+
# Projects the manifest; `audience:` overrides the domain name (an IdP audience is
|
|
20
|
+
# usually a URL).
|
|
52
21
|
#
|
|
53
22
|
# @param bluebook [Bluebook::Chapter] the chapter being projected
|
|
54
23
|
# @param options [Hash{Symbol => Object}] `:audience` (String, Symbol, nil)
|
|
@@ -66,16 +35,8 @@ module Hecks
|
|
|
66
35
|
}
|
|
67
36
|
end
|
|
68
37
|
|
|
69
|
-
#
|
|
70
|
-
#
|
|
71
|
-
# `StorageShape.project` sets for its own aggregate list.
|
|
72
|
-
#
|
|
73
|
-
# Recurses into entities, not just an aggregate's own direct
|
|
74
|
-
# commands — the exact same gap `Bluebook#verbs` closed for the
|
|
75
|
-
# same reason (`chapter.rb`'s own comment): a command reached
|
|
76
|
-
# through `Dispatcher#dispatch`'s dotted `Entity.Command` routing
|
|
77
|
-
# is real and callable, so a manifest that never names it can
|
|
78
|
-
# never grant a client a scope for it either.
|
|
38
|
+
# Every command's scope entry, entity commands included (they dispatch as `Entity.Command`).
|
|
39
|
+
# Sorted by scope so two manifest versions diff cleanly.
|
|
79
40
|
#
|
|
80
41
|
# @param bluebook [Bluebook::Chapter] the chapter being projected
|
|
81
42
|
# @return [Array<Hash{String => Object}>] every command's scope entry (see
|
|
@@ -100,10 +61,7 @@ module Hecks
|
|
|
100
61
|
aggregate.entities.flat_map { |entity| entity_scopes(entity, verb_prefix, scope_prefix) }
|
|
101
62
|
end
|
|
102
63
|
|
|
103
|
-
#
|
|
104
|
-
# inside `Handler`), so this recurses the same way `Chapter#verbs`
|
|
105
|
-
# now does. The verb and scope prefixes grow in lockstep, each
|
|
106
|
-
# `.`-joined the same way its own kind already was.
|
|
64
|
+
# Projects an entity's commands, recursing into nested entities (ADR 0026).
|
|
107
65
|
#
|
|
108
66
|
# @param entity [Bluebook::Entity] the entity being projected
|
|
109
67
|
# @param verb_prefix [String] the enclosing aggregate or entity's own verb
|
|
@@ -120,10 +78,8 @@ module Hecks
|
|
|
120
78
|
entity.entities.flat_map { |piece| entity_scopes(piece, verb_prefix, scope_prefix) }
|
|
121
79
|
end
|
|
122
80
|
|
|
123
|
-
# `banking:account.open
|
|
124
|
-
#
|
|
125
|
-
# facade uses to name a command's own door method, so a scope and
|
|
126
|
-
# the Ruby call that satisfies it cannot drift apart.
|
|
81
|
+
# One scope entry per command, spelled like `banking:account.open`; snake-cased through
|
|
82
|
+
# `Naming.snake`, as the facade names its door methods.
|
|
127
83
|
#
|
|
128
84
|
# @param commands [Array<Bluebook::Command>] the commands to project
|
|
129
85
|
# @param verb_prefix [String] the owning aggregate or entity's fully-qualified
|
|
@@ -2,14 +2,8 @@ require_relative "../projector"
|
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
4
|
module Projections
|
|
5
|
-
# The Rust parser's keyword table, projected from the chapter's own
|
|
6
|
-
#
|
|
7
|
-
# hecks's self-description, not hand-typed a second time", which
|
|
8
|
-
# is the anti-drift idea the whole Rust-parser plan rests on.
|
|
9
|
-
#
|
|
10
|
-
# A registered target now, rather than a module living inside its own
|
|
11
|
-
# bin/ script. It was already a projection in everything but call
|
|
12
|
-
# shape; this only stops it being a fifth way of spelling one.
|
|
5
|
+
# The Rust parser's keyword table, projected from the chapter's own Syntax aggregate,
|
|
6
|
+
# so the parser's grammar knowledge is derived rather than hand-typed a second time.
|
|
13
7
|
module ParserTable
|
|
14
8
|
extend Projector::Target
|
|
15
9
|
projects_as :parser_table, declares: "Syntax"
|
|
@@ -27,10 +21,8 @@ module Hecks
|
|
|
27
21
|
|
|
28
22
|
module_function
|
|
29
23
|
|
|
30
|
-
# The chapter
|
|
31
|
-
#
|
|
32
|
-
# own, and the projector protocol already hands over the chapter as an
|
|
33
|
-
# argument, at no cost.
|
|
24
|
+
# The chapter's `Syntax` aggregate. Taken from the argument, not the grammar registry,
|
|
25
|
+
# so the projection is not pinned to the language's own chapter.
|
|
34
26
|
#
|
|
35
27
|
# @param bluebook [Bluebook::Chapter] the chapter to read the Syntax aggregate
|
|
36
28
|
# from
|
|
@@ -38,10 +30,7 @@ module Hecks
|
|
|
38
30
|
# it declares none
|
|
39
31
|
def syntax(bluebook) = bluebook.aggregate("Syntax")
|
|
40
32
|
|
|
41
|
-
# Every cell as text
|
|
42
|
-
# `rows` helper, reused rather than re-derived: a member's fields decode
|
|
43
|
-
# back through typed literal decoding on the way out of reconstruction,
|
|
44
|
-
# and this reads it back as what was written.
|
|
33
|
+
# Every cell as text, as spec/syntax_conformance_spec.rb's `rows` helper reads it.
|
|
45
34
|
#
|
|
46
35
|
# @param bluebook [Bluebook::Chapter] the chapter to read from
|
|
47
36
|
# @param name [String] the closed-set value object's name, such as `"Context"`
|
|
@@ -63,10 +52,8 @@ module Hecks
|
|
|
63
52
|
ARGUMENT_FIELDS = %i[keyword context at named kind required fills selects
|
|
64
53
|
pair_key_fills pair_value_fills pairs_shape status variadic minimum].freeze
|
|
65
54
|
|
|
66
|
-
# A Rust string literal for one field's value
|
|
67
|
-
#
|
|
68
|
-
# only has to be safe against the two characters Rust string literals
|
|
69
|
-
# themselves reserve.
|
|
55
|
+
# A Rust string literal for one field's value. Fields are plain ASCII, so only
|
|
56
|
+
# the backslash and double quote need escaping.
|
|
70
57
|
#
|
|
71
58
|
# @param value [Object] the field value to render; stringified before escaping
|
|
72
59
|
# @return [String] a quoted Rust string literal
|
|
@@ -100,14 +87,8 @@ module Hecks
|
|
|
100
87
|
"pub static #{name}: &[&str] = &[\n#{lines.join("\n")}\n];\n"
|
|
101
88
|
end
|
|
102
89
|
|
|
103
|
-
#
|
|
104
|
-
#
|
|
105
|
-
# really is a lifecycle. `SyntaxBoot.call` reads the still-static
|
|
106
|
-
# seed rows (`KeywordSeed`/`ArgumentSeed`), dispatches each one
|
|
107
|
-
# through the real admission/lifecycle door, and hands back rows in
|
|
108
|
-
# the same shape `rows` reads for every other closed set here —
|
|
109
|
-
# symbol keys, string values, `status` included — so nothing else
|
|
110
|
-
# in this file needs to change.
|
|
90
|
+
# Renders the whole Rust source. Keyword and Argument rows come from `SyntaxBoot.call`,
|
|
91
|
+
# which dispatches the seed rows so `status` is a real lifecycle (ADR 0026).
|
|
111
92
|
#
|
|
112
93
|
# @param bluebook [Bluebook::Chapter] the chapter to project
|
|
113
94
|
# @return [String] the rendered `KEYWORDS`/`ARGUMENTS`/closed-set Rust source
|
|
@@ -9,21 +9,8 @@ module Hecks
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
module Projections
|
|
12
|
-
# The DSL reference pages, projected from the chapter's
|
|
13
|
-
#
|
|
14
|
-
# preserved from whatever is already committed.
|
|
15
|
-
#
|
|
16
|
-
# The first projection that emits a tree. `emits: :files` says so,
|
|
17
|
-
# and the framework writes the map rather than inferring one: a Hash
|
|
18
|
-
# of path => contents and a Hash that merely holds strings are the
|
|
19
|
-
# same object to Ruby, so only the projection can know which it
|
|
20
|
-
# meant. This is the case the output contract was designed for and
|
|
21
|
-
# deliberately left unimplemented until something real needed it.
|
|
22
|
-
#
|
|
23
|
-
# Not pure, and it cannot be. `Doc::Reference.pages` reads the
|
|
24
|
-
# committed pages to harvest their prose, so the existing directory
|
|
25
|
-
# is an input — passed as `from:` rather than assumed, so the
|
|
26
|
-
# projection never reaches for a path of its own choosing.
|
|
12
|
+
# The DSL reference pages, projected from the chapter's Syntax aggregate;
|
|
13
|
+
# tables come from the declaration, prose is preserved from what's already committed.
|
|
27
14
|
module Reference
|
|
28
15
|
extend Projector::Target
|
|
29
16
|
|