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,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "context_line"
|
|
4
|
+
require_relative "../driven/worktree_overlay"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module Adapters
|
|
8
|
+
module Driving
|
|
9
|
+
# Refuses a write from a linked worktree whose bluebook would store in Memory there while the
|
|
10
|
+
# main checkout stores it elsewhere. It asks the same overlay question the worktree warning
|
|
11
|
+
# asks (WorktreeOverlay.gap), and reads stores the way `hecks config` does, so the refusal
|
|
12
|
+
# and the warning cannot disagree about what is missing.
|
|
13
|
+
module WriteGuard
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
# @param directory [String] the checkout the command runs in
|
|
17
|
+
# @param bluebook [String, nil] the bluebook the command belongs to
|
|
18
|
+
# @param stores [#call] answers the store rows of a directory
|
|
19
|
+
# @return [String, nil] the refusal, or nil when the write may proceed
|
|
20
|
+
def refusal(directory, bluebook, stores: STORES)
|
|
21
|
+
return unless bluebook
|
|
22
|
+
|
|
23
|
+
main, files = WorktreeOverlay.gap(directory)
|
|
24
|
+
return if files.empty?
|
|
25
|
+
|
|
26
|
+
main_kind = kind_in(stores.call(main), bluebook)
|
|
27
|
+
return if main_kind == ContextLine::MEMORY || main_kind == kind_in(stores.call(directory), bluebook)
|
|
28
|
+
|
|
29
|
+
message(bluebook, main_kind, files)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @param rows [Array<Array(String, String, String)>] store rows
|
|
33
|
+
# @param bluebook [String]
|
|
34
|
+
# @return [String] the kind of store the bluebook uses, Memory when it has none of its own
|
|
35
|
+
def kind_in(rows, bluebook)
|
|
36
|
+
row = rows.find { |label, _value, _source| label == "store #{bluebook}" }
|
|
37
|
+
ContextLine.kind(row ? row[1] : ContextLine::MEMORY)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @return [String] the refusal naming the bluebook, the store and the missing files
|
|
41
|
+
def message(bluebook, main_kind, files)
|
|
42
|
+
"hecks: refused: #{bluebook} stores in #{main_kind} in the main checkout, and this worktree " \
|
|
43
|
+
"lacks #{files.join(", ")}, so the write would land in Memory here. " \
|
|
44
|
+
"Run the command from the main checkout."
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Answers the store rows of a directory, through the adapter `hecks config` uses.
|
|
48
|
+
STORES = lambda do |directory|
|
|
49
|
+
require_relative "../../hecks/adapters/settings_reading"
|
|
50
|
+
Hecks::Adapters::SettingsReading.new.stores(directory)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -10,7 +10,6 @@ module Hecks
|
|
|
10
10
|
# A constant owned by user code or the stdlib is left alone with a warning.
|
|
11
11
|
module Namespace
|
|
12
12
|
# A live registry, mutated by `install`, so it cannot be frozen.
|
|
13
|
-
# rubocop:disable-next Style/MutableConstant
|
|
14
13
|
GENERATED = {}
|
|
15
14
|
|
|
16
15
|
module_function
|
data/lib/hecks/behaviors/dsl.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require_relative "ir"
|
|
2
|
+
require_relative "../module_folders"
|
|
2
3
|
|
|
3
4
|
# The authoring surface for `Hecks.behaviors "Name" do ... end`, built with `instance_eval`.
|
|
4
5
|
module Hecks
|
|
@@ -132,9 +133,12 @@ module Hecks
|
|
|
132
133
|
#
|
|
133
134
|
# @param paths [Array<String>] paths to the files this suite's domain boots
|
|
134
135
|
# from, relative to the `.behaviors` file
|
|
136
|
+
# @param modules [Symbol, nil] `:all` adds the bluebook of every module folder beside the
|
|
137
|
+
# `.behaviors` file (see ModuleFolders)
|
|
135
138
|
# @return [void]
|
|
136
|
-
def loads(*paths)
|
|
139
|
+
def loads(*paths, modules: nil)
|
|
137
140
|
@loads = paths.map { |path| File.expand_path(path, @source_dir) }
|
|
141
|
+
@loads.concat(ModuleFolders.bluebooks(@source_dir)) if modules == :all
|
|
138
142
|
end
|
|
139
143
|
|
|
140
144
|
# Builds and records one test case.
|
|
@@ -12,7 +12,6 @@ module Hecks
|
|
|
12
12
|
# Cached per suite, keyed by `loads`' file paths and mtimes, so a boot is
|
|
13
13
|
# reused across tests but an edited bluebook boots fresh on the next one.
|
|
14
14
|
# Mutated in place (`RUNTIMES[key] ||= boot_and_guard(files)`).
|
|
15
|
-
# rubocop:disable-next Style/MutableConstant
|
|
16
15
|
RUNTIMES = {}
|
|
17
16
|
RUNTIMES_LOCK = Mutex.new
|
|
18
17
|
private_constant :RUNTIMES, :RUNTIMES_LOCK
|
|
@@ -4,7 +4,7 @@ module Hecks
|
|
|
4
4
|
# reason, and a kind the check really emits (ADR 0150).
|
|
5
5
|
module Acknowledgements
|
|
6
6
|
# The finding kinds an aggregate may acknowledge.
|
|
7
|
-
AGGREGATE_KINDS = %i[large_aggregate key_by_value orphaned_reference].freeze
|
|
7
|
+
AGGREGATE_KINDS = %i[large_aggregate key_by_value orphaned_reference no_command_surface].freeze
|
|
8
8
|
|
|
9
9
|
# The kinds that are reported once per attribute or per referenced aggregate, so an
|
|
10
10
|
# acknowledgement of one names which (`of:`): the attribute for `key_by_value`, the
|
|
@@ -20,44 +20,47 @@ module Hecks
|
|
|
20
20
|
include Behaviour::Aggregate
|
|
21
21
|
|
|
22
22
|
emits_ir(
|
|
23
|
-
name:
|
|
24
|
-
description:
|
|
25
|
-
identified_by:
|
|
26
|
-
attributes:
|
|
27
|
-
value_objects:
|
|
28
|
-
commands:
|
|
29
|
-
invariants:
|
|
23
|
+
name: :name,
|
|
24
|
+
description: :description,
|
|
25
|
+
identified_by: :identity_paths,
|
|
26
|
+
attributes: many(:attributes),
|
|
27
|
+
value_objects: many(:value_objects),
|
|
28
|
+
commands: many(:commands),
|
|
29
|
+
invariants: -> { invariants.map { |rule| Expression::AstJson.rule_row(rule) } },
|
|
30
30
|
# The named `given`s a referencing command's resolved `givens` entry came from.
|
|
31
|
-
preconditions:
|
|
31
|
+
preconditions: -> { preconditions.map { |rule| Expression::AstJson.rule_row(rule) } },
|
|
32
32
|
# Not folded into `attributes`: EraGuard::ShapeDiff walks those, and a record predating
|
|
33
33
|
# `projects` is expected to lack this field until the rebuild sweep runs.
|
|
34
|
-
projected_fields:
|
|
34
|
+
projected_fields: lambda {
|
|
35
35
|
projected_fields.map do |field|
|
|
36
36
|
{ name: field.name.to_s, reference: field.reference.to_s, remote_field: field.remote_field.to_s }
|
|
37
37
|
end
|
|
38
38
|
},
|
|
39
|
-
lifecycle:
|
|
40
|
-
entities:
|
|
41
|
-
queries:
|
|
39
|
+
lifecycle: one(:lifecycle),
|
|
40
|
+
entities: many(:entities),
|
|
41
|
+
queries: many(:queries),
|
|
42
42
|
# Additive: domains that declare no port emit `ports: []`; no existing key moves.
|
|
43
|
-
ports:
|
|
44
|
-
provenance:
|
|
43
|
+
ports: many(:ports),
|
|
44
|
+
provenance: :provenance,
|
|
45
|
+
formerly_known_as: :formerly_known_as,
|
|
46
|
+
created_by: :created_by,
|
|
45
47
|
# Additive: an aggregate that acknowledges no finding emits `acknowledgements: []`.
|
|
46
|
-
acknowledgements:
|
|
47
|
-
acknowledgements.map { |held| { finding: held.finding.to_s, subject: held.subject
|
|
48
|
+
acknowledgements: lambda {
|
|
49
|
+
acknowledgements.map { |held| { finding: held.finding.to_s, subject: held.subject, reason: held.reason } }
|
|
48
50
|
}
|
|
49
51
|
)
|
|
50
52
|
|
|
51
53
|
attr_reader :name, :description, :attributes, :value_objects, :commands, :invariants, :preconditions,
|
|
52
54
|
:projected_fields, :identified_by, :identity_paths, :identity_heads, :lifecycle,
|
|
53
55
|
:entities, :queries, :policies, :ports, :reference_targets, :provenance,
|
|
54
|
-
:acknowledgements
|
|
56
|
+
:acknowledgements, :formerly_known_as, :created_by
|
|
55
57
|
|
|
56
58
|
# Every optional field and what it holds when the declaration omits it.
|
|
57
59
|
FIELD_DEFAULTS = {
|
|
58
60
|
description: nil, attributes: [], value_objects: [], commands: [], invariants: [],
|
|
59
61
|
preconditions: [], projected_fields: [], identified_by: [], lifecycle: nil, entities: [],
|
|
60
|
-
queries: [], policies: [], ports: [], reference_targets: [], provenance: nil, acknowledgements: []
|
|
62
|
+
queries: [], policies: [], ports: [], reference_targets: [], provenance: nil, acknowledgements: [],
|
|
63
|
+
formerly_known_as: nil, created_by: nil
|
|
61
64
|
}.freeze
|
|
62
65
|
|
|
63
66
|
# Assigns the declared fields, then `settle` derives identity, name indexes and owner stamps.
|
|
@@ -14,7 +14,8 @@ module Hecks
|
|
|
14
14
|
formerly_known_as: [:formerly_known_as, :plain],
|
|
15
15
|
namespace: [:namespace, :plain],
|
|
16
16
|
attaches_to: [:attaches_to, :plain],
|
|
17
|
-
provides: [:provides, :plain]
|
|
17
|
+
provides: [:provides, :plain],
|
|
18
|
+
modules: [:modules, :plain]
|
|
18
19
|
},
|
|
19
20
|
rows: { normalisations: :normalisation_table },
|
|
20
21
|
derived: { normalisations: :elsewhere }
|
|
@@ -23,17 +24,19 @@ module Hecks
|
|
|
23
24
|
"Aggregate" => Contract.new(
|
|
24
25
|
holder: Aggregate, make: :new,
|
|
25
26
|
fields: {
|
|
26
|
-
name:
|
|
27
|
-
description:
|
|
28
|
-
identified_by:
|
|
29
|
-
attributes:
|
|
27
|
+
name: [:name, :plain],
|
|
28
|
+
description: [:description, :plain],
|
|
29
|
+
identified_by: [:identified_by, :plain],
|
|
30
|
+
attributes: [:attributes, [:each, :attribute]],
|
|
30
31
|
# Aggregate's own precondition, referenced by name from a command (ADR 0025).
|
|
31
|
-
invariants:
|
|
32
|
-
preconditions:
|
|
32
|
+
invariants: [:invariants, [:each, :invariant]],
|
|
33
|
+
preconditions: [:preconditions, [:each, :given]],
|
|
33
34
|
# The local half of `projects :name, from: "reference.remote_field"` (ADR 0025).
|
|
34
|
-
projected_fields:
|
|
35
|
-
provenance:
|
|
36
|
-
|
|
35
|
+
projected_fields: [:projected_fields, [:each, :projected_field]],
|
|
36
|
+
provenance: [:provenance, :plain],
|
|
37
|
+
formerly_known_as: [:formerly_known_as, :plain],
|
|
38
|
+
created_by: [:created_by, :plain],
|
|
39
|
+
acknowledgements: [:acknowledgements, [:each, :acknowledgement]]
|
|
37
40
|
},
|
|
38
41
|
rows: { transitions: :transition_rows, marks: :mark_rows, value_objects: :value_object_names,
|
|
39
42
|
identified_by: :identity_rows },
|
|
@@ -56,6 +59,7 @@ module Hecks
|
|
|
56
59
|
name: [:name, :plain],
|
|
57
60
|
role: [:role, :plain],
|
|
58
61
|
roles: [:roles, :plain],
|
|
62
|
+
audience: [:audience, :plain],
|
|
59
63
|
goal: [:goal, :plain],
|
|
60
64
|
references: [:references, :plain],
|
|
61
65
|
attributes: [:attributes, [:each, :shape_field]],
|
|
@@ -67,13 +71,14 @@ module Hecks
|
|
|
67
71
|
# Lifecycle state as a command guard: one state, an array, or nil (ADR 0025).
|
|
68
72
|
from: [:from, :plain],
|
|
69
73
|
provenance: [:provenance, :plain],
|
|
70
|
-
idempotent: [:idempotent, :plain]
|
|
74
|
+
idempotent: [:idempotent, :plain],
|
|
75
|
+
mints_era: [:mints_era, :plain]
|
|
71
76
|
},
|
|
72
77
|
rows: { mutations: :mutation_rows },
|
|
73
78
|
reads: { attributes: [:each, :shape_field], givens: [:each, :rule], ensures: [:each, :rule],
|
|
74
|
-
needs: [:each, :need], mutations: [:call, :mutations], emits: :names, roles: :names,
|
|
79
|
+
needs: [:each, :need], mutations: [:call, :mutations], emits: :names, roles: :names, audience: :names,
|
|
75
80
|
provenance: :provenance,
|
|
76
|
-
from: :from, idempotent: :idempotent? },
|
|
81
|
+
from: :from, idempotent: :idempotent?, mints_era: :mints_era? },
|
|
77
82
|
derived: { position: :walk }
|
|
78
83
|
),
|
|
79
84
|
|
|
@@ -112,11 +112,35 @@ module Hecks
|
|
|
112
112
|
@ports_by_name[port.name] = port
|
|
113
113
|
end
|
|
114
114
|
|
|
115
|
+
# The physical name the world gives this aggregate (`stored_as Revision: "commit"`), set
|
|
116
|
+
# when a registry applies its world's names. Nothing in the bluebook sets it.
|
|
117
|
+
attr_writer :stored_as, :prior_storage_names
|
|
118
|
+
|
|
115
119
|
# Names the table, file or key persistence adapters store this aggregate
|
|
116
|
-
# under.
|
|
120
|
+
# under. A renamed aggregate keeps the name its rows were written under, so
|
|
121
|
+
# its stored records stay where they are.
|
|
122
|
+
#
|
|
123
|
+
# @return [String] the world's `stored_as` when it gives one, else the former name from
|
|
124
|
+
# `formerly_known_as` when the bluebook declares one, else the aggregate's own name,
|
|
125
|
+
# snake-cased
|
|
126
|
+
def storage_name = Naming.snake(@stored_as || former_name || @name)
|
|
127
|
+
|
|
128
|
+
# The physical names this aggregate's rows may sit under from an earlier name: its
|
|
129
|
+
# `formerly_known_as` and every name a translation edge renames it from. An adapter
|
|
130
|
+
# that finds rows under one while its own table is empty refuses instead of beginning anew.
|
|
117
131
|
#
|
|
118
|
-
# @return [String] the
|
|
119
|
-
def
|
|
132
|
+
# @return [Array<String>] snake-cased names other than the current storage name
|
|
133
|
+
def prior_storage_names = (@prior_storage_names || []).map { |name| Naming.snake(name) } - [storage_name]
|
|
134
|
+
|
|
135
|
+
# The name this aggregate carried before its rename, from `formerly_known_as`.
|
|
136
|
+
#
|
|
137
|
+
# @return [String, nil] the former name, or nil when the aggregate was never renamed
|
|
138
|
+
def former_name
|
|
139
|
+
held = formerly_known_as
|
|
140
|
+
return nil if held.nil?
|
|
141
|
+
|
|
142
|
+
(held.respond_to?(:value) ? held.value : held).to_s
|
|
143
|
+
end
|
|
120
144
|
end
|
|
121
145
|
end
|
|
122
146
|
end
|
|
@@ -52,6 +52,8 @@ module Hecks
|
|
|
52
52
|
role: :role,
|
|
53
53
|
# Every role that may run the command, when more than one may; `role` is then the first.
|
|
54
54
|
roles: -> { roles.size > 1 ? roles : Hecks::IR::OMIT },
|
|
55
|
+
# Who a launcher lists the command for; absent when the command declares none.
|
|
56
|
+
audience: -> { audience.empty? ? Hecks::IR::OMIT : audience },
|
|
55
57
|
goal: :goal,
|
|
56
58
|
references: :references,
|
|
57
59
|
attributes: many(:attributes),
|
|
@@ -64,29 +66,38 @@ module Hecks
|
|
|
64
66
|
from: -> { from },
|
|
65
67
|
provenance: :provenance,
|
|
66
68
|
# Safe to deliver twice; the saga redrive reads it for a dispatch left unsettled.
|
|
67
|
-
idempotent: -> { idempotent? }
|
|
69
|
+
idempotent: -> { idempotent? },
|
|
70
|
+
# Lets this command's own record through a boot whose shape no era holds yet.
|
|
71
|
+
mints_era: -> { mints_era? }
|
|
68
72
|
)
|
|
69
73
|
|
|
70
74
|
# Every optional declared field and what it holds when the declaration omits it.
|
|
71
75
|
FIELD_DEFAULTS = {
|
|
72
|
-
role: nil, roles: [], goal: nil, attributes: [], givens: [], ensures: [], needs: [],
|
|
73
|
-
mutations: [], emits: [], references: nil, from: nil, provenance: nil, idempotent: false
|
|
76
|
+
role: nil, roles: [], audience: [], goal: nil, attributes: [], givens: [], ensures: [], needs: [],
|
|
77
|
+
mutations: [], emits: [], references: nil, from: nil, provenance: nil, idempotent: false,
|
|
78
|
+
mints_era: false
|
|
74
79
|
}.freeze
|
|
75
80
|
|
|
76
81
|
class << self
|
|
77
82
|
attr_reader :role, :goal, :attributes, :givens, :ensures, :needs, :mutations, :emits, :references,
|
|
78
|
-
:from, :provenance, :idempotent
|
|
83
|
+
:from, :provenance, :idempotent, :mints_era
|
|
79
84
|
|
|
80
85
|
# @return [Boolean] whether a second delivery leaves the state a first one did
|
|
81
86
|
def idempotent? = @idempotent ? true : false
|
|
82
87
|
|
|
88
|
+
# @return [Boolean] whether this command's own record may be written through an unminted boot
|
|
89
|
+
def mints_era? = @mints_era ? true : false
|
|
90
|
+
|
|
83
91
|
# @return [Array<String>] every role that may run it when more than one may, else empty
|
|
84
92
|
def roles = @roles || []
|
|
85
93
|
|
|
94
|
+
# @return [Array<String>] who a launcher lists it for, else empty (a person and an agent)
|
|
95
|
+
def audience = @audience || []
|
|
96
|
+
|
|
86
97
|
# Mints one command as its own anonymous subclass of the class `declare` is called on.
|
|
87
98
|
#
|
|
88
99
|
# @param name [String, Symbol] the command's declared name
|
|
89
|
-
# @param role [String, nil] the declared role; `roles` all of them
|
|
100
|
+
# @param role [String, nil] the declared role; `roles` all of them, `audience` who it is listed for
|
|
90
101
|
# @param attributes [Array<Bluebook::Attribute>] the declared arguments
|
|
91
102
|
# @param givens [Array<Bluebook::Given>] the declared preconditions
|
|
92
103
|
# @param ensures [Array<Bluebook::Given>] the postconditions; `needs` the facts it supplies
|
|
@@ -36,6 +36,9 @@ module Hecks
|
|
|
36
36
|
# One row per declared `provides` capability, in declaration order;
|
|
37
37
|
# present (possibly empty) like `attaches_to`.
|
|
38
38
|
provides: -> { provides.map(&:to_h) },
|
|
39
|
+
# One row per aggregate a module groups, in declaration order; left out when the bluebook
|
|
40
|
+
# declares no module, so a bluebook that never groups emits as it did.
|
|
41
|
+
modules: -> { modules.empty? ? Hecks::IR::OMIT : modules.map(&:to_h) },
|
|
39
42
|
canonical_form: -> { Expression::CanonicalForm.table }
|
|
40
43
|
)
|
|
41
44
|
|
|
@@ -56,14 +59,32 @@ module Hecks
|
|
|
56
59
|
end
|
|
57
60
|
end
|
|
58
61
|
|
|
62
|
+
# One aggregate's membership of a module: the module's name and vision, and the aggregate.
|
|
63
|
+
ModuleRow = Struct.new(:name, :vision, :aggregate, keyword_init: true) do
|
|
64
|
+
# Coerces one declared or reconstructed module row into a `ModuleRow`.
|
|
65
|
+
#
|
|
66
|
+
# @param row [Bluebook::Declaration::ModuleRow, #to_h] a `ModuleRow` already, or anything
|
|
67
|
+
# answering `to_h` with `name`/`vision`/`aggregate` entries
|
|
68
|
+
# @return [Bluebook::Declaration::ModuleRow] `row` itself if it already is one, else a new one
|
|
69
|
+
def self.from(row)
|
|
70
|
+
return row if row.is_a?(self)
|
|
71
|
+
|
|
72
|
+
fields = row.to_h.transform_keys(&:to_sym)
|
|
73
|
+
new(name: fields[:name].to_s, vision: fields[:vision].to_s, aggregate: fields[:aggregate].to_s)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
attr_accessor :formerly_known_as
|
|
78
|
+
|
|
59
79
|
attr_reader :name, :version, :vision, :aggregates, :policies, :process_managers,
|
|
60
|
-
:classification, :read_models, :ports, :
|
|
80
|
+
:classification, :read_models, :ports, :namespace, :attaches_to, :provides,
|
|
81
|
+
:modules
|
|
61
82
|
|
|
62
83
|
# Every optional field and what it holds when the declaration omits it.
|
|
63
84
|
FIELD_DEFAULTS = {
|
|
64
85
|
version: nil, vision: nil, aggregates: [], policies: [], process_managers: [],
|
|
65
86
|
classification: nil, read_models: [], formerly_known_as: nil, namespace: nil,
|
|
66
|
-
attaches_to: [], provides: []
|
|
87
|
+
attaches_to: [], provides: [], modules: []
|
|
67
88
|
}.freeze
|
|
68
89
|
|
|
69
90
|
# @param policies [Array<Bluebook::Policy>] every reaction declared across the
|
|
@@ -85,10 +106,17 @@ module Hecks
|
|
|
85
106
|
@classification = @classification&.to_s
|
|
86
107
|
@formerly_known_as = @formerly_known_as&.to_s
|
|
87
108
|
@namespace = @namespace&.to_s
|
|
88
|
-
|
|
89
|
-
@provides = Array(@provides).map { |row| Provision.from(row) }
|
|
109
|
+
coerce_rows
|
|
90
110
|
end
|
|
91
111
|
private :coerce_fields
|
|
112
|
+
|
|
113
|
+
# Holds every row-valued field as the rows its reader answers.
|
|
114
|
+
def coerce_rows
|
|
115
|
+
@attaches_to = Array(@attaches_to).map(&:to_s)
|
|
116
|
+
@provides = Array(@provides).map { |row| Provision.from(row) }
|
|
117
|
+
@modules = Array(@modules).map { |row| ModuleRow.from(row) }
|
|
118
|
+
end
|
|
119
|
+
private :coerce_rows
|
|
92
120
|
end
|
|
93
121
|
end
|
|
94
122
|
end
|
|
@@ -10,9 +10,12 @@ module Hecks
|
|
|
10
10
|
include Hecks::IR
|
|
11
11
|
include Behaviour::PortOperation
|
|
12
12
|
|
|
13
|
-
emits_ir(
|
|
13
|
+
emits_ir(
|
|
14
|
+
name: :hecks_name, attributes: many(:attributes), emits: :emits,
|
|
15
|
+
handles: -> { handles.map { |held| { command: held[:command], value: held[:value] } } }
|
|
16
|
+
)
|
|
14
17
|
|
|
15
|
-
attr_reader :hecks_name, :attributes, :emits, :direction, :answers, :refuses, :to
|
|
18
|
+
attr_reader :hecks_name, :attributes, :emits, :direction, :answers, :refuses, :to, :handles
|
|
16
19
|
|
|
17
20
|
# Marks this operation as the one the hecksagon picks (`ask_via`) when its ask name is
|
|
18
21
|
# declared on more than one port of the aggregate.
|
|
@@ -29,7 +32,8 @@ module Hecks
|
|
|
29
32
|
#
|
|
30
33
|
# Every optional keyword and what it holds when the declaration omits it.
|
|
31
34
|
FIELD_DEFAULTS = {
|
|
32
|
-
attributes: [], emits: [], direction: :inbound, answers: nil, refuses: nil, to: nil, chosen: false
|
|
35
|
+
attributes: [], emits: [], direction: :inbound, answers: nil, refuses: nil, to: nil, chosen: false,
|
|
36
|
+
handles: []
|
|
33
37
|
}.freeze
|
|
34
38
|
|
|
35
39
|
# @param name [String, Symbol] the operation's declared name
|
|
@@ -65,7 +65,6 @@ module Hecks
|
|
|
65
65
|
|
|
66
66
|
# `has_many_impl`/`has_one_impl` are DSL keywords (`has_many`/`has_one` in a bluebook),
|
|
67
67
|
# not real predicates, so Naming/PredicatePrefix does not apply here.
|
|
68
|
-
# rubocop:disable Naming/PredicatePrefix
|
|
69
68
|
|
|
70
69
|
# Declares a list-typed relationship to another aggregate, referenced by its plural name.
|
|
71
70
|
#
|
|
@@ -105,7 +104,6 @@ module Hecks
|
|
|
105
104
|
relationship_attribute(target, :has_one, as || Naming.snake(target).to_sym,
|
|
106
105
|
optional: optional)
|
|
107
106
|
end
|
|
108
|
-
# rubocop:enable Naming/PredicatePrefix
|
|
109
107
|
|
|
110
108
|
# Declares a single-valued relationship toward the aggregate that owns this one.
|
|
111
109
|
#
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module Bluebook
|
|
5
|
+
module DSL
|
|
6
|
+
class AggregateBuilder
|
|
7
|
+
# The names an aggregate keeps: the name it held before a rename, which keeps the old name
|
|
8
|
+
# resolving, and the command that creates its records, which a missing-record refusal names.
|
|
9
|
+
module Renaming
|
|
10
|
+
# @param value [Object] the name the aggregate held before, as the attribute types it
|
|
11
|
+
# @return [Object] the old name as stored
|
|
12
|
+
def formerly_known_as_impl(value)
|
|
13
|
+
@formerly_known_as = value
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @param value [Object] the command's name, as the bluebook writes it (e.g. "Adr.draft!")
|
|
17
|
+
# @return [Object] the command name as stored
|
|
18
|
+
def created_by_impl(value)
|
|
19
|
+
@created_by = value
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -4,6 +4,7 @@ require_relative "aggregate_builder/relationships"
|
|
|
4
4
|
require_relative "aggregate_builder/one_of_reference"
|
|
5
5
|
require_relative "aggregate_builder/rules"
|
|
6
6
|
require_relative "aggregate_builder/draining"
|
|
7
|
+
require_relative "aggregate_builder/renaming"
|
|
7
8
|
module Hecks
|
|
8
9
|
module Bluebook
|
|
9
10
|
module DSL
|
|
@@ -17,6 +18,7 @@ module Hecks
|
|
|
17
18
|
include RuleReference
|
|
18
19
|
include WordGate
|
|
19
20
|
include Sealing
|
|
21
|
+
include Renaming
|
|
20
22
|
include OneOfReference
|
|
21
23
|
|
|
22
24
|
# @param name [String] the aggregate's name, as written after `aggregate`
|
|
@@ -177,6 +179,7 @@ module Hecks
|
|
|
177
179
|
{ name: @name, description: @description, attributes: attributes,
|
|
178
180
|
value_objects: @value_objects + closed_sets, identified_by: @identity_paths,
|
|
179
181
|
lifecycle: @lifecycle, entities: @entities, provenance: @provenance,
|
|
182
|
+
formerly_known_as: @formerly_known_as, created_by: @created_by,
|
|
180
183
|
acknowledgements: @acknowledgements }
|
|
181
184
|
end
|
|
182
185
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
module Bluebook
|
|
3
|
+
module DSL
|
|
4
|
+
# The `audience` word of a command: who a launcher lists it for (ADR 0163). It decides
|
|
5
|
+
# listing only; the role still decides who may run the command. The including builder holds
|
|
6
|
+
# `@name`.
|
|
7
|
+
module AudienceWord
|
|
8
|
+
# The audiences a command may be listed for: a person at a keyboard, an agent through the
|
|
9
|
+
# MCP door, a CI step, or the run's own bookkeeping.
|
|
10
|
+
AUDIENCES = %w[person agent ci record].freeze
|
|
11
|
+
|
|
12
|
+
# Names who a launcher lists the command for.
|
|
13
|
+
#
|
|
14
|
+
# @param values [Array<Symbol, String>] one or several of `AUDIENCES`
|
|
15
|
+
# @return [Array<String>] the audience as stored
|
|
16
|
+
# @raise [Bluebook::DSL::Malformed] if one is already declared, one is not an audience, or
|
|
17
|
+
# one is named twice
|
|
18
|
+
def audience_impl(*values)
|
|
19
|
+
names = values.map(&:to_s)
|
|
20
|
+
raise Malformed, "#{@name} declares its audience twice" if @audience
|
|
21
|
+
raise Malformed, audience_problem(names) if audience_problem(names)
|
|
22
|
+
|
|
23
|
+
@audience = names
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
# Why an audience declaration is refused, or nil when every name is an audience named once.
|
|
29
|
+
def audience_problem(names)
|
|
30
|
+
return "#{@name} names no audience" if names.empty?
|
|
31
|
+
|
|
32
|
+
unknown = names - AUDIENCES
|
|
33
|
+
return "#{@name} names #{unknown.join(", ")} as an audience; the audiences are #{AUDIENCES.join(", ")}" if unknown.any?
|
|
34
|
+
|
|
35
|
+
"#{@name} names an audience twice" if names.uniq.size != names.size
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
module Bluebook
|
|
3
|
+
module DSL
|
|
4
|
+
class BluebookBuilder
|
|
5
|
+
# The words that describe the whole bluebook rather than one construct in it: its earlier
|
|
6
|
+
# name, the Ruby module its constants install under, and its classification. Each refuses
|
|
7
|
+
# to sit inside a `domain_module` block, since a module names a task, not the bluebook.
|
|
8
|
+
module Metadata
|
|
9
|
+
# Records the bluebook's earlier name, so the storage layer recognizes its history
|
|
10
|
+
# under it instead of minting a new lineage — a bluebook's identity can change.
|
|
11
|
+
#
|
|
12
|
+
# @param value [String, Symbol] the bluebook's earlier name
|
|
13
|
+
# @return [String] `value`, stringified, as stored
|
|
14
|
+
def formerly_known_as(value)
|
|
15
|
+
bluebook_wide!(:formerly_known_as)
|
|
16
|
+
@formerly_known_as = value.to_s
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Names the Ruby module the bluebook's constants install under instead of its own name,
|
|
20
|
+
# such as `namespace "Hecks::Domain"` for a bluebook that would otherwise collide.
|
|
21
|
+
#
|
|
22
|
+
# @param value [String] a constant path, such as `"Hecks::Domain"`
|
|
23
|
+
# @return [String] `value`, stringified, as stored
|
|
24
|
+
def namespace(value)
|
|
25
|
+
bluebook_wide!(:namespace)
|
|
26
|
+
@namespace = value.to_s
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Classifies this bluebook as core to the framework, rather than a domain built on it.
|
|
30
|
+
#
|
|
31
|
+
# @return [Symbol] `:core`
|
|
32
|
+
def core = classify(:core)
|
|
33
|
+
|
|
34
|
+
# Classifies this bluebook as a supporting piece of the framework, rather than a domain
|
|
35
|
+
# built on it.
|
|
36
|
+
#
|
|
37
|
+
# @return [Symbol] `:supporting`
|
|
38
|
+
def supporting = classify(:supporting)
|
|
39
|
+
|
|
40
|
+
# Classifies this bluebook as generic infrastructure, rather than a domain built on it.
|
|
41
|
+
#
|
|
42
|
+
# @return [Symbol] `:generic`
|
|
43
|
+
def generic = classify(:generic)
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
# Sets how this bluebook is classified, which describes the whole of it.
|
|
48
|
+
def classify(kind)
|
|
49
|
+
bluebook_wide!(kind)
|
|
50
|
+
@classification = kind
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|