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,11 @@
|
|
|
1
|
+
# The CiSpeed bluebook, bound so it boots standing alone (a behaviors or model_check boot of this
|
|
2
|
+
# directory). The ports it shares with every attaching hecksagon are in ci_speed.ports.hecksagon.
|
|
3
|
+
Hecks.hecksagon "CiSpeed" do
|
|
4
|
+
attaches "Governance"
|
|
5
|
+
persisted_by "Memory"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# The anti-corruption layer for Governance, which the bluebook's roles are checked against.
|
|
9
|
+
Hecks.hecksagon "Governance" do
|
|
10
|
+
persisted_by "Memory"
|
|
11
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# The ports CiSpeed declares, for every hecksagon that attaches the bluebook. The bluebook names the
|
|
2
|
+
# question it asks of GitHub and the one it asks of this machine, and never says how either is
|
|
3
|
+
# answered; an adapter binds each.
|
|
4
|
+
Hecks.hecksagon "CiSpeed" do
|
|
5
|
+
# Answers with one run's record as GitHub reports it. The adapter runs the `gh` commands; the
|
|
6
|
+
# bluebook takes back the document and records it through `Run::Observe`.
|
|
7
|
+
CiSpeed::Run.port "CiReader" do
|
|
8
|
+
answers_query "Reading"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Runs an experiment's steps in two checkouts, interleaved, and answers with the numbers. The
|
|
12
|
+
# adapter makes the checkouts, times the steps and removes the checkouts; the bluebook takes back
|
|
13
|
+
# the answer and records it through `Experiment::Complete`, or the refusal through `Fault`.
|
|
14
|
+
CiSpeed::Experiment.port "LocalRunner" do
|
|
15
|
+
asks "Measure", to: Experiment do
|
|
16
|
+
attribute :name, ExperimentName
|
|
17
|
+
answers "ExperimentAnswered"
|
|
18
|
+
refuses "ExperimentRefused"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Hecks.behaviors "CiWorkflows" do
|
|
2
|
+
vision "Hecks's own workflows are rows of this bluebook, which attaches CiPipeline for the shape of a row."
|
|
3
|
+
|
|
4
|
+
# The hecksagon attaches CiPipeline and Governance, so a boot of these files holds the shapes the
|
|
5
|
+
# rows are read against, and the memory-only guard and the role check pass.
|
|
6
|
+
loads "ci_workflows.bluebook", "ci_workflows.hecksagon"
|
|
7
|
+
|
|
8
|
+
test "Name names the pipeline whose rows these are" do
|
|
9
|
+
tests "Name", on: "Pipeline"
|
|
10
|
+
input name: { value: "hecks" }
|
|
11
|
+
expect emits: ["PipelineNamed"]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# Hecks's own workflows as rows: the client of the CiPipeline bluebook. Each workflow file listed
|
|
2
|
+
# here is written by `hecks regeneration_run.project_ci_pipeline!` from these rows and is never
|
|
3
|
+
# edited by hand; the other files under .github/workflows are still hand-written and move here one
|
|
4
|
+
# at a time.
|
|
5
|
+
#
|
|
6
|
+
# The rows are flat and joined by workflow name and job name. A `Workflow` row is one file, and a
|
|
7
|
+
# `Trigger` row one event that starts it. A `Secret` row is one secret a called workflow takes. A
|
|
8
|
+
# `Job` row is one job, a `Need` row one job it waits for, an `Output` row one value it hands on
|
|
9
|
+
# and an `Env` row one variable its steps see. A `Step` row is one step, in the order written, and
|
|
10
|
+
# a `StepInput` row one `with:` input of the step whose handle it names. The fields a row may carry
|
|
11
|
+
# and the closed sets their values come from are the CiPipeline bluebook's Workflow, JobSpec and
|
|
12
|
+
# Step aggregates (lib/hecks/ci_pipeline/ci_pipeline.bluebook).
|
|
13
|
+
#
|
|
14
|
+
# A value is a YAML scalar as written: `14` is the number, `false` the boolean, and anything else
|
|
15
|
+
# the string, quoted by the projector only where YAML needs it. Text in a `note` becomes comments.
|
|
16
|
+
Hecks.bluebook "CiWorkflows" do
|
|
17
|
+
vision "Hecks's own GitHub Actions workflows, declared once as rows and projected into .github/workflows."
|
|
18
|
+
|
|
19
|
+
aggregate "Pipeline" do
|
|
20
|
+
description "The rows of the workflows Hecks projects for itself."
|
|
21
|
+
|
|
22
|
+
attribute :name, PipelineName
|
|
23
|
+
identified_by :name
|
|
24
|
+
|
|
25
|
+
value_object "PipelineName" do
|
|
26
|
+
attribute :value, String
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
value_object "Workflow" do
|
|
30
|
+
attribute :name, String
|
|
31
|
+
attribute :display_name, String
|
|
32
|
+
attribute :note, String
|
|
33
|
+
|
|
34
|
+
member name: "ci-rspec.yml", display_name: "CI rspec (reusable)",
|
|
35
|
+
note: "Reusable rspec gate behind the `rspec` required check; called from ci.yml.\n\nOne file per required check: a called workflow reports a single `.result` to its caller.\nSecrets are declared, not inherited: ci.yml must pass HECKS_CI_ATTEST_KEY and\nHECKS_JOURNAL_DATABASE at the call site."
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
value_object "Trigger" do
|
|
39
|
+
attribute :workflow, String
|
|
40
|
+
attribute :event, String
|
|
41
|
+
|
|
42
|
+
member workflow: "ci-rspec.yml", event: "workflow_call"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
value_object "Secret" do
|
|
46
|
+
attribute :workflow, String
|
|
47
|
+
attribute :name, String
|
|
48
|
+
attribute :required, Boolean
|
|
49
|
+
|
|
50
|
+
member workflow: "ci-rspec.yml", name: "HECKS_CI_ATTEST_KEY", required: false
|
|
51
|
+
member workflow: "ci-rspec.yml", name: "HECKS_JOURNAL_DATABASE", required: false
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
value_object "Job" do
|
|
55
|
+
attribute :workflow, String
|
|
56
|
+
attribute :name, String
|
|
57
|
+
attribute :runner, String
|
|
58
|
+
attribute :timeout_minutes, Integer
|
|
59
|
+
attribute :permissions, String
|
|
60
|
+
attribute :condition, String
|
|
61
|
+
attribute :shard_total, Integer
|
|
62
|
+
attribute :shard_axis, String
|
|
63
|
+
attribute :note, String
|
|
64
|
+
|
|
65
|
+
member workflow: "ci-rspec.yml", name: "ci_attestation_rspec", runner: "ubuntu-latest", timeout_minutes: 10,
|
|
66
|
+
note: "Separate job because a job-level `if:` cannot read a step output from its own job.\nLets `rspec_shard` skip wholesale when a local run attested this tree.\nSafe to skip on push: `rspec_shard` never reads this result on that trigger."
|
|
67
|
+
member workflow: "ci-rspec.yml", name: "rspec_shard", runner: "ubuntu-latest", timeout_minutes: 20,
|
|
68
|
+
condition: "always() && (needs.ci_attestation_rspec.result != 'success' || needs.ci_attestation_rspec.outputs.attested != 'true')",
|
|
69
|
+
shard_total: 8, shard_axis: "group",
|
|
70
|
+
note: "The suite is split across shards, each running parallel workers, to cut wall-clock time.\n\n`always()` and the `.result` check are both required: a failed detector would otherwise\nskip this required check instead of running it. Also skipped on push (cache warming\nneeds only the postgres_io_parallel shards) and when the tree is attested.\n\nNo Postgres service: specs that boot examples/pizzas against PostgresEra are tagged\n`io: true` and run in rspec_postgres_io. An untagged one fails here with\nPG::ConnectionBad."
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
value_object "Need" do
|
|
74
|
+
attribute :workflow, String
|
|
75
|
+
attribute :job, String
|
|
76
|
+
attribute :needs, String
|
|
77
|
+
|
|
78
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", needs: "ci_attestation_rspec"
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
value_object "Output" do
|
|
82
|
+
attribute :workflow, String
|
|
83
|
+
attribute :job, String
|
|
84
|
+
attribute :key, String
|
|
85
|
+
attribute :value, String
|
|
86
|
+
|
|
87
|
+
member workflow: "ci-rspec.yml", job: "ci_attestation_rspec", key: "attested",
|
|
88
|
+
value: "${{ steps.attest.outputs.attested }}"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
value_object "Env" do
|
|
92
|
+
attribute :workflow, String
|
|
93
|
+
attribute :job, String
|
|
94
|
+
attribute :key, String
|
|
95
|
+
attribute :value, String
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
value_object "Step" do
|
|
99
|
+
attribute :workflow, String
|
|
100
|
+
attribute :job, String
|
|
101
|
+
attribute :name, String
|
|
102
|
+
attribute :title, String
|
|
103
|
+
attribute :id, String
|
|
104
|
+
attribute :uses, String
|
|
105
|
+
attribute :run, String
|
|
106
|
+
attribute :condition, String
|
|
107
|
+
attribute :note, String
|
|
108
|
+
|
|
109
|
+
member workflow: "ci-rspec.yml", job: "ci_attestation_rspec", name: "checkout", uses: "actions/checkout@v4"
|
|
110
|
+
member workflow: "ci-rspec.yml", job: "ci_attestation_rspec", name: "attest", id: "attest",
|
|
111
|
+
uses: "./.github/actions/check-attestation"
|
|
112
|
+
|
|
113
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", name: "checkout", uses: "actions/checkout@v4"
|
|
114
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", name: "ruby", uses: "./.github/actions/setup-ruby"
|
|
115
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", name: "zsh",
|
|
116
|
+
title: "Install zsh",
|
|
117
|
+
run: "sudo apt-get update -qq && sudo apt-get install -y --no-install-recommends zsh\n",
|
|
118
|
+
note: "cli_completion_spec checks the zsh completion script with `zsh -n`; CI has no zsh,\nand the skip backstop turns an unrouted skip into a failure."
|
|
119
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", name: "environment",
|
|
120
|
+
uses: "./.github/actions/hecks-environment"
|
|
121
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", name: "generated_rust",
|
|
122
|
+
uses: "./.github/actions/generated-rust",
|
|
123
|
+
note: "rust/src/generated is committed, so the whole tree is in the checkout and this step only checks it.\nA shard reads only the domains named below (rust_build_kernel_input_spec); the input names them and\nchanges nothing. Specs that read the whole tree are tagged `generated_all` and run in the drift job,\nwhich regenerates every domain."
|
|
124
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", name: "file_list",
|
|
125
|
+
title: "Determine this shard's own file list",
|
|
126
|
+
run: "mkdir -p tmp\nbundle exec exe/hecks query test_suite_run.shard_specs group=${{ matrix.group }} groups=%{shard_total} runtime_log=.github/rspec_runtime_baseline.log \\\n > tmp/rspec_shard_files.txt\n",
|
|
127
|
+
note: "`io: true` specs run elsewhere: rspec_rust_io (cargo/wasm) and rspec_postgres_io.\nEvery shard must compute its file list from identical inputs or the lists stop\npartitioning the suite, so grouping reads only the committed baseline, never a cache."
|
|
128
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", name: "parallel",
|
|
129
|
+
title: "rspec: parallel (this shard's own file list only)",
|
|
130
|
+
run: "FILES=()\nwhile IFS= read -r line; do FILES+=(\"$line\"); done < tmp/rspec_shard_files.txt\nbundle exec parallel_rspec \"${FILES[@]}\" \\\n --group-by runtime --runtime-log .github/rspec_runtime_baseline.log --allowed-missing 100 \\\n -o \"--tag ~io --tag ~fuzzing --tag ~generated_all --profile 15 --format documentation --format ParallelTests::RSpec::RuntimeLogger --out tmp/runtime_rspec.log\"\n",
|
|
131
|
+
note: "--group-by runtime: without it parallel_rspec splits by file size and one worker can\ndraw the slowest files. --allowed-missing: spec files newer than the baseline get the\naverage cost instead of failing."
|
|
132
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", name: "upload_log",
|
|
133
|
+
title: "Upload this shard's runtime log (for hecks TestSuiteRun.refresh_runtime_baseline! from_run=)",
|
|
134
|
+
condition: "always()", uses: "actions/upload-artifact@v4",
|
|
135
|
+
note: "Artifact only, never restored: `hecks TestSuiteRun.refresh_runtime_baseline! from_run= <run-id>`\nrebuilds the committed baseline from CI timings."
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
value_object "StepInput" do
|
|
139
|
+
attribute :workflow, String
|
|
140
|
+
attribute :job, String
|
|
141
|
+
attribute :step, String
|
|
142
|
+
attribute :key, String
|
|
143
|
+
attribute :value, String
|
|
144
|
+
|
|
145
|
+
member workflow: "ci-rspec.yml", job: "ci_attestation_rspec", step: "attest", key: "checks", value: "rspec"
|
|
146
|
+
member workflow: "ci-rspec.yml", job: "ci_attestation_rspec", step: "attest", key: "hmac-key",
|
|
147
|
+
value: "${{ secrets.HECKS_CI_ATTEST_KEY }}"
|
|
148
|
+
|
|
149
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", step: "environment", key: "database",
|
|
150
|
+
value: "${{ secrets.HECKS_JOURNAL_DATABASE }}"
|
|
151
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", step: "generated_rust", key: "domains",
|
|
152
|
+
value: "lease_clock nested_pieces"
|
|
153
|
+
|
|
154
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", step: "upload_log", key: "name",
|
|
155
|
+
value: "rspec-runtime-group-${{ matrix.group }}"
|
|
156
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", step: "upload_log", key: "path",
|
|
157
|
+
value: "tmp/runtime_rspec.log"
|
|
158
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", step: "upload_log", key: "retention-days", value: "14"
|
|
159
|
+
member workflow: "ci-rspec.yml", job: "rspec_shard", step: "upload_log", key: "if-no-files-found",
|
|
160
|
+
value: "ignore"
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
command "Name" do
|
|
164
|
+
goal "Name the pipeline whose rows these are"
|
|
165
|
+
|
|
166
|
+
attribute :name, PipelineName
|
|
167
|
+
|
|
168
|
+
sets :name
|
|
169
|
+
|
|
170
|
+
emits "PipelineNamed"
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Hecks.hecksagon "CiWorkflows" do
|
|
2
|
+
attaches "CiPipeline"
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
# The sibling hecksagons of the attached bluebooks: they decide where their aggregates are kept, as
|
|
6
|
+
# a project does for every bluebook it attaches. CiPipeline's commands name a role, so its hecksagon
|
|
7
|
+
# attaches Governance to check the roles against.
|
|
8
|
+
Hecks.hecksagon "CiPipeline" do
|
|
9
|
+
attaches "Governance"
|
|
10
|
+
persisted_by "Memory"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
Hecks.hecksagon "Governance" do
|
|
14
|
+
persisted_by "Memory"
|
|
15
|
+
end
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
# Coder: the coder side of the QA loop. It works the bugs QualityControl logs, and when a fix is
|
|
2
|
+
# not ready it records a Stub, a named temporary workaround that lets the QA rotation keep moving
|
|
3
|
+
# while the bug stays open.
|
|
4
|
+
# Cross-domain wiring to QualityControl's Bug events is deliberately NOT in this first cut.
|
|
5
|
+
|
|
6
|
+
Hecks.bluebook "Coder" do
|
|
7
|
+
vision "Every bug QA logs is worked by one coder at a time, and a bug that cannot be fixed yet is still never hidden: it is stubbed, named, and retired once the fix lands."
|
|
8
|
+
|
|
9
|
+
core
|
|
10
|
+
|
|
11
|
+
# One assignment per QA bug, keyed by the bug's reference. A claim is a lifecycle edge, so two
|
|
12
|
+
# coders racing for the same bug see one win and one refusal.
|
|
13
|
+
aggregate "Assignment" do
|
|
14
|
+
description "One QA bug, the coder working it, and how far the fix got."
|
|
15
|
+
|
|
16
|
+
identified_by :bug
|
|
17
|
+
|
|
18
|
+
attribute :bug, BugReference
|
|
19
|
+
attribute :held_by, Holder
|
|
20
|
+
# A number, not a timestamp type: the predicate sublanguage compares only numbers.
|
|
21
|
+
attribute :claimed_at, Instant
|
|
22
|
+
attribute :window, StaleAfter
|
|
23
|
+
|
|
24
|
+
value_object "BugReference" do
|
|
25
|
+
attribute :value, String, matches: :present
|
|
26
|
+
invariant("an assignment names the bug it works") { !value.to_s.empty? }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# `nobody` when unclaimed, as QualityControl's `Engineer` is.
|
|
30
|
+
value_object "Holder" do
|
|
31
|
+
attribute :value, String, default: "nobody"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
value_object "Instant" do
|
|
35
|
+
attribute :value, Integer, default: 0
|
|
36
|
+
invariant("an instant is not before the epoch") { !value.negative? }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Mirrors `QualityControl::Target::StaleAfter`: a claim older than this may be taken over.
|
|
40
|
+
value_object "StaleAfter" do
|
|
41
|
+
attribute :value, Integer, default: 900
|
|
42
|
+
invariant("a staleness window is positive") { value.positive? }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# `stubbed` is a bug held by a coder with a Stub in place. Both held states can be taken over
|
|
46
|
+
# once stale, so a coder who goes quiet does not strand the bug.
|
|
47
|
+
lifecycle :status, default: "waiting" do
|
|
48
|
+
transition "Claim" => "claimed", from: ["waiting", "released", "claimed", "stubbed"]
|
|
49
|
+
transition "Stub" => "stubbed", from: "claimed"
|
|
50
|
+
transition "Fix" => "fixed", from: ["claimed", "stubbed"]
|
|
51
|
+
transition "Release" => "released", from: ["claimed", "stubbed"]
|
|
52
|
+
mark :terminal, "fixed"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Creates the assignment in `waiting` when QualityControl logs a bug. Nothing is held yet, so
|
|
56
|
+
# the holder and claim time keep their defaults. Without this, no assignment could ever exist
|
|
57
|
+
# for `Claim` to take.
|
|
58
|
+
command "Offer" do
|
|
59
|
+
role "Coder"
|
|
60
|
+
goal "Put a newly logged QA bug on the queue"
|
|
61
|
+
|
|
62
|
+
attribute :bug, BugReference
|
|
63
|
+
|
|
64
|
+
emits "AssignmentOffered"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# `from` includes the held states on purpose: without them the staleness rule below could never
|
|
68
|
+
# apply, because a claim that went quiet sits in `claimed` and no edge would leave it.
|
|
69
|
+
# Same arithmetic as QualityControl's `Bug.Claim`: `+` stands for `now - claimed_at >= window`.
|
|
70
|
+
command "Claim" do
|
|
71
|
+
role "Coder"
|
|
72
|
+
goal "Take a bug off the queue, or one whose holder has gone quiet"
|
|
73
|
+
|
|
74
|
+
reference_to Assignment
|
|
75
|
+
attribute :held_by, Holder, sets: true
|
|
76
|
+
attribute :now, Instant
|
|
77
|
+
needs :now
|
|
78
|
+
|
|
79
|
+
given("a live claim is not taken from the coder holding it") do
|
|
80
|
+
held_by.value == "nobody" || claimed_at.value + window.value <= now.value
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
sets :claimed_at, to: :now
|
|
84
|
+
|
|
85
|
+
emits "AssignmentClaimed"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# The Stub is recorded by its own command; this only moves the assignment into `stubbed`.
|
|
89
|
+
command "Stub" do
|
|
90
|
+
role "Coder"
|
|
91
|
+
goal "Record that the bug is held open behind a temporary workaround"
|
|
92
|
+
|
|
93
|
+
reference_to Assignment
|
|
94
|
+
|
|
95
|
+
emits "AssignmentStubbed"
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# `bug` is restated so `AssignmentFixed` carries it: an event holds only its dispatched arguments,
|
|
99
|
+
# and `RetireStubOnFix` needs the bug to find the Stub it retires.
|
|
100
|
+
command "Fix" do
|
|
101
|
+
role "Coder"
|
|
102
|
+
goal "Record that the bug no longer happens"
|
|
103
|
+
|
|
104
|
+
reference_to Assignment
|
|
105
|
+
attribute :bug, BugReference
|
|
106
|
+
|
|
107
|
+
emits "AssignmentFixed"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Dropping a claim hands the bug back to the queue; the caller passes `nobody` as the holder.
|
|
111
|
+
command "Release" do
|
|
112
|
+
role "Coder"
|
|
113
|
+
goal "Put a bug back on the queue without finishing it"
|
|
114
|
+
|
|
115
|
+
reference_to Assignment
|
|
116
|
+
attribute :held_by, Holder, sets: true
|
|
117
|
+
|
|
118
|
+
emits "AssignmentReleased"
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# The workaround that lets the QA rotation keep moving while the bug stays open. One Stub per bug,
|
|
123
|
+
# so its reference is the bug's reference, and `RetireStubOnFix` can name it from the fix alone.
|
|
124
|
+
aggregate "Stub" do
|
|
125
|
+
description "A named temporary workaround for a bug whose fix is not ready, with the QA target it keeps moving."
|
|
126
|
+
|
|
127
|
+
identified_by :reference
|
|
128
|
+
|
|
129
|
+
attribute :reference, StubReference
|
|
130
|
+
attribute :bug, StubBug
|
|
131
|
+
attribute :target, StubTarget
|
|
132
|
+
attribute :reason, StubReason
|
|
133
|
+
|
|
134
|
+
value_object "StubReference" do
|
|
135
|
+
attribute :value, String, matches: :present
|
|
136
|
+
invariant("a stub is referenced") { !value.to_s.empty? }
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
value_object "StubBug" do
|
|
140
|
+
attribute :value, String, matches: :present
|
|
141
|
+
invariant("a stub says which bug it stands in for") { !value.to_s.empty? }
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# The QA target name, such as `ledger_ordering`, that this stub lets keep moving.
|
|
145
|
+
value_object "StubTarget" do
|
|
146
|
+
attribute :value, String, matches: :present
|
|
147
|
+
invariant("a stub says which target it keeps moving") { !value.to_s.empty? }
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Required: a workaround that does not say why it exists is a silent failure.
|
|
151
|
+
value_object "StubReason" do
|
|
152
|
+
attribute :value, String, matches: :present
|
|
153
|
+
invariant("a stub says why it exists") { !value.to_s.empty? }
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
lifecycle :status, default: "active" do
|
|
157
|
+
transition "Retire" => "retired", from: "active"
|
|
158
|
+
mark :terminal, "retired"
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
command "Record" do
|
|
162
|
+
role "Coder"
|
|
163
|
+
goal "Stand a named workaround in for a bug whose fix is not ready"
|
|
164
|
+
|
|
165
|
+
attribute :reference, StubReference
|
|
166
|
+
attribute :bug, StubBug
|
|
167
|
+
attribute :target, StubTarget
|
|
168
|
+
attribute :reason, StubReason
|
|
169
|
+
|
|
170
|
+
emits "StubRecorded"
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Retire has no `given` on the bug's state: a Stub cannot read Assignment. The only path to
|
|
174
|
+
# this command is `RetireStubOnFix`, which fires on `AssignmentFixed`, so the bug is fixed by
|
|
175
|
+
# construction.
|
|
176
|
+
command "Retire" do
|
|
177
|
+
role "Coder"
|
|
178
|
+
goal "Take a workaround out once the bug it stood in for is fixed"
|
|
179
|
+
|
|
180
|
+
reference_to Stub
|
|
181
|
+
|
|
182
|
+
emits "StubRetired"
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# The coder side only submits. `Submit` records that a branch at a commit is ready for QA and
|
|
187
|
+
# maintenance to take from here; it lands nothing and pushes nothing. The event
|
|
188
|
+
# `WorkSubmitted(branch, sha)` is the contract those policies read.
|
|
189
|
+
aggregate "Submission" do
|
|
190
|
+
description "One branch at one commit, handed to QA and maintenance to land."
|
|
191
|
+
|
|
192
|
+
identified_by :branch
|
|
193
|
+
|
|
194
|
+
attribute :branch, SubmissionBranch
|
|
195
|
+
attribute :sha, SubmissionSha
|
|
196
|
+
|
|
197
|
+
value_object "SubmissionBranch" do
|
|
198
|
+
attribute :value, String, matches: :present
|
|
199
|
+
invariant("a submission names its branch") { !value.to_s.empty? }
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# 7 to 40 hex, as Patch's CommitRef is: a submission of a commit that is not a sha is refused.
|
|
203
|
+
value_object "SubmissionSha" do
|
|
204
|
+
attribute :value, String, matches: :git_sha
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
command "Submit" do
|
|
208
|
+
role "Coder"
|
|
209
|
+
goal "Hand a branch at a commit to QA and maintenance, and land nothing from here"
|
|
210
|
+
|
|
211
|
+
attribute :branch, SubmissionBranch
|
|
212
|
+
attribute :sha, SubmissionSha
|
|
213
|
+
|
|
214
|
+
emits "WorkSubmitted"
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# A Patch is one pull request opened for a bug's fix, recorded so its CI status is a lookup.
|
|
219
|
+
# Named `Patch`, as QualityControl names its own; `identified_by :number` keeps it a lookup.
|
|
220
|
+
aggregate "Patch" do
|
|
221
|
+
description "One pull request opened for a bug's fix: number, branch, and the commit it was opened at."
|
|
222
|
+
|
|
223
|
+
identified_by :number
|
|
224
|
+
|
|
225
|
+
attribute :number, PatchNumber
|
|
226
|
+
attribute :bug, PatchBug
|
|
227
|
+
attribute :branch, PatchBranch
|
|
228
|
+
attribute :commit, CommitRef
|
|
229
|
+
|
|
230
|
+
value_object "PatchNumber" do
|
|
231
|
+
attribute :value, Integer
|
|
232
|
+
invariant("a patch is numbered") { value.positive? }
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
value_object "PatchBug" do
|
|
236
|
+
attribute :value, String, matches: :present
|
|
237
|
+
invariant("a patch says which bug it fixes") { !value.to_s.empty? }
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
value_object "PatchBranch" do
|
|
241
|
+
attribute :value, String, matches: :present
|
|
242
|
+
invariant("a patch says which branch it is on") { !value.to_s.empty? }
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
# 7 to 40 hex: a fix that lives only in a working tree is not a fix.
|
|
246
|
+
value_object "CommitRef" do
|
|
247
|
+
attribute :value, String, matches: :git_sha
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# Both endings are terminal, as QualityControl's Patch has them.
|
|
251
|
+
lifecycle :status, default: "opened" do
|
|
252
|
+
transition "Merge" => "merged", from: "opened"
|
|
253
|
+
transition "Close" => "closed", from: "opened"
|
|
254
|
+
mark :terminal, "closed", "merged"
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
command "Open" do
|
|
258
|
+
role "Coder"
|
|
259
|
+
goal "Record that a fix has been opened as a pull request"
|
|
260
|
+
|
|
261
|
+
attribute :number, PatchNumber
|
|
262
|
+
attribute :bug, PatchBug
|
|
263
|
+
attribute :branch, PatchBranch
|
|
264
|
+
attribute :commit, CommitRef
|
|
265
|
+
|
|
266
|
+
emits "PatchOpened"
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
# `bug` and `commit` are restated so `PatchMerged` carries them: an event holds only its
|
|
270
|
+
# dispatched arguments, and QualityControl's `Bug.Fix` needs the commit that made the fix.
|
|
271
|
+
command "Merge" do
|
|
272
|
+
role "Coder"
|
|
273
|
+
goal "Record that GitHub merged it"
|
|
274
|
+
|
|
275
|
+
reference_to Patch
|
|
276
|
+
attribute :bug, PatchBug
|
|
277
|
+
attribute :commit, CommitRef
|
|
278
|
+
|
|
279
|
+
emits "PatchMerged"
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
command "Close" do
|
|
283
|
+
role "Coder"
|
|
284
|
+
goal "Record that GitHub closed it without merging"
|
|
285
|
+
|
|
286
|
+
reference_to Patch
|
|
287
|
+
|
|
288
|
+
emits "PatchClosed"
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
# The brief a coder session reads for one Work row: the outcome it asks for, the area it may edit,
|
|
293
|
+
# and the standing rules every brief carries. The rules are set here, once, so no agent prompt
|
|
294
|
+
# restates them. `area` is optional: a row that names none gets a brief with no area section.
|
|
295
|
+
aggregate "Brief" do
|
|
296
|
+
description "What one coder session is told: the outcome, the area it may edit, and the standing rules."
|
|
297
|
+
created_by "Brief.compose!"
|
|
298
|
+
|
|
299
|
+
attribute :work, BriefWork
|
|
300
|
+
attribute :outcome, BriefOutcome
|
|
301
|
+
attribute :detail, BriefDetail, optional: true
|
|
302
|
+
attribute :area, list_of(AreaWord), optional: true
|
|
303
|
+
attribute :rules, BriefRules
|
|
304
|
+
attribute :verification, BriefVerification
|
|
305
|
+
attribute :workflow, BriefRules, optional: true
|
|
306
|
+
attribute :landing, BriefRules, optional: true
|
|
307
|
+
attribute :restraints, BriefRules, optional: true
|
|
308
|
+
attribute :report, BriefRules, optional: true
|
|
309
|
+
attribute :coordination, BriefRules, optional: true
|
|
310
|
+
attribute :freeze, BriefRules, optional: true
|
|
311
|
+
identified_by :work
|
|
312
|
+
|
|
313
|
+
value_object "BriefWork" do
|
|
314
|
+
attribute :value, String, matches: :present
|
|
315
|
+
invariant("a brief names the work it briefs") { !value.to_s.empty? }
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
# The Work row's title: the outcome the session is to reach, not the steps to take.
|
|
319
|
+
value_object "BriefOutcome" do
|
|
320
|
+
attribute :value, String, matches: :present
|
|
321
|
+
invariant("a brief states an outcome") { !value.to_s.empty? }
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
value_object "BriefDetail" do
|
|
325
|
+
attribute :value, String
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
# One path or module name the session may edit.
|
|
329
|
+
value_object "AreaWord" do
|
|
330
|
+
attribute :value, String, matches: :present
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
value_object "BriefRules" do
|
|
334
|
+
attribute :value, String
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
value_object "BriefVerification" do
|
|
338
|
+
attribute :value, String
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
# The brief a coder session reads for the next planned row: the Brief keyed by that row.
|
|
342
|
+
query "For" do
|
|
343
|
+
description "The brief composed for one Work row, by the row's key."
|
|
344
|
+
attribute :row, BriefWork
|
|
345
|
+
where(work: :row)
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
command "Compose" do
|
|
349
|
+
role "Coder"
|
|
350
|
+
goal "Build the brief for a Work row from its outcome and area, with the standing rules"
|
|
351
|
+
|
|
352
|
+
attribute :work, BriefWork, sets: true
|
|
353
|
+
attribute :outcome, BriefOutcome, sets: true
|
|
354
|
+
attribute :detail, BriefDetail, optional: true, sets: true
|
|
355
|
+
attribute :area, list_of(AreaWord), optional: true, sets: true
|
|
356
|
+
|
|
357
|
+
sets :rules, to: "Map the whole picture before acting. Act on everything within the area. Stop only for (a) a risk of losing data, (b) an action the owner alone may take: a push, a mint, a release, deleting something that is not yours, or (c) a change outside the area. When stopped, report what was stuck first, then finish everything that does not depend on the stuck part."
|
|
358
|
+
sets :verification, to: "Run named specs only through the launcher: exe/hecks test_suite_run.run_spec_example! file.value=<spec> \"example.value= \" --wait. Do not run the full suite: it runs only in CI. Run at most {limit} spec files per call locally (test_suite_run.run_spec_files!), never a whole family. Never use git stash. Keep the quick gate green (exe/hecks gate_run.gate! stage=quick --wait) and RuboCop strict (methods at most 10 lines). Run the quick gate, specs and builds each as ONE blocking command with an explicit Bash timeout of up to 600000 ms; never as a background command with a monitor or poll loop. Run exe/hecks style_run.check_comments! paths=<one file> --wait for each Ruby file you touch."
|
|
359
|
+
sets :workflow, to: "Pull main first, always: fetch origin, bring local main up to date, then cut the branch. Work in your own worktree named for the row: step 1 is exe/hecks LinkedTree.add! branch.value={work} --wait, which pulls main (a fast-forward, or a rebase of local main's unpushed commits when both moved; it refuses by name when the checkout is dirty) and cuts the branch from it. A session the harness started in a worktree (EnterWorktree cuts from origin/main, not local main) checks git merge-base --is-ancestor origin/main HEAD and rebases onto local main if not, after exe/hecks LinkedTree.pull_main! --wait. Rebase onto local main before landing: local main can hold work that is not pushed, and landing refuses a branch whose base is behind origin/main. Put no Claude attribution trailer in a commit message: no Co-Authored-By line and no Claude-Session line. A worktree that holds ignored files is kept after landing and reported: remove it by hand."
|
|
360
|
+
sets :landing, to: "Regenerate only if a bluebook, hecksagon, Vocabulary row or generator changed: exe/hecks regeneration_run.regenerate_corpus! --confirm --wait, then --check. Run exe/hecks conformance_run.check_shape_ledger! --wait; a purely additive move uses --confirm --additive, any other move: stop and report it. Land with exe/hecks landing.finish! --confirm: one step that rebases onto local main, runs the quick gate, lands through the queue and removes the worktree and branch. It refuses by name at the first failure (unsaved work, conflict, gate red, queue busy): fix that and run it again. If landing refuses because a landing is in flight, run it again once; it queues. Never poll or sleep on a lock, and never run a lock file by hand."
|
|
361
|
+
sets :restraints, to: "Do not push. Never set HECKS_OWNER_PUSH and never use --no-verify: main is pushed only by boarding the push train. Do not mint an era. While main CI is red, only a push that fixes a red-* Work row goes out (exe/hecks tickets query Work.undone lists them), through the push train; everything else lands locally with landing.land! and waits until CI on origin/main is green. Do not run the full spec suite locally; it runs in CI. Do not write to a live database (tickets.db, agent_run.db or any other under ~/.claude): use Memory or a temp file in specs. Never touch a local database that may hold client data."
|
|
362
|
+
sets :report, to: "End with a report: what changed, each with file:line; the spec counts (examples and failures); the shape-ledger action you took; and the sha you landed, or why nothing landed."
|
|
363
|
+
sets :coordination, to: "COORDINATION: other sessions are working in these areas. Do not edit them:"
|
|
364
|
+
sets :freeze, to: "FREEZE: the persisted shape of these may not move. If your change moves one, commit and hold, do not land, and report 'ready, held for the freeze':"
|
|
365
|
+
|
|
366
|
+
emits "BriefComposed"
|
|
367
|
+
end
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
# A planned Work row is briefed when it is planned: the title is the outcome, and the detail and the
|
|
371
|
+
# area come with it. A session reads the brief of `Work.next_planned` with `Brief.for`.
|
|
372
|
+
policy "ComposeBriefWhenPlanned" do
|
|
373
|
+
on "Work.WorkPlanned"
|
|
374
|
+
trigger Brief::Compose, with: { work: :work, outcome: :title, detail: :detail, area: :area }
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
# The one automatic reaction. A fix retires the workaround standing in for it: the stub is only
|
|
378
|
+
# needed while the bug is open, so it is retired by policy rather than inline in `Fix`, which
|
|
379
|
+
# would couple two aggregates in one command. `Assignment.Fix` emits `AssignmentFixed`, and the
|
|
380
|
+
# bug is the Stub's reference, so `stub: :bug` names the right one.
|
|
381
|
+
policy "RetireStubOnFix" do
|
|
382
|
+
on "Assignment.AssignmentFixed"
|
|
383
|
+
trigger Stub::Retire, with: { stub: :bug }
|
|
384
|
+
end
|
|
385
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Hecks.hecksagon "Coder" do
|
|
2
|
+
attaches "Governance"
|
|
3
|
+
persisted_by "Memory"
|
|
4
|
+
|
|
5
|
+
# A planned Work row, which ComposeBriefWhenPlanned briefs.
|
|
6
|
+
subscribe "Tickets.WorkPlanned"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# The anti-corruption layer for Governance, which the bluebook's roles are checked against.
|
|
10
|
+
Hecks.hecksagon "Governance" do
|
|
11
|
+
persisted_by "Memory"
|
|
12
|
+
end
|