hecks 6.0.0 → 7.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 +19 -12
- data/lib/hecks/adapters/driven/claude_code.rb +2 -2
- data/lib/hecks/adapters/driven/folder.rb +10 -1
- data/lib/hecks/adapters/driven/folder_overlay.rb +15 -0
- data/lib/hecks/adapters/driven/heki.rb +1 -1
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +1 -1
- data/lib/hecks/adapters/driven/memory/outbox_rows.rb +2 -2
- data/lib/hecks/adapters/driven/postgres/name_guard.rb +25 -0
- data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -3
- data/lib/hecks/adapters/driven/postgres/repository.rb +1 -1
- data/lib/hecks/adapters/driven/postgres/shared_connection.rb +1 -1
- data/lib/hecks/adapters/driven/postgres.rb +3 -0
- data/lib/hecks/adapters/driven/postgres_era/boot.rb +28 -16
- data/lib/hecks/adapters/driven/postgres_era/class_methods.rb +27 -7
- data/lib/hecks/adapters/driven/postgres_era/dialect.rb +10 -5
- data/lib/hecks/adapters/driven/postgres_era/field_cache_provisioner.rb +39 -0
- data/lib/hecks/adapters/driven/postgres_era/journal.rb +52 -13
- data/lib/hecks/adapters/driven/postgres_era/lineage/chain_sql.rb +29 -49
- data/lib/hecks/adapters/driven/postgres_era/lineage/direct_sql.rb +73 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/direct_verified.json +10 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/direct_verified.rb +65 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/domain_rename.rb +77 -25
- data/lib/hecks/adapters/driven/postgres_era/lineage/domain_rename_state.rb +108 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/era_integrity.rb +11 -6
- data/lib/hecks/adapters/driven/postgres_era/lineage/era_store.rb +63 -5
- data/lib/hecks/adapters/driven/postgres_era/lineage/layered_sql.rb +64 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/ledger_reset.rb +150 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/mint_provisioning.rb +85 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/mint_transaction.rb +11 -7
- data/lib/hecks/adapters/driven/postgres_era/lineage/provisioning.rb +11 -5
- data/lib/hecks/adapters/driven/postgres_era/lineage/split_sql.rb +76 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/sql_templates.rb +9 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage.rb +10 -2
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/context.rb +23 -3
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/coverage_check.rb +3 -1
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/disposable_ledger.rb +119 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolution.rb +219 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolver.rb +68 -71
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/held_era.rb +68 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/ledger_change.rb +63 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/merge_coordinator.rb +1 -1
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_decision.rb +163 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_request.rb +24 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/minter.rb +59 -21
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/refusals.rb +24 -11
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager.rb +40 -6
- data/lib/hecks/adapters/driven/postgres_era/shared_tables.rb +32 -0
- data/lib/hecks/adapters/driven/postgres_era.adapter +12 -0
- data/lib/hecks/adapters/driven/postgres_era.rb +25 -10
- data/lib/hecks/adapters/driven/prism.rb +0 -1
- data/lib/hecks/adapters/driven/sql_query_builder.rb +1 -0
- data/lib/hecks/adapters/driven/sqlite/dispatch_claims.rb +1 -1
- data/lib/hecks/adapters/driven/sqlite/name_guard.rb +25 -0
- data/lib/hecks/adapters/driven/sqlite/outbox.rb +2 -2
- data/lib/hecks/adapters/driven/sqlite/repository.rb +1 -1
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +20 -0
- data/lib/hecks/adapters/driven/sqlite.rb +9 -1
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +1 -1
- data/lib/hecks/adapters/driven/worktree_overlay.rb +117 -0
- data/lib/hecks/adapters/driving/cli/shorthand.rb +5 -1
- data/lib/hecks/adapters/driving/cli.rb +1 -1
- data/lib/hecks/adapters/driving/cli_runner/answers.rb +77 -22
- data/lib/hecks/adapters/driving/cli_runner/bang_rule.rb +35 -0
- data/lib/hecks/adapters/driving/cli_runner/completion_words.rb +36 -0
- data/lib/hecks/adapters/driving/cli_runner/json_words.rb +55 -0
- data/lib/hecks/adapters/driving/cli_runner/name_index.rb +63 -0
- data/lib/hecks/adapters/driving/cli_runner/read_context.rb +32 -0
- data/lib/hecks/adapters/driving/cli_runner/renamed_names.rb +49 -0
- data/lib/hecks/adapters/driving/cli_runner/resolution.rb +43 -17
- data/lib/hecks/adapters/driving/cli_runner/resume_words.rb +63 -0
- data/lib/hecks/adapters/driving/cli_runner/run_reference.rb +66 -0
- data/lib/hecks/adapters/driving/cli_runner/run_replay.rb +118 -0
- data/lib/hecks/adapters/driving/cli_runner/search_words.rb +35 -0
- data/lib/hecks/adapters/driving/cli_runner/settling.rb +6 -5
- data/lib/hecks/adapters/driving/cli_runner/streaming.rb +11 -10
- data/lib/hecks/adapters/driving/cli_runner/suggestions.rb +1 -1
- data/lib/hecks/adapters/driving/cli_runner/tour_words.rb +77 -0
- data/lib/hecks/adapters/driving/cli_runner/verb_names.rb +36 -4
- data/lib/hecks/adapters/driving/cli_runner/verbosity.rb +75 -0
- data/lib/hecks/adapters/driving/cli_runner.rb +106 -7
- data/lib/hecks/adapters/driving/context_line.rb +85 -0
- data/lib/hecks/adapters/driving/exit_status.rb +31 -0
- data/lib/hecks/adapters/driving/launcher_options.rb +7 -5
- data/lib/hecks/adapters/driving/mcp/progress_sink.rb +45 -0
- data/lib/hecks/adapters/driving/mcp/tool_calls.rb +7 -5
- data/lib/hecks/adapters/driving/mcp.rb +25 -5
- data/lib/hecks/adapters/driving/mcp_scope/argument_policy.rb +40 -7
- data/lib/hecks/adapters/driving/mcp_scope.rb +8 -7
- data/lib/hecks/adapters/driving/ruby/aggregate_module/hooks.rb +154 -0
- data/lib/hecks/adapters/driving/ruby/aggregate_module.rb +64 -93
- data/lib/hecks/adapters/driving/usage_log.rb +146 -0
- data/lib/hecks/adapters/driving/write_guard.rb +55 -0
- data/lib/hecks/adapters/driving.rb +0 -1
- data/lib/hecks/behaviors/dsl.rb +5 -1
- data/lib/hecks/behaviors/expectations/boot.rb +0 -1
- data/lib/hecks/bluebook/acknowledgements.rb +1 -1
- data/lib/hecks/bluebook/aggregate.rb +21 -18
- data/lib/hecks/bluebook/assembly/contracts/sagas.rb +2 -0
- data/lib/hecks/bluebook/assembly/contracts/structure.rb +18 -13
- data/lib/hecks/bluebook/behaviour/aggregate.rb +27 -3
- data/lib/hecks/bluebook/command.rb +16 -5
- data/lib/hecks/bluebook/declaration.rb +32 -4
- data/lib/hecks/bluebook/domain_port.rb +7 -3
- data/lib/hecks/bluebook/dsl/aggregate_builder/relationships.rb +0 -2
- data/lib/hecks/bluebook/dsl/aggregate_builder/renaming.rb +25 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +3 -0
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +0 -1
- data/lib/hecks/bluebook/dsl/audience_word.rb +40 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/metadata.rb +56 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/modules.rb +80 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb +51 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +1 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +17 -34
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +8 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +13 -3
- data/lib/hecks/bluebook/dsl/entity_builder.rb +0 -2
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +6 -4
- data/lib/hecks/bluebook/dsl/kinds.rb +53 -0
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +9 -2
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +25 -15
- data/lib/hecks/bluebook/dsl/translation_builder.rb +16 -1
- data/lib/hecks/bluebook/dsl/word_gate.rb +1 -1
- data/lib/hecks/bluebook/dsl.rb +1 -0
- data/lib/hecks/bluebook/meta_validator/judge/identity.rb +9 -4
- data/lib/hecks/bluebook/meta_validator/plan/category.rb +10 -2
- data/lib/hecks/bluebook/meta_validator/plan/verbs.rb +9 -0
- data/lib/hecks/bluebook/meta_validator/plan.rb +2 -1
- data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +3 -1
- data/lib/hecks/bluebook/meta_validator/reconstruction/reading.rb +7 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +7 -2
- data/lib/hecks/bluebook/meta_validator/shapes.rb +3 -0
- data/lib/hecks/bluebook/meta_validator/syntax_boot/disk_cache.rb +1 -1
- data/lib/hecks/bluebook/model_check/aggregate_checks.rb +27 -0
- data/lib/hecks/bluebook/model_check/ask_checks.rb +25 -0
- data/lib/hecks/bluebook/model_check/reaction_chains.rb +114 -0
- data/lib/hecks/bluebook/model_check/reaction_cycles.rb +53 -0
- data/lib/hecks/bluebook/model_check/reaction_depth_checks.rb +58 -0
- data/lib/hecks/bluebook/model_check/reaction_walk.rb +62 -0
- data/lib/hecks/bluebook/model_check.rb +5 -27
- data/lib/hecks/bluebook/process_manager.rb +20 -3
- data/lib/hecks/bluebook/translation.rb +5 -3
- data/lib/hecks/bluebook/translation_plan.rb +9 -2
- data/lib/hecks/ci_pipeline/adapters/ci_cache.adapter +7 -0
- data/lib/hecks/ci_pipeline/adapters/ci_cache.rb +39 -0
- data/lib/hecks/ci_pipeline/adapters/ci_runner.adapter +7 -0
- data/lib/hecks/ci_pipeline/adapters/ci_runner.rb +55 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.behaviors +322 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.bluebook +938 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.hecksagon +12 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.ports.hecksagon +16 -0
- data/lib/hecks/ci_speed/adapters/ci_reader.adapter +7 -0
- data/lib/hecks/ci_speed/adapters/ci_reader.rb +141 -0
- data/lib/hecks/ci_speed/adapters/local_runner/answer.rb +41 -0
- data/lib/hecks/ci_speed/adapters/local_runner/catalog.rb +89 -0
- data/lib/hecks/ci_speed/adapters/local_runner/checkouts.rb +89 -0
- data/lib/hecks/ci_speed/adapters/local_runner/launcher.rb +69 -0
- data/lib/hecks/ci_speed/adapters/local_runner/load_average.rb +38 -0
- data/lib/hecks/ci_speed/adapters/local_runner/refs.rb +39 -0
- data/lib/hecks/ci_speed/adapters/local_runner/refused.rb +11 -0
- data/lib/hecks/ci_speed/adapters/local_runner/verdict.rb +71 -0
- data/lib/hecks/ci_speed/adapters/local_runner.adapter +7 -0
- data/lib/hecks/ci_speed/adapters/local_runner.rb +168 -0
- data/lib/hecks/ci_speed/adapters/replayed_runner.rb +39 -0
- data/lib/hecks/ci_speed/ci_speed.behaviors +341 -0
- data/lib/hecks/ci_speed/ci_speed.bluebook +1073 -0
- data/lib/hecks/ci_speed/ci_speed.hecksagon +11 -0
- data/lib/hecks/ci_speed/ci_speed.ports.hecksagon +21 -0
- data/lib/hecks/ci_workflows/ci_workflows.behaviors +13 -0
- data/lib/hecks/ci_workflows/ci_workflows.bluebook +173 -0
- data/lib/hecks/ci_workflows/ci_workflows.hecksagon +15 -0
- data/lib/hecks/coder/coder.bluebook +385 -0
- data/lib/hecks/coder/coder.hecksagon +12 -0
- data/lib/hecks/command_names/check.rb +39 -0
- data/lib/hecks/command_names/extractor.rb +67 -0
- data/lib/hecks/command_names/index.rb +40 -0
- data/lib/hecks/command_names/resolution.rb +81 -0
- data/lib/hecks/command_names/scan.rb +54 -0
- data/lib/hecks/command_names/sources.rb +73 -0
- data/lib/hecks/command_names.rb +26 -0
- data/lib/hecks/composer/jobs.rb +1 -1
- data/lib/hecks/composer/toolbox.rb +8 -1
- data/lib/hecks/corpus/generated_key.rb +205 -0
- data/lib/hecks/corpus/listing.rb +34 -0
- data/lib/hecks/corpus/rust.rb +27 -11
- data/lib/hecks/corpus/sources.rb +2 -1
- data/lib/hecks/corpus.rb +37 -42
- data/lib/hecks/deprecation.rb +23 -0
- data/lib/hecks/doc/reference/readme.rb +1 -1
- data/lib/hecks/doc/reference/rendering.rb +2 -2
- data/lib/hecks/doc/reference.rb +1 -1
- data/lib/hecks/embryonaut_bluebook/manifest.rb +1 -1
- data/lib/hecks/fixer/fixer.bluebook +240 -0
- data/lib/hecks/fixer/fixer.hecksagon +17 -0
- data/lib/hecks/framework_bluebooks.rb +32 -7
- data/lib/hecks/fuzzing/concurrent_dispatch/world_copy.rb +1 -0
- data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +11 -12
- data/lib/hecks/fuzzing/isolated_boot/worlds.rb +23 -5
- data/lib/hecks/fuzzing/isolated_boot.rb +1 -1
- data/lib/hecks/fuzzing/mutation/checks.rb +3 -3
- data/lib/hecks/grammar/translation.bluebook +1 -1
- data/lib/hecks/grammar/translation_rules.json +64 -0
- data/lib/hecks/hecks/adapter_words.json +7 -0
- data/lib/hecks/hecks/adapters/area_overlap.rb +156 -0
- data/lib/hecks/hecks/adapters/claude_agents.rb +8 -3
- data/lib/hecks/hecks/adapters/codebase/batch_runs.rb +60 -0
- data/lib/hecks/hecks/adapters/codebase/changed_specs.rb +52 -0
- data/lib/hecks/hecks/adapters/codebase/codemods.rb +3 -2
- data/lib/hecks/hecks/adapters/codebase/conformance.rb +14 -1
- data/lib/hecks/hecks/adapters/codebase/corpus_queries.rb +53 -0
- data/lib/hecks/hecks/adapters/codebase/generated_keys.rb +31 -0
- data/lib/hecks/hecks/adapters/codebase/impacted_specs.rb +110 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +2 -2
- data/lib/hecks/hecks/adapters/codebase/launcher_text.rb +39 -0
- data/lib/hecks/hecks/adapters/codebase/minitest_runs.rb +52 -0
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +51 -8
- data/lib/hecks/hecks/adapters/codebase/run_options.rb +35 -0
- data/lib/hecks/hecks/adapters/codebase/scripting.rb +39 -0
- data/lib/hecks/hecks/adapters/codebase/search.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +79 -51
- data/lib/hecks/hecks/adapters/codebase/spec_files/report.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/spec_files/shared_run.rb +73 -0
- data/lib/hecks/hecks/adapters/codebase/spec_files.rb +95 -0
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +53 -4
- data/lib/hecks/hecks/adapters/codebase/test_scope.rb +105 -0
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +48 -34
- data/lib/hecks/hecks/adapters/console_capture.rb +1 -1
- data/lib/hecks/hecks/adapters/cost_explorer.rb +9 -1
- data/lib/hecks/hecks/adapters/dispatching/brief_text.rb +51 -0
- data/lib/hecks/hecks/adapters/dispatching/launcher.rb +97 -0
- data/lib/hecks/hecks/adapters/dispatching/plan.rb +82 -0
- data/lib/hecks/hecks/adapters/dispatching/rows.rb +66 -0
- data/lib/hecks/hecks/adapters/dispatching/settings.rb +81 -0
- data/lib/hecks/hecks/adapters/dispatching/settler.rb +40 -0
- data/lib/hecks/hecks/adapters/dispatching.adapter +7 -0
- data/lib/hecks/hecks/adapters/dispatching.rb +93 -0
- data/lib/hecks/hecks/adapters/doctor_reading/report.rb +27 -0
- data/lib/hecks/hecks/adapters/doctor_reading.adapter +7 -0
- data/lib/hecks/hecks/adapters/doctor_reading.rb +161 -0
- data/lib/hecks/hecks/adapters/git_checkout.rb +1 -1
- data/lib/hecks/hecks/adapters/git_commit.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_commit.rb +61 -0
- data/lib/hecks/hecks/adapters/git_landing/finisher.rb +82 -0
- data/lib/hecks/hecks/adapters/git_landing/foreign_hold.rb +111 -0
- data/lib/hecks/hecks/adapters/git_landing/line.rb +171 -0
- data/lib/hecks/hecks/adapters/git_landing/lineup.rb +98 -0
- data/lib/hecks/hecks/adapters/git_landing/merger.rb +1 -1
- data/lib/hecks/hecks/adapters/git_landing/numbering.rb +54 -0
- data/lib/hecks/hecks/adapters/git_landing/rivals.rb +59 -0
- data/lib/hecks/hecks/adapters/git_landing/ticket.rb +156 -0
- data/lib/hecks/hecks/adapters/git_landing/tidy.rb +147 -0
- data/lib/hecks/hecks/adapters/git_landing/train.rb +104 -0
- data/lib/hecks/hecks/adapters/git_landing/verdict.rb +64 -0
- data/lib/hecks/hecks/adapters/git_landing/waiting.rb +120 -0
- data/lib/hecks/hecks/adapters/git_landing.rb +106 -20
- data/lib/hecks/hecks/adapters/git_main_pull.rb +99 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/bench.rb +82 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/due.rb +84 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/impacted/skips.rb +47 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/impacted/spec_run.rb +75 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/impacted.rb +181 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/line.rb +76 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/reading.rb +24 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/record.rb +146 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/spec_map/corpus.rb +25 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/spec_map/needles.rb +61 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/spec_map.rb +105 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/stages.rb +118 -0
- data/lib/hecks/hecks/adapters/git_rehearsal.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_rehearsal.rb +141 -0
- data/lib/hecks/hecks/adapters/git_train/bench.rb +15 -15
- data/lib/hecks/hecks/adapters/git_train/branch_guard.rb +62 -0
- data/lib/hecks/hecks/adapters/git_train/carriage.rb +27 -28
- data/lib/hecks/hecks/adapters/git_train/launcher_shape.rb +75 -0
- data/lib/hecks/hecks/adapters/git_train/mint_step.rb +47 -0
- data/lib/hecks/hecks/adapters/git_train/settlement.rb +167 -0
- data/lib/hecks/hecks/adapters/git_train.rb +73 -15
- data/lib/hecks/hecks/adapters/git_worktree_add.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_worktree_add.rb +68 -0
- data/lib/hecks/hecks/adapters/github_pull_requests.adapter +7 -0
- data/lib/hecks/hecks/adapters/github_pull_requests.rb +109 -0
- data/lib/hecks/hecks/adapters/host_http.rb +6 -6
- data/lib/hecks/hecks/adapters/in_process_boot.rb +10 -8
- data/lib/hecks/hecks/adapters/in_process_operations.rb +11 -17
- data/lib/hecks/hecks/adapters/in_process_undo.rb +17 -0
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +13 -4
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +28 -15
- data/lib/hecks/hecks/adapters/journal_store/examination.rb +17 -1
- data/lib/hecks/hecks/adapters/journal_store/held_domain/renaming.rb +45 -0
- data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +31 -5
- data/lib/hecks/hecks/adapters/journal_store/held_mint.rb +128 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/attestation.rb +1 -1
- data/lib/hecks/hecks/adapters/journal_store/readings/boot_status.rb +58 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/composition.rb +39 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/outcomes.rb +76 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/postgres_reader.rb +44 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/reader.rb +64 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/report.rb +102 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/sqlite_reader.rb +43 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/stores.rb +80 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/subscribers.rb +72 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/summary.rb +39 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace.rb +39 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/command_line.rb +57 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/edge_guards.rb +107 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/inspection.rb +94 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/plan.rb +66 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/report.rb +72 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/store.rb +34 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/watermark_guards.rb +86 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/world.rb +66 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan.rb +36 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/projection_audit.rb +64 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/scaffolding.rb +3 -3
- data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status/database_reading.rb +113 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status/read_only.rb +33 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status.rb +32 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +13 -1
- data/lib/hecks/hecks/adapters/journal_store/reconcile_report.rb +60 -0
- data/lib/hecks/hecks/adapters/journal_store/reconciliation.rb +121 -0
- data/lib/hecks/hecks/adapters/journal_store/translation_write/shape_edge.rb +59 -0
- data/lib/hecks/hecks/adapters/journal_store/translation_write.rb +123 -0
- data/lib/hecks/hecks/adapters/journal_store.rb +16 -0
- data/lib/hecks/hecks/adapters/landed_work.adapter +7 -0
- data/lib/hecks/hecks/adapters/landed_work.rb +52 -0
- data/lib/hecks/hecks/adapters/local_files.rb +6 -6
- data/lib/hecks/hecks/adapters/process_pool.rb +3 -2
- data/lib/hecks/hecks/adapters/push_size.rb +57 -0
- data/lib/hecks/hecks/adapters/qa_quiescing.adapter +7 -0
- data/lib/hecks/hecks/adapters/qa_quiescing.rb +57 -0
- data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +30 -3
- data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +63 -3
- data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +29 -6
- data/lib/hecks/hecks/adapters/rehearsal/subject.rb +11 -5
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +10 -1
- data/lib/hecks/hecks/adapters/rust_workspace.rb +1 -1
- data/lib/hecks/hecks/adapters/settings_reading/disposable_ledger.rb +32 -0
- data/lib/hecks/hecks/adapters/settings_reading/push_nudge.rb +26 -0
- data/lib/hecks/hecks/adapters/settings_reading/stores.rb +76 -0
- data/lib/hecks/hecks/adapters/settings_reading/test_scope.rb +28 -0
- data/lib/hecks/hecks/adapters/settings_reading.rb +28 -2
- data/lib/hecks/hecks/adapters/started_work.rb +42 -0
- data/lib/hecks/hecks/adapters/terminal.rb +12 -10
- data/lib/hecks/hecks/adapters/where_reading.adapter +7 -0
- data/lib/hecks/hecks/adapters/where_reading.rb +64 -0
- data/lib/hecks/hecks/adapters/work_areas.rb +57 -0
- data/lib/hecks/hecks/adapters/work_limits.rb +57 -0
- data/lib/hecks/hecks/build/build.bluebook +576 -0
- data/lib/hecks/hecks/check/check.bluebook +966 -0
- data/lib/hecks/hecks/codebase.behaviors +61 -5
- data/lib/hecks/hecks/composer.behaviors +1 -1
- data/lib/hecks/hecks/context_map.hecksagon +1 -1
- data/lib/hecks/hecks/custodian.behaviors +33 -7
- data/lib/hecks/hecks/delegate/delegate.bluebook +355 -0
- data/lib/hecks/hecks/deliver/deliver.bluebook +945 -0
- data/lib/hecks/hecks/deploy.behaviors +1 -1
- data/lib/hecks/hecks/evolve/evolve.bluebook +788 -0
- data/lib/hecks/hecks/find/find.bluebook +81 -0
- data/lib/hecks/hecks/hecks.behaviors +1 -1
- data/lib/hecks/hecks/hecks.bluebook +0 -133
- data/lib/hecks/hecks/hecks.contextmap +2 -0
- data/lib/hecks/hecks/hecks.hecksagon +185 -29
- data/lib/hecks/hecks/hecks.world +35 -9
- data/lib/hecks/hecks/implicit_moves.json +24 -0
- data/lib/hecks/hecks/migrate/migrate.bluebook +1066 -0
- data/lib/hecks/hecks/operate/operate.bluebook +695 -0
- data/lib/hecks/hecks/quiesce/quiesce.bluebook +117 -0
- data/lib/hecks/hecks/rehearse/rehearse.bluebook +133 -0
- data/lib/hecks/hecks/release/release.bluebook +916 -0
- data/lib/hecks/hecks/serve/serve.bluebook +134 -0
- data/lib/hecks/hecks/shapes.json +1 -15
- data/lib/hecks/hecks/site.behaviors +1 -1
- data/lib/hecks/hecks/start/start.bluebook +194 -0
- data/lib/hecks/hecks/test/test.bluebook +638 -0
- data/lib/hecks/hecks/tickets.world +14 -0
- data/lib/hecks/language/bluebook/aggregate.bluebook +22 -0
- data/lib/hecks/language/bluebook/bluebook.bluebook +34 -0
- data/lib/hecks/language/bluebook/command.bluebook +35 -0
- data/lib/hecks/language/bluebook/process_manager.bluebook +14 -1
- data/lib/hecks/language/bluebook/vocabulary.bluebook +174 -54
- data/lib/hecks/language/hecksagon/domain_port.bluebook +1 -0
- data/lib/hecks/language/hecksagon/port_operation.bluebook +14 -0
- data/lib/hecks/language/kinds/run.kind +120 -0
- data/lib/hecks/language/oidc.json +10 -0
- data/lib/hecks/language/translation/translation_aggregate.bluebook +24 -0
- data/lib/hecks/module_folders.rb +31 -0
- data/lib/hecks/ports/key_vault.rb +1 -1
- data/lib/hecks/ports/persistence/append_only.rb +26 -8
- data/lib/hecks/ports/persistence/binding_policy.rb +3 -1
- data/lib/hecks/ports/persistence/codec_boundary.rb +1 -1
- data/lib/hecks/ports/persistence/mint_door.rb +74 -0
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +6 -5
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +5 -1
- data/lib/hecks/ports/persistence/plugins/era/era_status.rb +48 -0
- data/lib/hecks/ports/persistence/plugins/era/projected_bluebook.rb +127 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/additive_shape.rb +107 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/compose.rb +155 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/compose_render.rb +79 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/edge_files.rb +49 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/edge_route.rb +61 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/implicit_edge.rb +67 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/reconcile.rb +130 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/reconcile_files.rb +35 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +13 -5
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +5 -0
- data/lib/hecks/ports/persistence/plugins/era.rb +1 -0
- data/lib/hecks/ports/persistence/repository_factory.rb +11 -3
- data/lib/hecks/ports/persistence/stored_name_guard.rb +36 -0
- data/lib/hecks/ports/persistence.rb +2 -0
- data/lib/hecks/projections/ci_pipeline/table/checks.rb +137 -0
- data/lib/hecks/projections/ci_pipeline/table/lookup.rb +59 -0
- data/lib/hecks/projections/ci_pipeline/table/refusals.rb +58 -0
- data/lib/hecks/projections/ci_pipeline/table/rows.rb +119 -0
- data/lib/hecks/projections/ci_pipeline/table/tree.rb +30 -0
- data/lib/hecks/projections/ci_pipeline/table/typing.rb +92 -0
- data/lib/hecks/projections/ci_pipeline/table.rb +112 -0
- data/lib/hecks/projections/ci_pipeline/workflows.rb +162 -0
- data/lib/hecks/projections/ci_pipeline/yaml_text.rb +104 -0
- data/lib/hecks/projections/deploy/box/hosting.rb +1 -1
- data/lib/hecks/projections/deploy/box/roll_recipe.rb +1 -1
- data/lib/hecks/projections/deploy/box/roll_scripts.rb +1 -1
- data/lib/hecks/projections/deploy/box.rb +1 -1
- data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +1 -1
- data/lib/hecks/projections/deploy/templates/lambda/Makefile.tmpl +3 -3
- data/lib/hecks/projections/undo.rb +46 -0
- data/lib/hecks/projections.rb +2 -0
- data/lib/hecks/projector/cli_projector/claims.rb +11 -0
- data/lib/hecks/projector/cli_projector/command_help.rb +6 -1
- data/lib/hecks/projector/cli_projector/command_specs.rb +11 -1
- data/lib/hecks/projector/cli_projector/completion.rb +87 -0
- data/lib/hecks/projector/cli_projector/everyday.rb +40 -0
- data/lib/hecks/projector/cli_projector/json_listing.rb +77 -0
- data/lib/hecks/projector/cli_projector/listing.rb +1 -1
- data/lib/hecks/projector/cli_projector/modules.rb +39 -0
- data/lib/hecks/projector/cli_projector/query_specs.rb +1 -0
- data/lib/hecks/projector/cli_projector/renames.rb +58 -0
- data/lib/hecks/projector/cli_projector/search.rb +74 -0
- data/lib/hecks/projector/cli_projector/usage.rb +23 -6
- data/lib/hecks/projector/cli_projector.rb +24 -1
- data/lib/hecks/quality_control/adapters/ci_head.adapter +8 -0
- data/lib/hecks/quality_control/adapters/image_roll.adapter +9 -0
- data/lib/hecks/quality_control/adapters/image_roll.rb +158 -0
- data/lib/hecks/quality_control/adapters/main_maintenance.adapter +8 -0
- data/lib/hecks/quality_control/adapters/main_maintenance.rb +275 -0
- data/lib/hecks/quality_control/adapters/pump_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/pump_tools.rb +18 -0
- data/lib/hecks/quality_control/adapters/push_due_reader.adapter +8 -0
- data/lib/hecks/quality_control/adapters/push_due_reader.rb +99 -0
- data/lib/hecks/quality_control/adapters/qa_auto_mint.rb +183 -0
- data/lib/hecks/quality_control/adapters/qa_era_mint.rb +94 -0
- data/lib/hecks/quality_control/adapters/qa_quiesce_marker.rb +126 -0
- data/lib/hecks/quality_control/adapters/run_keys.rb +36 -0
- data/lib/hecks/quality_control/adapters/run_reader.adapter +7 -0
- data/lib/hecks/quality_control/adapters/run_reader.rb +188 -0
- data/lib/hecks/quality_control/cli/child.rb +1 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/scanning.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +3 -3
- data/lib/hecks/quality_control/cli/qa_event_pump/attached.rb +67 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/consumer.rb +103 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/cursors.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/reactions.rb +46 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/reader.rb +30 -0
- data/lib/hecks/quality_control/cli/qa_event_pump.rb +76 -0
- data/lib/hecks/quality_control/cli/qa_fix_main_bug/publishing.rb +79 -0
- data/lib/hecks/quality_control/cli/qa_fix_main_bug.rb +167 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/evaluation.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +3 -3
- data/lib/hecks/quality_control/cli/qa_main_gate/gate_run.rb +52 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/logging.rb +70 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/shell.rb +47 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/sweeping.rb +59 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/worktree.rb +62 -0
- data/lib/hecks/quality_control/cli/qa_main_gate.rb +135 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_pr_check/checking.rb +2 -3
- data/lib/hecks/quality_control/cli/qa_push_nudge.rb +48 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles/seed.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_sweep/seat.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_tick/event_pump_step.rb +34 -0
- data/lib/hecks/quality_control/cli/qa_tick/output.rb +16 -1
- data/lib/hecks/quality_control/cli/qa_tick/push_nudge_step.rb +28 -0
- data/lib/hecks/quality_control/cli/qa_tick/quiesce_guard.rb +51 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +36 -8
- data/lib/hecks/quality_control/quality_control.behaviors +65 -0
- data/lib/hecks/quality_control/quality_control.bluebook +1131 -11
- data/lib/hecks/quality_control/quality_control.hecksagon +11 -0
- data/lib/hecks/quality_control/quality_control.ports.hecksagon +138 -0
- data/lib/hecks/query_ir/touchpoints.rb +5 -7
- data/lib/hecks/refused.rb +21 -0
- data/lib/hecks/release/approval.rb +6 -3
- data/lib/hecks/release/conditions.rb +46 -0
- data/lib/hecks/release/runner/gem_publisher.rb +4 -4
- data/lib/hecks/release/version_commit.rb +48 -0
- data/lib/hecks/runtime/command_interpreter/hydration.rb +5 -4
- data/lib/hecks/runtime/command_interpreter/persisting.rb +11 -3
- data/lib/hecks/runtime/command_interpreter.rb +2 -2
- data/lib/hecks/runtime/command_rules/admissibility.rb +0 -2
- data/lib/hecks/runtime/command_rules/emission.rb +0 -1
- data/lib/hecks/runtime/dependency_planning/expression_reads.rb +0 -1
- data/lib/hecks/runtime/dispatcher/planning.rb +24 -0
- data/lib/hecks/runtime/dispatcher/routing.rb +6 -0
- data/lib/hecks/runtime/dispatcher/value_routing.rb +54 -0
- data/lib/hecks/runtime/dispatcher.rb +7 -1
- data/lib/hecks/runtime/dry_run_plan.rb +60 -0
- data/lib/hecks/runtime/entity_element/location.rb +0 -1
- data/lib/hecks/runtime/entity_element/mutations.rb +0 -1
- data/lib/hecks/runtime/entity_interpreter/locating.rb +5 -0
- data/lib/hecks/runtime/entity_interpreter.rb +0 -1
- data/lib/hecks/runtime/errors.rb +26 -0
- data/lib/hecks/runtime/instance.rb +0 -1
- data/lib/hecks/runtime/invocation_builder.rb +0 -1
- data/lib/hecks/runtime/outbox/consumer_runner.rb +9 -1
- data/lib/hecks/runtime/outbox/relay.rb +25 -4
- data/lib/hecks/runtime/outbox/runnable.rb +3 -1
- data/lib/hecks/runtime/outbox.rb +6 -2
- data/lib/hecks/runtime/policy_interpreter/fan_out.rb +18 -2
- data/lib/hecks/runtime/policy_interpreter.rb +17 -9
- data/lib/hecks/runtime/port_operation_interpreter.rb +21 -7
- data/lib/hecks/runtime/query_interpreter/arguments.rb +6 -5
- data/lib/hecks/runtime/reaction_invocation.rb +0 -1
- data/lib/hecks/runtime/refusal_wording.rb +12 -1
- data/lib/hecks/runtime/registry/context_maps.rb +1 -5
- data/lib/hecks/runtime/registry/declarations.rb +34 -4
- data/lib/hecks/runtime/registry/hecksagon_rules.rb +15 -1
- data/lib/hecks/runtime/registry/runtime_state.rb +10 -0
- data/lib/hecks/runtime/registry/world_defaults.rb +24 -2
- data/lib/hecks/runtime/registry/world_names.rb +99 -0
- data/lib/hecks/runtime/registry.rb +33 -27
- data/lib/hecks/runtime/saga_interpreter/compensation.rb +10 -0
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +29 -3
- data/lib/hecks/runtime/saga_interpreter/delivery.rb +0 -1
- data/lib/hecks/runtime/saga_interpreter/lifecycle.rb +1 -1
- data/lib/hecks/runtime/saga_interpreter.rb +46 -2
- data/lib/hecks/runtime/value/coercion.rb +36 -8
- data/lib/hecks/rust_build/conformance.rb +16 -5
- data/lib/hecks/rust_build/parser.rb +25 -0
- data/lib/hecks/rust_build/project_rust/codegen_run.rb +45 -12
- data/lib/hecks/rust_build/project_rust/declared.rb +80 -0
- data/lib/hecks/rust_build/project_rust/features_header.rb +22 -0
- data/lib/hecks/rust_build/project_rust/manifest.rb +96 -0
- data/lib/hecks/rust_build/project_rust/meta.rb +36 -0
- data/lib/hecks/rust_build/project_rust.rb +28 -90
- data/lib/hecks/rust_build/write_if_changed.rb +19 -4
- data/lib/hecks/rust_build.rb +2 -1
- data/lib/hecks/rust_format.rb +32 -2
- data/lib/hecks/secrets.rb +111 -0
- data/lib/hecks/shape_ledger/edge_hygiene.rb +170 -0
- data/lib/hecks/shape_ledger/scope.rb +51 -0
- data/lib/hecks/shape_ledger/status.rb +89 -0
- data/lib/hecks/shape_ledger.rb +78 -33
- data/lib/hecks/site/bluebook/site.bluebook +1 -0
- data/lib/hecks/storehouse/audit.rb +34 -4
- data/lib/hecks/storehouse/callers.rb +8 -0
- data/lib/hecks/storehouse/dispatching.rb +14 -3
- data/lib/hecks/storehouse/identity.rb +41 -0
- data/lib/hecks/storehouse/querying.rb +7 -7
- data/lib/hecks/storehouse.rb +28 -10
- data/lib/hecks/tickets/bluebook/adapters/work_areas.adapter +7 -0
- data/lib/hecks/tickets/bluebook/adapters/work_limits.adapter +7 -0
- data/lib/hecks/tickets/bluebook/tickets.behaviors +70 -0
- data/lib/hecks/tickets/bluebook/tickets.bluebook +323 -28
- data/lib/hecks/tickets/bluebook/tickets.hecksagon +7 -0
- data/lib/hecks/tickets/bluebook/tickets.ports.hecksagon +17 -0
- data/lib/hecks/{cli → tools}/behaviors.rb +1 -1
- data/lib/hecks/{cli → tools}/canonicalise.rb +1 -1
- data/lib/hecks/{cli → tools}/check_engine_agreement.rb +1 -1
- data/lib/hecks/{cli → tools}/check_era.rb +6 -6
- data/lib/hecks/tools/ci_gates.rb +8 -2
- data/lib/hecks/tools/ci_workflows.rb +98 -0
- data/lib/hecks/{cli → tools}/console.rb +1 -1
- data/lib/hecks/{cli → tools}/deploy_template_diff.rb +1 -1
- data/lib/hecks/{cli → tools}/doc_coverage.rb +2 -2
- data/lib/hecks/{cli → tools}/document.rb +1 -1
- data/lib/hecks/{cli → tools}/domain_stub.rb +1 -1
- data/lib/hecks/{cli → tools}/domain_writer.rb +1 -1
- data/lib/hecks/tools/downstream_model_check.rb +122 -0
- data/lib/hecks/tools/evolve_run.rb +2 -2
- data/lib/hecks/{cli → tools}/expected_era.rb +1 -1
- data/lib/hecks/{cli → tools}/expression_projection.rb +1 -1
- data/lib/hecks/{cli → tools}/follow.rb +1 -1
- data/lib/hecks/tools/fuzz_sweep/options.rb +40 -5
- data/lib/hecks/tools/fuzz_sweep/pool.rb +12 -1
- data/lib/hecks/tools/fuzz_sweep/shards.rb +155 -0
- data/lib/hecks/tools/fuzz_sweep.rb +11 -5
- data/lib/hecks/tools/gate.rb +38 -29
- data/lib/hecks/tools/gate_memo/local_files.rb +33 -0
- data/lib/hecks/tools/gate_memo/rehearsal.rb +54 -0
- data/lib/hecks/tools/gate_memo/ruby_files.rb +152 -0
- data/lib/hecks/tools/gate_memo/session.rb +114 -0
- data/lib/hecks/tools/gate_memo/standalone.rb +67 -0
- data/lib/hecks/tools/gate_memo.rb +196 -0
- data/lib/hecks/tools/gate_report.rb +56 -0
- data/lib/hecks/{cli → tools}/history.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_agent.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_aggregate.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_draft.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_record.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_run.rb +2 -2
- data/lib/hecks/{cli → tools}/interview_session/agent_state.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session/catalog.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session/manual_findings.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session/proposals.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session.rb +2 -2
- data/lib/hecks/{cli → tools}/interview_shape/lifecycle.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_shape.rb +1 -1
- data/lib/hecks/{cli → tools}/ir.rb +1 -1
- data/lib/hecks/tools/lanes/files.rb +1 -1
- data/lib/hecks/tools/lanes/watch_workflow.rb +6 -8
- data/lib/hecks/tools/lanes/workflow.rb +1 -1
- data/lib/hecks/tools/lanes.rb +1 -1
- data/lib/hecks/{cli → tools}/mcp.rb +1 -1
- data/lib/hecks/{cli → tools}/model_check/examination.rb +1 -1
- data/lib/hecks/{cli → tools}/model_check/sources.rb +1 -1
- data/lib/hecks/{cli → tools}/model_check.rb +1 -1
- data/lib/hecks/tools/move_disables/reasons.rb +35 -0
- data/lib/hecks/tools/move_disables.rb +211 -0
- data/lib/hecks/tools/move_former_name.rb +105 -0
- data/lib/hecks/{cli → tools}/pattern_cases.rb +1 -1
- data/lib/hecks/{cli → tools}/persistence_notice.rb +1 -1
- data/lib/hecks/{cli → tools}/present.rb +1 -1
- data/lib/hecks/{cli → tools}/project_cli/launcher_source.rb +32 -22
- data/lib/hecks/{cli → tools}/project_cli/templates.rb +22 -15
- data/lib/hecks/{cli → tools}/project_cli.rb +11 -7
- data/lib/hecks/{cli → tools}/project_diagrams.rb +3 -3
- data/lib/hecks/{cli → tools}/project_glossary.rb +2 -2
- data/lib/hecks/{cli → tools}/reference.rb +2 -2
- data/lib/hecks/{cli → tools}/refresh_projections.rb +1 -1
- data/lib/hecks/{cli → tools}/refresh_rspec_runtime_baseline.rb +1 -1
- data/lib/hecks/tools/regeneration_run/pool.rb +148 -0
- data/lib/hecks/tools/regeneration_run/scratch.rb +76 -0
- data/lib/hecks/tools/regeneration_run.rb +125 -103
- data/lib/hecks/{cli → tools}/release.rb +1 -1
- data/lib/hecks/{cli → tools}/release_gem.rb +1 -1
- data/lib/hecks/{cli → tools}/rspec_io_parallel_files.rb +1 -1
- data/lib/hecks/{cli → tools}/rspec_shard_files.rb +1 -1
- data/lib/hecks/{cli → tools}/run.rb +9 -2
- data/lib/hecks/{cli → tools}/run_expectations.rb +1 -1
- data/lib/hecks/{cli → tools}/seed_semantics_corpus.rb +4 -4
- data/lib/hecks/{cli → tools}/serve_query_ir_mcp.rb +1 -1
- data/lib/hecks/{cli → tools}/shape.rb +3 -2
- data/lib/hecks/{cli → tools}/smoke_http/checks.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_http/settings.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_http/transport.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_http.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_test.rb +1 -1
- data/lib/hecks/{cli → tools}/spec_example.rb +1 -1
- data/lib/hecks/tools/stage_progress.rb +54 -0
- data/lib/hecks/{cli → tools}/statements.rb +1 -1
- data/lib/hecks/{cli → tools}/stores.rb +1 -1
- data/lib/hecks/{cli → tools}/stress_concurrency_specs/reporting.rb +1 -1
- data/lib/hecks/{cli → tools}/stress_concurrency_specs/usage.rb +4 -4
- data/lib/hecks/{cli → tools}/stress_concurrency_specs.rb +3 -3
- data/lib/hecks/tools/tenant_provisioning.rb +23 -0
- data/lib/hecks/tools/tools_doc.rb +10 -8
- data/lib/hecks/tools/translation_audit/edges.rb +21 -16
- data/lib/hecks/tools/translation_audit/verdicts.rb +1 -1
- data/lib/hecks/tools/translation_audit.rb +1 -1
- data/lib/hecks/tools/translation_scaffold.rb +1 -1
- data/lib/hecks/tools.rb +4 -1
- data/lib/hecks/version.rb +1 -1
- data/lib/hecks/vocabulary.rb +61 -31
- data/lib/hecks/workflow_pagination/judge.rb +48 -0
- data/lib/hecks/workflow_pagination/statement.rb +50 -0
- data/lib/hecks/workflow_pagination.rb +58 -0
- data/lib/hecks.rb +2 -0
- data/lib/rubocop/cop/hecks/bare_event_and_query_names.rb +58 -0
- data/lib/rubocop/cop/hecks/correlates_by_aggregate.rb +39 -0
- data/lib/rubocop/cop/hecks/creating_command_sets.rb +75 -0
- data/lib/rubocop/cop/hecks/invariant_expression_language.rb +47 -0
- data/lib/rubocop/cop/hecks/lifecycle_needs_attribute.rb +58 -0
- data/lib/rubocop/cop/hecks/no_id_string_attribute.rb +49 -0
- data/lib/rubocop/cop/hecks/one_terminal_mark_per_lifecycle.rb +47 -0
- data/lib/rubocop/cop/hecks/value_object_shorthand.rb +56 -0
- data/prebuilt/13c04bdc5970295b310f0a980d397ba722232c8da99cc1a0cdb383249921e871.marshal +0 -0
- data/prebuilt/e3857b77f47d9ecc1787b2e1f5136364f3cb3444ef4aea5479f3b98167affea2.marshal +0 -0
- data/qa/settings.yml +23 -0
- data/rust/.gitignore +0 -6
- data/rust/Cargo.toml +2 -1
- data/rust/build/Cargo.toml +1 -1
- data/rust/build/src/binding_pass.rs +57 -4
- data/rust/build/src/pipeline.rs +6 -4
- data/rust/build/src/resolve.rs +1 -0
- data/rust/codegen/Cargo.toml +1 -1
- data/rust/codegen/src/domain_generator.rs +3 -0
- data/rust/codegen/src/json_codec.rs +182 -23
- data/rust/codegen/src/one_of_references.rs +1 -0
- data/rust/codegen/src/queries.rs +20 -2
- data/rust/codegen/src/registry.rs +21 -5
- data/rust/expr/Cargo.toml +1 -1
- data/rust/host/Cargo.toml +1 -1
- data/rust/host/HECKS_RELEASE +1 -1
- data/rust/host/core/Cargo.toml +1 -1
- data/rust/host/src/bin/mint_harness.rs +1 -0
- data/rust/host/src/boot.rs +1 -0
- data/rust/host/src/store/mint.rs +40 -6
- data/rust/lsp/Cargo.toml +1 -1
- data/rust/parser/Cargo.toml +1 -1
- data/rust/parser/src/build/correlation_keys.rs +125 -0
- data/rust/parser/src/build/mod.rs +1 -0
- data/rust/parser/src/emit.rs +55 -3
- data/rust/parser/src/ir.rs +33 -1
- data/rust/parser/src/keywords.rs +289 -1
- data/rust/parser/src/main.rs +2 -0
- data/rust/parser/src/parse/aggregate.rs +10 -1
- data/rust/parser/src/parse/audience.rs +65 -0
- data/rust/parser/src/parse/command.rs +14 -0
- data/rust/parser/src/parse/declaration.rs +97 -0
- data/rust/parser/src/parse/domain_port.rs +6 -0
- data/rust/parser/src/parse/mod.rs +1 -0
- data/rust/parser/src/parse/process_manager.rs +17 -10
- data/rust/parser/src/parse/world.rs +12 -8
- data/rust/parser/src/render_ruby.rs +9 -0
- data/rust/parser/src/sentence/format.rs +3 -0
- data/rust/parser/src/sentence/process.rs +6 -2
- data/rust/src/exemplar/json.rs +17 -0
- data/rust/src/kernel/cli.rs +27 -3
- data/rust/src/kernel/dispatch.rs +4 -2
- data/rust/src/kernel/json.rs +62 -0
- data/rust/src/kernel/orchestrate.rs +28 -3
- data/rust/src/kernel/orchestrate_guard_tests.rs +12 -12
- data/rust/web/Cargo.toml +1 -1
- metadata +389 -96
- data/lib/hecks/cli/command_table.rb +0 -72
- data/lib/hecks/cli/launcher_words.rb +0 -168
- data/lib/hecks/cli.rb +0 -133
- data/lib/hecks/hecks/agents.bluebook +0 -246
- data/lib/hecks/hecks/codebase.bluebook +0 -3209
- data/lib/hecks/hecks/custodian.bluebook +0 -1300
- data/lib/hecks/hecks/ledger.bluebook +0 -190
- data/lib/hecks/hecks/rehearsal.bluebook +0 -437
- data/lib/hecks/hecks/tooling.bluebook +0 -1234
- data/lib/hecks/hecks/translations/2-148748.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-15a2e4.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-1b447c.bluebook +0 -5
- data/lib/hecks/hecks/translations/2-240474.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-44446d.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-46ca26.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-473eab.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-75cc28.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-781c07.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-84c18b.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-aa5fff.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-bfdb48.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-cd96d8.bluebook +0 -10
- data/lib/hecks/hecks/translations/2-d43f71.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-eea577.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-f53248.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-fbb677.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-ffdf12.bluebook +0 -6
- data/lib/hecks/quality_control/adapters/clearance_recorder.rb +0 -36
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +0 -56
- data/prebuilt/31cf81e12f16236ad26249be590cfea3799c9db67432e6a4ef54b801c355b6ae.marshal +0 -0
- data/prebuilt/68ecb2bd3abb1a221007db4f2b0375834c13aaccac8f2b99778e8517f11aa113.marshal +0 -0
- data/prebuilt/verdicts-0328c2403383837d780ad5ed81d1da351c56436b894cf9015b5d56b8f1f1bf10.json +0 -1
data/rust/build/src/pipeline.rs
CHANGED
|
@@ -24,6 +24,8 @@ pub struct Options {
|
|
|
24
24
|
|
|
25
25
|
struct Declaration {
|
|
26
26
|
mod_name: String,
|
|
27
|
+
// The bluebook's own name, as `hecks project_rust` labels it: whoever attached it, its files
|
|
28
|
+
// read the same.
|
|
27
29
|
source_label: String,
|
|
28
30
|
ir_text: String,
|
|
29
31
|
}
|
|
@@ -146,7 +148,7 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
|
|
|
146
148
|
let files = resolve::other_gem_bluebook_files(root, fw_name)?;
|
|
147
149
|
declarations.push(Declaration {
|
|
148
150
|
mod_name: fw_name.to_lowercase(),
|
|
149
|
-
source_label:
|
|
151
|
+
source_label: fw_name.clone(),
|
|
150
152
|
ir_text: parse_bluebook(&parser_bin, fw_name, &files)?,
|
|
151
153
|
});
|
|
152
154
|
continue;
|
|
@@ -175,7 +177,7 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
|
|
|
175
177
|
)?;
|
|
176
178
|
declarations.push(Declaration {
|
|
177
179
|
mod_name: fw_name.to_lowercase(),
|
|
178
|
-
source_label:
|
|
180
|
+
source_label: fw_name.clone(),
|
|
179
181
|
ir_text: fw_ir_text,
|
|
180
182
|
});
|
|
181
183
|
}
|
|
@@ -206,7 +208,7 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
|
|
|
206
208
|
// `expected_bluebook_name` above), not the raw `pkg_name` — that
|
|
207
209
|
// would diverge the moment a package name has an underscore.
|
|
208
210
|
mod_name: expected_bluebook_name.to_lowercase(),
|
|
209
|
-
source_label:
|
|
211
|
+
source_label: pkg_bluebook_name,
|
|
210
212
|
ir_text: pkg_ir_text,
|
|
211
213
|
});
|
|
212
214
|
}
|
|
@@ -221,7 +223,7 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
|
|
|
221
223
|
sources.extend(hecksagon_path.iter().cloned());
|
|
222
224
|
siblings.push(Declaration {
|
|
223
225
|
mod_name: name.to_lowercase(),
|
|
224
|
-
source_label:
|
|
226
|
+
source_label: name.clone(),
|
|
225
227
|
ir_text: parse_bluebook(&parser_bin, name, &sources)?,
|
|
226
228
|
});
|
|
227
229
|
}
|
data/rust/build/src/resolve.rs
CHANGED
data/rust/codegen/Cargo.toml
CHANGED
|
@@ -20,7 +20,7 @@ path = "src/main.rs"
|
|
|
20
20
|
debug = 0
|
|
21
21
|
|
|
22
22
|
# Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
|
|
23
|
-
# out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
|
|
23
|
+
# out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
|
|
24
24
|
# The same table is in every crate's Cargo.toml; change them together.
|
|
25
25
|
[lints.clippy]
|
|
26
26
|
pedantic = { level = "warn", priority = -1 }
|
|
@@ -68,6 +68,7 @@ fn reference_checks(
|
|
|
68
68
|
optional: crate::attr::optional(attr),
|
|
69
69
|
list_item: None,
|
|
70
70
|
union_tag: None,
|
|
71
|
+
settled: false,
|
|
71
72
|
target_mod: target
|
|
72
73
|
.get("name")
|
|
73
74
|
.and_then(Json::as_str)
|
|
@@ -155,6 +156,7 @@ fn state_reference_checks(
|
|
|
155
156
|
optional: crate::attr::optional(source_attr),
|
|
156
157
|
list_item,
|
|
157
158
|
union_tag: None,
|
|
159
|
+
settled: true,
|
|
158
160
|
target_mod: target
|
|
159
161
|
.get("name")
|
|
160
162
|
.and_then(Json::as_str)
|
|
@@ -1217,6 +1219,7 @@ pub fn generate(
|
|
|
1217
1219
|
aggregate: format!("{domain_name}::{agg_name}"),
|
|
1218
1220
|
arg_checks: queries::query_arg_checks(
|
|
1219
1221
|
query,
|
|
1222
|
+
agg_name,
|
|
1220
1223
|
&format!(
|
|
1221
1224
|
"crate::generated::{mod_name}::{}",
|
|
1222
1225
|
crate::naming::aggregate_module(agg_name)
|
|
@@ -84,6 +84,78 @@ pub fn scalar_json_accessor(scalar_type: &str) -> &'static str {
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
/// The refusal for a reference argument offered as anything but an id string, worded as Ruby's
|
|
88
|
+
/// `Value.refuse_object_reference` (`reference_wrong_shape`): an object is "an object", any other
|
|
89
|
+
/// value is described as it arrived. `known_by` is the target's `" (X is known by heads)"` tail.
|
|
90
|
+
/// `" (Target is known by heads)"` for a single reference attribute whose target aggregate is
|
|
91
|
+
/// known, `""` for one whose target lives in another domain (Ruby words that refusal too, with
|
|
92
|
+
/// no tail), or `None` when `attr` is no reference or no aggregates were given.
|
|
93
|
+
fn reference_known_by(
|
|
94
|
+
attr: &Json,
|
|
95
|
+
aggregates_by_name: Option<&HashMap<String, &Json>>,
|
|
96
|
+
) -> Option<String> {
|
|
97
|
+
let target_name = naming::reference_target(crate::attr::type_name(attr))?;
|
|
98
|
+
let Some(target) = aggregates_by_name?.get(target_name) else {
|
|
99
|
+
return Some(String::new());
|
|
100
|
+
};
|
|
101
|
+
let mut heads: Vec<String> = Vec::new();
|
|
102
|
+
for path in target.get("identified_by").map_or_default(Json::each) {
|
|
103
|
+
let head = path.to_s().split('.').next().unwrap_or("").to_string();
|
|
104
|
+
if !heads.contains(&head) {
|
|
105
|
+
heads.push(head);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
let known = if heads.is_empty() {
|
|
109
|
+
String::new()
|
|
110
|
+
} else {
|
|
111
|
+
format!(" ({target_name} is known by {})", heads.join(", "))
|
|
112
|
+
};
|
|
113
|
+
Some(known)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
pub fn reference_shape_error(command: &str, key: &str, known_by: &str, value_var: &str) -> String {
|
|
117
|
+
format!(
|
|
118
|
+
"crate::kernel::Refusal::TypeMismatch(crate::kernel::refusal_wording::TypeMismatchReferenceWrongShapeArgs {{ command: {}, attribute: {}, offered: &(if matches!({value_var}, crate::kernel::Json::Object(_)) {{ \"an object\".to_string() }} else {{ {value_var}.describe() }}), known_by: {} }}.render_args())",
|
|
119
|
+
naming::ruby_inspect_string(command),
|
|
120
|
+
naming::ruby_inspect_string(key),
|
|
121
|
+
naming::ruby_inspect_string(known_by),
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/// A required reference argument read as its id string; see `reference_shape_error`.
|
|
126
|
+
pub fn reference_from_json_expr(
|
|
127
|
+
command: &str,
|
|
128
|
+
key: &str,
|
|
129
|
+
known_by: &str,
|
|
130
|
+
default: Option<&Json>,
|
|
131
|
+
) -> String {
|
|
132
|
+
let error = reference_shape_error(command, key, known_by, "x");
|
|
133
|
+
if let Some(default) = default {
|
|
134
|
+
let default_rhs = naming::literal_rhs(default);
|
|
135
|
+
return format!(
|
|
136
|
+
"match v.get({}) {{ Some(x) => x.as_str().map(ToString::to_string).ok_or_else(|| {error})?, None => {default_rhs} }}",
|
|
137
|
+
naming::ruby_inspect_string(key),
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
format!(
|
|
141
|
+
"{{ let x = {}; x.as_str().map(ToString::to_string).ok_or_else(|| {error})? }}",
|
|
142
|
+
required_field_expr(command, key, "String"),
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/// An already-fetched optional reference argument read as its id string.
|
|
147
|
+
pub fn reference_from_json_value_expr(
|
|
148
|
+
command: &str,
|
|
149
|
+
key: &str,
|
|
150
|
+
known_by: &str,
|
|
151
|
+
value_expr: &str,
|
|
152
|
+
) -> String {
|
|
153
|
+
format!(
|
|
154
|
+
"{value_expr}.as_str().map(ToString::to_string).ok_or_else(|| {})?",
|
|
155
|
+
reference_shape_error(command, key, known_by, value_expr)
|
|
156
|
+
)
|
|
157
|
+
}
|
|
158
|
+
|
|
87
159
|
pub fn scalar_from_json_expr(
|
|
88
160
|
struct_name: &str,
|
|
89
161
|
key: &str,
|
|
@@ -302,7 +374,8 @@ pub fn command_argument_allowlist(
|
|
|
302
374
|
}
|
|
303
375
|
|
|
304
376
|
/// `ArgumentGate#refuse_absent_arguments`, generated: every declared non-optional name the JSON
|
|
305
|
-
/// omits, sorted, refuses as `AbsentArgument` before any field is built.
|
|
377
|
+
/// omits, sorted, refuses as `AbsentArgument` before any field is built. An argument with a
|
|
378
|
+
/// `default:` is not required: Ruby fills the default for an omitted one (`fill_defaults`).
|
|
306
379
|
///
|
|
307
380
|
/// Goes through the site's `<Variant>Args` struct, so leaving an argument out does not compile.
|
|
308
381
|
///
|
|
@@ -312,7 +385,7 @@ pub fn command_argument_allowlist(
|
|
|
312
385
|
fn emit_absent_argument_check(command_name: &str, attributes: &[Json], collect: bool) -> String {
|
|
313
386
|
let mut required: Vec<String> = attributes
|
|
314
387
|
.iter()
|
|
315
|
-
.filter(|a| !crate::attr::optional(a))
|
|
388
|
+
.filter(|a| !crate::attr::optional(a) && crate::attr::default(a).is_none())
|
|
316
389
|
.map(|a| naming::rust_field(crate::attr::name(a)))
|
|
317
390
|
.collect();
|
|
318
391
|
required.sort();
|
|
@@ -492,7 +565,14 @@ pub fn emit_from_json_flat(
|
|
|
492
565
|
let list = crate::attr::list(attr);
|
|
493
566
|
let optional = crate::attr::optional(attr);
|
|
494
567
|
|
|
495
|
-
let
|
|
568
|
+
let known_by = reference_known_by(attr, aggregates_by_name);
|
|
569
|
+
let rhs = if let (false, Some(known_by)) = (list, known_by.as_deref()) {
|
|
570
|
+
if optional {
|
|
571
|
+
format!("match v.get({}) {{ Some(crate::kernel::Json::Null) | None => None, Some(x) => Some({}) }}", naming::ruby_inspect_string(&key), reference_from_json_value_expr(command_name, &key, known_by, "x"))
|
|
572
|
+
} else {
|
|
573
|
+
reference_from_json_expr(command_name, &key, known_by, crate::attr::default(attr))
|
|
574
|
+
}
|
|
575
|
+
} else if list && optional {
|
|
496
576
|
let mapper = list_element_from_json_mapper(error_name, &key, attr, value_objects_by_name);
|
|
497
577
|
let array_error = json_type_error(error_name, &key, "an array");
|
|
498
578
|
format!(
|
|
@@ -515,6 +595,11 @@ pub fn emit_from_json_flat(
|
|
|
515
595
|
format!("match v.get({}) {{ Some(crate::kernel::Json::Null) | None => None, Some(x) => Some({}) }}", naming::ruby_inspect_string(&key), composite_from_json_expr(attr, value_objects_by_name, "x"))
|
|
516
596
|
} else if let Some(scalar) = scalar {
|
|
517
597
|
scalar_from_json_expr(scalar_error_name, &key, scalar, crate::attr::default(attr))
|
|
598
|
+
} else if let Some(default_rhs) = crate::attr::default(attr).and_then(|_| crate::bridging::creation_default_rhs(attr, value_objects_by_name)) {
|
|
599
|
+
// A composite argument the caller leaves out takes its declared default, as Ruby's
|
|
600
|
+
// `fill_defaults` gives it. A null the caller sends is a value, not an omission:
|
|
601
|
+
// it builds the composite from its own fields, as a required composite does.
|
|
602
|
+
format!("match v.get({}) {{ None => {default_rhs}, Some(x) => {} }}", naming::ruby_inspect_string(&key), composite_from_json_expr(attr, value_objects_by_name, "x"))
|
|
518
603
|
} else if absent_argument_check {
|
|
519
604
|
// The argument entry point only; see `required_composite_argument_expr`.
|
|
520
605
|
required_composite_argument_expr(error_name, &key, attr, value_objects_by_name)
|
|
@@ -1052,17 +1137,19 @@ pub fn extract_id_supported(aggregate: &Json) -> bool {
|
|
|
1052
1137
|
}
|
|
1053
1138
|
|
|
1054
1139
|
pub fn emit_extract_id(exemplar: &Exemplar, aggregate: &Json) -> String {
|
|
1055
|
-
emit_extract_id_shaped(exemplar, aggregate, "extract_id", "to_id_component")
|
|
1140
|
+
emit_extract_id_shaped(exemplar, aggregate, "extract_id", "to_id_component", true)
|
|
1056
1141
|
}
|
|
1057
1142
|
|
|
1058
1143
|
/// `extract_id` minted as `extract_id_lenient` on `to_id_component_lenient`; entity addressing
|
|
1059
|
-
/// only, never a root aggregate's hydrate.
|
|
1144
|
+
/// only, never a root aggregate's hydrate. It reads the entity's declared identity alone, as
|
|
1145
|
+
/// Ruby's `EntityElement` does: no `id` or reference-key fallback.
|
|
1060
1146
|
pub fn emit_extract_id_lenient(exemplar: &Exemplar, entity: &Json) -> String {
|
|
1061
1147
|
emit_extract_id_shaped(
|
|
1062
1148
|
exemplar,
|
|
1063
1149
|
entity,
|
|
1064
1150
|
"extract_id_lenient",
|
|
1065
1151
|
"to_id_component_lenient",
|
|
1152
|
+
false,
|
|
1066
1153
|
)
|
|
1067
1154
|
}
|
|
1068
1155
|
|
|
@@ -1071,6 +1158,7 @@ fn emit_extract_id_shaped(
|
|
|
1071
1158
|
aggregate: &Json,
|
|
1072
1159
|
method_name: &str,
|
|
1073
1160
|
coercion: &str,
|
|
1161
|
+
routing_fallbacks: bool,
|
|
1074
1162
|
) -> String {
|
|
1075
1163
|
let name = naming::rust_ident(aggregate.get("name").and_then(Json::as_str).unwrap_or(""));
|
|
1076
1164
|
let identified_by: Vec<String> = aggregate
|
|
@@ -1109,27 +1197,43 @@ fn emit_extract_id_shaped(
|
|
|
1109
1197
|
};
|
|
1110
1198
|
|
|
1111
1199
|
let mut tried = identified_by.clone();
|
|
1112
|
-
|
|
1113
|
-
|
|
1200
|
+
if routing_fallbacks {
|
|
1201
|
+
tried.push("id".to_string());
|
|
1202
|
+
tried.push(reference_key.clone());
|
|
1203
|
+
}
|
|
1114
1204
|
let tried = tried.join(", ");
|
|
1205
|
+
let template = if routing_fallbacks {
|
|
1206
|
+
"extract_id"
|
|
1207
|
+
} else {
|
|
1208
|
+
"extract_id_exact"
|
|
1209
|
+
};
|
|
1115
1210
|
|
|
1211
|
+
// The exact shape has no reference-key slot, and its type is its own struct.
|
|
1212
|
+
let type_marker = if routing_fallbacks {
|
|
1213
|
+
"TmplExtractIdType"
|
|
1214
|
+
} else {
|
|
1215
|
+
"TmplExtractExactType"
|
|
1216
|
+
};
|
|
1217
|
+
let mut subs: Vec<(&str, String)> = vec![
|
|
1218
|
+
(type_marker, name.clone()),
|
|
1219
|
+
("tmpl_extract_id_name", method_name.to_string()),
|
|
1220
|
+
];
|
|
1221
|
+
if routing_fallbacks {
|
|
1222
|
+
subs.push(("tmpl_id_coercion", coercion.to_string()));
|
|
1223
|
+
subs.push((
|
|
1224
|
+
"\"tmpl_reference_key\"",
|
|
1225
|
+
naming::ruby_inspect_string(&reference_key),
|
|
1226
|
+
));
|
|
1227
|
+
}
|
|
1228
|
+
subs.push(("tmpl_tier1_join_placeholder()", tier1_join));
|
|
1229
|
+
subs.push((
|
|
1230
|
+
"\"tmpl_error_text\"",
|
|
1231
|
+
naming::ruby_inspect_string(&format!("{name}: no identity found (tried {tried})")),
|
|
1232
|
+
));
|
|
1116
1233
|
exemplar.compose(
|
|
1117
|
-
|
|
1118
|
-
&
|
|
1119
|
-
|
|
1120
|
-
("tmpl_extract_id_name", method_name.to_string()),
|
|
1121
|
-
("tmpl_id_coercion", coercion.to_string()),
|
|
1122
|
-
(
|
|
1123
|
-
"\"tmpl_reference_key\"",
|
|
1124
|
-
naming::ruby_inspect_string(&reference_key),
|
|
1125
|
-
),
|
|
1126
|
-
("tmpl_tier1_join_placeholder()", tier1_join),
|
|
1127
|
-
(
|
|
1128
|
-
"\"tmpl_error_text\"",
|
|
1129
|
-
naming::ruby_inspect_string(&format!("{name}: no identity found (tried {tried})")),
|
|
1130
|
-
),
|
|
1131
|
-
],
|
|
1132
|
-
"extract_id:TIER1_LINE",
|
|
1234
|
+
template,
|
|
1235
|
+
&subs,
|
|
1236
|
+
&format!("{template}:TIER1_LINE"),
|
|
1133
1237
|
&tier1_subs,
|
|
1134
1238
|
"\n",
|
|
1135
1239
|
)
|
|
@@ -1211,3 +1315,58 @@ pub fn emit_self_identity(exemplar: &Exemplar, entity: &Json) -> String {
|
|
|
1211
1315
|
],
|
|
1212
1316
|
)
|
|
1213
1317
|
}
|
|
1318
|
+
|
|
1319
|
+
#[cfg(test)]
|
|
1320
|
+
mod tests {
|
|
1321
|
+
use super::*;
|
|
1322
|
+
|
|
1323
|
+
fn argument(name: &str, default: Json) -> Json {
|
|
1324
|
+
Json::Object(vec![
|
|
1325
|
+
("name".to_string(), Json::String(name.to_string())),
|
|
1326
|
+
("type".to_string(), Json::String("Integer".to_string())),
|
|
1327
|
+
("optional".to_string(), Json::Bool(false)),
|
|
1328
|
+
("default".to_string(), default),
|
|
1329
|
+
])
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
#[test]
|
|
1333
|
+
fn absent_gate_requires_each_argument_without_a_default_and_no_defaulted_one() {
|
|
1334
|
+
let attributes = vec![
|
|
1335
|
+
argument("key", Json::Null),
|
|
1336
|
+
argument("grace", Json::Number("0".to_string())),
|
|
1337
|
+
];
|
|
1338
|
+
let gate = emit_absent_argument_check("Reap", &attributes, false);
|
|
1339
|
+
assert!(
|
|
1340
|
+
gate.contains("let required: &[&str] = &[\"key\"];"),
|
|
1341
|
+
"{gate}"
|
|
1342
|
+
);
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
#[test]
|
|
1346
|
+
fn a_reference_to_another_domain_is_worded_as_a_reference_with_no_tail() {
|
|
1347
|
+
let attr = Json::Object(vec![
|
|
1348
|
+
("name".to_string(), Json::String("parcel".to_string())),
|
|
1349
|
+
(
|
|
1350
|
+
"type".to_string(),
|
|
1351
|
+
Json::String("Reference<Parcel>".to_string()),
|
|
1352
|
+
),
|
|
1353
|
+
]);
|
|
1354
|
+
let in_this_domain = HashMap::new();
|
|
1355
|
+
assert_eq!(
|
|
1356
|
+
reference_known_by(&attr, Some(&in_this_domain)),
|
|
1357
|
+
Some(String::new())
|
|
1358
|
+
);
|
|
1359
|
+
assert_eq!(reference_known_by(&attr, None), None);
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
#[test]
|
|
1363
|
+
fn a_reference_argument_refuses_in_the_reference_wrong_shape_wording() {
|
|
1364
|
+
let error = reference_shape_error("Open", "parcel", " (Parcel is known by code)", "x");
|
|
1365
|
+
assert!(
|
|
1366
|
+
error.contains("TypeMismatchReferenceWrongShapeArgs"),
|
|
1367
|
+
"{error}"
|
|
1368
|
+
);
|
|
1369
|
+
assert!(error.contains("\"an object\""), "{error}");
|
|
1370
|
+
assert!(error.contains("\" (Parcel is known by code)\""), "{error}");
|
|
1371
|
+
}
|
|
1372
|
+
}
|
data/rust/codegen/src/queries.rs
CHANGED
|
@@ -1051,9 +1051,15 @@ pub fn emit_query_table(exemplar: &Exemplar, query_defs: &[QueryDef]) -> String
|
|
|
1051
1051
|
)
|
|
1052
1052
|
}
|
|
1053
1053
|
|
|
1054
|
-
//
|
|
1054
|
+
// The bare scalar types a query argument is shape-checked as, the types `mistyped?` names.
|
|
1055
|
+
const SCALAR_ARG_TYPES: [&str; 3] = ["String", "Integer", "Float"];
|
|
1056
|
+
|
|
1057
|
+
// One `if let` per argument that is checked: a value object is built and invariant-checked, then
|
|
1058
|
+
// dropped (ADR 0037); a bare scalar must hold the shape its declared type names. `owner` is the
|
|
1059
|
+
// aggregate's bare name, which a refusal quotes as Ruby's `aggregate.hecks_name` does.
|
|
1055
1060
|
pub fn query_arg_checks(
|
|
1056
1061
|
query: &Json,
|
|
1062
|
+
owner: &str,
|
|
1057
1063
|
mod_path: &str,
|
|
1058
1064
|
value_objects_by_name: &HashMap<String, &Json>,
|
|
1059
1065
|
) -> Vec<String> {
|
|
@@ -1067,8 +1073,20 @@ pub fn query_arg_checks(
|
|
|
1067
1073
|
{
|
|
1068
1074
|
return None;
|
|
1069
1075
|
}
|
|
1070
|
-
let
|
|
1076
|
+
let type_name = crate::attr::type_name(attr);
|
|
1071
1077
|
let key = naming::rust_field(crate::attr::name(attr));
|
|
1078
|
+
if !value_objects_by_name.contains_key(type_name) {
|
|
1079
|
+
return SCALAR_ARG_TYPES.contains(&type_name).then(|| {
|
|
1080
|
+
format!(
|
|
1081
|
+
"if let Some(x) = args.get({}) {{ x.expect_scalar_shape({}, {}, {})?; }}",
|
|
1082
|
+
naming::ruby_inspect_string(&key),
|
|
1083
|
+
naming::ruby_inspect_string(owner),
|
|
1084
|
+
naming::ruby_inspect_string(crate::attr::name(attr)),
|
|
1085
|
+
naming::ruby_inspect_string(type_name)
|
|
1086
|
+
)
|
|
1087
|
+
});
|
|
1088
|
+
}
|
|
1089
|
+
let vo = value_objects_by_name.get(type_name)?;
|
|
1072
1090
|
let build =
|
|
1073
1091
|
crate::json_codec::composite_from_json_expr(attr, value_objects_by_name, "x");
|
|
1074
1092
|
let check = if vo.get("closed_set").is_some_and(Json::as_bool) {
|
|
@@ -15,6 +15,10 @@ pub struct ReferenceCheck {
|
|
|
15
15
|
/// `Some(variant)` for a tagged `one_of` reference: the check runs only when the argument's
|
|
16
16
|
/// `type` names this variant (ADR 0127).
|
|
17
17
|
pub union_tag: Option<String>,
|
|
18
|
+
/// True for a reference a command sets through a plain value object: Ruby checks it on the
|
|
19
|
+
/// settled state at `save`, after hydrate, givens and invariants, so the router defers it
|
|
20
|
+
/// to `Save` beside the tenant boundary instead of running it with the argument gates.
|
|
21
|
+
pub settled: bool,
|
|
18
22
|
pub target_mod: String,
|
|
19
23
|
pub target_name: String,
|
|
20
24
|
pub heads: String,
|
|
@@ -509,6 +513,7 @@ pub fn emit_registry(exemplar: &Exemplar, aggregates: &[AggregateEntry]) -> Stri
|
|
|
509
513
|
emit_role_check(exemplar, c.role.as_deref(), &c.roles, &c.name),
|
|
510
514
|
&c.reference_checks
|
|
511
515
|
.iter()
|
|
516
|
+
.filter(|check| !check.settled)
|
|
512
517
|
.map(|check| emit_reference_check(exemplar, check))
|
|
513
518
|
.collect::<Vec<_>>()
|
|
514
519
|
)
|
|
@@ -521,9 +526,15 @@ pub fn emit_registry(exemplar: &Exemplar, aggregates: &[AggregateEntry]) -> Stri
|
|
|
521
526
|
|
|
522
527
|
// Checks come from `ir.json` at codegen time; none means `Ok(())`, else one closure.
|
|
523
528
|
let tenant_boundary_check_bodies: Vec<String> = c
|
|
524
|
-
.
|
|
529
|
+
.reference_checks
|
|
525
530
|
.iter()
|
|
526
|
-
.
|
|
531
|
+
.filter(|check| check.settled)
|
|
532
|
+
.map(|check| emit_reference_check(exemplar, check))
|
|
533
|
+
.chain(
|
|
534
|
+
c.tenant_boundary_checks
|
|
535
|
+
.iter()
|
|
536
|
+
.map(emit_tenant_boundary_check),
|
|
537
|
+
)
|
|
527
538
|
.collect();
|
|
528
539
|
let tenant_boundary_check_line = if tenant_boundary_check_bodies.is_empty() {
|
|
529
540
|
"let tenant_boundary_check: Result<(), crate::kernel::Refusal> = Ok(());"
|
|
@@ -616,14 +627,19 @@ pub fn emit_registry(exemplar: &Exemplar, aggregates: &[AggregateEntry]) -> Stri
|
|
|
616
627
|
c.name, c.entity_name, c.entity_identity_reading
|
|
617
628
|
);
|
|
618
629
|
// `element_id` uses `extract_id_lenient` (absent vs blank element identity);
|
|
619
|
-
// `parent_id` stays strict.
|
|
630
|
+
// `parent_id` stays strict. An element identity the arguments lack refuses as the
|
|
631
|
+
// missing parent when there is none, since Ruby hydrates the parent before it
|
|
632
|
+
// locates the element.
|
|
620
633
|
let body_entity_match = format!(
|
|
621
|
-
"let (parent_id, element_id, element_wants) = match route {{ Some(route) => {{ let element_id = route.entities()[0].clone(); (route.aggregate().to_string(), element_id.clone(), element_id) }}, None => {{ let parent_id = {mod_path}::{}::extract_id(facts_json).map_err(|_| crate::kernel::Refusal::NotFound({}.to_string()))?; let element_id = {mod_path}::{}::extract_id_lenient(facts_json).map_err(|_| crate::kernel::Refusal::NotFound({}.to_string()))?; let element_wants = {mod_path}::{}::extract_wants(facts_json); (parent_id, element_id, element_wants) }}, }};",
|
|
634
|
+
"let (parent_id, element_id, element_wants) = match route {{ Some(route) => {{ let element_id = route.entities()[0].clone(); (route.aggregate().to_string(), element_id.clone(), element_id) }}, None => {{ let parent_id = {mod_path}::{}::extract_id(facts_json).map_err(|_| crate::kernel::Refusal::NotFound({}.to_string()))?; let element_id = {mod_path}::{}::extract_id_lenient(facts_json).map_err(|_| {{ if store.{module}.find(&parent_id).is_none() {{ crate::kernel::Refusal::NotFound(crate::kernel::refusal_wording::NotFoundRecordMissingArgs {{ aggregate: {record_name}, identity: {identity_reading}, offered: &format!(\"{{parent_id:?}}\") }}.render_args()) }} else {{ crate::kernel::Refusal::NotFound({}.to_string()) }} }})?; let element_wants = {mod_path}::{}::extract_wants(facts_json); (parent_id, element_id, element_wants) }}, }};",
|
|
622
635
|
a.record,
|
|
623
636
|
naming::ruby_inspect_string(&entity_parent_no_identity_message),
|
|
624
637
|
c.entity_record,
|
|
625
638
|
naming::ruby_inspect_string(&entity_element_no_identity_message),
|
|
626
|
-
c.entity_record
|
|
639
|
+
c.entity_record,
|
|
640
|
+
module = a.module_name,
|
|
641
|
+
record_name = naming::ruby_inspect_string(&a.record),
|
|
642
|
+
identity_reading = naming::ruby_inspect_string(&a.identified_by.join(", ")),
|
|
627
643
|
);
|
|
628
644
|
|
|
629
645
|
let mut body: Vec<String> = vec![
|
data/rust/expr/Cargo.toml
CHANGED
|
@@ -16,7 +16,7 @@ path = "src/lib.rs"
|
|
|
16
16
|
regex = { version = "1", default-features = false, features = ["std", "unicode"] }
|
|
17
17
|
|
|
18
18
|
# Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
|
|
19
|
-
# out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
|
|
19
|
+
# out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
|
|
20
20
|
# The same table is in every crate's Cargo.toml; change them together.
|
|
21
21
|
[lints.clippy]
|
|
22
22
|
pedantic = { level = "warn", priority = -1 }
|
data/rust/host/Cargo.toml
CHANGED
|
@@ -74,7 +74,7 @@ debug = 0
|
|
|
74
74
|
opt-level = 2
|
|
75
75
|
|
|
76
76
|
# Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
|
|
77
|
-
# out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
|
|
77
|
+
# out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
|
|
78
78
|
# The same table is in every crate's Cargo.toml; change them together.
|
|
79
79
|
[lints.clippy]
|
|
80
80
|
pedantic = { level = "warn", priority = -1 }
|
data/rust/host/HECKS_RELEASE
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
7.0.0
|
data/rust/host/core/Cargo.toml
CHANGED
|
@@ -28,7 +28,7 @@ base64 = "0.22"
|
|
|
28
28
|
async-trait = "0.1.92"
|
|
29
29
|
|
|
30
30
|
# Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
|
|
31
|
-
# out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
|
|
31
|
+
# out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
|
|
32
32
|
# The same table is in every crate's Cargo.toml; change them together.
|
|
33
33
|
[lints.clippy]
|
|
34
34
|
pedantic = { level = "warn", priority = -1 }
|
data/rust/host/src/boot.rs
CHANGED
data/rust/host/src/store/mint.rs
CHANGED
|
@@ -365,6 +365,10 @@ pub async fn ensure_base<C: GenericClient>(client: &C, domain: &str) -> anyhow::
|
|
|
365
365
|
client
|
|
366
366
|
.batch_execute("ALTER TABLE hecks_eras ADD COLUMN IF NOT EXISTS canon_form int")
|
|
367
367
|
.await?;
|
|
368
|
+
// Ruby's era reader selects `edge`; the Rust mint leaves it NULL (no implicit-edge record).
|
|
369
|
+
client
|
|
370
|
+
.batch_execute("ALTER TABLE hecks_eras ADD COLUMN IF NOT EXISTS edge jsonb")
|
|
371
|
+
.await?;
|
|
368
372
|
client
|
|
369
373
|
.batch_execute(
|
|
370
374
|
"CREATE TABLE IF NOT EXISTS hecks_era_texts (\
|
|
@@ -1124,13 +1128,14 @@ async fn hold_first_body<C: GenericClient>(
|
|
|
1124
1128
|
) -> anyhow::Result<()> {
|
|
1125
1129
|
let hash = storage_shape::mint_hash(ir);
|
|
1126
1130
|
let label = storage_shape::mint_label(ir);
|
|
1131
|
+
let projection = storage_shape::canonical(ir);
|
|
1127
1132
|
let digest = format!("{:x}", Sha256::digest(held_text.as_bytes()));
|
|
1128
1133
|
|
|
1129
1134
|
client
|
|
1130
1135
|
.execute(
|
|
1131
|
-
"INSERT INTO hecks_eras (domain, ordinal, hash, label, held_text, watermark, held_digest, canon_form
|
|
1132
|
-
VALUES ($1, 1, $2, $3, $4, 0, $5, $6) ON CONFLICT DO NOTHING",
|
|
1133
|
-
&[&domain, &hash, &label, &held_text, &digest, &storage_shape::FORM_VERSION],
|
|
1136
|
+
"INSERT INTO hecks_eras (domain, ordinal, hash, label, held_text, watermark, held_digest, canon_form, \
|
|
1137
|
+
held_projection) VALUES ($1, 1, $2, $3, $4, 0, $5, $6, $7::text::jsonb) ON CONFLICT DO NOTHING",
|
|
1138
|
+
&[&domain, &hash, &label, &held_text, &digest, &storage_shape::FORM_VERSION, &projection],
|
|
1134
1139
|
)
|
|
1135
1140
|
.await?;
|
|
1136
1141
|
archive_text(client, domain, 1, held_text, &digest).await?;
|
|
@@ -1268,6 +1273,7 @@ pub async fn mint_era<C: GenericClient>(
|
|
|
1268
1273
|
ordinal: i32,
|
|
1269
1274
|
hash: &str,
|
|
1270
1275
|
label: &str,
|
|
1276
|
+
projection: &str,
|
|
1271
1277
|
held_text: &str,
|
|
1272
1278
|
aggregates: &[Aggregate],
|
|
1273
1279
|
edges: &[&Edge],
|
|
@@ -1281,6 +1287,7 @@ pub async fn mint_era<C: GenericClient>(
|
|
|
1281
1287
|
ordinal,
|
|
1282
1288
|
hash,
|
|
1283
1289
|
label,
|
|
1290
|
+
projection,
|
|
1284
1291
|
held_text,
|
|
1285
1292
|
aggregates,
|
|
1286
1293
|
edges,
|
|
@@ -1308,6 +1315,7 @@ async fn mint_era_body<C: GenericClient>(
|
|
|
1308
1315
|
ordinal: i32,
|
|
1309
1316
|
hash: &str,
|
|
1310
1317
|
label: &str,
|
|
1318
|
+
projection: &str,
|
|
1311
1319
|
held_text: &str,
|
|
1312
1320
|
aggregates: &[Aggregate],
|
|
1313
1321
|
edges: &[&Edge],
|
|
@@ -1341,9 +1349,9 @@ async fn mint_era_body<C: GenericClient>(
|
|
|
1341
1349
|
let digest = format!("{:x}", Sha256::digest(held_text.as_bytes()));
|
|
1342
1350
|
client
|
|
1343
1351
|
.execute(
|
|
1344
|
-
"INSERT INTO hecks_eras (domain, ordinal, hash, label, held_text, watermark, held_digest, canon_form
|
|
1345
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
|
|
1346
|
-
&[&domain, &ordinal, &hash, &label, &held_text, &watermark, &digest, &storage_shape::FORM_VERSION],
|
|
1352
|
+
"INSERT INTO hecks_eras (domain, ordinal, hash, label, held_text, watermark, held_digest, canon_form, \
|
|
1353
|
+
held_projection) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::text::jsonb)",
|
|
1354
|
+
&[&domain, &ordinal, &hash, &label, &held_text, &watermark, &digest, &storage_shape::FORM_VERSION, &projection],
|
|
1347
1355
|
)
|
|
1348
1356
|
.await?;
|
|
1349
1357
|
archive_text(client, domain, ordinal, held_text, &digest).await?;
|
|
@@ -1895,6 +1903,7 @@ mod tests {
|
|
|
1895
1903
|
2,
|
|
1896
1904
|
&storage_shape::mint_hash(&v2_ir),
|
|
1897
1905
|
&to_label,
|
|
1906
|
+
&storage_shape::canonical(&v2_ir),
|
|
1898
1907
|
"v2 source text",
|
|
1899
1908
|
&[aggregate],
|
|
1900
1909
|
&[&edge],
|
|
@@ -1923,6 +1932,29 @@ mod tests {
|
|
|
1923
1932
|
),
|
|
1924
1933
|
]
|
|
1925
1934
|
);
|
|
1935
|
+
assert_projections_stored(&client, domain, &[(1, &v1_ir), (2, &v2_ir)]).await;
|
|
1936
|
+
}
|
|
1937
|
+
|
|
1938
|
+
// Each era's `held_projection` is the parsed canonical shape of the IR it was minted from.
|
|
1939
|
+
async fn assert_projections_stored(
|
|
1940
|
+
client: &tokio_postgres::Client,
|
|
1941
|
+
domain: &str,
|
|
1942
|
+
expected: &[(i32, &Value)],
|
|
1943
|
+
) {
|
|
1944
|
+
for (ordinal, ir) in expected {
|
|
1945
|
+
let row = client
|
|
1946
|
+
.query_one(
|
|
1947
|
+
"SELECT held_projection::text FROM hecks_eras WHERE domain = $1 AND ordinal = $2",
|
|
1948
|
+
&[&domain, ordinal],
|
|
1949
|
+
)
|
|
1950
|
+
.await
|
|
1951
|
+
.expect("era row");
|
|
1952
|
+
let stored: Option<String> = row.get(0);
|
|
1953
|
+
let stored: Value =
|
|
1954
|
+
serde_json::from_str(&stored.expect("held_projection set")).expect("json");
|
|
1955
|
+
let wanted: Value = serde_json::from_str(&storage_shape::canonical(ir)).expect("json");
|
|
1956
|
+
assert_eq!(stored, wanted, "era {ordinal} held_projection");
|
|
1957
|
+
}
|
|
1926
1958
|
}
|
|
1927
1959
|
|
|
1928
1960
|
fn registration_default() -> LifecycleDefault {
|
|
@@ -2130,6 +2162,7 @@ mod tests {
|
|
|
2130
2162
|
2,
|
|
2131
2163
|
&storage_shape::mint_hash(&v2_ir),
|
|
2132
2164
|
&to_label,
|
|
2165
|
+
&storage_shape::canonical(&v2_ir),
|
|
2133
2166
|
"v2 source",
|
|
2134
2167
|
&[aggregate],
|
|
2135
2168
|
&[&edge],
|
|
@@ -2436,6 +2469,7 @@ mod tests {
|
|
|
2436
2469
|
era + 1,
|
|
2437
2470
|
&"h".repeat(64),
|
|
2438
2471
|
&format!("e{}", era + 1),
|
|
2472
|
+
"{}",
|
|
2439
2473
|
"text",
|
|
2440
2474
|
&aggregates,
|
|
2441
2475
|
&chain,
|
data/rust/lsp/Cargo.toml
CHANGED
|
@@ -16,7 +16,7 @@ path = "src/main.rs"
|
|
|
16
16
|
[dependencies]
|
|
17
17
|
|
|
18
18
|
# Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
|
|
19
|
-
# out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
|
|
19
|
+
# out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
|
|
20
20
|
# The same table is in every crate's Cargo.toml; change them together.
|
|
21
21
|
[lints.clippy]
|
|
22
22
|
pedantic = { level = "warn", priority = -1 }
|
data/rust/parser/Cargo.toml
CHANGED
|
@@ -21,7 +21,7 @@ path = "src/main.rs"
|
|
|
21
21
|
debug = 0
|
|
22
22
|
|
|
23
23
|
# Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
|
|
24
|
-
# out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
|
|
24
|
+
# out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
|
|
25
25
|
# The same table is in every crate's Cargo.toml; change them together.
|
|
26
26
|
[lints.clippy]
|
|
27
27
|
pedantic = { level = "warn", priority = -1 }
|