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
|
@@ -31,10 +31,12 @@ pub fn parse_body(
|
|
|
31
31
|
let line = gated.line.number;
|
|
32
32
|
|
|
33
33
|
match gated.row.word {
|
|
34
|
-
// A dotted symbol (`:"reference.value"`),
|
|
34
|
+
// A dotted symbol (`:"reference.value"`), or a bare aggregate name (`Message`), which
|
|
35
|
+
// `build::correlation_keys` resolves once every aggregate is known.
|
|
35
36
|
"correlates_by" => {
|
|
36
|
-
|
|
37
|
-
super::
|
|
37
|
+
let raw =
|
|
38
|
+
super::positional_raw(file, line, "correlates_by", &gated.args, 1)?.trim();
|
|
39
|
+
pm.correlates_by = super::symbol_text(raw).unwrap_or_else(|| raw.to_string());
|
|
38
40
|
}
|
|
39
41
|
// Event references keep only the bare final segment (`Naming.event_name_ref`);
|
|
40
42
|
// `SagaInterpreter` matches them against a bare `event.name`.
|
|
@@ -48,13 +50,18 @@ pub fn parse_body(
|
|
|
48
50
|
)?);
|
|
49
51
|
}
|
|
50
52
|
"ends_on" => {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"ends_on",
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
// A process manager can end on several events: `ends_on` is the first, as the
|
|
54
|
+
// Ruby builder's `ends_on` reads `endings.first`.
|
|
55
|
+
let event =
|
|
56
|
+
super::positional_event_name_ref(file, line, "ends_on", &gated.args, 1)?;
|
|
57
|
+
pm.ends_on.get_or_insert_with(|| event.clone());
|
|
58
|
+
pm.endings.push(event);
|
|
59
|
+
}
|
|
60
|
+
// Each `resumes` is one `stage=command` entry, kept in declaration order; the
|
|
61
|
+
// runtime does not read the stage map yet.
|
|
62
|
+
"resumes" => {
|
|
63
|
+
let entry = super::positional_text(file, line, "resumes", &gated.args, 1)?;
|
|
64
|
+
pm.resumes.push(entry);
|
|
58
65
|
}
|
|
59
66
|
"transition" => {
|
|
60
67
|
for handler in parse_transition(file, lines, pos, line, &gated)? {
|
|
@@ -202,7 +202,8 @@ fn default_database_set(file: &str, line: usize, call: &lex::Call) -> ParseResul
|
|
|
202
202
|
Ok(true)
|
|
203
203
|
}
|
|
204
204
|
|
|
205
|
-
/// One binding call: `verb("Adapter") do ... end`, or `verb "Adapter", k: v, ...` with no block
|
|
205
|
+
/// One binding call: `verb("Adapter") do ... end`, or `verb "Adapter", k: v, ...` with no block;
|
|
206
|
+
/// the adapter may be left out when keyword settings are given.
|
|
206
207
|
/// Records the verb, the first positional string, the keyword names, then the body's top-level
|
|
207
208
|
/// keys. A verb that is a grammar word elsewhere is refused, as Ruby's word gate refuses it.
|
|
208
209
|
fn parse_binding(
|
|
@@ -256,13 +257,6 @@ fn parse_binding(
|
|
|
256
257
|
));
|
|
257
258
|
}
|
|
258
259
|
}
|
|
259
|
-
let adapter = adapter.ok_or_else(|| {
|
|
260
|
-
Diagnostic::new(
|
|
261
|
-
file,
|
|
262
|
-
number,
|
|
263
|
-
format!("'{}' needs a quoted adapter name", call.word),
|
|
264
|
-
)
|
|
265
|
-
})?;
|
|
266
260
|
match call.opener {
|
|
267
261
|
Opener::None => {}
|
|
268
262
|
Opener::DoBlock { .. } => body_keys(file, lines, pos, &mut settings)?,
|
|
@@ -274,6 +268,16 @@ fn parse_binding(
|
|
|
274
268
|
))
|
|
275
269
|
}
|
|
276
270
|
}
|
|
271
|
+
// A verb that names no adapter but gives settings (`stored_as Revision: "commit"`,
|
|
272
|
+
// `minting commands: [...]`) binds under the empty adapter, as Ruby's world builder does.
|
|
273
|
+
let adapter = adapter.or_else(|| (!settings.is_empty()).then(String::new));
|
|
274
|
+
let adapter = adapter.ok_or_else(|| {
|
|
275
|
+
Diagnostic::new(
|
|
276
|
+
file,
|
|
277
|
+
number,
|
|
278
|
+
format!("'{}' needs a quoted adapter name", call.word),
|
|
279
|
+
)
|
|
280
|
+
})?;
|
|
277
281
|
Ok(ir::Binding {
|
|
278
282
|
verb: call.word.clone(),
|
|
279
283
|
adapter,
|
|
@@ -100,6 +100,7 @@ fn refuse_unspelt(declaration: &ir::Bluebook) -> Result<(), String> {
|
|
|
100
100
|
(!declaration.process_managers.is_empty(), "process managers"),
|
|
101
101
|
(!declaration.provides.is_empty(), "provided capabilities"),
|
|
102
102
|
(!declaration.attaches_to.is_empty(), "attaches"),
|
|
103
|
+
(!declaration.modules.is_empty(), "modules"),
|
|
103
104
|
(declaration.version.is_some(), "a version"),
|
|
104
105
|
];
|
|
105
106
|
match held.iter().find(|(present, _)| *present) {
|
|
@@ -297,6 +298,14 @@ fn command_text(out: &mut String, command: &ir::Command) -> Result<(), String> {
|
|
|
297
298
|
} else if let Some(role) = &command.role {
|
|
298
299
|
out.push_str(&format!(" role {}\n", string(role)));
|
|
299
300
|
}
|
|
301
|
+
if !command.audience.is_empty() {
|
|
302
|
+
let names: Vec<String> = command
|
|
303
|
+
.audience
|
|
304
|
+
.iter()
|
|
305
|
+
.map(|name| format!(":{name}"))
|
|
306
|
+
.collect();
|
|
307
|
+
out.push_str(&format!(" audience {}\n", names.join(", ")));
|
|
308
|
+
}
|
|
300
309
|
if let Some(goal) = &command.goal {
|
|
301
310
|
out.push_str(&format!(" goal {}\n", string(goal)));
|
|
302
311
|
}
|
|
@@ -48,6 +48,9 @@ pub fn sentences(declaration: &ir::Bluebook) -> Result<String, String> {
|
|
|
48
48
|
out.push_str(&format!(" It attaches to {}\n", join_and(&contexts)));
|
|
49
49
|
}
|
|
50
50
|
provides_text(&mut out, &declaration.provides)?;
|
|
51
|
+
if !declaration.modules.is_empty() {
|
|
52
|
+
return Err("the sentence form cannot say modules".to_string());
|
|
53
|
+
}
|
|
51
54
|
for aggregate in &declaration.aggregates {
|
|
52
55
|
out.push('\n');
|
|
53
56
|
aggregate_text(&mut out, aggregate)?;
|
|
@@ -34,7 +34,11 @@ impl Parser<'_> {
|
|
|
34
34
|
match m.id {
|
|
35
35
|
"process_matched" => pm.correlates_by = m.text_of("path"),
|
|
36
36
|
"process_starts" => pm.starts_on = Some(m.text_of("event")),
|
|
37
|
-
"process_ends" =>
|
|
37
|
+
"process_ends" => {
|
|
38
|
+
let event = m.text_of("event");
|
|
39
|
+
pm.ends_on.get_or_insert_with(|| event.clone());
|
|
40
|
+
pm.endings.push(event);
|
|
41
|
+
}
|
|
38
42
|
"process_when" | "process_when_refused" => {
|
|
39
43
|
let handler = self.handler(&m)?;
|
|
40
44
|
if let Some(earlier) = pm.handlers.iter().find(|h| {
|
|
@@ -140,7 +144,7 @@ pub(super) fn said(pm: &ir::ProcessManager) -> Result<String, String> {
|
|
|
140
144
|
if let Some(event) = &pm.starts_on {
|
|
141
145
|
out.push_str(&format!(" It starts when {event} is announced\n"));
|
|
142
146
|
}
|
|
143
|
-
|
|
147
|
+
for event in &pm.endings {
|
|
144
148
|
out.push_str(&format!(" It ends when {event} is announced\n"));
|
|
145
149
|
}
|
|
146
150
|
for handler in &pm.handlers {
|
data/rust/src/exemplar/json.rs
CHANGED
|
@@ -268,6 +268,23 @@ impl TmplExtractIdType {
|
|
|
268
268
|
}
|
|
269
269
|
// TMPL:extract_id END
|
|
270
270
|
|
|
271
|
+
// An entity element is addressed by its declared identity alone: unlike a root aggregate it has
|
|
272
|
+
// no `id` or reference-key fallback, so an argument offering only those names no element.
|
|
273
|
+
struct TmplExtractExactType;
|
|
274
|
+
// TMPL:extract_id_exact BEGIN
|
|
275
|
+
impl TmplExtractExactType {
|
|
276
|
+
pub fn tmpl_extract_id_name(v: &crate::kernel::Json) -> Result<String, crate::kernel::Refusal> {
|
|
277
|
+
(|| -> Option<String> {
|
|
278
|
+
// TMPL:extract_id_exact:TIER1_LINE BEGIN
|
|
279
|
+
let c0 = v.dig("tmpl_path")?.tmpl_id_coercion().ok()?;
|
|
280
|
+
// TMPL:extract_id_exact:TIER1_LINE END
|
|
281
|
+
Some(tmpl_tier1_join_placeholder())
|
|
282
|
+
})()
|
|
283
|
+
.ok_or_else(|| crate::kernel::Refusal::TypeMismatch("tmpl_error_text".to_string()))
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// TMPL:extract_id_exact END
|
|
287
|
+
|
|
271
288
|
fn tmpl_tier1_join_placeholder() -> String {
|
|
272
289
|
String::new()
|
|
273
290
|
}
|
data/rust/src/kernel/cli.rs
CHANGED
|
@@ -243,6 +243,7 @@ pub fn run(input: &str) -> String {
|
|
|
243
243
|
&command_input,
|
|
244
244
|
caller_role,
|
|
245
245
|
caller_actor_id,
|
|
246
|
+
step.get("occurred_at").and_then(Json::as_str),
|
|
246
247
|
));
|
|
247
248
|
mutations_per_step.push(Vec::new());
|
|
248
249
|
cross_domain_per_step.push(Vec::new());
|
|
@@ -260,6 +261,7 @@ pub fn run(input: &str) -> String {
|
|
|
260
261
|
&command_input,
|
|
261
262
|
caller_role,
|
|
262
263
|
caller_actor_id,
|
|
264
|
+
step.get("occurred_at").and_then(Json::as_str),
|
|
263
265
|
));
|
|
264
266
|
mutations_per_step.push(Vec::new());
|
|
265
267
|
cross_domain_per_step.push(Vec::new());
|
|
@@ -392,8 +394,16 @@ fn dry_run(
|
|
|
392
394
|
command_input: &Json,
|
|
393
395
|
caller_role: Option<&str>,
|
|
394
396
|
caller_actor_id: Option<&str>,
|
|
397
|
+
occurred_at: Option<&str>,
|
|
395
398
|
) -> Json {
|
|
396
|
-
let (outcome, collected) = preview(
|
|
399
|
+
let (outcome, collected) = preview(
|
|
400
|
+
store,
|
|
401
|
+
verb,
|
|
402
|
+
command_input,
|
|
403
|
+
caller_role,
|
|
404
|
+
caller_actor_id,
|
|
405
|
+
occurred_at,
|
|
406
|
+
);
|
|
397
407
|
match outcome {
|
|
398
408
|
Ok(()) => Json::obj(vec![
|
|
399
409
|
("verb", Json::str(verb.to_string())),
|
|
@@ -411,8 +421,16 @@ fn validation(
|
|
|
411
421
|
command_input: &Json,
|
|
412
422
|
caller_role: Option<&str>,
|
|
413
423
|
caller_actor_id: Option<&str>,
|
|
424
|
+
occurred_at: Option<&str>,
|
|
414
425
|
) -> Json {
|
|
415
|
-
let (outcome, collected) = preview(
|
|
426
|
+
let (outcome, collected) = preview(
|
|
427
|
+
store,
|
|
428
|
+
verb,
|
|
429
|
+
command_input,
|
|
430
|
+
caller_role,
|
|
431
|
+
caller_actor_id,
|
|
432
|
+
occurred_at,
|
|
433
|
+
);
|
|
416
434
|
let refusals: Vec<Json> = match outcome {
|
|
417
435
|
Ok(()) => Vec::new(),
|
|
418
436
|
Err(refusal) if collected.is_empty() => vec![refusal_entry(&refusal, &Detail::default())],
|
|
@@ -429,14 +447,19 @@ fn validation(
|
|
|
429
447
|
}
|
|
430
448
|
|
|
431
449
|
/// The command run against a throwaway copy of the store with a collector bound: what it raised,
|
|
432
|
-
/// and every refusal its failing stage kept.
|
|
450
|
+
/// and every refusal its failing stage kept. The facts the command `needs` are answered first, as
|
|
451
|
+
/// `orchestrate` answers them for a real dispatch, so a dry run or a validation sees the same
|
|
452
|
+
/// arguments the command would.
|
|
433
453
|
fn preview(
|
|
434
454
|
store: &Store,
|
|
435
455
|
verb: &str,
|
|
436
456
|
command_input: &Json,
|
|
437
457
|
caller_role: Option<&str>,
|
|
438
458
|
caller_actor_id: Option<&str>,
|
|
459
|
+
occurred_at: Option<&str>,
|
|
439
460
|
) -> (Result<(), Refusal>, Vec<Collected>) {
|
|
461
|
+
let enriched = super::needs::enrich(verb, command_input, occurred_at);
|
|
462
|
+
let command_input = enriched.as_ref().unwrap_or(command_input);
|
|
440
463
|
let mut scratch = store.clone();
|
|
441
464
|
let (outcome, collected) = collecting::collecting(|| {
|
|
442
465
|
dispatch_by_name(
|
|
@@ -569,6 +592,7 @@ pub fn serve(input: impl std::io::BufRead, mut output: impl std::io::Write) {
|
|
|
569
592
|
&dry_run_command_input(args),
|
|
570
593
|
caller_role,
|
|
571
594
|
caller_actor_id,
|
|
595
|
+
occurred_at,
|
|
572
596
|
)
|
|
573
597
|
} else if let Some(verb) = step.get("verb").and_then(Json::as_str) {
|
|
574
598
|
let mut events: Vec<Event> = Vec::new();
|
data/rust/src/kernel/dispatch.rs
CHANGED
|
@@ -160,8 +160,10 @@ pub fn dispatch<'a, T, R>(
|
|
|
160
160
|
mutations: &mut Vec<MutationRecord>,
|
|
161
161
|
// The synchronous half of `projects`, applied right before `repo.save`.
|
|
162
162
|
seed_projections: Vec<(&'static str, Option<Value>)>,
|
|
163
|
-
// The
|
|
164
|
-
//
|
|
163
|
+
// The settled-state checks: references a command set through a plain value object, then the
|
|
164
|
+
// write-side tenant boundary. The router computes it (it needs every aggregate's repo)
|
|
165
|
+
// but it is applied here, first in `Save`, before `seed_projections`, as Ruby's
|
|
166
|
+
// `resolve_state_references` runs at `save`.
|
|
165
167
|
tenant_boundary_check: Result<(), Refusal>,
|
|
166
168
|
) -> Result<(T, Vec<Event>), Refusal>
|
|
167
169
|
where
|
data/rust/src/kernel/json.rs
CHANGED
|
@@ -250,6 +250,39 @@ impl Json {
|
|
|
250
250
|
}
|
|
251
251
|
}
|
|
252
252
|
|
|
253
|
+
/// Refuses `TypeMismatch` when a bare scalar query argument is offered as a shape its declared
|
|
254
|
+
/// type cannot hold, worded as a command's numeric field is. Ruby's `Value::FieldChecks#mistyped?`
|
|
255
|
+
/// is the rule: an Integer must be a number, a Float a number, and a String (or boolean) must not
|
|
256
|
+
/// be a composite. A null is absent, so it passes. `owner` is the aggregate's bare name.
|
|
257
|
+
pub fn expect_scalar_shape(
|
|
258
|
+
&self,
|
|
259
|
+
owner: &str,
|
|
260
|
+
field: &str,
|
|
261
|
+
type_name: &str,
|
|
262
|
+
) -> Result<(), Refusal> {
|
|
263
|
+
if matches!(self, Self::Null) || !self.mistyped_scalar(type_name) {
|
|
264
|
+
return Ok(());
|
|
265
|
+
}
|
|
266
|
+
Err(Refusal::TypeMismatch(
|
|
267
|
+
super::refusal_wording::TypeMismatchNumericFieldArgs {
|
|
268
|
+
r#type: owner,
|
|
269
|
+
field,
|
|
270
|
+
expected: type_name,
|
|
271
|
+
offered: &self.describe(),
|
|
272
|
+
}
|
|
273
|
+
.render_args(),
|
|
274
|
+
))
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
fn mistyped_scalar(&self, type_name: &str) -> bool {
|
|
278
|
+
match type_name {
|
|
279
|
+
"Integer" => !matches!(self, Self::Num(n, _) if n.fract() == 0.0),
|
|
280
|
+
"Float" => !matches!(self, Self::Num(..)),
|
|
281
|
+
"String" => matches!(self, Self::Array(_) | Self::Object(_)),
|
|
282
|
+
_ => false,
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
253
286
|
/// Refuses `TypeMismatch` when a multi-field value object is offered as a non-object.
|
|
254
287
|
///
|
|
255
288
|
/// Runs at the `from_json` call site, since only the caller knows `name`.
|
|
@@ -919,3 +952,32 @@ impl Parser<'_> {
|
|
|
919
952
|
Ok(Json::Num(value, raw))
|
|
920
953
|
}
|
|
921
954
|
}
|
|
955
|
+
|
|
956
|
+
#[cfg(test)]
|
|
957
|
+
mod scalar_shape_tests {
|
|
958
|
+
use super::*;
|
|
959
|
+
|
|
960
|
+
fn refused(value: &Json, type_name: &str) -> bool {
|
|
961
|
+
value
|
|
962
|
+
.expect_scalar_shape("Account", "reference", type_name)
|
|
963
|
+
.is_err()
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
#[test]
|
|
967
|
+
fn a_string_argument_refuses_a_composite_and_takes_a_scalar() {
|
|
968
|
+
assert!(refused(&Json::obj(vec![("cents", Json::int(0))]), "String"));
|
|
969
|
+
assert!(!refused(&Json::int(7), "String"));
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
#[test]
|
|
973
|
+
fn an_integer_argument_refuses_a_fraction_and_a_string() {
|
|
974
|
+
assert!(refused(&Json::Num(1.5, None), "Integer"));
|
|
975
|
+
assert!(refused(&Json::str("1"), "Integer"));
|
|
976
|
+
assert!(!refused(&Json::int(1), "Integer"));
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
#[test]
|
|
980
|
+
fn a_null_argument_is_absent_not_mistyped() {
|
|
981
|
+
assert!(!refused(&Json::Null, "String"));
|
|
982
|
+
}
|
|
983
|
+
}
|
|
@@ -783,7 +783,7 @@ impl<S: AggregateScan> Cascade<'_, S> {
|
|
|
783
783
|
Json::obj(fields)
|
|
784
784
|
};
|
|
785
785
|
|
|
786
|
-
if depth
|
|
786
|
+
if depth >= MAX_REACTION_DEPTH {
|
|
787
787
|
self.reaction_log.push(record(vec![
|
|
788
788
|
("delivered", Json::Bool(false)),
|
|
789
789
|
(
|
|
@@ -1055,7 +1055,7 @@ impl<S: AggregateScan> Cascade<'_, S> {
|
|
|
1055
1055
|
Json::obj(fields)
|
|
1056
1056
|
};
|
|
1057
1057
|
|
|
1058
|
-
if depth
|
|
1058
|
+
if depth >= MAX_REACTION_DEPTH {
|
|
1059
1059
|
self.saga_log.push(record(vec![
|
|
1060
1060
|
("delivered", Json::Bool(false)),
|
|
1061
1061
|
(
|
|
@@ -1126,7 +1126,7 @@ impl<S: AggregateScan> Cascade<'_, S> {
|
|
|
1126
1126
|
Json::obj(fields)
|
|
1127
1127
|
};
|
|
1128
1128
|
|
|
1129
|
-
if depth
|
|
1129
|
+
if depth >= MAX_REACTION_DEPTH {
|
|
1130
1130
|
self.saga_log.push(record(vec![
|
|
1131
1131
|
("delivered", Json::Bool(false)),
|
|
1132
1132
|
(
|
|
@@ -1306,6 +1306,31 @@ mod tests {
|
|
|
1306
1306
|
None
|
|
1307
1307
|
}
|
|
1308
1308
|
|
|
1309
|
+
// The emitting record's id is offered once, and an empty id is never offered: offering on
|
|
1310
|
+
// either condition alone duplicates the field or invents an empty one.
|
|
1311
|
+
#[test]
|
|
1312
|
+
fn offer_emitter_id_adds_the_id_once_and_never_an_empty_one() {
|
|
1313
|
+
let event = |id: &str| Event {
|
|
1314
|
+
name: "SomeEvent".to_string(),
|
|
1315
|
+
aggregate: "Domain::Thing".to_string(),
|
|
1316
|
+
id: id.to_string(),
|
|
1317
|
+
payload: Json::Object(vec![]),
|
|
1318
|
+
occurred_at: None,
|
|
1319
|
+
correlation: None,
|
|
1320
|
+
};
|
|
1321
|
+
let mut fresh = vec![];
|
|
1322
|
+
offer_emitter_id(&mut fresh, &event("thing-1"));
|
|
1323
|
+
assert_eq!(fresh, vec![("id".to_string(), Json::str("thing-1"))]);
|
|
1324
|
+
|
|
1325
|
+
let mut held = vec![("id".to_string(), Json::str("given"))];
|
|
1326
|
+
offer_emitter_id(&mut held, &event("thing-1"));
|
|
1327
|
+
assert_eq!(held, vec![("id".to_string(), Json::str("given"))]);
|
|
1328
|
+
|
|
1329
|
+
let mut empty = vec![];
|
|
1330
|
+
offer_emitter_id(&mut empty, &event(""));
|
|
1331
|
+
assert!(empty.is_empty());
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1309
1334
|
// Tier 2 alone: tier 1 finds nothing and tier 3 is unconfigured, so only the stamp can
|
|
1310
1335
|
// resolve it.
|
|
1311
1336
|
#[test]
|
|
@@ -511,7 +511,7 @@ fn a_cross_domain_policy_honours_its_event_qualifier_and_where_clause() {
|
|
|
511
511
|
|
|
512
512
|
#[test]
|
|
513
513
|
fn a_reaction_below_the_depth_ceiling_is_delivered_and_one_at_it_is_logged_undelivered() {
|
|
514
|
-
for (depth, delivers) in [(0, true), (
|
|
514
|
+
for (depth, delivers) in [(0, true), (4, true), (5, false), (6, false)] {
|
|
515
515
|
let mut w = world();
|
|
516
516
|
|
|
517
517
|
w.react(&event("Placed", "D::Order", "o1", Json::obj(vec![])), depth);
|
|
@@ -529,19 +529,19 @@ fn a_reaction_below_the_depth_ceiling_is_delivered_and_one_at_it_is_logged_undel
|
|
|
529
529
|
}
|
|
530
530
|
|
|
531
531
|
#[test]
|
|
532
|
-
fn
|
|
532
|
+
fn a_policy_that_re_triggers_itself_stops_after_five_reactions() {
|
|
533
533
|
let mut w = world();
|
|
534
534
|
|
|
535
535
|
w.orchestrate("D::Order.Ping", 0).unwrap();
|
|
536
536
|
|
|
537
|
-
assert_eq!(w.verbs(), ["D::Order.Ping";
|
|
537
|
+
assert_eq!(w.verbs(), ["D::Order.Ping"; 6]);
|
|
538
538
|
let delivered: Vec<bool> = w
|
|
539
539
|
.reaction_log
|
|
540
540
|
.iter()
|
|
541
541
|
.map(|entry| reaction(entry).1)
|
|
542
542
|
.collect();
|
|
543
|
-
// The innermost reaction is logged first: the ceiling, then the
|
|
544
|
-
assert_eq!(delivered, [false, true, true, true, true]);
|
|
543
|
+
// The innermost reaction is logged first: the ceiling, then the five that delivered.
|
|
544
|
+
assert_eq!(delivered, [false, true, true, true, true, true]);
|
|
545
545
|
assert_eq!(reason(&w.reaction_log[0]), Some(DEPTH_REACHED));
|
|
546
546
|
}
|
|
547
547
|
|
|
@@ -549,9 +549,9 @@ fn a_policy_that_re_triggers_itself_stops_after_five_dispatches() {
|
|
|
549
549
|
fn a_fan_out_dispatches_once_per_row_with_the_row_id_under_the_declared_key_one_level_deeper() {
|
|
550
550
|
let mut w = world();
|
|
551
551
|
|
|
552
|
-
w.react(&event("Fan", "D::Order", "o1", Json::obj(vec![])),
|
|
552
|
+
w.react(&event("Fan", "D::Order", "o1", Json::obj(vec![])), 4);
|
|
553
553
|
|
|
554
|
-
// Each row dispatches `Ping` at depth
|
|
554
|
+
// Each row dispatches `Ping` at depth 5, whose own `Pinger` reaction is stopped there.
|
|
555
555
|
assert_eq!(w.verbs(), ["D::Order.Ping", "D::Order.Ping"]);
|
|
556
556
|
assert_eq!(
|
|
557
557
|
w.bus.calls[0].1,
|
|
@@ -586,7 +586,7 @@ fn a_fan_out_over_a_query_nothing_declares_logs_the_missing_query() {
|
|
|
586
586
|
fn a_saga_leg_stopped_at_the_ceiling_logs_it_and_never_dispatches() {
|
|
587
587
|
let mut w = world();
|
|
588
588
|
|
|
589
|
-
assert_eq!(w.deliver_saga(
|
|
589
|
+
assert_eq!(w.deliver_saga(5), None);
|
|
590
590
|
|
|
591
591
|
assert!(w.bus.calls.is_empty());
|
|
592
592
|
assert_eq!(reason(&w.saga_log[0]), Some(DEPTH_REACHED));
|
|
@@ -596,9 +596,9 @@ fn a_saga_leg_stopped_at_the_ceiling_logs_it_and_never_dispatches() {
|
|
|
596
596
|
fn a_saga_leg_just_under_the_ceiling_dispatches_one_level_deeper() {
|
|
597
597
|
let mut w = world();
|
|
598
598
|
|
|
599
|
-
assert_eq!(w.deliver_saga(
|
|
599
|
+
assert_eq!(w.deliver_saga(4), Some(true));
|
|
600
600
|
|
|
601
|
-
// Dispatched at depth
|
|
601
|
+
// Dispatched at depth 5, so the `Ping` it emits meets the ceiling and is not re-triggered.
|
|
602
602
|
assert_eq!(w.verbs(), ["D::Order.Ping"]);
|
|
603
603
|
assert_eq!(reason(&w.reaction_log[0]), Some(DEPTH_REACHED));
|
|
604
604
|
}
|
|
@@ -607,7 +607,7 @@ fn a_saga_leg_just_under_the_ceiling_dispatches_one_level_deeper() {
|
|
|
607
607
|
fn a_derived_compensation_stopped_at_the_ceiling_is_logged_failed_and_never_dispatches() {
|
|
608
608
|
let mut w = world();
|
|
609
609
|
|
|
610
|
-
w.deliver_compensation(
|
|
610
|
+
w.deliver_compensation(5);
|
|
611
611
|
|
|
612
612
|
assert!(w.bus.calls.is_empty());
|
|
613
613
|
assert_eq!(reason(&w.saga_log[0]), Some(DEPTH_REACHED));
|
|
@@ -621,7 +621,7 @@ fn a_derived_compensation_stopped_at_the_ceiling_is_logged_failed_and_never_disp
|
|
|
621
621
|
fn a_derived_compensation_just_under_the_ceiling_dispatches_one_level_deeper() {
|
|
622
622
|
let mut w = world();
|
|
623
623
|
|
|
624
|
-
w.deliver_compensation(
|
|
624
|
+
w.deliver_compensation(4);
|
|
625
625
|
|
|
626
626
|
assert_eq!(w.verbs(), ["D::Order.Ping"]);
|
|
627
627
|
assert_eq!(reason(&w.reaction_log[0]), Some(DEPTH_REACHED));
|
data/rust/web/Cargo.toml
CHANGED
|
@@ -18,7 +18,7 @@ rust = { path = ".." }
|
|
|
18
18
|
wasm-bindgen = "=0.2.126"
|
|
19
19
|
|
|
20
20
|
# Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
|
|
21
|
-
# out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
|
|
21
|
+
# out of library code. `hecks gate_run.gate! stage=ci only=rust_clippy` makes each of these an error.
|
|
22
22
|
# The same table is in every crate's Cargo.toml; change them together.
|
|
23
23
|
[lints.clippy]
|
|
24
24
|
pedantic = { level = "warn", priority = -1 }
|