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,107 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../edge_audit"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Adapters
|
|
7
|
+
class JournalStore
|
|
8
|
+
module Readings
|
|
9
|
+
module MintPlan
|
|
10
|
+
# The guards on the edge a mint would take, each the very function the mint runs: the
|
|
11
|
+
# shared decision's refusal (`LineageManager.resolve_edge!`, which words a missing or a
|
|
12
|
+
# duplicate edge), the coverage check (`check_coverage!`) and the translation audit the
|
|
13
|
+
# rehearsal runs over the rows (`EdgeAudit`), here over the live store in place.
|
|
14
|
+
class EdgeGuards
|
|
15
|
+
LATER = %w[coverage audit].freeze
|
|
16
|
+
|
|
17
|
+
# @param report [Report] where each guard is recorded
|
|
18
|
+
# @param held [HeldDomain] the loaded domain
|
|
19
|
+
# @param lineage [Lineage] a read-only lineage over the store
|
|
20
|
+
def initialize(report, held, lineage)
|
|
21
|
+
@report = report
|
|
22
|
+
@held = held
|
|
23
|
+
@lineage = lineage
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# @param eras [Array<Hash>] the held eras
|
|
27
|
+
# @param verdict [LineageManager::MintDecision::Verdict] the latest era's decision
|
|
28
|
+
# @return [Object, nil] the edge the mint would take; nil when a guard refused
|
|
29
|
+
def call(eras, verdict)
|
|
30
|
+
latest = @held.named(eras.last)
|
|
31
|
+
edge = decided(latest, verdict)
|
|
32
|
+
return stop(LATER, "the edge guard refused") unless edge
|
|
33
|
+
return stop(%w[audit], "the coverage check refused") unless covered?(latest, edge)
|
|
34
|
+
|
|
35
|
+
audit(eras, edge)
|
|
36
|
+
edge
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def stop(names, why)
|
|
42
|
+
@report.skip(names, why)
|
|
43
|
+
nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def decided(latest, verdict)
|
|
47
|
+
if verdict.verdict == "would_mint"
|
|
48
|
+
@report.add("edge", :pass, edge_words(verdict))
|
|
49
|
+
return verdict.edge
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
@report.add("edge", :refuse, refusal(latest, verdict))
|
|
53
|
+
nil
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def edge_words(verdict)
|
|
57
|
+
edge = verdict.edge
|
|
58
|
+
"#{verdict.source} edge #{edge.from} -> #{edge.to}; #{verdict.edges.size} written edge(s) lead there"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# The words the mint refuses with, from its own function. The scaffold branch of that
|
|
62
|
+
# function writes a file, so a run that asked for it is worded from the verdict instead.
|
|
63
|
+
def refusal(latest, verdict)
|
|
64
|
+
return "the decision is #{verdict.verdict}: #{verdict.reason}" if ENV["HECKS_SCAFFOLD"] == "1"
|
|
65
|
+
|
|
66
|
+
PostgresEra::LineageManager.resolve_edge!(context(latest))
|
|
67
|
+
"the decision is #{verdict.verdict}: #{verdict.reason}"
|
|
68
|
+
rescue Runtime::WiringError => e
|
|
69
|
+
e.message
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def context(latest)
|
|
73
|
+
PostgresEra::LineageManager::Context.new(
|
|
74
|
+
registry: @held.registry, bluebook: @held.bluebook, current_text: nil, lineage: @lineage, role: nil,
|
|
75
|
+
directory: @held.directory, latest: latest
|
|
76
|
+
)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def covered?(latest, edge)
|
|
80
|
+
held = PostgresEra::LineageManager.held_bluebook(latest)
|
|
81
|
+
status = @report.check("coverage") do
|
|
82
|
+
PostgresEra::LineageManager.check_coverage!(@held.registry, @held.bluebook, held, edge)
|
|
83
|
+
[:pass, "no change in the shape goes unexplained by the edge"]
|
|
84
|
+
end
|
|
85
|
+
status == "pass"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def audit(eras, edge)
|
|
89
|
+
@report.check("audit") do
|
|
90
|
+
finding = EdgeAudit.call(@held, @lineage, eras, edge: edge)
|
|
91
|
+
finding.ok ? [:pass, audited(finding)] : [:refuse, refused(finding)]
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def audited(finding)
|
|
96
|
+
rows = finding.after.values.sum(&:size)
|
|
97
|
+
"Ruby audit over #{rows} translated record(s), in place, read-only; parity not run: " \
|
|
98
|
+
"parity needs the full rehearsal"
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def refused(finding) = "the audit refused: #{finding.refusals.first(5).join("; ")}"
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "edge_guards"
|
|
4
|
+
require_relative "watermark_guards"
|
|
5
|
+
require_relative "command_line"
|
|
6
|
+
require_relative "store"
|
|
7
|
+
|
|
8
|
+
module Hecks
|
|
9
|
+
module Adapters
|
|
10
|
+
class JournalStore
|
|
11
|
+
module Readings
|
|
12
|
+
module MintPlan
|
|
13
|
+
# The guards that need the store, in the order the mint runs them: the era resolution
|
|
14
|
+
# (`EraResolution`, the one answer a boot and a rehearsal read), the held-shape refusal,
|
|
15
|
+
# then the edge guards, then the watermark.
|
|
16
|
+
class Inspection
|
|
17
|
+
LATER = %w[edge coverage audit].freeze
|
|
18
|
+
|
|
19
|
+
# @param report [Report] where each guard is recorded
|
|
20
|
+
# @param held [HeldDomain] the loaded domain
|
|
21
|
+
# @param options [Hash] `rehearsal_ref`, `rehearsal_watermark`, `rehearsal_verdict`
|
|
22
|
+
def initialize(report, held, options)
|
|
23
|
+
@report = report
|
|
24
|
+
@held = held
|
|
25
|
+
@options = options
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @return [String, nil] the command line to run when the mint would go ahead
|
|
29
|
+
def call
|
|
30
|
+
Store.reading(@held) { |lineage, db| inspect_store(lineage, db) }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def inspect_store(lineage, db)
|
|
36
|
+
eras = []
|
|
37
|
+
answer = nil
|
|
38
|
+
@report.check("eras") do
|
|
39
|
+
eras, answer = resolve(lineage)
|
|
40
|
+
[:pass, resolved_words(answer)]
|
|
41
|
+
end
|
|
42
|
+
watermark = WatermarkGuards.new(@report, db, lineage)
|
|
43
|
+
edge = proceed(lineage, eras, answer) if answer
|
|
44
|
+
watermark.call(**ref_options)
|
|
45
|
+
line(answer, eras, watermark) if edge
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def resolve(lineage)
|
|
49
|
+
eras = @held.held_eras(lineage)
|
|
50
|
+
raise Runtime::WiringError, "#{@held.domain_name} holds no era; hold the first era before a mint" if eras.empty?
|
|
51
|
+
|
|
52
|
+
named = [*eras[0...-1], @held.named(eras.last)]
|
|
53
|
+
[eras, PostgresEra::LineageManager::EraResolution.resolve(
|
|
54
|
+
eras: named, bluebook: @held.bluebook, translations: @held.translations, directory: @held.directory
|
|
55
|
+
) { lineage.last_ordinal }]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def resolved_words(answer)
|
|
59
|
+
"#{answer.status}: #{answer.reason || "the latest era holds the current shape"} " \
|
|
60
|
+
"(#{answer.held_count} era(s) held)"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def proceed(lineage, eras, answer)
|
|
64
|
+
return held_shape(answer) unless %w[behind unminted].include?(answer.status)
|
|
65
|
+
|
|
66
|
+
verdict = answer.verdict
|
|
67
|
+
@report.add("decision", :info, "#{verdict.verdict}#{": #{verdict.reason}" if verdict.reason} (#{answer.status})")
|
|
68
|
+
EdgeGuards.new(@report, @held, lineage).call(eras, verdict)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# The mint refuses a shape an era already holds; a current shape is no change at all.
|
|
72
|
+
def held_shape(answer)
|
|
73
|
+
@report.skip(LATER, "no mint: the shape is held")
|
|
74
|
+
return @report.settle("no_change") && nil if answer.status == "current"
|
|
75
|
+
|
|
76
|
+
@report.add("held_shape", :refuse, answer.reason)
|
|
77
|
+
nil
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def ref_options
|
|
81
|
+
{ ref: @options[:rehearsal_ref], watermark: @options[:rehearsal_watermark], verdict: @options[:rehearsal_verdict] }
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def line(answer, eras, watermark)
|
|
85
|
+
return if @report.refused?
|
|
86
|
+
|
|
87
|
+
CommandLine.new(@held, answer.verdict, @held.named(eras.last), watermark.live).to_s
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../held_domain"
|
|
4
|
+
require_relative "report"
|
|
5
|
+
require_relative "world"
|
|
6
|
+
require_relative "inspection"
|
|
7
|
+
|
|
8
|
+
module Hecks
|
|
9
|
+
module Adapters
|
|
10
|
+
class JournalStore
|
|
11
|
+
module Readings
|
|
12
|
+
module MintPlan
|
|
13
|
+
# The preflight of a mint: every guard the mint runs, against the store it would mint in,
|
|
14
|
+
# read-only. It decides nothing of its own; each guard calls the function the mint calls.
|
|
15
|
+
class Plan
|
|
16
|
+
AFTER_WORLD = %w[eras held_shape edge coverage audit watermark].freeze
|
|
17
|
+
|
|
18
|
+
# @param directory [String] the domain directory
|
|
19
|
+
# @param options [Hash] `bluebook`, `rehearsal_ref`, `rehearsal_watermark`,
|
|
20
|
+
# `rehearsal_verdict`, `dev_dir`
|
|
21
|
+
def initialize(directory, **options)
|
|
22
|
+
@directory = directory
|
|
23
|
+
@options = options
|
|
24
|
+
@report = Report.new
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @return [Hash] `plan`, `guards`, `command` and `seconds`
|
|
28
|
+
def to_h
|
|
29
|
+
loaded = @report.check("load") { load_domain } == "pass"
|
|
30
|
+
held = @held if loaded
|
|
31
|
+
command = held && gather(held)
|
|
32
|
+
{ domain: held&.domain_name, directory: @directory, plan: @report.plan,
|
|
33
|
+
guards: @report.guards, command: command, seconds: @report.seconds }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def load_domain
|
|
39
|
+
@held = HeldDomain.open(@directory, mode: :translated)
|
|
40
|
+
name = @options[:bluebook]
|
|
41
|
+
@held = HeldDomain.new(@held.registry, @held.directory, name) unless name.to_s.empty?
|
|
42
|
+
[:pass, "#{@held.domain_name} loaded from #{@held.directory}, no domain booted"]
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def gather(held)
|
|
46
|
+
world = World.new(held, dev_dir: @options[:dev_dir])
|
|
47
|
+
@report.add("world", :info, world.flags)
|
|
48
|
+
@report.check("stranded") { world.stranded }
|
|
49
|
+
@report.add("quiesce", *world.quiesce)
|
|
50
|
+
return settle("disposable", "disposable: no mint needed") if world.disposable?
|
|
51
|
+
return settle("no_change", "#{held.adapter_name} holds no eras: no mint") unless held.capable?
|
|
52
|
+
|
|
53
|
+
Inspection.new(@report, held, @options).call
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def settle(plan, why)
|
|
57
|
+
@report.settle(plan)
|
|
58
|
+
@report.skip(AFTER_WORLD, why)
|
|
59
|
+
nil
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module Adapters
|
|
5
|
+
class JournalStore
|
|
6
|
+
module Readings
|
|
7
|
+
module MintPlan
|
|
8
|
+
# The guards a plan has run, in order, each with its status, its words and the seconds it
|
|
9
|
+
# took, and the plan they add up to.
|
|
10
|
+
class Report
|
|
11
|
+
STATUSES = %w[pass refuse skipped info].freeze
|
|
12
|
+
|
|
13
|
+
attr_reader :guards
|
|
14
|
+
|
|
15
|
+
def initialize
|
|
16
|
+
@guards = []
|
|
17
|
+
@started = now
|
|
18
|
+
@settled = nil
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Runs a guard's check, which answers `[status, detail]`, and records it with its
|
|
22
|
+
# time. A refusal the mint raises as a `WiringError` is the guard's refusal.
|
|
23
|
+
#
|
|
24
|
+
# @param name [String] the guard
|
|
25
|
+
# @yieldreturn [Array(Symbol, String)] the status and the detail
|
|
26
|
+
# @return [String] the status recorded
|
|
27
|
+
def check(name)
|
|
28
|
+
began = now
|
|
29
|
+
status, detail = yield
|
|
30
|
+
record(name, status, detail, began)
|
|
31
|
+
rescue Runtime::WiringError, Runtime::NotFound => e
|
|
32
|
+
record(name, :refuse, e.message.strip, began)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @return [String] the status recorded
|
|
36
|
+
def add(name, status, detail) = record(name, status, detail, now)
|
|
37
|
+
|
|
38
|
+
# @param names [Array<String>] guards that did not run
|
|
39
|
+
# @param why [String] the reason, which is the guard that stopped the plan
|
|
40
|
+
# @return [void]
|
|
41
|
+
def skip(names, why) = names.each { |name| add(name, :skipped, why) }
|
|
42
|
+
|
|
43
|
+
# Fixes the plan whatever the guards say: a shape that did not move, a disposable
|
|
44
|
+
# ledger.
|
|
45
|
+
#
|
|
46
|
+
# @param plan [String] `no_change` or `disposable`
|
|
47
|
+
# @return [void]
|
|
48
|
+
def settle(plan) = @settled = plan
|
|
49
|
+
|
|
50
|
+
# @return [Boolean] whether a guard refused
|
|
51
|
+
def refused? = guards.any? { |guard| guard[:status] == "refuse" }
|
|
52
|
+
|
|
53
|
+
# @return [String] `would_mint`, `would_refuse`, `no_change` or `disposable`
|
|
54
|
+
def plan = @settled || (refused? ? "would_refuse" : "would_mint")
|
|
55
|
+
|
|
56
|
+
# @return [Float] the seconds since the plan began
|
|
57
|
+
def seconds = (now - @started).round(3)
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
def now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
62
|
+
|
|
63
|
+
def record(name, status, detail, began)
|
|
64
|
+
guards << { guard: name, status: status.to_s, detail: detail, seconds: (now - began).round(3) }
|
|
65
|
+
status.to_s
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module Adapters
|
|
5
|
+
class JournalStore
|
|
6
|
+
module Readings
|
|
7
|
+
module MintPlan
|
|
8
|
+
# The store a plan reads: a connection that refuses every write, nothing provisioned, and
|
|
9
|
+
# a lineage over it that names no era. No temporary database or table is made.
|
|
10
|
+
module Store
|
|
11
|
+
module_function
|
|
12
|
+
|
|
13
|
+
# @param held [HeldDomain] the loaded domain
|
|
14
|
+
# @yield [Lineage, PG::Connection] the read-only lineage and its connection
|
|
15
|
+
# @return [Object] the block's value
|
|
16
|
+
# @raise [Runtime::WiringError] if the connection is refused
|
|
17
|
+
def reading(held)
|
|
18
|
+
db = PostgresEra.connect_for(held.domain_name, held.settings, provision: false)
|
|
19
|
+
db.exec("SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY")
|
|
20
|
+
yield lineage_over(db, held), db
|
|
21
|
+
ensure
|
|
22
|
+
db&.close
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def lineage_over(db, held)
|
|
26
|
+
bluebook = held.bluebook
|
|
27
|
+
PostgresEra::Lineage.new(db, bluebook.name, formerly_known_as: bluebook.formerly_known_as, reading: true)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../../../../quality_control/adapters/qa_auto_mint"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Adapters
|
|
7
|
+
class JournalStore
|
|
8
|
+
module Readings
|
|
9
|
+
module MintPlan
|
|
10
|
+
# The watermark the mint reads and the freshness of a rehearsal against it, by the mint's
|
|
11
|
+
# own rule (`QaAutoMint.stale_watermark`): the ledger may move only by the run's own
|
|
12
|
+
# `Maintenance` record, counted by `Lineage#rows_of_after`.
|
|
13
|
+
class WatermarkGuards
|
|
14
|
+
RECORDED = <<~SQL
|
|
15
|
+
SELECT payload->>'watermark' AS watermark, payload->'rehearsal_verdict'->>'value' AS verdict
|
|
16
|
+
FROM events
|
|
17
|
+
WHERE name IN ('RehearsalVerdict', 'MintRequested')
|
|
18
|
+
AND (payload->>'rehearsal_ref' = $1 OR payload->'run'->>'value' = $1 OR aggregate_id = $1)
|
|
19
|
+
ORDER BY id DESC LIMIT 1
|
|
20
|
+
SQL
|
|
21
|
+
RULE = "the mint refuses when the ledger moved by anything but the run's own Maintenance record"
|
|
22
|
+
|
|
23
|
+
# @param report [Report] where each guard is recorded
|
|
24
|
+
# @param db [PG::Connection] the read-only connection
|
|
25
|
+
# @param lineage [Lineage] a read-only lineage over the store
|
|
26
|
+
def initialize(report, db, lineage)
|
|
27
|
+
@report = report
|
|
28
|
+
@db = db
|
|
29
|
+
@lineage = lineage
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @return [Integer] the live watermark, which is the `watermark=` the mint call takes
|
|
33
|
+
def live
|
|
34
|
+
@live ||= @lineage.last_ordinal
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Records the live watermark and, when a rehearsal ref is given, whether that rehearsal
|
|
38
|
+
# is stale.
|
|
39
|
+
#
|
|
40
|
+
# @param ref [String, nil] the rehearsal's run id
|
|
41
|
+
# @param watermark [Integer, nil] the watermark that rehearsal read
|
|
42
|
+
# @param verdict [String, nil] the verdict that rehearsal gave, when the caller has it
|
|
43
|
+
# @return [void]
|
|
44
|
+
def call(ref: nil, watermark: nil, verdict: nil)
|
|
45
|
+
@report.add("watermark", :info, "live watermark #{live}; pass watermark=#{live}; #{RULE}")
|
|
46
|
+
return unless ref
|
|
47
|
+
|
|
48
|
+
@report.check("rehearsal_ref") { rehearsal(ref, watermark, verdict) }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def rehearsal(ref, watermark, verdict)
|
|
54
|
+
watermark, verdict = recorded(ref) if watermark.nil? || verdict.nil?
|
|
55
|
+
return [:refuse, unknown(ref)] if watermark.nil?
|
|
56
|
+
return [:refuse, "rehearsal #{ref} said #{verdict.inspect}, not would_mint"] unless verdict == "would_mint"
|
|
57
|
+
|
|
58
|
+
freshness(ref, watermark)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def freshness(ref, watermark)
|
|
62
|
+
own = @lineage.rows_of_after(watermark, "maintenance", ref)
|
|
63
|
+
stale = QaAutoMint.stale_watermark(watermark, live, own_rows: own)
|
|
64
|
+
return [:refuse, stale] if stale
|
|
65
|
+
|
|
66
|
+
[:pass, "rehearsal #{ref} read watermark #{watermark}; #{own} row(s) above it are the run's own record"]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def unknown(ref)
|
|
70
|
+
"no record of rehearsal #{ref}: a rehearsal is kept by the process that ran it; pass " \
|
|
71
|
+
"rehearsal_watermark= and rehearsal_verdict= from its answer"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# The verdict and watermark of a rehearsal the ledger recorded, or a mint that took it.
|
|
75
|
+
def recorded(ref)
|
|
76
|
+
return [nil, nil] unless @db.exec("SELECT to_regclass('events')").getvalue(0, 0)
|
|
77
|
+
|
|
78
|
+
row = @db.exec_params(RECORDED, [ref]).first
|
|
79
|
+
row ? [row["watermark"]&.to_i, row["verdict"]] : [nil, nil]
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Adapters
|
|
7
|
+
class JournalStore
|
|
8
|
+
module Readings
|
|
9
|
+
module MintPlan
|
|
10
|
+
# What the world around a store says about a mint: the flags its world declares, the
|
|
11
|
+
# marker a stranded landing leaves (`MainMaintenance` refuses every mint while it stands)
|
|
12
|
+
# and the marker another agent leaves to quiesce the ledger. Only files and settings are
|
|
13
|
+
# read.
|
|
14
|
+
class World
|
|
15
|
+
# @param held [HeldDomain] the loaded domain
|
|
16
|
+
# @param dev_dir [String, nil] where the markers live; `HECKS_DEV_STATE`, else
|
|
17
|
+
# `~/.claude/hecks-dev`
|
|
18
|
+
def initialize(held, dev_dir: nil)
|
|
19
|
+
@held = held
|
|
20
|
+
@dev_dir = dev_dir || ENV.fetch("HECKS_DEV_STATE", File.expand_path("~/.claude/hecks-dev"))
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @return [Boolean] whether the world declares `disposable_ledger true`
|
|
24
|
+
def disposable?
|
|
25
|
+
PostgresEra::LineageManager::DisposableLedger.declared?(@held.settings)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @return [String] the flags, in words
|
|
29
|
+
def flags
|
|
30
|
+
"bound to #{@held.adapter_name}; mint_eras=#{setting(:mint_eras)}; " \
|
|
31
|
+
"disposable_ledger=#{setting(:disposable_ledger)}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @return [Boolean] whether the world lets a copy mint
|
|
35
|
+
def mint_eras? = [true, "true"].include?(setting(:mint_eras, false))
|
|
36
|
+
|
|
37
|
+
# @return [Array(Symbol, String)] refuse while a stranded landing stands
|
|
38
|
+
def stranded
|
|
39
|
+
return [:pass, "no stranded landing (#{stranded_path})"] unless File.exist?(stranded_path)
|
|
40
|
+
|
|
41
|
+
[:refuse, "mints are refused until the stranded landing is resolved: #{File.read(stranded_path).strip}"]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# @return [Array(Symbol, String)] the quiesce markers that stand, if any
|
|
45
|
+
def quiesce
|
|
46
|
+
found = Dir.glob([File.join(@dev_dir, "quiesce"), File.join(@dev_dir, "qa_quiesce.*")])
|
|
47
|
+
return [:info, "no quiesce marker in #{@dev_dir}"] if found.empty?
|
|
48
|
+
|
|
49
|
+
[:info, "quiesced by another agent: #{found.join(", ")}"]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def setting(key, default = "unset")
|
|
55
|
+
PostgresEra.setting(@held.settings, key, default: default)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def stranded_path
|
|
59
|
+
File.join(ENV.fetch("HECKS_MINT_STATE", File.join(@dev_dir, "mint")), "stranded.json")
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
require_relative "mint_plan/plan"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module Adapters
|
|
8
|
+
class JournalStore
|
|
9
|
+
module Readings
|
|
10
|
+
# The preflight of a mint, answered from the live store without copying it. It runs
|
|
11
|
+
# every guard the mint runs, each by the function the mint calls, over a connection that
|
|
12
|
+
# refuses writes, and never boots the domain, so it cannot claim an outbox row. The Rust
|
|
13
|
+
# parity pass and the engine run belong to the full rehearsal and are not part of it.
|
|
14
|
+
module MintPlan
|
|
15
|
+
# @param domain [Hash, String] the domain directory
|
|
16
|
+
# @param bluebook [Hash, String, nil] the bluebook of the directory to plan; the first
|
|
17
|
+
# when absent
|
|
18
|
+
# @param rehearsal_ref [Hash, String, nil] the rehearsal run whose freshness to judge
|
|
19
|
+
# @param rehearsal_watermark [Hash, Integer, nil] the watermark that rehearsal read
|
|
20
|
+
# @param rehearsal_verdict [Hash, String, nil] the verdict that rehearsal gave
|
|
21
|
+
# @return [Hash] `text:` the plan as JSON: per guard `guard`, `status`, `detail`,
|
|
22
|
+
# `seconds`; the overall `plan`; the `command` to run; the total `seconds`
|
|
23
|
+
# @raise [Runtime::NotFound] if a lower layer refuses outside a guard
|
|
24
|
+
def mint_plan(domain:, bluebook: nil, rehearsal_ref: nil, rehearsal_watermark: nil, rehearsal_verdict: nil)
|
|
25
|
+
answering do
|
|
26
|
+
asked = { bluebook: bluebook, rehearsal_ref: rehearsal_ref, rehearsal_verdict: rehearsal_verdict,
|
|
27
|
+
rehearsal_watermark: rehearsal_watermark }.transform_values { |value| plain(value) }
|
|
28
|
+
asked[:rehearsal_watermark] &&= asked[:rehearsal_watermark].to_i
|
|
29
|
+
JSON.pretty_generate(Plan.new(plain(domain), **asked).to_h)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
require "hecks/ports/persistence/plugins/era"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module Adapters
|
|
8
|
+
class JournalStore
|
|
9
|
+
module Readings
|
|
10
|
+
# Whether each era's stored hash is the hash of its stored projection. A held projection is
|
|
11
|
+
# trusted to say what shape an era holds, so one that was edited, copied from another era or
|
|
12
|
+
# written for another bluebook leaves the era's name describing a shape it does not hold.
|
|
13
|
+
# The reading only selects: it recomputes `ProjectedBluebook#mint_hash` and compares.
|
|
14
|
+
module ProjectionAudit
|
|
15
|
+
# Every bluebook under a domain directory, each against the database its own world names.
|
|
16
|
+
#
|
|
17
|
+
# @param domain [Hash, String] the domain directory
|
|
18
|
+
# @return [Hash] `text:` the audit as JSON: the eras read and each mismatch found
|
|
19
|
+
# @raise [Runtime::NotFound] if the directory cannot be loaded or a database refuses
|
|
20
|
+
def projection_audit(domain:)
|
|
21
|
+
answering do
|
|
22
|
+
directory = plain(domain)
|
|
23
|
+
registry = Hecks.describe(directory).registry
|
|
24
|
+
rows = registry.bluebooks.each_key.flat_map { |name| ProjectionAudit.of(registry, directory, name) }
|
|
25
|
+
JSON.pretty_generate({ "domain" => directory, "mismatches" => rows })
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @param registry [Runtime::Registry] a described registry
|
|
30
|
+
# @param directory [String] the domain's bluebook directory
|
|
31
|
+
# @param name [String] the bluebook's name
|
|
32
|
+
# @return [Array<Hash>] one row per era whose hash differs from its projection's
|
|
33
|
+
def self.of(registry, directory, name)
|
|
34
|
+
held = HeldDomain.new(registry, directory, name)
|
|
35
|
+
return [] unless held.capable?
|
|
36
|
+
|
|
37
|
+
held.reading { |lineage| mismatches(name, held.held_eras(lineage)) }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @param domain [String] the domain's name
|
|
41
|
+
# @param eras [Array<Hash>] eras as `Lineage#eras` answers them
|
|
42
|
+
# @return [Array<Hash>] `domain`, `ordinal`, `stored` hash and `recomputed` hash of each
|
|
43
|
+
# era whose projection hashes to another value; an era without both is skipped
|
|
44
|
+
def self.mismatches(domain, eras)
|
|
45
|
+
eras.filter_map do |era|
|
|
46
|
+
recomputed = recomputed_hash(era)
|
|
47
|
+
next if recomputed.nil? || recomputed == era[:hash]
|
|
48
|
+
|
|
49
|
+
{ "domain" => domain, "ordinal" => era[:ordinal], "stored" => era[:hash], "recomputed" => recomputed }
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @param era [Hash] an era with `hash` and `projection`
|
|
54
|
+
# @return [String, nil] the hash of the stored projection; nil when the era lacks either
|
|
55
|
+
def self.recomputed_hash(era)
|
|
56
|
+
return unless era[:hash] && era[:projection]
|
|
57
|
+
|
|
58
|
+
Runtime::ProjectedBluebook.new(era[:projection]).mint_hash
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -20,11 +20,11 @@ module Hecks
|
|
|
20
20
|
|
|
21
21
|
# The edge text for the latest era, or why there is nothing to scaffold.
|
|
22
22
|
def scaffold_latest(held, latest)
|
|
23
|
-
shadow = PostgresEra::LineageManager.shadow(latest[:held_text])
|
|
24
23
|
return "#{held.domain_name} matches era #{latest[:ordinal]} — nothing to scaffold." if
|
|
25
|
-
|
|
24
|
+
PostgresEra::LineageManager.held_shape(latest) == held.shape
|
|
26
25
|
|
|
27
|
-
|
|
26
|
+
declared = PostgresEra::LineageManager.held_bluebook(latest)
|
|
27
|
+
edge_text(held, latest, Translation::Scaffold.diff(declared, held.bluebook))
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
def edge_text(held, latest, diffed)
|