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
|
@@ -49,7 +49,7 @@ module Hecks
|
|
|
49
49
|
puts "promoted: qa/stress_domains/#{name}"
|
|
50
50
|
puts "next:"
|
|
51
51
|
puts " hecks quality_control judge_novelty qa/stress_domains/#{name}"
|
|
52
|
-
puts " hecks project_rust qa/stress_domains/#{name} # when the finding needs the Rust comparison"
|
|
52
|
+
puts " hecks build.project_rust! qa/stress_domains/#{name} # when the finding needs the Rust comparison"
|
|
53
53
|
# `hecks quality_control target.seed` derives targets from
|
|
54
54
|
# `Hecks::Corpus.rotation_targets`, so a hand-typed `target.identify` line is not printed:
|
|
55
55
|
# nobody ran it and the domain never
|
|
@@ -67,7 +67,7 @@ module Hecks
|
|
|
67
67
|
<<~NOTES
|
|
68
68
|
# #{name}
|
|
69
69
|
|
|
70
|
-
Promoted from a `hecks quality_control check_generated_domains` finding — #{origin_phrase(recorded)}, not
|
|
70
|
+
Promoted from a `hecks quality_control query target.check_generated_domains` finding — #{origin_phrase(recorded)}, not
|
|
71
71
|
hand-written. The bluebook is the minimal form of the domain that
|
|
72
72
|
surprised; `QaGenerated` was renamed to `#{camelize(name)}` and nothing
|
|
73
73
|
else changed.
|
|
@@ -102,7 +102,7 @@ module Hecks
|
|
|
102
102
|
end
|
|
103
103
|
|
|
104
104
|
def origin_phrase(recorded)
|
|
105
|
-
recorded&.key?("source") ? "written by `hecks quality_control mine_combinations`' agent" : "generated"
|
|
105
|
+
recorded&.key?("source") ? "written by `hecks quality_control query target.mine_combinations`' agent" : "generated"
|
|
106
106
|
end
|
|
107
107
|
end
|
|
108
108
|
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "hecks/tools/gate"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module QualityControlCli
|
|
7
|
+
class QaMainGate
|
|
8
|
+
# Runs the quick gate's checks in a directory, all at once, and says which passed. The checks are
|
|
9
|
+
# the `GateStage` rows of the Vocabulary bluebook, so a red check is reported with the output it
|
|
10
|
+
# printed, the same way `hecks gate_run.gate! stage=quick` reports one.
|
|
11
|
+
module GateRun
|
|
12
|
+
# One check of the quick gate after it ran.
|
|
13
|
+
#
|
|
14
|
+
# @!attribute [r] id
|
|
15
|
+
# @return [String] the check's name in the Vocabulary bluebook, such as `rubocop`
|
|
16
|
+
# @!attribute [r] title
|
|
17
|
+
# @return [String] what the check is
|
|
18
|
+
# @!attribute [r] output
|
|
19
|
+
# @return [String] everything the check printed
|
|
20
|
+
# @!attribute [r] passed
|
|
21
|
+
# @return [Boolean] whether it exited 0
|
|
22
|
+
Result = Struct.new(:id, :title, :output, :passed)
|
|
23
|
+
|
|
24
|
+
# Stands in for the gate's progress lines, which go to standard error of a person's terminal.
|
|
25
|
+
class Quiet
|
|
26
|
+
# @return [nil]
|
|
27
|
+
def start(_id) = nil
|
|
28
|
+
|
|
29
|
+
# @return [nil]
|
|
30
|
+
def finish(*) = nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
module_function
|
|
34
|
+
|
|
35
|
+
# @param dir [String] the checkout the checks run in
|
|
36
|
+
# @return [Array<Result>] every quick-gate check, in the stage's order
|
|
37
|
+
def run(dir)
|
|
38
|
+
stage = Hecks::Tools::Gate.stages.fetch("quick")
|
|
39
|
+
checks = stage.fetch("checks")
|
|
40
|
+
answers = Hecks::Tools::Gate.run_all(stage, checks, dir, Quiet.new)
|
|
41
|
+
checks.map { |check| result(check, answers.fetch(check.fetch("id"))) }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# @return [Result]
|
|
45
|
+
def result(check, answer)
|
|
46
|
+
output, passed = answer
|
|
47
|
+
Result.new(check.fetch("id"), check.fetch("title"), output, passed)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module QualityControlCli
|
|
5
|
+
class QaMainGate
|
|
6
|
+
# Turns one red check into one QA bug, proven by the check's own output, and triages it. A check the
|
|
7
|
+
# command can fix mechanically is `self_contained`; every other is `bigger`, for the owner.
|
|
8
|
+
module Logging
|
|
9
|
+
# Checks with a mechanical fixer. `rubocop -a` fixes style offenses it can fix; metrics and the
|
|
10
|
+
# rest need a person.
|
|
11
|
+
SELF_CONTAINED = %w[rubocop].freeze
|
|
12
|
+
SUBMITTER = "qa_main_gate"
|
|
13
|
+
NAME_PREFIX = "main-red-"
|
|
14
|
+
|
|
15
|
+
# A bug already open for the same check is not logged again: the commit moved, the red did not.
|
|
16
|
+
# @return [Array(String, String, Boolean)] the reference, its disposition, and whether it was new
|
|
17
|
+
def log_red(sweep, result, sha)
|
|
18
|
+
open = open_bug_named(bug_name(result.id))
|
|
19
|
+
return [open, disposition(result.id), false] if open
|
|
20
|
+
|
|
21
|
+
bug = log(sweep, result, sha)
|
|
22
|
+
bug.triage!(disposition: { value: disposition(result.id) })
|
|
23
|
+
[bug.reference.value, disposition(result.id), true]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# @return [String] `main-red-<check>`, the name `QaFixMainBug` reads the check back from
|
|
27
|
+
def bug_name(check_id)
|
|
28
|
+
"#{NAME_PREFIX}#{check_id.tr("_", "-")}"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @return [String] the bug's disposition as its triage writes it
|
|
32
|
+
def disposition(check_id)
|
|
33
|
+
SELF_CONTAINED.include?(check_id) ? "self_contained" : "bigger"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def log(sweep, result, sha)
|
|
39
|
+
sequence, reference = next_bug_reference
|
|
40
|
+
::QualityControl::Bug.log!(
|
|
41
|
+
sweep: sweep.id, reference: { value: reference }, sequence: { value: sequence },
|
|
42
|
+
title: { value: "main is red: #{result.title}" }, name: { value: bug_name(result.id) },
|
|
43
|
+
demonstration: { value: demonstration_text(result) },
|
|
44
|
+
symptom: { value: "the quick gate's #{result.title} exits non-zero on main at #{sha[0, 7]}" },
|
|
45
|
+
expectation: { value: "the quick gate's #{result.title} exits 0 on main" },
|
|
46
|
+
submitter: { value: SUBMITTER }, tags: [{ value: "main-gate" }]
|
|
47
|
+
)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# @return [String] what the check printed, or a stand-in when it printed nothing
|
|
51
|
+
def demonstration_text(result)
|
|
52
|
+
text = result.output.to_s.strip
|
|
53
|
+
text.empty? ? "(no output)" : text
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def open_bug_named(name)
|
|
57
|
+
row = @runtime.query("QualityControl::Bug.Open").find { |bug| bug[:name]&.[](:value) == name }
|
|
58
|
+
row && row[:reference][:value]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# @return [Array(Integer, String)] the next sequence and reference, after every logged bug
|
|
62
|
+
def next_bug_reference
|
|
63
|
+
rows = @runtime.query("QualityControl::Bug.All")
|
|
64
|
+
sequence = rows.map { |row| row[:sequence][:value] }.max.to_i + 1
|
|
65
|
+
[sequence, "BUG##{sequence}"]
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "open3"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module QualityControlCli
|
|
7
|
+
class QaMainGate
|
|
8
|
+
# The commands outside the ledger that a red-main fix runs: the mechanical fixer, the landing, and the
|
|
9
|
+
# push through the push train. Each answers its output and whether it exited 0.
|
|
10
|
+
module Shell
|
|
11
|
+
# The push train's own launcher, in its detached checkout.
|
|
12
|
+
TRAIN_LAUNCHER = File.expand_path("~/.claude/hecks-train/exe/hecks")
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
# Applies `rubocop -a` to the files, which fixes what it can; whether the rest is fixed is the gate's
|
|
17
|
+
# to say.
|
|
18
|
+
#
|
|
19
|
+
# @return [Array(String, Boolean)]
|
|
20
|
+
def rubocop(dir, files)
|
|
21
|
+
run("bundle", "exec", "rubocop", "-a", *files, chdir: dir)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Lands a branch on local main, through the launcher of the checkout.
|
|
25
|
+
#
|
|
26
|
+
# @return [Array(String, Boolean)]
|
|
27
|
+
def land(root, branch)
|
|
28
|
+
run(File.join(root, "exe/hecks"), "landing.land!", "checkout.value=#{root}", "branch.value=#{branch}",
|
|
29
|
+
"--confirm", "--wait", chdir: root)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Pushes main through the push train.
|
|
33
|
+
#
|
|
34
|
+
# @return [Array(String, Boolean)]
|
|
35
|
+
def push(root)
|
|
36
|
+
run(TRAIN_LAUNCHER, "SendTrain.board!", "checkout=#{root}", "remote=origin", "branch=main",
|
|
37
|
+
"--confirm", "--wait", chdir: root)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def run(*argv, chdir:)
|
|
41
|
+
output, status = Open3.capture2e(*argv, chdir: chdir)
|
|
42
|
+
[output, status.success?]
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module QualityControlCli
|
|
5
|
+
class QaMainGate
|
|
6
|
+
# The sweep a red run of the gate on main is written as. Main is not a bluebook, so the sweep runs
|
|
7
|
+
# against one standing target, `main-gate`, that is shelved: the rotation never claims it. Each gate
|
|
8
|
+
# check is one `Check`, its expectation written before the answer is read.
|
|
9
|
+
module Sweeping
|
|
10
|
+
TARGET = "main-gate"
|
|
11
|
+
ENGINEER = "qa_main_gate"
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
# @return [void] opens the target if no run has yet
|
|
16
|
+
def standing_target
|
|
17
|
+
return if ::QualityControl::Target.find(TARGET)
|
|
18
|
+
|
|
19
|
+
target = ::QualityControl::Target.identify!(reference: { value: TARGET }, path: { value: @root })
|
|
20
|
+
target.shelve!(reason: { value: "the quick gate on main is not a bluebook; this target only holds its sweeps" })
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @return [Object] the sweep of this commit's red run, concluded once every check is written
|
|
24
|
+
def record_sweep(sha, results)
|
|
25
|
+
standing_target
|
|
26
|
+
sweep = ::QualityControl::Sweep.open!(target: TARGET, reference: { value: "MAIN-#{sha[0, 12]}" },
|
|
27
|
+
engineer: { value: ENGINEER })
|
|
28
|
+
results.each { |result| record_check(sweep, result, sha) }
|
|
29
|
+
sweep.conclude!(notes: { value: "the quick gate on main at #{sha[0, 7]}: #{results.count { |r| !r.passed }} red" })
|
|
30
|
+
sweep
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def record_check(sweep, result, sha)
|
|
34
|
+
sweep.check!(subject: { value: "gate:#{result.id}" },
|
|
35
|
+
expectation: { value: "#{result.title} exits 0 on main at #{sha[0, 7]}" })
|
|
36
|
+
sequence = ::QualityControl::Sweep.find(sweep.id).made.value
|
|
37
|
+
settle(sweep, sequence, result)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def settle(sweep, sequence, result)
|
|
41
|
+
if result.passed
|
|
42
|
+
dispatch("QualityControl::Sweep.Check.Held", id: sweep.id, sequence: { value: sequence },
|
|
43
|
+
observation: { value: "exit 0" })
|
|
44
|
+
else
|
|
45
|
+
# Not `Check.Surprised`: its `SuspendOnSurprise` policy can only suspend a held target, and this
|
|
46
|
+
# one is shelved, so the policy would be refused on every red run. The red is carried by the
|
|
47
|
+
# `MainCheck` record and the bugs logged from the output.
|
|
48
|
+
dispatch("QualityControl::Sweep.Check.Unsettled", id: sweep.id, sequence: { value: sequence },
|
|
49
|
+
observation: { value: result.output })
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def dispatch(name, **args)
|
|
54
|
+
@runtime.dispatch_flat(name, args)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "fileutils"
|
|
4
|
+
require "open3"
|
|
5
|
+
require "tmpdir"
|
|
6
|
+
|
|
7
|
+
module Hecks
|
|
8
|
+
module QualityControlCli
|
|
9
|
+
class QaMainGate
|
|
10
|
+
# A temporary git worktree, made for one block and removed when it returns, so a gate or a fix never
|
|
11
|
+
# runs in the owner's checkout.
|
|
12
|
+
module Worktree
|
|
13
|
+
# Raised when a git command the worktree needs fails.
|
|
14
|
+
class Failed < StandardError; end
|
|
15
|
+
|
|
16
|
+
module_function
|
|
17
|
+
|
|
18
|
+
# @param root [String] the repository the worktree belongs to
|
|
19
|
+
# @param ref [String] the commit the worktree starts at
|
|
20
|
+
# @param branch [String, nil] a new branch checked out in it; nil leaves HEAD detached
|
|
21
|
+
# @yieldparam dir [String] the worktree's directory
|
|
22
|
+
# @return [Object] whatever the block returns
|
|
23
|
+
def with(root:, ref:, branch: nil)
|
|
24
|
+
dir = Dir.mktmpdir("hecks-qa-worktree-")
|
|
25
|
+
git!(root, "worktree", "add", *(branch ? ["-b", branch] : ["--detach"]), dir, ref)
|
|
26
|
+
yield dir
|
|
27
|
+
ensure
|
|
28
|
+
remove(root, dir) if dir
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @return [String] the output of one git command, stripped
|
|
32
|
+
# @raise [Failed] when git exits non-zero
|
|
33
|
+
def git!(root, *argv)
|
|
34
|
+
output, status = Open3.capture2e("git", "-C", root, *argv)
|
|
35
|
+
raise Failed, "git #{argv.join(" ")} failed: #{output.strip}" unless status.success?
|
|
36
|
+
|
|
37
|
+
output.strip
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @return [Boolean] whether git exited 0
|
|
41
|
+
def git?(root, *argv)
|
|
42
|
+
_, status = Open3.capture2e("git", "-C", root, *argv)
|
|
43
|
+
status.success?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Removes a worktree and its directory. Nothing is answered: a removal that fails leaves the
|
|
47
|
+
# directory for `git worktree prune` to report.
|
|
48
|
+
def remove(root, dir)
|
|
49
|
+
try(root, "worktree", "remove", "--force", dir)
|
|
50
|
+
try(root, "worktree", "prune")
|
|
51
|
+
FileUtils.rm_rf(dir)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Runs one git command and answers nothing, for the commands whose failure is not a refusal.
|
|
55
|
+
def try(root, *argv)
|
|
56
|
+
Open3.capture2e("git", "-C", root, *argv)
|
|
57
|
+
nil
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "open3"
|
|
4
|
+
require_relative "../../../hecks"
|
|
5
|
+
# The era subsystem does not load with core (ADR 0033); the QualityControl ledger binds it.
|
|
6
|
+
require_relative "../../ports/persistence/plugins/era"
|
|
7
|
+
require_relative "qa_main_gate/gate_run"
|
|
8
|
+
require_relative "qa_main_gate/worktree"
|
|
9
|
+
require_relative "qa_main_gate/shell"
|
|
10
|
+
require_relative "qa_main_gate/sweeping"
|
|
11
|
+
require_relative "qa_main_gate/logging"
|
|
12
|
+
require_relative "qa_fix_main_bug"
|
|
13
|
+
|
|
14
|
+
module Hecks
|
|
15
|
+
module QualityControlCli
|
|
16
|
+
# The command behind `hecks quality_control main_check.check_main`, the tick's main step. It runs
|
|
17
|
+
# the quick gate on local main in a temporary worktree, records the verdict against the commit, and
|
|
18
|
+
# for each red check logs one bug proven by its output. A self-contained bug is handed to
|
|
19
|
+
# `QaFixMainBug`. A commit already on record is answered from the record, so a tick that finds it again
|
|
20
|
+
# logs nothing twice.
|
|
21
|
+
#
|
|
22
|
+
# Exit 0 when main is green, 2 when a check is red (the bugs are on the ledger), 1 on an operational
|
|
23
|
+
# error. `QA_SWEEP_DOMAIN_DIR` picks the ledger, as for the other QA commands.
|
|
24
|
+
class QaMainGate
|
|
25
|
+
include Sweeping
|
|
26
|
+
include Logging
|
|
27
|
+
|
|
28
|
+
EXIT_OK = 0
|
|
29
|
+
EXIT_ERROR = 1
|
|
30
|
+
EXIT_FOUND_SOMETHING = 2
|
|
31
|
+
|
|
32
|
+
USAGE = "usage: hecks quality_control main_check.check_main"
|
|
33
|
+
|
|
34
|
+
# Runs the step.
|
|
35
|
+
#
|
|
36
|
+
# @param argv [Array<String>] no arguments
|
|
37
|
+
# @param root [String] the repository root, whose local `main` is checked
|
|
38
|
+
# @param env [Hash{String => String}] `QA_SWEEP_DOMAIN_DIR` picks another ledger
|
|
39
|
+
# @param gate [#run] runs the quick gate in a directory and answers its results; a spec injects one
|
|
40
|
+
# @param shell [Module] the fixer, landing and push commands; a spec injects one
|
|
41
|
+
# @return [Integer] the exit status
|
|
42
|
+
def self.call(argv, root:, env: ENV, gate: GateRun, shell: Shell)
|
|
43
|
+
new(root: root, env: env, gate: gate, shell: shell).call(argv)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @param root [String] the repository root
|
|
47
|
+
# @param env [Hash{String => String}] `QA_SWEEP_DOMAIN_DIR` picks another ledger
|
|
48
|
+
# @param gate [#run] the quick gate's runner
|
|
49
|
+
# @param shell [Module] the fixer, landing and push commands
|
|
50
|
+
def initialize(root:, env: ENV, gate: GateRun, shell: Shell)
|
|
51
|
+
@root = root
|
|
52
|
+
@domain_dir = env.fetch("QA_SWEEP_DOMAIN_DIR", File.join(root, "qa/bluebook"))
|
|
53
|
+
@gate = gate
|
|
54
|
+
@shell = shell
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# @param argv [Array<String>] no arguments
|
|
58
|
+
# @return [Integer] the exit status
|
|
59
|
+
def call(argv)
|
|
60
|
+
return reject(argv) unless argv.empty?
|
|
61
|
+
|
|
62
|
+
@runtime = boot_ledger
|
|
63
|
+
sha = Worktree.git!(@root, "rev-parse", "--verify", "main")
|
|
64
|
+
recorded = recorded_verdict(sha)
|
|
65
|
+
return answer_recorded(sha, recorded) if recorded
|
|
66
|
+
|
|
67
|
+
results = Worktree.with(root: @root, ref: sha) { |dir| @gate.run(dir) }
|
|
68
|
+
judge(sha, results)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
private
|
|
72
|
+
|
|
73
|
+
def reject(argv)
|
|
74
|
+
return puts(USAGE) && EXIT_OK if %w[-h --help].include?(argv.first)
|
|
75
|
+
|
|
76
|
+
warn "#{USAGE}\nthis command takes no arguments"
|
|
77
|
+
EXIT_ERROR
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def boot_ledger
|
|
81
|
+
Hecks.boot(@domain_dir)
|
|
82
|
+
rescue StandardError => e
|
|
83
|
+
abort "the QualityControl ledger did not boot (#{e.class}: #{e.message})"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# @return [String, nil] `red` or `green` when the commit is on record
|
|
87
|
+
def recorded_verdict(sha)
|
|
88
|
+
row = @runtime.query("QualityControl::MainCheck.All").find { |check| check[:reference][:value] == sha }
|
|
89
|
+
row&.[](:verdict)&.[](:value)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def answer_recorded(sha, verdict)
|
|
93
|
+
puts "main at #{sha[0, 7]} was already checked: #{verdict}"
|
|
94
|
+
verdict == "red" ? EXIT_FOUND_SOMETHING : EXIT_OK
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def judge(sha, results)
|
|
98
|
+
reds = results.reject(&:passed)
|
|
99
|
+
record!(sha, reds.size)
|
|
100
|
+
return green(sha, results) if reds.empty?
|
|
101
|
+
|
|
102
|
+
sweep = record_sweep(sha, results)
|
|
103
|
+
logged = reds.map { |result| log_red(sweep, result, sha) }
|
|
104
|
+
fixes = fix_self_contained(logged)
|
|
105
|
+
red(sha, logged, fixes)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def record!(sha, count)
|
|
109
|
+
::QualityControl::MainCheck.record!(reference: { value: sha }, verdict: { value: count.zero? ? "green" : "red" },
|
|
110
|
+
red_checks: { value: count })
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def fix_self_contained(logged)
|
|
114
|
+
logged.filter_map do |reference, disposition, fresh|
|
|
115
|
+
next unless fresh && disposition == "self_contained"
|
|
116
|
+
|
|
117
|
+
QaFixMainBug.new(runtime: @runtime, root: @root, gate: @gate, shell: @shell).fix(reference).message
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def green(sha, results)
|
|
122
|
+
puts "main at #{sha[0, 7]} is green: #{results.map(&:id).join(", ")}"
|
|
123
|
+
EXIT_OK
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def red(sha, logged, fixes)
|
|
127
|
+
logged.each do |reference, _, fresh|
|
|
128
|
+
puts "#{fresh ? "logged" : "already open"} #{reference} for main at #{sha[0, 7]}"
|
|
129
|
+
end
|
|
130
|
+
fixes.each { |line| puts line }
|
|
131
|
+
EXIT_FOUND_SOMETHING
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "pg"
|
|
4
3
|
require_relative "qa_postgres_role/ownership"
|
|
5
4
|
|
|
6
5
|
module Hecks
|
|
@@ -77,6 +76,7 @@ module Hecks
|
|
|
77
76
|
def provision(database, role)
|
|
78
77
|
done = []
|
|
79
78
|
skipped = []
|
|
79
|
+
require "pg"
|
|
80
80
|
admin = PG.connect(dbname: "postgres")
|
|
81
81
|
create_role(admin, role, done, skipped)
|
|
82
82
|
take_database(admin, database, role, done, skipped)
|
|
@@ -99,12 +99,11 @@ module Hecks
|
|
|
99
99
|
"checks still running" if checks.any? { |c| c[:bucket] == "pending" }
|
|
100
100
|
end
|
|
101
101
|
|
|
102
|
-
#
|
|
102
|
+
# Checks a commit: the CI port gives a verdict. ClearOnPass/RefuseOnFail settle
|
|
103
103
|
# the record synchronously, so `find` sees it straight away; a red one is appended to
|
|
104
104
|
# `@newly_red`.
|
|
105
105
|
def ask_the_ledger(pull)
|
|
106
|
-
::QualityControl::Clearance.
|
|
107
|
-
@runtime.dispatch_flat("QualityControl::Clearance.CI.Run", { commit: pull.sha })
|
|
106
|
+
::QualityControl::Clearance.check!(commit: { value: pull.sha })
|
|
108
107
|
cleared = ::QualityControl::Clearance.find(pull.sha)
|
|
109
108
|
summary = cleared.summary.to_h[:value]
|
|
110
109
|
return puts("#{pull.tag}: CLEARED — #{summary}") if cleared.status == "green"
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../../hecks"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module QualityControlCli
|
|
7
|
+
# The tick's push check: dispatches `PushNudge.Check` once in the Hecks domain, where Tickets
|
|
8
|
+
# keeps the Work rows, and prints that it ran. It reads refs git already holds and fetches,
|
|
9
|
+
# pushes and merges nothing. It never fails a tick: a check that could not run prints why and
|
|
10
|
+
# exits 0, since a missing nudge must not stop the sweep.
|
|
11
|
+
class QaPushNudge
|
|
12
|
+
EXIT_OK = 0
|
|
13
|
+
|
|
14
|
+
# Everything up to the first line break.
|
|
15
|
+
FIRST_LINE = /[^\n]*/
|
|
16
|
+
|
|
17
|
+
# Runs the check.
|
|
18
|
+
#
|
|
19
|
+
# @param _argv [Array<String>] unused
|
|
20
|
+
# @param root [String] the repository root, whose `lib/hecks/hecks` domain is booted
|
|
21
|
+
# @return [Integer] 0, always
|
|
22
|
+
def self.call(_argv, root:)
|
|
23
|
+
new(root: root).call
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# @param root [String] the repository root
|
|
27
|
+
def initialize(root:)
|
|
28
|
+
@root = root
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @return [Integer] 0, always
|
|
32
|
+
def call
|
|
33
|
+
runtime = Hecks.boot(File.join(@root, "lib/hecks/hecks"))
|
|
34
|
+
key = "check-#{Time.now.utc.strftime("%Y%m%dT%H%M%S")}-#{Process.pid}"
|
|
35
|
+
runtime.dispatch_flat("QualityControl::PushNudge.Check", nudge: { value: key })
|
|
36
|
+
puts "push nudge: checked (#{key}); the push-due Work row is filed, revised or finished"
|
|
37
|
+
EXIT_OK
|
|
38
|
+
rescue StandardError => e
|
|
39
|
+
puts "push nudge: skipped (#{e.class}: #{first_line(e.message)})"
|
|
40
|
+
EXIT_OK
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def first_line(text) = text[FIRST_LINE].strip
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -48,7 +48,7 @@ module Hecks
|
|
|
48
48
|
"banking for CI-gated differential fuzzing. rust/Cargo.toml already declares " \
|
|
49
49
|
"compiled-binary features for compliance and roster (plus meta) that " \
|
|
50
50
|
"sit unused for this purpose; examples/chess and examples/directory have no Cargo " \
|
|
51
|
-
"feature at all — `hecks project_rust
|
|
51
|
+
"feature at all — `hecks build.project_rust!` has never regenerated a binary for either. " \
|
|
52
52
|
"Widening either list would let differential fuzzing catch a whole bug class " \
|
|
53
53
|
"Ruby-only fuzzing cannot, on domains the practice already owns.",
|
|
54
54
|
citation: "BUG#1/#3/#4 (engine-divergence bugs); spec/rust_conformance_fuzz_spec.rb DOMAINS " \
|
|
@@ -60,7 +60,7 @@ module Hecks
|
|
|
60
60
|
# `build_rust_for` answers nil only for an undeclared feature; a declared one that fails
|
|
61
61
|
# raises, so its cargo stderr is printed here.
|
|
62
62
|
reason = @rust_build_failure ? @rust_build_failure.message : "rust/Cargo.toml declares no #{@feature} feature"
|
|
63
|
-
puts "note: no #{@feature} Rust binary — degrading this sweep to ruby_only. Run `hecks project_rust
|
|
63
|
+
puts "note: no #{@feature} Rust binary — degrading this sweep to ruby_only. Run `hecks build.project_rust!` for it " \
|
|
64
64
|
"and re-sweep.\n#{reason}"
|
|
65
65
|
@active_modes = (@active_modes - %i[differential properties_in_differential structural_skip_report]) |
|
|
66
66
|
[:ruby_only]
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../qa_event_pump"
|
|
4
|
+
require_relative "push_nudge_step"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module QualityControlCli
|
|
8
|
+
class QaTick
|
|
9
|
+
# The tick's last finding step: the event pump, which runs each attached domain's policies
|
|
10
|
+
# on the events its cursors have not yet read.
|
|
11
|
+
module EventPumpStep
|
|
12
|
+
include PushNudgeStep
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
# @return [Array<Step>] the steps after the finding steps: the push check and the pump
|
|
17
|
+
def watch_steps = push_nudge_steps + pump_steps
|
|
18
|
+
|
|
19
|
+
# @return [Array<Step>] the pump's step when the `event_pump` dial is on, else none
|
|
20
|
+
def pump_steps
|
|
21
|
+
dial(:EVENT_PUMP, false) ? [guarded("event_pump") { run_event_pump }] : []
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return [Array(String, Integer)] the pump's output and its exit status
|
|
25
|
+
def run_event_pump
|
|
26
|
+
banner "hecks quality_control event_pump.pump!"
|
|
27
|
+
output, exit_code = run_step(->(argv) { QaEventPump.call(argv, root: @root) })
|
|
28
|
+
puts output
|
|
29
|
+
[output, exit_code]
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -79,7 +79,10 @@ module Hecks
|
|
|
79
79
|
|
|
80
80
|
def report(steps, reclaimed, log_path)
|
|
81
81
|
banner "tick report"
|
|
82
|
-
steps.each
|
|
82
|
+
steps.each do |step|
|
|
83
|
+
puts step_verdict(step)
|
|
84
|
+
puts errored_line(step) if step.exit_code != EXIT_OK && step.exit_code != EXIT_FOUND_SOMETHING
|
|
85
|
+
end
|
|
83
86
|
puts stale_holds_line(reclaimed)
|
|
84
87
|
tick_exit = tick_exit_for(steps.map(&:exit_code))
|
|
85
88
|
puts "tick: #{verdict(tick_exit)} (exit #{tick_exit})"
|
|
@@ -93,6 +96,18 @@ module Hecks
|
|
|
93
96
|
"hecks quality_control #{verb}: #{verdict(step.exit_code)} (exit #{step.exit_code.inspect})"
|
|
94
97
|
end
|
|
95
98
|
|
|
99
|
+
# What an errored step last said, under its verdict: an abort's refusal (a ledger with no
|
|
100
|
+
# era held names `hold_first`) ends the output, so the closing report carries it too.
|
|
101
|
+
def errored_line(step)
|
|
102
|
+
last = last_said(step.output)
|
|
103
|
+
last ? " #{last}" : " (no output)"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def last_said(output)
|
|
107
|
+
stripped = output.to_s.lines.map(&:strip)
|
|
108
|
+
stripped.reject(&:empty?).last
|
|
109
|
+
end
|
|
110
|
+
|
|
96
111
|
def stale_holds_line(reclaimed)
|
|
97
112
|
named = reclaimed.empty? ? "" : " (#{reclaimed.join(", ")})"
|
|
98
113
|
"stale holds reclaimed: #{reclaimed.size}#{named}"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../qa_push_nudge"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module QualityControlCli
|
|
7
|
+
class QaTick
|
|
8
|
+
# The tick's push check, once per tick: `PushNudge.Check` files, revises or finishes the one
|
|
9
|
+
# `push-due` Work row from refs git already holds. It fetches, pushes and merges nothing.
|
|
10
|
+
module PushNudgeStep
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
# @return [Array<Step>] the check's step when the `push_nudge` dial is on, else none
|
|
14
|
+
def push_nudge_steps
|
|
15
|
+
dial(:PUSH_NUDGE, false) ? [guarded("push_nudge") { run_push_nudge }] : []
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# @return [Array(String, Integer)] the check's output and its exit status
|
|
19
|
+
def run_push_nudge
|
|
20
|
+
banner "hecks quality_control push_nudge.check!"
|
|
21
|
+
output, exit_code = run_step(->(argv) { QaPushNudge.call(argv, root: @root) })
|
|
22
|
+
puts output
|
|
23
|
+
[output, exit_code]
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|