hecks 0.2.0 → 1.0.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 +5 -5
- data/lib/hecks/adapters/driven/claude_code.adapter +3 -0
- data/lib/hecks/adapters/driven/claude_code.rb +127 -0
- data/lib/hecks/adapters/driven/d1.adapter +12 -0
- data/lib/hecks/adapters/driven/d1.rb +427 -0
- data/lib/hecks/adapters/driven/folder.adapter +3 -0
- data/lib/hecks/adapters/driven/folder.rb +199 -0
- data/lib/hecks/adapters/driven/google_authentication.adapter +3 -0
- data/lib/hecks/adapters/driven/google_authentication.rb +100 -0
- data/lib/hecks/adapters/driven/governance_authorization.adapter +3 -0
- data/lib/hecks/adapters/driven/governance_authorization.rb +101 -0
- data/lib/hecks/adapters/driven/heki/journal.rb +56 -0
- data/lib/hecks/adapters/driven/heki/saga_store.rb +99 -0
- data/lib/hecks/adapters/driven/heki/snapshot.rb +65 -0
- data/lib/hecks/adapters/driven/heki.adapter +4 -0
- data/lib/hecks/adapters/driven/heki.rb +179 -0
- data/lib/hecks/adapters/driven/identity_registry.adapter +3 -0
- data/lib/hecks/adapters/driven/identity_registry.rb +26 -0
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +51 -0
- data/lib/hecks/adapters/driven/lambda/client.rb +63 -0
- data/lib/hecks/adapters/driven/lambda.adapter +4 -0
- data/lib/hecks/adapters/driven/lambda.rb +145 -0
- data/lib/hecks/adapters/driven/memory.adapter +3 -0
- data/lib/hecks/adapters/driven/memory.rb +103 -0
- data/lib/hecks/adapters/driven/mock_stripe_adapter.adapter +3 -0
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +28 -0
- data/lib/hecks/adapters/driven/postgres/codec.rb +88 -0
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +207 -0
- data/lib/hecks/adapters/driven/postgres.adapter +5 -0
- data/lib/hecks/adapters/driven/postgres.rb +438 -0
- data/lib/hecks/adapters/driven/postgres_era.adapter +17 -0
- data/lib/hecks/adapters/driven/prism.adapter +3 -0
- data/lib/hecks/adapters/driven/prism.rb +80 -0
- data/lib/hecks/adapters/driven/secure_random_identity.adapter +3 -0
- data/lib/hecks/adapters/driven/secure_random_identity.rb +14 -0
- data/lib/hecks/adapters/driven/sql_query_builder.rb +221 -0
- data/lib/hecks/adapters/driven/sqlite/codec.rb +80 -0
- data/lib/hecks/adapters/driven/sqlite/projection.rb +172 -0
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +192 -0
- data/lib/hecks/adapters/driven/sqlite.adapter +9 -0
- data/lib/hecks/adapters/driven/sqlite.rb +306 -0
- data/lib/hecks/adapters/driven/system_clock.adapter +3 -0
- data/lib/hecks/adapters/driven/system_clock.rb +14 -0
- data/lib/hecks/adapters/driven.rb +54 -0
- data/lib/hecks/adapters.rb +6 -0
- data/lib/hecks/behaviors/dsl.rb +125 -0
- data/lib/hecks/behaviors/expectations.rb +340 -0
- data/lib/hecks/behaviors/ir.rb +31 -0
- data/lib/hecks/behaviors/rspec.rb +42 -0
- data/lib/hecks/behaviors/runner.rb +96 -0
- data/lib/hecks/behaviors.rb +25 -0
- data/lib/hecks/bluebook/aggregate.rb +108 -0
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +134 -0
- data/lib/hecks/bluebook/assembly/build.rb +48 -0
- data/lib/hecks/bluebook/assembly/contract.rb +112 -0
- data/lib/hecks/bluebook/assembly/contracts.rb +438 -0
- data/lib/hecks/bluebook/assembly/marks.rb +228 -0
- data/lib/hecks/bluebook/assembly/specializer.rb +70 -0
- data/lib/hecks/bluebook/assembly.rb +91 -0
- data/lib/hecks/bluebook/attribute.rb +96 -0
- data/lib/hecks/bluebook/behaviour/aggregate.rb +83 -0
- data/lib/hecks/bluebook/behaviour/attribute.rb +27 -0
- data/lib/hecks/bluebook/behaviour/chapter.rb +72 -0
- data/lib/hecks/bluebook/behaviour/command.rb +116 -0
- data/lib/hecks/bluebook/behaviour/domain_port.rb +25 -0
- data/lib/hecks/bluebook/behaviour/entity.rb +59 -0
- data/lib/hecks/bluebook/behaviour/hexagon.rb +50 -0
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +68 -0
- data/lib/hecks/bluebook/behaviour/policy.rb +52 -0
- data/lib/hecks/bluebook/behaviour/process_manager.rb +51 -0
- data/lib/hecks/bluebook/behaviour/query.rb +10 -0
- data/lib/hecks/bluebook/behaviour/read_model.rb +29 -0
- data/lib/hecks/bluebook/behaviour/traits.rb +81 -0
- data/lib/hecks/bluebook/behaviour/value_object.rb +33 -0
- data/lib/hecks/bluebook/chapter.rb +78 -0
- data/lib/hecks/bluebook/command.rb +124 -0
- data/lib/hecks/bluebook/domain_port.rb +102 -0
- data/lib/hecks/bluebook/dsl/adapter_builder.rb +34 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +1018 -0
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +348 -0
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +71 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +1087 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +714 -0
- data/lib/hecks/bluebook/dsl/const_shim.rb +81 -0
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +79 -0
- data/lib/hecks/bluebook/dsl/entity_builder.rb +430 -0
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +366 -0
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +163 -0
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +191 -0
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +44 -0
- data/lib/hecks/bluebook/dsl/malformed.rb +7 -0
- data/lib/hecks/bluebook/dsl/policy_builder.rb +135 -0
- data/lib/hecks/bluebook/dsl/port_builder.rb +39 -0
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +142 -0
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +306 -0
- data/lib/hecks/bluebook/dsl/query_builder.rb +113 -0
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +233 -0
- data/lib/hecks/bluebook/dsl/rule_reference.rb +173 -0
- data/lib/hecks/bluebook/dsl/translation_builder.rb +243 -0
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +178 -0
- data/lib/hecks/bluebook/dsl/word_gate.rb +228 -0
- data/lib/hecks/bluebook/dsl/world_builder.rb +117 -0
- data/lib/hecks/bluebook/dsl.rb +45 -0
- data/lib/hecks/bluebook/entity.rb +103 -0
- data/lib/hecks/bluebook/expression/canonical_form.rb +123 -0
- data/lib/hecks/bluebook/expression/evaluator.rb +304 -0
- data/lib/hecks/bluebook/expression/projection.json +218 -0
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +233 -0
- data/lib/hecks/bluebook/expression/resolver.rb +781 -0
- data/lib/hecks/bluebook/expression.rb +13 -0
- data/lib/hecks/bluebook/hexagon.rb +60 -0
- data/lib/hecks/bluebook/lifecycle.rb +42 -0
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +54 -0
- data/lib/hecks/bluebook/meta_validator/judge.rb +621 -0
- data/lib/hecks/bluebook/meta_validator/plan.rb +332 -0
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +51 -0
- data/lib/hecks/bluebook/meta_validator/readings.rb +360 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +351 -0
- data/lib/hecks/bluebook/meta_validator/shapes.rb +266 -0
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +255 -0
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +138 -0
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +78 -0
- data/lib/hecks/bluebook/meta_validator.rb +542 -0
- data/lib/hecks/bluebook/model_check.rb +445 -0
- data/lib/hecks/bluebook/pattern_subset.rb +184 -0
- data/lib/hecks/bluebook/policy.rb +41 -0
- data/lib/hecks/bluebook/process_manager.rb +128 -0
- data/lib/hecks/bluebook/project_discovery.rb +30 -0
- data/lib/hecks/bluebook/project_loader.rb +40 -0
- data/lib/hecks/bluebook/project_register.rb +82 -0
- data/lib/hecks/bluebook/query.rb +61 -0
- data/lib/hecks/bluebook/read_model.rb +109 -0
- data/lib/hecks/bluebook/reference.rb +74 -0
- data/lib/hecks/bluebook/smoke_test.rb +166 -0
- data/lib/hecks/bluebook/synthesizer.rb +95 -0
- data/lib/hecks/bluebook/translation.rb +92 -0
- data/lib/hecks/bluebook/value_object.rb +66 -0
- data/lib/hecks/bluebook.rb +74 -0
- data/lib/hecks/codemod.rb +342 -0
- data/lib/hecks/construct.rb +71 -0
- data/lib/hecks/deploy/bluebook/deploy.bluebook +219 -0
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +4 -0
- data/lib/hecks/deploy/oidc.json +18 -0
- data/lib/hecks/doc/reference.rb +410 -0
- data/lib/hecks/embryonaut_bluebook.rb +75 -0
- data/lib/hecks/facade/cli_door.rb +119 -0
- data/lib/hecks/facade/cli_runner.rb +190 -0
- data/lib/hecks/facade/command_request.rb +105 -0
- data/lib/hecks/facade/handle.rb +173 -0
- data/lib/hecks/facade/json_door.rb +166 -0
- data/lib/hecks/facade/surface/aggregate_door.rb +185 -0
- data/lib/hecks/facade/surface/chapter.rb +107 -0
- data/lib/hecks/facade/surface.rb +48 -0
- data/lib/hecks/facade.rb +44 -0
- data/lib/hecks/forms/app.rb +341 -0
- data/lib/hecks/forms/command_form_renderer.rb +113 -0
- data/lib/hecks/forms/examples/banking_console.bluebook +3 -0
- data/lib/hecks/forms/field_renderer.rb +177 -0
- data/lib/hecks/forms/field_shape.rb +232 -0
- data/lib/hecks/forms/html.rb +84 -0
- data/lib/hecks/forms/index_renderer.rb +35 -0
- data/lib/hecks/forms/page.rb +157 -0
- data/lib/hecks/forms/params.rb +161 -0
- data/lib/hecks/forms/port_argument.rb +46 -0
- data/lib/hecks/forms/query_form_renderer.rb +114 -0
- data/lib/hecks/forms/record_renderer.rb +119 -0
- data/lib/hecks/forms/record_table.rb +68 -0
- data/lib/hecks/forms/reference_options.rb +30 -0
- data/lib/hecks/forms/value_object_shape.rb +46 -0
- data/lib/hecks/forms.rb +54 -0
- data/lib/hecks/fqn.rb +94 -0
- data/lib/hecks/framework/bluebook/compliance.bluebook +1 -0
- data/lib/hecks/framework/bluebook/console_settings.bluebook +489 -0
- data/lib/hecks/framework/bluebook/framework.hecksagon +32 -0
- data/lib/hecks/framework/bluebook/governance.bluebook +145 -0
- data/lib/hecks/framework/bluebook/identity.bluebook +90 -0
- data/lib/hecks/framework/oidc.json +39 -0
- data/lib/hecks/framework.rb +90 -0
- data/lib/hecks/freezer.rb +67 -0
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +527 -0
- data/lib/hecks/fuzzing/invalid_value_generator.rb +86 -0
- data/lib/hecks/fuzzing/isolated_boot.rb +286 -0
- data/lib/hecks/fuzzing/properties.rb +1192 -0
- data/lib/hecks/fuzzing/replay.rb +668 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +93 -0
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +80 -0
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +96 -0
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +250 -0
- data/lib/hecks/fuzzing/sequence_generator.rb +131 -0
- data/lib/hecks/fuzzing/value_generator.rb +200 -0
- data/lib/hecks/fuzzing.rb +12 -0
- data/lib/hecks/grammar/evolve.rb +324 -0
- data/lib/hecks/grammar/expression.bluebook +420 -0
- data/lib/hecks/grammar/expression_operators.json +1648 -0
- data/lib/hecks/grammar/grammar.hecksagon +20 -0
- data/lib/hecks/grammar/oidc.json +69 -0
- data/lib/hecks/grammar/translation.bluebook +203 -0
- data/lib/hecks/grammar.rb +178 -0
- data/lib/hecks/ir.rb +126 -0
- data/lib/hecks/language/adapter.bluebook +116 -0
- data/lib/hecks/language/bluebook/aggregate.bluebook +581 -0
- data/lib/hecks/language/bluebook/attaches/paging.bluebook +76 -0
- data/lib/hecks/language/bluebook/bluebook.bluebook +256 -0
- data/lib/hecks/language/bluebook/bluebook.hecksagon +24 -0
- data/lib/hecks/language/bluebook/command.bluebook +471 -0
- data/lib/hecks/language/bluebook/entity.bluebook +392 -0
- data/lib/hecks/language/bluebook/policy.bluebook +189 -0
- data/lib/hecks/language/bluebook/process_manager.bluebook +381 -0
- data/lib/hecks/language/bluebook/projection.bluebook +267 -0
- data/lib/hecks/language/bluebook/query.bluebook +245 -0
- data/lib/hecks/language/bluebook/shape.bluebook +292 -0
- data/lib/hecks/language/bluebook/syntax.bluebook +448 -0
- data/lib/hecks/language/bluebook/vocabulary.bluebook +379 -0
- data/lib/hecks/language/hecksagon/adapter_binding.bluebook +51 -0
- data/lib/hecks/language/hecksagon/domain_port.bluebook +76 -0
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +131 -0
- data/lib/hecks/language/hecksagon/port_operation.bluebook +102 -0
- data/lib/hecks/language/oidc.json +333 -0
- data/lib/hecks/language/port.bluebook +120 -0
- data/lib/hecks/language/translation/translation.bluebook +110 -0
- data/lib/hecks/language/translation/translation_aggregate.bluebook +267 -0
- data/lib/hecks/language/world/wiring.bluebook +62 -0
- data/lib/hecks/language/world/world.bluebook +84 -0
- data/lib/hecks/literal.rb +125 -0
- data/lib/hecks/naming.rb +174 -0
- data/lib/hecks/ports/access_control.port +9 -0
- data/lib/hecks/ports/access_control.rb +62 -0
- data/lib/hecks/ports/agent/answers.rb +104 -0
- data/lib/hecks/ports/agent.port +8 -0
- data/lib/hecks/ports/agent.rb +167 -0
- data/lib/hecks/ports/authentication.port +6 -0
- data/lib/hecks/ports/authentication.rb +50 -0
- data/lib/hecks/ports/authorization.port +7 -0
- data/lib/hecks/ports/authorization.rb +62 -0
- data/lib/hecks/ports/clock.port +5 -0
- data/lib/hecks/ports/clock.rb +62 -0
- data/lib/hecks/ports/extraction.port +5 -0
- data/lib/hecks/ports/extraction.rb +37 -0
- data/lib/hecks/ports/identity_assignment.port +5 -0
- data/lib/hecks/ports/identity_assignment.rb +45 -0
- data/lib/hecks/ports/identity_generation.port +5 -0
- data/lib/hecks/ports/identity_generation.rb +49 -0
- data/lib/hecks/ports/identity_resolution.port +5 -0
- data/lib/hecks/ports/identity_resolution.rb +40 -0
- data/lib/hecks/ports/loading.port +4 -0
- data/lib/hecks/ports/loading.rb +13 -0
- data/lib/hecks/ports/persistence/append_only.rb +138 -0
- data/lib/hecks/ports/persistence/binding_policy.rb +56 -0
- data/lib/hecks/ports/persistence/execution.rb +23 -0
- data/lib/hecks/ports/persistence/null_saga_store.rb +25 -0
- data/lib/hecks/ports/persistence/plugin.rb +54 -0
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +169 -0
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +128 -0
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +161 -0
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +61 -0
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +304 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +171 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +190 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +478 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +166 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +314 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +168 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +170 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +134 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +137 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +89 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +85 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +43 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +132 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +74 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +758 -0
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +120 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +31 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +46 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +102 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +46 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +70 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +72 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +120 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +183 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +41 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +28 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +30 -0
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +11 -0
- data/lib/hecks/ports/persistence/plugins/era.rb +48 -0
- data/lib/hecks/ports/persistence/remote_runtime.rb +42 -0
- data/lib/hecks/ports/persistence/repository_factory.rb +30 -0
- data/lib/hecks/ports/persistence.port +4 -0
- data/lib/hecks/ports/persistence.rb +39 -0
- data/lib/hecks/ports/projection.port +4 -0
- data/lib/hecks/ports/projection.rb +96 -0
- data/lib/hecks/ports/query/in_memory.rb +60 -0
- data/lib/hecks/ports/query/ordering.rb +41 -0
- data/lib/hecks/ports/query.rb +36 -0
- data/lib/hecks/ports.rb +27 -0
- data/lib/hecks/projections/diagrams.rb +642 -0
- data/lib/hecks/projections/ir.rb +18 -0
- data/lib/hecks/projections/model/deviations.rb +98 -0
- data/lib/hecks/projections/model.rb +145 -0
- data/lib/hecks/projections/oidc.rb +110 -0
- data/lib/hecks/projections/parser_table.rb +159 -0
- data/lib/hecks/projections/reference.rb +38 -0
- data/lib/hecks/projections/shape.rb +44 -0
- data/lib/hecks/projections/statements.rb +110 -0
- data/lib/hecks/projections/vocabulary.rb +100 -0
- data/lib/hecks/projections.rb +32 -0
- data/lib/hecks/projector/cli_projector.rb +446 -0
- data/lib/hecks/projector/docs_projector.rb +321 -0
- data/lib/hecks/projector/exporter.rb +158 -0
- data/lib/hecks/projector/ir_projector.rb +18 -0
- data/lib/hecks/projector/narrate_projector.rb +243 -0
- data/lib/hecks/projector/target.rb +97 -0
- data/lib/hecks/projector.rb +186 -0
- data/lib/hecks/query_ir.rb +411 -0
- data/lib/hecks/query_specification/common/authorization_spec.rb +9 -0
- data/lib/hecks/query_specification/common/comparators.rb +25 -0
- data/lib/hecks/query_specification/common/comparison.rb +174 -0
- data/lib/hecks/query_specification/common/cursor_spec.rb +9 -0
- data/lib/hecks/query_specification/common/dsl.rb +58 -0
- data/lib/hecks/query_specification/common/inspection_spec.rb +9 -0
- data/lib/hecks/query_specification/common/limit_spec.rb +9 -0
- data/lib/hecks/query_specification/common/null_policy.rb +92 -0
- data/lib/hecks/query_specification/common/null_semantics.rb +11 -0
- data/lib/hecks/query_specification/common/offset_spec.rb +9 -0
- data/lib/hecks/query_specification/common/options.rb +32 -0
- data/lib/hecks/query_specification/common/order_by.rb +9 -0
- data/lib/hecks/query_specification/common/specification.rb +10 -0
- data/lib/hecks/query_specification/common/where_clause.rb +9 -0
- data/lib/hecks/query_specification/field_path.rb +107 -0
- data/lib/hecks/query_specification/hop_path.rb +132 -0
- data/lib/hecks/query_specification/read_model/specification.rb +18 -0
- data/lib/hecks/query_specification.rb +14 -0
- data/lib/hecks/rendering.rb +48 -0
- data/lib/hecks/router/namespace_installer.rb +157 -0
- data/lib/hecks/router.rb +70 -0
- data/lib/hecks/runtime/aggregate_lock.rb +45 -0
- data/lib/hecks/runtime/boot_gates.rb +41 -0
- data/lib/hecks/runtime/caller.rb +66 -0
- data/lib/hecks/runtime/capability_graph.rb +44 -0
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +135 -0
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +260 -0
- data/lib/hecks/runtime/command_interpreter.rb +497 -0
- data/lib/hecks/runtime/command_rules/admissibility.rb +357 -0
- data/lib/hecks/runtime/command_rules/arithmetic.rb +260 -0
- data/lib/hecks/runtime/command_rules/authorization.rb +65 -0
- data/lib/hecks/runtime/command_rules/emission.rb +34 -0
- data/lib/hecks/runtime/command_rules/references.rb +189 -0
- data/lib/hecks/runtime/command_rules.rb +28 -0
- data/lib/hecks/runtime/dependency_planning.rb +245 -0
- data/lib/hecks/runtime/dispatcher.rb +301 -0
- data/lib/hecks/runtime/entity_element.rb +253 -0
- data/lib/hecks/runtime/entity_interpreter.rb +299 -0
- data/lib/hecks/runtime/errors.rb +122 -0
- data/lib/hecks/runtime/event.rb +51 -0
- data/lib/hecks/runtime/identity.rb +156 -0
- data/lib/hecks/runtime/instance.rb +175 -0
- data/lib/hecks/runtime/interpreting.rb +90 -0
- data/lib/hecks/runtime/loader.rb +184 -0
- data/lib/hecks/runtime/policy_interpreter.rb +366 -0
- data/lib/hecks/runtime/port_operation_interpreter.rb +210 -0
- data/lib/hecks/runtime/query_interpreter.rb +286 -0
- data/lib/hecks/runtime/reaction_invocation.rb +253 -0
- data/lib/hecks/runtime/read_model_interpreter.rb +341 -0
- data/lib/hecks/runtime/rebuild_sweep.rb +74 -0
- data/lib/hecks/runtime/reference_hop.rb +99 -0
- data/lib/hecks/runtime/refusal_wording.rb +126 -0
- data/lib/hecks/runtime/registry/saga_persistence.rb +142 -0
- data/lib/hecks/runtime/registry/verification.rb +246 -0
- data/lib/hecks/runtime/registry.rb +279 -0
- data/lib/hecks/runtime/remote_dispatcher.rb +143 -0
- data/lib/hecks/runtime/routing.rb +96 -0
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +97 -0
- data/lib/hecks/runtime/saga_interpreter.rb +503 -0
- data/lib/hecks/runtime/saga_pending_dispatch.rb +45 -0
- data/lib/hecks/runtime/tenant_check.rb +84 -0
- data/lib/hecks/runtime/tenant_scope.rb +55 -0
- data/lib/hecks/runtime/value/admission.rb +130 -0
- data/lib/hecks/runtime/value/coercion.rb +565 -0
- data/lib/hecks/runtime/value/invariant_violation.rb +5 -0
- data/lib/hecks/runtime/value.rb +125 -0
- data/lib/hecks/runtime.rb +107 -0
- data/lib/hecks/storehouse.rb +632 -0
- data/lib/hecks/version.rb +16 -0
- data/lib/hecks/vocabulary.rb +218 -0
- data/lib/hecks.rb +123 -6
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +90 -0
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +128 -0
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +160 -0
- metadata +412 -222
- data/bin/hecks +0 -7
- data/bin/hecks-package +0 -65
- data/bin/hecks_console +0 -12
- data/bin/hecks_serverless +0 -6
- data/lib/cli/build.rb +0 -14
- data/lib/cli/command_runner.rb +0 -28
- data/lib/cli/console.rb +0 -10
- data/lib/cli/generate.rb +0 -37
- data/lib/cli/hecks-cli.rb +0 -27
- data/lib/cli/test.rb +0 -57
- data/lib/console/commands.rb +0 -8
- data/lib/console/hecks-console.rb +0 -1
- data/lib/packager/README.md +0 -0
- data/lib/packager/app_runner.rb +0 -21
- data/lib/packager/args.rb +0 -26
- data/lib/packager/compatibility/fixnum.rb +0 -6
- data/lib/packager/hecks.rb +0 -39
- data/lib/packager/query_runner.rb +0 -21
- data/lib/packager/resources/Dockerfile +0 -11
- data/lib/packager/resources/app_binary +0 -7
- data/lib/packager/resources/bundle_config +0 -3
- data/lib/packager/resources/traveling-ruby-20150715-2.2.2-linux-x86_64.tar.gz +0 -0
- data/lib/packager/resources/traveling-ruby-20150715-2.2.2-osx.tar.gz +0 -0
- data/lib/serverless/Domain +0 -32
- data/lib/serverless/cli.rb +0 -75
- data/lib/serverless/resources/command_name.js +0 -5
- data/lib/serverless/resources/environment.js +0 -7
- data/lib/serverless/resources/handler.js.tt +0 -28
- data/lib/serverless/resources/run_binary.js +0 -22
- data/lib/serverless/resources/serverless.yml +0 -20
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
Hecks.bluebook "Identity" do
|
|
2
|
+
vision "Authentication proves an identifier; the organization decides what that identity means."
|
|
3
|
+
# S13, ADR 0025 (coverage standard) — GENERIC, not `supporting`: an
|
|
4
|
+
# OIDC-shaped external identifier is the textbook generic subdomain
|
|
5
|
+
# (Vernon's own example of one), off-the-shelf and buyable —
|
|
6
|
+
# `Governance` (role/scope RBAC beside it) stays `supporting`
|
|
7
|
+
# instead, since ITS OWN model is bespoke to this codebase's actor/
|
|
8
|
+
# role/scope shape, not a drop-in replaceable concept the way an
|
|
9
|
+
# identity provider is.
|
|
10
|
+
generic
|
|
11
|
+
|
|
12
|
+
aggregate "Identity" do
|
|
13
|
+
description "A stable organizational identity, independent of how it was authenticated."
|
|
14
|
+
|
|
15
|
+
attribute :identity_id, IdentityId
|
|
16
|
+
|
|
17
|
+
identified_by :identity_id
|
|
18
|
+
|
|
19
|
+
value_object "IdentityId" do
|
|
20
|
+
attribute :value, String
|
|
21
|
+
invariant("an identity id is present") { !value.to_s.empty? }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# No natural key exists for "a newly recognized identity" — the
|
|
25
|
+
# caller mints identity_id via Ports::IdentityGeneration.uuid
|
|
26
|
+
# before dispatching (see spec/ports/identity_generation_spec.rb),
|
|
27
|
+
# the same pattern proven there against Pizzas.
|
|
28
|
+
command "Register" do
|
|
29
|
+
role "Identity registrar"
|
|
30
|
+
goal "Recognize an identity"
|
|
31
|
+
|
|
32
|
+
attribute :identity_id, IdentityId
|
|
33
|
+
emits IdentityRegistered
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
aggregate "ExternalIdentifier" do
|
|
38
|
+
description "One authenticated (issuer, subject) pair, linked to the identity it proves control of."
|
|
39
|
+
|
|
40
|
+
reference_to Identity
|
|
41
|
+
attribute :key, ExternalIdentifierKey
|
|
42
|
+
attribute :issuer, Issuer
|
|
43
|
+
attribute :subject, Subject
|
|
44
|
+
|
|
45
|
+
identified_by :key
|
|
46
|
+
|
|
47
|
+
value_object "ExternalIdentifierKey" do
|
|
48
|
+
attribute :value, String
|
|
49
|
+
invariant("a key is present") { !value.to_s.empty? }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
value_object "Issuer" do
|
|
53
|
+
attribute :value, String
|
|
54
|
+
invariant("an issuer is present") { !value.to_s.empty? }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
value_object "Subject" do
|
|
58
|
+
attribute :value, String
|
|
59
|
+
invariant("a subject is present") { !value.to_s.empty? }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# `key` is deliberately not derived here — a caller-side concern
|
|
63
|
+
# (e.g. SHA256 of issuer+subject), same as any other identity
|
|
64
|
+
# field this domain never mints itself.
|
|
65
|
+
command "Link" do
|
|
66
|
+
role "Identity registrar"
|
|
67
|
+
goal "Associate an external authenticated subject with an identity"
|
|
68
|
+
|
|
69
|
+
reference_to Identity
|
|
70
|
+
attribute :key, ExternalIdentifierKey
|
|
71
|
+
attribute :issuer, Issuer
|
|
72
|
+
attribute :subject, Subject
|
|
73
|
+
|
|
74
|
+
emits ExternalIdentifierLinked
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# THE OIDC-SHAPED LOOKUP — a token hands over `(issuer, subject)`,
|
|
78
|
+
# never the `key` this aggregate is actually identified by (`key`
|
|
79
|
+
# is a caller-side derivation, deliberately not reproduced here —
|
|
80
|
+
# see `Link`'s own comment). `identity` rides the row already,
|
|
81
|
+
# from `reference_to Identity` above, so a caller reads it straight
|
|
82
|
+
# off the match rather than needing a second query.
|
|
83
|
+
query "ResolvedBy" do
|
|
84
|
+
description "The external identifier linked to this exact (issuer, subject) pair, if any."
|
|
85
|
+
attribute :issuer, Issuer
|
|
86
|
+
attribute :subject, Subject
|
|
87
|
+
where(issuer: :issuer, subject: :subject)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"audience": "Compliance",
|
|
3
|
+
"scopes": [
|
|
4
|
+
{
|
|
5
|
+
"scope": "compliance:account_freeze_review.clear",
|
|
6
|
+
"verb": "Compliance::AccountFreezeReview.Clear",
|
|
7
|
+
"role": "Compliance officer"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"scope": "compliance:account_freeze_review.escalate",
|
|
11
|
+
"verb": "Compliance::AccountFreezeReview.Escalate",
|
|
12
|
+
"role": "Compliance officer"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"scope": "compliance:account_freeze_review.open",
|
|
16
|
+
"verb": "Compliance::AccountFreezeReview.Open",
|
|
17
|
+
"role": "System"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"scope": "compliance:box_surrender_review.clear",
|
|
21
|
+
"verb": "Compliance::BoxSurrenderReview.Clear",
|
|
22
|
+
"role": "Compliance officer"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"scope": "compliance:box_surrender_review.escalate",
|
|
26
|
+
"verb": "Compliance::BoxSurrenderReview.Escalate",
|
|
27
|
+
"role": "Compliance officer"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"scope": "compliance:box_surrender_review.open",
|
|
31
|
+
"verb": "Compliance::BoxSurrenderReview.Open",
|
|
32
|
+
"role": "System"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"roles": [
|
|
36
|
+
"Compliance officer",
|
|
37
|
+
"System"
|
|
38
|
+
]
|
|
39
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
require_relative "runtime/registry"
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
# THE REGISTRY OF FRAMEWORK BLUEBOOKS — Governance, Identity, and
|
|
5
|
+
# whatever lands beside them in `lib/hecks/framework/bluebook/`:
|
|
6
|
+
# domain-agnostic chapters no single example owns, shared by reference
|
|
7
|
+
# rather than copied into every domain that wants one.
|
|
8
|
+
#
|
|
9
|
+
# UNDER `lib/`, not a top-level sibling — a real consumer (embryonaut)
|
|
10
|
+
# vendors ONLY `lib/` (`bin/vendor-hecks`, and this gem's own
|
|
11
|
+
# `hecks.gemspec`, both glob `lib/**/*`), so a `framework/`
|
|
12
|
+
# sitting beside `lib/` rather than inside it packaged and vendored
|
|
13
|
+
# cleanly but left `uses_framework` finding nothing at runtime —
|
|
14
|
+
# `Framework::ROOT` pointed at a directory that simply never shipped.
|
|
15
|
+
# Nothing in THIS repo's own suite caught it, since every spec here
|
|
16
|
+
# reads the working tree directly; only vendoring into a real consumer
|
|
17
|
+
# did. Same reasoning `lib/hecks/language/bluebook/` already
|
|
18
|
+
# settled for the self-hosted grammar's own `.bluebook` files —
|
|
19
|
+
# non-Ruby data a module owns lives inside `lib/` with the code that
|
|
20
|
+
# reads it, not beside it.
|
|
21
|
+
#
|
|
22
|
+
# DERIVED FROM THE DIRECTORY, not hand-listed a second time — the same
|
|
23
|
+
# reasoning `Assembly::CONTRACTS` gives for reading the language's own
|
|
24
|
+
# fields from a table instead of restating them: a member added here
|
|
25
|
+
# and forgotten in a list would be a member `uses_framework` could
|
|
26
|
+
# never find, and a hand-kept list is exactly the shape that goes
|
|
27
|
+
# stale in silence. `spec/corpus_spec.rb`'s own `FRAMEWORK_MEMBERS`
|
|
28
|
+
# glob is the precedent this mirrors.
|
|
29
|
+
#
|
|
30
|
+
# NAMED BY FILE STEM, capitalized — `governance.bluebook` holds
|
|
31
|
+
# `Hecks.bluebook "Governance"`, the same one-to-one spelling every
|
|
32
|
+
# other chapter in this codebase already keeps between its filename
|
|
33
|
+
# and its declared name.
|
|
34
|
+
module Framework
|
|
35
|
+
ROOT = File.expand_path("framework/bluebook", __dir__).freeze
|
|
36
|
+
|
|
37
|
+
def self.members
|
|
38
|
+
Dir.glob(File.join(ROOT, "*.bluebook")).to_h do |path|
|
|
39
|
+
[Naming.pascal(File.basename(path, ".bluebook")), path]
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# LOADED FROM ITS OWN REAL PATH, always — never a copy. A domain
|
|
44
|
+
# booted through `Fuzzing::IsolatedBoot`'s tmp-directory copy still
|
|
45
|
+
# reaches the SAME `framework/bluebook/governance.bluebook` this
|
|
46
|
+
# constant points at, because `uses_framework` runs `Kernel.load`
|
|
47
|
+
# against `ROOT`, not against anything inside the copied domain
|
|
48
|
+
# directory — there is nothing here for a relocated copy to break,
|
|
49
|
+
# the way a symlink carried along with the copy would.
|
|
50
|
+
#
|
|
51
|
+
# ONLY THE BLUEBOOK — a framework member's own `.hecksagon`, if it
|
|
52
|
+
# has one, is NOT auto-loaded. Persistence is a WIRING decision, the
|
|
53
|
+
# same as any other aggregate's, and belongs to whoever is doing the
|
|
54
|
+
# deploying, not to a default baked into the framework member
|
|
55
|
+
# itself: a consuming app needs `Governance::RoleAssignment` durable
|
|
56
|
+
# (Postgres, say), and a framework member hard-coding Memory for its
|
|
57
|
+
# own specs would silently make that decision FOR every app that
|
|
58
|
+
# attaches it. The consuming app declares its OWN, SEPARATE
|
|
59
|
+
# `Hecks.hecksagon "Governance" do ... end` block for that — not
|
|
60
|
+
# binds folded into its own hecksagon, which would build but never
|
|
61
|
+
# resolve: `Ports::Persistence::BindingPolicy.resolve` looks up
|
|
62
|
+
# `registry.hecksagon` by the AGGREGATE's own domain name, not the
|
|
63
|
+
# domain doing the binding, the one invariant this runtime holds
|
|
64
|
+
# everywhere else too. See `examples/banking/bluebook/banking.hecksagon`
|
|
65
|
+
# for the pattern — a real `.hecksagon` file can hold more than one
|
|
66
|
+
# `Hecks.hecksagon` call, one per domain it wires.
|
|
67
|
+
# IDEMPOTENT, PER REGISTRY — `uses_framework` is now called more than
|
|
68
|
+
# once for the SAME member within a single boot (S8: a domain
|
|
69
|
+
# attaching Governance for its own role check, plus a framework
|
|
70
|
+
# sibling attaching it too, e.g. `banking.hecksagon`'s Identity
|
|
71
|
+
# block). `Kernel.load` always re-executes the file, unlike
|
|
72
|
+
# `require`, so a second call would re-run `Hecks.bluebook
|
|
73
|
+
# "Governance"` a second time — and the self-hosting meta-domain
|
|
74
|
+
# records every declaration as a real dispatched command against its
|
|
75
|
+
# own ledger, so a second `Declare` for the SAME aggregate is a real
|
|
76
|
+
# `AlreadyExists`, not a no-op. Skipped once the member's bluebook is
|
|
77
|
+
# already registered in THIS registry — the same chapter, not merely
|
|
78
|
+
# a same-named one from a stale prior boot.
|
|
79
|
+
def self.load!(name)
|
|
80
|
+
path = members.fetch(name.to_s) do
|
|
81
|
+
raise Runtime::WiringError,
|
|
82
|
+
"no framework member named #{name.inspect} — known: #{members.keys.sort.join(', ')}"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
return if Hecks.current_registry.bluebook(name.to_s)
|
|
86
|
+
|
|
87
|
+
Kernel.load(path)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
# THE ONE PLACE THAT KNOWS HOW TO FREEZE A DOMAIN VALUE.
|
|
3
|
+
#
|
|
4
|
+
# Freezing here has been fixed four times in four places, each time by
|
|
5
|
+
# topping the container and leaving the contents: list attributes, the
|
|
6
|
+
# event log, query rows, and value objects. `.freeze` on a Hash stops a
|
|
7
|
+
# key being added or removed and NOTHING ELSE — the String, Array or
|
|
8
|
+
# Hash a field holds stays mutable, so a caller reaches straight
|
|
9
|
+
# through and edits in place. Each fix looked complete and none was.
|
|
10
|
+
#
|
|
11
|
+
# WHAT SHOULD BE FROZEN, and why it is not everything:
|
|
12
|
+
#
|
|
13
|
+
# A VALUE OBJECT has no identity to change over. `with` already
|
|
14
|
+
# answers a new one rather than mutating, so freezing it through is
|
|
15
|
+
# what it always claimed to be.
|
|
16
|
+
#
|
|
17
|
+
# AN EMITTED EVENT is a record of something that happened. A mutable
|
|
18
|
+
# audit trail is not one.
|
|
19
|
+
#
|
|
20
|
+
# A QUERY ROW is an answer, not a handle — mutating one edits nobody's
|
|
21
|
+
# state and silently disagrees with the store.
|
|
22
|
+
#
|
|
23
|
+
# AN INSTANCE'S STATE is NOT frozen, deliberately: the interpreter
|
|
24
|
+
# builds it up across a dispatch, and a command's whole job is to
|
|
25
|
+
# change it. Its VALUES are frozen; the holder is not.
|
|
26
|
+
#
|
|
27
|
+
# A COMMAND'S ARGUMENTS are not frozen either. They arrive from
|
|
28
|
+
# outside, are normalised and coerced on the way in, and the coerced
|
|
29
|
+
# result is what becomes a frozen value.
|
|
30
|
+
module Freezer
|
|
31
|
+
module_function
|
|
32
|
+
|
|
33
|
+
# Numbers, symbols, nil and booleans are already immediate or frozen;
|
|
34
|
+
# a Value froze itself when it was built. What is left is the mutable
|
|
35
|
+
# trio, and each has to be WALKED rather than topped.
|
|
36
|
+
def deep(held)
|
|
37
|
+
case held
|
|
38
|
+
when Hash then held.each_value { |inner| deep(inner) }.freeze
|
|
39
|
+
when Array then held.each { |inner| deep(inner) }.freeze
|
|
40
|
+
when String then held.freeze
|
|
41
|
+
else held
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# The question a gate asks, rather than the act. Answers false for the
|
|
46
|
+
# FIRST thing that is reachable and mutable, which is what makes a
|
|
47
|
+
# failure message worth reading.
|
|
48
|
+
def deeply_frozen?(held) = unfrozen_within(held).nil?
|
|
49
|
+
|
|
50
|
+
# The path to the first mutable thing reachable from `held`, or nil.
|
|
51
|
+
# A path rather than a boolean because "something in this event is
|
|
52
|
+
# mutable" is not an actionable sentence.
|
|
53
|
+
def unfrozen_within(held, path = [])
|
|
54
|
+
return (path.empty? ? "(the value itself)" : path.join(".")) unless immune?(held) || held.frozen?
|
|
55
|
+
|
|
56
|
+
case held
|
|
57
|
+
when Hash then held.lazy.filter_map { |key, inner| unfrozen_within(inner, path + [key.to_s]) }.first
|
|
58
|
+
when Array then held.each_with_index.lazy.filter_map { |inner, i| unfrozen_within(inner, path + [i.to_s]) }.first
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Immediates are frozen in every Ruby that matters, but asking
|
|
63
|
+
# `frozen?` of them and trusting the answer has bitten enough people
|
|
64
|
+
# that it is worth being explicit.
|
|
65
|
+
def immune?(held) = held.nil? || held == true || held == false || held.is_a?(Numeric) || held.is_a?(Symbol)
|
|
66
|
+
end
|
|
67
|
+
end
|