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
|
@@ -11,12 +11,14 @@
|
|
|
11
11
|
# or not GitHub answers: each lifecycle event asks the port, and a refused ask is recorded on the
|
|
12
12
|
# finding as a sync failure that a later run retries.
|
|
13
13
|
#
|
|
14
|
-
# An Adr is a decision record with its own lifecycle, linked to the finding it settles.
|
|
14
|
+
# An Adr is a decision record with its own lifecycle, linked to the finding it settles. A Work is a
|
|
15
|
+
# step of the plan a decision carries, and stays inside Hecks.
|
|
15
16
|
Hecks.bluebook "Tickets" do
|
|
16
17
|
vision "Track what Hecks needs, decide it, ship it, and drive GitHub from the record."
|
|
17
18
|
|
|
18
19
|
aggregate "Finding" do
|
|
19
20
|
description "One thing observed about Hecks that needs a decision or a fix: reported, triaged, then resolved or dismissed."
|
|
21
|
+
created_by "Finding.report!"
|
|
20
22
|
|
|
21
23
|
attribute :finding, FindingKey
|
|
22
24
|
attribute :title, Title
|
|
@@ -109,22 +111,6 @@ Hecks.bluebook "Tickets" do
|
|
|
109
111
|
emits "RunFindingReported"
|
|
110
112
|
end
|
|
111
113
|
|
|
112
|
-
# A lane that stood behind the lane it follows for longer than its Lane row allows reports
|
|
113
|
-
# itself. The alert key names the finding and carries the day, so a lane that stays late files
|
|
114
|
-
# one finding a day: the same key again is the same finding.
|
|
115
|
-
command "ReportLag" do
|
|
116
|
-
goal "Record a lane that has stood behind the lane it follows too long as a finding"
|
|
117
|
-
|
|
118
|
-
attribute :finding, FindingKey, sets: true
|
|
119
|
-
attribute :body, Body, sets: true
|
|
120
|
-
|
|
121
|
-
sets :fingerprint, to: "lane-lag"
|
|
122
|
-
sets :title, to: "A lane is behind the lane it follows"
|
|
123
|
-
sets :source, to: "qa_loop"
|
|
124
|
-
|
|
125
|
-
emits "LagFindingReported"
|
|
126
|
-
end
|
|
127
|
-
|
|
128
114
|
command "Triage" do
|
|
129
115
|
role "Maintainer"
|
|
130
116
|
goal "Give a finding its kind and severity"
|
|
@@ -179,6 +165,7 @@ Hecks.bluebook "Tickets" do
|
|
|
179
165
|
|
|
180
166
|
command "RecordIssue" do
|
|
181
167
|
goal "Record the GitHub issue number once the issue is opened"
|
|
168
|
+
audience :record
|
|
182
169
|
|
|
183
170
|
reference_to Finding
|
|
184
171
|
attribute :issue_number, Number, sets: true
|
|
@@ -189,6 +176,7 @@ Hecks.bluebook "Tickets" do
|
|
|
189
176
|
|
|
190
177
|
command "RecordSyncFailure" do
|
|
191
178
|
goal "Record that GitHub could not be driven, so a later run retries"
|
|
179
|
+
audience :record
|
|
192
180
|
|
|
193
181
|
reference_to Finding
|
|
194
182
|
attribute :sync_failure, Body, sets: true
|
|
@@ -206,6 +194,7 @@ Hecks.bluebook "Tickets" do
|
|
|
206
194
|
|
|
207
195
|
aggregate "Adr" do
|
|
208
196
|
description "A decision record: drafted, accepted, and possibly superseded, linked to the tickets it settles."
|
|
197
|
+
created_by "Adr.draft!"
|
|
209
198
|
|
|
210
199
|
attribute :adr, AdrNumber
|
|
211
200
|
attribute :title, AdrTitle
|
|
@@ -269,6 +258,237 @@ Hecks.bluebook "Tickets" do
|
|
|
269
258
|
end
|
|
270
259
|
end
|
|
271
260
|
|
|
261
|
+
# A step of a plan, held under the decision it carries out. It drives nothing outside: planned
|
|
262
|
+
# work is the maintainer's own list, not an issue.
|
|
263
|
+
aggregate "Work" do
|
|
264
|
+
description "One step of a plan: planned, started, then done or dropped, under the decision it carries out."
|
|
265
|
+
created_by "Work.plan!"
|
|
266
|
+
|
|
267
|
+
attribute :work, WorkKey
|
|
268
|
+
attribute :title, WorkTitle
|
|
269
|
+
attribute :detail, WorkText, optional: true
|
|
270
|
+
attribute :step, Step, optional: true
|
|
271
|
+
attribute :reason, WorkText, optional: true
|
|
272
|
+
attribute :claimed_by, Claimant, optional: true
|
|
273
|
+
attribute :claimed_at, ClaimedAt, optional: true
|
|
274
|
+
attribute :area, list_of(Word), optional: true
|
|
275
|
+
attribute :budget_minutes, Minutes, optional: true
|
|
276
|
+
reference_to Adr, as: :decision, optional: true
|
|
277
|
+
identified_by :work
|
|
278
|
+
|
|
279
|
+
# A path prefix or glob a claim covers. Two areas overlap by `Hecks::Adapters::AreaOverlap`;
|
|
280
|
+
# a row with no area claims nothing.
|
|
281
|
+
value_object "Word" do
|
|
282
|
+
attribute :value, String, matches: :present
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
# The session that claimed a started step, named as the session names itself. A step back in the
|
|
286
|
+
# plan holds the empty claimant; `Start` refuses one that names nobody.
|
|
287
|
+
value_object "Claimant" do
|
|
288
|
+
attribute :value, String, default: ""
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
# When the claim was taken, as the caller reads the clock: an ISO 8601 instant. Empty while the
|
|
292
|
+
# step is unclaimed.
|
|
293
|
+
value_object "ClaimedAt" do
|
|
294
|
+
attribute :value, String, default: ""
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
# How long a claim may run, in whole minutes. A row with none, or zero, has no budget; a step
|
|
298
|
+
# back in the plan holds zero.
|
|
299
|
+
value_object "Minutes" do
|
|
300
|
+
attribute :value, Integer
|
|
301
|
+
|
|
302
|
+
invariant("a time budget is not negative") { !value.negative? }
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
# What a query answered from outside the domain returns: its lines.
|
|
306
|
+
value_object "Document" do
|
|
307
|
+
attribute :text, String
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
value_object "WorkKey" do
|
|
311
|
+
attribute :value, String, matches: :present
|
|
312
|
+
|
|
313
|
+
invariant("a piece of work is named") { !value.to_s.empty? }
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
value_object "WorkTitle" do
|
|
317
|
+
attribute :value, String
|
|
318
|
+
|
|
319
|
+
invariant("a piece of work has a title") { !value.to_s.empty? }
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
value_object "WorkText" do
|
|
323
|
+
attribute :value, String
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
# Where the work stands in its plan: step 0 comes first.
|
|
327
|
+
value_object "Step" do
|
|
328
|
+
attribute :value, Integer
|
|
329
|
+
|
|
330
|
+
invariant("a step is not negative") { !value.negative? }
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
lifecycle :status, default: "planned" do
|
|
334
|
+
transition "Start" => "started", from: "planned"
|
|
335
|
+
transition "Release" => "planned", from: "started"
|
|
336
|
+
transition "Yield" => "planned", from: "started"
|
|
337
|
+
transition "Finish" => "done", from: %w[planned started]
|
|
338
|
+
transition "Drop" => "dropped", from: %w[planned started]
|
|
339
|
+
transition "Lapse" => "dropped", from: %w[planned started]
|
|
340
|
+
transition "Reopen" => "planned", from: %w[done dropped]
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
command "Plan" do
|
|
344
|
+
role "Maintainer"
|
|
345
|
+
goal "Enter a step of a plan, optionally under the decision it carries out"
|
|
346
|
+
|
|
347
|
+
attribute :work, WorkKey, sets: true
|
|
348
|
+
attribute :title, WorkTitle, sets: true
|
|
349
|
+
# The detail and area default to none, so the event always carries them and
|
|
350
|
+
# ComposeBriefWhenPlanned in Coder can read them from any plan.
|
|
351
|
+
attribute :detail, WorkText, optional: true, sets: true, default: { value: "" }
|
|
352
|
+
attribute :step, Step, optional: true, sets: true
|
|
353
|
+
attribute :area, list_of(Word), optional: true, sets: true, default: []
|
|
354
|
+
reference_to Adr, as: :decision, optional: true
|
|
355
|
+
|
|
356
|
+
sets :decision
|
|
357
|
+
|
|
358
|
+
emits "WorkPlanned"
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
# A step still open takes what a later look at it found: the row stays one, its title and
|
|
362
|
+
# detail move.
|
|
363
|
+
command "Revise" do
|
|
364
|
+
goal "Replace an open step's title and detail with what a later look found"
|
|
365
|
+
|
|
366
|
+
reference_to Work
|
|
367
|
+
attribute :title, WorkTitle, sets: true
|
|
368
|
+
attribute :detail, WorkText, sets: true
|
|
369
|
+
|
|
370
|
+
emits "WorkRevised"
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
# A started step is claimed: the second Start on it is refused, since only a planned step starts.
|
|
374
|
+
command "Start" do
|
|
375
|
+
role "Maintainer"
|
|
376
|
+
goal "Claim a planned step for one session, recording who claimed it and when"
|
|
377
|
+
|
|
378
|
+
reference_to Work
|
|
379
|
+
attribute :claimed_by, Claimant, sets: true
|
|
380
|
+
attribute :claimed_at, ClaimedAt, sets: true
|
|
381
|
+
attribute :area, list_of(Word), optional: true, sets: true
|
|
382
|
+
attribute :budget_minutes, Minutes, optional: true, sets: true
|
|
383
|
+
|
|
384
|
+
given("a claim names its claimant") { !claimed_by.value.to_s.empty? }
|
|
385
|
+
given("a claim records when it was taken") { !claimed_at.value.to_s.empty? }
|
|
386
|
+
|
|
387
|
+
emits "WorkStarted"
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
# The claim's area overlapped another started step's, or it would start more steps than the
|
|
391
|
+
# cap allows: the WorkAreas or WorkLimits port refuses it by name, and the step goes back to
|
|
392
|
+
# the plan with the refusal as its reason.
|
|
393
|
+
command "Yield" do
|
|
394
|
+
goal "Return a step whose area another started step holds, with the refusal"
|
|
395
|
+
|
|
396
|
+
reference_to Work
|
|
397
|
+
attribute :reason, WorkText, sets: true
|
|
398
|
+
|
|
399
|
+
sets :claimed_by, to: ""
|
|
400
|
+
sets :claimed_at, to: ""
|
|
401
|
+
sets :area, to: []
|
|
402
|
+
sets :budget_minutes, to: 0
|
|
403
|
+
|
|
404
|
+
emits "WorkYielded"
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
# A claim gone stale returns its step to the plan, so the next session can claim it.
|
|
408
|
+
command "Release" do
|
|
409
|
+
goal "Return a started step to planned, releasing its claim"
|
|
410
|
+
|
|
411
|
+
reference_to Work
|
|
412
|
+
|
|
413
|
+
sets :claimed_by, to: ""
|
|
414
|
+
sets :claimed_at, to: ""
|
|
415
|
+
sets :area, to: []
|
|
416
|
+
sets :budget_minutes, to: 0
|
|
417
|
+
|
|
418
|
+
emits "WorkReleased"
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
command "Finish" do
|
|
422
|
+
role "Maintainer"
|
|
423
|
+
goal "Record that a step is done"
|
|
424
|
+
|
|
425
|
+
reference_to Work
|
|
426
|
+
|
|
427
|
+
emits "WorkFinished"
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
command "Drop" do
|
|
431
|
+
role "Maintainer"
|
|
432
|
+
goal "Set a step aside without doing it, with the reason"
|
|
433
|
+
|
|
434
|
+
reference_to Work
|
|
435
|
+
attribute :reason, WorkText, sets: true
|
|
436
|
+
|
|
437
|
+
emits "WorkDropped"
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
# A step whose cause came back (a spec red again after it was cleared) is planned again, with
|
|
441
|
+
# the new title and detail.
|
|
442
|
+
command "Reopen" do
|
|
443
|
+
goal "Return a finished or dropped step to planned because its cause returned"
|
|
444
|
+
|
|
445
|
+
reference_to Work
|
|
446
|
+
attribute :title, WorkTitle, sets: true
|
|
447
|
+
attribute :detail, WorkText, optional: true, sets: true
|
|
448
|
+
|
|
449
|
+
emits "WorkReopened"
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
# A superseded decision's plan no longer stands, so its undone steps are dropped with it.
|
|
453
|
+
command "Lapse" do
|
|
454
|
+
goal "Drop a step whose decision was superseded"
|
|
455
|
+
|
|
456
|
+
reference_to Work
|
|
457
|
+
|
|
458
|
+
sets :reason, to: "its decision was superseded"
|
|
459
|
+
|
|
460
|
+
emits "WorkLapsed"
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
query "Undone" do
|
|
464
|
+
description "Every step not yet done or dropped, in plan order."
|
|
465
|
+
where(status: { in: "planned,started" })
|
|
466
|
+
order_by :step
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
# The first step still planned in plan order: the next one a coder session claims.
|
|
470
|
+
query "NextPlanned" do
|
|
471
|
+
description "The oldest step not yet claimed, in plan order: the brief a coder session reads next."
|
|
472
|
+
where(status: "planned")
|
|
473
|
+
order_by :step
|
|
474
|
+
limit 1
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
query "Under" do
|
|
478
|
+
description "Every step of the plan one decision carries, in plan order."
|
|
479
|
+
attribute :adr, String
|
|
480
|
+
where(decision: :adr)
|
|
481
|
+
order_by :step
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
query "UndoneUnder" do
|
|
485
|
+
description "The steps of one decision's plan not yet done or dropped: the ones its superseding drops."
|
|
486
|
+
attribute :adr, String
|
|
487
|
+
where(decision: :adr, status: { in: "planned,started" })
|
|
488
|
+
order_by :step
|
|
489
|
+
end
|
|
490
|
+
end
|
|
491
|
+
|
|
272
492
|
# Each lifecycle event drives GitHub. A finding's own state never waits on the answer.
|
|
273
493
|
policy "OpenIssueWhenReported" do
|
|
274
494
|
on "Finding.FindingReported"
|
|
@@ -280,11 +500,6 @@ Hecks.bluebook "Tickets" do
|
|
|
280
500
|
ask :open_issue, with: { finding: :finding }
|
|
281
501
|
end
|
|
282
502
|
|
|
283
|
-
policy "OpenIssueWhenLagReported" do
|
|
284
|
-
on "Finding.LagFindingReported"
|
|
285
|
-
ask :open_issue, with: { finding: :finding }
|
|
286
|
-
end
|
|
287
|
-
|
|
288
503
|
policy "LabelIssueWhenTriaged" do
|
|
289
504
|
on "Finding.FindingTriaged"
|
|
290
505
|
ask :label_issue, with: { finding: :finding }
|
|
@@ -310,23 +525,103 @@ Hecks.bluebook "Tickets" do
|
|
|
310
525
|
ask :reopen_issue, with: { finding: :finding }
|
|
311
526
|
end
|
|
312
527
|
|
|
528
|
+
# A started step with an area asks the WorkAreas port whether another started step holds any of it.
|
|
529
|
+
policy "CheckAreaWhenStarted" do
|
|
530
|
+
on "Work.WorkStarted"
|
|
531
|
+
ask :check_area, with: { work: :work }
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
policy "YieldWhenAreaTaken" do
|
|
535
|
+
on "Work.AreaRefused"
|
|
536
|
+
trigger Work::Yield, with: { reason: :refusal }
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
# A started step asks the WorkLimits port whether it is one too many for the concurrency cap. It is
|
|
540
|
+
# declared after the area check, so a step that clashes is already back in the plan when the cap
|
|
541
|
+
# looks, and the cap yields only a step still started.
|
|
542
|
+
policy "CheckCapWhenStarted" do
|
|
543
|
+
on "Work.WorkStarted"
|
|
544
|
+
ask :check_cap, with: { work: :work }
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
policy "YieldWhenCapReached" do
|
|
548
|
+
on "Work.CapRefused"
|
|
549
|
+
trigger Work::Yield, with: { reason: :refusal }
|
|
550
|
+
end
|
|
551
|
+
|
|
552
|
+
# A superseded decision takes its undone steps with it.
|
|
553
|
+
policy "LapseWorkWhenSuperseded" do
|
|
554
|
+
on "Adr.AdrSuperseded"
|
|
555
|
+
for_each "Work.UndoneUnder"
|
|
556
|
+
trigger Work::Lapse, with: { work: :work }
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
# A coder's submitted branch is named for its work step, so the branch is the step's key and the
|
|
560
|
+
# policy routes it with no parsing (`with:` only routes fields). A branch naming no step is refused
|
|
561
|
+
# by the Finish command: the refusal names Work.
|
|
562
|
+
policy "FinishWhenWorkSubmitted" do
|
|
563
|
+
on "Submission.WorkSubmitted"
|
|
564
|
+
trigger Work::Finish, with: { work: :branch }
|
|
565
|
+
end
|
|
566
|
+
|
|
567
|
+
# A branch that landed on local main finishes the step it was cut for. The Landing's LandedWork
|
|
568
|
+
# port found the open step the branch names (the whole branch name, else the name without a leading
|
|
569
|
+
# `qa/`) and answered its key; a branch with no open step is refused there and never reaches here.
|
|
570
|
+
policy "FinishWorkWhenBranchLanded" do
|
|
571
|
+
on "Landing.LandedWorkFound"
|
|
572
|
+
trigger Work::Finish, with: { work: :branch }
|
|
573
|
+
end
|
|
574
|
+
|
|
313
575
|
# A conformance or gate run that faults files its own finding.
|
|
314
576
|
policy "ReportWhenConformanceFaulted" do
|
|
315
577
|
on "ConformanceRun.ConformanceFaulted"
|
|
316
578
|
trigger Finding::ReportFailedRun, with: { finding: :run, body: :refusal }
|
|
317
579
|
end
|
|
318
580
|
|
|
319
|
-
# A watch that finds a lane late faults it, and the fault files its finding.
|
|
320
|
-
policy "ReportWhenLaneLags" do
|
|
321
|
-
on "PromotionRun.LaneLagged"
|
|
322
|
-
trigger Finding::ReportLag, with: { finding: :alert_key, body: :refusal }
|
|
323
|
-
end
|
|
324
|
-
|
|
325
581
|
policy "ReportWhenGateFaulted" do
|
|
326
582
|
on "GateRun.GateFaulted"
|
|
327
583
|
trigger Finding::ReportFailedRun, with: { finding: :run, body: :refusal }
|
|
328
584
|
end
|
|
329
585
|
|
|
586
|
+
# A spec file that went red on main is a step QA picks up: `Work.undone` lists it. The spec's own key is
|
|
587
|
+
# the step's key, so a second red run, which only updates the spec, plans nothing twice.
|
|
588
|
+
policy "PlanWorkWhenSpecWentRed" do
|
|
589
|
+
on "RedSpec.SpecWentRed"
|
|
590
|
+
trigger Work::Plan, with: { work: :spec, title: :title, detail: :detail }
|
|
591
|
+
end
|
|
592
|
+
|
|
593
|
+
# A file that fails again after it was cleared plans its finished step again.
|
|
594
|
+
policy "ReopenWorkWhenSpecWentRedAgain" do
|
|
595
|
+
on "RedSpec.SpecWentRedAgain"
|
|
596
|
+
trigger Work::Reopen, with: { work: :spec, title: :title, detail: :detail }
|
|
597
|
+
end
|
|
598
|
+
|
|
599
|
+
# The run that no longer fails the file closes its step.
|
|
600
|
+
policy "FinishWorkWhenSpecWentGreen" do
|
|
601
|
+
on "RedSpec.SpecWentGreen"
|
|
602
|
+
trigger Work::Finish, with: { work: :spec }
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
# QA's push check: a push that is due beyond the world's thresholds is one step, `push-due`. A look
|
|
606
|
+
# that finds it already open revises its detail; a look that finds it no longer due finishes it.
|
|
607
|
+
policy "PlanWorkWhenPushDue" do
|
|
608
|
+
on "PushNudge.PushDueRead"
|
|
609
|
+
where { due.value == "yes" && raised.value == "no" }
|
|
610
|
+
trigger Work::Plan, with: { work: :work, title: :title, detail: :detail }
|
|
611
|
+
end
|
|
612
|
+
|
|
613
|
+
policy "ReviseWorkWhenPushStillDue" do
|
|
614
|
+
on "PushNudge.PushDueRead"
|
|
615
|
+
where { due.value == "yes" && raised.value == "yes" }
|
|
616
|
+
trigger Work::Revise, with: { work: :work, title: :title, detail: :detail }
|
|
617
|
+
end
|
|
618
|
+
|
|
619
|
+
policy "FinishWorkWhenPushSettled" do
|
|
620
|
+
on "PushNudge.PushDueRead"
|
|
621
|
+
where { due.value == "no" && raised.value == "yes" }
|
|
622
|
+
trigger Work::Finish, with: { work: :work }
|
|
623
|
+
end
|
|
624
|
+
|
|
330
625
|
policy "RecordTheIssue" do
|
|
331
626
|
on "Finding.IssueOpened"
|
|
332
627
|
trigger Finding::RecordIssue, with: { issue_number: :issue_number }
|
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
Hecks.hecksagon "Tickets" do
|
|
4
4
|
attaches "Governance"
|
|
5
5
|
persisted_by "Memory"
|
|
6
|
+
|
|
7
|
+
# The coder's submitted branch, which finishes its work step. Declarative: the Coder domain
|
|
8
|
+
# emits it, and the FinishWhenWorkSubmitted policy reacts.
|
|
9
|
+
subscribe "Coder.WorkSubmitted"
|
|
10
|
+
|
|
11
|
+
# The Hecks domain's landing found the step a landed branch was cut for: FinishWorkWhenBranchLanded reacts.
|
|
12
|
+
subscribe "Hecks.LandedWorkFound"
|
|
6
13
|
end
|
|
7
14
|
|
|
8
15
|
# The anti-corruption layer for Governance, which the bluebook's roles are checked against.
|
|
@@ -23,4 +23,21 @@ Hecks.hecksagon "Tickets" do
|
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
|
+
Tickets::Work.port "WorkAreas" do
|
|
27
|
+
asks "CheckArea", to: Work do
|
|
28
|
+
attribute :work, WorkKey
|
|
29
|
+
answers "AreaCleared"
|
|
30
|
+
refuses "AreaRefused"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# The cap on started rows, which reads the other rows, as a bluebook rule cannot. The cap is the
|
|
35
|
+
# world's `work_limit` setting.
|
|
36
|
+
Tickets::Work.port "WorkLimits" do
|
|
37
|
+
asks "CheckCap", to: Work do
|
|
38
|
+
attribute :work, WorkKey
|
|
39
|
+
answers "CapCleared"
|
|
40
|
+
refuses "CapRefused"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
26
43
|
end
|
|
@@ -2,7 +2,7 @@ require_relative "../../hecks"
|
|
|
2
2
|
require_relative "../behaviors"
|
|
3
3
|
|
|
4
4
|
module Hecks
|
|
5
|
-
module
|
|
5
|
+
module Tools
|
|
6
6
|
# The command behind `hecks run_behaviors` and Custodian's `Operation.RunBehaviors`: runs
|
|
7
7
|
# `.behaviors` files and reports pass, fail or error per test (docs/guides/behaviors.md).
|
|
8
8
|
module Behaviors
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
require_relative "../canonical_json"
|
|
4
4
|
|
|
5
5
|
module Hecks
|
|
6
|
-
module
|
|
6
|
+
module Tools
|
|
7
7
|
# The command behind `hecks canonicalise`: prints a JSON document with every object's keys
|
|
8
8
|
# sorted, recursively. Key order is not semantics, so a diff a person reads should not have
|
|
9
9
|
# to notice it moved.
|
|
@@ -4,7 +4,7 @@ require_relative "../../hecks"
|
|
|
4
4
|
require_relative "../engine_agreement"
|
|
5
5
|
|
|
6
6
|
module Hecks
|
|
7
|
-
module
|
|
7
|
+
module Tools
|
|
8
8
|
# The command behind `hecks check_engine_agreement`: fails when a query engine re-grows its
|
|
9
9
|
# own comparator dispatch, or when a declared comparator lacks a shared `Comparison` case or
|
|
10
10
|
# a cross-engine agreement spec. Grep-based.
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
require_relative "expected_era"
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
|
-
module
|
|
4
|
+
module Tools
|
|
5
5
|
# The check behind Custodian's `Host.CheckEra`: asks a running host which era it reports and
|
|
6
6
|
# compares it with an allow-list file. Read-only: one GET, no writes.
|
|
7
7
|
module CheckEra
|
|
8
8
|
# What a check found.
|
|
9
9
|
#
|
|
10
10
|
# @!attribute [r] verdict
|
|
11
|
-
# @return [
|
|
11
|
+
# @return [Tools::ExpectedEra::Verdict] the era compared with the list
|
|
12
12
|
# @!attribute [r] version
|
|
13
13
|
# @return [String] the gem version the host reports, empty when it reports none
|
|
14
14
|
# @!attribute [r] line
|
|
@@ -24,17 +24,17 @@ module Hecks
|
|
|
24
24
|
# @param timeout [Numeric] seconds allowed for connecting and for reading
|
|
25
25
|
# @return [Finding] the comparison, whether or not the era is listed
|
|
26
26
|
# @raise [Errno::ENOENT, Errno::EACCES] if the file cannot be read
|
|
27
|
-
# @raise [
|
|
28
|
-
# @raise [
|
|
27
|
+
# @raise [Tools::ExpectedEra::Unreachable] if the host cannot be reached
|
|
28
|
+
# @raise [Tools::ExpectedEra::BadResponse] if it answers no era
|
|
29
29
|
def assess(url, file, timeout:)
|
|
30
|
-
expected =
|
|
30
|
+
expected = Tools::ExpectedEra
|
|
31
31
|
allowed = expected.parse(File.read(file))
|
|
32
32
|
document = expected.fetch_version(url, timeout: timeout)
|
|
33
33
|
verdict = expected.verdict(document.fetch("era"), allowed)
|
|
34
34
|
Finding.new(verdict, document.fetch("version"), sentence(verdict, file))
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
# @param verdict [
|
|
37
|
+
# @param verdict [Tools::ExpectedEra::Verdict] the comparison
|
|
38
38
|
# @param file [String] the allow-list file, named in the sentence
|
|
39
39
|
# @return [String] the one line that says what the comparison found
|
|
40
40
|
def sentence(verdict, file)
|
data/lib/hecks/tools/ci_gates.rb
CHANGED
|
@@ -91,7 +91,9 @@ module Hecks
|
|
|
91
91
|
[*job_header(gate, name), *JOB_BODY, *job_footer(gate, name)].join("\n")
|
|
92
92
|
end
|
|
93
93
|
|
|
94
|
-
# The job's static middle: its outputs and the steps up to the one that decides.
|
|
94
|
+
# The job's static middle: its outputs and the steps up to the one that decides. Every job
|
|
95
|
+
# in the run waits on a detector, so it installs only what it uses (Ruby, no Rust toolchain)
|
|
96
|
+
# and starts `hecks` warm when an earlier run saved the boot caches for this `lib/`.
|
|
95
97
|
JOB_BODY = [
|
|
96
98
|
" outputs:",
|
|
97
99
|
" touched: ${{ steps.diff.outputs.touched }}",
|
|
@@ -101,6 +103,10 @@ module Hecks
|
|
|
101
103
|
" # Full history: the diff needs both endpoints present as real objects.",
|
|
102
104
|
" fetch-depth: 0",
|
|
103
105
|
" - uses: ./.github/actions/setup-ruby",
|
|
106
|
+
" with:",
|
|
107
|
+
" # The decision diffs files and calls an API; it formats and builds no Rust.",
|
|
108
|
+
" rust-toolchain: \"false\"",
|
|
109
|
+
" - uses: ./.github/actions/hecks-boot-cache",
|
|
104
110
|
" - uses: ./.github/actions/hecks-environment",
|
|
105
111
|
" - id: diff"
|
|
106
112
|
].freeze
|
|
@@ -119,7 +125,7 @@ module Hecks
|
|
|
119
125
|
def job_footer(gate, name)
|
|
120
126
|
[" name: #{quoted(gate.fetch("label"))}",
|
|
121
127
|
*job_env(gate),
|
|
122
|
-
" run: bundle exec exe/hecks regeneration_run.decide_ci_gate gate=#{name} --wait",
|
|
128
|
+
" run: bundle exec exe/hecks regeneration_run.decide_ci_gate! gate=#{name} --wait",
|
|
123
129
|
" # END GENERATED ci_gate #{name}"]
|
|
124
130
|
end
|
|
125
131
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "hecks"
|
|
4
|
+
require "fileutils"
|
|
5
|
+
require_relative "../tools"
|
|
6
|
+
require_relative "../projections/ci_pipeline/workflows"
|
|
7
|
+
|
|
8
|
+
module Hecks
|
|
9
|
+
module Tools
|
|
10
|
+
# Projects the workflow rows of the CiWorkflows bluebook into the workflow files under
|
|
11
|
+
# `.github/workflows`: each `Workflow` row becomes one file, written whole from its rows
|
|
12
|
+
# (`Projections::CiPipeline::Workflows`, the `:ci_workflows` projection).
|
|
13
|
+
#
|
|
14
|
+
# hecks regeneration_run.project_ci_pipeline! [--confirm]
|
|
15
|
+
#
|
|
16
|
+
# A workflow with no row is hand-written and left alone. With `--check` nothing is written: the
|
|
17
|
+
# tool answers 1 and names each file that differs from its rows.
|
|
18
|
+
module CiWorkflows
|
|
19
|
+
# The directory of the bluebook that declares the rows, which attaches the CiPipeline bluebook.
|
|
20
|
+
BLUEBOOK_DIRECTORY = File.expand_path("../ci_workflows", __dir__)
|
|
21
|
+
|
|
22
|
+
# The directory `ports/` and `adapters/` live under, loaded before the rows are.
|
|
23
|
+
LIB_HECKS = File.expand_path("..", __dir__)
|
|
24
|
+
|
|
25
|
+
# What a hecksagon that binds a store loads first.
|
|
26
|
+
WIRING = %w[ports/persistence.port ports/extraction.port adapters/driven/memory.adapter
|
|
27
|
+
adapters/driven/prism.adapter].freeze
|
|
28
|
+
|
|
29
|
+
module_function
|
|
30
|
+
|
|
31
|
+
# Projects the rows, writes what differs and prints a line for each file written.
|
|
32
|
+
#
|
|
33
|
+
# @param argv [Array<String>] `--check` to compare without writing
|
|
34
|
+
# @param root [String] the checkout the files are written under
|
|
35
|
+
# @return [Integer] 0, or 1 when `--check` finds a file out of date
|
|
36
|
+
# @raise [SystemExit] with the reason on stderr when the rows are refused
|
|
37
|
+
def main(argv, root: Tools::ROOT)
|
|
38
|
+
files = projection(root)
|
|
39
|
+
stale = files.reject { |path, text| File.file?(path) && File.read(path) == text }.keys
|
|
40
|
+
return report(stale, root) if argv.include?("--check")
|
|
41
|
+
|
|
42
|
+
write(files, stale, root)
|
|
43
|
+
0
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @param root [String] the checkout the files belong under
|
|
47
|
+
# @return [Hash{String => String}] each workflow's absolute path to the text it should hold
|
|
48
|
+
# @raise [SystemExit] when the rows are refused
|
|
49
|
+
def projection(root)
|
|
50
|
+
registry = registry_for
|
|
51
|
+
bluebook = Projections::CiPipeline::Table.bluebook(registry)
|
|
52
|
+
table = Projections::CiPipeline::Table.read(bluebook, registry: registry)
|
|
53
|
+
files = Projector.call(:ci_workflows, bluebook: bluebook, options: { table: table })
|
|
54
|
+
files.transform_keys { |path| File.join(root, path) }
|
|
55
|
+
rescue Projections::CiPipeline::Table::Invalid => e
|
|
56
|
+
abort "project_ci_pipeline: #{e.message}"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Loads the bluebook that declares the rows the way a deploy loads a project: the bluebooks,
|
|
60
|
+
# then the hecksagons that attach the bluebooks they need.
|
|
61
|
+
#
|
|
62
|
+
# @return [Hecks::Runtime::Registry] the registry
|
|
63
|
+
def registry_for
|
|
64
|
+
registry = Hecks::Runtime::Registry.new(root: BLUEBOOK_DIRECTORY)
|
|
65
|
+
Hecks.with_registry(registry) do
|
|
66
|
+
WIRING.each { |file| Kernel.load(File.join(LIB_HECKS, file)) }
|
|
67
|
+
Dir.glob(File.join(BLUEBOOK_DIRECTORY, "*.bluebook")).each { |file| Kernel.load(file) }
|
|
68
|
+
Dir.glob(File.join(BLUEBOOK_DIRECTORY, "*.hecksagon")).each { |file| Kernel.load(file) }
|
|
69
|
+
end
|
|
70
|
+
registry
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Writes each stale file and prints a line for it.
|
|
74
|
+
def write(files, stale, root)
|
|
75
|
+
stale.each do |path|
|
|
76
|
+
FileUtils.mkdir_p(File.dirname(path))
|
|
77
|
+
File.write(path, files.fetch(path))
|
|
78
|
+
puts "wrote #{path.delete_prefix("#{root}/")}"
|
|
79
|
+
end
|
|
80
|
+
puts "ci_pipeline: every workflow current" if stale.empty?
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @param stale [Array<String>] absolute paths whose text differs from the rows
|
|
84
|
+
# @param root [String] the checkout
|
|
85
|
+
# @return [Integer] 0 when current, else 1 with the stale workflows on stderr
|
|
86
|
+
def report(stale, root)
|
|
87
|
+
if stale.empty?
|
|
88
|
+
puts "ci_pipeline: every workflow current"
|
|
89
|
+
return 0
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
warn "ci_pipeline: out of date: #{stale.map { |path| path.delete_prefix("#{root}/") }.join(", ")} " \
|
|
93
|
+
"(run hecks regeneration_run.project_ci_pipeline! --confirm)"
|
|
94
|
+
1
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -5,7 +5,7 @@ require "irb"
|
|
|
5
5
|
require_relative "../ports/persistence/plugins/era"
|
|
6
6
|
|
|
7
7
|
module Hecks
|
|
8
|
-
module
|
|
8
|
+
module Tools
|
|
9
9
|
# The command behind `hecks console` and Custodian's `Operation.OpenConsole`: boots a domain
|
|
10
10
|
# (pizzas on Memory by default) and drops into IRB with its Ruby adapter installed, for
|
|
11
11
|
# dispatching a
|
|
@@ -4,7 +4,7 @@ require "optparse"
|
|
|
4
4
|
require_relative "../projections/deploy/template_diff"
|
|
5
5
|
|
|
6
6
|
module Hecks
|
|
7
|
-
module
|
|
7
|
+
module Tools
|
|
8
8
|
# The command behind `hecks deploy template_comparison.diff`: compares two
|
|
9
9
|
# CloudFormation templates offline and reports differences by logical id; `--strict` also
|
|
10
10
|
# counts cosmetic differences (comments, key order).
|