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,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "hecks/corpus"
|
|
4
|
+
require_relative "tree"
|
|
5
|
+
require_relative "../console_capture"
|
|
6
|
+
|
|
7
|
+
module Hecks
|
|
8
|
+
module Adapters
|
|
9
|
+
module Codebase
|
|
10
|
+
# What Codebase's `GeneratedKey` query asks of the working tree: the hash of everything
|
|
11
|
+
# regenerating some domains' Rust reads, which a cache of the generated tree is keyed on.
|
|
12
|
+
#
|
|
13
|
+
# The hash is `Hecks::Corpus::GeneratedKey`'s; this answers it in this process and turns a
|
|
14
|
+
# refusal of a domain name into the failure a query raises.
|
|
15
|
+
module GeneratedKeys
|
|
16
|
+
module_function
|
|
17
|
+
|
|
18
|
+
# @param args [Hash] the query's plain arguments: `domains` (feature names), `files`
|
|
19
|
+
# @param tree [Tree] the working tree, already known to be a hecks checkout
|
|
20
|
+
# @return [String] the hash, with each file hashed above it when `files` is true
|
|
21
|
+
# @raise [ConsoleCapture::Failure] when a name is not a domain, listing the valid ones
|
|
22
|
+
def report(args, tree)
|
|
23
|
+
names = args[:domains]&.split(",")
|
|
24
|
+
Corpus::GeneratedKey.report(names, files: args[:files] == true, root: tree.root)
|
|
25
|
+
rescue Corpus::UnknownDomain => e
|
|
26
|
+
raise ConsoleCapture::Failure, e.message
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "open3"
|
|
4
|
+
require_relative "tree"
|
|
5
|
+
require_relative "spec_files"
|
|
6
|
+
require_relative "changed_specs"
|
|
7
|
+
require_relative "../git_rehearsal/spec_map"
|
|
8
|
+
require_relative "../git_rehearsal/impacted"
|
|
9
|
+
require_relative "../git_rehearsal/impacted/skips"
|
|
10
|
+
|
|
11
|
+
module Hecks
|
|
12
|
+
module Adapters
|
|
13
|
+
module Codebase
|
|
14
|
+
# The specs a branch's changes touch, found by the push rehearsal's own map and run in one
|
|
15
|
+
# launcher boot.
|
|
16
|
+
#
|
|
17
|
+
# The changed files are those between the merge base with the base ref and the working tree
|
|
18
|
+
# (uncommitted and untracked files included). `GitRehearsal::SpecMap` names the specs, and
|
|
19
|
+
# `GitRehearsal::Impacted::Skips` leaves out those that need `cargo`, `gh` or the network, and
|
|
20
|
+
# the `:io` ones when no scratch Postgres answers, exactly as the rehearsal's stage does.
|
|
21
|
+
class ImpactedSpecs
|
|
22
|
+
# The most spec files a run takes, as the rehearsal's stage does.
|
|
23
|
+
DEFAULT_CAP = GitRehearsal::Impacted::DEFAULT_LIMIT
|
|
24
|
+
|
|
25
|
+
DIGITS = /\d+/
|
|
26
|
+
TOTALS = /\d+ examples?, \d+ failures?\z/
|
|
27
|
+
|
|
28
|
+
# @param tree [Tree] the checkout
|
|
29
|
+
# @param scratch [#call, nil] says whether a scratch Postgres answers; `pg_isready` when nil
|
|
30
|
+
# @param files [SpecFiles, nil] runs the mapped specs
|
|
31
|
+
def initialize(tree, scratch: nil, files: nil)
|
|
32
|
+
@tree = tree
|
|
33
|
+
@scratch = scratch || -> { scratch_answers? }
|
|
34
|
+
@files = files || SpecFiles.new(tree)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @param base [String] the ref the branch is compared with
|
|
38
|
+
# @param cap [Integer] the most spec files to run
|
|
39
|
+
# @param dry [Boolean] list the mapped specs and run none
|
|
40
|
+
# @param run_options [Hash] `isolation`, `example`, `env` and `tags`, as `SpecFiles#run`
|
|
41
|
+
# takes them
|
|
42
|
+
# @return [String] the changed files, the mapped, skipped and run specs and how each ended
|
|
43
|
+
# @raise [ConsoleCapture::Failure] when git refuses or a spec fails
|
|
44
|
+
def call(base:, cap: DEFAULT_CAP, dry: false, **run_options)
|
|
45
|
+
changed = changed_files(base)
|
|
46
|
+
skips = GitRehearsal::Impacted::Skips.new(@tree.root, scratch: @scratch)
|
|
47
|
+
mapping = GitRehearsal::SpecMap.new(@tree.root).map(changed, limit: cap, skip: skips)
|
|
48
|
+
head = describe(base, changed, mapping)
|
|
49
|
+
return "#{head}\nnothing impacted; nothing run" if mapping.specs.empty?
|
|
50
|
+
return "#{head}\ndry run: no spec run" if dry
|
|
51
|
+
|
|
52
|
+
[head, run(mapping.specs, skips, run_options)].join("\n\n")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
|
|
57
|
+
def changed_files(base)
|
|
58
|
+
merge, status = Open3.capture2e("git", "-C", @tree.root, "merge-base", "HEAD", base)
|
|
59
|
+
ChangedSpecs.changed_files(@tree, status.success? ? merge.strip : base)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def describe(base, changed, mapping)
|
|
63
|
+
lines = ["changed since #{base}: #{changed.size} file(s)", *changed.map { |file| " #{file}" },
|
|
64
|
+
"impacted specs: #{mapping.specs.size}", *mapping.specs.map { |spec| " #{spec}" }]
|
|
65
|
+
lines << mapping.cap_note unless mapping.cap_note.empty?
|
|
66
|
+
(lines + mapping.skipped.map { |spec, why| "skipped: #{spec} (#{why})" }).join("\n")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# The `:io` specs run as CI does (`CI=true`), the rest as they are; with both, the report
|
|
70
|
+
# ends with the counts of both runs together.
|
|
71
|
+
def run(specs, skips, options)
|
|
72
|
+
io, plain = specs.partition { |spec| skips.io?(spec) }
|
|
73
|
+
env = options.fetch(:env, {})
|
|
74
|
+
groups = [[plain, env], [io, env.merge("CI" => "true")]].reject { |group, _env| group.empty? }
|
|
75
|
+
reports = groups.map { |group, group_env| batch(group, options.merge(env: group_env)) }
|
|
76
|
+
answer(reports)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def answer(reports)
|
|
80
|
+
text = (reports.map(&:text) + [(combined(reports) if reports.size > 1)]).compact.join("\n\n")
|
|
81
|
+
raise ConsoleCapture::Failure, text if reports.any?(&:failed)
|
|
82
|
+
|
|
83
|
+
text
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# What a batch said, and whether a file of it failed.
|
|
87
|
+
Batch = Struct.new(:text, :failed)
|
|
88
|
+
|
|
89
|
+
def batch(group, options)
|
|
90
|
+
Batch.new(@files.run(files: group, **options), false)
|
|
91
|
+
rescue ConsoleCapture::Failure => e
|
|
92
|
+
Batch.new(e.message, true)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def combined(reports)
|
|
96
|
+
counts = reports.map { |report| final_counts(report.text) }
|
|
97
|
+
"#{counts.sum(&:first)} examples, #{counts.sum(&:last)} failures"
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def final_counts(text) = text[TOTALS].scan(DIGITS).map(&:to_i)
|
|
101
|
+
|
|
102
|
+
def scratch_answers?
|
|
103
|
+
Open3.capture2e("pg_isready").last.success?
|
|
104
|
+
rescue SystemCallError
|
|
105
|
+
false
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -49,14 +49,14 @@ module Hecks
|
|
|
49
49
|
|
|
50
50
|
# What the tool says after a proposal or a rename, which still needs hand work.
|
|
51
51
|
FOLLOW_UP = {
|
|
52
|
-
"propose" => "Proposed. It reaches no projection until admitted. Before `hecks admit
|
|
52
|
+
"propose" => "Proposed. It reaches no projection until admitted. Before `hecks language_run.admit!`:\n " \
|
|
53
53
|
"1. teach the %<context>s builder the word (and its spec/dsl_spec example)",
|
|
54
54
|
"rename" => "Renamed. The old spelling keeps parsing — that is the point. Before this holds:\n " \
|
|
55
55
|
"1. alias the new word to the old in the %<context>s builder " \
|
|
56
56
|
"(alias_method :%<new_name>s, :%<word>s)\n " \
|
|
57
57
|
"2. add the identical-IR example to spec/dsl_spec.rb",
|
|
58
58
|
"propose_argument" => "Proposed. It reaches no projection until admitted. Before " \
|
|
59
|
-
"`hecks admit_argument
|
|
59
|
+
"`hecks language_run.admit_argument!`:\n " \
|
|
60
60
|
"1. teach the %<context>s builder's %<word>s method the argument"
|
|
61
61
|
}.freeze
|
|
62
62
|
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "hecks/command_names"
|
|
4
|
+
require "hecks/workflow_pagination"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module Adapters
|
|
8
|
+
module Codebase
|
|
9
|
+
# What Codebase's `ConformanceRun` asks of the text that drives the launcher and GitHub: the
|
|
10
|
+
# workflows, hooks, gate rows, specs and guides.
|
|
11
|
+
#
|
|
12
|
+
# Both checks read files in this process and write nothing. They look for the two ways such
|
|
13
|
+
# text goes quietly wrong: a command name the launcher does not accept, and a count of
|
|
14
|
+
# GitHub list items taken from the first page only.
|
|
15
|
+
module LauncherText
|
|
16
|
+
module_function
|
|
17
|
+
|
|
18
|
+
# @param tree [Tree] the working tree, already known to be a hecks checkout
|
|
19
|
+
# @return [String] the clean verdict
|
|
20
|
+
# @raise [ConsoleCapture::Failure] with each invocation the launcher would refuse
|
|
21
|
+
def command_names(tree)
|
|
22
|
+
runtime = Hecks.describe(tree.path("lib/hecks/hecks"))
|
|
23
|
+
CommandNames.check(root: tree.root, runtime: runtime)
|
|
24
|
+
rescue CommandNames::Failure => e
|
|
25
|
+
raise ConsoleCapture::Failure, e.message
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @param tree [Tree] the working tree
|
|
29
|
+
# @return [String] the clean verdict
|
|
30
|
+
# @raise [ConsoleCapture::Failure] with each list call that counts one page
|
|
31
|
+
def workflow_pagination(tree)
|
|
32
|
+
WorkflowPagination.check(root: tree.root)
|
|
33
|
+
rescue WorkflowPagination::Failure => e
|
|
34
|
+
raise ConsoleCapture::Failure, e.message
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "open3"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Adapters
|
|
7
|
+
module Codebase
|
|
8
|
+
# The minitest files of a spec directory. RSpec does not run them, so each one runs in its own Ruby
|
|
9
|
+
# process, and its run summary is reported beside the RSpec output.
|
|
10
|
+
module MinitestRuns
|
|
11
|
+
# The summary line minitest prints, such as "3 runs, 5 assertions".
|
|
12
|
+
SUMMARY = /\d+ runs?, /
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
# @param tree [Tree] the folder whose specs are listed
|
|
17
|
+
# @return [Array<String>] their paths, relative to the folder, sorted
|
|
18
|
+
def files(tree)
|
|
19
|
+
Dir.glob("#{TestSuite::SPEC_DIRECTORY}/**/*_test.rb", base: tree.root).sort
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Runs each file in its own Ruby process, from the folder, outside this process's bundle so the
|
|
23
|
+
# folder's own gems are the ones it loads.
|
|
24
|
+
#
|
|
25
|
+
# @param tree [Tree] the folder the files run in
|
|
26
|
+
# @param files [Array<String>] the minitest files
|
|
27
|
+
# @return [Array<String>] one line per file: its path and its run summary
|
|
28
|
+
# @raise [ConsoleCapture::Failure] with the output of the first file that fails
|
|
29
|
+
def reports(tree, files)
|
|
30
|
+
files.map do |file|
|
|
31
|
+
out, status = unbundled { Open3.capture2e(RbConfig.ruby, file, chdir: tree.root) }
|
|
32
|
+
raise ConsoleCapture::Failure, "#{file} failed\n#{out.strip}" unless status.success?
|
|
33
|
+
|
|
34
|
+
"#{file}: #{summary(out)}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @param out [String] what a minitest file printed
|
|
39
|
+
# @return [String] its last run summary line, or nothing when it printed none
|
|
40
|
+
def summary(out)
|
|
41
|
+
matches = out.lines.grep(SUMMARY)
|
|
42
|
+
matches.last.to_s.strip
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Runs the block without the bundle this process was started under, when Bundler is loaded.
|
|
46
|
+
def unbundled(&)
|
|
47
|
+
defined?(Bundler) ? Bundler.with_unbundled_env(&) : yield
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative "tree"
|
|
4
4
|
require_relative "ruby_child"
|
|
5
|
+
require "hecks/tools/gate_memo/standalone"
|
|
5
6
|
|
|
6
7
|
module Hecks
|
|
7
8
|
module Adapters
|
|
@@ -10,13 +11,16 @@ module Hecks
|
|
|
10
11
|
# domain's committed Rust output, and projecting the CI path gates into the workflows.
|
|
11
12
|
#
|
|
12
13
|
# It runs `Hecks::Tools::RegenerationRun` in this process: the run forks once for each
|
|
13
|
-
# domain,
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
14
|
+
# domain, a few at a time (`workers`, one per core unless told), and prints their output in
|
|
15
|
+
# a fixed domain order. The domains share the bluebooks they attach, and each writes the same
|
|
16
|
+
# bytes to them whichever runs first. With `check` it projects into a scratch copy of the
|
|
17
|
+
# crate and compares, and never writes the tree. Without `confirm` the run is that same
|
|
18
|
+
# check, so a regeneration that would rewrite tracked generated files reports drift and
|
|
19
|
+
# writes only when it is confirmed.
|
|
17
20
|
module Regeneration
|
|
18
21
|
# Every operation this family carries out.
|
|
19
|
-
OPERATIONS = %w[regenerate_corpus project_ci_gates project_lanes project_tools_doc
|
|
22
|
+
OPERATIONS = %w[regenerate_corpus project_ci_gates project_ci_pipeline project_lanes project_tools_doc
|
|
23
|
+
decide_ci_gate].freeze
|
|
20
24
|
|
|
21
25
|
# How many lines of a script's output a refusal keeps.
|
|
22
26
|
KEPT_LINES = 60
|
|
@@ -40,13 +44,42 @@ module Hecks
|
|
|
40
44
|
child = RubyChild.new(tree)
|
|
41
45
|
case operation
|
|
42
46
|
when "project_ci_gates" then project_ci_gates(child, check)
|
|
47
|
+
when "project_ci_pipeline" then project_ci_pipeline(child, check)
|
|
43
48
|
when "project_lanes" then project_lanes(child, check, set?(held, :live), set?(held, :confirm))
|
|
44
49
|
when "project_tools_doc" then project_tools_doc(child, check)
|
|
45
50
|
when "decide_ci_gate" then decide_ci_gate(child, held)
|
|
46
|
-
else
|
|
51
|
+
else regenerate_remembered(child, tree, held, check)
|
|
47
52
|
end
|
|
48
53
|
end
|
|
49
54
|
|
|
55
|
+
# A check of the whole corpus that is not confirmed is skipped when the gate or an earlier
|
|
56
|
+
# check passed on the same files. A run that writes, or checks only some domains, always
|
|
57
|
+
# runs.
|
|
58
|
+
#
|
|
59
|
+
# @return [String] the verdict, or that the check was skipped as unchanged
|
|
60
|
+
def regenerate_remembered(child, tree, held, check)
|
|
61
|
+
args = [*domains(held), *workers(held)]
|
|
62
|
+
whole = check && args.empty? && !set?(held, :confirm)
|
|
63
|
+
return regenerate(child, check, args) unless whole
|
|
64
|
+
|
|
65
|
+
Tools::GateMemo::Standalone.guard(tree.root, "codegen_drift") { regenerate(child, check, args) }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# @param held [Hash] the `RegenerationRun` record's fields: `domains`
|
|
69
|
+
# @return [Array<String>] the tool's argument naming the domains to run, empty for every one
|
|
70
|
+
def domains(held)
|
|
71
|
+
named = held[:domains].is_a?(Hash) ? held[:domains][:value] : held[:domains]
|
|
72
|
+
named.to_s.empty? ? [] : ["domains=#{named}"]
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# @param held [Hash] the `RegenerationRun` record's fields: `workers`
|
|
76
|
+
# @return [Array<String>] the tool's argument saying how many domains run at once, empty to
|
|
77
|
+
# leave it to the tool's default
|
|
78
|
+
def workers(held)
|
|
79
|
+
count = held[:workers].is_a?(Hash) ? held[:workers][:value] : held[:workers]
|
|
80
|
+
count.to_s.empty? ? [] : ["workers=#{count}"]
|
|
81
|
+
end
|
|
82
|
+
|
|
50
83
|
# @param held [Hash] the record's fields: `check`, `confirm`
|
|
51
84
|
# @return [Boolean] whether the run only compares: asked for, or not confirmed
|
|
52
85
|
def check_only?(held)
|
|
@@ -62,10 +95,12 @@ module Hecks
|
|
|
62
95
|
|
|
63
96
|
# @param child [RubyChild] the checkout's tool runner
|
|
64
97
|
# @param check [Boolean] whether to only compare
|
|
98
|
+
# @param domains [Array<String>] `domains=a,b` when only those are to run and `workers=n`
|
|
99
|
+
# when told how many at once, else empty
|
|
65
100
|
# @return [String] how many domains were checked or regenerated
|
|
66
101
|
# @raise [ConsoleCapture::Failure] with the difference, or with what the script printed
|
|
67
|
-
def regenerate(child, check)
|
|
68
|
-
result = child.capture("regen_codegen_domains", *("--check" if check))
|
|
102
|
+
def regenerate(child, check, domains = [])
|
|
103
|
+
result = child.capture("regen_codegen_domains", *("--check" if check), *domains)
|
|
69
104
|
raise ConsoleCapture::Failure, refusal(result) unless result.ok?
|
|
70
105
|
|
|
71
106
|
summary(result.out, check)
|
|
@@ -79,6 +114,14 @@ module Hecks
|
|
|
79
114
|
child.answer("project_ci_gates", *("--check" if check))
|
|
80
115
|
end
|
|
81
116
|
|
|
117
|
+
# @param child [RubyChild] the checkout's tool runner
|
|
118
|
+
# @param check [Boolean] whether to only compare
|
|
119
|
+
# @return [String] what the tool printed
|
|
120
|
+
# @raise [ConsoleCapture::Failure] with the stale workflows, when a check finds drift
|
|
121
|
+
def project_ci_pipeline(child, check)
|
|
122
|
+
child.answer("project_ci_pipeline", *("--check" if check))
|
|
123
|
+
end
|
|
124
|
+
|
|
82
125
|
# Projects the `Lane` rows, or with `live` compares GitHub's rulesets with them. Only a live
|
|
83
126
|
# run that is confirmed changes GitHub, so without `confirm` a live run is a comparison.
|
|
84
127
|
#
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module Adapters
|
|
5
|
+
module Codebase
|
|
6
|
+
# What a spec run's arguments become: the variables the specs read, and the flags a stress run takes.
|
|
7
|
+
# A person names them in a request, so they never set them in a shell.
|
|
8
|
+
module RunOptions
|
|
9
|
+
module_function
|
|
10
|
+
|
|
11
|
+
# The variables the specs read, set for one example only.
|
|
12
|
+
#
|
|
13
|
+
# @param args [Hash] `strict`, `seeds`, `environment` and `declaration_cache`, each
|
|
14
|
+
# perhaps absent
|
|
15
|
+
# @return [Hash{String => String}] only those the run named
|
|
16
|
+
def spec_env(args)
|
|
17
|
+
{ "CI" => ("true" if args[:strict] == true), "PROPERTY_SEEDS" => args[:seeds]&.to_s,
|
|
18
|
+
"HECKS_ENVIRONMENT" => args[:environment],
|
|
19
|
+
"HECKS_NO_DECLARATION_CACHE" => ("1" if args[:declaration_cache] == false) }.compact
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @param args [Hash] `runs`, `parallel` and `seed_start`
|
|
23
|
+
# @return [Array<String>] the script's flags for those that are named
|
|
24
|
+
def stress_flags(args)
|
|
25
|
+
{ "--runs" => :runs, "--parallel" => :parallel, "--seed-start" => :seed_start }
|
|
26
|
+
.filter_map { |flag, name| [flag, args[name].to_s] if args[name] }.flatten
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @param args [Hash] `fixture`, perhaps absent
|
|
30
|
+
# @return [Hash{String => String}] the variable that names the one fixture to re-seed
|
|
31
|
+
def seed_env(args) = args[:fixture] ? { "SEED" => args[:fixture] } : {}
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../../tools/move_disables"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Adapters
|
|
7
|
+
module Codebase
|
|
8
|
+
# What Codebase's `ScriptRun` asks of the working tree: one named one-off script, planned, or
|
|
9
|
+
# applied once confirmed. A script's body is a tool under `lib/hecks/tools`; `SCRIPTS` names
|
|
10
|
+
# the ones this family may run, so a record cannot reach a tool it does not list.
|
|
11
|
+
module Scripting
|
|
12
|
+
# Every operation this family carries out.
|
|
13
|
+
OPERATIONS = %w[plan_script apply_script].freeze
|
|
14
|
+
|
|
15
|
+
# Each script a record may name, with the tool that carries it out.
|
|
16
|
+
SCRIPTS = { "move_disables" => Hecks::Tools::MoveDisables }.freeze
|
|
17
|
+
|
|
18
|
+
module_function
|
|
19
|
+
|
|
20
|
+
# Carries out one operation on the named script.
|
|
21
|
+
#
|
|
22
|
+
# @param operation [String] one of `OPERATIONS`
|
|
23
|
+
# @param held [Hash] the `ScriptRun` record's fields
|
|
24
|
+
# @param tree [Tree] the working tree, already known to be a hecks checkout
|
|
25
|
+
# @param shell [#capture, nil] unused: the tool runs in this process
|
|
26
|
+
# @return [String] the tool's plan, or the plan and what it wrote
|
|
27
|
+
# @raise [ConsoleCapture::Failure] when the record names no script this family runs
|
|
28
|
+
def call(operation, held, tree, shell: nil)
|
|
29
|
+
args = held.transform_values { |value| value.is_a?(Hash) ? value[:value] : value }
|
|
30
|
+
name = args[:script].to_s
|
|
31
|
+
tool = SCRIPTS.fetch(name) do
|
|
32
|
+
raise ConsoleCapture::Failure, "no script named #{name.inspect}; the scripts are #{SCRIPTS.keys.join(", ")}"
|
|
33
|
+
end
|
|
34
|
+
tool.transform(root: tree.root, apply: operation == "apply_script")
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -14,7 +14,7 @@ module Hecks
|
|
|
14
14
|
# byte in its first block, which is how a binary announces itself.
|
|
15
15
|
module Search
|
|
16
16
|
# Directory names that are never walked.
|
|
17
|
-
SKIPPED = %w[.git
|
|
17
|
+
SKIPPED = %w[.git target node_modules tmp vendor worktrees].freeze
|
|
18
18
|
|
|
19
19
|
# The rows kept when `top` is not named.
|
|
20
20
|
DEFAULT_TOP = 200
|
|
@@ -10,17 +10,44 @@ require_relative "style"
|
|
|
10
10
|
require_relative "inspection"
|
|
11
11
|
require_relative "search"
|
|
12
12
|
require_relative "reading"
|
|
13
|
+
require_relative "corpus_queries"
|
|
14
|
+
require_relative "generated_keys"
|
|
13
15
|
require_relative "codemods"
|
|
14
16
|
require_relative "test_suite"
|
|
17
|
+
require_relative "test_scope"
|
|
15
18
|
require_relative "corpus_tasks"
|
|
16
19
|
require_relative "composing"
|
|
17
20
|
require_relative "previewing"
|
|
18
21
|
require_relative "publishing"
|
|
19
22
|
require_relative "promotion"
|
|
23
|
+
require_relative "scripting"
|
|
20
24
|
require_relative "../git"
|
|
21
25
|
|
|
22
26
|
module Hecks
|
|
23
27
|
module Adapters
|
|
28
|
+
# The lookup and working tree a perform runs against, kept out of the class body.
|
|
29
|
+
module Performing
|
|
30
|
+
# @param operation [String] the operation the request names
|
|
31
|
+
# @return [Module] the family that carries it out
|
|
32
|
+
# @raise [ConsoleCapture::Failure] when no family carries the operation out
|
|
33
|
+
def family_for(operation)
|
|
34
|
+
SourceTree::FAMILIES.find { |candidate| candidate::OPERATIONS.include?(operation) } ||
|
|
35
|
+
raise(ConsoleCapture::Failure, "no task carries out #{operation.inspect}")
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @param operation [String] the operation the request names
|
|
39
|
+
# @param held [Hash] the record, whose folder argument a folder operation reads
|
|
40
|
+
# @return [Object] the tree the operation runs against
|
|
41
|
+
def working_tree(operation, held)
|
|
42
|
+
Codebase::TestSuite::FOLDER_OPERATIONS.include?(operation) ? folder_tree(held) : checkout_tree
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @return [Object] the shell the family runs commands through
|
|
46
|
+
def shell
|
|
47
|
+
self.class.shell || Shell.new
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
24
51
|
# The `SourceTree` port's adapter: everything Codebase does to the working tree of this
|
|
25
52
|
# repository.
|
|
26
53
|
#
|
|
@@ -31,6 +58,9 @@ module Hecks
|
|
|
31
58
|
# `perform` finds the task family that carries an operation out; a family lives beside this
|
|
32
59
|
# file and does the work with the existing generators, linters and tools.
|
|
33
60
|
class SourceTree
|
|
61
|
+
include CorpusQueries
|
|
62
|
+
include Performing
|
|
63
|
+
|
|
34
64
|
class << self
|
|
35
65
|
# @return [#capture, nil] starts each child process; a `Shell` when nil. A spec replaces it
|
|
36
66
|
# so no gate has to run to test what is asked of it.
|
|
@@ -42,7 +72,10 @@ module Hecks
|
|
|
42
72
|
# @param aggregate [Object, nil] unused
|
|
43
73
|
# @param settings [Hash] unused
|
|
44
74
|
# @param root [String, nil] unused
|
|
45
|
-
|
|
75
|
+
# @param registry [Runtime::Registry, nil] whose Hecks world declares the `test_scope` limit
|
|
76
|
+
def initialize(aggregate: nil, settings: {}, root: nil, registry: nil)
|
|
77
|
+
@registry = registry
|
|
78
|
+
end
|
|
46
79
|
|
|
47
80
|
# Reports whether the working tree is a hecks checkout. For a release it also reports the
|
|
48
81
|
# facts the Git adapter surveys, since a release's rules are judged with the checkout rule.
|
|
@@ -51,8 +84,10 @@ module Hecks
|
|
|
51
84
|
# @return [Hash{Symbol => Hash}] `checkout:` whether hecks.gemspec stands beside lib/, and for
|
|
52
85
|
# a release the facts to judge
|
|
53
86
|
def examine(**held)
|
|
54
|
-
answer = { checkout: { value: tree.checkout? } }
|
|
55
87
|
operation = plain(held[:operation])
|
|
88
|
+
return { checkout: { value: folder_specs?(held) } } if Codebase::TestSuite::FOLDER_OPERATIONS.include?(operation)
|
|
89
|
+
|
|
90
|
+
answer = { checkout: { value: tree.checkout? } }
|
|
56
91
|
return answer.merge(promotion_facts(held)) if Codebase::Promotion::OPERATIONS.include?(operation)
|
|
57
92
|
return answer unless Codebase::Publishing::OPERATIONS.include?(operation)
|
|
58
93
|
|
|
@@ -68,13 +103,13 @@ module Hecks
|
|
|
68
103
|
# @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
|
|
69
104
|
# @raise [ConsoleCapture::Failure] when no family carries the operation out, or it refuses
|
|
70
105
|
def perform(**held)
|
|
71
|
-
tree.require_checkout!
|
|
72
106
|
operation = plain(held[:operation])
|
|
73
|
-
|
|
74
|
-
raise ConsoleCapture::Failure, "no task carries out #{operation.inspect}" unless family
|
|
107
|
+
return handed_off(operation) if HANDED_OFF.include?(operation)
|
|
75
108
|
|
|
76
|
-
|
|
77
|
-
|
|
109
|
+
family = family_for(operation)
|
|
110
|
+
folder = working_tree(operation, held)
|
|
111
|
+
allowed = Codebase::TestScope.new(@registry).admit(operation, held.except(:operation), folder)
|
|
112
|
+
done = family.call(operation, allowed, folder, shell: shell)
|
|
78
113
|
done.is_a?(Hash) ? done : { report: { value: done } }
|
|
79
114
|
end
|
|
80
115
|
|
|
@@ -150,46 +185,26 @@ module Hecks
|
|
|
150
185
|
{ text: test_suite("record_pattern_cases", {}) }
|
|
151
186
|
end
|
|
152
187
|
|
|
153
|
-
# @
|
|
154
|
-
# @
|
|
155
|
-
|
|
156
|
-
{ text: corpus("rust_domains", {}) }
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
# @return [Hash] `text:` the directories regeneration walks, in the order it walks them
|
|
160
|
-
# @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
|
|
161
|
-
def regen_order(**)
|
|
162
|
-
{ text: corpus("regen_order", {}) }
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
# @return [Hash] `text:` whether each generated Rust module is covered
|
|
166
|
-
# @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
|
|
167
|
-
# @raise [ConsoleCapture::Failure] when a module is not covered
|
|
168
|
-
def corpus_rust_coverage(**)
|
|
169
|
-
{ text: corpus("corpus_rust_coverage", {}) }
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
# @param args [Hash] the query's arguments: `names`
|
|
173
|
-
# @return [Hash] `text:` each IR construct's diff from its meta-domain
|
|
188
|
+
# @param args [Hash] the query's arguments: `domains` (feature names), `files`
|
|
189
|
+
# @return [Hash] `text:` the hash of what regenerating those domains reads, with `files` each
|
|
190
|
+
# file hashed above it
|
|
174
191
|
# @raise [Codebase::Tree::NeedsCheckout] when the tree is not a hecks checkout
|
|
175
|
-
|
|
176
|
-
|
|
192
|
+
# @raise [ConsoleCapture::Failure] when a name is not a domain, listing the valid ones
|
|
193
|
+
def generated_key(**args)
|
|
194
|
+
tree.require_checkout!
|
|
195
|
+
{ text: Codebase::GeneratedKeys.report(args.transform_values { |value| plain(value) }, tree) }
|
|
177
196
|
end
|
|
178
197
|
|
|
179
|
-
#
|
|
180
|
-
#
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
{ text: corpus("ir_duplicates", args) }
|
|
184
|
-
end
|
|
198
|
+
# Operations the Terminal adapter carries out itself: the run records that the server was
|
|
199
|
+
# started and answers when the process hands back, so nothing here runs them.
|
|
200
|
+
HANDED_OFF = %w[serve_mcp].freeze
|
|
201
|
+
private_constant :HANDED_OFF
|
|
185
202
|
|
|
186
|
-
#
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
{ text: corpus("ir_impact", args) }
|
|
192
|
-
end
|
|
203
|
+
# The task families, each carrying out the operations it lists.
|
|
204
|
+
FAMILIES = [Codebase::Language, Codebase::KernelTables, Codebase::Conformance, Codebase::Regeneration,
|
|
205
|
+
Codebase::Gate, Codebase::Style, Codebase::Inspection, Codebase::Codemods, Codebase::TestSuite,
|
|
206
|
+
Codebase::CorpusTasks, Codebase::Composing, Codebase::Previewing,
|
|
207
|
+
Codebase::Publishing, Codebase::Promotion, Codebase::Scripting].freeze
|
|
193
208
|
|
|
194
209
|
private
|
|
195
210
|
|
|
@@ -216,21 +231,34 @@ module Hecks
|
|
|
216
231
|
Codebase::Style.report(operation, plain_args, tree, shell: self.class.shell)
|
|
217
232
|
end
|
|
218
233
|
|
|
219
|
-
# The task families, each carrying out the operations it lists.
|
|
220
|
-
FAMILIES = [Codebase::Language, Codebase::KernelTables, Codebase::Conformance, Codebase::Regeneration,
|
|
221
|
-
Codebase::Gate, Codebase::Style, Codebase::Inspection, Codebase::Codemods, Codebase::TestSuite,
|
|
222
|
-
Codebase::CorpusTasks, Codebase::Composing, Codebase::Previewing,
|
|
223
|
-
Codebase::Publishing, Codebase::Promotion].freeze
|
|
224
|
-
private_constant :FAMILIES
|
|
225
|
-
|
|
226
234
|
# The facts of a promotion or a watch, naming the operation so policies can tell them apart.
|
|
227
235
|
def promotion_facts(held)
|
|
228
236
|
facts = tree.checkout? ? Codebase::Promotion.facts(held, tree) : Codebase::Promotion.no_facts
|
|
229
|
-
{ operation: held[:operation]
|
|
237
|
+
{ operation: held[:operation] }.compact.merge(facts)
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
# @return [Hash{Symbol => Hash}] `report:` the note that the terminal carries the operation
|
|
241
|
+
def handed_off(operation)
|
|
242
|
+
note = { value: "#{operation} handed to the terminal" }
|
|
243
|
+
{ report: note, output: note }
|
|
230
244
|
end
|
|
231
245
|
|
|
232
246
|
def tree = Codebase::Tree.new
|
|
233
247
|
|
|
248
|
+
# The checkout this repository's own tooling works on, which must be a hecks checkout.
|
|
249
|
+
def checkout_tree
|
|
250
|
+
tree.require_checkout!
|
|
251
|
+
tree
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
# The folder a spec run works in: the one the request names, this checkout when none is.
|
|
255
|
+
def folder_tree(held) = Codebase::Tree.new(root: plain(held[:root]))
|
|
256
|
+
|
|
257
|
+
# Whether the folder a spec run names holds a spec directory, so any project's suite can run.
|
|
258
|
+
def folder_specs?(held)
|
|
259
|
+
File.directory?(File.join(folder_tree(held).root, Codebase::TestSuite::SPEC_DIRECTORY))
|
|
260
|
+
end
|
|
261
|
+
|
|
234
262
|
def plain(argument) = argument.is_a?(Hash) ? argument[:value] : argument
|
|
235
263
|
end
|
|
236
264
|
end
|