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,945 @@
|
|
|
1
|
+
Hecks.bluebook "Hecks" do
|
|
2
|
+
domain_module "Deliver" do
|
|
3
|
+
vision "Take finished work into the shared line."
|
|
4
|
+
|
|
5
|
+
# A checkout's state, read and never written: nothing needs a raw `git status`, `git diff` or
|
|
6
|
+
# `git log`. The `Reading` port's adapter answers each query; the aggregate keeps no record.
|
|
7
|
+
aggregate "Workspace" do
|
|
8
|
+
description "A look at a checkout: its branch, what it changed and what it committed."
|
|
9
|
+
acknowledges :no_command_surface, "a look at a checkout: it answers the state of a checkout and changes nothing"
|
|
10
|
+
|
|
11
|
+
attribute :checkout, Place
|
|
12
|
+
identified_by :checkout
|
|
13
|
+
|
|
14
|
+
# A directory inside the repository; the current directory when a query names none.
|
|
15
|
+
value_object "Place" do
|
|
16
|
+
attribute :value, String, matches: :present
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
value_object "Word" do
|
|
20
|
+
attribute :value, String, matches: :present
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
value_object "Document" do
|
|
24
|
+
attribute :text, String
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
query "Status" do
|
|
28
|
+
description "The checkout's branch, whether it is a linked worktree, where it stands against main and origin/main, and what is changed or untracked."
|
|
29
|
+
attribute :checkout, Place, optional: true
|
|
30
|
+
returns Document
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
query "Changes" do
|
|
34
|
+
description "What the checkout changed since a ref (main by default): the diffstat, or the paths alone."
|
|
35
|
+
attribute :checkout, Place, optional: true
|
|
36
|
+
attribute :since, Word, optional: true
|
|
37
|
+
attribute :names_only, Boolean, optional: true
|
|
38
|
+
returns Document
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
query "History" do
|
|
42
|
+
description "The commits in a range, newest first (the last 20 when none is named)."
|
|
43
|
+
attribute :checkout, Place, optional: true
|
|
44
|
+
attribute :range, Word, optional: true
|
|
45
|
+
returns Document
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
query "Settings" do
|
|
49
|
+
description "What this copy resolves for each setting that can come from a variable, its own world or a default, and which one supplied it."
|
|
50
|
+
attribute :domain, Place, optional: true
|
|
51
|
+
returns Document
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
query "Doctor" do
|
|
55
|
+
description "Whether this checkout can run Hecks here: overlay files parse, the stores answer, the toolchain pin matches, and what this worktree cannot see."
|
|
56
|
+
attribute :domain, Place, optional: true
|
|
57
|
+
returns Document
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
query "Where" do
|
|
61
|
+
description "Where this checkout's domain resolves: the store each bluebook uses and why, the audience and environment with their reasons, and any overlay file this worktree lacks."
|
|
62
|
+
attribute :domain, Place, optional: true
|
|
63
|
+
returns Document
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# A commit made in a checkout under a message: asked of the git port, then recorded or declined. It commits
|
|
68
|
+
# what is staged, or the named paths, and never pushes, amends, forces, or commits onto main. Those go
|
|
69
|
+
# through `Landing` and `SendTrain`.
|
|
70
|
+
aggregate "Revision" do
|
|
71
|
+
description "One commit made in a checkout, or declined with the reason: what it says and what it is on."
|
|
72
|
+
|
|
73
|
+
attribute :run, RunKey
|
|
74
|
+
attribute :checkout, Word, optional: true
|
|
75
|
+
attribute :message, Text, optional: true
|
|
76
|
+
attribute :paths, Text, optional: true
|
|
77
|
+
attribute :sha, Word, optional: true
|
|
78
|
+
attribute :report, Report, optional: true
|
|
79
|
+
attribute :refusal, Report, optional: true
|
|
80
|
+
identified_by :run
|
|
81
|
+
|
|
82
|
+
value_object "RunKey" do
|
|
83
|
+
attribute :value, String, matches: :present
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# A directory or a commit.
|
|
87
|
+
value_object "Word" do
|
|
88
|
+
attribute :value, String, matches: :present
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# What a commit says, and which paths it stages first, separated by spaces.
|
|
92
|
+
value_object "Text" do
|
|
93
|
+
attribute :value, String
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
value_object "Report" do
|
|
97
|
+
attribute :value, String
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
lifecycle :status, default: "requested" do
|
|
101
|
+
mark :failure, "declined"
|
|
102
|
+
transition "Record" => "committed", from: "requested"
|
|
103
|
+
transition "Decline" => "declined", from: "requested"
|
|
104
|
+
mark :terminal, "committed", "declined"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
command "Make" do
|
|
108
|
+
role "Operator"
|
|
109
|
+
goal "Commit what is staged in a checkout under a message: never pushed, never amended, never onto main"
|
|
110
|
+
|
|
111
|
+
attribute :run, RunKey, sets: true
|
|
112
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
113
|
+
attribute :message, Text, sets: true
|
|
114
|
+
attribute :paths, Text, optional: true, sets: true
|
|
115
|
+
|
|
116
|
+
given("a commit says what it commits") do
|
|
117
|
+
message.value.to_s.strip != ""
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
emits CommitRequested
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
command "Record" do
|
|
124
|
+
role "System"
|
|
125
|
+
goal "Record the commit a checkout made, by the sha it has"
|
|
126
|
+
|
|
127
|
+
reference_to Revision
|
|
128
|
+
attribute :sha, Word, sets: true
|
|
129
|
+
attribute :report, Report, sets: true
|
|
130
|
+
|
|
131
|
+
emits CommitRecorded
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
command "Decline" do
|
|
135
|
+
role "System"
|
|
136
|
+
goal "Record why a commit could not be made"
|
|
137
|
+
|
|
138
|
+
reference_to Revision
|
|
139
|
+
attribute :refusal, Report, sets: true
|
|
140
|
+
|
|
141
|
+
emits CommitDeclined
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# A linked worktree opened on a new branch from main: asked of the git port, then recorded or declined. The
|
|
146
|
+
# path is the one the caller names, or a directory under the checkout's `.claude/worktrees`. `Landing` and
|
|
147
|
+
# `Landing.retire!` take it from there, so a session that cannot run `git worktree add` itself can still open one.
|
|
148
|
+
aggregate "LinkedTree" do
|
|
149
|
+
description "A linked worktree opened on a new branch from main, or declined with the reason."
|
|
150
|
+
|
|
151
|
+
attribute :run, RunKey
|
|
152
|
+
attribute :checkout, Word, optional: true
|
|
153
|
+
attribute :branch, Word, optional: true
|
|
154
|
+
attribute :path, Word, optional: true
|
|
155
|
+
attribute :sha, Word, optional: true
|
|
156
|
+
attribute :report, Report, optional: true
|
|
157
|
+
attribute :refusal, Report, optional: true
|
|
158
|
+
identified_by :run
|
|
159
|
+
|
|
160
|
+
value_object "RunKey" do
|
|
161
|
+
attribute :value, String, matches: :present
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# A directory or a branch name.
|
|
165
|
+
value_object "Word" do
|
|
166
|
+
attribute :value, String, matches: :present
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
value_object "Report" do
|
|
170
|
+
attribute :value, String
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
lifecycle :status, default: "requested" do
|
|
174
|
+
mark :failure, "declined"
|
|
175
|
+
transition "Record" => "opened", from: "requested"
|
|
176
|
+
transition "Decline" => "declined", from: "requested"
|
|
177
|
+
transition "Pulled" => "pulled", from: "requested"
|
|
178
|
+
transition "PullDeclined" => "declined", from: "requested"
|
|
179
|
+
mark :terminal, "opened", "declined", "pulled"
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
command "Add" do
|
|
183
|
+
role "Operator"
|
|
184
|
+
goal "Open a linked worktree on a new branch from main, never on main itself"
|
|
185
|
+
|
|
186
|
+
attribute :run, RunKey, sets: true
|
|
187
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
188
|
+
attribute :branch, Word, sets: true
|
|
189
|
+
attribute :path, Word, optional: true, sets: true
|
|
190
|
+
|
|
191
|
+
given("a worktree is opened on a branch other than main") do
|
|
192
|
+
branch.value.to_s.strip != "" && branch.value.to_s.strip != "main"
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
emits AddRequested
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
command "PullMain" do
|
|
199
|
+
role "Operator"
|
|
200
|
+
goal "Bring local main up to date with origin/main: fetch, fast-forward when behind, rebase its unpushed commits when diverged, refusing a dirty or mid-rebase checkout"
|
|
201
|
+
|
|
202
|
+
attribute :run, RunKey, sets: true
|
|
203
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
204
|
+
|
|
205
|
+
emits PullRequested
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
command "Pulled" do
|
|
209
|
+
role "System"
|
|
210
|
+
goal "Record where main stands once it is up to date with origin/main"
|
|
211
|
+
|
|
212
|
+
reference_to LinkedTree
|
|
213
|
+
attribute :sha, Word, sets: true
|
|
214
|
+
attribute :report, Report, sets: true
|
|
215
|
+
|
|
216
|
+
emits MainPulled
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
command "PullDeclined" do
|
|
220
|
+
role "System"
|
|
221
|
+
goal "Record why main could not be pulled"
|
|
222
|
+
|
|
223
|
+
reference_to LinkedTree
|
|
224
|
+
attribute :refusal, Report, sets: true
|
|
225
|
+
|
|
226
|
+
emits PullDeclinedRecorded
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
command "Record" do
|
|
230
|
+
role "System"
|
|
231
|
+
goal "Record the worktree a checkout opened, by the sha it stands on"
|
|
232
|
+
|
|
233
|
+
reference_to LinkedTree
|
|
234
|
+
attribute :path, Word, optional: true, sets: true
|
|
235
|
+
attribute :sha, Word, sets: true
|
|
236
|
+
attribute :report, Report, sets: true
|
|
237
|
+
|
|
238
|
+
emits AddRecorded
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
command "Decline" do
|
|
242
|
+
role "System"
|
|
243
|
+
goal "Record why a worktree could not be opened"
|
|
244
|
+
|
|
245
|
+
reference_to LinkedTree
|
|
246
|
+
attribute :refusal, Report, sets: true
|
|
247
|
+
|
|
248
|
+
emits AddDeclined
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
policy "AddWorktreeWhenRequested" do
|
|
253
|
+
on "LinkedTree.AddRequested"
|
|
254
|
+
ask :create, with: { run: :run }
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
policy "PullMainWhenRequested" do
|
|
258
|
+
on "LinkedTree.PullRequested"
|
|
259
|
+
ask :pull, with: { run: :run }
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
policy "RecordThePull" do
|
|
263
|
+
on "LinkedTree.PullAnswered"
|
|
264
|
+
trigger LinkedTree::Pulled, with: { sha: :sha, report: :report }
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
policy "DeclineThePull" do
|
|
268
|
+
on "LinkedTree.PullRefused"
|
|
269
|
+
trigger LinkedTree::PullDeclined, with: { refusal: :refusal }
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
policy "RecordTheWorktree" do
|
|
273
|
+
on "LinkedTree.CreateAnswered"
|
|
274
|
+
trigger LinkedTree::Record, with: { path: :path, sha: :sha, report: :report }
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
policy "DeclineTheWorktree" do
|
|
278
|
+
on "LinkedTree.CreateRefused"
|
|
279
|
+
trigger LinkedTree::Decline, with: { refusal: :refusal }
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
# Lands a branch on main after its mechanical gate work: comment style is fixed, the shape
|
|
283
|
+
# ledger is checked, the quick gate runs, then the branch lands and boards the push train. Rubocop
|
|
284
|
+
# autocorrect is not a step yet (no command), so offenses it would fix still stop the gate. A
|
|
285
|
+
# refusal parks the instance in needs_human; a person confirms the ledger and starts it again.
|
|
286
|
+
# A saga cannot dispatch when it starts, so a policy starts the fix. It hears ShipStarted, emitted
|
|
287
|
+
# after ShipRequested is handled, because policies run before sagas for one event: on ShipRequested
|
|
288
|
+
# the fix would finish before the saga exists to hear it.
|
|
289
|
+
policy "StartTheCommentFix" do
|
|
290
|
+
on "Shipment.ShipStarted"
|
|
291
|
+
trigger StyleRun::FixComments, with: { run: :run, paths: :paths, confirm: :confirm }
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
process_manager "GateAndBoard" do
|
|
295
|
+
correlates_by :"run.value"
|
|
296
|
+
starts_on Shipment::ShipRequested
|
|
297
|
+
|
|
298
|
+
# The command a caller dispatches to resume each stage of a faulted run (`hecks resume`).
|
|
299
|
+
resumes "gated=GateRun.Gate"
|
|
300
|
+
resumes "checking=ConformanceRun.CheckShapeLedger"
|
|
301
|
+
resumes "landing=Landing.Land"
|
|
302
|
+
resumes "boarding=SendTrain.Board"
|
|
303
|
+
|
|
304
|
+
# Each step records itself and waits. The caller dispatches the next command at top level:
|
|
305
|
+
# ConformanceRun.CheckShapeLedger, then GateRun.Gate, then Landing.Land, then SendTrain.Board.
|
|
306
|
+
# A dispatch made from inside this saga would run past the reaction depth bound.
|
|
307
|
+
transition StyleRun::StyleCompleted => "checking", from: "fixing"
|
|
308
|
+
transition ConformanceRun::ConformanceAccepted => "gated", from: %w[checking needs_human]
|
|
309
|
+
transition GateRun::GateCompleted => "landing", from: "gated"
|
|
310
|
+
transition Landing::BranchLanded => "boarding", from: "landing"
|
|
311
|
+
|
|
312
|
+
transition SendTrain::BranchPushed => "boarded", from: "boarding"
|
|
313
|
+
transition SendTrain::CarriedByEarlierPush => "boarded", from: "boarding"
|
|
314
|
+
|
|
315
|
+
transition StyleRun::StyleFaulted => "needs_human", from: "fixing"
|
|
316
|
+
transition ConformanceRun::ConformanceFaulted => "needs_human", from: "checking"
|
|
317
|
+
transition GateRun::GateFaulted => "needs_human", from: "gated"
|
|
318
|
+
transition Landing::LandingRefused => "needs_human", from: "landing"
|
|
319
|
+
transition SendTrain::PushFaulted => "needs_human", from: "boarding"
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
# Agents merge straight to local main and clean up what they merged. A landing merges a worktree's
|
|
323
|
+
# branch onto main, fast-forward first and as a merge commit when main moved; a conflict is
|
|
324
|
+
# reported and never settled, and nothing is forced or pushed. A retirement removes the worktree
|
|
325
|
+
# and its branch once the branch is on main, and refuses while it holds uncommitted work or
|
|
326
|
+
# commits main lacks, so no unpushed work is deleted. Landings queue: each takes a ticket in a line kept in
|
|
327
|
+
# the main checkout's git directory and waits its turn, first come first served, for up to the world's
|
|
328
|
+
# `landing` wait window, saying its place and the holder. The holder beats a heartbeat while it works; a
|
|
329
|
+
# ticket silent for the stale window is abandoned and removed, which the next landing's report says. A
|
|
330
|
+
# train holds the front place and lands every ready branch behind it in order, skipping one that
|
|
331
|
+
# conflicts, fails the quick gate or overlaps a started row, and telling its waiting landing why.
|
|
332
|
+
aggregate "Landing" do
|
|
333
|
+
description "One branch landed on local main, or one worktree retired: done, or refused with the reason."
|
|
334
|
+
acknowledges :key_by_value, "the run id of the LinkedTree this landing takes its checkout and branch from, and a landing whose id names no recorded tree falls back to the explicit checkout and branch, so a reference that refused an unknown tree would break the fallback",
|
|
335
|
+
of: :from
|
|
336
|
+
created_by "Landing.land!"
|
|
337
|
+
|
|
338
|
+
attribute :run, RunKey
|
|
339
|
+
attribute :confirm, Switch, optional: true
|
|
340
|
+
attribute :checkout, Word, optional: true
|
|
341
|
+
attribute :branch, Word, optional: true
|
|
342
|
+
attribute :onto, Word, optional: true
|
|
343
|
+
attribute :from, RunKey, optional: true
|
|
344
|
+
attribute :landed, Word, optional: true
|
|
345
|
+
attribute :report, Report, optional: true
|
|
346
|
+
attribute :refusal, Report, optional: true
|
|
347
|
+
identified_by :run
|
|
348
|
+
|
|
349
|
+
value_object "RunKey" do
|
|
350
|
+
attribute :value, String, matches: :present
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
# A branch, a directory or a commit.
|
|
354
|
+
value_object "Word" do
|
|
355
|
+
attribute :value, String, matches: :present
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
value_object "Report" do
|
|
359
|
+
attribute :value, String
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
value_object "Document" do
|
|
363
|
+
attribute :text, String
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
lifecycle :status, default: "requested" do
|
|
367
|
+
mark :failure, "refused"
|
|
368
|
+
transition "Record" => "landed", from: "requested"
|
|
369
|
+
transition "Clear" => "retired", from: "requested"
|
|
370
|
+
transition "Refuse" => "refused", from: "requested"
|
|
371
|
+
transition "Decline" => "refused", from: "requested"
|
|
372
|
+
transition "Convoy" => "convoyed", from: "requested"
|
|
373
|
+
mark :terminal, "landed", "refused", "retired", "convoyed"
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
command "Land" do
|
|
377
|
+
role "Operator"
|
|
378
|
+
goal "Merge a worktree's branch onto local main: fast-forward when it can be, a merge commit when main moved, never forced, never pushed"
|
|
379
|
+
|
|
380
|
+
attribute :run, RunKey, sets: true
|
|
381
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
382
|
+
attribute :branch, Word, optional: true, sets: true
|
|
383
|
+
attribute :from, RunKey, optional: true, sets: true
|
|
384
|
+
attribute :onto, Word, default: "main", sets: true
|
|
385
|
+
attribute :confirm, Switch, optional: true, sets: true
|
|
386
|
+
|
|
387
|
+
given("merges the branch onto local main needs --confirm; without it this only reports") { confirm.value == true }
|
|
388
|
+
|
|
389
|
+
emits LandingRequested
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
command "Finish" do
|
|
393
|
+
role "Operator"
|
|
394
|
+
goal "Rebase a worktree's branch onto local main, run the quick gate, land it through the queue and tidy, refusing by name at the first failure"
|
|
395
|
+
|
|
396
|
+
attribute :run, RunKey, sets: true
|
|
397
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
398
|
+
attribute :branch, Word, optional: true, sets: true
|
|
399
|
+
attribute :onto, Word, default: "main", sets: true
|
|
400
|
+
attribute :confirm, Switch, optional: true, sets: true
|
|
401
|
+
|
|
402
|
+
given("rebases, lands and tidies needs --confirm; without it this only reports") { confirm.value == true }
|
|
403
|
+
|
|
404
|
+
emits FinishRequested
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
command "Train" do
|
|
408
|
+
role "Operator"
|
|
409
|
+
goal "Hold the front place in the landing line and land every ready branch behind it, in ticket order"
|
|
410
|
+
|
|
411
|
+
attribute :run, RunKey, sets: true
|
|
412
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
413
|
+
attribute :onto, Word, default: "main", sets: true
|
|
414
|
+
attribute :confirm, Switch, optional: true, sets: true
|
|
415
|
+
|
|
416
|
+
given("lands every ready branch onto local main needs --confirm; without it this only reports") { confirm.value == true }
|
|
417
|
+
|
|
418
|
+
emits TrainRequested
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
command "Convoy" do
|
|
422
|
+
role "System"
|
|
423
|
+
goal "Record which branches the train landed and which it skipped, with the reasons"
|
|
424
|
+
|
|
425
|
+
reference_to Landing
|
|
426
|
+
attribute :report, Report, sets: true
|
|
427
|
+
|
|
428
|
+
emits TrainRan
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
command "Record" do
|
|
432
|
+
role "System"
|
|
433
|
+
goal "Record the commit main names once the branch is on it"
|
|
434
|
+
|
|
435
|
+
reference_to Landing
|
|
436
|
+
attribute :branch, Word, sets: true
|
|
437
|
+
attribute :landed, Word, sets: true
|
|
438
|
+
attribute :report, Report, sets: true
|
|
439
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
440
|
+
|
|
441
|
+
emits BranchLanded
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
command "Refuse" do
|
|
445
|
+
role "System"
|
|
446
|
+
goal "Record why a branch could not be landed"
|
|
447
|
+
|
|
448
|
+
reference_to Landing
|
|
449
|
+
attribute :refusal, Report, sets: true
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
emits LandingRefused
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
command "Retire" do
|
|
456
|
+
role "Operator"
|
|
457
|
+
goal "Remove a merged worktree and delete its branch, unless it holds uncommitted work or commits main lacks"
|
|
458
|
+
|
|
459
|
+
attribute :run, RunKey, sets: true
|
|
460
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
461
|
+
attribute :branch, Word, optional: true, sets: true
|
|
462
|
+
attribute :onto, Word, default: "main", sets: true
|
|
463
|
+
attribute :confirm, Switch, optional: true, sets: true
|
|
464
|
+
|
|
465
|
+
given("removes the worktree and deletes its branch needs --confirm; without it this only reports") { confirm.value == true }
|
|
466
|
+
|
|
467
|
+
emits RetirementRequested
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
command "Clear" do
|
|
471
|
+
role "System"
|
|
472
|
+
goal "Record that the worktree and its branch are gone"
|
|
473
|
+
|
|
474
|
+
reference_to Landing
|
|
475
|
+
attribute :branch, Word, sets: true
|
|
476
|
+
attribute :report, Report, sets: true
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
emits WorktreeRetired
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
command "Decline" do
|
|
483
|
+
role "System"
|
|
484
|
+
goal "Record why a worktree was kept"
|
|
485
|
+
|
|
486
|
+
reference_to Landing
|
|
487
|
+
attribute :refusal, Report, sets: true
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
emits RetirementDeclined
|
|
491
|
+
end
|
|
492
|
+
|
|
493
|
+
query "Outcome" do
|
|
494
|
+
description "How one landing or retirement ended: the commit main names, or why it was refused."
|
|
495
|
+
attribute :run, RunKey
|
|
496
|
+
where(run: :run)
|
|
497
|
+
order_by :run
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
query "Unlanded" do
|
|
501
|
+
description "Every branch with commits that are not on main, or with uncommitted work, and where its worktree is."
|
|
502
|
+
attribute :checkout, Word, optional: true
|
|
503
|
+
attribute :onto, Word, optional: true
|
|
504
|
+
returns Document
|
|
505
|
+
end
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
policy "MergeWhenLanding" do
|
|
509
|
+
on "Landing.LandingRequested"
|
|
510
|
+
ask :merge, with: { run: :run }
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
policy "FinishWhenFinishing" do
|
|
514
|
+
on "Landing.FinishRequested"
|
|
515
|
+
ask :finish_branch, with: { run: :run }
|
|
516
|
+
end
|
|
517
|
+
|
|
518
|
+
policy "RecordTheLanding" do
|
|
519
|
+
on "Landing.MergeAnswered"
|
|
520
|
+
trigger Landing::Record, with: { branch: :branch, landed: :landed, report: :report, checkout: :checkout }
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
policy "RunTheTrain" do
|
|
524
|
+
on "Landing.TrainRequested"
|
|
525
|
+
ask :convene, with: { run: :run }
|
|
526
|
+
end
|
|
527
|
+
|
|
528
|
+
policy "RecordTheTrain" do
|
|
529
|
+
on "Landing.ConveneAnswered"
|
|
530
|
+
trigger Landing::Convoy, with: { report: :report }
|
|
531
|
+
end
|
|
532
|
+
|
|
533
|
+
policy "RecordTheRefusedTrain" do
|
|
534
|
+
on "Landing.ConveneRefused"
|
|
535
|
+
trigger Landing::Refuse, with: { refusal: :refusal }
|
|
536
|
+
end
|
|
537
|
+
|
|
538
|
+
policy "RecordTheRefusedLanding" do
|
|
539
|
+
on "Landing.MergeRefused"
|
|
540
|
+
trigger Landing::Refuse, with: { refusal: :refusal }
|
|
541
|
+
end
|
|
542
|
+
|
|
543
|
+
# A landed branch finishes the Work row it was cut for. The LandedWork port finds the open row the
|
|
544
|
+
# branch names (the whole branch name, else the name without a leading `qa/`) and answers its key;
|
|
545
|
+
# a branch with no open row is refused by the port and nothing follows. The Tickets bluebook finishes
|
|
546
|
+
# the row that was found (FinishWorkWhenBranchLanded).
|
|
547
|
+
policy "FindWorkWhenBranchLanded" do
|
|
548
|
+
on "Landing.BranchLanded"
|
|
549
|
+
ask :find_landed_work, with: { branch: :branch }
|
|
550
|
+
end
|
|
551
|
+
|
|
552
|
+
policy "RemoveWhenRetiring" do
|
|
553
|
+
on "Landing.RetirementRequested"
|
|
554
|
+
ask :remove, with: { run: :run }
|
|
555
|
+
end
|
|
556
|
+
|
|
557
|
+
policy "RecordTheRetirement" do
|
|
558
|
+
on "Landing.RemovalAnswered"
|
|
559
|
+
trigger Landing::Clear, with: { branch: :branch, report: :report }
|
|
560
|
+
end
|
|
561
|
+
|
|
562
|
+
policy "RecordTheKeptWorktree" do
|
|
563
|
+
on "Landing.RemovalRefused"
|
|
564
|
+
trigger Landing::Decline, with: { refusal: :refusal }
|
|
565
|
+
end
|
|
566
|
+
|
|
567
|
+
# A commit that was asked for is made by the git port, which answers with its sha or refuses with why.
|
|
568
|
+
policy "CommitWhenMade" do
|
|
569
|
+
on "Revision.CommitRequested"
|
|
570
|
+
ask :commit, with: { run: :run }
|
|
571
|
+
end
|
|
572
|
+
|
|
573
|
+
policy "RecordTheCommit" do
|
|
574
|
+
on "Revision.CommitAnswered"
|
|
575
|
+
trigger Revision::Record, with: { sha: :sha, report: :report }
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
policy "DeclineTheCommit" do
|
|
579
|
+
on "Revision.CommitRefused"
|
|
580
|
+
trigger Revision::Decline, with: { refusal: :refusal }
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
# The copy of Hecks that runs the train follows what it pushed, so the next boarding and the
|
|
584
|
+
# records it keeps run the code that landed, not the code that was there when it was set up.
|
|
585
|
+
# It reacts to the recorded push and takes the pushed commit from it.
|
|
586
|
+
policy "KeepTheLauncherCurrent" do
|
|
587
|
+
on "SendTrain.BranchPushed"
|
|
588
|
+
ask :refresh, with: { run: :run, pushed: :pushed }
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
# Many agents finish together and each would push, running every pre-push check at once. A
|
|
592
|
+
# boarding waits its turn behind the push in flight from the same repository, then pushes the
|
|
593
|
+
# local branch with whatever else has landed on it, or finds an earlier push already carried it.
|
|
594
|
+
aggregate "SendTrain" do
|
|
595
|
+
description "One push of a checkout's branch, taken in turn: carried by an earlier push, pushed, or refused."
|
|
596
|
+
|
|
597
|
+
attribute :run, RunKey
|
|
598
|
+
attribute :confirm, Switch, optional: true
|
|
599
|
+
attribute :branch, Word, optional: true
|
|
600
|
+
attribute :remote, Word, optional: true
|
|
601
|
+
attribute :checkout, Word, optional: true
|
|
602
|
+
attribute :full_gate, Switch, optional: true
|
|
603
|
+
attribute :boarded, Word, optional: true
|
|
604
|
+
attribute :pushed, Word, optional: true
|
|
605
|
+
attribute :report, Report, optional: true
|
|
606
|
+
attribute :refusal, Report, optional: true
|
|
607
|
+
identified_by :run
|
|
608
|
+
|
|
609
|
+
value_object "RunKey" do
|
|
610
|
+
attribute :value, String, matches: :present
|
|
611
|
+
end
|
|
612
|
+
|
|
613
|
+
# A branch, a remote, a directory or a commit.
|
|
614
|
+
value_object "Word" do
|
|
615
|
+
attribute :value, String, matches: :present
|
|
616
|
+
end
|
|
617
|
+
|
|
618
|
+
value_object "Report" do
|
|
619
|
+
attribute :value, String
|
|
620
|
+
end
|
|
621
|
+
|
|
622
|
+
value_object "Switch" do
|
|
623
|
+
attribute :value, Boolean
|
|
624
|
+
end
|
|
625
|
+
|
|
626
|
+
lifecycle :status, default: "requested" do
|
|
627
|
+
mark :failure, "faulted"
|
|
628
|
+
transition "Send" => "pushed", from: "requested"
|
|
629
|
+
transition "Ride" => "carried", from: "requested"
|
|
630
|
+
transition "Fault" => "faulted", from: "requested"
|
|
631
|
+
transition "Summarize" => "surveyed", from: "requested"
|
|
632
|
+
mark :terminal, "carried", "faulted", "pushed", "surveyed"
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
command "Board" do
|
|
636
|
+
role "Operator"
|
|
637
|
+
goal "Push this checkout's branch once the push ahead of it lands, unless that push already carried it"
|
|
638
|
+
|
|
639
|
+
attribute :run, RunKey, sets: true
|
|
640
|
+
attribute :branch, Word, default: "main", sets: true
|
|
641
|
+
attribute :remote, Word, default: "origin", sets: true
|
|
642
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
643
|
+
# Run the whole `pre_push` stage, the suite included, which also writes the CI attestation
|
|
644
|
+
# note; without it the push runs only the `quick` stage.
|
|
645
|
+
attribute :full_gate, Switch, optional: true, sets: true
|
|
646
|
+
attribute :confirm, Switch, optional: true, sets: true
|
|
647
|
+
|
|
648
|
+
given("pushes the branch to the remote needs --confirm; without it this only reports") { confirm.value == true }
|
|
649
|
+
|
|
650
|
+
emits BoardingRequested
|
|
651
|
+
end
|
|
652
|
+
|
|
653
|
+
# A survey pushes nothing: it lists every checkout under a directory (`checkout`) whose branch
|
|
654
|
+
# has commits its remote does not, so what waits to board is known before anything boards.
|
|
655
|
+
command "Survey" do
|
|
656
|
+
role "Operator"
|
|
657
|
+
goal "List every checkout under a directory whose branch has commits its remote does not"
|
|
658
|
+
|
|
659
|
+
attribute :run, RunKey, sets: true
|
|
660
|
+
attribute :remote, Word, default: "origin", sets: true
|
|
661
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
emits SurveyRequested
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
command "Summarize" do
|
|
668
|
+
role "System"
|
|
669
|
+
goal "Record what a survey found waiting to push"
|
|
670
|
+
|
|
671
|
+
reference_to SendTrain
|
|
672
|
+
attribute :report, Report, sets: true
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
emits CheckoutsSurveyed
|
|
676
|
+
end
|
|
677
|
+
|
|
678
|
+
# The branch was pushed: every commit on it reached the remote, what this boarding carried and
|
|
679
|
+
# whatever landed on it while it waited.
|
|
680
|
+
command "Send" do
|
|
681
|
+
role "System"
|
|
682
|
+
goal "Record the commit a boarding pushed"
|
|
683
|
+
|
|
684
|
+
reference_to SendTrain
|
|
685
|
+
attribute :checkout, Word, sets: true
|
|
686
|
+
attribute :boarded, Word, sets: true
|
|
687
|
+
attribute :pushed, Word, sets: true
|
|
688
|
+
attribute :report, Report, sets: true
|
|
689
|
+
|
|
690
|
+
|
|
691
|
+
emits BranchPushed
|
|
692
|
+
end
|
|
693
|
+
|
|
694
|
+
# An earlier push already took the boarded commit to the remote, so this one pushed nothing.
|
|
695
|
+
command "Ride" do
|
|
696
|
+
role "System"
|
|
697
|
+
goal "Record that an earlier push already carried the boarded commit"
|
|
698
|
+
|
|
699
|
+
reference_to SendTrain
|
|
700
|
+
attribute :checkout, Word, sets: true
|
|
701
|
+
attribute :boarded, Word, sets: true
|
|
702
|
+
attribute :report, Report, sets: true
|
|
703
|
+
|
|
704
|
+
|
|
705
|
+
emits CarriedByEarlierPush
|
|
706
|
+
end
|
|
707
|
+
|
|
708
|
+
command "Fault" do
|
|
709
|
+
role "System"
|
|
710
|
+
goal "Record why a boarding could not push"
|
|
711
|
+
|
|
712
|
+
reference_to SendTrain
|
|
713
|
+
attribute :refusal, Report, sets: true
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
emits PushFaulted
|
|
717
|
+
end
|
|
718
|
+
|
|
719
|
+
query "Outcome" do
|
|
720
|
+
description "How one boarding ended: pushed, carried by an earlier push, or why it failed."
|
|
721
|
+
attribute :run, RunKey
|
|
722
|
+
where(run: :run)
|
|
723
|
+
order_by :run
|
|
724
|
+
end
|
|
725
|
+
end
|
|
726
|
+
|
|
727
|
+
# A boarding is carried by the train, which runs its steps in order while it holds the line: the
|
|
728
|
+
# Hecks domain's mint, then the settlement and the push. A shape that did not move passes straight
|
|
729
|
+
# through; a refused mint is the train's refusal, named, and nothing is pushed.
|
|
730
|
+
policy "CarryWhenBoarded" do
|
|
731
|
+
on "SendTrain.BoardingRequested"
|
|
732
|
+
ask :carry, with: { run: :run }
|
|
733
|
+
end
|
|
734
|
+
|
|
735
|
+
policy "RecordThePush" do
|
|
736
|
+
on "SendTrain.TrainAnswered"
|
|
737
|
+
where { outcome.value == "pushed" }
|
|
738
|
+
trigger SendTrain::Send, with: { checkout: :checkout, boarded: :boarded, pushed: :pushed, report: :report }
|
|
739
|
+
end
|
|
740
|
+
|
|
741
|
+
policy "RecordTheRide" do
|
|
742
|
+
on "SendTrain.TrainAnswered"
|
|
743
|
+
where { outcome.value == "carried" }
|
|
744
|
+
trigger SendTrain::Ride, with: { checkout: :checkout, boarded: :boarded, report: :report }
|
|
745
|
+
end
|
|
746
|
+
|
|
747
|
+
policy "RecordTheRefusedPush" do
|
|
748
|
+
on "SendTrain.TrainRefused"
|
|
749
|
+
trigger SendTrain::Fault, with: { refusal: :refusal }
|
|
750
|
+
end
|
|
751
|
+
|
|
752
|
+
policy "SurveyWhenAsked" do
|
|
753
|
+
on "SendTrain.SurveyRequested"
|
|
754
|
+
ask :tally, with: { run: :run }
|
|
755
|
+
end
|
|
756
|
+
|
|
757
|
+
policy "RecordTheSurvey" do
|
|
758
|
+
on "SendTrain.SurveyAnswered"
|
|
759
|
+
trigger SendTrain::Summarize, with: { report: :report }
|
|
760
|
+
end
|
|
761
|
+
|
|
762
|
+
policy "RecordTheRefusedSurvey" do
|
|
763
|
+
on "SendTrain.SurveyRefused"
|
|
764
|
+
trigger SendTrain::Fault, with: { refusal: :refusal }
|
|
765
|
+
end
|
|
766
|
+
|
|
767
|
+
# Deploys stay by hand: a push that reached the remote says a deploy is ready, and nothing more.
|
|
768
|
+
# Like KeepTheLauncherCurrent, it reacts to the recorded push and takes the pushed commit from it.
|
|
769
|
+
policy "AnnounceWhenPushed" do
|
|
770
|
+
on "SendTrain.BranchPushed"
|
|
771
|
+
ask :announce, with: { run: :run, pushed: :pushed }
|
|
772
|
+
end
|
|
773
|
+
|
|
774
|
+
# The request that starts GateAndBoard, under its own identity so the Landing record it leads to
|
|
775
|
+
# is a separate one: Land creates a Landing under the same run key, and that would collide.
|
|
776
|
+
aggregate "Shipment" do
|
|
777
|
+
description "One request to fix, gate, land and board a branch: the gate-and-board saga starts on it."
|
|
778
|
+
|
|
779
|
+
attribute :run, RunKey
|
|
780
|
+
attribute :confirm, Switch, optional: true
|
|
781
|
+
attribute :branch, Word
|
|
782
|
+
identified_by :run
|
|
783
|
+
|
|
784
|
+
value_object "RunKey" do
|
|
785
|
+
attribute :value, String, matches: :present
|
|
786
|
+
end
|
|
787
|
+
|
|
788
|
+
# A branch, a directory or a commit.
|
|
789
|
+
value_object "Word" do
|
|
790
|
+
attribute :value, String, matches: :present
|
|
791
|
+
end
|
|
792
|
+
|
|
793
|
+
command "Ship" do
|
|
794
|
+
role "Operator"
|
|
795
|
+
goal "Start the gate-and-board saga for a branch: fix comment style, check the ledger, gate, land on main, board the push train"
|
|
796
|
+
|
|
797
|
+
attribute :run, RunKey, sets: true
|
|
798
|
+
attribute :branch, Word, sets: true
|
|
799
|
+
attribute :checkout, Word
|
|
800
|
+
attribute :paths, Word, default: "lib/hecks,spec"
|
|
801
|
+
attribute :confirm, Switch, optional: true, sets: true
|
|
802
|
+
|
|
803
|
+
given("lands the branch and pushes it to the remote needs --confirm; without it this only reports") { confirm.value == true }
|
|
804
|
+
|
|
805
|
+
emits ShipRequested
|
|
806
|
+
emits ShipStarted
|
|
807
|
+
end
|
|
808
|
+
end
|
|
809
|
+
|
|
810
|
+
aggregate "ReviewRequest" do
|
|
811
|
+
description "One pull request opened or squash-merged on GitHub, and what GitHub answered."
|
|
812
|
+
|
|
813
|
+
attribute :run, RunKey
|
|
814
|
+
attribute :confirm, Switch, optional: true
|
|
815
|
+
attribute :branch, Word, optional: true
|
|
816
|
+
attribute :base, Word, optional: true
|
|
817
|
+
attribute :number, Word, optional: true
|
|
818
|
+
attribute :url, Word, optional: true
|
|
819
|
+
attribute :report, Report, optional: true
|
|
820
|
+
attribute :refusal, Report, optional: true
|
|
821
|
+
identified_by :run
|
|
822
|
+
|
|
823
|
+
value_object "RunKey" do
|
|
824
|
+
attribute :value, String, matches: :present
|
|
825
|
+
end
|
|
826
|
+
|
|
827
|
+
# A branch, a number or a URL.
|
|
828
|
+
value_object "Word" do
|
|
829
|
+
attribute :value, String, matches: :present
|
|
830
|
+
end
|
|
831
|
+
|
|
832
|
+
value_object "Report" do
|
|
833
|
+
attribute :value, String
|
|
834
|
+
end
|
|
835
|
+
|
|
836
|
+
value_object "Document" do
|
|
837
|
+
attribute :text, String
|
|
838
|
+
end
|
|
839
|
+
|
|
840
|
+
lifecycle :status, default: "requested" do
|
|
841
|
+
mark :failure, "refused"
|
|
842
|
+
transition "Record" => "opened", from: "requested"
|
|
843
|
+
transition "Confirm" => "merged", from: "requested"
|
|
844
|
+
transition "Refuse" => "refused", from: "requested"
|
|
845
|
+
mark :terminal, "opened", "merged", "refused"
|
|
846
|
+
end
|
|
847
|
+
|
|
848
|
+
command "Open" do
|
|
849
|
+
role "Operator"
|
|
850
|
+
goal "Open a pull request from a branch onto a base, and keep the number and URL GitHub gives it"
|
|
851
|
+
|
|
852
|
+
attribute :run, RunKey, sets: true
|
|
853
|
+
attribute :branch, Word, sets: true
|
|
854
|
+
attribute :base, Word, default: "main", sets: true
|
|
855
|
+
attribute :confirm, Switch, optional: true, sets: true
|
|
856
|
+
|
|
857
|
+
given("opens a pull request on GitHub needs --confirm; without it this only reports") { confirm.value == true }
|
|
858
|
+
|
|
859
|
+
emits "PullRequestRequested"
|
|
860
|
+
end
|
|
861
|
+
|
|
862
|
+
command "Take" do
|
|
863
|
+
role "Operator"
|
|
864
|
+
goal "Squash-merge an open pull request by its number; never with an admin override"
|
|
865
|
+
|
|
866
|
+
attribute :run, RunKey, sets: true
|
|
867
|
+
attribute :number, Word, sets: true
|
|
868
|
+
attribute :confirm, Switch, optional: true, sets: true
|
|
869
|
+
|
|
870
|
+
given("squash-merges the pull request on GitHub needs --confirm; without it this only reports") { confirm.value == true }
|
|
871
|
+
|
|
872
|
+
emits "PullRequestMergeRequested"
|
|
873
|
+
end
|
|
874
|
+
|
|
875
|
+
command "Record" do
|
|
876
|
+
role "System"
|
|
877
|
+
goal "Record the number and URL GitHub gave an opened pull request"
|
|
878
|
+
|
|
879
|
+
reference_to ReviewRequest
|
|
880
|
+
attribute :number, Word, sets: true
|
|
881
|
+
attribute :url, Word, sets: true
|
|
882
|
+
attribute :report, Report, sets: true
|
|
883
|
+
|
|
884
|
+
emits "PullRequestOpened"
|
|
885
|
+
end
|
|
886
|
+
|
|
887
|
+
command "Confirm" do
|
|
888
|
+
role "System"
|
|
889
|
+
goal "Record that GitHub squash-merged a pull request"
|
|
890
|
+
|
|
891
|
+
reference_to ReviewRequest
|
|
892
|
+
attribute :number, Word, sets: true
|
|
893
|
+
attribute :report, Report, sets: true
|
|
894
|
+
|
|
895
|
+
emits "PullRequestMerged"
|
|
896
|
+
end
|
|
897
|
+
|
|
898
|
+
command "Refuse" do
|
|
899
|
+
role "System"
|
|
900
|
+
goal "Record why GitHub refused a pull request"
|
|
901
|
+
|
|
902
|
+
reference_to ReviewRequest
|
|
903
|
+
attribute :refusal, Report, sets: true
|
|
904
|
+
|
|
905
|
+
emits "PullRequestRefused"
|
|
906
|
+
end
|
|
907
|
+
|
|
908
|
+
query "Status" do
|
|
909
|
+
description "The state of one pull request on GitHub: its number, state, URL and checks, as text."
|
|
910
|
+
attribute :number, Word
|
|
911
|
+
returns Document
|
|
912
|
+
end
|
|
913
|
+
end
|
|
914
|
+
|
|
915
|
+
policy "CreatePullRequestWhenRequested" do
|
|
916
|
+
on "ReviewRequest.PullRequestRequested"
|
|
917
|
+
ask :create, with: { run: :run }
|
|
918
|
+
end
|
|
919
|
+
|
|
920
|
+
policy "RecordTheOpenedPullRequest" do
|
|
921
|
+
on "ReviewRequest.OpenAnswered"
|
|
922
|
+
trigger ReviewRequest::Record, with: { number: :number, url: :url, report: :report }
|
|
923
|
+
end
|
|
924
|
+
|
|
925
|
+
policy "RecordTheRefusedOpen" do
|
|
926
|
+
on "ReviewRequest.OpenRefused"
|
|
927
|
+
trigger ReviewRequest::Refuse, with: { refusal: :refusal }
|
|
928
|
+
end
|
|
929
|
+
|
|
930
|
+
policy "SquashWhenMergeRequested" do
|
|
931
|
+
on "ReviewRequest.PullRequestMergeRequested"
|
|
932
|
+
ask :squash, with: { run: :run }
|
|
933
|
+
end
|
|
934
|
+
|
|
935
|
+
policy "RecordTheMergedPullRequest" do
|
|
936
|
+
on "ReviewRequest.SquashAnswered"
|
|
937
|
+
trigger ReviewRequest::Confirm, with: { number: :number, report: :report }
|
|
938
|
+
end
|
|
939
|
+
|
|
940
|
+
policy "RecordTheRefusedMerge" do
|
|
941
|
+
on "ReviewRequest.SquashRefused"
|
|
942
|
+
trigger ReviewRequest::Refuse, with: { refusal: :refusal }
|
|
943
|
+
end
|
|
944
|
+
end
|
|
945
|
+
end
|