hecks 2.8.0 → 3.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 +4 -4
- data/exe/hecks +50 -7
- 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 +32 -100
- 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 +10 -32
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
- data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
- data/lib/hecks/adapters/driven/postgres.rb +149 -136
- data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
- data/lib/hecks/adapters/driven/prism.rb +48 -38
- 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 +76 -62
- 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 +32 -142
- 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/bench/cli.rb +62 -0
- data/lib/hecks/bench/environment.rb +71 -0
- data/lib/hecks/bench/postgres_probe.rb +30 -0
- data/lib/hecks/bench/report.rb +76 -0
- data/lib/hecks/bench/ruby_runner.rb +93 -0
- data/lib/hecks/bench/run.rb +55 -0
- data/lib/hecks/bench/rust_runner.rb +101 -0
- data/lib/hecks/bench/stats.rb +46 -0
- data/lib/hecks/bench/suite.rb +98 -0
- data/lib/hecks/bench/workload.rb +89 -0
- data/lib/hecks/bench.rb +17 -0
- 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 +56 -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 +39 -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 +11 -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 +16 -50
- data/lib/hecks/bluebook/command.rb +23 -81
- data/lib/hecks/bluebook/domain_port.rb +49 -67
- 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 +96 -708
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +63 -169
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +3 -1
- 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 +42 -89
- 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 +148 -197
- 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 +38 -43
- 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 +46 -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 +39 -661
- data/lib/hecks/bluebook/hexagon.rb +18 -33
- 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 +25 -176
- data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -306
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
- data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
- data/lib/hecks/bluebook/meta_validator.rb +87 -352
- data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
- data/lib/hecks/bluebook/model_check.rb +122 -596
- data/lib/hecks/bluebook/pattern_subset.rb +49 -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 +27 -51
- data/lib/hecks/bluebook/read_model.rb +57 -81
- data/lib/hecks/bluebook/reference.rb +7 -41
- data/lib/hecks/bluebook/smoke_test.rb +9 -99
- 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/canonical_json.rb +30 -0
- data/lib/hecks/chapters.rb +102 -0
- data/lib/hecks/cli/behaviors.rb +61 -0
- data/lib/hecks/cli/canonicalise.rb +25 -0
- data/lib/hecks/cli/check_engine_agreement.rb +32 -0
- data/lib/hecks/cli/check_era.rb +88 -0
- data/lib/hecks/cli/console.rb +66 -0
- data/lib/hecks/cli/deploy_template_diff.rb +40 -0
- data/lib/hecks/cli/doc_coverage.rb +32 -0
- data/lib/hecks/cli/document.rb +5 -23
- data/lib/hecks/cli/expression_projection.rb +41 -0
- data/lib/hecks/cli/follow.rb +88 -0
- data/lib/hecks/cli/history.rb +44 -0
- data/lib/hecks/cli/ir.rb +4 -6
- data/lib/hecks/cli/mcp.rb +5 -6
- data/lib/hecks/cli/model_check.rb +24 -88
- data/lib/hecks/cli/pattern_cases.rb +47 -0
- data/lib/hecks/cli/present.rb +39 -0
- data/lib/hecks/cli/project_cli.rb +223 -64
- data/lib/hecks/cli/project_diagrams.rb +4 -10
- data/lib/hecks/cli/project_glossary.rb +44 -0
- data/lib/hecks/cli/reference.rb +46 -0
- data/lib/hecks/cli/refresh_projections.rb +44 -0
- data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +150 -0
- data/lib/hecks/cli/release.rb +70 -0
- data/lib/hecks/cli/release_gem.rb +59 -0
- data/lib/hecks/cli/rspec_io_parallel_files.rb +137 -0
- data/lib/hecks/cli/rspec_shard_files.rb +66 -0
- data/lib/hecks/cli/run.rb +15 -61
- data/lib/hecks/cli/seed_semantics_corpus.rb +71 -0
- data/lib/hecks/cli/serve_query_ir_mcp.rb +30 -0
- data/lib/hecks/cli/shape.rb +70 -0
- data/lib/hecks/cli/smoke_http.rb +230 -0
- data/lib/hecks/cli/smoke_test.rb +7 -19
- data/lib/hecks/cli/spec_example.rb +27 -0
- data/lib/hecks/cli/statements.rb +32 -0
- data/lib/hecks/cli/stores.rb +4 -6
- data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
- data/lib/hecks/cli.rb +216 -73
- data/lib/hecks/codemod.rb +324 -0
- data/lib/hecks/construct.rb +8 -34
- data/lib/hecks/corpus.rb +423 -0
- data/lib/hecks/deploy/bluebook/deploy.bluebook +617 -158
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -11
- data/lib/hecks/deploy/oidc.json +82 -2
- data/lib/hecks/doc/reference.rb +351 -0
- data/lib/hecks/doors/cli_door.rb +196 -0
- data/lib/hecks/doors/cli_runner.rb +297 -0
- data/lib/hecks/{facade → doors}/command_request.rb +14 -34
- data/lib/hecks/doors/handle.rb +206 -0
- data/lib/hecks/doors/json_door.rb +132 -0
- data/lib/hecks/doors/launcher_options.rb +129 -0
- data/lib/hecks/{cli → doors}/mcp_door.rb +25 -120
- data/lib/hecks/doors/mcp_door_scope.rb +97 -0
- data/lib/hecks/doors/ruby_door/aggregate_door.rb +162 -0
- data/lib/hecks/doors/ruby_door/chapter.rb +72 -0
- data/lib/hecks/doors/ruby_door.rb +77 -0
- data/lib/hecks/doors.rb +61 -0
- 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 +5 -72
- data/lib/hecks/engine_agreement.rb +156 -0
- data/lib/hecks/facade.rb +23 -51
- data/lib/hecks/forms/app.rb +21 -76
- data/lib/hecks/forms/banking_presentation.rb +50 -0
- 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 +31 -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/fuzzing/bounded_exhaustive_expressions.rb +393 -0
- data/lib/hecks/fuzzing/combination_miner.rb +86 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +214 -0
- data/lib/hecks/fuzzing/coverage_campaign.rb +143 -0
- data/lib/hecks/fuzzing/differential.rb +156 -0
- data/lib/hecks/fuzzing/domain_generator.rb +615 -0
- data/lib/hecks/fuzzing/era_boundary.rb +71 -0
- data/lib/hecks/fuzzing/form_census.rb +136 -0
- data/lib/hecks/fuzzing/generated_domain_check.rb +93 -0
- data/lib/hecks/fuzzing/invalid_value_generator.rb +64 -0
- data/lib/hecks/fuzzing/isolated_boot.rb +301 -0
- data/lib/hecks/fuzzing/nondeterministic.rb +51 -0
- data/lib/hecks/fuzzing/outside_world.rb +45 -0
- data/lib/hecks/fuzzing/persistence_parity.rb +102 -0
- data/lib/hecks/fuzzing/properties/corrections.rb +88 -0
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +314 -0
- data/lib/hecks/fuzzing/properties/guards.rb +190 -0
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +300 -0
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +93 -0
- data/lib/hecks/fuzzing/properties/outbox.rb +89 -0
- data/lib/hecks/fuzzing/properties/querying.rb +175 -0
- data/lib/hecks/fuzzing/properties.rb +162 -0
- data/lib/hecks/fuzzing/qa_settings.rb +123 -0
- data/lib/hecks/fuzzing/replay.rb +505 -0
- data/lib/hecks/fuzzing/rotation_priority.rb +48 -0
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +108 -0
- data/lib/hecks/fuzzing/self_consistency.rb +339 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +385 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +132 -0
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +95 -0
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +77 -0
- data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +109 -0
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +237 -0
- data/lib/hecks/fuzzing/sequence_generator.rb +189 -0
- data/lib/hecks/fuzzing/shrinker.rb +166 -0
- data/lib/hecks/fuzzing/structural_skips.rb +33 -0
- data/lib/hecks/fuzzing/sweep_depth.rb +43 -0
- data/lib/hecks/fuzzing/target_capabilities.rb +163 -0
- data/lib/hecks/fuzzing/value_generator.rb +216 -0
- data/lib/hecks/fuzzing.rb +23 -0
- data/lib/hecks/grammar/evolve.rb +336 -0
- 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/hecks/adapters/codebase/codemods.rb +45 -0
- data/lib/hecks/hecks/adapters/codebase/conformance.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +202 -0
- data/lib/hecks/hecks/adapters/codebase/gem_registry.rb +80 -0
- data/lib/hecks/hecks/adapters/codebase/kernel_tables.rb +54 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +240 -0
- data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +102 -0
- data/lib/hecks/hecks/adapters/codebase/publishing.rb +142 -0
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +67 -0
- data/lib/hecks/hecks/adapters/codebase/release_facts.rb +90 -0
- data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +83 -0
- data/lib/hecks/hecks/adapters/codebase/secret_vault.rb +36 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.adapter +7 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +189 -0
- data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/style.rb +171 -0
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +55 -0
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +165 -0
- data/lib/hecks/hecks/adapters/codebase/tree.rb +111 -0
- data/lib/hecks/hecks/adapters/console_capture.rb +79 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.rb +108 -0
- data/lib/hecks/hecks/adapters/git.adapter +7 -0
- data/lib/hecks/hecks/adapters/git.rb +102 -0
- data/lib/hecks/hecks/adapters/host_http.adapter +7 -0
- data/lib/hecks/hecks/adapters/host_http.rb +65 -0
- data/lib/hecks/hecks/adapters/in_process_boot.adapter +7 -0
- data/lib/hecks/hecks/adapters/in_process_boot.rb +197 -0
- data/lib/hecks/hecks/adapters/in_process_operations.rb +202 -0
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +143 -0
- data/lib/hecks/hecks/adapters/journal_store/compaction.rb +145 -0
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +132 -0
- data/lib/hecks/hecks/adapters/journal_store/examination.rb +135 -0
- data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +163 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +187 -0
- data/lib/hecks/hecks/adapters/journal_store.adapter +7 -0
- data/lib/hecks/hecks/adapters/journal_store.rb +64 -0
- data/lib/hecks/hecks/adapters/local_files.adapter +7 -0
- data/lib/hecks/hecks/adapters/local_files.rb +46 -0
- data/lib/hecks/hecks/adapters/pg_admin.adapter +7 -0
- data/lib/hecks/hecks/adapters/pg_admin.rb +245 -0
- data/lib/hecks/hecks/adapters/process_pool.adapter +7 -0
- data/lib/hecks/hecks/adapters/process_pool.rb +119 -0
- data/lib/hecks/hecks/adapters/rust_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +179 -0
- data/lib/hecks/hecks/adapters/rust_workspace.rb +150 -0
- data/lib/hecks/hecks/adapters/shell.adapter +7 -0
- data/lib/hecks/hecks/adapters/shell.rb +49 -0
- data/lib/hecks/hecks/adapters/terminal.adapter +7 -0
- data/lib/hecks/hecks/adapters/terminal.rb +74 -0
- data/lib/hecks/hecks/codebase.behaviors +172 -0
- data/lib/hecks/hecks/codebase.bluebook +2453 -0
- data/lib/hecks/hecks/context_map.hecksagon +13 -0
- data/lib/hecks/hecks/custodian.behaviors +179 -0
- data/lib/hecks/hecks/custodian.bluebook +1847 -0
- data/lib/hecks/hecks/deploy.behaviors +74 -0
- data/lib/hecks/hecks/deploy.world +12 -0
- data/lib/hecks/hecks/environments/memory.world +10 -0
- data/lib/hecks/hecks/governance.world +7 -0
- data/lib/hecks/hecks/hecks.behaviors +62 -0
- data/lib/hecks/hecks/hecks.bluebook +124 -0
- data/lib/hecks/hecks/hecks.hecksagon +390 -0
- data/lib/hecks/hecks/hecks.world +42 -0
- data/lib/hecks/ir.rb +14 -83
- data/lib/hecks/kernel_capabilities.rb +194 -0
- 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 +26 -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 +19 -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 +83 -198
- data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
- data/lib/hecks/language/hecksagon/domain_port.bluebook +14 -19
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +26 -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_stdio_guard.rb +4 -41
- data/lib/hecks/naming.rb +29 -137
- data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
- data/lib/hecks/persistence_legacy_fixture.rb +113 -0
- 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 +44 -144
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +20 -85
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +18 -24
- 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 +19 -76
- 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 +43 -127
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +131 -555
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
- data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +227 -0
- 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 +50 -47
- 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/translation.rb +1 -0
- 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 +47 -108
- 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/projection_files.rb +285 -0
- data/lib/hecks/projections/bootstrap_table.rb +12 -44
- 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 +40 -207
- data/lib/hecks/projections/deploy/lambda.rb +191 -708
- 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/preview.sh.erb +1 -1
- 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 +3 -59
- data/lib/hecks/projections/deploy/preview.rb +2 -67
- data/lib/hecks/projections/deploy/scripts/deploy-service.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts/expected-era.header +1 -1
- data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +3 -3
- data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
- data/lib/hecks/projections/deploy/scripts/smoke-after-deploy.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts.rb +4 -57
- data/lib/hecks/projections/deploy/shared.rb +48 -147
- 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 +22 -584
- 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 +16 -43
- data/lib/hecks/projections/model.rb +12 -51
- data/lib/hecks/projections/oidc.rb +12 -56
- data/lib/hecks/projections/parser_table.rb +13 -32
- data/lib/hecks/projections/reference.rb +4 -18
- data/lib/hecks/projections/rust_vocabulary.rb +13 -251
- 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 +154 -400
- 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/quality_control/adapters/agent.adapter +7 -0
- data/lib/hecks/quality_control/adapters/agent.rb +58 -0
- data/lib/hecks/quality_control/adapters/angle_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/angle_tools.rb +15 -0
- data/lib/hecks/quality_control/adapters/clearance_recorder.rb +36 -0
- data/lib/hecks/quality_control/adapters/clearance_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/clearance_tools.rb +17 -0
- data/lib/hecks/quality_control/adapters/git_pr.adapter +7 -0
- data/lib/hecks/quality_control/adapters/git_pr.rb +226 -0
- data/lib/hecks/quality_control/adapters/github_checks.adapter +9 -0
- data/lib/hecks/quality_control/adapters/github_checks.rb +83 -0
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +56 -0
- data/lib/hecks/quality_control/adapters/github_issues.adapter +7 -0
- data/lib/hecks/quality_control/adapters/github_issues.rb +49 -0
- data/lib/hecks/quality_control/adapters/qa_tool.rb +59 -0
- data/lib/hecks/quality_control/adapters/sweep_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/sweep_tools.rb +51 -0
- data/lib/hecks/quality_control/adapters/target_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/target_tools.rb +43 -0
- data/lib/hecks/quality_control/cli/child.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +248 -0
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +163 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains.rb +450 -0
- data/lib/hecks/quality_control/cli/qa_log_bug.rb +195 -0
- data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +220 -0
- data/lib/hecks/quality_control/cli/qa_open_pr.rb +305 -0
- data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +154 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +159 -0
- data/lib/hecks/quality_control/cli/qa_pr_check.rb +232 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles.rb +142 -0
- data/lib/hecks/quality_control/cli/qa_seed_targets.rb +69 -0
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +280 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +329 -0
- data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +92 -0
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +117 -0
- data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +175 -0
- data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_sweep.rb +611 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +274 -0
- data/lib/hecks/quality_control/quality_control.bluebook +2224 -0
- data/lib/hecks/quality_control/quality_control.hecksagon +13 -0
- data/lib/hecks/quality_control/quality_control.ports.hecksagon +54 -0
- data/lib/hecks/query_ir.rb +346 -0
- data/lib/hecks/query_ir_mcp.rb +198 -0
- 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 +5 -8
- data/lib/hecks/release/runner/clean_tree.rb +42 -0
- data/lib/hecks/release/runner/commands.rb +2 -4
- data/lib/hecks/release/runner/console.rb +6 -0
- data/lib/hecks/release/runner/gem_publisher.rb +15 -9
- data/lib/hecks/release/runner/npm_publisher.rb +9 -53
- data/lib/hecks/release/runner/preflight.rb +29 -20
- data/lib/hecks/release/runner/published.rb +8 -26
- data/lib/hecks/release/runner/tagger.rb +31 -23
- data/lib/hecks/release/runner.rb +60 -38
- data/lib/hecks/rendering.rb +4 -26
- data/lib/hecks/router/namespace_installer.rb +15 -39
- data/lib/hecks/router.rb +4 -8
- data/lib/hecks/runtime/adapter_lookup.rb +124 -0
- 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 +27 -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 +50 -104
- data/lib/hecks/runtime/dispatcher.rb +134 -243
- 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 +14 -70
- data/lib/hecks/runtime/invocation.rb +28 -164
- data/lib/hecks/runtime/loader.rb +109 -194
- data/lib/hecks/runtime/outbox.rb +39 -262
- data/lib/hecks/runtime/policy_interpreter.rb +43 -202
- data/lib/hecks/runtime/port_operation_interpreter.rb +28 -97
- data/lib/hecks/runtime/query_interpreter.rb +122 -187
- data/lib/hecks/runtime/reaction_invocation.rb +36 -138
- data/lib/hecks/runtime/reaction_outcome.rb +89 -0
- 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 +28 -87
- data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
- data/lib/hecks/runtime/registry/verification.rb +213 -227
- data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
- data/lib/hecks/runtime/registry.rb +156 -247
- data/lib/hecks/runtime/remote_dispatcher.rb +68 -154
- 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 +162 -760
- data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
- data/lib/hecks/runtime/value/field_checks.rb +172 -0
- data/lib/hecks/runtime/value.rb +15 -84
- data/lib/hecks/runtime.rb +35 -69
- data/lib/hecks/rust_build/conformance.rb +158 -0
- data/lib/hecks/rust_build/conformance_fuzz.rb +71 -0
- data/lib/hecks/rust_build/coverage.rb +218 -0
- data/lib/hecks/rust_build/native_build.rb +124 -0
- data/lib/hecks/rust_build/project_rust/root_mod.rb +120 -0
- data/lib/hecks/rust_build/project_rust.rb +332 -0
- data/lib/hecks/rust_build/wasm.rb +105 -0
- data/lib/hecks/rust_build/wasm_browser.rb +113 -0
- data/lib/hecks/rust_build.rb +144 -0
- data/lib/hecks/storehouse.rb +155 -582
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +10 -34
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
- data/lib/hecks/three_zero/forms.yml +127 -0
- data/lib/hecks/three_zero.rb +12 -0
- data/lib/hecks/tools/argument_gate_matrix.rb +316 -0
- data/lib/hecks/tools/comment_style.rb +1070 -0
- data/lib/hecks/tools/corpus_report.rb +87 -0
- data/lib/hecks/tools/deploy_recipe.rb +255 -0
- data/lib/hecks/tools/deploy_recipe_lint.rb +282 -0
- data/lib/hecks/tools/drop_implicit_append_fields.rb +95 -0
- data/lib/hecks/tools/era_projection_backfill.rb +94 -0
- data/lib/hecks/tools/era_reattest.rb +146 -0
- data/lib/hecks/tools/evolve_run.rb +189 -0
- data/lib/hecks/tools/fuzz_sweep.rb +373 -0
- data/lib/hecks/tools/heki_compaction.rb +100 -0
- data/lib/hecks/tools/hoist_local_givens.rb +246 -0
- data/lib/hecks/tools/journal_compaction.rb +89 -0
- data/lib/hecks/tools/oidc_manifests.rb +70 -0
- data/lib/hecks/tools/query_ir_run.rb +81 -0
- data/lib/hecks/tools/regeneration_run.rb +166 -0
- data/lib/hecks/tools/rust_comment_style.rb +642 -0
- data/lib/hecks/tools/sequence_script.rb +62 -0
- data/lib/hecks/tools/tail_merge.rb +117 -0
- data/lib/hecks/tools/tenant_provisioning.rb +142 -0
- data/lib/hecks/tools/translation_audit.rb +208 -0
- data/lib/hecks/tools/translation_scaffold.rb +131 -0
- data/lib/hecks/tools.rb +86 -0
- 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 +52 -90
- 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
- data/qa/settings.yml +66 -0
- data/rust/.cargo/config.toml +6 -0
- data/rust/.gitignore +2 -0
- data/rust/Cargo.lock +54 -0
- data/rust/Cargo.toml +61 -0
- data/rust/build/.cargo/config.toml +3 -0
- data/rust/build/.gitignore +1 -0
- data/rust/build/Cargo.lock +7 -0
- data/rust/build/Cargo.toml +19 -0
- data/rust/build/src/build_artifact.rs +47 -0
- data/rust/build/src/cargo_sync.rs +248 -0
- data/rust/build/src/json.rs +421 -0
- data/rust/build/src/lineage_pass.rs +285 -0
- data/rust/build/src/main.rs +51 -0
- data/rust/build/src/optional_pass.rs +150 -0
- data/rust/build/src/pipeline.rs +264 -0
- data/rust/build/src/reserved_names.rs +76 -0
- data/rust/build/src/resolve.rs +124 -0
- data/rust/build/src/root.rs +25 -0
- data/rust/build/src/sidecars.rs +73 -0
- data/rust/build/src/subprocess.rs +51 -0
- data/rust/build/src/tmp.rs +31 -0
- data/rust/codegen/.cargo/config.toml +3 -0
- data/rust/codegen/.gitignore +1 -0
- data/rust/codegen/Cargo.lock +7 -0
- data/rust/codegen/Cargo.toml +20 -0
- data/rust/codegen/src/attr.rs +32 -0
- data/rust/codegen/src/bridging.rs +481 -0
- data/rust/codegen/src/commands.rs +1226 -0
- data/rust/codegen/src/constraints.rs +109 -0
- data/rust/codegen/src/dependency_planning.rs +209 -0
- data/rust/codegen/src/domain_generator.rs +1288 -0
- data/rust/codegen/src/exemplar.rs +230 -0
- data/rust/codegen/src/expr_emitter.rs +87 -0
- data/rust/codegen/src/fielded.rs +192 -0
- data/rust/codegen/src/hecks_naming.rs +33 -0
- data/rust/codegen/src/json.rs +335 -0
- data/rust/codegen/src/json_codec.rs +697 -0
- data/rust/codegen/src/literal.rs +207 -0
- data/rust/codegen/src/main.rs +290 -0
- data/rust/codegen/src/manifest.rs +227 -0
- data/rust/codegen/src/mutations.rs +784 -0
- data/rust/codegen/src/naming.rs +286 -0
- data/rust/codegen/src/ports.rs +208 -0
- data/rust/codegen/src/prelude.rs +116 -0
- data/rust/codegen/src/queries.rs +786 -0
- data/rust/codegen/src/reactions.rs +532 -0
- data/rust/codegen/src/read_models.rs +697 -0
- data/rust/codegen/src/reference_specs.rs +40 -0
- data/rust/codegen/src/registry.rs +966 -0
- data/rust/codegen/src/reserved_names.rs +76 -0
- data/rust/codegen/src/shared.rs +93 -0
- data/rust/codegen/src/skip_reason.rs +25 -0
- data/rust/codegen/src/types.rs +362 -0
- data/rust/host/.cargo/config.toml +3 -0
- data/rust/host/.gitignore +1 -0
- data/rust/host/Cargo.lock +4297 -0
- data/rust/host/Cargo.toml +61 -0
- data/rust/host/HECKS_RELEASE +1 -0
- data/rust/host/rds-ca-bundle.pem +2736 -0
- data/rust/host/src/api.rs +1596 -0
- data/rust/host/src/approval.rs +652 -0
- data/rust/host/src/auth.rs +1287 -0
- data/rust/host/src/bin/expr_harness.rs +46 -0
- data/rust/host/src/bin/lineage_harness.rs +119 -0
- data/rust/host/src/bin/mint_harness.rs +135 -0
- data/rust/host/src/checkout.rs +265 -0
- data/rust/host/src/dispatch.rs +1443 -0
- data/rust/host/src/expr_json.rs +1117 -0
- data/rust/host/src/field_hints.rs +52 -0
- data/rust/host/src/ir.rs +733 -0
- data/rust/host/src/journal.rs +874 -0
- data/rust/host/src/lambda_client.rs +378 -0
- data/rust/host/src/log.rs +147 -0
- data/rust/host/src/main.rs +474 -0
- data/rust/host/src/mint.rs +1865 -0
- data/rust/host/src/payments/keystore.rs +330 -0
- data/rust/host/src/payments/tests.rs +1400 -0
- data/rust/host/src/payments.rs +767 -0
- data/rust/host/src/presentation.rs +698 -0
- data/rust/host/src/presentation_write.rs +1431 -0
- data/rust/host/src/query_step.rs +149 -0
- data/rust/host/src/rate_limit.rs +904 -0
- data/rust/host/src/reference_transform.rs +241 -0
- data/rust/host/src/reference_validate.rs +338 -0
- data/rust/host/src/resend.rs +296 -0
- data/rust/host/src/secrets.rs +106 -0
- data/rust/host/src/server.rs +663 -0
- data/rust/host/src/storage_shape.rs +175 -0
- data/rust/host/src/test_pg.rs +40 -0
- data/rust/host/src/ui_schema.rs +1351 -0
- data/rust/host/src/wasm_runner.rs +191 -0
- data/rust/host/src/web/newsletter/cooldown.rs +126 -0
- data/rust/host/src/web/newsletter/tests.rs +104 -0
- data/rust/host/src/web/newsletter.rs +310 -0
- data/rust/host/src/web/newsletter_send.rs +357 -0
- data/rust/host/src/web/registrations.rs +1505 -0
- data/rust/host/src/web.rs +2937 -0
- data/rust/lsp/.gitignore +1 -0
- data/rust/lsp/Cargo.lock +7 -0
- data/rust/lsp/Cargo.toml +16 -0
- data/rust/lsp/README.md +133 -0
- data/rust/lsp/src/diagnostics.rs +165 -0
- data/rust/lsp/src/json.rs +385 -0
- data/rust/lsp/src/main.rs +399 -0
- data/rust/lsp/src/outline.rs +177 -0
- data/rust/lsp/src/rpc.rs +67 -0
- data/rust/parser/.cargo/config.toml +5 -0
- data/rust/parser/.gitignore +1 -0
- data/rust/parser/Cargo.lock +7 -0
- data/rust/parser/Cargo.toml +21 -0
- data/rust/parser/src/build/closed_sets.rs +27 -0
- data/rust/parser/src/build/identity.rs +276 -0
- data/rust/parser/src/build/mod.rs +12 -0
- data/rust/parser/src/build/naming.rs +141 -0
- data/rust/parser/src/build/pattern_subset.rs +161 -0
- data/rust/parser/src/build/query_derive.rs +72 -0
- data/rust/parser/src/build/query_inference.rs +269 -0
- data/rust/parser/src/build/query_options.rs +100 -0
- data/rust/parser/src/build/read_model.rs +94 -0
- data/rust/parser/src/build/references.rs +32 -0
- data/rust/parser/src/canonical.rs +114 -0
- data/rust/parser/src/diag.rs +55 -0
- data/rust/parser/src/emit.rs +953 -0
- data/rust/parser/src/expr/ast_json.rs +147 -0
- data/rust/parser/src/expr/evaluator.rs +81 -0
- data/rust/parser/src/expr/mod.rs +84 -0
- data/rust/parser/src/expr/resolver.rs +497 -0
- data/rust/parser/src/ir.rs +387 -0
- data/rust/parser/src/keywords.rs +585 -0
- data/rust/parser/src/lex.rs +662 -0
- data/rust/parser/src/main.rs +252 -0
- data/rust/parser/src/parse/aggregate.rs +612 -0
- data/rust/parser/src/parse/chapter.rs +517 -0
- data/rust/parser/src/parse/command.rs +637 -0
- data/rust/parser/src/parse/domain_port.rs +127 -0
- data/rust/parser/src/parse/entity.rs +527 -0
- data/rust/parser/src/parse/file.rs +67 -0
- data/rust/parser/src/parse/hecksagon.rs +231 -0
- data/rust/parser/src/parse/lifecycle.rs +162 -0
- data/rust/parser/src/parse/mod.rs +1262 -0
- data/rust/parser/src/parse/policy.rs +87 -0
- data/rust/parser/src/parse/process_manager.rs +305 -0
- data/rust/parser/src/parse/query.rs +100 -0
- data/rust/parser/src/parse/read_model.rs +214 -0
- data/rust/parser/src/parse/value_object.rs +250 -0
- data/rust/parser/src/ruby_value.rs +422 -0
- data/rust/project/bridging.rb +257 -0
- data/rust/project/commands.rb +877 -0
- data/rust/project/constraints.rb +86 -0
- data/rust/project/dependency_planning.rb +178 -0
- data/rust/project/domain_generator.rb +980 -0
- data/rust/project/exemplar.rb +148 -0
- data/rust/project/expr_emitter.rb +72 -0
- data/rust/project/fielded.rb +141 -0
- data/rust/project/json_codec.rb +641 -0
- data/rust/project/mutations.rb +721 -0
- data/rust/project/naming.rb +205 -0
- data/rust/project/ports.rb +65 -0
- data/rust/project/queries.rb +493 -0
- data/rust/project/reactions.rb +317 -0
- data/rust/project/read_models.rb +690 -0
- data/rust/project/reference_specs.rb +27 -0
- data/rust/project/registry.rb +396 -0
- data/rust/project/skip_reason.rb +29 -0
- data/rust/project/types.rb +225 -0
- data/rust/project/write_if_changed.rb +83 -0
- data/rust/project.rb +30 -0
- data/rust/project_rust_pipeline.rb +383 -0
- data/rust/src/exemplar/commands.rs +279 -0
- data/rust/src/exemplar/constraints.rs +18 -0
- data/rust/src/exemplar/fielded.rs +280 -0
- data/rust/src/exemplar/json.rs +277 -0
- data/rust/src/exemplar/mod.rs +17 -0
- data/rust/src/exemplar/mutations.rs +80 -0
- data/rust/src/exemplar/queries.rs +33 -0
- data/rust/src/exemplar/reactions.rs +88 -0
- data/rust/src/exemplar/read_models.rs +48 -0
- data/rust/src/exemplar/registry.rs +166 -0
- data/rust/src/exemplar/types.rs +44 -0
- data/rust/src/kernel/attribute_shapes/composite.rs +88 -0
- data/rust/src/kernel/attribute_shapes/list.rs +18 -0
- data/rust/src/kernel/attribute_shapes/mod.rs +44 -0
- data/rust/src/kernel/attribute_shapes/optional.rs +9 -0
- data/rust/src/kernel/attribute_shapes/scalar.rs +39 -0
- data/rust/src/kernel/cli.rs +585 -0
- data/rust/src/kernel/dispatch.rs +1090 -0
- data/rust/src/kernel/expr.rs +458 -0
- data/rust/src/kernel/expression_operators/arithmetic.rs +128 -0
- data/rust/src/kernel/expression_operators/comparison.rs +48 -0
- data/rust/src/kernel/expression_operators/enumeration.rs +232 -0
- data/rust/src/kernel/expression_operators/logical.rs +13 -0
- data/rust/src/kernel/expression_operators/membership.rs +18 -0
- data/rust/src/kernel/expression_operators/mod.rs +68 -0
- data/rust/src/kernel/expression_operators/pattern_match.rs +73 -0
- data/rust/src/kernel/expression_operators/positional.rs +126 -0
- data/rust/src/kernel/expression_operators/presence.rs +101 -0
- data/rust/src/kernel/expression_operators/sign_test.rs +16 -0
- data/rust/src/kernel/expression_operators/sized.rs +35 -0
- data/rust/src/kernel/expression_operators/text.rs +79 -0
- data/rust/src/kernel/expression_operators/to_string.rs +18 -0
- data/rust/src/kernel/json.rs +779 -0
- data/rust/src/kernel/mod.rs +133 -0
- data/rust/src/kernel/named_query.rs +219 -0
- data/rust/src/kernel/orchestrate.rs +1810 -0
- data/rust/src/kernel/pattern.rs +307 -0
- data/rust/src/kernel/query_comparators.rs +206 -0
- data/rust/src/kernel/query_ordering.rs +103 -0
- data/rust/src/kernel/read_model.rs +914 -0
- data/rust/src/kernel/reference_lookup.rs +149 -0
- data/rust/src/kernel/repository.rs +468 -0
- data/rust/src/kernel/routing.rs +612 -0
- data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +118 -0
- data/rust/src/kernel/vocab/entity_dispatch_order.rs +114 -0
- data/rust/src/kernel/vocab/field_hint.rs +70 -0
- data/rust/src/kernel/vocab/mod.rs +20 -0
- data/rust/src/kernel/vocab/query_comparator.rs +65 -0
- data/rust/src/kernel/vocab/refusal_template.rs +1592 -0
- data/rust/src/lib.rs +8 -0
- data/rust/src/main.rs +16 -0
- data/rust/web/.gitignore +1 -0
- data/rust/web/Cargo.lock +119 -0
- data/rust/web/Cargo.toml +18 -0
- data/rust/web/src/lib.rs +8 -0
- metadata +478 -12
- data/lib/hecks/facade/cli_door.rb +0 -178
- data/lib/hecks/facade/cli_runner.rb +0 -271
- data/lib/hecks/facade/handle.rb +0 -293
- data/lib/hecks/facade/json_door.rb +0 -247
- data/lib/hecks/facade/surface/aggregate_door.rb +0 -222
- data/lib/hecks/facade/surface/chapter.rb +0 -116
- data/lib/hecks/facade/surface.rb +0 -61
- data/lib/hecks/mcp_door_scope.rb +0 -176
|
@@ -10,100 +10,46 @@ require_relative "glossary/html"
|
|
|
10
10
|
|
|
11
11
|
module Hecks
|
|
12
12
|
module Projections
|
|
13
|
-
# A chapter
|
|
14
|
-
#
|
|
15
|
-
# shared by domain experts and developers, written the same way in
|
|
16
|
-
# conversation, diagrams, documents and code, so that a subject-matter
|
|
17
|
-
# expert can read the model and say "yes, that's how it works" or
|
|
18
|
-
# "no, that's wrong". A banker, a support rep, the CEO and an engineer
|
|
19
|
-
# read the same page.
|
|
13
|
+
# A chapter projected as a plain-language glossary, grouped by aggregate,
|
|
14
|
+
# as `glossary.md` plus an HTML page rendered from that same Markdown.
|
|
20
15
|
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
# First, no type jargon: a term is a term, not "an Aggregate" or "a
|
|
24
|
-
# Value Object", and every identifier is spelled as a person says it
|
|
25
|
-
# (`Naming.words`: `ATMCard` is "ATM card"). Second, nothing invented:
|
|
26
|
-
# every sentence is either the domain author's own words (a
|
|
27
|
-
# `description`, a `goal`, an invariant) or built mechanically from a
|
|
28
|
-
# declared fact ("Recorded after Freeze account") — the same
|
|
29
|
-
# discipline `DocsProjector` holds to; a wrong sentence is worse than
|
|
30
|
-
# a missing one. Third, grouped under the aggregate each term belongs
|
|
31
|
-
# to, A to Z within it — a reader thinks "what does Account mean"
|
|
32
|
-
# before "what starts with A", and once there reads the way a
|
|
33
|
-
# dictionary reads.
|
|
34
|
-
#
|
|
35
|
-
# ## Two files from one source
|
|
36
|
-
#
|
|
37
|
-
# `glossary.md` is the document — every construct in it renders on
|
|
38
|
-
# GitHub as-is (headings, blockquotes, ```mermaid fences, lists,
|
|
39
|
-
# in-page links). `html/index.html` is that exact Markdown string
|
|
40
|
-
# rendered into a page with a navigation rail; it is built from the
|
|
41
|
-
# Markdown, not beside it, so the two cannot drift. `bin/project_glossary`
|
|
42
|
-
# writes both to `<domain>/glossary/` beside the bluebook (examples/banking,
|
|
43
|
-
# examples/pizzas, and the QA ledger in qa/).
|
|
44
|
-
#
|
|
45
|
-
# Projector.call(:glossary, bluebook: <the Bluebook chapter>)
|
|
16
|
+
# Projector.call(:glossary, bluebook: chapter)
|
|
46
17
|
# # => { "glossary.md" => "...", "html/index.html" => "..." }
|
|
47
18
|
module Glossary
|
|
48
19
|
extend Projector::Target
|
|
49
20
|
|
|
50
21
|
projects_as :glossary, emits: :files
|
|
51
22
|
|
|
52
|
-
# One term. `
|
|
53
|
-
# carries the declaration objects the sentence is built from;
|
|
54
|
-
# `headword` and `slug` are assigned once the document's order is
|
|
55
|
-
# known (a headword may need qualifying, a slug depends on what
|
|
56
|
-
# came before it).
|
|
23
|
+
# One term. `headword` and `slug` are assigned once the document's order is known.
|
|
57
24
|
Entry = Struct.new(:name, :kind, :within, :section, :facts, :headword, :slug, keyword_init: true)
|
|
58
25
|
|
|
59
|
-
# One `##` of the document: an aggregate (with its own object, for
|
|
60
|
-
# the lede and diagrams) or one of the three trailing groups.
|
|
61
26
|
Section = Struct.new(:name, :title, :aggregate, :terms, :slug, keyword_init: true)
|
|
62
27
|
|
|
63
28
|
Document = Struct.new(:bluebook, :sections, :index, :markings, keyword_init: true)
|
|
64
29
|
|
|
65
30
|
module_function
|
|
66
31
|
|
|
67
|
-
# Projects `bluebook`'s glossary as a Markdown document and the HTML
|
|
68
|
-
# page built from it.
|
|
32
|
+
# Projects `bluebook`'s glossary as a Markdown document and the HTML page built from it.
|
|
69
33
|
#
|
|
70
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to render
|
|
71
|
-
# glossary for
|
|
34
|
+
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to render
|
|
72
35
|
# @param options [Hash] the registry's call shape
|
|
73
|
-
# @option options [Array<Hash{Symbol => String}>] :markings
|
|
74
|
-
#
|
|
75
|
-
#
|
|
76
|
-
# its aggregate. Absent, the glossary says nothing about sensitivity.
|
|
77
|
-
# @return [Hash{String => String}] `"glossary.md"` and `"html/index.html"`,
|
|
78
|
-
# each mapped to its rendered content
|
|
36
|
+
# @option options [Array<Hash{Symbol => String}>] :markings sensitive fields to tag
|
|
37
|
+
# with their category and list under their aggregate
|
|
38
|
+
# @return [Hash{String => String}] `"glossary.md"` and `"html/index.html"`
|
|
79
39
|
def call(bluebook:, options: {})
|
|
80
40
|
markdown = Markdown.render(document(bluebook, Array(options[:markings])))
|
|
81
41
|
{ "glossary.md" => markdown, "html/index.html" => Html.render(markdown) }
|
|
82
42
|
end
|
|
83
43
|
|
|
84
|
-
# ── the document ─────────────────────────────────────────────────
|
|
85
|
-
|
|
86
44
|
# Gathers every term, groups it into sections, assigns headings and
|
|
87
45
|
# slugs, and builds the index links resolve through.
|
|
88
|
-
#
|
|
89
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to render
|
|
90
|
-
# @param markings [Array<Hash{Symbol => String}>] the sensitive fields declared for
|
|
91
|
-
# the chapter's aggregates; empty when none are
|
|
92
|
-
# @return [Document] the fully assembled document, ready for `Markdown.render`
|
|
93
46
|
def document(bluebook, markings = [])
|
|
94
47
|
sections = sections(bluebook, entries(bluebook, markings))
|
|
95
48
|
Slugs.assign!(bluebook, sections)
|
|
96
49
|
Document.new(bluebook: bluebook, sections: sections, index: Index.new(sections), markings: markings)
|
|
97
50
|
end
|
|
98
51
|
|
|
99
|
-
# Aggregates first,
|
|
100
|
-
# "ATM card"), then the three groups nothing homes to one aggregate.
|
|
101
|
-
#
|
|
102
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter declaring the
|
|
103
|
-
# aggregates to group by
|
|
104
|
-
# @param entries [Array<Entry>] every gathered term
|
|
105
|
-
# @return [Array<Section>] one section per aggregate, sorted, followed by
|
|
106
|
-
# any of the Roles/Read models/Reactions sections that have entries
|
|
52
|
+
# Aggregates first, A to Z by spoken name, then the groups no aggregate homes.
|
|
107
53
|
def sections(bluebook, entries)
|
|
108
54
|
grouped = entries.group_by(&:section)
|
|
109
55
|
list = bluebook.aggregates.sort_by { |aggregate| Naming.words(aggregate.hecks_name).downcase }.map do |aggregate|
|
|
@@ -117,16 +63,7 @@ module Hecks
|
|
|
117
63
|
list
|
|
118
64
|
end
|
|
119
65
|
|
|
120
|
-
# A headword is qualified only when it would repeat within its
|
|
121
|
-
# section — "Open" the action and "Open (the list)" the question;
|
|
122
|
-
# "Return (key issuance)" beside another Return — never numbered
|
|
123
|
-
# (Chicago 18.9, MDN's disambiguation pages: qualify the headword).
|
|
124
|
-
#
|
|
125
|
-
# @param entries [Array<Entry>] the section's own entries
|
|
126
|
-
# @param section_name [String] the entries' own section name, for telling
|
|
127
|
-
# an entry's own section apart from a borrowed one when qualifying
|
|
128
|
-
# @return [Array<Entry>] `entries`, headword-assigned, sorted by headword
|
|
129
|
-
# then kind
|
|
66
|
+
# A headword is qualified only when it would repeat within its section, never numbered.
|
|
130
67
|
def with_headwords(entries, section_name)
|
|
131
68
|
entries.each { |entry| entry.headword = Naming.words(entry.name) }
|
|
132
69
|
entries.group_by(&:headword).each_value do |group|
|
|
@@ -137,14 +74,6 @@ module Hecks
|
|
|
137
74
|
entries.sort_by { |entry| [entry.headword.downcase, entry.kind.to_s] }
|
|
138
75
|
end
|
|
139
76
|
|
|
140
|
-
# Disambiguates one entry's headword from the rest of its group.
|
|
141
|
-
#
|
|
142
|
-
# @param entry [Entry] the entry to qualify
|
|
143
|
-
# @param group [Array<Entry>] every entry sharing `entry`'s plain headword
|
|
144
|
-
# @param section_name [String] the section `entry` and `group` are being
|
|
145
|
-
# rendered under
|
|
146
|
-
# @return [String] `entry`'s headword, qualified with "(the list)" or its
|
|
147
|
-
# own holder's name when needed to tell it apart from the rest of `group`
|
|
148
77
|
def qualified(entry, group, section_name)
|
|
149
78
|
base = Naming.words(entry.name)
|
|
150
79
|
return "#{base} (the list)" if entry.kind == :query && group.any? { |other| other.kind == :command }
|
|
@@ -153,26 +82,12 @@ module Hecks
|
|
|
153
82
|
base
|
|
154
83
|
end
|
|
155
84
|
|
|
156
|
-
#
|
|
157
|
-
|
|
158
|
-
# An entity can carry its own commands and queries too — walked the
|
|
159
|
-
# same one level down `DocsProjector` and `Projections::Diagrams`
|
|
160
|
-
# already walk it.
|
|
161
|
-
#
|
|
162
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to walk
|
|
163
|
-
# @return [Array<Bluebook::Aggregate, Bluebook::Entity>] every aggregate, each
|
|
164
|
-
# immediately followed by its own nested entities
|
|
85
|
+
# Entities carry their own commands and queries, so they are walked one level down.
|
|
165
86
|
def holders(bluebook)
|
|
166
87
|
bluebook.aggregates.flat_map { |aggregate| [aggregate, *aggregate.entities] }
|
|
167
88
|
end
|
|
168
89
|
|
|
169
|
-
#
|
|
170
|
-
# to itself, an entity to whichever aggregate declared it. The one
|
|
171
|
-
# fact the grouping is built on.
|
|
172
|
-
#
|
|
173
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to walk
|
|
174
|
-
# @return [Hash{String => String}] every aggregate and entity name, mapped to
|
|
175
|
-
# its own owning aggregate's name
|
|
90
|
+
# Maps every holder name to its owning aggregate's name.
|
|
176
91
|
def holder_aggregate(bluebook)
|
|
177
92
|
bluebook.aggregates.each_with_object({}) do |aggregate, map|
|
|
178
93
|
map[aggregate.hecks_name] = aggregate.hecks_name
|
|
@@ -180,34 +95,18 @@ module Hecks
|
|
|
180
95
|
end
|
|
181
96
|
end
|
|
182
97
|
|
|
183
|
-
#
|
|
184
|
-
# so its home is
|
|
185
|
-
# it belongs to; a policy or saga reacting to it inherits that home.
|
|
186
|
-
#
|
|
187
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to walk
|
|
188
|
-
# @return [Hash{String => Array<Array(Bluebook::Aggregate, Bluebook::Command)>}]
|
|
189
|
-
# every emitted event name, mapped to `[holder, command]` pairs for every
|
|
190
|
-
# command that raises it; a name absent from the Hash raises nothing
|
|
98
|
+
# Maps each emitted event to its `[holder, command]` raisers. An event is never
|
|
99
|
+
# declared, so its home is the first raiser's aggregate.
|
|
191
100
|
def event_raisers(bluebook)
|
|
192
101
|
holders(bluebook).each_with_object(Hash.new { |hash, key| hash[key] = [] }) do |holder, map|
|
|
193
102
|
holder.commands.each { |command| command.emits.each { |event| map[event] << [holder, command] } }
|
|
194
103
|
end
|
|
195
104
|
end
|
|
196
105
|
|
|
197
|
-
#
|
|
198
|
-
#
|
|
199
|
-
# @param qualified [String, Symbol] a dotted or bare name, such as
|
|
200
|
-
# `"Handler.Dispatch"` or `"Freeze"`
|
|
201
|
-
# @return [String] the name after the last `.`, or the whole name if it has none
|
|
106
|
+
# The last segment of a dotted name.
|
|
202
107
|
def bare(qualified) = qualified.to_s.split(".").last
|
|
203
108
|
|
|
204
109
|
# Gathers every term the glossary carries, ungrouped and unordered.
|
|
205
|
-
#
|
|
206
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to gather terms from
|
|
207
|
-
# @param markings [Array<Hash{Symbol => String}>] the sensitive fields declared for
|
|
208
|
-
# the chapter's aggregates
|
|
209
|
-
# @return [Array<Entry>] one entry per entity, value object, command, query,
|
|
210
|
-
# event, policy, saga, role, and read model
|
|
211
110
|
def entries(bluebook, markings = [])
|
|
212
111
|
homes = holder_aggregate(bluebook)
|
|
213
112
|
raisers = event_raisers(bluebook)
|
|
@@ -225,10 +124,6 @@ module Hecks
|
|
|
225
124
|
entries
|
|
226
125
|
end
|
|
227
126
|
|
|
228
|
-
# Gathers one entry per entity.
|
|
229
|
-
#
|
|
230
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to gather entities from
|
|
231
|
-
# @return [Array<Entry>] one `:entity`-kind entry per entity
|
|
232
127
|
def entity_entries(bluebook)
|
|
233
128
|
bluebook.aggregates.flat_map do |aggregate|
|
|
234
129
|
aggregate.entities.map do |entity|
|
|
@@ -238,15 +133,7 @@ module Hecks
|
|
|
238
133
|
end
|
|
239
134
|
end
|
|
240
135
|
|
|
241
|
-
# Aggregates only
|
|
242
|
-
# (`Bluebook::Entity` deliberately does not answer `value_objects`).
|
|
243
|
-
#
|
|
244
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to gather value
|
|
245
|
-
# objects from
|
|
246
|
-
# @param markings [Array<Hash{Symbol => String}>] the sensitive fields declared for
|
|
247
|
-
# the chapter's aggregates, each carried onto the value object it reaches into
|
|
248
|
-
# @return [Array<Entry>] one `:value_object`-kind entry per aggregate-declared
|
|
249
|
-
# value object
|
|
136
|
+
# Aggregates only; `Bluebook::Entity` deliberately does not answer `value_objects`.
|
|
250
137
|
def value_object_entries(bluebook, markings = [])
|
|
251
138
|
bluebook.aggregates.flat_map do |aggregate|
|
|
252
139
|
marked = Sensitivity.for_aggregate(markings, bluebook.name, aggregate)
|
|
@@ -259,14 +146,6 @@ module Hecks
|
|
|
259
146
|
end
|
|
260
147
|
end
|
|
261
148
|
|
|
262
|
-
# Gathers one entry per command and query.
|
|
263
|
-
#
|
|
264
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to gather commands
|
|
265
|
-
# and queries from
|
|
266
|
-
# @param homes [Hash{String => String}] every holder's name, mapped to its
|
|
267
|
-
# owning aggregate's name (as `holder_aggregate` builds)
|
|
268
|
-
# @return [Array<Entry>] one `:command`-kind or `:query`-kind entry per command
|
|
269
|
-
# and query, commands first
|
|
270
149
|
def verb_entries(bluebook, homes)
|
|
271
150
|
holders(bluebook).flat_map do |holder|
|
|
272
151
|
commands = holder.commands.map do |command|
|
|
@@ -281,15 +160,6 @@ module Hecks
|
|
|
281
160
|
end
|
|
282
161
|
end
|
|
283
162
|
|
|
284
|
-
# Gathers one entry per raised event.
|
|
285
|
-
#
|
|
286
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter declaring the
|
|
287
|
-
# policies checked for reactions
|
|
288
|
-
# @param raisers [Hash{String => Array<Array(Bluebook::Aggregate, Bluebook::Command)>}]
|
|
289
|
-
# every event name, mapped to its raising `[holder, command]` pairs (as
|
|
290
|
-
# `event_raisers` builds)
|
|
291
|
-
# @param home_of [Proc, #call] answers an event name's owning aggregate name, or nil
|
|
292
|
-
# @return [Array<Entry>] one `:event`-kind entry per raised event
|
|
293
163
|
def event_entries(bluebook, raisers, home_of)
|
|
294
164
|
raisers.map do |event, raised_by|
|
|
295
165
|
reactions = bluebook.policies.select { |policy| bare(policy.on_event) == event }
|
|
@@ -298,11 +168,6 @@ module Hecks
|
|
|
298
168
|
end
|
|
299
169
|
end
|
|
300
170
|
|
|
301
|
-
# Gathers one entry per declared policy.
|
|
302
|
-
#
|
|
303
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to gather policies from
|
|
304
|
-
# @param home_of [Proc, #call] answers an event name's owning aggregate name, or nil
|
|
305
|
-
# @return [Array<Entry>] one `:policy`-kind entry per declared policy
|
|
306
171
|
def policy_entries(bluebook, home_of)
|
|
307
172
|
bluebook.policies.map do |policy|
|
|
308
173
|
Entry.new(name: policy.name, kind: :policy, section: home_of.call(bare(policy.on_event)),
|
|
@@ -310,11 +175,6 @@ module Hecks
|
|
|
310
175
|
end
|
|
311
176
|
end
|
|
312
177
|
|
|
313
|
-
# Gathers one entry per declared process manager.
|
|
314
|
-
#
|
|
315
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to gather sagas from
|
|
316
|
-
# @param home_of [Proc, #call] answers an event name's owning aggregate name, or nil
|
|
317
|
-
# @return [Array<Entry>] one `:saga`-kind entry per declared process manager
|
|
318
178
|
def saga_entries(bluebook, home_of)
|
|
319
179
|
bluebook.process_managers.map do |saga|
|
|
320
180
|
shape = saga.to_h
|
|
@@ -323,12 +183,7 @@ module Hecks
|
|
|
323
183
|
end
|
|
324
184
|
end
|
|
325
185
|
|
|
326
|
-
#
|
|
327
|
-
# across half the aggregates here — so a role belongs to no single
|
|
328
|
-
# one and gets its own section.
|
|
329
|
-
#
|
|
330
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to gather roles from
|
|
331
|
-
# @return [Array<Entry>] one `:role`-kind entry per distinct role named by a command
|
|
186
|
+
# Roles cut across aggregates, so they get their own section.
|
|
332
187
|
def role_entries(bluebook)
|
|
333
188
|
by_role = Hash.new { |hash, key| hash[key] = [] }
|
|
334
189
|
holders(bluebook).each do |holder|
|
|
@@ -339,42 +194,21 @@ module Hecks
|
|
|
339
194
|
end
|
|
340
195
|
end
|
|
341
196
|
|
|
342
|
-
# A read model joins heads from more than one aggregate
|
|
343
|
-
# header says so — so it belongs to none of them.
|
|
344
|
-
#
|
|
345
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter to gather read
|
|
346
|
-
# models from
|
|
347
|
-
# @return [Array<Entry>] one `:read_model`-kind entry per declared read model
|
|
197
|
+
# A read model joins heads from more than one aggregate, so it belongs to none.
|
|
348
198
|
def read_model_entries(bluebook)
|
|
349
199
|
bluebook.read_models.map do |read_model|
|
|
350
200
|
Entry.new(name: read_model.name, kind: :read_model, section: READ_MODELS, facts: { read_model: read_model })
|
|
351
201
|
end
|
|
352
202
|
end
|
|
353
203
|
|
|
354
|
-
#
|
|
355
|
-
|
|
356
|
-
# **GitHub's own heading slugs, reproduced** — lowercase, punctuation
|
|
357
|
-
# dropped, spaces to hyphens, a repeat gets "-1", "-2" in document
|
|
358
|
-
# order. Computed here, once, in the order the headings will appear,
|
|
359
|
-
# so a link written into the Markdown lands on the same heading
|
|
360
|
-
# whether GitHub renders the `.md` or `Html` renders the page.
|
|
204
|
+
# Reproduces GitHub's heading slugs, computed in document order, so links land the
|
|
205
|
+
# same whether GitHub renders the `.md` or `Html` renders the page.
|
|
361
206
|
module Slugs
|
|
362
207
|
module_function
|
|
363
208
|
|
|
364
|
-
# Reproduces GitHub's own heading-to-slug transform.
|
|
365
|
-
#
|
|
366
|
-
# @param text [String] the heading text to slugify
|
|
367
|
-
# @return [String] `text` lowercased, stripped of punctuation, spaces turned
|
|
368
|
-
# to hyphens
|
|
369
209
|
def github(text) = text.to_s.downcase.gsub(/[^\p{Word}\- ]/, "").tr(" ", "-")
|
|
370
210
|
|
|
371
|
-
# Assigns every section's and
|
|
372
|
-
#
|
|
373
|
-
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter the document
|
|
374
|
-
# titles itself after
|
|
375
|
-
# @param sections [Array<Section>] the sections to assign slugs to, in the
|
|
376
|
-
# order they render
|
|
377
|
-
# @return [void]
|
|
211
|
+
# Assigns every section's and entry's slug, in document order.
|
|
378
212
|
def assign!(bluebook, sections)
|
|
379
213
|
seen = Hash.new(0)
|
|
380
214
|
take = lambda do |text|
|
|
@@ -390,16 +224,9 @@ module Hecks
|
|
|
390
224
|
end
|
|
391
225
|
end
|
|
392
226
|
|
|
393
|
-
#
|
|
394
|
-
#
|
|
395
|
-
# searching prose for a matching word. Anything not declared here
|
|
396
|
-
# (a cross-domain command like `Notifications.Send`) answers nil,
|
|
397
|
-
# and the sentence says it in words with no link.
|
|
227
|
+
# Resolves declared references structurally, never by searching prose. An
|
|
228
|
+
# undeclared target (a cross-domain command) answers nil and renders unlinked.
|
|
398
229
|
class Index
|
|
399
|
-
# Builds the lookup table every `link` call resolves through.
|
|
400
|
-
#
|
|
401
|
-
# @param sections [Array<Section>] the document's own sections, already
|
|
402
|
-
# built and slugged
|
|
403
230
|
def initialize(sections)
|
|
404
231
|
@by_key = {}
|
|
405
232
|
sections.each do |section|
|
|
@@ -408,12 +235,8 @@ module Hecks
|
|
|
408
235
|
end
|
|
409
236
|
end
|
|
410
237
|
|
|
411
|
-
#
|
|
412
|
-
#
|
|
413
|
-
# @param entry [Entry] the entry to key
|
|
414
|
-
# @return [Array(Symbol, String, String), Array(Symbol, String)] `[kind, within,
|
|
415
|
-
# name]` for a command, query, or value object (which can share a bare name
|
|
416
|
-
# across holders); `[kind, name]` otherwise
|
|
238
|
+
# Commands, queries and value objects can share a bare name across holders, so
|
|
239
|
+
# their key includes the holder.
|
|
417
240
|
def key_of(entry)
|
|
418
241
|
case entry.kind
|
|
419
242
|
when :command, :query, :value_object then [entry.kind, entry.within, entry.name]
|
|
@@ -421,30 +244,15 @@ module Hecks
|
|
|
421
244
|
end
|
|
422
245
|
end
|
|
423
246
|
|
|
424
|
-
# Looks up
|
|
247
|
+
# Looks up a term or aggregate section by kind and name.
|
|
425
248
|
#
|
|
426
|
-
# @
|
|
427
|
-
# @param name [String] the entry's or aggregate's name
|
|
428
|
-
# @param within [String, nil] the holder's name, for a command, query, or
|
|
429
|
-
# value object; nil otherwise
|
|
430
|
-
# @return [Entry, Section, nil] the matching entry or aggregate section, or
|
|
431
|
-
# nil if the chapter declares none
|
|
249
|
+
# @return [Entry, Section, nil]
|
|
432
250
|
def [](kind, name, within: nil)
|
|
433
251
|
@by_key[within ? [kind, within, name] : [kind, name]]
|
|
434
252
|
end
|
|
435
253
|
|
|
436
|
-
# A Markdown link to a term's
|
|
437
|
-
# the
|
|
438
|
-
# text for a sentence that has to tell two same-named terms apart.
|
|
439
|
-
#
|
|
440
|
-
# @param kind [Symbol] the target's kind, or `:aggregate` for a section
|
|
441
|
-
# @param name [String] the target's or aggregate's name
|
|
442
|
-
# @param within [String, nil] the holder's name, for a command, query, or
|
|
443
|
-
# value object; nil otherwise
|
|
444
|
-
# @param label [String, nil] link text to use instead of the target's own
|
|
445
|
-
# headword or title
|
|
446
|
-
# @return [String] a `[text](#slug)` Markdown link, or the plain words when
|
|
447
|
-
# the chapter declares no such term
|
|
254
|
+
# A Markdown link to a term's heading, or the plain words when undeclared.
|
|
255
|
+
# `label:` overrides the link text to tell two same-named terms apart.
|
|
448
256
|
def link(kind, name, within: nil, label: nil)
|
|
449
257
|
target = self[kind, name, within: within]
|
|
450
258
|
return label || Naming.words(name) unless target
|
data/lib/hecks/projections/ir.rb
CHANGED
|
@@ -1,17 +1,10 @@
|
|
|
1
1
|
require_relative "../projector"
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
|
-
#
|
|
5
|
-
# rationale) to define and register the :ir target below.
|
|
4
|
+
# The projection targets, each registered under a name; this file adds the `:ir` target.
|
|
6
5
|
module Projections
|
|
7
|
-
# The canonical IR, as
|
|
8
|
-
#
|
|
9
|
-
# as `:ir`) — this only gives it the constant spelling every other
|
|
10
|
-
# target has, by re-registering the same module under the same key.
|
|
11
|
-
#
|
|
12
|
-
# Deliberately not a new implementation: two things named `IR` that
|
|
13
|
-
# each rendered IR their own way is exactly the drift this namespace
|
|
14
|
-
# exists to avoid.
|
|
6
|
+
# The canonical IR projection, registered as `:ir`.
|
|
7
|
+
# Aliases `Projector::IRProjector` rather than reimplementing it, so IR has one renderer.
|
|
15
8
|
IR = Projector::IRProjector
|
|
16
9
|
|
|
17
10
|
IR.extend(Projector::Target)
|
|
@@ -1,48 +1,33 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module Projections
|
|
3
3
|
module Model
|
|
4
|
-
# How the model's shape differs from the language's, and why.
|
|
5
|
-
#
|
|
6
|
-
# Every construct's `emits_ir` restates what the grammar declares —
|
|
7
|
-
# and the two legitimately differ, in seven ways. These lived only
|
|
8
|
-
# as prose in Ruby comments until spec/model_shape_conformance_spec
|
|
9
|
-
# made them checkable; they live here so the generator and the gate
|
|
10
|
-
# read one source rather than two that must agree.
|
|
11
|
-
#
|
|
12
|
-
# A reason is carried beside each entry because the generated file
|
|
13
|
-
# will carry it: a deviation is exactly the kind of thing whose
|
|
14
|
-
# explanation must survive regeneration, and the only way it can is
|
|
15
|
-
# to be emitted rather than typed into the output.
|
|
4
|
+
# How the model's shape legitimately differs from the language's, and why.
|
|
5
|
+
# The generator and spec/model_shape_conformance_spec read these tables.
|
|
16
6
|
module Deviations
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
# `context` -> `opens`.
|
|
7
|
+
# Fields the model holds that the grammar declares as containment edges
|
|
8
|
+
# (syntax.bluebook's Keyword rows, `context` -> `opens`).
|
|
20
9
|
CONTAINED = {
|
|
21
10
|
"Bluebook" => %i[aggregates read_models policies process_managers],
|
|
22
11
|
"Aggregate" => %i[commands entities queries value_objects],
|
|
23
|
-
#
|
|
24
|
-
# (`Dispatch`, inside `Handler`) — same containment edge as
|
|
25
|
-
# Aggregate's own `entities`, one level down.
|
|
12
|
+
# An entity may nest further entities (`Dispatch` inside `Handler`) (ADR 0026).
|
|
26
13
|
"Entity" => %i[commands entities queries],
|
|
27
14
|
"ValueObject" => %i[members],
|
|
28
15
|
"ProcessManager" => %i[handlers]
|
|
29
16
|
}.freeze
|
|
30
17
|
|
|
31
|
-
# One model field gathered from several declared ones
|
|
32
|
-
# contracts.rb's own `[:folded, ...]` shape, as the pair it is.
|
|
18
|
+
# One model field gathered from several declared ones.
|
|
33
19
|
FOLDED = {
|
|
34
20
|
"Aggregate" => { lifecycle: %i[state_field state_start transitions] },
|
|
35
21
|
"Entity" => { lifecycle: %i[state_field state_start transitions] },
|
|
36
22
|
"Query" => { order_by: %i[order_field order_way] }
|
|
37
23
|
}.freeze
|
|
38
24
|
|
|
39
|
-
# The inverse of a fold
|
|
40
|
-
# field opening into several the model holds apart.
|
|
25
|
+
# The inverse of a fold: one declared field opening into several model fields.
|
|
41
26
|
UNPACKED = {
|
|
42
27
|
"ReadModel" => { options: %i[wheres order_by limit] }
|
|
43
28
|
}.freeze
|
|
44
29
|
|
|
45
|
-
# Model-only, each
|
|
30
|
+
# Model-only fields, each with its reason.
|
|
46
31
|
COMPUTED = {
|
|
47
32
|
"Bluebook" => { ir_version: "the EMISSION's own version, not the domain's",
|
|
48
33
|
canonical_form: "the normalisation table every reader needs beside the IR" },
|
|
@@ -51,9 +36,7 @@ module Hecks
|
|
|
51
36
|
"Policy" => { where_ast: "the structured form of `where`, derived from the same text at emission" }
|
|
52
37
|
}.freeze
|
|
53
38
|
|
|
54
|
-
#
|
|
55
|
-
# home anywhere before — each of these was a comment and nothing
|
|
56
|
-
# more.
|
|
39
|
+
# Declared but deliberately not emitted, each with its reason.
|
|
57
40
|
OFF_THE_WIRE = {
|
|
58
41
|
"Policy" => { aggregate: "the wire format is a pinned contract, and it does not carry " \
|
|
59
42
|
"where a policy was written before the builder hoisted it" },
|
|
@@ -62,24 +45,16 @@ module Hecks
|
|
|
62
45
|
"ValueObject" => { rows: "the language's name for a closed set's members; emitted as `members`" }
|
|
63
46
|
}.freeze
|
|
64
47
|
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
# query specification layer grew options after them.
|
|
48
|
+
# Fields emitted by `to_h`'s own merge rather than `emits_ir`, for constructs
|
|
49
|
+
# whose shape is not fixed.
|
|
68
50
|
DYNAMIC_TAIL = {
|
|
69
|
-
"Query" => %i[options],
|
|
70
|
-
"ReadModel" => %i[options group_by aggregate_heads count median_field
|
|
51
|
+
"Query" => %i[options returns],
|
|
52
|
+
"ReadModel" => %i[options group_by aggregate_heads count median_field sum_field avg_field
|
|
53
|
+
min_field max_field percentile_field percentile_at any_field all_field]
|
|
71
54
|
}.freeze
|
|
72
55
|
|
|
73
56
|
module_function
|
|
74
57
|
|
|
75
|
-
# The grammar is relational — a Command points up at its
|
|
76
|
-
# Aggregate — where the model composes. An explicit `as:` still
|
|
77
|
-
# keeps its `_id` (Command's own `entity_id`, kept as data); the
|
|
78
|
-
# parent link itself mints bare now (ADR 0025) — `aggregate` or
|
|
79
|
-
# `bluebook`, whichever this category's creating command declares
|
|
80
|
-
# first. Entity spells its own (separate, non-colliding) text twin
|
|
81
|
-
# of the parent link `owner`. Not restated here: the one list is
|
|
82
|
-
# `Assembly::PARENT_POINTERS`, which the assembly gate reads too.
|
|
83
58
|
# Tells whether `field` is a parent pointer, minted bare rather than
|
|
84
59
|
# declared like an ordinary field.
|
|
85
60
|
#
|
|
@@ -88,16 +63,14 @@ module Hecks
|
|
|
88
63
|
# or any name ending `_id`)
|
|
89
64
|
def parent_ref?(field) = Hecks::Bluebook::Assembly.parent_pointer?(field)
|
|
90
65
|
|
|
91
|
-
# The judge's own fields,
|
|
92
|
-
# category's contract (`derived: { position: :walk }`), not restated.
|
|
66
|
+
# The judge's own fields, read off the category's contract (`derived: {...: :walk}`).
|
|
93
67
|
#
|
|
94
68
|
# @param name [String] the construct's name, an `Assembly::CONTRACTS` key
|
|
95
69
|
# @return [Array<Symbol>] fields the assembly judge derives by walking, for this construct
|
|
96
70
|
# @raise [KeyError] if `name` has no assembly contract
|
|
97
71
|
def judge_only(name) = Hecks::Bluebook::Assembly.contract(name).walked
|
|
98
72
|
|
|
99
|
-
# The
|
|
100
|
-
# caller wants the set rather than the explanations.
|
|
73
|
+
# The names in `OFF_THE_WIRE`, without the reasons.
|
|
101
74
|
#
|
|
102
75
|
# @param name [String] the construct's name, an `OFF_THE_WIRE` key
|
|
103
76
|
# @return [Array<Symbol>] fields declared but deliberately not emitted for `name`;
|