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
|
@@ -53,14 +53,16 @@ module Hecks
|
|
|
53
53
|
# scratch constant here — `database:`/`schema:` are required keyword args because
|
|
54
54
|
# the caller (`hecks quality_control query sweep.run --persistence-parity`) owns that
|
|
55
55
|
# database's lifecycle.
|
|
56
|
-
def rebind_to_postgres_era!(copy, database:, schema:)
|
|
56
|
+
def rebind_to_postgres_era!(copy, database:, schema:, disposable: true)
|
|
57
57
|
require "pg"
|
|
58
58
|
require_owned_scratch!(database, schema)
|
|
59
59
|
|
|
60
60
|
rewrite_bindings!(copy, "PostgresEra")
|
|
61
61
|
ensure_postgres_era_schema!(database: database, schema: schema)
|
|
62
62
|
|
|
63
|
-
write_worlds!(copy, "hecks_fuzz_postgres_era.world")
|
|
63
|
+
write_worlds!(copy, "hecks_fuzz_postgres_era.world") do |name|
|
|
64
|
+
postgres_era_world(name, database, schema, disposable: disposable)
|
|
65
|
+
end
|
|
64
66
|
write_unbound_bluebook_worlds!(copy)
|
|
65
67
|
end
|
|
66
68
|
|
|
@@ -73,18 +75,14 @@ module Hecks
|
|
|
73
75
|
"There is no shared default, unlike :postgres, so the caller cannot forget to own the lifecycle."
|
|
74
76
|
end
|
|
75
77
|
|
|
76
|
-
# The world text for one bluebook on `PostgresEra
|
|
78
|
+
# The world text for one bluebook on `PostgresEra`, in a throwaway schema the caller owns.
|
|
77
79
|
#
|
|
78
|
-
# `
|
|
79
|
-
#
|
|
80
|
-
# creates it; `ensure_postgres_era_schema!` only needs to drop it first).
|
|
80
|
+
# `allow_superuser true` is deliberate: the era write-fence is row-level security, which a
|
|
81
|
+
# superuser bypasses, and the fence is not under test here.
|
|
81
82
|
#
|
|
82
|
-
#
|
|
83
|
-
#
|
|
84
|
-
|
|
85
|
-
# schema the caller creates and drops, comparing Memory against PostgresEra's
|
|
86
|
-
# SQL — the era fence isn't under test, so opting in here is safe.
|
|
87
|
-
def postgres_era_world(name, database, schema)
|
|
83
|
+
# The ledger is disposable unless the caller holds the first era itself and wants the
|
|
84
|
+
# era guard (`disposable: false`).
|
|
85
|
+
def postgres_era_world(name, database, schema, disposable: true)
|
|
88
86
|
<<~WORLD
|
|
89
87
|
Hecks.world "#{name}" do
|
|
90
88
|
default_adapter "PostgresEra"
|
|
@@ -92,6 +90,7 @@ module Hecks
|
|
|
92
90
|
database "#{database}"
|
|
93
91
|
schema "#{schema}"
|
|
94
92
|
allow_superuser true
|
|
93
|
+
#{"disposable_ledger true" if disposable}
|
|
95
94
|
end
|
|
96
95
|
end
|
|
97
96
|
WORLD
|
|
@@ -58,18 +58,36 @@ module Hecks
|
|
|
58
58
|
# blocks (e.g. `context_map.hecksagon` beside the main one) across sibling files
|
|
59
59
|
# in the same directory, and a second `File.write` to the same path would drop
|
|
60
60
|
# the first file's names.
|
|
61
|
+
#
|
|
62
|
+
# A directory that holds the hecksagon named for it (`ask_policy/ask_policy.hecksagon`) may
|
|
63
|
+
# be loaded as a module folder of its parent, which reads only the `.world` named for the
|
|
64
|
+
# folder: the world takes that name there.
|
|
61
65
|
def write_worlds!(copy, world_file, &world_for)
|
|
62
|
-
hecksagon_names_by_dir(copy).
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
File.write(File.join(dir, world_file), names.uniq.map(&world_for).join("\n"))
|
|
66
|
+
written = hecksagon_names_by_dir(copy).filter_map do |dir, names|
|
|
67
|
+
write_world(dir, names, world_file, &world_for)
|
|
66
68
|
end
|
|
67
69
|
|
|
68
70
|
Dir.glob(File.join(copy, "**", "*.world")).each do |path|
|
|
69
|
-
File.delete(path) unless File.basename(path) == world_file
|
|
71
|
+
File.delete(path) unless written.include?(path) || File.basename(path) == world_file
|
|
70
72
|
end
|
|
71
73
|
end
|
|
72
74
|
|
|
75
|
+
# Writes `dir`'s world for `names`, and answers its path; nil when no hecksagon is named.
|
|
76
|
+
def write_world(dir, names, world_file, &world_for)
|
|
77
|
+
return if names.empty?
|
|
78
|
+
|
|
79
|
+
File.join(dir, world_file_for(dir, world_file)).tap do |path|
|
|
80
|
+
File.write(path, names.uniq.map(&world_for).join("\n"))
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# The file `dir`'s world is written to: `world_file`, or the folder's own name when its
|
|
85
|
+
# hecksagon carries that name.
|
|
86
|
+
def world_file_for(dir, world_file)
|
|
87
|
+
name = File.basename(dir)
|
|
88
|
+
File.exist?(File.join(dir, "#{name}.hecksagon")) ? "#{name}.world" : world_file
|
|
89
|
+
end
|
|
90
|
+
|
|
73
91
|
# The `Hecks.hecksagon` names declared in each directory under `copy`.
|
|
74
92
|
def hecksagon_names_by_dir(copy)
|
|
75
93
|
names_by_dir = Hash.new { |hash, dir| hash[dir] = [] }
|
|
@@ -52,7 +52,7 @@ module Hecks
|
|
|
52
52
|
when :memory then rebind_to_memory!(copy)
|
|
53
53
|
when :sqlite then rebind_to_sqlite!(copy)
|
|
54
54
|
when :postgres then rebind_to_postgres!(copy, **scratch)
|
|
55
|
-
when :postgres_era then rebind_to_postgres_era!(copy, database: database, schema: schema)
|
|
55
|
+
when :postgres_era then rebind_to_postgres_era!(copy, database: database, schema: schema, **scratch)
|
|
56
56
|
else raise ArgumentError,
|
|
57
57
|
"unknown fuzz adapter #{adapter.inspect} — :memory, :sqlite, :postgres, or :postgres_era"
|
|
58
58
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require_relative "../../
|
|
1
|
+
require_relative "../../tools/run"
|
|
2
2
|
require_relative "../../behaviors"
|
|
3
3
|
require_relative "observation"
|
|
4
4
|
require_relative "../../text"
|
|
@@ -48,13 +48,13 @@ module Hecks
|
|
|
48
48
|
# The report `hecks run` would print for the script.
|
|
49
49
|
def corpus_report(domain, corpus)
|
|
50
50
|
IsolatedBoot.call(domain) do |copy|
|
|
51
|
-
|
|
51
|
+
Tools::Run.execute(Hecks.boot(copy, environment: nil), corpus.fetch("steps"))
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
# @return [String, nil] the first expectation of the script the report does not meet
|
|
56
56
|
def unmet_expectation(corpus, report)
|
|
57
|
-
unmet =
|
|
57
|
+
unmet = Tools::RunExpectations.unmet(corpus["expectations"] || {}, report).first
|
|
58
58
|
unmet && unmet.lines.first.strip
|
|
59
59
|
end
|
|
60
60
|
|
|
@@ -25,7 +25,7 @@ Hecks.bluebook "Translation" do
|
|
|
25
25
|
value_object "Kind" do
|
|
26
26
|
attribute :value, String,
|
|
27
27
|
one_of: ["rename", "move", "convert", "drop", "retype", "retired", "derive", "rekey_to",
|
|
28
|
-
"backfill", "unresolved"]
|
|
28
|
+
"backfill", "split", "unresolved"]
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
value_object "SourcePath" do
|
|
@@ -578,6 +578,70 @@
|
|
|
578
578
|
}
|
|
579
579
|
}
|
|
580
580
|
},
|
|
581
|
+
{
|
|
582
|
+
"verb": "Translation::Rule.Propose",
|
|
583
|
+
"args": {
|
|
584
|
+
"kind": {
|
|
585
|
+
"value": "split"
|
|
586
|
+
},
|
|
587
|
+
"source": {
|
|
588
|
+
"value": "split"
|
|
589
|
+
},
|
|
590
|
+
"destination": {
|
|
591
|
+
"value": ""
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
},
|
|
595
|
+
{
|
|
596
|
+
"verb": "Translation::Rule.Execute",
|
|
597
|
+
"args": {
|
|
598
|
+
"source": {
|
|
599
|
+
"value": "split"
|
|
600
|
+
},
|
|
601
|
+
"target": {
|
|
602
|
+
"value": "postgres"
|
|
603
|
+
},
|
|
604
|
+
"form": {
|
|
605
|
+
"value": "fan-out: the source is chained through the edges before the split, then each row becomes one row per keyed_by value, carrying the named fields; a delete carries through"
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
"verb": "Translation::Rule.Execute",
|
|
611
|
+
"args": {
|
|
612
|
+
"source": {
|
|
613
|
+
"value": "split"
|
|
614
|
+
},
|
|
615
|
+
"target": {
|
|
616
|
+
"value": "sqlite"
|
|
617
|
+
},
|
|
618
|
+
"form": {
|
|
619
|
+
"value": "fan-out: the source is chained through the edges before the split, then each row becomes one row per keyed_by value, carrying the named fields; a delete carries through"
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
},
|
|
623
|
+
{
|
|
624
|
+
"verb": "Translation::Rule.Execute",
|
|
625
|
+
"args": {
|
|
626
|
+
"source": {
|
|
627
|
+
"value": "split"
|
|
628
|
+
},
|
|
629
|
+
"target": {
|
|
630
|
+
"value": "in_process"
|
|
631
|
+
},
|
|
632
|
+
"form": {
|
|
633
|
+
"value": "every source row that carries the keyed_by field yields one target row under that value, holding the named fields; a delete removes the target row"
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
},
|
|
637
|
+
{
|
|
638
|
+
"verb": "Translation::Rule.Admit",
|
|
639
|
+
"args": {
|
|
640
|
+
"source": {
|
|
641
|
+
"value": "split"
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
},
|
|
581
645
|
{
|
|
582
646
|
"verb": "Translation::Rule.Propose",
|
|
583
647
|
"args": {
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "pathname"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Adapters
|
|
7
|
+
# When two file areas overlap: the one rule behind a Work row's `area` claim and a Landing's
|
|
8
|
+
# changed files. An area is a path prefix (`lib/hecks`) or a glob (`lib/**/*.rb`), compared by
|
|
9
|
+
# whole segments, so `lib/hecks` holds `lib/hecks/a` and not `lib/hecks_extra`.
|
|
10
|
+
#
|
|
11
|
+
# It never misses a real overlap; it may report one that is not real. Areas are normalized
|
|
12
|
+
# first (`//`, `.`, `..`, a trailing `/`, absolute paths made repository-relative, case folded
|
|
13
|
+
# where the filesystem folds it). Then they overlap unless a segment proves them apart: a
|
|
14
|
+
# prefix holds everything beneath it, the empty area is the whole repository, `**` stands for
|
|
15
|
+
# any depth, and a glob without a `/` matches at any depth. A file holds nothing beneath it.
|
|
16
|
+
module AreaOverlap
|
|
17
|
+
# Characters that make a segment a glob.
|
|
18
|
+
WILDCARD = /[*?\[{]/
|
|
19
|
+
|
|
20
|
+
# A brace group that holds a `/`, which splitting on `/` would tear apart.
|
|
21
|
+
SLASHED_BRACE = /\{[^}]*\/[^}]*\}/
|
|
22
|
+
|
|
23
|
+
# The segment that stands for any number of directories.
|
|
24
|
+
ANY = "**"
|
|
25
|
+
|
|
26
|
+
# How a single segment glob is matched.
|
|
27
|
+
MATCHING = File::FNM_EXTGLOB | File::FNM_DOTMATCH
|
|
28
|
+
|
|
29
|
+
module_function
|
|
30
|
+
|
|
31
|
+
# Whether two areas overlap.
|
|
32
|
+
#
|
|
33
|
+
# @param one [String] a path prefix or glob
|
|
34
|
+
# @param other [String] a path prefix or glob
|
|
35
|
+
# @param root [String, nil] the repository's top level, to make absolute paths relative
|
|
36
|
+
# @param file [Boolean] whether `other` is known to be a file, which holds nothing beneath it
|
|
37
|
+
# @return [Boolean]
|
|
38
|
+
def overlap?(one, other, root: nil, file: false)
|
|
39
|
+
folded = fold_case?(root)
|
|
40
|
+
left = segments(one, root, folded)
|
|
41
|
+
right = segments(other, root, folded)
|
|
42
|
+
return true if left.nil? || right.nil?
|
|
43
|
+
|
|
44
|
+
file ? meet?(left, right, leaf: true) : meet?(left, right)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# The first pair of paths, one from each list, that overlap.
|
|
48
|
+
#
|
|
49
|
+
# @param mine [Array<String>] areas or file paths
|
|
50
|
+
# @param theirs [Array<String>] areas or file paths
|
|
51
|
+
# @param root [String, nil] the repository's top level
|
|
52
|
+
# @return [Array(String, String), nil] the pair, or nil when none overlap
|
|
53
|
+
def first_overlap(mine, theirs, root: nil)
|
|
54
|
+
mine.each do |one|
|
|
55
|
+
theirs.each { |other| return [one, other] if overlap?(one, other, root: root) }
|
|
56
|
+
end
|
|
57
|
+
nil
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# @return [Array<String>, nil] the normalized segments, nil when the path may be anywhere
|
|
61
|
+
def segments(path, root, folded)
|
|
62
|
+
text = path.to_s.strip
|
|
63
|
+
text = text.downcase if folded
|
|
64
|
+
return [ANY] if text.match?(SLASHED_BRACE)
|
|
65
|
+
|
|
66
|
+
relative = relative_to(text, root, folded)
|
|
67
|
+
relative && anywhere(collapse(relative.split("/")), relative)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# A glob without a `/` matches at any depth, as it does in a git pathspec.
|
|
71
|
+
def anywhere(parts, text)
|
|
72
|
+
parts.size == 1 && wild?(parts.first) && !text.include?("/") ? [ANY, parts.first] : parts
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# @return [String, nil] the path under the repository; nil when it is absolute and could be
|
|
76
|
+
# anywhere (no root known); a path outside the root gets a segment no area has
|
|
77
|
+
def relative_to(text, root, folded)
|
|
78
|
+
return text unless text.start_with?("/")
|
|
79
|
+
return nil unless root
|
|
80
|
+
|
|
81
|
+
inside = under(text, folded ? root.downcase : root)
|
|
82
|
+
inside.start_with?("..") ? "/outside/#{text}" : inside
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# @return [String] the path from `root`; empty for the root itself
|
|
86
|
+
def under(text, root)
|
|
87
|
+
found = cleaned(text).relative_path_from(cleaned(root)).to_s
|
|
88
|
+
found == "." ? "" : found
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def cleaned(text) = Pathname.new(text).cleanpath
|
|
92
|
+
|
|
93
|
+
# @return [Array<String>] the segments without empty and `.` ones, `..` applied
|
|
94
|
+
def collapse(parts)
|
|
95
|
+
parts.each_with_object([]) do |part, kept|
|
|
96
|
+
next if part.empty? || part == "."
|
|
97
|
+
|
|
98
|
+
part == ".." ? up(kept) : kept << part
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def up(kept)
|
|
103
|
+
return kept << ".." if kept.empty? || kept.last == ".."
|
|
104
|
+
|
|
105
|
+
kept << ANY if kept.pop == ANY
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# @return [Boolean] whether the filesystem under `root` treats `A` and `a` alike
|
|
109
|
+
def fold_case?(root)
|
|
110
|
+
base = root || Dir.pwd
|
|
111
|
+
swapped = base.swapcase
|
|
112
|
+
swapped != base && File.exist?(swapped) && File.identical?(swapped, base)
|
|
113
|
+
rescue SystemCallError
|
|
114
|
+
false
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# @param leaf [Boolean] whether `right` is a file, so it holds nothing beneath it
|
|
118
|
+
# @return [Boolean] whether two segment lists can name a common path
|
|
119
|
+
def meet?(left, right, leaf: false)
|
|
120
|
+
return exhausted?(left, right, leaf) if left.empty? || right.empty?
|
|
121
|
+
return meet?(right, left) if swap?(left, right, leaf)
|
|
122
|
+
return reaches?(left, right, leaf) if left.first == ANY
|
|
123
|
+
|
|
124
|
+
segments_meet?(left.first, right.first) && meet?(left.drop(1), right.drop(1), leaf: leaf)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# One list ran out: its path holds the rest, unless that is a file's.
|
|
128
|
+
def exhausted?(left, right, leaf) = left.empty? || (right.empty? && (!leaf || left.all?(ANY)))
|
|
129
|
+
|
|
130
|
+
# Puts a leading `**` on the left.
|
|
131
|
+
def swap?(left, right, leaf) = !leaf && right.first == ANY && left.first != ANY
|
|
132
|
+
|
|
133
|
+
# A leading `**` matches no segment or swallows one of the other list's.
|
|
134
|
+
def reaches?(left, right, leaf)
|
|
135
|
+
meet?(left.drop(1), right, leaf: leaf) || meet?(left, right.drop(1), leaf: leaf)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def segments_meet?(one, other)
|
|
139
|
+
return one == other unless wild?(one) || wild?(other)
|
|
140
|
+
return File.fnmatch?(other, one, MATCHING) if wild?(other) && !wild?(one)
|
|
141
|
+
return File.fnmatch?(one, other, MATCHING) unless wild?(other)
|
|
142
|
+
|
|
143
|
+
beginnings_agree?(one, other)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def beginnings_agree?(one, other)
|
|
147
|
+
left = one.split(WILDCARD, 2).first.to_s
|
|
148
|
+
right = other.split(WILDCARD, 2).first.to_s
|
|
149
|
+
left.start_with?(right) || right.start_with?(left)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# @return [Boolean] whether the segment is a glob
|
|
153
|
+
def wild?(segment) = segment.match?(WILDCARD)
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
@@ -5,6 +5,7 @@ require_relative "shell"
|
|
|
5
5
|
require "time"
|
|
6
6
|
require_relative "console_capture"
|
|
7
7
|
require_relative "claude_transcript"
|
|
8
|
+
require_relative "dispatching/settings"
|
|
8
9
|
|
|
9
10
|
module Hecks
|
|
10
11
|
module Adapters
|
|
@@ -28,8 +29,10 @@ module Hecks
|
|
|
28
29
|
# @param aggregate [Object, nil] unused
|
|
29
30
|
# @param settings [Hash] `command:` the program that starts sessions (default `claude`)
|
|
30
31
|
# @param root [String, nil] unused
|
|
31
|
-
|
|
32
|
+
# @param registry [Runtime::Registry, nil] whose Tickets world names the session environment
|
|
33
|
+
def initialize(aggregate: nil, settings: {}, root: nil, registry: nil)
|
|
32
34
|
@command = settings[:command] || COMMAND
|
|
35
|
+
@session = Dispatching::Settings.new(registry)
|
|
33
36
|
@shell = Shell.new
|
|
34
37
|
@transcript = ClaudeTranscript.new(**settings.slice(:projects))
|
|
35
38
|
end
|
|
@@ -52,7 +55,7 @@ module Hecks
|
|
|
52
55
|
# @return [Hash{Symbol => Hash}] `session:` the id the session is known by
|
|
53
56
|
# @raise [ConsoleCapture::Failure] when the command fails or names no session
|
|
54
57
|
def start(**held)
|
|
55
|
-
result = @shell.capture(*start_arguments(held), chdir: plain(held[:repo]))
|
|
58
|
+
result = @shell.capture(*start_arguments(held), env: @session.session_environment, chdir: plain(held[:repo]))
|
|
56
59
|
raise ConsoleCapture::Failure, "#{@command} did not start a session: #{result.err.strip}" unless result.ok?
|
|
57
60
|
|
|
58
61
|
id = result.out[SESSION_ID, 1]
|
|
@@ -110,9 +113,11 @@ module Hecks
|
|
|
110
113
|
|
|
111
114
|
def start_arguments(held)
|
|
112
115
|
agent = plain(held[:agent])
|
|
113
|
-
[@command, *(agent ? ["--agent", agent] : []), "--bg", "--", plain(held[:brief])]
|
|
116
|
+
[*niceness, @command, *(agent ? ["--agent", agent] : []), "--bg", "--", plain(held[:brief])]
|
|
114
117
|
end
|
|
115
118
|
|
|
119
|
+
def niceness = @session.nice ? ["nice", "-n", @session.nice.to_s] : []
|
|
120
|
+
|
|
116
121
|
def plain(argument) = argument.is_a?(Hash) ? argument[:value] : argument
|
|
117
122
|
end
|
|
118
123
|
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "spec_files"
|
|
4
|
+
require_relative "impacted_specs"
|
|
5
|
+
require_relative "run_options"
|
|
6
|
+
require_relative "test_runner"
|
|
7
|
+
|
|
8
|
+
module Hecks
|
|
9
|
+
module Adapters
|
|
10
|
+
module Codebase
|
|
11
|
+
# What Codebase's `TestSuiteRun` asks to run by file: one example of one file, several
|
|
12
|
+
# files in one launcher boot, and the files a branch's changes touch.
|
|
13
|
+
module BatchRuns
|
|
14
|
+
# The operations this module carries out.
|
|
15
|
+
OPERATIONS = %w[run_spec_example run_spec_files run_impacted_specs].freeze
|
|
16
|
+
|
|
17
|
+
module_function
|
|
18
|
+
|
|
19
|
+
# @param operation [String] one of `OPERATIONS`
|
|
20
|
+
# @param args [Hash] the `TestSuiteRun` record's plain fields
|
|
21
|
+
# @param tree [Tree] the checkout
|
|
22
|
+
# @return [String] each file's counts and the total, with the mapping for an impacted run
|
|
23
|
+
# @raise [ConsoleCapture::Failure] when a file fails or cannot be run
|
|
24
|
+
def call(operation, args, tree)
|
|
25
|
+
case operation
|
|
26
|
+
when "run_spec_example" then spec_example(args, tree)
|
|
27
|
+
when "run_spec_files" then spec_files(args, tree)
|
|
28
|
+
else impacted(args, tree)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @param args [Hash] `file`, `example`, and the arguments that set the specs' variables
|
|
33
|
+
# @param tree [Tree] the checkout
|
|
34
|
+
# @return [String] what the runner printed
|
|
35
|
+
def spec_example(args, tree)
|
|
36
|
+
TestRunner.new(tree).run(file: args[:file], example: args[:example], env: RunOptions.spec_env(args), tags: args[:tags])
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @param args [Hash] `files` (whitespace-separated), `example`, `isolation` and the
|
|
40
|
+
# run's variables
|
|
41
|
+
# @param tree [Tree] the checkout
|
|
42
|
+
# @return [String] each file's counts and the total
|
|
43
|
+
def spec_files(args, tree)
|
|
44
|
+
SpecFiles.new(tree).run(files: args[:files], example: args[:example], isolation: args[:isolation] || "process",
|
|
45
|
+
env: RunOptions.spec_env(args), tags: args[:tags])
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @param args [Hash] `base` (`main` when absent), `cap`, `dry`, `isolation`, `example`
|
|
49
|
+
# and the run's variables
|
|
50
|
+
# @param tree [Tree] the checkout
|
|
51
|
+
# @return [String] the mapping and, unless dry, how each spec file ended
|
|
52
|
+
def impacted(args, tree)
|
|
53
|
+
ImpactedSpecs.new(tree).call(base: args[:base] || "main", cap: args[:cap] || ImpactedSpecs::DEFAULT_CAP,
|
|
54
|
+
dry: args[:dry] == true, isolation: args[:isolation] || "process",
|
|
55
|
+
example: args[:example], env: RunOptions.spec_env(args), tags: args[:tags])
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "open3"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Adapters
|
|
7
|
+
module Codebase
|
|
8
|
+
# Which specs a set of changed files runs, by name alone: a changed spec runs itself, and a
|
|
9
|
+
# changed source file runs the spec of the same name (`lib/x/thing.rb` runs `thing_spec.rb`).
|
|
10
|
+
#
|
|
11
|
+
# A file that maps to no spec is reported, not guessed at, so a change to a file no spec
|
|
12
|
+
# names runs nothing rather than the whole suite.
|
|
13
|
+
module ChangedSpecs
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
# @param changed [Array<String>] the changed files, relative to the folder
|
|
17
|
+
# @param specs [Array<String>] every spec file of the folder, relative to the folder
|
|
18
|
+
# @return [Array<String>] the specs to run, sorted and without duplicates
|
|
19
|
+
def call(changed, specs)
|
|
20
|
+
by_name = specs.group_by { |spec| File.basename(spec) }
|
|
21
|
+
changed.flat_map do |file|
|
|
22
|
+
next [file] if specs.include?(file)
|
|
23
|
+
|
|
24
|
+
by_name.fetch("#{File.basename(file, ".rb")}_spec.rb", [])
|
|
25
|
+
end.uniq.sort
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @param changed [Array<String>] the changed files
|
|
29
|
+
# @param specs [Array<String>] every spec file of the folder
|
|
30
|
+
# @return [Array<String>] the changed Ruby files that map to no spec, for the report
|
|
31
|
+
def unmapped(changed, specs)
|
|
32
|
+
mapped = call(changed, specs)
|
|
33
|
+
changed.select { |file| file.end_with?(".rb") && !mapped.include?(file) && call([file], specs).empty? }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# The files that differ from the ref, tracked and untracked, relative to the folder.
|
|
37
|
+
#
|
|
38
|
+
# @param tree [Tree] the folder under git
|
|
39
|
+
# @param base [String] the ref to compare against
|
|
40
|
+
# @return [Array<String>] the changed files
|
|
41
|
+
# @raise [ConsoleCapture::Failure] when git refuses, with what it said
|
|
42
|
+
def changed_files(tree, base)
|
|
43
|
+
diff, status = Open3.capture2e("git", "-C", tree.root, "diff", "--name-only", base, "--")
|
|
44
|
+
raise ConsoleCapture::Failure, diff.strip unless status.success?
|
|
45
|
+
|
|
46
|
+
untracked, = Open3.capture2("git", "-C", tree.root, "ls-files", "--others", "--exclude-standard")
|
|
47
|
+
(diff.lines + untracked.lines).map(&:strip).reject(&:empty?).uniq
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -16,11 +16,12 @@ module Hecks
|
|
|
16
16
|
# when the request is confirmed.
|
|
17
17
|
module Codemods
|
|
18
18
|
# Every operation this family carries out.
|
|
19
|
-
OPERATIONS = %w[hoist_local_givens drop_implicit_append_fields].freeze
|
|
19
|
+
OPERATIONS = %w[hoist_local_givens drop_implicit_append_fields move_former_name].freeze
|
|
20
20
|
|
|
21
21
|
# The script each operation runs.
|
|
22
22
|
SCRIPTS = { "hoist_local_givens" => "codemod_hoist_local_givens",
|
|
23
|
-
"drop_implicit_append_fields" => "codemod_implicit_append_fields"
|
|
23
|
+
"drop_implicit_append_fields" => "codemod_implicit_append_fields",
|
|
24
|
+
"move_former_name" => "codemod_move_former_name" }.freeze
|
|
24
25
|
|
|
25
26
|
module_function
|
|
26
27
|
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative "tree"
|
|
4
4
|
require_relative "ruby_child"
|
|
5
|
+
require_relative "launcher_text"
|
|
5
6
|
require "hecks/engine_agreement"
|
|
6
7
|
require "hecks/doc/reference"
|
|
7
8
|
require "hecks/shape_ledger"
|
|
9
|
+
require "hecks/tools/gate_memo/standalone"
|
|
8
10
|
|
|
9
11
|
module Hecks
|
|
10
12
|
module Adapters
|
|
@@ -18,7 +20,8 @@ module Hecks
|
|
|
18
20
|
# script only reports, and with it the script rewrites the committed matrix and its fixtures.
|
|
19
21
|
module Conformance
|
|
20
22
|
# Every operation this family carries out.
|
|
21
|
-
OPERATIONS = %w[check_engine_agreement measure_doc_coverage check_shape_ledger
|
|
23
|
+
OPERATIONS = %w[check_engine_agreement measure_doc_coverage check_shape_ledger check_command_names
|
|
24
|
+
check_workflow_pagination argument_gate_matrix].freeze
|
|
22
25
|
|
|
23
26
|
module_function
|
|
24
27
|
|
|
@@ -34,6 +37,8 @@ module Hecks
|
|
|
34
37
|
when "check_engine_agreement" then engine_agreement(tree)
|
|
35
38
|
when "measure_doc_coverage" then doc_coverage(tree)
|
|
36
39
|
when "check_shape_ledger" then shape_ledger(held, tree)
|
|
40
|
+
when "check_command_names" then LauncherText.command_names(tree)
|
|
41
|
+
when "check_workflow_pagination" then LauncherText.workflow_pagination(tree)
|
|
37
42
|
else gate_matrix(held, tree)
|
|
38
43
|
end
|
|
39
44
|
end
|
|
@@ -64,6 +69,14 @@ module Hecks
|
|
|
64
69
|
# @return [String] the clean verdict, or what was written
|
|
65
70
|
# @raise [ConsoleCapture::Failure] with each bluebook whose shape moved without an edge
|
|
66
71
|
def shape_ledger(held, tree)
|
|
72
|
+
return judge_shape_ledger(held, tree) if on?(held[:confirm]) || on?(held[:additive])
|
|
73
|
+
|
|
74
|
+
Tools::GateMemo::Standalone.guard(tree.root, "shape_ledger") { judge_shape_ledger(held, tree) }
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# @return [String] the ledger's verdict, or what it wrote
|
|
78
|
+
# @raise [ConsoleCapture::Failure] with each bluebook whose shape moved without an edge
|
|
79
|
+
def judge_shape_ledger(held, tree)
|
|
67
80
|
ShapeLedger.check(tree.path("lib/hecks/hecks"), confirm: on?(held[:confirm]), additive: on?(held[:additive]))
|
|
68
81
|
rescue ShapeLedger::Failure => e
|
|
69
82
|
raise ConsoleCapture::Failure, e.message
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module Adapters
|
|
5
|
+
class SourceTree
|
|
6
|
+
# The `SourceTree` queries that read the corpus of domains: which have Rust, the order regeneration
|
|
7
|
+
# walks them in, and what the IR and its propagation touchpoints say. Each is answered through
|
|
8
|
+
# `corpus`, which the includer provides.
|
|
9
|
+
module CorpusQueries
|
|
10
|
+
# @return [Hash] `text:` the feature and directory of every domain with a Rust feature
|
|
11
|
+
# @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
|
|
12
|
+
def rust_domains(**)
|
|
13
|
+
{ text: corpus("rust_domains", {}) }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @return [Hash] `text:` the directories regeneration walks, in the order it walks them
|
|
17
|
+
# @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
|
|
18
|
+
def regen_order(**)
|
|
19
|
+
{ text: corpus("regen_order", {}) }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @return [Hash] `text:` whether each generated Rust module is covered
|
|
23
|
+
# @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
|
|
24
|
+
# @raise [ConsoleCapture::Failure] when a module is not covered
|
|
25
|
+
def corpus_rust_coverage(**)
|
|
26
|
+
{ text: corpus("corpus_rust_coverage", {}) }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @param args [Hash] the query's arguments: `names`
|
|
30
|
+
# @return [Hash] `text:` each IR construct's diff from its meta-domain
|
|
31
|
+
# @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
|
|
32
|
+
def ir_constructs(**args)
|
|
33
|
+
{ text: corpus("ir_constructs", args) }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @param args [Hash] the query's arguments: `domains`, `meta`
|
|
37
|
+
# @return [Hash] `text:` the rules declared more than once
|
|
38
|
+
# @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
|
|
39
|
+
def ir_duplicates(**args)
|
|
40
|
+
{ text: corpus("ir_duplicates", args) }
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @param args [Hash] the query's arguments: `name`, `field`
|
|
44
|
+
# @return [Hash] `text:` which propagation touchpoints already show the field
|
|
45
|
+
# @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
|
|
46
|
+
# @raise [ConsoleCapture::Failure] when the construct is not one
|
|
47
|
+
def ir_impact(**args)
|
|
48
|
+
{ text: corpus("ir_impact", args) }
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|