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
|
@@ -5,82 +5,16 @@ require_relative "../../cache_dir"
|
|
|
5
5
|
module Hecks
|
|
6
6
|
module Bluebook
|
|
7
7
|
module MetaValidator
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
# lifecycle — checked at real dispatch time (the same admission/
|
|
11
|
-
# coercion/lifecycle-guard door every other command goes through),
|
|
12
|
-
# not merely declared and never exercised.
|
|
8
|
+
# Dispatches the language's own grammar table through a real runtime so
|
|
9
|
+
# `Keyword`/`Argument` status is a lifecycle, not just declared (ADR 0026).
|
|
13
10
|
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
# Aggregate-local `KeywordSeed`/`ArgumentSeed` value objects (still
|
|
17
|
-
# hand-written `member` rows — now beside the concepts they spell)
|
|
18
|
-
# are what gets written ; this is what turns them into what gets
|
|
19
|
-
# read. `Judge`/`Reconstruction` already draw exactly this line
|
|
20
|
-
# everywhere else in the meta-domain (a chapter's own declarations
|
|
21
|
-
# versus what gets dispatched from them) — this runs the same
|
|
22
|
-
# distinction one level further out, for the language's own grammar
|
|
23
|
-
# table.
|
|
24
|
-
#
|
|
25
|
-
# ## A dedicated runtime
|
|
26
|
-
#
|
|
27
|
-
# Not `MetaValidator.fresh_runtime`. That one is reserved for
|
|
28
|
-
# `Judge`'s own bootstrap (dispatching a chapter's declarations into
|
|
29
|
-
# the meta-domain's grammar) — a different act from this one
|
|
30
|
-
# (dispatching the meta-domain's own grammar table data into a live
|
|
31
|
-
# "Bluebook" domain instance). Sharing the runtime would let one
|
|
32
|
-
# boot's own repository state leak into the other's.
|
|
33
|
-
#
|
|
34
|
-
# ## Usage
|
|
35
|
-
#
|
|
36
|
-
# MetaValidator.syntax_table # => { keywords: [...], arguments: [...] }
|
|
37
|
-
#
|
|
38
|
-
# each row a plain Hash, string values, `status` included — the
|
|
39
|
-
# exact shape `ParserTable`/`syntax_conformance_spec` already read
|
|
40
|
-
# off the old closed-set members, so neither consumer had to change
|
|
41
|
-
# what it does with a row, only where the row comes from.
|
|
11
|
+
# SyntaxBoot.call # => { keywords: [...], arguments: [...] }
|
|
42
12
|
module SyntaxBoot
|
|
43
13
|
module_function
|
|
44
14
|
|
|
45
|
-
# Memoized
|
|
46
|
-
#
|
|
47
|
-
# something three separate callers (ParserTable, syntax_
|
|
48
|
-
# conformance_spec, bin/reference) should each pay for on every
|
|
49
|
-
# call.
|
|
15
|
+
# Memoized per grammar-registry chapter set (identity, not a "ready"
|
|
16
|
+
# flag), and cross-process on disk, since a full boot is real work.
|
|
50
17
|
#
|
|
51
|
-
# Keyed by the grammar registry's own chapter set, not by a
|
|
52
|
-
# "ready" flag. `boot` reads exactly two things: the registry's
|
|
53
|
-
# "Bluebook" chapter (the core seed rows) and every chapter in the
|
|
54
|
-
# registry that `attaches_to` a core context (Paging's rows). So
|
|
55
|
-
# the table is a pure function of which chapter objects the
|
|
56
|
-
# registry holds — and that is the cache key: the same chapters,
|
|
57
|
-
# by identity, mean the same table; a chapter replaced (the
|
|
58
|
-
# fixpoint judge swapping a raw chapter for its assembled self)
|
|
59
|
-
# or added (`load_attached_grammar_into`) means a fresh boot.
|
|
60
|
-
#
|
|
61
|
-
# Why not the earlier `grammar_registry_ready?` guard. That guard
|
|
62
|
-
# was right about the hazard — a snapshot taken mid-build, before
|
|
63
|
-
# Paging attached, would be missing limit/offset/cursor/nulls
|
|
64
|
-
# forever — and wrong about the cost of its cure. It refused to
|
|
65
|
-
# cache anything until the whole grammar registry had finished
|
|
66
|
-
# building, calling that window "narrow" and recomputing in it
|
|
67
|
-
# "cheap". Measured (hecks_ai_training, a six-entity chess domain,
|
|
68
|
-
# 2026-08-22): every `word_gate_dispatch` landing in that window
|
|
69
|
-
# re-ran the full ~284-dispatch boot at ~0.76s each — 42 times per
|
|
70
|
-
# process, 32 of a 35-second `Hecks.boot`, 95% of which had
|
|
71
|
-
# nothing to do with the domain being booted. Keying on the
|
|
72
|
-
# chapter set closes the same hazard by construction (a snapshot
|
|
73
|
-
# can only be served while the chapters it was read from are
|
|
74
|
-
# still the chapters the registry holds) and lets the window's
|
|
75
|
-
# own repeated, identical calls share one boot. A registry reset
|
|
76
|
-
# (fixpoint_spec's own `@grammar_registry = nil`) yields new
|
|
77
|
-
# chapter objects, so it invalidates this the same way it always
|
|
78
|
-
# invalidated `grammar_registry_ready?`.
|
|
79
|
-
#
|
|
80
|
-
# `equal?`, not `==`, on the chapters — identity is the fact being
|
|
81
|
-
# tracked. Holding the chapter objects themselves (not their ids)
|
|
82
|
-
# in the key also means a collected chapter can never hand its id
|
|
83
|
-
# to a newcomer behind this cache's back.
|
|
84
18
|
# @return [Hash{Symbol => Array<Hash{Symbol => String}>}] `:keywords`
|
|
85
19
|
# and `:arguments`, each an array of plain, string-valued row
|
|
86
20
|
# hashes (`status` included)
|
|
@@ -99,15 +33,8 @@ module Hecks
|
|
|
99
33
|
result
|
|
100
34
|
end
|
|
101
35
|
|
|
102
|
-
#
|
|
103
|
-
#
|
|
104
|
-
#
|
|
105
|
-
# @param cached [Array<Array(String, Object)>] the `[name, chapter]`
|
|
106
|
-
# pairs `call` last cached against
|
|
107
|
-
# @param current [Array<Array(String, Object)>] the registry's
|
|
108
|
-
# current `[name, chapter]` pairs
|
|
109
|
-
# @return [Boolean] whether `cached` and `current` name the same
|
|
110
|
-
# chapters, by identity, in the same order
|
|
36
|
+
# `equal?`, not `==` — chapter identity, not value equality, is the
|
|
37
|
+
# fact this cache key tracks.
|
|
111
38
|
def same_chapters?(cached, current)
|
|
112
39
|
cached.size == current.size &&
|
|
113
40
|
cached.zip(current).all? do |(cached_name, cached_chapter), (name, chapter)|
|
|
@@ -115,73 +42,17 @@ module Hecks
|
|
|
115
42
|
end
|
|
116
43
|
end
|
|
117
44
|
|
|
118
|
-
# Cross-process persistence for the same
|
|
119
|
-
#
|
|
120
|
-
#
|
|
121
|
-
#
|
|
122
|
-
#
|
|
123
|
-
# worker, `bin/qa_sweep` itself) pays both real builds again from
|
|
124
|
-
# scratch even when the grammar source hasn't changed at all since
|
|
125
|
-
# the last process that built it.
|
|
126
|
-
#
|
|
127
|
-
# Not a fix for the two-builds-per-process shape — investigated and
|
|
128
|
-
# confirmed genuine, not waste (see this module's own header
|
|
129
|
-
# history: the previous "wait for the whole registry" design cost
|
|
130
|
-
# 42 rebuilds/32s per process precisely because real callers need a
|
|
131
|
-
# correct table mid-bootstrap, before Paging attaches). Both builds
|
|
132
|
-
# still happen once each per process; this only makes each of them
|
|
133
|
-
# a cheap disk read instead of a real ~1s dispatch, once some
|
|
134
|
-
# earlier process has already paid for that exact chapter-set +
|
|
135
|
-
# grammar-content combination.
|
|
136
|
-
#
|
|
137
|
-
# Keyed the same way `same_chapters?` is, translated across process
|
|
138
|
-
# boundaries — chapter *object identity* (what the in-memory cache
|
|
139
|
-
# keys on) means nothing to a different process; chapter *names*,
|
|
140
|
-
# in the same order, do. Combined with a content hash of every
|
|
141
|
-
# grammar file `boot` can read from (`seed_chapters` walks every
|
|
142
|
-
# bluebook the registry holds, so this must cover the core chapters
|
|
143
|
-
# and every attached one, not just "Bluebook" + "Paging") — a
|
|
144
|
-
# source edit anywhere in that set correctly misses the old cache
|
|
145
|
-
# entry rather than silently serving a stale table.
|
|
146
|
-
#
|
|
147
|
-
# Fails toward a real boot, never toward a wrong table — same
|
|
148
|
-
# loud-not-silent discipline this codebase already holds CI to
|
|
149
|
-
# (`postgres_io_relevant_changed`'s own header). A missing file, a corrupt
|
|
150
|
-
# Marshal blob, a permission error or an unwritable cache directory degrades
|
|
151
|
-
# to "no disk cache today", never to a crash or a served-but-wrong table.
|
|
152
|
-
# The cache lives under `Hecks::CacheDir`, never the gem's read-only directory.
|
|
153
|
-
#
|
|
154
|
-
# **Atomic write, not a lock** — `qa_sweep --all` spawns up to 4
|
|
155
|
-
# children at once, any of which could reach a cold cache
|
|
156
|
-
# simultaneously and each compute the identical real boot result
|
|
157
|
-
# for the identical key. Writing to a PID-suffixed temp file and
|
|
158
|
-
# `File.rename`ing it into place (a single atomic syscall on the
|
|
159
|
-
# same filesystem) means a concurrent second writer's rename just
|
|
160
|
-
# overwrites the first with byte-identical content — never a torn
|
|
161
|
-
# or partially-written file a concurrent reader could observe.
|
|
162
|
-
#
|
|
163
|
-
# `HECKS_SYNTAX_BOOT_CACHE=off` — an escape hatch needing no code
|
|
164
|
-
# change, the same shape `Storehouse::BOOT_ROOT`'s own
|
|
165
|
-
# `HECKS_STOREHOUSE_ROOT` override uses, for the day this needs to
|
|
166
|
-
# be ruled out while debugging something else entirely.
|
|
167
|
-
#
|
|
168
|
-
# @return [String] the directory cache entries are written to:
|
|
169
|
-
# `hecks_syntax_boot_cache` under `Hecks::CacheDir`
|
|
45
|
+
# Cross-process persistence for the same build `call` already memoizes
|
|
46
|
+
# in-process, keyed by chapter name (not identity, which means nothing
|
|
47
|
+
# across processes) plus a content hash of every grammar file `boot`
|
|
48
|
+
# can read from — so a source edit anywhere in that set misses the
|
|
49
|
+
# cache rather than silently serving a stale table.
|
|
170
50
|
def cache_dir = Hecks::CacheDir.path("hecks_syntax_boot_cache")
|
|
171
51
|
|
|
172
|
-
# Reports whether the cross-process disk cache is turned on.
|
|
173
|
-
#
|
|
174
|
-
# @return [Boolean] whether the cross-process disk cache is turned
|
|
175
|
-
# on (`HECKS_SYNTAX_BOOT_CACHE=off` turns it off)
|
|
176
52
|
def disk_cache_enabled? = ENV["HECKS_SYNTAX_BOOT_CACHE"] != "off"
|
|
177
53
|
|
|
178
|
-
#
|
|
179
|
-
#
|
|
180
|
-
# @param chapters [Array<Array(String, Object)>] the `[name,
|
|
181
|
-
# chapter]` pairs to key the cache entry on
|
|
182
|
-
# @return [Hash{Symbol => Array<Hash{Symbol => String}>}, nil] the
|
|
183
|
-
# cached syntax table, or `nil` if the cache is disabled, no entry
|
|
184
|
-
# exists yet, or the entry could not be read
|
|
54
|
+
# Fails toward a real boot, never toward a wrong table: a missing
|
|
55
|
+
# file, a corrupt blob, or a permission error just misses the cache.
|
|
185
56
|
def read_disk_cache(chapters)
|
|
186
57
|
return nil unless disk_cache_enabled?
|
|
187
58
|
|
|
@@ -193,13 +64,9 @@ module Hecks
|
|
|
193
64
|
nil
|
|
194
65
|
end
|
|
195
66
|
|
|
196
|
-
# Writes
|
|
197
|
-
#
|
|
198
|
-
#
|
|
199
|
-
# chapter]` pairs to key the cache entry on
|
|
200
|
-
# @param result [Hash{Symbol => Array<Hash{Symbol => String}>}] the
|
|
201
|
-
# syntax table to persist
|
|
202
|
-
# @return [void]
|
|
67
|
+
# Writes to a PID-suffixed temp file and renames it into place, so a
|
|
68
|
+
# concurrent writer's rename can only overwrite with identical
|
|
69
|
+
# content, never leave a torn file for a concurrent reader.
|
|
203
70
|
def write_disk_cache(chapters, result)
|
|
204
71
|
return unless disk_cache_enabled?
|
|
205
72
|
|
|
@@ -212,38 +79,21 @@ module Hecks
|
|
|
212
79
|
nil
|
|
213
80
|
end
|
|
214
81
|
|
|
215
|
-
# Builds the disk cache file path for `chapters`.
|
|
216
|
-
#
|
|
217
|
-
# @param chapters [Array<Array(String, Object)>] the `[name,
|
|
218
|
-
# chapter]` pairs to key the cache entry on
|
|
219
|
-
# @return [String] the disk cache file path for `chapters`
|
|
220
82
|
def disk_cache_path(chapters)
|
|
221
83
|
File.join(cache_dir, "#{disk_cache_key(chapters)}.marshal")
|
|
222
84
|
end
|
|
223
85
|
|
|
224
|
-
# Builds the cache key for `chapters`.
|
|
225
|
-
#
|
|
226
|
-
# @param chapters [Array<Array(String, Object)>] the `[name,
|
|
227
|
-
# chapter]` pairs to key the cache entry on
|
|
228
|
-
# @return [String] a SHA-256 digest of the chapter names and the
|
|
229
|
-
# current grammar source
|
|
230
86
|
def disk_cache_key(chapters)
|
|
231
87
|
names = chapters.map { |name, _chapter| name }
|
|
232
|
-
Digest::SHA256.hexdigest("#{names.join(',')}:#{grammar_content_digest}")
|
|
88
|
+
Digest::SHA256.hexdigest("#{names.join(',')}:#{grammar_content_digest}:#{VerdictCache.code_digest}")
|
|
233
89
|
end
|
|
234
90
|
|
|
235
|
-
#
|
|
236
|
-
#
|
|
237
|
-
#
|
|
238
|
-
#
|
|
239
|
-
#
|
|
240
|
-
#
|
|
241
|
-
# one file changing invalidates every cached key, not just the
|
|
242
|
-
# chapter it belongs to) — deliberately, since under-covering this
|
|
243
|
-
# set is a correctness bug (a stale table survives a real grammar
|
|
244
|
-
# edit) and over-covering it is only ever a wasted cache miss.
|
|
245
|
-
# @return [String] a SHA-256 digest of every grammar file's own
|
|
246
|
-
# current content, sorted for a stable digest
|
|
91
|
+
# The key also carries `VerdictCache.code_digest` (all of `lib/`), so an
|
|
92
|
+
# edit to Ruby that builds or judges the grammar misses too.
|
|
93
|
+
#
|
|
94
|
+
# Covers every chapter's grammar files, not just the core ones —
|
|
95
|
+
# coarser than strictly necessary, but under-covering this set would
|
|
96
|
+
# let a stale table survive a real grammar edit.
|
|
247
97
|
def grammar_content_digest
|
|
248
98
|
files = (MetaValidator::GRAMMAR_FILES + MetaValidator::WORLD_GRAMMAR + MetaValidator::HECKSAGON_GRAMMAR +
|
|
249
99
|
Dir.glob(File.join(MetaValidator::ATTACHED_GRAMMAR_DIR, "*.bluebook"))).sort
|
|
@@ -252,21 +102,11 @@ module Hecks
|
|
|
252
102
|
|
|
253
103
|
# Dispatches every seed row into a fresh "Bluebook" instance and
|
|
254
104
|
# reads the result back.
|
|
255
|
-
#
|
|
256
|
-
# @return [Hash{Symbol => Array<Hash{Symbol => String}>}] `:keywords`
|
|
257
|
-
# and `:arguments`, each an array of plain, string-valued row
|
|
258
|
-
# hashes (`status` included)
|
|
259
105
|
def boot
|
|
260
106
|
bluebook = MetaValidator.grammar_registry.bluebook("Bluebook")
|
|
261
|
-
# `
|
|
262
|
-
#
|
|
263
|
-
#
|
|
264
|
-
# ran `registry.add_bluebook`) and its adapter ports already
|
|
265
|
-
# loaded ; a standalone registry would need both wired by hand.
|
|
266
|
-
# `fresh_runtime` resets `@repositories` on the same registry —
|
|
267
|
-
# the identical isolation `Judge.new` already relies on for
|
|
268
|
-
# every real domain it judges, proven safe by every dispatch
|
|
269
|
-
# this session has ever made.
|
|
107
|
+
# `fresh_runtime`, not a new `Runtime::Registry` — the grammar
|
|
108
|
+
# registry already has "Bluebook" registered and its adapter
|
|
109
|
+
# ports already loaded.
|
|
270
110
|
runtime = MetaValidator.fresh_runtime
|
|
271
111
|
|
|
272
112
|
declare_syntax(runtime, bluebook)
|
|
@@ -276,56 +116,26 @@ module Hecks
|
|
|
276
116
|
read_back(runtime, bluebook)
|
|
277
117
|
end
|
|
278
118
|
|
|
279
|
-
#
|
|
280
|
-
#
|
|
281
|
-
#
|
|
282
|
-
# An Integer stays an Integer — `position` is `Position`-typed
|
|
283
|
-
# (`attribute :value, Integer`), so stringifying it fails the type
|
|
284
|
-
# gate rather than feeding it, the same reading `Judge#v` gives.
|
|
285
|
-
#
|
|
286
|
-
# @param text [String, Integer] the scalar to wrap
|
|
287
|
-
# @return [Hash{Symbol => String, Integer}] `{value: text}`,
|
|
288
|
-
# stringified unless `text` is already an Integer
|
|
119
|
+
# An Integer stays an Integer — `position` is `Position`-typed, so
|
|
120
|
+
# stringifying it would fail the type gate rather than feed it.
|
|
289
121
|
def v(text)
|
|
290
122
|
return { value: text } if text.is_a?(Integer)
|
|
291
123
|
|
|
292
124
|
{ value: text.to_s }
|
|
293
125
|
end
|
|
294
126
|
|
|
295
|
-
#
|
|
296
|
-
#
|
|
297
|
-
#
|
|
298
|
-
# Absent stays absent. A seed row's own optional columns ("was",
|
|
299
|
-
# "at", "named", ...) are empty strings, not nil — `Literal`/CSV-
|
|
300
|
-
# shaped grammar data has no `nil` to write — so this is the one
|
|
301
|
-
# place that decides "" means "not given" for the purpose of an
|
|
302
|
-
# `optional: true` command argument, the same reading `Judge#v`
|
|
303
|
-
# makes for the meta-domain's own dispatches.
|
|
304
|
-
#
|
|
305
|
-
# @param text [String, nil] the seed row's own column value
|
|
306
|
-
# @return [Hash{Symbol => String}, nil] `v(text)`, or `nil` when
|
|
307
|
-
# `text` is `nil` or empty
|
|
127
|
+
# A seed row's own optional columns are "", not nil (CSV-shaped
|
|
128
|
+
# grammar data has no nil to write) — this is where "" is read as
|
|
129
|
+
# "not given".
|
|
308
130
|
def optional(text)
|
|
309
131
|
return nil if text.nil? || text.to_s.empty?
|
|
310
132
|
|
|
311
133
|
v(text)
|
|
312
134
|
end
|
|
313
135
|
|
|
314
|
-
#
|
|
315
|
-
#
|
|
316
|
-
#
|
|
317
|
-
# `Policy.Declare`, ...). This fresh runtime holds no chapter
|
|
318
|
-
# record of its own yet (nothing else here needs one), so one is
|
|
319
|
-
# declared first, named after the real chapter, purely to satisfy
|
|
320
|
-
# the reference — its own vision/classification are never read
|
|
321
|
-
# by anything this boot does.
|
|
322
|
-
#
|
|
323
|
-
# @param runtime [Runtime::Dispatcher] the fresh runtime to
|
|
324
|
-
# dispatch into
|
|
325
|
-
# @param bluebook [Bluebook::Chapter] the language's own assembled
|
|
326
|
-
# "Bluebook" chapter, read for its `hecks_name` and `"Syntax"`
|
|
327
|
-
# aggregate
|
|
328
|
-
# @return [void]
|
|
136
|
+
# This fresh runtime holds no chapter record of its own, so one is
|
|
137
|
+
# declared first, purely to satisfy `Syntax.Declare`'s `reference_to
|
|
138
|
+
# Bluebook` — its vision/classification are never read afterward.
|
|
329
139
|
def declare_syntax(runtime, bluebook)
|
|
330
140
|
syntax = bluebook.aggregate("Syntax")
|
|
331
141
|
runtime.dispatch("Bluebook::Bluebook.Declare",
|
|
@@ -337,21 +147,10 @@ module Hecks
|
|
|
337
147
|
with: { bluebook: bluebook.hecks_name, name: v(syntax.hecks_name) })
|
|
338
148
|
end
|
|
339
149
|
|
|
340
|
-
# `to: "Syntax"`
|
|
341
|
-
#
|
|
342
|
-
#
|
|
343
|
-
#
|
|
344
|
-
# `ValueObject.Member`/`ProcessManager.Handler`) already left behind
|
|
345
|
-
# for `to:`/`with:` — would carry the receiver in the payload,
|
|
346
|
-
# making `Syntax.Keyword`'s own `command.creates?` (true: it
|
|
347
|
-
# declares no `reference_to`) look like a fresh identity to mint,
|
|
348
|
-
# colliding with the very "Syntax" row `declare_syntax` just opened.
|
|
349
|
-
#
|
|
350
|
-
# @param runtime [Runtime::Dispatcher] the fresh runtime to
|
|
351
|
-
# dispatch into
|
|
352
|
-
# @param bluebook [Bluebook::Chapter] the language's own assembled
|
|
353
|
-
# "Bluebook" chapter, read for its `KeywordSeed` rows
|
|
354
|
-
# @return [void]
|
|
150
|
+
# `to: "Syntax"` appends onto the record `declare_syntax` already
|
|
151
|
+
# opened; putting the receiver in the payload instead would make
|
|
152
|
+
# `Syntax.Keyword` look like a fresh identity to mint, colliding
|
|
153
|
+
# with that row.
|
|
355
154
|
def admit_keywords(runtime, bluebook)
|
|
356
155
|
all_rows(bluebook, "KeywordSeed").each_with_index do |row, index|
|
|
357
156
|
runtime.dispatch("Bluebook::Syntax.Keyword", to: "Syntax",
|
|
@@ -369,14 +168,7 @@ module Hecks
|
|
|
369
168
|
end
|
|
370
169
|
end
|
|
371
170
|
|
|
372
|
-
#
|
|
373
|
-
# `to: "Syntax"` append shape `admit_keywords` uses one type over.
|
|
374
|
-
#
|
|
375
|
-
# @param runtime [Runtime::Dispatcher] the fresh runtime to
|
|
376
|
-
# dispatch into
|
|
377
|
-
# @param bluebook [Bluebook::Chapter] the language's own assembled
|
|
378
|
-
# "Bluebook" chapter, read for its `ArgumentSeed` rows
|
|
379
|
-
# @return [void]
|
|
171
|
+
# Same `to: "Syntax"` append shape `admit_keywords` uses, one type over.
|
|
380
172
|
def admit_arguments(runtime, bluebook)
|
|
381
173
|
all_rows(bluebook, "ArgumentSeed").each_with_index do |row, index|
|
|
382
174
|
runtime.dispatch("Bluebook::Syntax.Argument", to: "Syntax",
|
|
@@ -396,49 +188,18 @@ module Hecks
|
|
|
396
188
|
end
|
|
397
189
|
end
|
|
398
190
|
|
|
399
|
-
#
|
|
400
|
-
#
|
|
401
|
-
# filename, or context catalog is maintained here. This finds the core
|
|
402
|
-
# Bluebook concepts, the sibling artifact languages (World, Hecksagon,
|
|
403
|
-
# Port, Adapter, Translation), and attached sub-languages alike.
|
|
404
|
-
# Concatenated into one sequence because `position` is minted from the
|
|
405
|
-
# walk index and must not collide across concepts.
|
|
406
|
-
#
|
|
407
|
-
# @param bluebook [Bluebook::Chapter] the language's own assembled
|
|
408
|
-
# "Bluebook" chapter, read first, before every other loaded
|
|
409
|
-
# chapter
|
|
410
|
-
# @param name [String] the local value-object name to collect rows
|
|
411
|
-
# of, such as `"KeywordSeed"`
|
|
412
|
-
# @return [Array<Hash{Symbol => String}>] every matching row, across
|
|
413
|
-
# every loaded chapter, in chapter order
|
|
191
|
+
# Concatenated into one sequence because `position` is minted from
|
|
192
|
+
# the walk index and must not collide across concepts.
|
|
414
193
|
def all_rows(bluebook, name)
|
|
415
194
|
seed_chapters(bluebook).flat_map { |chapter| rows(chapter, name) }
|
|
416
195
|
end
|
|
417
196
|
|
|
418
|
-
#
|
|
419
|
-
#
|
|
420
|
-
# object twice without relying on object identity across fixpoint
|
|
421
|
-
# assembly.
|
|
422
|
-
#
|
|
423
|
-
# @param bluebook [Bluebook::Chapter] the language's own assembled
|
|
424
|
-
# "Bluebook" chapter
|
|
425
|
-
# @return [Array<Bluebook::Chapter>] `bluebook` first, then every
|
|
426
|
-
# other chapter the grammar registry holds
|
|
197
|
+
# `bluebook` first, then registry insertion order, so the core
|
|
198
|
+
# chapter is never read twice.
|
|
427
199
|
def seed_chapters(bluebook)
|
|
428
200
|
[bluebook] + MetaValidator.grammar_registry.bluebooks.values.reject { |chapter| chapter.name == bluebook.name }
|
|
429
201
|
end
|
|
430
202
|
|
|
431
|
-
# The seed rows themselves — plain hashes, string values, read from
|
|
432
|
-
# every aggregate that owns a same-named local value object. Repeating
|
|
433
|
-
# the value-object shape is deliberate: each concept remains readable
|
|
434
|
-
# by itself, while this discovery is the only grouping mechanism.
|
|
435
|
-
#
|
|
436
|
-
# @param bluebook [Bluebook::Chapter] the chapter to search
|
|
437
|
-
# @param name [String] the local value-object name to collect rows
|
|
438
|
-
# of, such as `"KeywordSeed"`
|
|
439
|
-
# @return [Array<Hash{Symbol => String}>] one hash per member row,
|
|
440
|
-
# `[]` if no aggregate in `bluebook` owns a value object named
|
|
441
|
-
# `name`
|
|
442
203
|
def rows(bluebook, name)
|
|
443
204
|
bluebook.aggregates.flat_map do |aggregate|
|
|
444
205
|
value_object = aggregate.value_objects.find { |vo| vo.hecks_name == name }
|
|
@@ -448,18 +209,8 @@ module Hecks
|
|
|
448
209
|
end
|
|
449
210
|
end
|
|
450
211
|
|
|
451
|
-
# Reads the dispatched result back into the same shape
|
|
452
|
-
#
|
|
453
|
-
# `status` included — so `ParserTable`/`syntax_conformance_spec`
|
|
454
|
-
# need not know or care that a real dispatch happened in between.
|
|
455
|
-
#
|
|
456
|
-
# @param runtime [Runtime::Dispatcher] the runtime `boot` dispatched
|
|
457
|
-
# every seed row into
|
|
458
|
-
# @param bluebook [Bluebook::Chapter] the language's own assembled
|
|
459
|
-
# "Bluebook" chapter, read for its `"Syntax"` aggregate
|
|
460
|
-
# @return [Hash{Symbol => Array<Hash{Symbol => String}>}] `:keywords`
|
|
461
|
-
# and `:arguments`, each an array of plain, string-valued row
|
|
462
|
-
# hashes (`status` included)
|
|
212
|
+
# Reads the dispatched result back into the same plain-hash shape
|
|
213
|
+
# `rows` hands the seed data in as.
|
|
463
214
|
def read_back(runtime, bluebook)
|
|
464
215
|
syntax = bluebook.aggregate("Syntax")
|
|
465
216
|
repository = runtime.registry.repository("Bluebook", syntax)
|
|
@@ -471,23 +222,13 @@ module Hecks
|
|
|
471
222
|
}
|
|
472
223
|
end
|
|
473
224
|
|
|
474
|
-
# Flattens one dispatched record into a plain, string-valued row.
|
|
475
|
-
#
|
|
476
|
-
# @param row [Object] one dispatched keyword or argument record,
|
|
477
|
-
# answering `to_h`
|
|
478
|
-
# @return [Hash{Symbol => String}] `row`'s own fields, each value
|
|
479
|
-
# unwrapped and stringified
|
|
480
225
|
def stringify(row)
|
|
481
226
|
row.to_h.transform_values do |cell|
|
|
482
227
|
scalar(cell).to_s
|
|
483
228
|
end
|
|
484
229
|
end
|
|
485
230
|
|
|
486
|
-
# Unwraps
|
|
487
|
-
#
|
|
488
|
-
# @param cell [Object] one field's stored value
|
|
489
|
-
# @return [Object] `cell`'s sole wrapped value, if `cell` is a
|
|
490
|
-
# to_h-able non-String; `cell` unchanged otherwise
|
|
231
|
+
# Unwraps a value-object-wrapped field back to its bare scalar.
|
|
491
232
|
def scalar(cell)
|
|
492
233
|
return cell.to_h.values.first if cell.respond_to?(:to_h) && !cell.is_a?(String)
|
|
493
234
|
|
|
@@ -1,24 +1,8 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module Bluebook
|
|
3
3
|
module MetaValidator
|
|
4
|
-
# Offers a built translation (a `translations/*.bluebook` edge
|
|
5
|
-
#
|
|
6
|
-
# there is no separate `.translation` extension) to the language
|
|
7
|
-
# that describes translations.
|
|
8
|
-
#
|
|
9
|
-
# A sibling of a bluebook again, the same shape PortJudge/
|
|
10
|
-
# AdapterJudge already are — its own file, its own door, judged
|
|
11
|
-
# through its own self-hosted language (translation.bluebook)
|
|
12
|
-
# rather than left as plain Ruby structs nothing checks. Walks the
|
|
13
|
-
# whole built translation in one pass — the top-level Declare/
|
|
14
|
-
# Retire commands, then every nested aggregate's own Declare plus
|
|
15
|
-
# one Add* command per rule it carries — the same "one judge, every
|
|
16
|
-
# nested record" shape WorldJudge already gives Wiring. Field names
|
|
17
|
-
# throughout read lib/hecks/bluebook/translation.rb's own real
|
|
18
|
-
# struct/class definitions directly, not the DSL builder's own
|
|
19
|
-
# local parameter names (`move(old_path, to:)`'s `old_path` reads
|
|
20
|
-
# back as the struct's own `from`). Whole-project table-
|
|
21
|
-
# unification survey, item #13's remaining builders.
|
|
4
|
+
# Offers a built translation (a `translations/*.bluebook` edge) to the language that
|
|
5
|
+
# describes translations. Field names follow the `Translation` structs, not the DSL builder.
|
|
22
6
|
class TranslationJudge
|
|
23
7
|
attr_reader :refusals
|
|
24
8
|
|
|
@@ -36,18 +20,8 @@ module Hecks
|
|
|
36
20
|
|
|
37
21
|
def args(pairs) = pairs.compact
|
|
38
22
|
|
|
39
|
-
# `
|
|
40
|
-
#
|
|
41
|
-
# Those three each judge a single aggregate per build (Port/Adapter)
|
|
42
|
-
# or a Hash keyed by verb (World's own settings, deduped by
|
|
43
|
-
# construction), so a duplicate-identity Declare can never reach
|
|
44
|
-
# their own runtime. `TranslationBuilder#aggregate` appends every
|
|
45
|
-
# block to a plain Array (`@aggregates << builder.build`) with no
|
|
46
|
-
# dedup — two `aggregate "Account" do ... end` blocks in the same
|
|
47
|
-
# translation are syntactically legal and reach here for real.
|
|
48
|
-
# Left unrescued, the second Declare's `AlreadyExists` would crash
|
|
49
|
-
# straight through `call_translation` instead of becoming a clean
|
|
50
|
-
# refusal — confirmed via direct dispatch.
|
|
23
|
+
# Rescues `AlreadyExists` too: `TranslationBuilder#aggregate` does not dedup, so two
|
|
24
|
+
# same-named aggregate blocks reach here and must become a refusal, not a crash.
|
|
51
25
|
def offer(label)
|
|
52
26
|
yield
|
|
53
27
|
rescue Runtime::GivenNotMet, Runtime::InvariantViolation, Runtime::TypeMismatch,
|
|
@@ -66,14 +40,7 @@ module Hecks
|
|
|
66
40
|
send_to("Translation::Translation.Declare", t.domain,
|
|
67
41
|
with: { domain: v(t.domain), from: v(t.from), to: v(t.to) })
|
|
68
42
|
|
|
69
|
-
# `id
|
|
70
|
-
# to])` — Translation's own identity is composite
|
|
71
|
-
# (`identified_by :domain, :from, :to`), the same reason
|
|
72
|
-
# `Wiring.Set`'s own self-reference dispatch (world.bluebook,
|
|
73
|
-
# `WorldJudge#judge_wiring`) needs a computed `id:` rather than
|
|
74
|
-
# a bare field value — a single-field identity (TranslationAggregate's
|
|
75
|
-
# own `name`) is the one case where the bare value itself is the
|
|
76
|
-
# id, confirmed live via direct dispatch testing, not assumed.
|
|
43
|
+
# Translation's identity is composite, so `id:` must be computed, not a bare field.
|
|
77
44
|
translation_id = Naming.identity([t.domain, t.from, t.to])
|
|
78
45
|
Array(t.retired).each do |name|
|
|
79
46
|
send_to("Translation::Translation.Retire", t.domain, to: translation_id,
|
|
@@ -83,11 +50,8 @@ module Hecks
|
|
|
83
50
|
Array(t.aggregates).each { |aggregate| judge_aggregate(t, aggregate) }
|
|
84
51
|
end
|
|
85
52
|
|
|
86
|
-
#
|
|
87
|
-
#
|
|
88
|
-
# different fields), so each is its own private method below; only
|
|
89
|
-
# Declare-before-any-Add is order-sensitive, and that order is
|
|
90
|
-
# preserved here.
|
|
53
|
+
# Declares the aggregate, then adds each rule collection. Only Declare-before-Add is
|
|
54
|
+
# order-sensitive.
|
|
91
55
|
def judge_aggregate(translation, aggregate)
|
|
92
56
|
name = aggregate.name
|
|
93
57
|
declare_aggregate(translation, aggregate, name)
|