hecks 1.3.0 → 1.5.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/lib/hecks/adapters/driven/claude_code.rb +72 -7
- data/lib/hecks/adapters/driven/d1.rb +187 -23
- data/lib/hecks/adapters/driven/folder.rb +83 -10
- data/lib/hecks/adapters/driven/google_authentication.rb +33 -12
- data/lib/hecks/adapters/driven/governance_authorization.rb +87 -18
- data/lib/hecks/adapters/driven/heki/journal.rb +13 -4
- data/lib/hecks/adapters/driven/heki/saga_store.rb +56 -10
- data/lib/hecks/adapters/driven/heki/snapshot.rb +1 -1
- data/lib/hecks/adapters/driven/heki.rb +106 -9
- data/lib/hecks/adapters/driven/identity_registry.rb +12 -2
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +25 -3
- data/lib/hecks/adapters/driven/in_process_key_vault.adapter +3 -0
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +53 -0
- data/lib/hecks/adapters/driven/lambda/client.rb +67 -14
- data/lib/hecks/adapters/driven/lambda.rb +82 -35
- data/lib/hecks/adapters/driven/local_storage.rb +83 -10
- data/lib/hecks/adapters/driven/memory.rb +205 -9
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +21 -1
- data/lib/hecks/adapters/driven/postgres/codec.rb +27 -11
- data/lib/hecks/adapters/driven/postgres/outbox.rb +40 -2
- data/lib/hecks/adapters/driven/postgres/reconnect.rb +23 -7
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +14 -14
- data/lib/hecks/adapters/driven/postgres.rb +175 -28
- data/lib/hecks/adapters/driven/prism.rb +50 -11
- data/lib/hecks/adapters/driven/secure_random_identity.rb +3 -0
- data/lib/hecks/adapters/driven/sql_query_builder.rb +34 -22
- data/lib/hecks/adapters/driven/sqlite/codec.rb +38 -10
- data/lib/hecks/adapters/driven/sqlite/projection.rb +60 -32
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +12 -12
- data/lib/hecks/adapters/driven/sqlite.rb +181 -21
- data/lib/hecks/adapters/driven/system_clock.rb +3 -0
- data/lib/hecks/adapters/driven/tenant_provisioner.adapter +3 -0
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +66 -0
- data/lib/hecks/adapters/driven.rb +6 -4
- data/lib/hecks/adapters/driving/github_webhook.rb +31 -18
- data/lib/hecks/behaviors/dsl.rb +60 -2
- data/lib/hecks/behaviors/expectations.rb +190 -29
- data/lib/hecks/behaviors/ir.rb +12 -1
- data/lib/hecks/behaviors/rspec.rb +9 -1
- data/lib/hecks/behaviors/runner.rb +21 -2
- data/lib/hecks/behaviors.rb +9 -1
- data/lib/hecks/bluebook/aggregate.rb +43 -13
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +17 -10
- data/lib/hecks/bluebook/assembly/build.rb +26 -5
- data/lib/hecks/bluebook/assembly/contract.rb +98 -23
- data/lib/hecks/bluebook/assembly/contracts.rb +59 -52
- data/lib/hecks/bluebook/assembly/marks.rb +159 -30
- data/lib/hecks/bluebook/assembly/specializer.rb +38 -21
- data/lib/hecks/bluebook/assembly.rb +32 -14
- data/lib/hecks/bluebook/attribute.rb +26 -12
- data/lib/hecks/bluebook/behaviour/aggregate.rb +43 -11
- data/lib/hecks/bluebook/behaviour/attribute.rb +18 -5
- data/lib/hecks/bluebook/behaviour/chapter.rb +76 -5
- data/lib/hecks/bluebook/behaviour/command.rb +55 -25
- data/lib/hecks/bluebook/behaviour/domain_port.rb +27 -7
- data/lib/hecks/bluebook/behaviour/entity.rb +20 -8
- data/lib/hecks/bluebook/behaviour/hexagon.rb +30 -4
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +27 -6
- data/lib/hecks/bluebook/behaviour/policy.rb +42 -17
- data/lib/hecks/bluebook/behaviour/process_manager.rb +39 -8
- data/lib/hecks/bluebook/behaviour/query.rb +6 -1
- data/lib/hecks/bluebook/behaviour/read_model.rb +29 -8
- data/lib/hecks/bluebook/behaviour/traits.rb +48 -12
- data/lib/hecks/bluebook/behaviour/value_object.rb +21 -9
- data/lib/hecks/bluebook/capabilities.rb +27 -0
- data/lib/hecks/bluebook/chapter.rb +51 -9
- data/lib/hecks/bluebook/command.rb +62 -17
- data/lib/hecks/bluebook/domain_port.rb +34 -9
- data/lib/hecks/bluebook/dsl/adapter_builder.rb +24 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +49 -49
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +282 -123
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +112 -75
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +81 -2
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +486 -117
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +179 -47
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +116 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +284 -122
- data/lib/hecks/bluebook/dsl/const_shim.rb +46 -15
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +90 -25
- data/lib/hecks/bluebook/dsl/entity_builder.rb +191 -61
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +148 -132
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +130 -30
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +38 -21
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +27 -4
- data/lib/hecks/bluebook/dsl/policy_builder.rb +86 -36
- data/lib/hecks/bluebook/dsl/port_builder.rb +38 -7
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +56 -22
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +111 -47
- data/lib/hecks/bluebook/dsl/query_builder.rb +37 -8
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +127 -52
- data/lib/hecks/bluebook/dsl/rule_reference.rb +97 -43
- data/lib/hecks/bluebook/dsl/translation_builder.rb +150 -44
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +68 -20
- data/lib/hecks/bluebook/dsl/word_gate.rb +59 -53
- data/lib/hecks/bluebook/dsl/world_builder.rb +51 -8
- data/lib/hecks/bluebook/entity.rb +40 -11
- data/lib/hecks/bluebook/expression/ast_json.rb +128 -36
- data/lib/hecks/bluebook/expression/ast_reader.rb +32 -3
- data/lib/hecks/bluebook/expression/canonical_form.rb +55 -16
- data/lib/hecks/bluebook/expression/evaluator.rb +221 -43
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +54 -18
- data/lib/hecks/bluebook/expression/resolver.rb +369 -128
- data/lib/hecks/bluebook/hexagon.rb +35 -1
- data/lib/hecks/bluebook/lifecycle.rb +12 -1
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +2 -1
- data/lib/hecks/bluebook/meta_validator/judge.rb +126 -108
- data/lib/hecks/bluebook/meta_validator/plan.rb +81 -46
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +3 -2
- data/lib/hecks/bluebook/meta_validator/readings.rb +200 -50
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +68 -41
- data/lib/hecks/bluebook/meta_validator/shapes.rb +166 -21
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +286 -46
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +11 -10
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -5
- data/lib/hecks/bluebook/meta_validator.rb +235 -139
- data/lib/hecks/bluebook/model_check.rb +434 -104
- data/lib/hecks/bluebook/pattern_subset.rb +32 -10
- data/lib/hecks/bluebook/policy.rb +15 -13
- data/lib/hecks/bluebook/process_manager.rb +27 -14
- data/lib/hecks/bluebook/project_discovery.rb +5 -0
- data/lib/hecks/bluebook/project_loader.rb +40 -0
- data/lib/hecks/bluebook/project_register.rb +50 -6
- data/lib/hecks/bluebook/query.rb +31 -4
- data/lib/hecks/bluebook/read_model.rb +35 -15
- data/lib/hecks/bluebook/reference.rb +26 -13
- data/lib/hecks/bluebook/smoke_test.rb +46 -23
- data/lib/hecks/bluebook/synthesizer.rb +46 -12
- data/lib/hecks/bluebook/translation.rb +34 -5
- data/lib/hecks/bluebook/value_object.rb +29 -11
- data/lib/hecks/bluebook.rb +5 -6
- data/lib/hecks/codemod.rb +138 -50
- data/lib/hecks/construct.rb +21 -7
- data/lib/hecks/corpus.rb +438 -0
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +19 -0
- data/lib/hecks/doc/reference.rb +200 -31
- data/lib/hecks/embryonaut_bluebook.rb +38 -15
- data/lib/hecks/facade/cli_door.rb +69 -10
- data/lib/hecks/facade/cli_runner.rb +105 -24
- data/lib/hecks/facade/command_request.rb +23 -0
- data/lib/hecks/facade/handle.rb +155 -35
- data/lib/hecks/facade/json_door.rb +106 -25
- data/lib/hecks/facade/surface/aggregate_door.rb +50 -27
- data/lib/hecks/facade/surface/chapter.rb +26 -17
- data/lib/hecks/facade/surface.rb +16 -3
- data/lib/hecks/facade.rb +15 -4
- data/lib/hecks/forms/app.rb +46 -30
- data/lib/hecks/forms/command_form_renderer.rb +70 -9
- data/lib/hecks/forms/field_renderer.rb +142 -6
- data/lib/hecks/forms/field_shape.rb +183 -19
- data/lib/hecks/forms/html.rb +51 -7
- data/lib/hecks/forms/index_renderer.rb +14 -2
- data/lib/hecks/forms/page.rb +14 -0
- data/lib/hecks/forms/params.rb +120 -23
- data/lib/hecks/forms/port_argument.rb +14 -2
- data/lib/hecks/forms/query_form_renderer.rb +65 -2
- data/lib/hecks/forms/record_renderer.rb +60 -2
- data/lib/hecks/forms/record_table.rb +28 -1
- data/lib/hecks/forms/reference_options.rb +24 -0
- data/lib/hecks/forms/value_object_shape.rb +13 -3
- data/lib/hecks/forms.rb +24 -4
- data/lib/hecks/fqn.rb +59 -1
- data/lib/hecks/framework/bluebook/governance.bluebook +9 -0
- data/lib/hecks/framework/bluebook/privacy.bluebook +155 -0
- data/lib/hecks/framework/oidc.json +15 -0
- data/lib/hecks/framework.rb +79 -25
- data/lib/hecks/freezer.rb +27 -11
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +241 -106
- data/lib/hecks/fuzzing/combination_miner.rb +178 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +241 -45
- data/lib/hecks/fuzzing/coverage_campaign.rb +161 -0
- data/lib/hecks/fuzzing/differential.rb +192 -0
- data/lib/hecks/fuzzing/domain_generator.rb +871 -0
- data/lib/hecks/fuzzing/era_boundary.rb +68 -19
- data/lib/hecks/fuzzing/form_census.rb +121 -20
- data/lib/hecks/fuzzing/generated_domain_check.rb +171 -0
- data/lib/hecks/fuzzing/invalid_value_generator.rb +45 -6
- data/lib/hecks/fuzzing/isolated_boot.rb +137 -80
- data/lib/hecks/fuzzing/nondeterministic.rb +79 -0
- data/lib/hecks/fuzzing/persistence_parity.rb +111 -21
- data/lib/hecks/fuzzing/properties/corrections.rb +34 -9
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +300 -51
- data/lib/hecks/fuzzing/properties/guards.rb +86 -42
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +80 -32
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +40 -35
- data/lib/hecks/fuzzing/properties/outbox.rb +70 -32
- data/lib/hecks/fuzzing/properties/querying.rb +82 -28
- data/lib/hecks/fuzzing/properties.rb +84 -51
- data/lib/hecks/fuzzing/qa_settings.rb +164 -0
- data/lib/hecks/fuzzing/replay.rb +241 -133
- data/lib/hecks/fuzzing/rotation_priority.rb +48 -28
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +139 -0
- data/lib/hecks/fuzzing/self_consistency.rb +315 -137
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +46 -40
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +18 -11
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +13 -12
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +21 -12
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +59 -32
- data/lib/hecks/fuzzing/sequence_generator.rb +158 -23
- data/lib/hecks/fuzzing/shrinker.rb +309 -0
- data/lib/hecks/fuzzing/structural_skips.rb +37 -130
- data/lib/hecks/fuzzing/sweep_depth.rb +12 -4
- data/lib/hecks/fuzzing/target_capabilities.rb +107 -29
- data/lib/hecks/fuzzing/value_generator.rb +110 -22
- data/lib/hecks/fuzzing.rb +5 -0
- data/lib/hecks/grammar/evolve.rb +188 -12
- data/lib/hecks/grammar.rb +53 -7
- data/lib/hecks/ir.rb +51 -20
- data/lib/hecks/language/bluebook/bluebook.bluebook +41 -0
- data/lib/hecks/language/bluebook/policy.bluebook +11 -1
- data/lib/hecks/language/bluebook/vocabulary.bluebook +348 -13
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +11 -0
- data/lib/hecks/language/oidc.json +5 -0
- data/lib/hecks/literal.rb +41 -9
- data/lib/hecks/naming.rb +112 -31
- data/lib/hecks/ports/access_control.rb +53 -2
- data/lib/hecks/ports/agent/answers.rb +83 -6
- data/lib/hecks/ports/agent.rb +119 -35
- data/lib/hecks/ports/authentication.rb +44 -4
- data/lib/hecks/ports/authorization.rb +50 -11
- data/lib/hecks/ports/clock.rb +42 -23
- data/lib/hecks/ports/extraction.rb +16 -0
- data/lib/hecks/ports/identity_assignment.rb +23 -2
- data/lib/hecks/ports/identity_generation.rb +17 -3
- data/lib/hecks/ports/identity_resolution.rb +17 -1
- data/lib/hecks/ports/key_vault.port +6 -0
- data/lib/hecks/ports/key_vault.rb +58 -0
- data/lib/hecks/ports/loading.rb +4 -0
- data/lib/hecks/ports/persistence/append_only.rb +172 -8
- data/lib/hecks/ports/persistence/binding_policy.rb +34 -0
- data/lib/hecks/ports/persistence/codec_boundary.rb +178 -0
- data/lib/hecks/ports/persistence/execution.rb +4 -0
- data/lib/hecks/ports/persistence/null_saga_store.rb +12 -1
- data/lib/hecks/ports/persistence/plugin.rb +42 -4
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +218 -25
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +77 -9
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +81 -24
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +29 -18
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +144 -60
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +103 -8
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +98 -23
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +282 -109
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +63 -25
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +118 -66
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +51 -28
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +34 -5
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +25 -12
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +129 -34
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +51 -6
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +33 -9
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +16 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +95 -6
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +25 -2
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +314 -90
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +68 -10
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +9 -3
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +9 -2
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +48 -8
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +16 -1
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +36 -5
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +23 -3
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +58 -19
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +96 -5
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +15 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +9 -1
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -2
- data/lib/hecks/ports/persistence/plugins/era.rb +12 -2
- data/lib/hecks/ports/persistence/remote_runtime.rb +9 -2
- data/lib/hecks/ports/persistence/repository_factory.rb +23 -3
- data/lib/hecks/ports/persistence/state_codec.rb +319 -0
- data/lib/hecks/ports/persistence.rb +36 -1
- data/lib/hecks/ports/projection.rb +61 -7
- data/lib/hecks/ports/query/in_memory.rb +41 -8
- data/lib/hecks/ports/query/ordering.rb +21 -6
- data/lib/hecks/ports/query.rb +35 -0
- data/lib/hecks/ports.rb +1 -0
- data/lib/hecks/projections/bootstrap_table.rb +147 -0
- data/lib/hecks/projections/diagrams.rb +315 -79
- data/lib/hecks/projections/glossary/html.rb +91 -3
- data/lib/hecks/projections/glossary/markdown.rb +50 -3
- data/lib/hecks/projections/glossary/mermaid.rb +49 -1
- data/lib/hecks/projections/glossary/sections.rb +1 -1
- data/lib/hecks/projections/glossary/sentences.rb +110 -5
- data/lib/hecks/projections/glossary.rb +173 -31
- data/lib/hecks/projections/ir.rb +1 -1
- data/lib/hecks/projections/model/deviations.rb +62 -17
- data/lib/hecks/projections/model.rb +75 -21
- data/lib/hecks/projections/oidc.rb +45 -8
- data/lib/hecks/projections/parser_table.rb +53 -12
- data/lib/hecks/projections/reference.rb +15 -3
- data/lib/hecks/projections/rust_vocabulary.rb +646 -0
- data/lib/hecks/projections/shape.rb +10 -2
- data/lib/hecks/projections/statements.rb +69 -22
- data/lib/hecks/projections/vocabulary.rb +26 -9
- data/lib/hecks/projections.rb +5 -3
- data/lib/hecks/projector/cli_projector.rb +245 -37
- data/lib/hecks/projector/docs_projector.rb +154 -28
- data/lib/hecks/projector/exporter.rb +104 -29
- data/lib/hecks/projector/ir_projector.rb +7 -1
- data/lib/hecks/projector/narrate_projector.rb +144 -23
- data/lib/hecks/projector/target.rb +42 -18
- data/lib/hecks/projector.rb +86 -18
- data/lib/hecks/query_ir.rb +94 -47
- data/lib/hecks/query_specification/common/comparators.rb +19 -3
- data/lib/hecks/query_specification/common/comparison.rb +109 -27
- data/lib/hecks/query_specification/common/dsl.rb +65 -9
- data/lib/hecks/query_specification/common/null_policy.rb +61 -15
- data/lib/hecks/query_specification/common/null_semantics.rb +4 -0
- data/lib/hecks/query_specification/common/options.rb +25 -0
- data/lib/hecks/query_specification/field_path.rb +69 -15
- data/lib/hecks/query_specification/hop_path.rb +57 -20
- data/lib/hecks/query_specification/read_model/specification.rb +4 -0
- data/lib/hecks/rendering.rb +9 -3
- data/lib/hecks/router/namespace_installer.rb +16 -3
- data/lib/hecks/router.rb +56 -1
- data/lib/hecks/runtime/aggregate_lock.rb +20 -11
- data/lib/hecks/runtime/boot_gates.rb +21 -3
- data/lib/hecks/runtime/caller.rb +40 -8
- data/lib/hecks/runtime/capability_graph.rb +13 -2
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +40 -41
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +45 -67
- data/lib/hecks/runtime/command_interpreter.rb +195 -113
- data/lib/hecks/runtime/command_rules/admissibility.rb +231 -80
- data/lib/hecks/runtime/command_rules/arithmetic.rb +154 -96
- data/lib/hecks/runtime/command_rules/authorization.rb +38 -17
- data/lib/hecks/runtime/command_rules/emission.rb +18 -1
- data/lib/hecks/runtime/command_rules/references.rb +145 -55
- data/lib/hecks/runtime/command_rules.rb +3 -0
- data/lib/hecks/runtime/dependency_planning.rb +56 -11
- data/lib/hecks/runtime/dispatcher.rb +263 -92
- data/lib/hecks/runtime/entity_element.rb +304 -67
- data/lib/hecks/runtime/entity_interpreter.rb +149 -88
- data/lib/hecks/runtime/errors.rb +37 -23
- data/lib/hecks/runtime/event.rb +15 -10
- data/lib/hecks/runtime/identity.rb +91 -23
- data/lib/hecks/runtime/instance.rb +103 -18
- data/lib/hecks/runtime/interpreting.rb +24 -16
- data/lib/hecks/runtime/invocation.rb +358 -0
- data/lib/hecks/runtime/loader.rb +105 -19
- data/lib/hecks/runtime/outbox.rb +164 -26
- data/lib/hecks/runtime/policy_interpreter.rb +73 -60
- data/lib/hecks/runtime/port_operation_interpreter.rb +42 -19
- data/lib/hecks/runtime/query_interpreter.rb +93 -74
- data/lib/hecks/runtime/reaction_invocation.rb +73 -28
- data/lib/hecks/runtime/read_model_interpreter.rb +60 -44
- data/lib/hecks/runtime/rebuild_sweep.rb +32 -4
- data/lib/hecks/runtime/reference_hop.rb +48 -6
- data/lib/hecks/runtime/refusal_wording.rb +142 -115
- data/lib/hecks/runtime/registry/saga_persistence.rb +32 -21
- data/lib/hecks/runtime/registry/verification.rb +153 -28
- data/lib/hecks/runtime/registry.rb +202 -32
- data/lib/hecks/runtime/remote_dispatcher.rb +125 -24
- data/lib/hecks/runtime/routing.rb +36 -154
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +25 -27
- data/lib/hecks/runtime/saga_interpreter.rb +90 -76
- data/lib/hecks/runtime/saga_pending_dispatch.rb +12 -12
- data/lib/hecks/runtime/tenant_check.rb +33 -13
- data/lib/hecks/runtime/tenant_scope.rb +23 -5
- data/lib/hecks/runtime/value/admission.rb +75 -30
- data/lib/hecks/runtime/value/coercion.rb +555 -142
- data/lib/hecks/runtime/value/entity_list_coercion.rb +132 -60
- data/lib/hecks/runtime/value.rb +71 -21
- data/lib/hecks/runtime.rb +39 -7
- data/lib/hecks/storehouse.rb +368 -72
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +130 -0
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +32 -0
- data/lib/hecks/version.rb +3 -3
- data/lib/hecks/vocabulary.rb +205 -4
- data/lib/hecks.rb +91 -11
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +19 -11
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +24 -12
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +38 -14
- metadata +28 -2
data/lib/hecks/ir.rb
CHANGED
|
@@ -1,29 +1,32 @@
|
|
|
1
1
|
module Hecks
|
|
2
|
-
#
|
|
2
|
+
# What a construct emits, declared rather than written out.
|
|
3
3
|
#
|
|
4
|
-
# `IR` is a thing this framework
|
|
4
|
+
# `IR` is a thing this framework produces, not a thing its model is.
|
|
5
5
|
# The language self-hosts, and its own bluebook declares aggregates
|
|
6
6
|
# named `Bluebook`, `Aggregate`, `Command`, `Entity`, `ValueObject`,
|
|
7
7
|
# `Policy`, `ReadModel` — there is no `IR` aggregate anywhere in the
|
|
8
8
|
# grammar. Where the grammar's own vision line does say IR it means the
|
|
9
|
-
# emission: "the IR it
|
|
10
|
-
#
|
|
9
|
+
# emission: "the IR it stores must equal the IR the DSL builder
|
|
10
|
+
# produces". `IR_VERSION` says the same thing structurally — a version
|
|
11
11
|
# stamped on `to_h`'s output rather than on the object is a version of
|
|
12
|
-
# the
|
|
12
|
+
# the emission, which only makes sense if the two are different things.
|
|
13
13
|
#
|
|
14
|
-
# So emitting IR is a
|
|
14
|
+
# So emitting IR is a capability a construct has, and this is that
|
|
15
15
|
# capability: `include Hecks::IR` and declare the shape once.
|
|
16
|
-
# The model it emits
|
|
16
|
+
# The model it emits from is `Hecks::Bluebook` — a chapter class
|
|
17
17
|
# nesting everything a chapter declares. It is deliberately not named
|
|
18
18
|
# after this, its own output.
|
|
19
19
|
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
20
|
+
# ## Why declared, not hand-written
|
|
21
|
+
#
|
|
22
|
+
# A hand-written `to_h` per construct would say the same four things in the
|
|
23
|
+
# same order — read a field, recurse into a child, recurse into a list, or
|
|
24
|
+
# compute something — leaving a construct's shape knowable only by reading a
|
|
25
|
+
# method body. Declared, it is data: `ir_spec` can be walked by anything
|
|
26
|
+
# that wants to know what a construct carries, which is the whole point of
|
|
27
|
+
# hanging emission off the model rather than burying it.
|
|
28
|
+
#
|
|
29
|
+
# ## Usage
|
|
27
30
|
#
|
|
28
31
|
# include Hecks::IR # an instance-shaped construct
|
|
29
32
|
#
|
|
@@ -36,18 +39,18 @@ module Hecks
|
|
|
36
39
|
# canonical_form: -> { CanonicalForm.table } # anything else
|
|
37
40
|
# )
|
|
38
41
|
#
|
|
39
|
-
#
|
|
42
|
+
# Key order is the declaration order, and that is load-bearing rather
|
|
40
43
|
# than cosmetic: `spec/golden/ir/*.json` pins the emitted form exactly,
|
|
41
44
|
# so a reordered declaration is a changed artifact and the golden specs
|
|
42
45
|
# will say so.
|
|
43
46
|
module IR
|
|
44
|
-
#
|
|
47
|
+
# The two shapes a construct comes in, and why this module has two
|
|
45
48
|
# doors instead of hiding the difference.
|
|
46
49
|
#
|
|
47
50
|
# `Bluebook`/`Aggregate`/`Policy`/`ReadModel` are ordinary objects —
|
|
48
51
|
# metadata records, one instance per declaration. `Command`/`Entity`/
|
|
49
|
-
# `ValueObject` are anonymous
|
|
50
|
-
# `Command.declare`), because those three are referenced as
|
|
52
|
+
# `ValueObject` are anonymous classes (`Class.new(self)`, see
|
|
53
|
+
# `Command.declare`), because those three are referenced as types in
|
|
51
54
|
# a bluebook (`attribute :price, Money`) and a type has to be a real
|
|
52
55
|
# Ruby constant to be named.
|
|
53
56
|
#
|
|
@@ -57,11 +60,20 @@ module Hecks
|
|
|
57
60
|
# extend Hecks::IR # class-shaped — to_h is a class method
|
|
58
61
|
#
|
|
59
62
|
# Both get the same `emits_ir` and the same emission rules.
|
|
63
|
+
#
|
|
64
|
+
# Wires an instance-shaped construct's declaration and emission sides in.
|
|
65
|
+
#
|
|
66
|
+
# @param base [Class, Module] the includer
|
|
67
|
+
# @return [void]
|
|
60
68
|
def self.included(base)
|
|
61
69
|
base.extend(Declares)
|
|
62
70
|
base.include(Emits)
|
|
63
71
|
end
|
|
64
72
|
|
|
73
|
+
# Wires a class-shaped construct's declaration and emission sides in.
|
|
74
|
+
#
|
|
75
|
+
# @param base [Class, Module] the extender
|
|
76
|
+
# @return [void]
|
|
65
77
|
def self.extended(base)
|
|
66
78
|
base.extend(Declares)
|
|
67
79
|
base.extend(Emits)
|
|
@@ -79,17 +91,36 @@ module Hecks
|
|
|
79
91
|
# back — walking the superclass chain so an anonymous `Class.new(base)`
|
|
80
92
|
# inherits its base's shape instead of redeclaring it.
|
|
81
93
|
module Declares
|
|
94
|
+
# Records this construct's field -> emission-rule map.
|
|
95
|
+
#
|
|
96
|
+
# @param spec [Hash{Symbol => Symbol, Many, One, Proc}] each emitted key,
|
|
97
|
+
# mapped to how it is produced: a Symbol is sent to the construct, `many`/
|
|
98
|
+
# `one` recurse into nested constructs, and a Proc is instance-`exec`'d
|
|
99
|
+
# @return [void]
|
|
82
100
|
def emits_ir(**spec)
|
|
83
101
|
@ir_spec = spec
|
|
84
102
|
end
|
|
85
103
|
|
|
104
|
+
# Marks a field as a list of nested constructs, each emitting itself.
|
|
105
|
+
#
|
|
106
|
+
# @param source [Symbol] the method that returns the list
|
|
107
|
+
# @return [Many] the wrapped source, for `emits_ir`
|
|
86
108
|
def many(source) = Many.new(source)
|
|
109
|
+
|
|
110
|
+
# Marks a field as one nested construct, or nothing.
|
|
111
|
+
#
|
|
112
|
+
# @param source [Symbol] the method that returns the construct, or nil
|
|
113
|
+
# @return [One] the wrapped source, for `emits_ir`
|
|
87
114
|
def one(source) = One.new(source)
|
|
88
115
|
|
|
89
116
|
# Walks the superclass chain so a `Class.new(ValueObject)` — which
|
|
90
|
-
# is what every declared value object actually
|
|
117
|
+
# is what every declared value object actually is — inherits the
|
|
91
118
|
# shape its base declared, rather than each anonymous subclass
|
|
92
119
|
# having to redeclare it.
|
|
120
|
+
#
|
|
121
|
+
# @return [Hash{Symbol => Symbol, Many, One, Proc}, nil] the field -> rule
|
|
122
|
+
# map declared by `emits_ir`, inherited from the nearest superclass that
|
|
123
|
+
# declared one; nil if nothing in the chain ever declared a shape
|
|
93
124
|
def ir_spec
|
|
94
125
|
return @ir_spec if defined?(@ir_spec) && @ir_spec
|
|
95
126
|
|
|
@@ -112,7 +143,7 @@ module Hecks
|
|
|
112
143
|
private
|
|
113
144
|
|
|
114
145
|
# An instance reads its class's declaration; a class-shaped
|
|
115
|
-
# construct
|
|
146
|
+
# construct is the declaration holder.
|
|
116
147
|
def ir_spec_for(construct)
|
|
117
148
|
return construct.ir_spec if construct.respond_to?(:ir_spec)
|
|
118
149
|
|
|
@@ -73,6 +73,26 @@ Hecks.bluebook "Bluebook", version: "1" do
|
|
|
73
73
|
# chapters attach to nothing, and ABSENT IS NOT EMPTY, the same
|
|
74
74
|
# reading `version`/`formerly_known_as` above give.
|
|
75
75
|
attribute :attaches_to, list_of(AttachesToContext)
|
|
76
|
+
# A CAPABILITY THIS CHAPTER ANSWERS FOR OTHER DOMAINS — declared, so
|
|
77
|
+
# nothing downstream has to recognise the chapter BY NAME. One row
|
|
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.
|
|
85
|
+
attribute :provides, list_of(Provision)
|
|
86
|
+
|
|
87
|
+
value_object "Provision" do
|
|
88
|
+
attribute :capability, String
|
|
89
|
+
attribute :key, String
|
|
90
|
+
attribute :verb, String
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
value_object "ProvisionText" do
|
|
94
|
+
attribute :value, String
|
|
95
|
+
end
|
|
76
96
|
|
|
77
97
|
value_object "RuleText" do
|
|
78
98
|
# deliberately permissive : source_token and replacement are legitimately
|
|
@@ -159,6 +179,22 @@ Hecks.bluebook "Bluebook", version: "1" do
|
|
|
159
179
|
emits ChapterAttached
|
|
160
180
|
end
|
|
161
181
|
|
|
182
|
+
# ONE ROW OF ONE CAPABILITY — `provides "authorization", assignments:
|
|
183
|
+
# ..., grant: ..., transitions: ...` offers three, one per key, in the
|
|
184
|
+
# order they were written.
|
|
185
|
+
command "Provide" do
|
|
186
|
+
role "Language"
|
|
187
|
+
goal "Declare one verb this chapter answers a capability with"
|
|
188
|
+
|
|
189
|
+
attribute :capability, ProvisionText
|
|
190
|
+
attribute :key, ProvisionText
|
|
191
|
+
attribute :verb, ProvisionText
|
|
192
|
+
|
|
193
|
+
sets :provides, append: { capability: :capability, key: :key, verb: :verb }
|
|
194
|
+
|
|
195
|
+
emits CapabilityProvided
|
|
196
|
+
end
|
|
197
|
+
|
|
162
198
|
# THE WAY BACK.
|
|
163
199
|
#
|
|
164
200
|
# Until these existed the meta-domain was write-only: twelve categories, 34
|
|
@@ -214,6 +250,7 @@ Hecks.bluebook "Bluebook", version: "1" do
|
|
|
214
250
|
member word: "vision", context: "Bluebook", body: "none", inner: "", opens: "", fills: "vision"
|
|
215
251
|
member word: "formerly_known_as", context: "Bluebook", body: "none", inner: "", opens: "", fills: "formerly_known_as"
|
|
216
252
|
member word: "attaches_to", context: "Bluebook", body: "none", inner: "", opens: "", fills: "attaches_to", calls: "attaches_to_impl"
|
|
253
|
+
member word: "provides", context: "Bluebook", body: "none", inner: "", opens: "", fills: "provides", calls: "provides_impl"
|
|
217
254
|
member word: "core", context: "Bluebook", body: "none", inner: "", opens: "", fills: "classification"
|
|
218
255
|
member word: "supporting", context: "Bluebook", body: "none", inner: "", opens: "", fills: "classification"
|
|
219
256
|
member word: "generic", context: "Bluebook", body: "none", inner: "", opens: "", fills: "classification"
|
|
@@ -246,6 +283,10 @@ Hecks.bluebook "Bluebook", version: "1" do
|
|
|
246
283
|
member keyword: "vision", context: "Bluebook", at: "1", named: "", kind: "text", required: "true", fills: "vision", coerce: "false"
|
|
247
284
|
member keyword: "formerly_known_as", context: "Bluebook", at: "1", named: "", kind: "text", required: "true", fills: "formerly_known_as"
|
|
248
285
|
member keyword: "attaches_to", context: "Bluebook", at: "1", named: "", kind: "text", required: "true", fills: "attaches_to", variadic: "true"
|
|
286
|
+
member keyword: "provides", context: "Bluebook", at: "1", named: "", kind: "text", required: "true", fills: "provides"
|
|
287
|
+
member keyword: "provides", context: "Bluebook", at: "", named: "assignments", kind: "text", required: "false", fills: "provides"
|
|
288
|
+
member keyword: "provides", context: "Bluebook", at: "", named: "grant", kind: "text", required: "false", fills: "provides"
|
|
289
|
+
member keyword: "provides", context: "Bluebook", at: "", named: "transitions", kind: "text", required: "false", fills: "provides"
|
|
249
290
|
member keyword: "aggregate", context: "Bluebook", at: "1", named: "", kind: "text", required: "true", fills: "name"
|
|
250
291
|
member keyword: "read_model", context: "Bluebook", at: "1", named: "", kind: "text", required: "true", fills: "name"
|
|
251
292
|
member keyword: "policy", context: "Bluebook", at: "1", named: "", kind: "text", required: "true", fills: "name"
|
|
@@ -21,6 +21,13 @@ Hecks.bluebook "Bluebook" do
|
|
|
21
21
|
attribute :on_event, PolicyText
|
|
22
22
|
attribute :trigger_command, PolicyText
|
|
23
23
|
attribute :target_domain, PolicyText
|
|
24
|
+
# AN `across` TARGET THIS DOMAIN EXPECTS NEVER TO REACH — declared on
|
|
25
|
+
# the policy that owns the expectation, not held in a core allowlist
|
|
26
|
+
# keyed by domain name. `ModelCheck` honours it both ways: the
|
|
27
|
+
# unknown-target and unacknowledged-relationship findings it would
|
|
28
|
+
# otherwise raise are expected, and a declaration whose target turns
|
|
29
|
+
# out to be known or acknowledged after all is STALE and fails.
|
|
30
|
+
attribute :expect_undelivered, PolicyText
|
|
24
31
|
# THE GUARD, CARRIED AS TEXT — same discipline `Command.givens`
|
|
25
32
|
# already holds: the block that wrote it is never called at
|
|
26
33
|
# runtime, only its EXTRACTED SOURCE is (Ports::Extraction), so
|
|
@@ -92,6 +99,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
92
99
|
attribute :on_event, PolicyText
|
|
93
100
|
attribute :trigger_command, PolicyText
|
|
94
101
|
attribute :target_domain, PolicyText, optional: true
|
|
102
|
+
attribute :expect_undelivered, PolicyText, optional: true
|
|
95
103
|
attribute :where, PolicyText, optional: true
|
|
96
104
|
attribute :for_each, PolicyText, optional: true
|
|
97
105
|
|
|
@@ -102,6 +110,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
102
110
|
sets :on_event
|
|
103
111
|
sets :trigger_command
|
|
104
112
|
sets :target_domain
|
|
113
|
+
sets :expect_undelivered
|
|
105
114
|
sets :where
|
|
106
115
|
sets :for_each
|
|
107
116
|
sets :position
|
|
@@ -153,7 +162,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
153
162
|
|
|
154
163
|
member word: "on", context: "Policy", body: "none", inner: "", opens: "", fills: "on_event", calls: "on_impl"
|
|
155
164
|
member word: "trigger", context: "Policy", body: "none", inner: "", opens: "", fills: "trigger_command", calls: "trigger_impl"
|
|
156
|
-
member word: "across", context: "Policy", body: "none", inner: "", opens: "", fills: "target_domain"
|
|
165
|
+
member word: "across", context: "Policy", body: "none", inner: "", opens: "", fills: "target_domain", calls: "across_impl"
|
|
157
166
|
member word: "where", context: "Policy", body: "source", inner: "", opens: "", fills: "where"
|
|
158
167
|
member word: "for_each", context: "Policy", body: "none", inner: "", opens: "", fills: "for_each"
|
|
159
168
|
|
|
@@ -181,6 +190,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
181
190
|
member keyword: "trigger", context: "Policy", at: "1", named: "", kind: "constant", required: "true", fills: "trigger_command"
|
|
182
191
|
member keyword: "trigger", context: "Policy", at: "1", named: "", kind: "text", required: "true", fills: "trigger_command"
|
|
183
192
|
member keyword: "across", context: "Policy", at: "1", named: "", kind: "text", required: "true", fills: "target_domain"
|
|
193
|
+
member keyword: "across", context: "Policy", at: "", named: "expect_undelivered", kind: "flag", required: "false", fills: "expect_undelivered"
|
|
184
194
|
member keyword: "for_each", context: "Policy", at: "1", named: "", kind: "text", required: "true", fills: "for_each"
|
|
185
195
|
member keyword: "trigger", context: "Policy", at: "", named: "with", kind: "pairs", required: "false", fills: "with_spec", pairs_shape: "verbatim"
|
|
186
196
|
|