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
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../shell"
|
|
4
|
+
require "hecks/vendoring/git_environment"
|
|
5
|
+
require "hecks/vocabulary"
|
|
6
|
+
require_relative "impacted"
|
|
7
|
+
|
|
8
|
+
module Hecks
|
|
9
|
+
module Adapters
|
|
10
|
+
class GitRehearsal
|
|
11
|
+
# The stages a rehearsal runs, run in a copy of the commit. Which ones is data: the
|
|
12
|
+
# `RehearsalScope` row of the scope lists `RehearsalStage` rows of the Vocabulary bluebook
|
|
13
|
+
# (the gate's `quick` stage, the specs the
|
|
14
|
+
# push's changes touch), and this only runs them. Nothing here runs the full spec suite.
|
|
15
|
+
class Stages
|
|
16
|
+
# How one stage ended.
|
|
17
|
+
#
|
|
18
|
+
# @!attribute [r] name
|
|
19
|
+
# @return [String] the stage
|
|
20
|
+
# @!attribute [r] passed
|
|
21
|
+
# @return [Boolean] whether it passed
|
|
22
|
+
# @!attribute [r] detail
|
|
23
|
+
# @return [String] what failed, naming the check and the spec; empty when it passed
|
|
24
|
+
Result = Struct.new(:name, :passed, :detail) do
|
|
25
|
+
# @return [String] the stage, pass or fail, and what failed
|
|
26
|
+
def line = passed ? "#{name}: pass#{detail}" : "#{name}: FAIL #{detail}"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# The gate script, as the pre-push hook calls it.
|
|
30
|
+
GATE = ["bundle", "exec", "ruby", "-Ilib", "-e", 'require "hecks/tools"; Hecks::Tools.script("gate", ARGV)'].freeze
|
|
31
|
+
|
|
32
|
+
# The gate's red verdict line: `[gate quick] red: shape_ledger, rubocop`.
|
|
33
|
+
RED = /^\[gate \S+\] red: ([^;\n]+)/
|
|
34
|
+
|
|
35
|
+
# A failing example as rspec prints it in its summary: `rspec ./spec/a_spec.rb:12 # ...`.
|
|
36
|
+
FAILED_SPEC = %r{^rspec (\./\S+)}
|
|
37
|
+
|
|
38
|
+
# The variables of the calling process that would point a copy's `bundle exec` at the
|
|
39
|
+
# checkout the rehearsal was asked from.
|
|
40
|
+
BUNDLER = %w[BUNDLE_GEMFILE BUNDLE_BIN_PATH RUBYOPT RUBYLIB].freeze
|
|
41
|
+
|
|
42
|
+
# @param directory [String] the copy of the commit the stages run in
|
|
43
|
+
# @param branch [String] the branch pushed; impacted specs compare with `origin/<branch>`
|
|
44
|
+
# @param impacted_limit [Integer, nil] the most impacted spec files to run
|
|
45
|
+
# @param impacted_width [Integer, nil] how many of them run at once
|
|
46
|
+
# @param scope [String] a `RehearsalScope` row: `quick` or `deep`
|
|
47
|
+
def initialize(directory, branch: "main", impacted_limit: nil, impacted_width: nil, scope: "quick")
|
|
48
|
+
@scope = scope
|
|
49
|
+
@directory = directory
|
|
50
|
+
@branch = branch
|
|
51
|
+
@impacted_limit = impacted_limit
|
|
52
|
+
@impacted_width = impacted_width
|
|
53
|
+
@shell = Shell.new
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @return [Array<Result>] each stage's result, in the order the scope's row lists them
|
|
57
|
+
def run = self.class.rows(@scope).map { |row| step(row) }
|
|
58
|
+
|
|
59
|
+
# @param scope [String] a scope's name
|
|
60
|
+
# @return [Array<Hash>] the scope's `RehearsalStage` rows, in the order it runs them
|
|
61
|
+
# @raise [KeyError] when no `RehearsalScope` row has that name
|
|
62
|
+
def self.rows(scope)
|
|
63
|
+
stages = Vocabulary.rows("RehearsalStage").to_h { |row| [row["name"], row] }
|
|
64
|
+
scope_row = Vocabulary.rows("RehearsalScope").find { |row| row["name"] == scope }
|
|
65
|
+
raise KeyError, "no rehearsal scope #{scope.inspect}" unless scope_row
|
|
66
|
+
|
|
67
|
+
scope_row["stages"].split(",").map { |name| stages.fetch(name) }
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# @return [Array<String>] the names of the rehearsal scopes
|
|
71
|
+
def self.scopes = Vocabulary.rows("RehearsalScope").map { |row| row["name"] }
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
def step(row)
|
|
76
|
+
case row["kind"]
|
|
77
|
+
when "gate" then gate(row["argument"])
|
|
78
|
+
else impacted
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def gate(stage)
|
|
83
|
+
result = capture(*GATE, stage, env: { "HECKS_ENVIRONMENT" => "memory" })
|
|
84
|
+
return Result.new(stage, true, "") if result.ok?
|
|
85
|
+
|
|
86
|
+
Result.new(stage, false, failure(result, checks: result.out[RED, 1]))
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def failure(result, checks: nil)
|
|
90
|
+
specs = failing_specs(result)
|
|
91
|
+
parts = []
|
|
92
|
+
parts << "failing check: #{checks.strip}" if checks
|
|
93
|
+
parts << "failing spec: #{specs.join(", ")}" unless specs.empty?
|
|
94
|
+
parts << "exit #{result.exit_code}: #{last_line(result)}" if parts.empty?
|
|
95
|
+
parts.join("; ")
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def failing_specs(result) = spec_names(result.out)
|
|
99
|
+
|
|
100
|
+
def spec_names(output) = output.scan(FAILED_SPEC).flatten.uniq
|
|
101
|
+
|
|
102
|
+
def last_line(result) = printed_lines(result).last.to_s
|
|
103
|
+
|
|
104
|
+
def printed_lines(result) = "#{result.out}#{result.err}".lines.map(&:strip).reject(&:empty?)
|
|
105
|
+
|
|
106
|
+
def impacted
|
|
107
|
+
runner = ->(directory, *command, env:) { capture(*command, env: env, directory: directory) }
|
|
108
|
+
Impacted.build(@directory, branch: @branch, capture: runner, limit: @impacted_limit, width: @impacted_width).result
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def capture(*command, env:, directory: @directory)
|
|
112
|
+
clean = BUNDLER.to_h { |name| [name, nil] }.merge(Vendoring::GitEnvironment.clean).merge(env)
|
|
113
|
+
@shell.capture(*command, env: clean, chdir: directory)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Required by name, not relative to this file: a fuzz or model check boots a copy of this directory,
|
|
2
|
+
# and the implementation must load once, from `lib/`, not from the copy.
|
|
3
|
+
require "hecks/hecks/adapters/git_rehearsal"
|
|
4
|
+
|
|
5
|
+
Hecks.adapter "GitRehearsal" do
|
|
6
|
+
port "Rehearsing"
|
|
7
|
+
end
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "git"
|
|
4
|
+
require_relative "console_capture"
|
|
5
|
+
require_relative "git_rehearsal/reading"
|
|
6
|
+
require_relative "git_rehearsal/bench"
|
|
7
|
+
require_relative "git_rehearsal/stages"
|
|
8
|
+
require_relative "git_rehearsal/record"
|
|
9
|
+
require_relative "git_rehearsal/due"
|
|
10
|
+
require_relative "git_rehearsal/line"
|
|
11
|
+
|
|
12
|
+
module Hecks
|
|
13
|
+
module Adapters
|
|
14
|
+
# The `Rehearsing` port's adapter for `PushRehearsal`: runs, against local `main` and without
|
|
15
|
+
# pushing, the stages of a scope, and reports whether a push is due.
|
|
16
|
+
#
|
|
17
|
+
# A scope is a `RehearsalScope` row of the Vocabulary bluebook: `quick` (the gate's quick
|
|
18
|
+
# stage, the push gate; a landing asks) or `deep` (quick plus the impacted specs; opt-in). Quick
|
|
19
|
+
# has its own line, record and bench, so it runs alongside a deep one. A rehearsal checks out a
|
|
20
|
+
# detached copy of `main`, runs the scope's stages in it and removes it. It pushes nothing and
|
|
21
|
+
# writes only a one-line record in the common git directory, which the `Due` query reads back.
|
|
22
|
+
class GitRehearsal
|
|
23
|
+
include Reading
|
|
24
|
+
|
|
25
|
+
# @param aggregate [Object, nil] unused
|
|
26
|
+
# @param settings [Hash] `impacted_spec_limit:` the most impacted spec files run (60);
|
|
27
|
+
# `impacted_spec_width:` how many run at once (2)
|
|
28
|
+
# @param root [String, nil] unused
|
|
29
|
+
def initialize(aggregate: nil, settings: {}, root: nil)
|
|
30
|
+
@git = Git.new
|
|
31
|
+
@impacted_limit = settings[:impacted_spec_limit]
|
|
32
|
+
@impacted_width = settings[:impacted_spec_width]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Rehearses the push of a branch, one at a time per repository and scope.
|
|
36
|
+
#
|
|
37
|
+
# A land that arrives while one runs marks `pending: rehearse <sha>` and is refused with that
|
|
38
|
+
# sentence; the running rehearsal then runs once more for the latest commit, however many
|
|
39
|
+
# landed. Benches a killed rehearsal left registered are removed first.
|
|
40
|
+
#
|
|
41
|
+
# @param held [Hash] the `PushRehearsal` record: `checkout`, `branch` (`main` by default) and
|
|
42
|
+
# `scope` (a `RehearsalScope` row: `quick` by default, or `deep`)
|
|
43
|
+
# @return [Hash{Symbol => Hash}] `outcome:` (`green` or `red`), `rehearsed:` the commit,
|
|
44
|
+
# `report:` one line per stage saying pass or fail
|
|
45
|
+
# @raise [ConsoleCapture::Failure] when the checkout is not a repository, has no such branch,
|
|
46
|
+
# or another rehearsal is running
|
|
47
|
+
def trial(**held)
|
|
48
|
+
@checkout = primary(plain(held[:checkout]) || Dir.pwd)
|
|
49
|
+
branch = plain(held[:branch]) || "main"
|
|
50
|
+
@scope = scope_of(plain(held[:scope]))
|
|
51
|
+
in_line(branch, head(branch))
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Says whether a push is due, from what git already holds: nothing is fetched or pushed.
|
|
55
|
+
#
|
|
56
|
+
# @param held [Hash] `checkout` (a directory inside the repository)
|
|
57
|
+
# @return [Hash{Symbol => String}] `text:` the commits ahead, the oldest one's age and the
|
|
58
|
+
# last rehearsal's result
|
|
59
|
+
# @raise [ConsoleCapture::Failure] when the checkout is not a repository
|
|
60
|
+
def due(**held)
|
|
61
|
+
@checkout = primary(plain(held[:checkout]) || Dir.pwd)
|
|
62
|
+
{ text: Due.new(@git, @checkout).report }
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
# Rehearses in the repository's line: at once when none runs, else marks the commit pending
|
|
68
|
+
# and
|
|
69
|
+
# tries the line once more in case the running rehearsal ended meanwhile.
|
|
70
|
+
def in_line(branch, commit)
|
|
71
|
+
answer = queue.running { drain(branch, commit) }
|
|
72
|
+
return answer unless answer == :busy
|
|
73
|
+
|
|
74
|
+
pending = queue.mark(branch, commit)
|
|
75
|
+
answer = queue.running { drain(branch, queue.take && head(branch)) }
|
|
76
|
+
answer.is_a?(Hash) ? answer : pending!(pending, branch)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def pending!(pending, branch)
|
|
80
|
+
raise ConsoleCapture::Failure,
|
|
81
|
+
"#{pending}: a rehearsal is already running in this repository and will run once more for the latest #{branch}"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def queue = Line.new(@git, @checkout, scope: @scope)
|
|
85
|
+
|
|
86
|
+
def scope_of(scope)
|
|
87
|
+
return scope || "quick" if scope.nil? || Stages.scopes.include?(scope)
|
|
88
|
+
|
|
89
|
+
raise ConsoleCapture::Failure, "scope #{scope} is not a rehearsal scope: #{Stages.scopes.join(", ")}"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def head(branch) = read("rev-parse", "--verify", "refs/heads/#{branch}^{commit}")
|
|
93
|
+
|
|
94
|
+
# Rehearses the commit, then once more for the latest of the branch for as long as a land has
|
|
95
|
+
# marked one pending; answers the last rehearsal.
|
|
96
|
+
def drain(branch, commit)
|
|
97
|
+
Bench.new(@git, @checkout, scope: @scope).sweep
|
|
98
|
+
answer = nil
|
|
99
|
+
while commit
|
|
100
|
+
answer = once(branch, commit)
|
|
101
|
+
again = queue.take
|
|
102
|
+
commit = again && head(again)
|
|
103
|
+
branch = again if again
|
|
104
|
+
end
|
|
105
|
+
answer
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def once(branch, commit)
|
|
109
|
+
results = Bench.new(@git, @checkout, scope: @scope).rehearse(commit) { |directory| stages(directory, branch).run }
|
|
110
|
+
verdict = results.all?(&:passed) ? "green" : "red"
|
|
111
|
+
note = Record.new(@git, @checkout).write(commit, verdict, results, scope: @scope)
|
|
112
|
+
{ outcome: { value: verdict }, rehearsed: { value: commit }, report: { value: report(branch, commit, results, note) } }
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def report(branch, commit, results, note)
|
|
116
|
+
lines = [heading(branch, commit)] + results.map(&:line)
|
|
117
|
+
lines << note unless note == "recorded"
|
|
118
|
+
lines.join("\n")
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def stages(directory, branch)
|
|
122
|
+
Stages.new(directory, branch: branch, impacted_limit: @impacted_limit,
|
|
123
|
+
impacted_width: @impacted_width, scope: @scope)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def heading(branch, commit)
|
|
127
|
+
"#{@scope} rehearsal of #{branch} at #{short(commit)}; nothing was pushed"
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# The repository's own checkout, found from any worktree of it.
|
|
131
|
+
def primary(directory)
|
|
132
|
+
raise ConsoleCapture::Failure, "#{directory} is not a directory" unless File.directory?(directory)
|
|
133
|
+
|
|
134
|
+
common = read("rev-parse", "--path-format=absolute", "--git-common-dir", dir: directory)
|
|
135
|
+
File.basename(common) == ".git" ? File.dirname(common) : common
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def plain(argument) = argument.is_a?(Hash) ? argument[:value] : argument
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -7,9 +7,9 @@ require_relative "reading"
|
|
|
7
7
|
module Hecks
|
|
8
8
|
module Adapters
|
|
9
9
|
class GitTrain
|
|
10
|
-
# A detached worktree a push is made from, removed once it ends. The
|
|
11
|
-
# out there and
|
|
12
|
-
#
|
|
10
|
+
# A detached worktree a push is made from, removed once it ends. The boarded commit is checked
|
|
11
|
+
# out there and pushed by its own id, so the repository's pre-push hook checks the very commit
|
|
12
|
+
# that goes out, not whatever a checkout or a moving branch holds.
|
|
13
13
|
class Bench
|
|
14
14
|
include Reading
|
|
15
15
|
|
|
@@ -33,12 +33,13 @@ module Hecks
|
|
|
33
33
|
@config = config
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
# Pushes
|
|
36
|
+
# Pushes one commit to the remote's branch, as it is.
|
|
37
37
|
#
|
|
38
|
-
# @param local [String] the commit
|
|
38
|
+
# @param local [String] the commit to push
|
|
39
39
|
# @param tracking [String] the remote-tracking branch, just fetched
|
|
40
40
|
# @return [String, Symbol] the commit pushed, or `:moved` when the remote's branch moved
|
|
41
|
-
# @raise [ConsoleCapture::Failure] when the
|
|
41
|
+
# @raise [ConsoleCapture::Failure] when the commit is not built on the remote's branch, or
|
|
42
|
+
# the push is refused
|
|
42
43
|
def push(local, tracking)
|
|
43
44
|
Dir.mktmpdir("hecks-push-train") do |scratch|
|
|
44
45
|
bench = File.join(scratch, "bench")
|
|
@@ -52,21 +53,20 @@ module Hecks
|
|
|
52
53
|
private
|
|
53
54
|
|
|
54
55
|
def push_from(bench, local, tracking)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
diverged!(local, tracking) unless ancestor?(tracking, local)
|
|
57
|
+
carry = ["-c", "hecks.trainCarry=#{local}"]
|
|
58
|
+
pushed = @git.capture(*@config, *carry, "push", @remote, "#{local}:refs/heads/#{@branch}", chdir: bench)
|
|
59
|
+
return local if pushed.ok?
|
|
58
60
|
return :moved if pushed.err.match?(MOVED)
|
|
59
61
|
|
|
60
62
|
raise ConsoleCapture::Failure, "the push of #{@branch} was refused:\n#{tail(pushed)}"
|
|
61
63
|
end
|
|
62
64
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
conflicted = read("diff", "--name-only", "--diff-filter=U", dir: bench).split.join(", ")
|
|
67
|
-
@git.capture("merge", "--abort", chdir: bench)
|
|
65
|
+
# A commit not built on the remote's branch would need a merge, which would
|
|
66
|
+
# push a commit nobody minted for or settled: it is refused.
|
|
67
|
+
def diverged!(local, tracking)
|
|
68
68
|
raise ConsoleCapture::Failure,
|
|
69
|
-
"#{
|
|
69
|
+
"#{tracking} moved since #{short(local)} was settled: it is not built on it; board again"
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
def tail(result) = "#{result.out}#{result.err}".lines.last(KEPT_LINES).join
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "reading"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Adapters
|
|
7
|
+
class GitTrain
|
|
8
|
+
# What a boarding checks before it changes a checkout: that the branch still names the commit
|
|
9
|
+
# it expects, that the checkout has that branch checked out, and that nothing else is staged
|
|
10
|
+
# or modified to be swept into a commit.
|
|
11
|
+
class BranchGuard
|
|
12
|
+
include Reading
|
|
13
|
+
|
|
14
|
+
# @param git [Git] the adapter every git call goes through
|
|
15
|
+
# @param checkout [String] the repository's top level
|
|
16
|
+
# @param branch [String] the boarded branch
|
|
17
|
+
def initialize(git, checkout, branch)
|
|
18
|
+
@git = git
|
|
19
|
+
@checkout = checkout
|
|
20
|
+
@branch = branch
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @return [String] the commit the branch names
|
|
24
|
+
def head = read("rev-parse", "--verify", "refs/heads/#{@branch}^{commit}")
|
|
25
|
+
|
|
26
|
+
# @param expected [String] the commit the branch must still name
|
|
27
|
+
# @return [void]
|
|
28
|
+
# @raise [ConsoleCapture::Failure] when the branch names another commit
|
|
29
|
+
def unmoved!(expected)
|
|
30
|
+
now = head
|
|
31
|
+
return if now == expected
|
|
32
|
+
|
|
33
|
+
raise ConsoleCapture::Failure,
|
|
34
|
+
"#{@branch} moved since boarding (boarded #{short(expected)}, now #{short(now)}): board again"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @return [void]
|
|
38
|
+
# @raise [ConsoleCapture::Failure] when the checkout's `HEAD` is not the boarded branch
|
|
39
|
+
def checked_out!
|
|
40
|
+
current = @git.capture("symbolic-ref", "--quiet", "HEAD", chdir: @checkout).out.strip
|
|
41
|
+
return if current == "refs/heads/#{@branch}"
|
|
42
|
+
|
|
43
|
+
raise ConsoleCapture::Failure,
|
|
44
|
+
"#{@checkout} has #{current.empty? ? "a detached HEAD" : current} checked out, not #{@branch}: " \
|
|
45
|
+
"changing it would change the wrong branch; board from a checkout of #{@branch}"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @param except [Array<String>] paths the caller wrote itself, which may be modified
|
|
49
|
+
# @return [void]
|
|
50
|
+
# @raise [ConsoleCapture::Failure] when the branch is not checked out, or any tracked file
|
|
51
|
+
# other than those paths is staged or modified
|
|
52
|
+
def clean!(except: [])
|
|
53
|
+
checked_out!
|
|
54
|
+
spec = except.map { |path| ":(exclude)#{path}" }
|
|
55
|
+
return if read("status", "--porcelain", "--untracked-files=no", "--", ".", *spec).empty?
|
|
56
|
+
|
|
57
|
+
raise ConsoleCapture::Failure, "#{@checkout} has staged or modified files; commit or discard them before boarding"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -6,8 +6,12 @@ module Hecks
|
|
|
6
6
|
module Adapters
|
|
7
7
|
class GitTrain
|
|
8
8
|
# One boarding's work once it holds the line: fetch the remote's branch, then either find
|
|
9
|
-
# the
|
|
10
|
-
#
|
|
9
|
+
# the boarded commit already on it or push exactly that commit.
|
|
10
|
+
#
|
|
11
|
+
# What is pushed is the commit the boarding named, never the local branch as it stands at push
|
|
12
|
+
# time: a branch that moved on since is refused by name (its new commits were not minted for
|
|
13
|
+
# or settled), and a remote that moved so the commit is not built on it is refused too.
|
|
14
|
+
# Commits that land during the push stay local and are named in the report.
|
|
11
15
|
#
|
|
12
16
|
# A push the remote turns away because its branch moved meanwhile (a push from another
|
|
13
17
|
# machine, which the line does not hold back) is fetched again and retried.
|
|
@@ -17,9 +21,6 @@ module Hecks
|
|
|
17
21
|
# How many times a push the remote turned away for having moved is tried.
|
|
18
22
|
ATTEMPTS = 3
|
|
19
23
|
|
|
20
|
-
# How many pushes one boarding makes while the local branch keeps getting ahead.
|
|
21
|
-
RIDES = 3
|
|
22
|
-
|
|
23
24
|
# @param git [Git] the adapter every git call goes through
|
|
24
25
|
# @param checkout [String] the repository's top level
|
|
25
26
|
# @param branch [String] the branch to push
|
|
@@ -37,49 +38,47 @@ module Hecks
|
|
|
37
38
|
# @raise [ConsoleCapture::Failure] when there is no such branch
|
|
38
39
|
def local_head = read("rev-parse", "--verify", "refs/heads/#{@branch}^{commit}")
|
|
39
40
|
|
|
40
|
-
# Carries
|
|
41
|
-
# while commits that landed meanwhile are still ahead (at most `RIDES` pushes).
|
|
41
|
+
# Carries one commit: finds it already on the remote, or pushes exactly it.
|
|
42
42
|
#
|
|
43
|
-
# @param boarded [String] the commit the local branch
|
|
43
|
+
# @param boarded [String] the commit to carry, which the local branch must still name
|
|
44
44
|
# @return [Hash{Symbol => Hash}] the answer `GitTrain#carry` describes
|
|
45
|
-
# @raise [ConsoleCapture::Failure] when the
|
|
45
|
+
# @raise [ConsoleCapture::Failure] when the branch moved since boarding, the remote's branch
|
|
46
|
+
# moved so the commit is not built on it, or the push is refused
|
|
46
47
|
def carry(boarded)
|
|
47
48
|
fetch
|
|
48
|
-
|
|
49
|
+
moved_since!(boarded)
|
|
50
|
+
return carried(boarded) if ancestor?(boarded, tracking)
|
|
49
51
|
|
|
50
|
-
|
|
52
|
+
finish(push(boarded), boarded)
|
|
51
53
|
end
|
|
52
54
|
|
|
53
55
|
private
|
|
54
56
|
|
|
55
|
-
#
|
|
56
|
-
def
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
answer = push(boarded)
|
|
60
|
-
reports << answer.dig(:report, :value)
|
|
61
|
-
fetch
|
|
62
|
-
return finish(answer, reports) if level? || reports.size >= RIDES
|
|
57
|
+
# Refuses, pushing nothing, when the local branch names another commit than the boarded one.
|
|
58
|
+
def moved_since!(boarded)
|
|
59
|
+
now = local_head
|
|
60
|
+
return if now == boarded
|
|
63
61
|
|
|
64
|
-
|
|
62
|
+
raise ConsoleCapture::Failure,
|
|
63
|
+
"#{@branch} moved since boarding (boarded #{short(boarded)}, now #{short(now)}): board again"
|
|
65
64
|
end
|
|
66
65
|
|
|
67
|
-
def finish(answer,
|
|
68
|
-
answer.merge(report: { value: (
|
|
66
|
+
def finish(answer, boarded)
|
|
67
|
+
answer.merge(report: { value: [answer.dig(:report, :value), *leftover(boarded)].join("; ") })
|
|
69
68
|
end
|
|
70
69
|
|
|
71
|
-
# What the local branch
|
|
72
|
-
def leftover
|
|
73
|
-
|
|
70
|
+
# What the local branch holds beyond the commit carried, named so nobody has to look.
|
|
71
|
+
def leftover(boarded)
|
|
72
|
+
waiting = read("log", "--format=%h %s", "#{boarded}..#{@branch}").lines.map(&:strip)
|
|
73
|
+
return [] if waiting.empty?
|
|
74
74
|
|
|
75
|
-
waiting
|
|
76
|
-
["#{waiting.size} commit(s) still ahead of #{tracking}: #{waiting.first(5).join(" | ")}"]
|
|
75
|
+
["#{waiting.size} commit(s) landed meanwhile and were not pushed (board again): #{waiting.first(5).join(" | ")}"]
|
|
77
76
|
end
|
|
78
77
|
|
|
79
78
|
def push(boarded, attempt = 1)
|
|
80
79
|
before = read("rev-parse", tracking)
|
|
81
80
|
pushed = Bench.new(@git, @checkout, branch: @branch, remote: @remote, config: @config)
|
|
82
|
-
.push(
|
|
81
|
+
.push(boarded, tracking)
|
|
83
82
|
return retry_push(boarded, attempt) if pushed == :moved
|
|
84
83
|
|
|
85
84
|
answer("pushed", boarded, pushed, pushed_report(before, pushed))
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../journal_store/held_mint"
|
|
4
|
+
require_relative "reading"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module Adapters
|
|
8
|
+
class GitTrain
|
|
9
|
+
# The check that the mint is made for the shape being pushed.
|
|
10
|
+
#
|
|
11
|
+
# The mint reads the bluebooks of the code running the train (its launcher), not those of the
|
|
12
|
+
# repository being pushed. When both are checkouts of one repository, the launcher's `HEAD`
|
|
13
|
+
# must carry the same bluebooks, hecksagons, worlds and shape ledger as the boarded commit;
|
|
14
|
+
# if it does not, the boarding is refused with "the train is not at the boarded commit:
|
|
15
|
+
# refresh it first". A repository the launcher is not a checkout of, or one that holds no
|
|
16
|
+
# Hecks domain directory, has no launcher shape to compare and passes.
|
|
17
|
+
#
|
|
18
|
+
# The comparison is one `git diff --quiet` between the launcher's `HEAD` and the boarded
|
|
19
|
+
# commit, limited to the shape files of the Hecks domain directory: one git call.
|
|
20
|
+
class LauncherShape
|
|
21
|
+
include Reading
|
|
22
|
+
|
|
23
|
+
# The files of a domain directory that make up its shape.
|
|
24
|
+
SHAPE = %w[*.bluebook *.hecksagon *.world shapes.json].freeze
|
|
25
|
+
|
|
26
|
+
# @param git [Git] the adapter every git call goes through
|
|
27
|
+
# @param checkout [String] the repository's top level the boarding is for
|
|
28
|
+
# @param domain [String] the launcher's Hecks domain directory
|
|
29
|
+
def initialize(git, checkout, domain: JournalStore::HeldMint::DOMAIN)
|
|
30
|
+
@git = git
|
|
31
|
+
@checkout = checkout
|
|
32
|
+
@domain = domain
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @param boarded [String] the commit being boarded
|
|
36
|
+
# @return [void]
|
|
37
|
+
# @raise [ConsoleCapture::Failure] when the launcher's checkout is of the same repository
|
|
38
|
+
# and its `HEAD` differs from the boarded commit in the shape files
|
|
39
|
+
def check!(boarded)
|
|
40
|
+
return unless File.directory?(@domain)
|
|
41
|
+
|
|
42
|
+
top = launcher_top
|
|
43
|
+
return unless top && same_repository?(top)
|
|
44
|
+
|
|
45
|
+
relative = File.realpath(@domain).delete_prefix("#{top}/")
|
|
46
|
+
launcher = read("rev-parse", "--verify", "HEAD^{commit}", dir: top)
|
|
47
|
+
return if same_shape?(launcher, boarded, relative)
|
|
48
|
+
|
|
49
|
+
raise ConsoleCapture::Failure,
|
|
50
|
+
"the train is not at the boarded commit: refresh it first (it runs #{short(launcher)}, " \
|
|
51
|
+
"the boarding is #{short(boarded)}, and their shape files in #{relative} differ)"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def same_shape?(launcher, boarded, relative)
|
|
57
|
+
paths = SHAPE.map { |name| ":(glob)#{relative}/**/#{name}" }
|
|
58
|
+
@git.capture("diff", "--quiet", launcher, boarded, "--", *paths, chdir: @checkout).ok?
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def launcher_top
|
|
62
|
+
result = @git.capture("rev-parse", "--show-toplevel", chdir: @domain)
|
|
63
|
+
result.ok? ? File.realpath(result.out.strip) : nil
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def same_repository?(top)
|
|
67
|
+
common = ->(dir) { @git.capture("rev-parse", "--path-format=absolute", "--git-common-dir", chdir: dir).out.strip }
|
|
68
|
+
File.realpath(common.call(top)) == File.realpath(common.call(@checkout))
|
|
69
|
+
rescue SystemCallError
|
|
70
|
+
false
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../journal_store/held_mint"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Adapters
|
|
7
|
+
class GitTrain
|
|
8
|
+
# The step a boarding runs before it carries anything: the Hecks domain's held mint.
|
|
9
|
+
#
|
|
10
|
+
# It asks `JournalStore::HeldMint`, the mint entry point `Era.MintHeld` reaches, with all
|
|
11
|
+
# of its guards. A shape that did not move passes straight through, and so does a Hecks
|
|
12
|
+
# domain in Memory (the default, which holds no eras) or a world that declares
|
|
13
|
+
# `disposable_ledger true`, with no mint; a minted era is named in the
|
|
14
|
+
# report, and a refusal stops the boarding with the mint's own reason before anything is
|
|
15
|
+
# pushed.
|
|
16
|
+
class MintStep
|
|
17
|
+
# @param mint [#answer] answers `answer(run:, confirm:)` as `HeldMint#answer` does;
|
|
18
|
+
# `HeldMint.new` when not given
|
|
19
|
+
def initialize(mint: nil)
|
|
20
|
+
@mint = mint || JournalStore::HeldMint.new
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Runs the mint for one boarding.
|
|
24
|
+
#
|
|
25
|
+
# @param run [String] the boarding's run key, which the mint is recorded under
|
|
26
|
+
# @param confirm [Boolean, nil] whether the boarding was confirmed
|
|
27
|
+
# @return [String] what the mint did, for the boarding's report
|
|
28
|
+
# @raise [Runtime::WiringError] naming the mint's refusal
|
|
29
|
+
def run(run:, confirm:)
|
|
30
|
+
answer = @mint.answer(run: run, confirm: confirm)
|
|
31
|
+
report(answer.dig(:outcome, :value), answer.dig(:label, :value))
|
|
32
|
+
rescue Runtime::WiringError => e
|
|
33
|
+
raise Runtime::WiringError, "the Hecks mint refused this boarding, so nothing was pushed: #{e.message}"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def report(outcome, label)
|
|
39
|
+
return "#{label} holds no eras, no mint needed" if outcome == "eraless"
|
|
40
|
+
return "the Hecks ledger is disposable, so no mint is needed" if outcome == "disposable"
|
|
41
|
+
|
|
42
|
+
outcome == "minted" ? "the Hecks mint minted #{label}" : "the Hecks shape #{label} did not move"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|