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
data/lib/hecks/corpus/rust.rb
CHANGED
|
@@ -23,13 +23,11 @@ module Hecks
|
|
|
23
23
|
RUST_COVERAGE_PENDING = {}.freeze
|
|
24
24
|
|
|
25
25
|
# The stamp hecks project_rust writes into metadata.rs, e.g.
|
|
26
|
-
# `examples/pizzas` or `the self-hosted language (...)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
's\ own\ canonical\ IR,
|
|
32
|
-
/x
|
|
26
|
+
# `examples/pizzas` or `the self-hosted language (...)`; a bluebook's is its own name.
|
|
27
|
+
SOURCE_STAMP = /GENERATED\ by\ hecks\ project_rust\ —\ (.+?)'s\ own\ canonical\ IR,/
|
|
28
|
+
|
|
29
|
+
# Raised when a name is not a domain the corpus regenerates; the message lists the valid ones.
|
|
30
|
+
class UnknownDomain < ArgumentError; end
|
|
33
31
|
|
|
34
32
|
# The Rust-facing lists: which domains and bluebooks `rust/` carries, read off Cargo's
|
|
35
33
|
# `[features]` and the generated modules rather than typed out by hand. Extended onto
|
|
@@ -48,7 +46,7 @@ module Hecks
|
|
|
48
46
|
BLUEBOOK_NAME = /^\s*Hecks\.bluebook\s+"([^"]+)"/
|
|
49
47
|
|
|
50
48
|
# The corpus kinds holding bluebooks the gem carries and a hecksagon attaches by name.
|
|
51
|
-
GEM_BLUEBOOK_KINDS = %i[qa deploy site tickets composer tenancy sme bulk].freeze
|
|
49
|
+
GEM_BLUEBOOK_KINDS = %i[qa deploy site tickets composer tenancy sme bulk ci_pipeline].freeze
|
|
52
50
|
|
|
53
51
|
# Every place a Rust-facing domain's own `attaches` attachment could be declared.
|
|
54
52
|
#
|
|
@@ -75,7 +73,7 @@ module Hecks
|
|
|
75
73
|
cargo_features_table(root: root).scan(EMPTY_FEATURE).flatten
|
|
76
74
|
end
|
|
77
75
|
|
|
78
|
-
# The feature
|
|
76
|
+
# The feature Cargo's `default` names: the one a corpus run keeps it on.
|
|
79
77
|
#
|
|
80
78
|
# @param root [String] repository root to search under
|
|
81
79
|
# @return [String, nil] the default feature's name, or nil when Cargo.toml
|
|
@@ -215,8 +213,8 @@ module Hecks
|
|
|
215
213
|
members(*GEM_BLUEBOOK_KINDS, root: root).filter_map { |member| File.read(member.path)[BLUEBOOK_NAME, 1] }.uniq
|
|
216
214
|
end
|
|
217
215
|
|
|
218
|
-
# The regeneration order the drift check runs, sorted by path
|
|
219
|
-
#
|
|
216
|
+
# The regeneration order the drift check runs, sorted by path, and the domains a corpus
|
|
217
|
+
# run declares to `hecks project_rust`.
|
|
220
218
|
#
|
|
221
219
|
# @param root [String] repository root to search under
|
|
222
220
|
# @return [Array<RustDomain>] every Rust domain with a Cargo feature, in regeneration order:
|
|
@@ -224,6 +222,24 @@ module Hecks
|
|
|
224
222
|
def rust_regen_order(root: ROOT)
|
|
225
223
|
rust_domains(root: root)
|
|
226
224
|
end
|
|
225
|
+
|
|
226
|
+
# The named domains of the regeneration order, in that order whatever order they are named in.
|
|
227
|
+
#
|
|
228
|
+
# @param names [Array<String>, nil] feature names; nil names every domain
|
|
229
|
+
# @param root [String] repository root to search under
|
|
230
|
+
# @return [Array<RustDomain>] the named domains, in regeneration order
|
|
231
|
+
# @raise [UnknownDomain] when a name is not a domain's feature, listing the valid ones
|
|
232
|
+
def rust_domains_named(names, root: ROOT)
|
|
233
|
+
order = rust_regen_order(root: root)
|
|
234
|
+
return order if names.nil?
|
|
235
|
+
|
|
236
|
+
unknown = names - order.map(&:feature)
|
|
237
|
+
unless unknown.empty?
|
|
238
|
+
raise UnknownDomain, "unknown domain(s) #{unknown.join(", ")}; valid: #{order.map(&:feature).sort.join(", ")}"
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
order.select { |domain| names.include?(domain.feature) }
|
|
242
|
+
end
|
|
227
243
|
end
|
|
228
244
|
end
|
|
229
245
|
end
|
data/lib/hecks/corpus/sources.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
require_relative "../module_folders"
|
|
1
2
|
module Hecks
|
|
2
3
|
module Corpus
|
|
3
4
|
# How a domain's hecksagon names a bluebook the gem carries and loads by name, as the QA
|
|
@@ -15,7 +16,7 @@ module Hecks
|
|
|
15
16
|
# @return [Array<String>, nil] `.bluebook` file paths found, or nil when none
|
|
16
17
|
def bluebook_files(domain_path)
|
|
17
18
|
[File.join(domain_path, "bluebook"), domain_path].each do |dir|
|
|
18
|
-
files =
|
|
19
|
+
files = ModuleFolders.all(dir)
|
|
19
20
|
return files unless files.empty?
|
|
20
21
|
end
|
|
21
22
|
attached_bluebook_files(domain_path)
|
data/lib/hecks/corpus.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
require_relative "fuzzing/target_capabilities"
|
|
2
2
|
require_relative "corpus/adapters"
|
|
3
|
+
require_relative "corpus/generated_key"
|
|
4
|
+
require_relative "corpus/listing"
|
|
3
5
|
require_relative "corpus/routes"
|
|
4
6
|
require_relative "corpus/rust"
|
|
5
7
|
require_relative "corpus/sources"
|
|
@@ -23,6 +25,9 @@ module Hecks
|
|
|
23
25
|
# The Hecks domain (ADR 0080): its bluebooks share one namespace and one hecksagon, so
|
|
24
26
|
# they load together, as a directory, never file by file.
|
|
25
27
|
hecks: "lib/hecks/hecks",
|
|
28
|
+
# The Coder and Fixer domains keep their bluebook beside their hecksagon in their own folder.
|
|
29
|
+
coder: "lib/hecks/coder",
|
|
30
|
+
fixer: "lib/hecks/fixer",
|
|
26
31
|
# A package vendored via `attaches ... from: :vendor` — nested inside the
|
|
27
32
|
# consuming example's own checkout, not this gem's own framework/bluebook/.
|
|
28
33
|
vendored: "examples/*/vendor/embryonaut_bluebooks/*"
|
|
@@ -32,24 +37,31 @@ module Hecks
|
|
|
32
37
|
# prefix, so a nested fixture keeps its subdirectory (`eras/base`)
|
|
33
38
|
# and never collides with a same-named file elsewhere in the kind.
|
|
34
39
|
FILE_KINDS = {
|
|
35
|
-
grammar:
|
|
36
|
-
framework:
|
|
37
|
-
qa:
|
|
38
|
-
language:
|
|
39
|
-
deploy:
|
|
40
|
-
site:
|
|
41
|
-
rails_app:
|
|
42
|
-
tickets:
|
|
43
|
-
composer:
|
|
44
|
-
tenancy:
|
|
45
|
-
bulk:
|
|
46
|
-
sme:
|
|
47
|
-
|
|
40
|
+
grammar: "lib/hecks/grammar/*.bluebook",
|
|
41
|
+
framework: "lib/hecks/framework/bluebook/*.bluebook",
|
|
42
|
+
qa: "lib/hecks/quality_control/*.bluebook",
|
|
43
|
+
language: "lib/hecks/language/**/*.bluebook",
|
|
44
|
+
deploy: "lib/hecks/deploy/bluebook/*.bluebook",
|
|
45
|
+
site: "lib/hecks/site/bluebook/*.bluebook",
|
|
46
|
+
rails_app: "lib/hecks/rails_app/bluebook/*.bluebook",
|
|
47
|
+
tickets: "lib/hecks/tickets/bluebook/*.bluebook",
|
|
48
|
+
composer: "lib/hecks/composer/bluebook/*.bluebook",
|
|
49
|
+
tenancy: "lib/hecks/tenancy/bluebook/*.bluebook",
|
|
50
|
+
bulk: "lib/hecks/bulk/bluebook/*.bluebook",
|
|
51
|
+
sme: "lib/hecks/sme/bluebook/*.bluebook",
|
|
52
|
+
# The CI bluebooks keep their bluebook beside their hecksagon, not under a `bluebook/` folder.
|
|
53
|
+
# CiPipeline is attachable; CiSpeed boots from its own directory; CiWorkflows is the client
|
|
54
|
+
# whose rows project into .github/workflows.
|
|
55
|
+
ci_pipeline: "lib/hecks/ci_pipeline/*.bluebook",
|
|
56
|
+
ci_speed: "lib/hecks/ci_speed/*.bluebook",
|
|
57
|
+
ci_workflows: "lib/hecks/ci_workflows/*.bluebook",
|
|
58
|
+
fixture: "spec/fixtures/**/*.bluebook"
|
|
48
59
|
}.freeze
|
|
49
60
|
|
|
50
61
|
KINDS = (DIRECTORY_KINDS.keys + FILE_KINDS.keys).freeze
|
|
51
62
|
|
|
52
63
|
extend Adapters
|
|
64
|
+
extend Listing
|
|
53
65
|
extend Rust
|
|
54
66
|
extend Sources
|
|
55
67
|
extend Worlds
|
|
@@ -68,33 +80,6 @@ module Hecks
|
|
|
68
80
|
kinds.flat_map { |kind| kind_members(kind, root) }
|
|
69
81
|
end
|
|
70
82
|
|
|
71
|
-
# @return [Array<Member>] the members of one kind: a directory each, or a file each
|
|
72
|
-
# @raise [ArgumentError] if `kind` is not in `KINDS`
|
|
73
|
-
def kind_members(kind, root)
|
|
74
|
-
if (glob = DIRECTORY_KINDS[kind])
|
|
75
|
-
directory_members(kind, root, glob)
|
|
76
|
-
elsif (glob = FILE_KINDS[kind])
|
|
77
|
-
file_members(kind, root, glob)
|
|
78
|
-
else
|
|
79
|
-
raise ArgumentError, "unknown corpus kind #{kind.inspect} — known: #{KINDS.join(", ")}"
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def directory_members(kind, root, glob)
|
|
84
|
-
directories(root, glob).map { |dir| Member.new(File.basename(dir), kind, dir) }
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def directories(root, glob) = Dir.glob(File.join(root, glob)).select { |path| File.directory?(path) }.sort
|
|
88
|
-
|
|
89
|
-
# The part of a glob before its first wildcard.
|
|
90
|
-
GLOB_FIXED_PREFIX = /\A[^*]*/
|
|
91
|
-
|
|
92
|
-
def file_members(kind, root, glob)
|
|
93
|
-
prefix = File.join(root, glob[GLOB_FIXED_PREFIX].chomp("/"))
|
|
94
|
-
Dir.glob(File.join(root, glob))
|
|
95
|
-
.map { |file| Member.new(file.delete_prefix("#{prefix}/").delete_suffix(".bluebook"), kind, file) }
|
|
96
|
-
end
|
|
97
|
-
|
|
98
83
|
# What a boot loads for a member — a directory kind's bluebook
|
|
99
84
|
# directory, or a file kind's own file.
|
|
100
85
|
#
|
|
@@ -144,13 +129,14 @@ module Hecks
|
|
|
144
129
|
end
|
|
145
130
|
|
|
146
131
|
# Every bootable domain in the project — any directory holding a
|
|
147
|
-
# `.bluebook` no route sends elsewhere (a `bluebook/` folder stands for its parent)
|
|
132
|
+
# `.bluebook` no route sends elsewhere (a `bluebook/` folder stands for its parent),
|
|
133
|
+
# less module folders, which their parent's bluebook stands for.
|
|
148
134
|
#
|
|
149
135
|
# @param root [String] repository root to search under
|
|
150
136
|
# @return [Array<String>] absolute paths of every sweepable domain directory
|
|
151
137
|
def sweepable_domains(root = ROOT)
|
|
152
138
|
Dir.chdir(root) do
|
|
153
|
-
swept = Dir.glob("**/*.bluebook").reject { |path| route_for(path) }
|
|
139
|
+
swept = Dir.glob("**/*.bluebook").reject { |path| route_for(path) || module_bluebook?(path) }
|
|
154
140
|
dirs = swept.map { |path| owning_dir(File.dirname(path)) }
|
|
155
141
|
dirs.uniq.sort.map { |dir| File.join(root, dir) }
|
|
156
142
|
end
|
|
@@ -159,6 +145,15 @@ module Hecks
|
|
|
159
145
|
# The domain directory a bluebook directory stands for: a `bluebook/` folder is its parent.
|
|
160
146
|
def owning_dir(dir) = File.basename(dir) == "bluebook" ? File.dirname(dir) : dir
|
|
161
147
|
|
|
148
|
+
# A bluebook line that opens a `domain_module`.
|
|
149
|
+
MODULE_OPENING = /^\s*domain_module\b/
|
|
150
|
+
|
|
151
|
+
# Whether a bluebook is a module folder's (ADR 0163): it opens a `domain_module` of the parent's
|
|
152
|
+
# bluebook, so its folder is no domain on its own and cannot boot alone.
|
|
153
|
+
def module_bluebook?(path)
|
|
154
|
+
File.basename(path, ".bluebook") == File.basename(File.dirname(path)) && File.read(path).match?(MODULE_OPENING)
|
|
155
|
+
end
|
|
156
|
+
|
|
162
157
|
# Sweepable domains a fuzz cannot boot from its copy, by repo-relative directory, each with
|
|
163
158
|
# the reason. A fuzz boots a tmpdir copy of a domain to isolate its state.
|
|
164
159
|
FUZZ_UNBOOTABLE = {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
# Says a deprecation once per process, so a boot that checks twice is not noisy. A bluebook's
|
|
3
|
+
# `formerly_known_as` is the first: the notice names the world line that replaces it.
|
|
4
|
+
module Deprecation
|
|
5
|
+
module_function
|
|
6
|
+
|
|
7
|
+
# @param key [Array<String>] what the notice is about, such as the domain and aggregate
|
|
8
|
+
# @param text [String] the warning
|
|
9
|
+
# @param err [#puts] where it goes
|
|
10
|
+
# @return [String, nil] the text when it was said now, nil when it had been said already
|
|
11
|
+
def once(key, text, err: $stderr)
|
|
12
|
+
@seen ||= {}
|
|
13
|
+
return if @seen[key]
|
|
14
|
+
|
|
15
|
+
@seen[key] = true
|
|
16
|
+
err.puts(text)
|
|
17
|
+
text
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Forgets what was said, so a spec can hear a notice again.
|
|
21
|
+
def forget! = @seen = {}
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -44,7 +44,7 @@ module Hecks
|
|
|
44
44
|
def diagram_showcase(root)
|
|
45
45
|
lifecycle = File.read(File.join(root, "docs/generated/diagrams/pizzas/Order_lifecycle.mmd")).strip
|
|
46
46
|
<<~MARKDOWN.strip
|
|
47
|
-
`hecks project_diagrams` reads a booted domain's own declaration and draws it as Mermaid — `<Name>_lifecycle.mmd`, `relationships.mmd`, `dispatch.mmd`, `roles.mmd`, `ports.mmd`, `read_models.mmd`, `<Name>_surface.mmd` (what a command does, and what it writes), `<Name>_saga.mmd`, and `frameworks.mmd`. Nothing hand-drawn — the same reason a domain is data at all. Order's own lifecycle, straight off the bluebook above:
|
|
47
|
+
`hecks query introspection.project_diagrams` reads a booted domain's own declaration and draws it as Mermaid — `<Name>_lifecycle.mmd`, `relationships.mmd`, `dispatch.mmd`, `roles.mmd`, `ports.mmd`, `read_models.mmd`, `<Name>_surface.mmd` (what a command does, and what it writes), `<Name>_saga.mmd`, and `frameworks.mmd`. Nothing hand-drawn — the same reason a domain is data at all. Order's own lifecycle, straight off the bluebook above:
|
|
48
48
|
|
|
49
49
|
```mermaid
|
|
50
50
|
#{lifecycle}
|
|
@@ -36,7 +36,7 @@ module Hecks
|
|
|
36
36
|
|
|
37
37
|
*The tables on this page are generated from the language's own
|
|
38
38
|
aggregate-local syntax tables (`lib/hecks/language/**/*.bluebook`)
|
|
39
|
-
by `hecks language_run.project_reference
|
|
39
|
+
by `hecks language_run.project_reference!` — do not edit inside the markers. The prose
|
|
40
40
|
between them is hand-written and survives regeneration.*
|
|
41
41
|
#{GENERATED_END}
|
|
42
42
|
#{"\n#{preamble}\n" unless preamble.empty?}
|
|
@@ -145,7 +145,7 @@ module Hecks
|
|
|
145
145
|
# The DSL reference
|
|
146
146
|
|
|
147
147
|
One page per context — the place in a file where a word may be
|
|
148
|
-
typed. Generated by `hecks language_run.project_reference
|
|
148
|
+
typed. Generated by `hecks language_run.project_reference!` from the Syntax declaration;
|
|
149
149
|
the prose between the generated markers is hand-written and
|
|
150
150
|
survives regeneration.
|
|
151
151
|
|
data/lib/hecks/doc/reference.rb
CHANGED
|
@@ -10,7 +10,7 @@ module Hecks
|
|
|
10
10
|
module Doc
|
|
11
11
|
# The DSL reference, projected from the language's own Syntax bluebook so
|
|
12
12
|
# its tables can never drift from the live builders. Regenerate with
|
|
13
|
-
# `hecks language_run.project_reference
|
|
13
|
+
# `hecks language_run.project_reference!`.
|
|
14
14
|
#
|
|
15
15
|
# README's regions are in `Readme` and the coverage gates in `Coverage`, both extended onto
|
|
16
16
|
# this module; `Harvester` reads committed prose back.
|
|
@@ -74,7 +74,7 @@ module Hecks
|
|
|
74
74
|
dir = File.join(vendor_dir, name)
|
|
75
75
|
path = File.join(dir, "bluebook.lock")
|
|
76
76
|
unless File.exist?(path)
|
|
77
|
-
problems << "#{name}: no bluebook.lock (hecks package.vendor #{name}@<version>)"
|
|
77
|
+
problems << "#{name}: no bluebook.lock (hecks package.vendor! #{name}@<version>)"
|
|
78
78
|
return nil
|
|
79
79
|
end
|
|
80
80
|
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# The fixer: the work of taking a logged bug to a verified fix. QualityControl finds and records
|
|
2
|
+
# bugs; this domain holds the attempts at them, and says what happened through its events.
|
|
3
|
+
# A bug is never written here. QualityControl records each step from the events below.
|
|
4
|
+
|
|
5
|
+
Hecks.bluebook "Fixer" do
|
|
6
|
+
vision "A logged bug gets one attempt at a time, each claimed, investigated, fixed and verified on the record, and the bug itself is only ever written by the quality ledger."
|
|
7
|
+
|
|
8
|
+
# One attempt at one logged bug. The attempt is keyed by the bug's reference, so there is at most
|
|
9
|
+
# one attempt for each bug the ledger has logged.
|
|
10
|
+
aggregate "Attempt" do
|
|
11
|
+
description "One attempt at one logged bug: who holds it, where the fault is, the commit that fixes it, and what verified it."
|
|
12
|
+
|
|
13
|
+
identified_by :reference
|
|
14
|
+
|
|
15
|
+
attribute :reference, BugReference
|
|
16
|
+
attribute :held_by, Engineer
|
|
17
|
+
attribute :claimed_at, Instant
|
|
18
|
+
attribute :window, StaleAfter
|
|
19
|
+
attribute :site, BugSite, optional: true
|
|
20
|
+
attribute :cause, BugCause, optional: true
|
|
21
|
+
attribute :commit, CommitRef, optional: true
|
|
22
|
+
attribute :verification, Verification, optional: true
|
|
23
|
+
attribute :reproduction, ReproductionCommand, optional: true
|
|
24
|
+
attribute :observed, ReproductionObserved, optional: true
|
|
25
|
+
attribute :reproduced, ReproductionResult, optional: true
|
|
26
|
+
attribute :merged_commit, CommitRef, optional: true
|
|
27
|
+
attribute :merge_pending, MergePending, optional: true
|
|
28
|
+
|
|
29
|
+
value_object "BugReference" do
|
|
30
|
+
attribute :value, String, matches: :present
|
|
31
|
+
invariant("a bug is referenced") { !value.to_s.empty? }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
value_object "BugSite" do
|
|
35
|
+
attribute :value, String, matches: :present
|
|
36
|
+
invariant("an investigation names where the bug lives") { !value.to_s.empty? }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
value_object "BugCause" do
|
|
40
|
+
attribute :value, String, matches: :present
|
|
41
|
+
invariant("an investigation says why the code is wrong") { !value.to_s.empty? }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# 7 to 40 hex: a fix that lives only in a working tree is not a fix.
|
|
45
|
+
value_object "CommitRef" do
|
|
46
|
+
attribute :value, String, matches: :git_sha
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# What was actually run, e.g. "rspec --order random, 1335 examples, 0 failures, seed 12345":
|
|
50
|
+
# a count and a seed are checkable, "tests pass" is not.
|
|
51
|
+
value_object "Verification" do
|
|
52
|
+
attribute :value, String, matches: :present
|
|
53
|
+
invariant("a verification says what was actually run") { !value.to_s.empty? }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# The exact command or entry point that was run, from the real path a user or caller takes.
|
|
57
|
+
# Verification must re-run this same text, so a fix that passes only new tests is not verified.
|
|
58
|
+
value_object "ReproductionCommand" do
|
|
59
|
+
attribute :value, String, matches: :present
|
|
60
|
+
invariant("a reproduction names the exact command run") { !value.to_s.empty? }
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# A short fingerprint or the failing line the real path printed.
|
|
64
|
+
value_object "ReproductionObserved" do
|
|
65
|
+
attribute :value, String, matches: :present
|
|
66
|
+
invariant("a reproduction records what the real path printed") { !value.to_s.empty? }
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
value_object "ReproductionResult" do
|
|
70
|
+
attribute :value, String, matches: :present
|
|
71
|
+
invariant("a reproduction either failed or passed") { value == "failed" || value == "passed" }
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# "yes" while a merged patch is on the record for an attempt that cannot yet record its fix.
|
|
75
|
+
value_object "MergePending" do
|
|
76
|
+
attribute :value, String, default: ""
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
value_object "Engineer" do
|
|
80
|
+
attribute :value, String, default: "nobody"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
value_object "Instant" do
|
|
84
|
+
attribute :value, Integer, default: 0
|
|
85
|
+
invariant("an instant is not before the epoch") { !value.negative? }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
value_object "StaleAfter" do
|
|
89
|
+
attribute :value, Integer, default: 900
|
|
90
|
+
invariant("a staleness window is positive") { value.positive? }
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# A bug is born logged; each step moves the attempt along the same edges QualityControl uses.
|
|
94
|
+
lifecycle :status, default: "logged" do
|
|
95
|
+
transition "Investigate" => "investigating", from: %w[logged investigating]
|
|
96
|
+
transition "Fix" => "fixed", from: "investigating"
|
|
97
|
+
transition "Verify" => "verified", from: "fixed"
|
|
98
|
+
mark :terminal, "verified"
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# The attempt is opened by the ledger's `BugLogged`, and nothing else creates one.
|
|
102
|
+
command "Open" do
|
|
103
|
+
role "Fixer"
|
|
104
|
+
goal "Start an attempt at a bug the ledger has logged, so it can be claimed"
|
|
105
|
+
|
|
106
|
+
attribute :reference, BugReference
|
|
107
|
+
|
|
108
|
+
emits "AttemptOpened"
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Same rule as QualityControl's `Bug.Claim`: held by nobody, or stale.
|
|
112
|
+
command "Claim" do
|
|
113
|
+
role "Fixer"
|
|
114
|
+
goal "Take the attempt, or one whose holder has gone quiet"
|
|
115
|
+
|
|
116
|
+
reference_to Attempt
|
|
117
|
+
attribute :reference, BugReference
|
|
118
|
+
attribute :held_by, Engineer, sets: true
|
|
119
|
+
attribute :now, Instant
|
|
120
|
+
needs :now
|
|
121
|
+
|
|
122
|
+
given("a live claim is not taken from the agent holding it") do
|
|
123
|
+
held_by.value == "nobody" || claimed_at.value + window.value <= now.value
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
sets :claimed_at, to: :now
|
|
127
|
+
|
|
128
|
+
emits "AttemptClaimed"
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# An investigation starts from the real entry point: the command run, what it printed, and
|
|
132
|
+
# whether it failed. `Fix` is refused until a failing reproduction is on the record. An
|
|
133
|
+
# attempt already investigating can be investigated again, to record the reproduction it lacks
|
|
134
|
+
# or to replace one that did not fail.
|
|
135
|
+
command "Investigate" do
|
|
136
|
+
role "Fixer"
|
|
137
|
+
goal "Run the real entry point, record its failure, name the code that is wrong and say why"
|
|
138
|
+
|
|
139
|
+
reference_to Attempt
|
|
140
|
+
attribute :reference, BugReference
|
|
141
|
+
attribute :site, BugSite, sets: true
|
|
142
|
+
attribute :cause, BugCause, sets: true
|
|
143
|
+
attribute :reproduction, ReproductionCommand, sets: true
|
|
144
|
+
attribute :observed, ReproductionObserved, sets: true
|
|
145
|
+
attribute :reproduced, ReproductionResult, sets: true
|
|
146
|
+
|
|
147
|
+
emits "AttemptInvestigated"
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# `FixReady` carries the commit that makes the bug stop happening. The ledger records the fixed
|
|
151
|
+
# state from it, and the commit is what the Clearance check and the saga correlate on.
|
|
152
|
+
command "Fix" do
|
|
153
|
+
role "Fixer"
|
|
154
|
+
goal "Record the commit that makes it stop happening"
|
|
155
|
+
|
|
156
|
+
reference_to Attempt
|
|
157
|
+
attribute :reference, BugReference
|
|
158
|
+
attribute :commit, CommitRef, sets: true
|
|
159
|
+
|
|
160
|
+
given("no failing reproduction recorded: run the real entry point first") do
|
|
161
|
+
!reproduction.nil? && !reproduced.nil? && reproduced.value == "failed"
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
emits "FixReady"
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# A merged patch the attempt cannot yet record as its fix (no failing reproduction on the
|
|
168
|
+
# record) is kept on the attempt and announced, so it is neither dropped nor silent: the
|
|
169
|
+
# attempt lists under `AwaitingReproduction` until it is investigated and fixed.
|
|
170
|
+
command "NoteMerge" do
|
|
171
|
+
role "Fixer"
|
|
172
|
+
goal "Keep a merged patch that the attempt cannot yet record as its fix"
|
|
173
|
+
|
|
174
|
+
reference_to Attempt
|
|
175
|
+
attribute :reference, BugReference
|
|
176
|
+
attribute :commit, CommitRef
|
|
177
|
+
|
|
178
|
+
given("a patch the attempt already recorded as its fix is not pending") do
|
|
179
|
+
reproduction.nil? || reproduced.nil? || reproduced.value != "failed"
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
sets :merged_commit, to: :commit
|
|
183
|
+
sets :merge_pending, to: "yes"
|
|
184
|
+
|
|
185
|
+
emits "MergeAwaitsReproduction"
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# The attempts holding a merged patch they could not record: the QA tick reads these, investigates
|
|
189
|
+
# with a failing reproduction, then records the fix with `merged_commit`.
|
|
190
|
+
query "AwaitingReproduction" do
|
|
191
|
+
description "Every attempt with a merged patch it could not record as its fix because no failing reproduction is on the record."
|
|
192
|
+
where(status: { in: "logged,investigating" }, merge_pending: "yes")
|
|
193
|
+
order_by :claimed_at
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# `FixVerified` restates the reference and commit so the ledger can record the verified state
|
|
197
|
+
# against the bug it names.
|
|
198
|
+
command "Verify" do
|
|
199
|
+
role "Fixer"
|
|
200
|
+
goal "Record that the fix was actually verified, and exactly how"
|
|
201
|
+
|
|
202
|
+
reference_to Attempt
|
|
203
|
+
attribute :reference, BugReference
|
|
204
|
+
attribute :commit, CommitRef
|
|
205
|
+
attribute :evidence, Verification
|
|
206
|
+
attribute :rerun, ReproductionCommand
|
|
207
|
+
attribute :rerun_result, ReproductionResult
|
|
208
|
+
|
|
209
|
+
given("the reproduction re-run is not the one recorded: run the recorded command") do
|
|
210
|
+
!reproduction.nil? && rerun.value == reproduction.value
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
given("the recorded reproduction still fails: a fix that passes only new tests is not verified") do
|
|
214
|
+
rerun_result.value == "passed"
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
sets :verification, to: :evidence
|
|
218
|
+
|
|
219
|
+
emits "FixVerified"
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
# The ledger logged a bug: the attempt at it is opened, ready to be claimed.
|
|
224
|
+
policy "OpenOnBugLogged" do
|
|
225
|
+
on "Bug.BugLogged"
|
|
226
|
+
trigger Attempt::Open, with: { reference: :reference }
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# A merged patch is the commit that makes a bug's fix true, so the attempt at it records the fix.
|
|
230
|
+
policy "FixOnPatchMerged" do
|
|
231
|
+
on "Patch.PatchMerged"
|
|
232
|
+
trigger Attempt::Fix, with: { reference: :bug, commit: :commit }
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Declared after the fix: an attempt that could not record it keeps the commit and says so.
|
|
236
|
+
policy "NoteMergeWhenPatchMerged" do
|
|
237
|
+
on "Patch.PatchMerged"
|
|
238
|
+
trigger Attempt::NoteMerge, with: { reference: :bug, commit: :commit }
|
|
239
|
+
end
|
|
240
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# The Fixer domain, bound so it boots standing alone (a fuzz or model_check boot of this
|
|
2
|
+
# directory). The attempts are held in Memory here; the ledger's own store is wired by the
|
|
3
|
+
# QualityControl hecksagon.
|
|
4
|
+
Hecks.hecksagon "Fixer" do
|
|
5
|
+
attaches "Governance"
|
|
6
|
+
persisted_by "Memory"
|
|
7
|
+
|
|
8
|
+
# The ledger's bug being logged, which opens the attempt at it, and a merged patch, which records
|
|
9
|
+
# the fix. Declarative: QualityControl emits both, and the policies above react.
|
|
10
|
+
subscribe "QualityControl.BugLogged"
|
|
11
|
+
subscribe "QualityControl.PatchMerged"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# The anti-corruption layer for Governance, which the bluebook's roles are checked against.
|
|
15
|
+
Hecks.hecksagon "Governance" do
|
|
16
|
+
persisted_by "Memory"
|
|
17
|
+
end
|
|
@@ -6,8 +6,8 @@ require_relative "sentence_form"
|
|
|
6
6
|
|
|
7
7
|
module Hecks
|
|
8
8
|
# The bluebooks the gem carries that a hecksagon can attach by name (ADR 0080): the language
|
|
9
|
-
# declared in itself, Expression, Tenancy, Deploy, Site, Tickets, Composer, QualityControl
|
|
10
|
-
# Bulk.
|
|
9
|
+
# declared in itself, Expression, Tenancy, Deploy, Site, Tickets, Composer, QualityControl,
|
|
10
|
+
# Fixer, Coder, Bulk and CiPipeline.
|
|
11
11
|
# Framework members stay in `Framework`; `table` and `attach!` find a name across both.
|
|
12
12
|
#
|
|
13
13
|
# A bluebook is named by the `Hecks.bluebook "Name"` header of its files, and may span several.
|
|
@@ -18,7 +18,8 @@ module Hecks
|
|
|
18
18
|
# Where attachable bluebooks live, relative to `lib/hecks/`.
|
|
19
19
|
GLOBS = %w[language/**/*.bluebook grammar/expression.bluebook tenancy/bluebook/*.bluebook
|
|
20
20
|
deploy/bluebook/*.bluebook site/bluebook/*.bluebook rails_app/bluebook/*.bluebook tickets/bluebook/*.bluebook
|
|
21
|
-
composer/bluebook/*.bluebook quality_control/*.bluebook
|
|
21
|
+
composer/bluebook/*.bluebook quality_control/*.bluebook fixer/*.bluebook coder/*.bluebook
|
|
22
|
+
bulk/bluebook/*.bluebook ci_pipeline/*.bluebook].freeze
|
|
22
23
|
|
|
23
24
|
# A `Hecks.bluebook "Name"` header line, capturing the bluebook's name.
|
|
24
25
|
BLUEBOOK_HEADER = /\A\s*Hecks\.bluebook\s+"([^"]+)"/
|
|
@@ -106,7 +107,7 @@ module Hecks
|
|
|
106
107
|
Bluebook::MetaValidator.defer { paths.each { |path| SentenceForm.load_file(path) } }
|
|
107
108
|
Bluebook::MetaValidator.judge_deferred!(registry)
|
|
108
109
|
load_wiring(name, paths)
|
|
109
|
-
rescue Exception
|
|
110
|
+
rescue Exception
|
|
110
111
|
roll_back(registry, name, before)
|
|
111
112
|
raise
|
|
112
113
|
end
|
|
@@ -140,12 +141,36 @@ module Hecks
|
|
|
140
141
|
# @param paths [Array<String>] the bluebook's bluebook files
|
|
141
142
|
# @return [void]
|
|
142
143
|
def self.load_wiring(name, paths)
|
|
144
|
+
wiring_files(name, paths).each { |file| Kernel.load(file) }
|
|
145
|
+
end
|
|
146
|
+
private_class_method :load_wiring
|
|
147
|
+
|
|
148
|
+
# The files `load_wiring` loads, in the order it loads them: the ports file, then the adapters.
|
|
149
|
+
#
|
|
150
|
+
# @param name [String] the bluebook's name
|
|
151
|
+
# @param paths [Array<String>] the bluebook's bluebook files
|
|
152
|
+
# @return [Array<String>] the ports file when there is one, then each adapter file
|
|
153
|
+
def self.wiring_files(name, paths)
|
|
143
154
|
directory = File.dirname(paths.first)
|
|
144
155
|
ports = File.join(directory, "#{Naming.snake(name)}.ports.hecksagon")
|
|
145
|
-
|
|
146
|
-
|
|
156
|
+
[*(ports if File.file?(ports)), *Dir.glob(File.join(directory, "adapters", "*.adapter"))]
|
|
157
|
+
end
|
|
158
|
+
private_class_method :wiring_files
|
|
159
|
+
|
|
160
|
+
# Every file attaching the named bluebook reads: a framework member's one file, or an
|
|
161
|
+
# attachable bluebook's files with the ports file and adapters it ships. What a cache of a
|
|
162
|
+
# generated tree hashes to know when attaching the bluebook would write something else.
|
|
163
|
+
#
|
|
164
|
+
# @param name [String, Symbol] the bluebook's name, such as `"Governance"`
|
|
165
|
+
# @return [Array<String>] the files' absolute paths
|
|
166
|
+
# @raise [Runtime::WiringError] if the gem carries no bluebook of that name
|
|
167
|
+
def self.files_of(name)
|
|
168
|
+
key = name.to_s
|
|
169
|
+
return [Framework.members.fetch(key)] if Framework.members.key?(key)
|
|
170
|
+
|
|
171
|
+
paths = bluebook_paths(key)
|
|
172
|
+
[*paths, *wiring_files(key, paths)]
|
|
147
173
|
end
|
|
148
|
-
private_class_method :load_wiring
|
|
149
174
|
|
|
150
175
|
# The name a file's `Hecks.bluebook "Name"` header declares, or nil for a file without one.
|
|
151
176
|
def self.declaration_name(path)
|