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,916 @@
|
|
|
1
|
+
Hecks.bluebook "Hecks" do
|
|
2
|
+
domain_module "Release" do
|
|
3
|
+
vision "Certify, publish and pin versions."
|
|
4
|
+
|
|
5
|
+
aggregate "Release" do
|
|
6
|
+
description "One gem version: the record of what is running and what was shipped."
|
|
7
|
+
|
|
8
|
+
attribute :version, Version
|
|
9
|
+
attribute :ir_version, Version
|
|
10
|
+
attribute :ships_from, Checkout, optional: true
|
|
11
|
+
# The findings the version settled, by the key the Tickets bluebook gives them.
|
|
12
|
+
attribute :closes, list_of(FindingKey), optional: true
|
|
13
|
+
|
|
14
|
+
identified_by :version
|
|
15
|
+
|
|
16
|
+
value_object "FindingKey" do
|
|
17
|
+
attribute :value, String, matches: :present
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
value_object "Version" do
|
|
21
|
+
attribute :value, String, matches: :version
|
|
22
|
+
|
|
23
|
+
invariant("a version is present") { !value.to_s.empty? }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
value_object "Checkout" do
|
|
27
|
+
attribute :path, String
|
|
28
|
+
|
|
29
|
+
invariant("a checkout is a working tree with hecks.gemspec beside lib/") { !path.to_s.empty? }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
lifecycle :state, default: "tagged" do
|
|
33
|
+
transition "MarkPublished" => "published", from: "tagged"
|
|
34
|
+
transition "Verify" => "verified", from: %w[published verified]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
command "Tag" do
|
|
38
|
+
role "Maintainer"
|
|
39
|
+
goal "Record a version as tagged, with the IR version it carries"
|
|
40
|
+
audience :record
|
|
41
|
+
|
|
42
|
+
attribute :version, Version, sets: true
|
|
43
|
+
attribute :ir_version, Version, sets: true
|
|
44
|
+
attribute :ships_from, Checkout, sets: true
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
emits Tagged
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
command "MarkPublished", from: "tagged" do
|
|
51
|
+
role "Maintainer"
|
|
52
|
+
goal "Record that a tagged version reached the gem registry"
|
|
53
|
+
audience :record
|
|
54
|
+
|
|
55
|
+
reference_to Release
|
|
56
|
+
|
|
57
|
+
emits Published
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
command "Verify", from: %w[published verified] do
|
|
61
|
+
role "Maintainer"
|
|
62
|
+
goal "Record that the published version installs and boots"
|
|
63
|
+
audience :record
|
|
64
|
+
|
|
65
|
+
reference_to Release
|
|
66
|
+
|
|
67
|
+
emits Verified
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
command "CloseFindings" do
|
|
71
|
+
role "Maintainer"
|
|
72
|
+
goal "Record the findings this version settled"
|
|
73
|
+
audience :record
|
|
74
|
+
|
|
75
|
+
reference_to Release
|
|
76
|
+
attribute :closes, list_of(FindingKey), sets: true
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
emits FindingsClosed
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
query "Shipped" do
|
|
83
|
+
description "Every version that was tagged, published and verified."
|
|
84
|
+
where(state: "verified")
|
|
85
|
+
order_by :version
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Publishing: cutting a release of this gem. The run holds the facts the Git adapter surveyed
|
|
90
|
+
# (branch, tree, versions, changelog, tag), and `Accept` holds the rules that let a release go
|
|
91
|
+
# ahead: the adapter supplies the facts and the givens decide. Only an accepted run is carried
|
|
92
|
+
# out, and without --confirm it is the old dry run: every check and build, nothing tagged,
|
|
93
|
+
# pushed or published. A real run advances the root Release: tagged, published, verified.
|
|
94
|
+
aggregate "PublishingRun" do
|
|
95
|
+
description "One release of the gem, or the rehearsal of it: judged by the facts, then carried out."
|
|
96
|
+
|
|
97
|
+
acknowledges :key_by_value, "the version this run tags; its Release is made by the run's own Tag, so a reference would require the record the command exists to make",
|
|
98
|
+
of: :version
|
|
99
|
+
acknowledges :key_by_value, "the client package's version, not a gem Release",
|
|
100
|
+
of: :client_version
|
|
101
|
+
acknowledges :key_by_value, "the IR format's version, not a gem Release",
|
|
102
|
+
of: :ir_version
|
|
103
|
+
|
|
104
|
+
attribute :run, RunKey
|
|
105
|
+
attribute :operation, Operation, optional: true
|
|
106
|
+
attribute :confirm, Switch, optional: true
|
|
107
|
+
attribute :gem_only, Switch, optional: true
|
|
108
|
+
attribute :npm_only, Switch, optional: true
|
|
109
|
+
attribute :npm_local, Switch, optional: true
|
|
110
|
+
attribute :no_wait, Switch, optional: true
|
|
111
|
+
attribute :checkout, Switch, optional: true
|
|
112
|
+
attribute :branch, Word, optional: true
|
|
113
|
+
attribute :release_lane, Word, optional: true
|
|
114
|
+
attribute :on_origin, Switch, optional: true
|
|
115
|
+
attribute :clean, Switch, optional: true
|
|
116
|
+
attribute :version, Version, optional: true
|
|
117
|
+
attribute :client_version, Version, optional: true
|
|
118
|
+
attribute :changelog, Switch, optional: true
|
|
119
|
+
attribute :approved, Switch, optional: true
|
|
120
|
+
attribute :tag_state, Word, optional: true
|
|
121
|
+
attribute :head, Word, optional: true
|
|
122
|
+
attribute :ir_version, Version, optional: true
|
|
123
|
+
attribute :ships_from, Checkout, optional: true
|
|
124
|
+
attribute :tagged, Switch, optional: true
|
|
125
|
+
attribute :published, Switch, optional: true
|
|
126
|
+
attribute :verified, Switch, optional: true
|
|
127
|
+
attribute :report, Report, optional: true
|
|
128
|
+
attribute :refusal, Report, optional: true
|
|
129
|
+
identified_by :run
|
|
130
|
+
|
|
131
|
+
value_object "RunKey" do
|
|
132
|
+
attribute :value, String, matches: :present
|
|
133
|
+
|
|
134
|
+
invariant("a run is named") { !value.to_s.empty? }
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
value_object "Operation" do
|
|
138
|
+
attribute :value, String, matches: :present
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
value_object "Switch" do
|
|
142
|
+
attribute :value, Boolean
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
value_object "Report" do
|
|
146
|
+
attribute :value, String
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# One word of a fact: a branch, a commit, whether a tag stands.
|
|
150
|
+
value_object "Word" do
|
|
151
|
+
attribute :value, String, matches: :present
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
value_object "Version" do
|
|
155
|
+
attribute :value, String, matches: :version
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# The working tree the release is cut from.
|
|
159
|
+
value_object "Checkout" do
|
|
160
|
+
attribute :path, String
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
lifecycle :status, default: "requested" do
|
|
164
|
+
mark :failure, "faulted"
|
|
165
|
+
transition "Accept" => "accepted", from: "requested"
|
|
166
|
+
transition "AcceptGem" => "accepted", from: "requested"
|
|
167
|
+
transition "Complete" => "completed", from: "accepted"
|
|
168
|
+
transition "Fault" => "faulted", from: %w[requested accepted]
|
|
169
|
+
mark :terminal, "completed", "faulted"
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
command "Publish" do
|
|
173
|
+
role "Maintainer"
|
|
174
|
+
goal "Tag the merged release commit, publish the gem, and get the client package published"
|
|
175
|
+
|
|
176
|
+
attribute :gem_only, Switch, optional: true, sets: true
|
|
177
|
+
attribute :npm_only, Switch, optional: true, sets: true
|
|
178
|
+
attribute :npm_local, Switch, optional: true, sets: true
|
|
179
|
+
attribute :no_wait, Switch, optional: true, sets: true
|
|
180
|
+
attribute :run, RunKey, sets: true
|
|
181
|
+
attribute :confirm, Switch, optional: true, sets: true
|
|
182
|
+
|
|
183
|
+
sets :operation, to: "publish"
|
|
184
|
+
|
|
185
|
+
emits PublishRequested
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
command "PublishGem" do
|
|
189
|
+
role "Maintainer"
|
|
190
|
+
goal "Build the gem and push it to the gem registry, with the key the vault holds"
|
|
191
|
+
|
|
192
|
+
attribute :run, RunKey, sets: true
|
|
193
|
+
attribute :confirm, Switch, optional: true, sets: true
|
|
194
|
+
|
|
195
|
+
sets :operation, to: "publish_gem"
|
|
196
|
+
|
|
197
|
+
emits PublishGemRequested
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# What the tree reported about itself, and the facts the Git adapter surveyed, held against the
|
|
201
|
+
# rules of a release. Nothing here runs outside a hecks checkout (hecks.gemspec beside lib/).
|
|
202
|
+
command "Accept" do
|
|
203
|
+
role "System"
|
|
204
|
+
goal "Let a release go ahead only in a hecks checkout, and only when the facts satisfy every rule"
|
|
205
|
+
|
|
206
|
+
reference_to PublishingRun
|
|
207
|
+
attribute :checkout, Switch, sets: true
|
|
208
|
+
attribute :branch, Word, sets: true
|
|
209
|
+
attribute :release_lane, Word, sets: true
|
|
210
|
+
attribute :on_origin, Switch, sets: true
|
|
211
|
+
attribute :clean, Switch, sets: true
|
|
212
|
+
attribute :version, Version, sets: true
|
|
213
|
+
attribute :client_version, Version, sets: true
|
|
214
|
+
attribute :changelog, Switch, sets: true
|
|
215
|
+
attribute :approved, Switch, sets: true
|
|
216
|
+
attribute :tag_state, Word, sets: true
|
|
217
|
+
attribute :head, Word, sets: true
|
|
218
|
+
attribute :ir_version, Version, sets: true
|
|
219
|
+
attribute :ships_from, Checkout, sets: true
|
|
220
|
+
|
|
221
|
+
given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
|
|
222
|
+
given("a release is cut from the release lane (the Lane row that feeds a tag): switch to it first") do
|
|
223
|
+
branch.value == release_lane.value
|
|
224
|
+
end
|
|
225
|
+
given("the release lane is its origin: wait for the release commit to be promoted, then pull") { on_origin.value }
|
|
226
|
+
given("the working tree is clean: commit or discard changes first") { clean.value }
|
|
227
|
+
given("the client package is at the gem's version: bump the package first") do
|
|
228
|
+
client_version.value == version.value
|
|
229
|
+
end
|
|
230
|
+
given("CHANGELOG.md has a heading for the version: add the release entry") { changelog.value }
|
|
231
|
+
given("the commit that set the version carries a Release-Approved-By line: the owner decides when a release happens") do
|
|
232
|
+
approved.value || tag_state.value == "at_release_commit"
|
|
233
|
+
end
|
|
234
|
+
given("a tag for the version points at the release commit, not elsewhere") do
|
|
235
|
+
tag_state.value != "elsewhere"
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
emits PublishingAccepted
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# release_gem's one rule: the client package is released beside the gem at the same version.
|
|
243
|
+
command "AcceptGem" do
|
|
244
|
+
role "System"
|
|
245
|
+
goal "Let a gem push go ahead only in a hecks checkout, with the client package at the gem's version"
|
|
246
|
+
|
|
247
|
+
reference_to PublishingRun
|
|
248
|
+
attribute :checkout, Switch, sets: true
|
|
249
|
+
attribute :version, Version, sets: true
|
|
250
|
+
attribute :client_version, Version, sets: true
|
|
251
|
+
attribute :ir_version, Version, sets: true
|
|
252
|
+
attribute :ships_from, Checkout, sets: true
|
|
253
|
+
|
|
254
|
+
given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
|
|
255
|
+
given("the client package is at the gem's version: bump the package first") do
|
|
256
|
+
client_version.value == version.value
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
emits GemAccepted
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
command "Complete" do
|
|
264
|
+
role "System"
|
|
265
|
+
goal "Record that the release was carried out, what it did, and what it reported"
|
|
266
|
+
|
|
267
|
+
reference_to PublishingRun
|
|
268
|
+
attribute :report, Report, sets: true
|
|
269
|
+
attribute :tagged, Switch, sets: true
|
|
270
|
+
attribute :published, Switch, sets: true
|
|
271
|
+
attribute :verified, Switch, sets: true
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
emits PublishingCompleted
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
command "Fault" do
|
|
278
|
+
role "System"
|
|
279
|
+
goal "Record that the request was refused or could not be carried out, and why"
|
|
280
|
+
|
|
281
|
+
reference_to PublishingRun
|
|
282
|
+
attribute :refusal, Report, sets: true
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
emits PublishingFaulted
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
query "PublishingOutcome" do
|
|
289
|
+
description "How one request ended: its status, and what it reported or why it failed."
|
|
290
|
+
attribute :run, RunKey
|
|
291
|
+
where(run: :run)
|
|
292
|
+
order_by :run
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
query "PublishingFaulted" do
|
|
296
|
+
description "Every request that was refused or could not be carried out."
|
|
297
|
+
where(status: "faulted")
|
|
298
|
+
order_by :run
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
policy "ExaminePublishingWhenPublishRequested" do
|
|
303
|
+
on "PublishingRun.PublishRequested"
|
|
304
|
+
ask :examine, with: { run: :run }
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
policy "ExaminePublishingWhenPublishGemRequested" do
|
|
308
|
+
on "PublishingRun.PublishGemRequested"
|
|
309
|
+
ask :examine, with: { run: :run }
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
policy "AcceptTheReleaseWhenExamined" do
|
|
313
|
+
on "PublishingRun.PublishingExamined"
|
|
314
|
+
where { operation.value == "publish" }
|
|
315
|
+
trigger PublishingRun::Accept, with: { checkout: :checkout, branch: :branch, release_lane: :release_lane,
|
|
316
|
+
on_origin: :on_origin, clean: :clean, version: :version,
|
|
317
|
+
client_version: :client_version,
|
|
318
|
+
changelog: :changelog, approved: :approved, tag_state: :tag_state,
|
|
319
|
+
head: :head, ir_version: :ir_version, ships_from: :ships_from }
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
policy "AcceptTheGemWhenExamined" do
|
|
323
|
+
on "PublishingRun.PublishingExamined"
|
|
324
|
+
where { operation.value == "publish_gem" }
|
|
325
|
+
trigger PublishingRun::AcceptGem, with: { checkout: :checkout, version: :version,
|
|
326
|
+
client_version: :client_version, ir_version: :ir_version,
|
|
327
|
+
ships_from: :ships_from }
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
policy "FaultTheReleaseWhenNotAccepted" do
|
|
331
|
+
on "PublishingRun.PublishingExamined"
|
|
332
|
+
where do
|
|
333
|
+
operation.value == "publish" &&
|
|
334
|
+
(!checkout.value || branch.value != release_lane.value || !on_origin.value || !clean.value ||
|
|
335
|
+
client_version.value != version.value || !changelog.value || tag_state.value == "elsewhere" ||
|
|
336
|
+
(!approved.value && tag_state.value != "at_release_commit"))
|
|
337
|
+
end
|
|
338
|
+
trigger PublishingRun::Fault, with: { refusal: "a release rule is not met: check the branch, tree, versions, CHANGELOG, tag and the Release-Approved-By line" }
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
policy "FaultTheGemWhenNotAccepted" do
|
|
342
|
+
on "PublishingRun.PublishingExamined"
|
|
343
|
+
where do
|
|
344
|
+
operation.value == "publish_gem" && (!checkout.value || client_version.value != version.value)
|
|
345
|
+
end
|
|
346
|
+
trigger PublishingRun::Fault, with: { refusal: "a gem push rule is not met: needs a checkout and the client at the gem's version" }
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
policy "PerformPublishingWhenAccepted" do
|
|
350
|
+
on "PublishingRun.PublishingAccepted"
|
|
351
|
+
ask :perform, with: { run: :run }
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
policy "PerformPublishingWhenGemAccepted" do
|
|
355
|
+
on "PublishingRun.GemAccepted"
|
|
356
|
+
ask :perform, with: { run: :run }
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
# A real run advances the root Release: tagged when the tag was made, published when a registry
|
|
360
|
+
# took the gem, verified when every registry in scope lists the version.
|
|
361
|
+
policy "RecordTheTagWhenPublished" do
|
|
362
|
+
on "PublishingRun.PublishingAnswered"
|
|
363
|
+
where { tagged.value }
|
|
364
|
+
trigger Release::Tag, with: { version: :version, ir_version: :ir_version, ships_from: :ships_from }
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
policy "RecordThePublishingWhenPublished" do
|
|
368
|
+
on "PublishingRun.PublishingAnswered"
|
|
369
|
+
where { published.value }
|
|
370
|
+
trigger Release::MarkPublished, with: { version: :version }
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
policy "RecordTheVerificationWhenPublished" do
|
|
374
|
+
on "PublishingRun.PublishingAnswered"
|
|
375
|
+
where { verified.value }
|
|
376
|
+
trigger Release::Verify, with: { version: :version }
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
# A release that stopped after a real step (the tag pushed, the gem published) still records the
|
|
380
|
+
# steps it took on the root Release, then ends as a fault carrying what the release said.
|
|
381
|
+
policy "RecordPublishingOutcome" do
|
|
382
|
+
on "PublishingRun.PublishingAnswered"
|
|
383
|
+
where { succeeded.value }
|
|
384
|
+
trigger PublishingRun::Complete, with: { report: :report, tagged: :tagged, published: :published,
|
|
385
|
+
verified: :verified }
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
policy "RecordPublishingShortfall" do
|
|
389
|
+
on "PublishingRun.PublishingAnswered"
|
|
390
|
+
where { succeeded.value == false }
|
|
391
|
+
trigger PublishingRun::Fault, with: { refusal: :report }
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
policy "RecordPublishingFault" do
|
|
395
|
+
on "PublishingRun.PublishingRefused"
|
|
396
|
+
trigger PublishingRun::Fault, with: { refusal: :refusal }
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
# Promotion: moving a lane forward onto a commit that has passed every `RequiredCheck`. The
|
|
400
|
+
# adapter reads the facts (does the lane exist, where its head stands, where each check stands
|
|
401
|
+
# against the commit) and `Accept` holds the rules, so what makes a commit fit for the lane is
|
|
402
|
+
# decided here and in the Lane and RequiredCheck rows, never by the workflow that runs
|
|
403
|
+
# `hecks promotion_run.promote!`. Without --confirm the run is a rehearsal: it names the move it
|
|
404
|
+
# would make and makes none. A real run fast-forwards the lane (never forces it) and moves the
|
|
405
|
+
# tag the lane `feeds`, forward only; a lane that already holds the commit still has its tag
|
|
406
|
+
# brought up to the lane's head, so a half-finished run is finished by the next.
|
|
407
|
+
#
|
|
408
|
+
# A commit is certified by the checks of that exact commit. With `commit` named, that commit is
|
|
409
|
+
# the one judged, and no other is ever put in its place. Without it, the commit is the newest
|
|
410
|
+
# one of the followed lane (first-parent, a bounded way back) that every `RequiredCheck` passed
|
|
411
|
+
# on and that fast-forwards the lane, so the outcome never depends on which push's CI run
|
|
412
|
+
# started the promotion; when none qualifies the refusal names what the lane's head is
|
|
413
|
+
# waiting on.
|
|
414
|
+
aggregate "PromotionRun" do
|
|
415
|
+
description "One move of a lane onto a commit, or the rehearsal of it: judged by the facts, then carried out."
|
|
416
|
+
|
|
417
|
+
attribute :run, RunKey
|
|
418
|
+
attribute :operation, Operation, optional: true
|
|
419
|
+
attribute :confirm, Switch, optional: true
|
|
420
|
+
attribute :lane, Word
|
|
421
|
+
attribute :commit, Word, optional: true
|
|
422
|
+
attribute :checkout, Switch, optional: true
|
|
423
|
+
attribute :lane_known, Switch, optional: true
|
|
424
|
+
attribute :green, Switch, optional: true
|
|
425
|
+
attribute :descends, Switch, optional: true
|
|
426
|
+
attribute :head, Word, optional: true
|
|
427
|
+
attribute :behind_hours, Hours, optional: true
|
|
428
|
+
attribute :limit_hours, Hours, optional: true
|
|
429
|
+
attribute :promoted, Switch, optional: true
|
|
430
|
+
attribute :reason, Report, optional: true
|
|
431
|
+
attribute :report, Report, optional: true
|
|
432
|
+
attribute :refusal, Report, optional: true
|
|
433
|
+
identified_by :run
|
|
434
|
+
|
|
435
|
+
value_object "RunKey" do
|
|
436
|
+
attribute :value, String, matches: :present
|
|
437
|
+
|
|
438
|
+
invariant("a run is named") { !value.to_s.empty? }
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
value_object "Operation" do
|
|
442
|
+
attribute :value, String, matches: :present
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
value_object "Switch" do
|
|
446
|
+
attribute :value, Boolean
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
value_object "Report" do
|
|
450
|
+
attribute :value, String
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
# A branch name, or a commit.
|
|
454
|
+
value_object "Word" do
|
|
455
|
+
attribute :value, String, matches: :present
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
# How long a lane has stood behind the lane it follows, or how long its row lets it.
|
|
459
|
+
value_object "Hours" do
|
|
460
|
+
attribute :value, Integer
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
lifecycle :status, default: "requested" do
|
|
464
|
+
mark :failure, "faulted"
|
|
465
|
+
transition "Accept" => "accepted", from: "requested"
|
|
466
|
+
transition "Observe" => "observed", from: "requested"
|
|
467
|
+
transition "Complete" => "completed", from: %w[accepted observed]
|
|
468
|
+
transition "Fault" => "faulted", from: %w[requested accepted]
|
|
469
|
+
transition "Lag" => "faulted", from: "observed"
|
|
470
|
+
mark :terminal, "completed", "faulted"
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
# Looks at a lane and moves nothing: faults when it has stood behind the lane it follows for
|
|
474
|
+
# longer than its `Lane` row allows. A lane whose row allows no lag is
|
|
475
|
+
# never late.
|
|
476
|
+
command "Watch" do
|
|
477
|
+
role "Maintainer"
|
|
478
|
+
goal "Fault when a lane has stood behind the lane it follows for longer than its Lane row allows"
|
|
479
|
+
|
|
480
|
+
attribute :lane, Word, sets: true
|
|
481
|
+
attribute :run, RunKey, sets: true
|
|
482
|
+
|
|
483
|
+
sets :operation, to: "watch"
|
|
484
|
+
|
|
485
|
+
emits WatchRequested
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
command "Promote" do
|
|
489
|
+
role "Maintainer"
|
|
490
|
+
goal "Move a lane onto a commit that has passed every required check, or with no --confirm rehearse the move"
|
|
491
|
+
|
|
492
|
+
attribute :lane, Word, sets: true
|
|
493
|
+
attribute :commit, Word, optional: true, sets: true
|
|
494
|
+
attribute :run, RunKey, sets: true
|
|
495
|
+
attribute :confirm, Switch, optional: true, sets: true
|
|
496
|
+
|
|
497
|
+
sets :operation, to: "promote"
|
|
498
|
+
|
|
499
|
+
emits PromoteRequested
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
# What the tree and the remote reported, held against the rules of a promotion: the adapter
|
|
503
|
+
# supplies the facts and the givens decide.
|
|
504
|
+
command "Accept" do
|
|
505
|
+
role "System"
|
|
506
|
+
goal "Let a lane move only in a hecks checkout, onto a commit that is green on every required check and contains the lane's head"
|
|
507
|
+
|
|
508
|
+
reference_to PromotionRun
|
|
509
|
+
attribute :checkout, Switch, sets: true
|
|
510
|
+
attribute :lane_known, Switch, sets: true
|
|
511
|
+
attribute :green, Switch, sets: true
|
|
512
|
+
attribute :descends, Switch, sets: true
|
|
513
|
+
attribute :commit, Word, sets: true
|
|
514
|
+
attribute :head, Word, optional: true, sets: true
|
|
515
|
+
|
|
516
|
+
given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
|
|
517
|
+
given("the lane is one of the Lane rows, and follows another lane") { lane_known.value }
|
|
518
|
+
given("every RequiredCheck is green on the commit: wait for the checks, or fix the red one") { green.value }
|
|
519
|
+
given("the commit is on the lane it follows and contains the lane's head: a lane only moves forward") { descends.value }
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
emits PromotionAccepted
|
|
523
|
+
end
|
|
524
|
+
|
|
525
|
+
# What the tree and the remote reported about a watched lane, held against the rules of a
|
|
526
|
+
# watch: it needs a hecks checkout and a lane that follows another.
|
|
527
|
+
command "Observe" do
|
|
528
|
+
role "System"
|
|
529
|
+
goal "Let a lane be judged late or on time only in a hecks checkout, for a lane that follows another"
|
|
530
|
+
|
|
531
|
+
reference_to PromotionRun
|
|
532
|
+
attribute :checkout, Switch, sets: true
|
|
533
|
+
attribute :lane_known, Switch, sets: true
|
|
534
|
+
attribute :behind_hours, Hours, sets: true
|
|
535
|
+
attribute :limit_hours, Hours, sets: true
|
|
536
|
+
attribute :promoted, Switch, sets: true
|
|
537
|
+
attribute :reason, Report, sets: true
|
|
538
|
+
|
|
539
|
+
given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
|
|
540
|
+
given("the lane is one of the Lane rows, and follows another lane") { lane_known.value }
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
emits LaneObserved
|
|
544
|
+
end
|
|
545
|
+
|
|
546
|
+
command "Complete" do
|
|
547
|
+
role "System"
|
|
548
|
+
goal "Record that the promotion was carried out or rehearsed, or the lane was on time, and what it reported"
|
|
549
|
+
|
|
550
|
+
reference_to PromotionRun
|
|
551
|
+
attribute :report, Report, sets: true
|
|
552
|
+
attribute :promoted, Switch, sets: true
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
emits PromotionCompleted
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
# A lane that has stood behind the lane it follows for longer than its Lane row allows.
|
|
559
|
+
command "Lag" do
|
|
560
|
+
role "System"
|
|
561
|
+
goal "Record that a lane is late, and what it is waiting on"
|
|
562
|
+
|
|
563
|
+
reference_to PromotionRun
|
|
564
|
+
attribute :refusal, Report, sets: true
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
emits LaneLagged
|
|
568
|
+
end
|
|
569
|
+
|
|
570
|
+
command "Fault" do
|
|
571
|
+
role "System"
|
|
572
|
+
goal "Record that the promotion was refused or could not be carried out, and why"
|
|
573
|
+
|
|
574
|
+
reference_to PromotionRun
|
|
575
|
+
attribute :refusal, Report, sets: true
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
emits PromotionFaulted
|
|
579
|
+
end
|
|
580
|
+
|
|
581
|
+
query "PromotionOutcome" do
|
|
582
|
+
description "How one promotion ended: its status, and what it reported or why it failed."
|
|
583
|
+
attribute :run, RunKey
|
|
584
|
+
where(run: :run)
|
|
585
|
+
order_by :run
|
|
586
|
+
end
|
|
587
|
+
|
|
588
|
+
query "PromotionFaulted" do
|
|
589
|
+
description "Every promotion that was refused or could not be carried out."
|
|
590
|
+
where(status: "faulted")
|
|
591
|
+
order_by :run
|
|
592
|
+
end
|
|
593
|
+
end
|
|
594
|
+
|
|
595
|
+
policy "ExamineWhenPromoteRequested" do
|
|
596
|
+
on "PromotionRun.PromoteRequested"
|
|
597
|
+
ask :examine, with: { run: :run }
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
policy "ExamineWhenWatchRequested" do
|
|
601
|
+
on "PromotionRun.WatchRequested"
|
|
602
|
+
ask :examine, with: { run: :run }
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
policy "ObserveWhenWatchExamined" do
|
|
606
|
+
on "PromotionRun.PromotionExamined"
|
|
607
|
+
where { operation.value == "watch" }
|
|
608
|
+
trigger PromotionRun::Observe, with: { checkout: :checkout, lane_known: :lane_known, behind_hours: :behind_hours,
|
|
609
|
+
limit_hours: :limit_hours, promoted: :promoted,
|
|
610
|
+
reason: :reason }
|
|
611
|
+
end
|
|
612
|
+
|
|
613
|
+
policy "FaultWhenWatchCannotBeJudged" do
|
|
614
|
+
on "PromotionRun.PromotionExamined"
|
|
615
|
+
where { operation.value == "watch" && (!checkout.value || !lane_known.value) }
|
|
616
|
+
trigger PromotionRun::Fault, with: { refusal: :reason }
|
|
617
|
+
end
|
|
618
|
+
|
|
619
|
+
policy "LagWhenLaneLate" do
|
|
620
|
+
on "PromotionRun.LaneObserved"
|
|
621
|
+
where { behind_hours.value > limit_hours.value }
|
|
622
|
+
trigger PromotionRun::Lag, with: { refusal: :reason }
|
|
623
|
+
end
|
|
624
|
+
|
|
625
|
+
policy "CompleteWhenLaneOnTime" do
|
|
626
|
+
on "PromotionRun.LaneObserved"
|
|
627
|
+
where { behind_hours.value <= limit_hours.value }
|
|
628
|
+
trigger PromotionRun::Complete, with: { report: :reason, promoted: :promoted }
|
|
629
|
+
end
|
|
630
|
+
|
|
631
|
+
policy "AcceptPromotionWhenExamined" do
|
|
632
|
+
on "PromotionRun.PromotionExamined"
|
|
633
|
+
where { operation.value == "promote" }
|
|
634
|
+
trigger PromotionRun::Accept, with: { checkout: :checkout, lane_known: :lane_known, green: :green,
|
|
635
|
+
descends: :descends, commit: :commit, head: :head }
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
policy "FaultPromotionWhenNotAccepted" do
|
|
639
|
+
on "PromotionRun.PromotionExamined"
|
|
640
|
+
where { operation.value == "promote" && (!checkout.value || !lane_known.value || !green.value || !descends.value) }
|
|
641
|
+
trigger PromotionRun::Fault, with: { refusal: :reason }
|
|
642
|
+
end
|
|
643
|
+
|
|
644
|
+
policy "PerformPromotionWhenAccepted" do
|
|
645
|
+
on "PromotionRun.PromotionAccepted"
|
|
646
|
+
ask :perform, with: { run: :run }
|
|
647
|
+
end
|
|
648
|
+
|
|
649
|
+
policy "RecordPromotionOutcome" do
|
|
650
|
+
on "PromotionRun.PromotionAnswered"
|
|
651
|
+
trigger PromotionRun::Complete, with: { report: :report, promoted: :promoted }
|
|
652
|
+
end
|
|
653
|
+
|
|
654
|
+
policy "RecordPromotionFault" do
|
|
655
|
+
on "PromotionRun.PromotionRefused"
|
|
656
|
+
trigger PromotionRun::Fault, with: { refusal: :refusal }
|
|
657
|
+
end
|
|
658
|
+
|
|
659
|
+
aggregate "Registry" do
|
|
660
|
+
description "A bluebook registry repository: packages versioned in it and released as tags."
|
|
661
|
+
|
|
662
|
+
attribute :run, RegistryKey
|
|
663
|
+
attribute :package, PackageName, optional: true
|
|
664
|
+
attribute :root, Location, optional: true
|
|
665
|
+
attribute :report, Report, optional: true
|
|
666
|
+
attribute :refusal, Report, optional: true
|
|
667
|
+
identified_by :run
|
|
668
|
+
|
|
669
|
+
value_object "RegistryKey" do
|
|
670
|
+
attribute :value, String, matches: :present
|
|
671
|
+
|
|
672
|
+
invariant("a release is named") { !value.to_s.empty? }
|
|
673
|
+
end
|
|
674
|
+
|
|
675
|
+
value_object "PackageName" do
|
|
676
|
+
attribute :value, String, matches: :snake_name
|
|
677
|
+
end
|
|
678
|
+
|
|
679
|
+
# The registry repository: the current directory when absent.
|
|
680
|
+
value_object "Location" do
|
|
681
|
+
attribute :value, String, matches: :not_empty
|
|
682
|
+
end
|
|
683
|
+
|
|
684
|
+
value_object "Report" do
|
|
685
|
+
attribute :value, String
|
|
686
|
+
end
|
|
687
|
+
|
|
688
|
+
# An answer that is one document of text, exactly as the tool that produced it wrote it.
|
|
689
|
+
value_object "Document" do
|
|
690
|
+
attribute :text, String
|
|
691
|
+
end
|
|
692
|
+
|
|
693
|
+
lifecycle :status, default: "requested" do
|
|
694
|
+
mark :failure, "refused"
|
|
695
|
+
transition "Complete" => "tagged", from: "requested"
|
|
696
|
+
transition "Abandon" => "refused", from: "requested"
|
|
697
|
+
mark :terminal, "refused", "tagged"
|
|
698
|
+
end
|
|
699
|
+
|
|
700
|
+
# `hecks package.release <package> [root=path]`. Tags the package's current version as
|
|
701
|
+
# `<package>-vX.Y.Z` in the local repository and never pushes; the report ends in the command
|
|
702
|
+
# that does. A refusal says which rule the package broke.
|
|
703
|
+
command "Release" do
|
|
704
|
+
role "Operator"
|
|
705
|
+
goal "Tag a package of this registry at the version its bluebook.yml carries"
|
|
706
|
+
|
|
707
|
+
attribute :run, RegistryKey, sets: true
|
|
708
|
+
attribute :package, PackageName, sets: true
|
|
709
|
+
attribute :root, Location, optional: true, sets: true
|
|
710
|
+
|
|
711
|
+
|
|
712
|
+
emits ReleaseRequested
|
|
713
|
+
end
|
|
714
|
+
|
|
715
|
+
command "Complete" do
|
|
716
|
+
role "System"
|
|
717
|
+
goal "Record that the release was tagged, and the command that publishes it"
|
|
718
|
+
|
|
719
|
+
reference_to Registry
|
|
720
|
+
attribute :report, Report, sets: true
|
|
721
|
+
|
|
722
|
+
|
|
723
|
+
emits ReleaseRecorded
|
|
724
|
+
end
|
|
725
|
+
|
|
726
|
+
command "Abandon" do
|
|
727
|
+
role "System"
|
|
728
|
+
goal "Record that the release was refused, and why"
|
|
729
|
+
|
|
730
|
+
reference_to Registry
|
|
731
|
+
attribute :refusal, Report, sets: true
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
emits ReleaseAbandoned
|
|
735
|
+
end
|
|
736
|
+
|
|
737
|
+
# `hecks package.check [root=path]`: a read of the repository's files and tags, so it keeps no
|
|
738
|
+
# record. A package that changed since its latest release without a version bump and a changelog
|
|
739
|
+
# entry refuses it, naming each one.
|
|
740
|
+
query "Check" do
|
|
741
|
+
description "Judge every package against its latest release: a changed package needs a newer version and a changelog entry."
|
|
742
|
+
attribute :root, Location, optional: true
|
|
743
|
+
returns Document
|
|
744
|
+
end
|
|
745
|
+
|
|
746
|
+
# `hecks package.digest <package> [root=path]`: a read of the package's files, so it keeps no
|
|
747
|
+
# record. The digest is `Lock.digest_of` over `<package>/bluebook/*.bluebook` only (the
|
|
748
|
+
# `bluebook.lock` digest line), then the package's shape labels; `root` is the registry, or a
|
|
749
|
+
# project that vendors the package.
|
|
750
|
+
query "Digest" do
|
|
751
|
+
description "Print a package's content digest and shape labels, as its bluebook.lock records them."
|
|
752
|
+
attribute :package, PackageName
|
|
753
|
+
attribute :root, Location, optional: true
|
|
754
|
+
returns Document
|
|
755
|
+
end
|
|
756
|
+
|
|
757
|
+
query "Releasing" do
|
|
758
|
+
description "What releasing one run did: its status, and the report or the refusal."
|
|
759
|
+
attribute :run, RegistryKey
|
|
760
|
+
where(run: :run)
|
|
761
|
+
order_by :run
|
|
762
|
+
end
|
|
763
|
+
|
|
764
|
+
query "Refused" do
|
|
765
|
+
description "Every release that was refused."
|
|
766
|
+
where(status: "refused")
|
|
767
|
+
order_by :run
|
|
768
|
+
end
|
|
769
|
+
end
|
|
770
|
+
|
|
771
|
+
policy "TagWhenReleased" do
|
|
772
|
+
on "Registry.ReleaseRequested"
|
|
773
|
+
ask :tag, with: { run: :run }
|
|
774
|
+
end
|
|
775
|
+
|
|
776
|
+
policy "RecordTheTag" do
|
|
777
|
+
on "Registry.ReleaseTagged"
|
|
778
|
+
trigger Registry::Complete, with: { report: :report }
|
|
779
|
+
end
|
|
780
|
+
|
|
781
|
+
policy "RecordTheRefusedTag" do
|
|
782
|
+
on "Registry.ReleaseRefused"
|
|
783
|
+
trigger Registry::Abandon, with: { refusal: :refusal }
|
|
784
|
+
end
|
|
785
|
+
|
|
786
|
+
aggregate "Package" do
|
|
787
|
+
description "One package of the bluebook registry, vendored into a project and pinned."
|
|
788
|
+
|
|
789
|
+
attribute :package, PackageRef
|
|
790
|
+
attribute :from, Location, optional: true
|
|
791
|
+
attribute :root, Location, optional: true
|
|
792
|
+
attribute :report, Report, optional: true
|
|
793
|
+
attribute :refusal, Report, optional: true
|
|
794
|
+
identified_by :package
|
|
795
|
+
|
|
796
|
+
# `name` for the newest release, `name@1.2.0` for one release, `name@9f2c1ab` for a commit.
|
|
797
|
+
value_object "PackageRef" do
|
|
798
|
+
attribute :value, String, pattern: '^[a-z][a-z0-9_]*(@[^ \t\n\r]+)?$'
|
|
799
|
+
|
|
800
|
+
invariant("a package is named") { !value.to_s.empty? }
|
|
801
|
+
end
|
|
802
|
+
|
|
803
|
+
# A directory: the source repository (`from`), or the project the files land in (`root`).
|
|
804
|
+
value_object "Location" do
|
|
805
|
+
attribute :value, String, matches: :not_empty
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
value_object "Report" do
|
|
809
|
+
attribute :value, String
|
|
810
|
+
end
|
|
811
|
+
|
|
812
|
+
# An answer that is one document of text, exactly as the tool that produced it wrote it.
|
|
813
|
+
value_object "Document" do
|
|
814
|
+
attribute :text, String
|
|
815
|
+
end
|
|
816
|
+
|
|
817
|
+
lifecycle :status, default: "requested" do
|
|
818
|
+
mark :failure, "refused"
|
|
819
|
+
transition "Revendor" => "requested", from: %w[vendored refused]
|
|
820
|
+
transition "Complete" => "vendored", from: "requested"
|
|
821
|
+
transition "Abandon" => "refused", from: "requested"
|
|
822
|
+
end
|
|
823
|
+
|
|
824
|
+
# `hecks vendor <package[@version]> [from=path] [root=path]`. The record is named by what was
|
|
825
|
+
# asked for, so a release is one record; vendoring the same spelling again is `hecks revendor`.
|
|
826
|
+
# `from` defaults to $EMBRYONAUT_BLUEBOOKS_SRC and `root` to the current directory, both read by
|
|
827
|
+
# the adapter.
|
|
828
|
+
command "Vendor" do
|
|
829
|
+
role "Operator"
|
|
830
|
+
goal "Pin a package of the bluebook registry into this project, at a release or a commit"
|
|
831
|
+
|
|
832
|
+
attribute :package, PackageRef, sets: true
|
|
833
|
+
attribute :from, Location, optional: true, sets: true
|
|
834
|
+
attribute :root, Location, optional: true, sets: true
|
|
835
|
+
|
|
836
|
+
|
|
837
|
+
emits VendorRequested
|
|
838
|
+
end
|
|
839
|
+
|
|
840
|
+
command "Revendor" do
|
|
841
|
+
role "Operator"
|
|
842
|
+
goal "Pin a package that was vendored before again, for the newest release or the same one"
|
|
843
|
+
|
|
844
|
+
reference_to Package
|
|
845
|
+
attribute :from, Location, optional: true, sets: true
|
|
846
|
+
attribute :root, Location, optional: true, sets: true
|
|
847
|
+
|
|
848
|
+
|
|
849
|
+
emits RevendorRequested
|
|
850
|
+
end
|
|
851
|
+
|
|
852
|
+
command "Complete" do
|
|
853
|
+
role "System"
|
|
854
|
+
goal "Record that the package was pinned, and what changed"
|
|
855
|
+
|
|
856
|
+
reference_to Package
|
|
857
|
+
attribute :report, Report, sets: true
|
|
858
|
+
|
|
859
|
+
|
|
860
|
+
emits PackageVendored
|
|
861
|
+
end
|
|
862
|
+
|
|
863
|
+
command "Abandon" do
|
|
864
|
+
role "System"
|
|
865
|
+
goal "Record that the package could not be pinned, and why"
|
|
866
|
+
|
|
867
|
+
reference_to Package
|
|
868
|
+
attribute :refusal, Report, sets: true
|
|
869
|
+
|
|
870
|
+
|
|
871
|
+
emits VendoringRefused
|
|
872
|
+
end
|
|
873
|
+
|
|
874
|
+
query "Pinning" do
|
|
875
|
+
description "What vendoring one package did: its status, and the report or the refusal."
|
|
876
|
+
attribute :package, PackageRef
|
|
877
|
+
where(package: :package)
|
|
878
|
+
order_by :package
|
|
879
|
+
end
|
|
880
|
+
|
|
881
|
+
query "Unpinned" do
|
|
882
|
+
description "Every package the last vendoring of which was refused."
|
|
883
|
+
where(status: "refused")
|
|
884
|
+
order_by :package
|
|
885
|
+
end
|
|
886
|
+
|
|
887
|
+
# `hecks package.verify [root=path]`: a read of the files, so it keeps no record. The manifest
|
|
888
|
+
# is the answer; a package that disagrees with its lock refuses it, naming each one.
|
|
889
|
+
query "Verify" do
|
|
890
|
+
description "Check every vendored package against its bluebook.lock, then describe them as the manifest a client image carries."
|
|
891
|
+
attribute :root, Location, optional: true
|
|
892
|
+
returns Document
|
|
893
|
+
end
|
|
894
|
+
end
|
|
895
|
+
|
|
896
|
+
policy "PinWhenVendored" do
|
|
897
|
+
on "Package.VendorRequested"
|
|
898
|
+
ask :pin, with: { package: :package }
|
|
899
|
+
end
|
|
900
|
+
|
|
901
|
+
policy "PinWhenRevendored" do
|
|
902
|
+
on "Package.RevendorRequested"
|
|
903
|
+
ask :pin, with: { package: :package }
|
|
904
|
+
end
|
|
905
|
+
|
|
906
|
+
policy "RecordThePinning" do
|
|
907
|
+
on "Package.PackagePinned"
|
|
908
|
+
trigger Package::Complete, with: { report: :report }
|
|
909
|
+
end
|
|
910
|
+
|
|
911
|
+
policy "RecordTheRefusedPin" do
|
|
912
|
+
on "Package.PinRefused"
|
|
913
|
+
trigger Package::Abandon, with: { refusal: :refusal }
|
|
914
|
+
end
|
|
915
|
+
end
|
|
916
|
+
end
|