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
|
@@ -2,7 +2,7 @@ require_relative "../../naming"
|
|
|
2
2
|
require_relative "templates"
|
|
3
3
|
|
|
4
4
|
module Hecks
|
|
5
|
-
module
|
|
5
|
+
module Tools
|
|
6
6
|
module ProjectCli
|
|
7
7
|
# The source of one launcher, built from `Templates`. `ProjectCli` extends it.
|
|
8
8
|
module LauncherSource
|
|
@@ -19,7 +19,9 @@ module Hecks
|
|
|
19
19
|
# How every launcher ends.
|
|
20
20
|
PLAIN_ENDING = "status.zero? ? puts(text) : abort(text)".freeze
|
|
21
21
|
|
|
22
|
-
# How an opted-in launcher ends: a failed `--wait` run still prints its settled record
|
|
22
|
+
# How an opted-in launcher ends: a failed `--wait` run still prints its settled record, and
|
|
23
|
+
# the process exits with the status the runner answered (`ExitStatus`), a refusal and a
|
|
24
|
+
# line it could not read apart.
|
|
23
25
|
OPTED_ENDING = <<~LAUNCHER_TAIL.chomp.freeze
|
|
24
26
|
# A `--wait` run that failed answers its settled record on stdout, so `| jq` reads it
|
|
25
27
|
# either way, and says why on stderr.
|
|
@@ -28,7 +30,8 @@ module Hecks
|
|
|
28
30
|
warn reason
|
|
29
31
|
exit status
|
|
30
32
|
end
|
|
31
|
-
status.zero? ? puts(text) :
|
|
33
|
+
status.zero? ? puts(text) : warn(text)
|
|
34
|
+
exit status
|
|
32
35
|
LAUNCHER_TAIL
|
|
33
36
|
|
|
34
37
|
# What a Memory command does when refused: say why, from the record's `refusal`.
|
|
@@ -64,31 +67,44 @@ module Hecks
|
|
|
64
67
|
# @param name [String] the bluebook's name
|
|
65
68
|
# @param program [String] the generator's invocation, named in the header
|
|
66
69
|
# @param executable [String, nil] the file's path under the root when not beside the domain
|
|
67
|
-
# @param legacy [Array<String>, nil] commands an executable hands to `Hecks::CLI` first
|
|
68
70
|
# @param memory_commands [Array<String>, nil] commands that default to Memory
|
|
69
71
|
# @param opted [Boolean] whether the bluebook's world declares a `launcher` setting
|
|
72
|
+
# @param ledgers [Hash{String => String}] command word => ledger directory, under the root
|
|
70
73
|
# @return [String] the Ruby source
|
|
71
|
-
# @raise [ArgumentError] if a name, path, executable or
|
|
72
|
-
def launcher(path, name, program, executable: nil,
|
|
74
|
+
# @raise [ArgumentError] if a name, path, executable or memory command is not plain
|
|
75
|
+
def launcher(path, name, program, executable: nil, memory_commands: nil, opted: !executable.nil?, ledgers: {})
|
|
73
76
|
plain!("bluebook name", name, NAME)
|
|
74
77
|
plain!("domain path", path, PATH)
|
|
75
|
-
site = executable ? executable_site(path, executable) : plain_site(path, name, program)
|
|
78
|
+
site = executable ? executable_site(path, executable, ledgers) : plain_site(path, name, program)
|
|
76
79
|
quiet = !Array(memory_commands).empty?
|
|
77
80
|
|
|
78
81
|
render(LAUNCHER, name: name, program: site.program, where: site.where, up: site.up,
|
|
79
82
|
encoding: opted ? ENCODING : "",
|
|
80
|
-
handoff: handoff_for(executable,
|
|
83
|
+
handoff: handoff_for(executable, memory_commands, site, ledgers),
|
|
81
84
|
ending: ending_for(opted, executable && quiet),
|
|
82
85
|
entry: entry(name, site.boot, site.shown, opted, quiet: quiet))
|
|
83
86
|
end
|
|
84
87
|
|
|
85
88
|
# @api private
|
|
86
89
|
# @return [String] what an executable launcher does before it boots, or nothing: it takes
|
|
87
|
-
# the gems the checkout's Gemfile pins,
|
|
88
|
-
def handoff_for(executable,
|
|
90
|
+
# the gems the checkout's Gemfile pins, and defaults Memory ones
|
|
91
|
+
def handoff_for(executable, memory_commands, site, ledgers)
|
|
89
92
|
return "" unless executable
|
|
90
93
|
|
|
91
|
-
render(PINNED_GEMS, up: site.up) +
|
|
94
|
+
render(PINNED_GEMS, up: site.up) + memory_default(Array(memory_commands)) + ledger_route(ledgers)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# @api private
|
|
98
|
+
# @return [String] the lines routing each ledger command word to its directory, or nothing
|
|
99
|
+
def ledger_route(ledgers)
|
|
100
|
+
return "" if ledgers.empty?
|
|
101
|
+
|
|
102
|
+
routes = ledgers.map do |word, dir|
|
|
103
|
+
plain!("ledger command", word, VERB)
|
|
104
|
+
plain!("ledger directory", dir, PATH)
|
|
105
|
+
%("#{word}" => "#{dir}")
|
|
106
|
+
end
|
|
107
|
+
render(LEDGER_ROUTE, routes: routes.join(", "))
|
|
92
108
|
end
|
|
93
109
|
|
|
94
110
|
# @api private
|
|
@@ -100,14 +116,17 @@ module Hecks
|
|
|
100
116
|
|
|
101
117
|
# @api private
|
|
102
118
|
# @return [Site] where an executable launcher sits, named by its path under the root
|
|
103
|
-
def executable_site(path, executable)
|
|
119
|
+
def executable_site(path, executable, ledgers = {})
|
|
104
120
|
plain!("launcher executable", executable, PATH)
|
|
105
121
|
if executable.split("/").include?("..")
|
|
106
122
|
raise ArgumentError, "launcher executable #{executable.inspect} must stay inside the root"
|
|
107
123
|
end
|
|
108
124
|
|
|
109
125
|
up = "../" * File.dirname(executable).split("/").count { |part| part != "." }
|
|
110
|
-
|
|
126
|
+
# The boot is a ledger's directory when the route above set `ledger`.
|
|
127
|
+
named = %(File.expand_path("#{up}#{path}", __dir__))
|
|
128
|
+
routed = %(File.expand_path(ledger ? "#{up}\#{ledger}" : "#{up}#{path}", __dir__))
|
|
129
|
+
Site.new(up, ledgers.empty? ? named : routed, GENERATOR, executable, File.basename(executable))
|
|
111
130
|
end
|
|
112
131
|
|
|
113
132
|
# @api private
|
|
@@ -164,15 +183,6 @@ module Hecks
|
|
|
164
183
|
commands.each { |command| plain!("memory command", command, VERB) }
|
|
165
184
|
render(MEMORY_DEFAULT, commands: commands.join(" "))
|
|
166
185
|
end
|
|
167
|
-
|
|
168
|
-
# @api private
|
|
169
|
-
# @return [String] the lines that hand the legacy commands to `Hecks::CLI`, or nothing
|
|
170
|
-
def legacy_handoff(legacy)
|
|
171
|
-
return "" if legacy.empty?
|
|
172
|
-
|
|
173
|
-
legacy.each { |command| plain!("legacy command", command, VERB) }
|
|
174
|
-
render(LEGACY_HANDOFF, commands: legacy.join(" "))
|
|
175
|
-
end
|
|
176
186
|
end
|
|
177
187
|
end
|
|
178
188
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module Hecks
|
|
2
|
-
module
|
|
2
|
+
module Tools
|
|
3
3
|
module ProjectCli
|
|
4
4
|
# The text of a launcher, as templates: each `{{name}}` is filled in by `render`.
|
|
5
5
|
module Templates
|
|
@@ -22,6 +22,8 @@ module Hecks
|
|
|
22
22
|
{{encoding}}$LOAD_PATH.unshift File.expand_path("{{up}}lib", __dir__)
|
|
23
23
|
{{handoff}}
|
|
24
24
|
require "hecks"
|
|
25
|
+
# Every secret a world hands an adapter is masked in whatever this process prints.
|
|
26
|
+
Hecks::Secrets.guard!
|
|
25
27
|
|
|
26
28
|
{{entry}}
|
|
27
29
|
{{ending}}
|
|
@@ -38,7 +40,14 @@ module Hecks
|
|
|
38
40
|
described = begin
|
|
39
41
|
Hecks.describe(domain)
|
|
40
42
|
rescue StandardError => e
|
|
41
|
-
abort "cannot open {{name}}: #{e.message.
|
|
43
|
+
abort "cannot open {{name}}: #{e.message.strip}"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# `hecks usage` reads the local record of what this launcher ran; it boots nothing.
|
|
47
|
+
if ARGV.first == "usage"
|
|
48
|
+
known = Hecks::Adapters::Driving::CliRunner.known_names(runtime: described, program: program)
|
|
49
|
+
puts Hecks::Adapters::Driving::UsageLog.summary(known: known)
|
|
50
|
+
exit 0
|
|
42
51
|
end
|
|
43
52
|
|
|
44
53
|
text, status, reason = Hecks::Adapters::Driving::CliRunner.usage(
|
|
@@ -48,13 +57,13 @@ module Hecks
|
|
|
48
57
|
runtime = begin
|
|
49
58
|
{{started}}
|
|
50
59
|
rescue StandardError => e
|
|
51
|
-
abort "cannot open {{name}}: #{e.message.
|
|
60
|
+
abort "cannot open {{name}}: #{e.message.strip}"
|
|
52
61
|
end
|
|
53
62
|
# A question the world lists under `streams`, given `--stream`, tails until interrupted.
|
|
54
63
|
streamed = Hecks::Adapters::Driving::CliRunner.stream(runtime: runtime, argv: ARGV, program: program)
|
|
55
64
|
exit streamed unless streamed.nil?
|
|
56
65
|
text, status, reason = Hecks::Adapters::Driving::CliRunner.call(
|
|
57
|
-
runtime: runtime, argv: ARGV, program: program
|
|
66
|
+
runtime: runtime, argv: ARGV, program: program, usage_log: true
|
|
58
67
|
)
|
|
59
68
|
end
|
|
60
69
|
RUBY
|
|
@@ -72,6 +81,15 @@ module Hecks
|
|
|
72
81
|
)
|
|
73
82
|
RUBY
|
|
74
83
|
|
|
84
|
+
# The lines that send a command a ledger answers to the ledger's own directory. The ledger's
|
|
85
|
+
# name is dropped from the command line, and the boot below reads `ledger`.
|
|
86
|
+
LEDGER_ROUTE = <<~RUBY.freeze
|
|
87
|
+
|
|
88
|
+
# A command a ledger answers boots that ledger's directory, not this domain's.
|
|
89
|
+
ledger = { {{routes}} }.fetch(ARGV.first, nil)
|
|
90
|
+
ARGV.shift if ledger
|
|
91
|
+
RUBY
|
|
92
|
+
|
|
75
93
|
# The lines that default listed commands to Memory.
|
|
76
94
|
MEMORY_DEFAULT = <<~RUBY.freeze
|
|
77
95
|
|
|
@@ -101,17 +119,6 @@ module Hecks
|
|
|
101
119
|
end
|
|
102
120
|
RUBY
|
|
103
121
|
|
|
104
|
-
# The lines that hand the legacy commands to `Hecks::CLI`.
|
|
105
|
-
LEGACY_HANDOFF = <<~RUBY.freeze
|
|
106
|
-
|
|
107
|
-
# The names the gem has always shipped keep their positional forms.
|
|
108
|
-
LEGACY = %w[{{commands}}].freeze
|
|
109
|
-
if LEGACY.include?(ARGV.first)
|
|
110
|
-
require "hecks/cli"
|
|
111
|
-
exit Hecks::CLI.start(ARGV) unless Hecks::CLI.launcher_form?(ARGV)
|
|
112
|
-
end
|
|
113
|
-
RUBY
|
|
114
|
-
|
|
115
122
|
# Fills a template's `{{name}}` placeholders.
|
|
116
123
|
#
|
|
117
124
|
# @param template [String] the template text
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
require "fileutils"
|
|
2
2
|
require_relative "../../hecks"
|
|
3
3
|
require_relative "project_cli/launcher_source"
|
|
4
|
+
require_relative "../corpus"
|
|
4
5
|
|
|
5
6
|
module Hecks
|
|
6
|
-
module
|
|
7
|
-
# The command behind `hecks project_cli
|
|
7
|
+
module Tools
|
|
8
|
+
# The command behind `hecks launch.project_cli!` and `hecks launch.project_cli!`: writes a
|
|
8
9
|
# command-line launcher beside each domain, named after its bluebook, so
|
|
9
10
|
# `Hecks.bluebook "QualityControl"` in `qa/` becomes `qa/quality_control`.
|
|
10
11
|
#
|
|
@@ -55,7 +56,7 @@ module Hecks
|
|
|
55
56
|
# @api private
|
|
56
57
|
def refuse_unknown(flags)
|
|
57
58
|
unknown = flags - ["--check"]
|
|
58
|
-
abort "hecks project_cli
|
|
59
|
+
abort "hecks launch.project_cli!: unknown option #{unknown.first} (the only option is --check)" unless unknown.empty?
|
|
59
60
|
end
|
|
60
61
|
|
|
61
62
|
# Says which launchers drifted or could not be made, and exits 1 if any did.
|
|
@@ -66,7 +67,9 @@ module Hecks
|
|
|
66
67
|
failed = outcomes.select { |_, outcome| outcome == :failed }.keys
|
|
67
68
|
return if drifted.empty? && failed.empty?
|
|
68
69
|
|
|
69
|
-
|
|
70
|
+
unless drifted.empty?
|
|
71
|
+
warn "launcher out of date for: #{drifted.join(", ")}; run `hecks launch.project_cli! #{drifted.join(" ")}`"
|
|
72
|
+
end
|
|
70
73
|
warn "no launcher could be checked or written for: #{failed.join(", ")}" unless failed.empty?
|
|
71
74
|
exit 1
|
|
72
75
|
end
|
|
@@ -80,7 +83,7 @@ module Hecks
|
|
|
80
83
|
def under_root(root, path)
|
|
81
84
|
expanded = File.expand_path(path, root)
|
|
82
85
|
inside = expanded == root || expanded.start_with?("#{root}/")
|
|
83
|
-
abort "hecks project_cli
|
|
86
|
+
abort "hecks launch.project_cli!: #{path.inspect} is outside #{root}" unless inside
|
|
84
87
|
|
|
85
88
|
relative = expanded.delete_prefix(root).delete_prefix("/")
|
|
86
89
|
relative.empty? ? "." : relative
|
|
@@ -120,8 +123,9 @@ module Hecks
|
|
|
120
123
|
snake = Naming.snake(name)
|
|
121
124
|
executable = setting[:executable]
|
|
122
125
|
label = executable || "#{path}/#{snake}"
|
|
123
|
-
text = launcher(path, name, program, executable: executable,
|
|
124
|
-
memory_commands: setting[:memory_commands], opted: !setting.empty
|
|
126
|
+
text = launcher(path, name, program, executable: executable,
|
|
127
|
+
memory_commands: setting[:memory_commands], opted: !setting.empty?,
|
|
128
|
+
ledgers: executable ? Corpus::ROTATION_LEDGER : {})
|
|
125
129
|
Target.new(name, label, File.join(root, label), text, snake, executable)
|
|
126
130
|
end
|
|
127
131
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require_relative "../../hecks"
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
|
-
module
|
|
4
|
+
module Tools
|
|
5
5
|
# The command behind `hecks project_diagrams`: boots a
|
|
6
6
|
# domain, finds the bluebook it names, and writes its Mermaid diagrams
|
|
7
7
|
# (`Projections::Diagrams`) under `docs/generated/diagrams/<bluebook>/` below the
|
|
@@ -48,9 +48,9 @@ module Hecks
|
|
|
48
48
|
# @api private
|
|
49
49
|
def report(declaration_name, directory, written)
|
|
50
50
|
if written.empty?
|
|
51
|
-
|
|
51
|
+
warn "#{declaration_name} declares no lifecycle, relationship, or dispatch to project yet"
|
|
52
52
|
else
|
|
53
|
-
|
|
53
|
+
warn "wrote #{written.size} diagram(s) to #{directory}:"
|
|
54
54
|
written.each { |path| puts " #{path}" }
|
|
55
55
|
end
|
|
56
56
|
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require_relative "../../hecks"
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
|
-
module
|
|
4
|
+
module Tools
|
|
5
5
|
# The command behind `hecks glossary`: boots a domain and projects one bluebook into its
|
|
6
6
|
# Ubiquitous Language glossary, `glossary.md` plus `html/index.html` rendered from it, in the
|
|
7
7
|
# domain's own `glossary/` folder.
|
|
@@ -25,7 +25,7 @@ module Hecks
|
|
|
25
25
|
|
|
26
26
|
written = write_glossary(File.expand_path(domain_path, Dir.pwd), declaration_name)
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
warn "wrote #{written.size} file(s):"
|
|
29
29
|
written.each { |path| puts " #{path}" }
|
|
30
30
|
end
|
|
31
31
|
|
|
@@ -4,8 +4,8 @@ require_relative "../../hecks"
|
|
|
4
4
|
require_relative "../projection_files"
|
|
5
5
|
|
|
6
6
|
module Hecks
|
|
7
|
-
module
|
|
8
|
-
# The command behind `hecks language_run.project_reference
|
|
7
|
+
module Tools
|
|
8
|
+
# The command behind `hecks language_run.project_reference!`: regenerates
|
|
9
9
|
# `docs/implemented/reference/` from
|
|
10
10
|
# the language's Syntax bluebook. Tables come from the declaration; prose is kept from the
|
|
11
11
|
# committed pages.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require_relative "../../hecks"
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
|
-
module
|
|
4
|
+
module Tools
|
|
5
5
|
# The logic behind `hecks refresh_projections` and Custodian's `Operation.RefreshProjections`:
|
|
6
6
|
# forces every
|
|
7
7
|
# read-model projection a booted domain declares to catch up now, the same catch-up a boot
|
|
@@ -6,7 +6,7 @@ require "open3"
|
|
|
6
6
|
require "yaml"
|
|
7
7
|
|
|
8
8
|
module Hecks
|
|
9
|
-
module
|
|
9
|
+
module Tools
|
|
10
10
|
# The command behind `hecks refresh_runtime_baseline`: regenerates the committed runtime
|
|
11
11
|
# baselines the sharded CI jobs group from. It prefers one CI run's timings; a local run is
|
|
12
12
|
# the fallback.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "tempfile"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Tools
|
|
7
|
+
module RegenerationRun
|
|
8
|
+
# Forks one `hecks project_rust` child per domain, up to `workers` at a time, and prints each
|
|
9
|
+
# child's output whole, in domain order, as soon as every domain before it has been printed.
|
|
10
|
+
#
|
|
11
|
+
# A child inherits the parent's memoized grammar registry through the fork. Its output goes to
|
|
12
|
+
# a temporary file, so a child that writes a lot never waits on a reader. A child that fails
|
|
13
|
+
# stops the pool from starting more; the ones already running are left to finish, so no
|
|
14
|
+
# child is cut off in the middle of a write. The run then aborts, naming the failed domains.
|
|
15
|
+
class Pool
|
|
16
|
+
# What a child runs: `hecks project_rust` with the domain and the declared-domain flags,
|
|
17
|
+
# writing to the streams it was given.
|
|
18
|
+
PROJECT_RUST = lambda do |argv|
|
|
19
|
+
Hecks::RustBuild.run("project_rust", argv, out: STDOUT, err: STDERR)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @param domains [Array<String>] the domains, in the order their output is printed
|
|
23
|
+
# @param flags [Array<String>] the declared-domain flags every child is given
|
|
24
|
+
# @param workers [Integer] how many children may run at once
|
|
25
|
+
# @param runner [#call] what a child does with its argument list, answering an exit status
|
|
26
|
+
def initialize(domains, flags, workers, runner: PROJECT_RUST)
|
|
27
|
+
@domains = domains
|
|
28
|
+
@flags = flags
|
|
29
|
+
@workers = workers
|
|
30
|
+
@runner = runner
|
|
31
|
+
@pending = domains.each_index.to_a
|
|
32
|
+
@running = {}
|
|
33
|
+
@results = {}
|
|
34
|
+
@shown = Set.new
|
|
35
|
+
@finished = Queue.new
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Runs every domain, or until one fails and the children already running are done.
|
|
39
|
+
#
|
|
40
|
+
# @return [void]
|
|
41
|
+
# @raise [SystemExit] when a child fails: the message names every domain that did
|
|
42
|
+
def call
|
|
43
|
+
start_children
|
|
44
|
+
until @running.empty?
|
|
45
|
+
finish(*@finished.pop)
|
|
46
|
+
start_children
|
|
47
|
+
end
|
|
48
|
+
print_rest
|
|
49
|
+
abort_on_failure
|
|
50
|
+
ensure
|
|
51
|
+
stop_children
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def start_children
|
|
57
|
+
while @running.size < @workers && failed.empty? && (index = @pending.shift)
|
|
58
|
+
@running[index] = start(index)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# @return [Array<Integer>] the indexes of the children that ended badly, in domain order
|
|
63
|
+
def failed = @results.reject { |_, (_, status)| status.success? }.keys.sort
|
|
64
|
+
|
|
65
|
+
# @return [Array(Integer, Tempfile)] the child's process id and its output file
|
|
66
|
+
def start(index)
|
|
67
|
+
out = Tempfile.new("regen-project-rust")
|
|
68
|
+
pid = fork { run_child(out, [@domains[index], *@flags]) }
|
|
69
|
+
Thread.new { @finished << [index, Process.wait2(pid).last] }
|
|
70
|
+
[pid, out]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def finish(index, status)
|
|
74
|
+
_, out = @running.delete(index)
|
|
75
|
+
@results[index] = [out, status]
|
|
76
|
+
print_ready
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Prints the finished children in domain order, each once every domain before it is shown.
|
|
80
|
+
def print_ready
|
|
81
|
+
next_up = (0...@domains.size).find { |index| !@shown.include?(index) }
|
|
82
|
+
while next_up && @results.key?(next_up)
|
|
83
|
+
show(next_up)
|
|
84
|
+
next_up += 1
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# After a failure some domains were never started: shows the ones that ran, in order.
|
|
89
|
+
def print_rest
|
|
90
|
+
@results.keys.sort.each { |index| show(index) unless @shown.include?(index) }
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def show(index)
|
|
94
|
+
@shown << index
|
|
95
|
+
out, = @results.fetch(index)
|
|
96
|
+
puts "== hecks project_rust #{@domains[index]} =="
|
|
97
|
+
out.rewind
|
|
98
|
+
$stdout.write(out.read)
|
|
99
|
+
out.close!
|
|
100
|
+
puts
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def abort_on_failure
|
|
104
|
+
names = failed
|
|
105
|
+
return if names.empty?
|
|
106
|
+
|
|
107
|
+
first, *others = names
|
|
108
|
+
also = others.empty? ? "" : " (also failed: #{others.map { |index| @domains[index] }.join(", ")})"
|
|
109
|
+
abort "hecks regenerate_corpus: hecks project_rust #{@domains[first]} failed " \
|
|
110
|
+
"(#{@results.fetch(first).last.inspect})#{also}"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Ends the children still running when the parent leaves early (an interrupt, say).
|
|
114
|
+
def stop_children
|
|
115
|
+
@running.each_value do |pid, _|
|
|
116
|
+
Process.kill("TERM", pid)
|
|
117
|
+
rescue Errno::ESRCH
|
|
118
|
+
next
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# @param out [Tempfile] the child's end, which becomes its stdout and stderr
|
|
123
|
+
# @param argv [Array<String>] the arguments of `hecks project_rust`
|
|
124
|
+
# @return [void] never returns: the child leaves without the parent's exit handlers
|
|
125
|
+
def run_child(out, argv)
|
|
126
|
+
# The real descriptors, not the globals: a caller may have swapped those for a buffer.
|
|
127
|
+
STDOUT.reopen(out)
|
|
128
|
+
STDERR.reopen(out)
|
|
129
|
+
$stdout = STDOUT
|
|
130
|
+
$stderr = STDERR
|
|
131
|
+
status = child_status(argv)
|
|
132
|
+
$stdout.flush
|
|
133
|
+
exit!(status)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# @return [Integer] the exit status of the runner with the arguments
|
|
137
|
+
def child_status(argv)
|
|
138
|
+
@runner.call(argv)
|
|
139
|
+
rescue SystemExit => e
|
|
140
|
+
e.status
|
|
141
|
+
rescue StandardError => e
|
|
142
|
+
warn "#{e.class}: #{e.message}"
|
|
143
|
+
1
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "fileutils"
|
|
4
|
+
require "open3"
|
|
5
|
+
require "tmpdir"
|
|
6
|
+
|
|
7
|
+
module Hecks
|
|
8
|
+
module Tools
|
|
9
|
+
module RegenerationRun
|
|
10
|
+
# The scratch crate of a `--check`: copies of the generated tree and Cargo.toml that a
|
|
11
|
+
# projection writes into, and the comparison of what it wrote with the tree on disk. The
|
|
12
|
+
# working tree is never written.
|
|
13
|
+
module Scratch
|
|
14
|
+
# The refusal when a check finds nothing generated to compare.
|
|
15
|
+
NOT_MATERIALIZED = "hecks regeneration_run.regenerate_corpus! --check: rust/src/generated has no generated output to " \
|
|
16
|
+
"compare. It is committed: restore it from git, or run " \
|
|
17
|
+
"`hecks regeneration_run.regenerate_corpus! --confirm`, then the check."
|
|
18
|
+
|
|
19
|
+
# A scratch crate: copies of the generated tree and Cargo.toml, all `hecks build.project_rust!`
|
|
20
|
+
# writes.
|
|
21
|
+
#
|
|
22
|
+
# @param root [String] the checkout
|
|
23
|
+
# @return [String] the scratch directory
|
|
24
|
+
def scratch_crate(root)
|
|
25
|
+
abort NOT_MATERIALIZED unless File.directory?(File.join(root, "rust/src/generated/meta"))
|
|
26
|
+
|
|
27
|
+
scratch = Dir.mktmpdir("regen-codegen-check")
|
|
28
|
+
FileUtils.mkdir_p(File.join(scratch, "src"))
|
|
29
|
+
FileUtils.cp_r(File.join(root, "rust/src/generated"), File.join(scratch, "src/generated"))
|
|
30
|
+
FileUtils.cp(File.join(root, "rust/Cargo.toml"), scratch)
|
|
31
|
+
scratch
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Puts back, in the scratch crate, every module the named domains do not own, as the tree
|
|
35
|
+
# has it: a run of some domains rewrites the shared bluebooks and the grammar as its own last
|
|
36
|
+
# writer would, which is not what the whole corpus's last writer left in the tree.
|
|
37
|
+
#
|
|
38
|
+
# @param scratch [String] the scratch crate
|
|
39
|
+
# @param root [String] the checkout
|
|
40
|
+
# @param owned [Array<String>] the features of the domains that ran
|
|
41
|
+
# @return [void]
|
|
42
|
+
def restore_shared(scratch, root, owned)
|
|
43
|
+
source = File.join(root, "rust/src/generated")
|
|
44
|
+
Dir.children(source).each do |entry|
|
|
45
|
+
next if owned.include?(entry) || !File.directory?(File.join(source, entry))
|
|
46
|
+
|
|
47
|
+
FileUtils.rm_rf(File.join(scratch, "src/generated", entry))
|
|
48
|
+
FileUtils.cp_r(File.join(source, entry), File.join(scratch, "src/generated"))
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# The gate: the scratch projection must match the generated sources and Cargo.toml on disk.
|
|
53
|
+
#
|
|
54
|
+
# @param scratch [String] the scratch crate, removed here
|
|
55
|
+
# @return [Integer] 0 when it matches, 1 after printing the difference
|
|
56
|
+
def verdict(scratch)
|
|
57
|
+
same = matches_scratch?(scratch)
|
|
58
|
+
FileUtils.rm_rf(scratch)
|
|
59
|
+
same ? 0 : 1
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# @param scratch [String] the scratch crate
|
|
63
|
+
# @return [Boolean] whether it matches the tree, printing `git diff` output when it does not
|
|
64
|
+
def matches_scratch?(scratch)
|
|
65
|
+
pairs = [["rust/src/generated", File.join(scratch, "src/generated")],
|
|
66
|
+
["rust/Cargo.toml", File.join(scratch, "Cargo.toml")]]
|
|
67
|
+
pairs.map do |on_disk, projected|
|
|
68
|
+
out, status = Open3.capture2e("git", "diff", "--no-index", "--exit-code", "--", on_disk, projected)
|
|
69
|
+
print out
|
|
70
|
+
status.success?
|
|
71
|
+
end.all?
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|