hecks 7.0.0 → 7.1.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/lib/hecks/adapters/driven/postgres_era/lineage/chain_sql.rb +2 -1
- data/lib/hecks/adapters/driven/postgres_era/lineage/provisioning.rb +4 -2
- data/lib/hecks/adapters/driven/postgres_era/lineage/split_sql.rb +16 -8
- data/lib/hecks/adapters/driven/postgres_era/lineage/transform_sql.rb +7 -3
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolver.rb +2 -1
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_request.rb +2 -1
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/refusals.rb +2 -1
- data/lib/hecks/adapters/driving/cli_runner/bang_rule.rb +3 -0
- data/lib/hecks/adapters/driving/cli_runner/completion_words.rb +2 -0
- data/lib/hecks/adapters/driving/cli_runner/read_context.rb +6 -3
- data/lib/hecks/adapters/driving/cli_runner/renamed_names.rb +2 -1
- data/lib/hecks/adapters/driving/cli_runner/resolution.rb +2 -2
- data/lib/hecks/adapters/driving/cli_runner/resume_words.rb +1 -0
- data/lib/hecks/adapters/driving/cli_runner/run_reference.rb +6 -3
- data/lib/hecks/adapters/driving/cli_runner/search_words.rb +2 -0
- data/lib/hecks/adapters/driving/cli_runner/tour_words.rb +1 -0
- data/lib/hecks/adapters/driving/cli_runner/verb_names.rb +2 -1
- data/lib/hecks/adapters/driving/cli_runner/verbosity.rb +2 -0
- data/lib/hecks/adapters/driving/cli_runner/word_help.rb +40 -0
- data/lib/hecks/adapters/driving/cli_runner.rb +2 -0
- data/lib/hecks/adapters/driving/mcp/progress_sink.rb +4 -2
- data/lib/hecks/adapters/driving/mcp.rb +2 -1
- data/lib/hecks/adapters/driving/mcp_scope/argument_policy.rb +2 -1
- data/lib/hecks/adapters/driving/ruby/aggregate_module/hooks.rb +28 -14
- data/lib/hecks/adapters/driving/ruby/aggregate_module.rb +4 -2
- data/lib/hecks/assembly.rb +18 -4
- data/lib/hecks/behaviors/expectations/adapter_selection.rb +82 -0
- data/lib/hecks/behaviors/expectations/boot.rb +12 -5
- data/lib/hecks/bluebook/acknowledgements.rb +1 -1
- data/lib/hecks/bluebook/command.rb +3 -2
- data/lib/hecks/bluebook/declaration.rb +2 -1
- data/lib/hecks/bluebook/dsl/adapter_builder.rb +9 -1
- data/lib/hecks/bluebook/dsl/bluebook_builder/metadata.rb +6 -4
- data/lib/hecks/bluebook/dsl/bluebook_builder/modules.rb +6 -3
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb +2 -1
- data/lib/hecks/bluebook/dsl/command_builder/folded_sets.rb +4 -2
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +2 -1
- data/lib/hecks/bluebook/hecksagon.rb +6 -3
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +9 -2
- data/lib/hecks/bluebook/meta_validator.rb +1 -1
- data/lib/hecks/bluebook/model_check/aggregate_checks.rb +2 -1
- data/lib/hecks/bluebook/model_check/classification_checks.rb +51 -0
- data/lib/hecks/bluebook/model_check/context_checks.rb +2 -0
- data/lib/hecks/bluebook/model_check/redundant_relationships.rb +2 -1
- data/lib/hecks/ci_speed/adapters/shard_partitioner.adapter +7 -0
- data/lib/hecks/ci_speed/adapters/shard_partitioner.rb +66 -0
- data/lib/hecks/ci_speed/adapters/timings_source.adapter +7 -0
- data/lib/hecks/ci_speed/adapters/timings_source.rb +68 -0
- data/lib/hecks/ci_speed/ci_speed.bluebook +111 -0
- data/lib/hecks/ci_speed/ci_speed.ports.hecksagon +22 -0
- data/lib/hecks/ci_workflows/ci_workflows.bluebook +50 -6
- data/lib/hecks/coder/coder.bluebook +3 -1
- data/lib/hecks/command_names/index.rb +1 -1
- data/lib/hecks/command_names/resolution.rb +15 -5
- data/lib/hecks/composer/toolbox.rb +2 -1
- data/lib/hecks/corpus.rb +4 -0
- data/lib/hecks/doc/reference/readme.rb +1 -1
- data/lib/hecks/framework_bluebooks.rb +3 -2
- data/lib/hecks/fuzzing/differential.rb +1 -1
- data/lib/hecks/fuzzing/era_boundary.rb +1 -1
- data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +1 -1
- data/lib/hecks/fuzzing/persistence_parity.rb +1 -1
- data/lib/hecks/fuzzing/target_capabilities.rb +1 -1
- data/lib/hecks/hecks/adapters/ci_runs.adapter +7 -0
- data/lib/hecks/hecks/adapters/ci_runs.rb +80 -0
- data/lib/hecks/hecks/adapters/claude_agent_list.rb +43 -0
- data/lib/hecks/hecks/adapters/claude_agents.rb +50 -19
- data/lib/hecks/hecks/adapters/claude_jobs.rb +36 -0
- data/lib/hecks/hecks/adapters/codebase/corpus_queries.rb +2 -1
- data/lib/hecks/hecks/adapters/codebase/minitest_runs.rb +4 -2
- data/lib/hecks/hecks/adapters/codebase/run_options.rb +2 -1
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +3 -19
- data/lib/hecks/hecks/adapters/dispatching/brief_text.rb +5 -3
- data/lib/hecks/hecks/adapters/dispatching/launcher.rb +2 -1
- data/lib/hecks/hecks/adapters/dispatching/plan.rb +8 -4
- data/lib/hecks/hecks/adapters/dispatching/settings.rb +2 -1
- data/lib/hecks/hecks/adapters/dispatching/settler.rb +4 -2
- data/lib/hecks/hecks/adapters/dispatching.rb +6 -3
- data/lib/hecks/hecks/adapters/doctor_reading.rb +4 -2
- data/lib/hecks/hecks/adapters/git_landing/carried.rb +42 -0
- data/lib/hecks/hecks/adapters/git_landing/finisher.rb +2 -1
- data/lib/hecks/hecks/adapters/git_landing/flagged.rb +32 -0
- data/lib/hecks/hecks/adapters/git_landing/tidy.rb +27 -14
- data/lib/hecks/hecks/adapters/git_landing.rb +30 -13
- data/lib/hecks/hecks/adapters/git_leftovers.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_leftovers.rb +49 -0
- data/lib/hecks/hecks/adapters/git_main_pull.rb +2 -2
- data/lib/hecks/hecks/adapters/git_train.rb +9 -5
- data/lib/hecks/hecks/adapters/git_worktree_add.rb +8 -4
- data/lib/hecks/hecks/adapters/github_pull_requests.rb +2 -1
- data/lib/hecks/hecks/adapters/in_process_operations.rb +2 -1
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +1 -1
- data/lib/hecks/hecks/adapters/journal_store/readings/composition.rb +2 -1
- data/lib/hecks/hecks/adapters/journal_store/translation_write/shape_edge.rb +4 -2
- data/lib/hecks/hecks/adapters/journal_store/translation_write.rb +4 -2
- data/lib/hecks/hecks/adapters/landed_branches.rb +38 -0
- data/lib/hecks/hecks/adapters/main_boarding.adapter +7 -0
- data/lib/hecks/hecks/adapters/main_boarding.rb +85 -0
- data/lib/hecks/hecks/adapters/main_integration/checks.rb +63 -0
- data/lib/hecks/hecks/adapters/main_integration/command_runner.rb +32 -0
- data/lib/hecks/hecks/adapters/main_integration/range_guard.rb +49 -0
- data/lib/hecks/hecks/adapters/main_integration/repository.rb +83 -0
- data/lib/hecks/hecks/adapters/main_integration/runs.rb +51 -0
- data/lib/hecks/hecks/adapters/main_integration/train.rb +74 -0
- data/lib/hecks/hecks/adapters/main_integration.adapter +7 -0
- data/lib/hecks/hecks/adapters/main_integration.rb +77 -0
- data/lib/hecks/hecks/adapters/main_verification.adapter +7 -0
- data/lib/hecks/hecks/adapters/main_verification.rb +89 -0
- data/lib/hecks/hecks/adapters/push_recorder.adapter +7 -0
- data/lib/hecks/hecks/adapters/push_recorder.rb +78 -0
- data/lib/hecks/hecks/adapters/red_flag_guard.rb +62 -0
- data/lib/hecks/hecks/adapters/red_flag_marker.rb +101 -0
- data/lib/hecks/hecks/adapters/red_flag_report.rb +59 -0
- data/lib/hecks/hecks/adapters/red_flag_survey.rb +65 -0
- data/lib/hecks/hecks/adapters/red_flagging.adapter +7 -0
- data/lib/hecks/hecks/adapters/red_flagging.rb +98 -0
- data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +6 -1
- data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +6 -3
- data/lib/hecks/hecks/adapters/settings_reading/event_tap_row.rb +33 -0
- data/lib/hecks/hecks/adapters/settings_reading.rb +3 -1
- data/lib/hecks/hecks/codebase.behaviors +0 -6
- data/lib/hecks/hecks/custodian.behaviors +22 -1
- data/lib/hecks/hecks/delegate/delegate.bluebook +128 -15
- data/lib/hecks/hecks/deliver/deliver.bluebook +450 -2
- data/lib/hecks/hecks/environments/memory.world +5 -0
- data/lib/hecks/hecks/hecks.contextmap +8 -0
- data/lib/hecks/hecks/hecks.hecksagon +106 -6
- data/lib/hecks/hecks/hecks.world +9 -1
- data/lib/hecks/hecks/migrate/migrate.bluebook +6 -1
- data/lib/hecks/hecks/redflag/redflag.bluebook +249 -0
- data/lib/hecks/hecks/test/test.bluebook +0 -19
- data/lib/hecks/language/adapter.bluebook +13 -0
- data/lib/hecks/language/bluebook/vocabulary.bluebook +8 -9
- data/lib/hecks/language/sentence/sentence.bluebook +2 -0
- data/lib/hecks/pipeline/pipeline.bluebook +251 -0
- data/lib/hecks/pipeline/pipeline.hecksagon +17 -0
- data/lib/hecks/pipeline_board/adapters/cache.rb +43 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_fill.rb +56 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_git.rb +82 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_github/runs.rb +66 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_github.adapter +7 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_github.rb +70 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_jobs.adapter +7 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_jobs.rb +87 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_journal/chain.rb +40 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_journal/tap.rb +75 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_journal.adapter +7 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_journal.rb +83 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_stages/ci_tiles.rb +85 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_stages/fanout.rb +73 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_stages/gather.rb +57 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_stages/metrics.rb +36 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_stages/strip.rb +102 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_stages/tile_kit.rb +57 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_stages/work_tiles.rb +59 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_stages.adapter +7 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_stages.rb +84 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_tickets.adapter +7 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_tickets.rb +77 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_web/page.html +292 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_web/sequence.html +190 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_web/server.rb +105 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_web/snapshot.rb +57 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_web/stream.rb +59 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_web/wiring.html +536 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_web.adapter +7 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_web.rb +80 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_wiring/details.rb +85 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_wiring/graph.rb +120 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_wiring.adapter +7 -0
- data/lib/hecks/pipeline_board/adapters/pipeline_wiring.rb +36 -0
- data/lib/hecks/pipeline_board/adapters/probe.rb +48 -0
- data/lib/hecks/pipeline_board/pipeline_board.bluebook +144 -0
- data/lib/hecks/pipeline_board/pipeline_board.hecksagon +12 -0
- data/lib/hecks/pipeline_board/pipeline_board.ports.hecksagon +47 -0
- data/lib/hecks/ports/persistence/binding_policy.rb +2 -1
- data/lib/hecks/ports/persistence/plugins/era/translation/compose.rb +4 -3
- data/lib/hecks/ports/persistence/repository_factory.rb +2 -1
- data/lib/hecks/projections/ci_pipeline/table.rb +2 -1
- data/lib/hecks/projections/deploy/lambda/stack/recipes.rb +2 -2
- data/lib/hecks/projections/undo.rb +2 -1
- data/lib/hecks/projector/cli_projector/command_help.rb +5 -4
- data/lib/hecks/projector/cli_projector/renames.rb +4 -2
- data/lib/hecks/projector/cli_projector/usage.rb +4 -3
- data/lib/hecks/projector/exporter/adapters.rb +3 -2
- data/lib/hecks/projector/narrate_projector/use_cases.rb +74 -0
- data/lib/hecks/projector/narrate_projector.rb +10 -3
- data/lib/hecks/quality_control/adapters/main_maintenance.rb +9 -5
- data/lib/hecks/quality_control/adapters/qa_auto_mint.rb +21 -2
- data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +2 -1
- data/lib/hecks/quality_control/cli/qa_fix_main_bug/publishing.rb +8 -4
- data/lib/hecks/quality_control/cli/qa_fix_main_bug.rb +10 -8
- data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +2 -2
- data/lib/hecks/quality_control/cli/qa_main_gate/gate_run.rb +6 -3
- data/lib/hecks/quality_control/cli/qa_main_gate/logging.rb +8 -4
- data/lib/hecks/quality_control/cli/qa_main_gate/shell.rb +4 -2
- data/lib/hecks/quality_control/cli/qa_main_gate/sweeping.rb +8 -4
- data/lib/hecks/quality_control/cli/qa_main_gate/worktree.rb +3 -2
- data/lib/hecks/quality_control/cli/qa_main_gate.rb +10 -5
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode/children.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_sweep.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_tick.rb +6 -3
- data/lib/hecks/quality_control/quality_control.bluebook +11 -11
- data/lib/hecks/quality_control/quality_control.ports.hecksagon +6 -3
- data/lib/hecks/query_ir/touchpoints.rb +2 -1
- data/lib/hecks/refused.rb +2 -1
- data/lib/hecks/release/approval.rb +4 -2
- data/lib/hecks/runtime/event_log.rb +27 -0
- data/lib/hecks/runtime/event_tap.rb +106 -0
- data/lib/hecks/runtime/loader/boot_steps.rb +1 -1
- data/lib/hecks/runtime/loader.rb +35 -19
- data/lib/hecks/runtime/registry/durability_warnings.rb +12 -5
- data/lib/hecks/runtime/registry/runtime_state.rb +4 -1
- data/lib/hecks/runtime/registry/saga_anchor.rb +54 -0
- data/lib/hecks/runtime/registry/saga_durability_rule.rb +66 -0
- data/lib/hecks/runtime/registry/saga_persistence.rb +58 -12
- data/lib/hecks/runtime/registry/verification.rb +7 -3
- data/lib/hecks/runtime/saga_interpreter/lifecycle.rb +2 -1
- data/lib/hecks/runtime/saga_interpreter.rb +1 -1
- data/lib/hecks/rust_format.rb +2 -1
- data/lib/hecks/shape_ledger/edge_hygiene.rb +10 -5
- data/lib/hecks/shape_ledger.rb +1 -1
- data/lib/hecks/storehouse/audit.rb +2 -1
- data/lib/hecks/storehouse/identity.rb +6 -3
- data/lib/hecks/storehouse.rb +2 -1
- data/lib/hecks/tickets/bluebook/tickets.bluebook +5 -4
- data/lib/hecks/tools/ci_workflows.rb +2 -1
- data/lib/hecks/tools/document.rb +12 -1
- data/lib/hecks/tools/downstream_model_check.rb +4 -2
- data/lib/hecks/tools/fuzz_sweep/shards.rb +9 -30
- data/lib/hecks/tools/model_check/examination.rb +25 -2
- data/lib/hecks/tools/move_disables.rb +4 -2
- data/lib/hecks/tools/regeneration_run/scratch.rb +2 -1
- data/lib/hecks/tools/rspec_shard_files.rb +12 -15
- data/lib/hecks/tools/sequence_script.rb +1 -1
- data/lib/hecks/tools/shard_planner.rb +65 -0
- data/lib/hecks/tools/stage_progress.rb +2 -1
- data/lib/hecks/tools/stress_concurrency_specs.rb +2 -1
- data/lib/hecks/version.rb +1 -1
- data/lib/hecks/vocabulary.rb +8 -9
- data/lib/hecks.rb +5 -2
- data/prebuilt/{13c04bdc5970295b310f0a980d397ba722232c8da99cc1a0cdb383249921e871.marshal → 4b81646f769ae5b1e7457f9b11c48d8bc1093e96a1dd6fb61864065121ca6f01.marshal} +0 -0
- data/prebuilt/{e3857b77f47d9ecc1787b2e1f5136364f3cb3444ef4aea5479f3b98167affea2.marshal → 681890632e3f4a99646623dcae44af36b1bad66c515f5abf67a2460372b9c6fd.marshal} +0 -0
- data/rust/host/HECKS_RELEASE +1 -1
- data/rust/parser/src/emit.rs +5 -1
- data/rust/parser/src/ir.rs +2 -0
- data/rust/parser/src/keywords.rs +12 -0
- data/rust/parser/src/main.rs +1 -0
- data/rust/parser/src/parse/adapter.rs +1 -0
- data/rust/parser/src/phrases.rs +16 -0
- data/rust/parser/src/sentence/examples.rs +93 -0
- data/rust/parser/src/sentence/mod.rs +1 -0
- metadata +89 -5
- data/lib/hecks/tools/refresh_rspec_runtime_baseline.rb +0 -166
|
@@ -5,7 +5,7 @@ Hecks.hecksagon "Hecks" do
|
|
|
5
5
|
# Expression, Tenancy, Deploy, Site, Tickets, Composer and QualityControl (the last three bring
|
|
6
6
|
# their own ports), and Coder and Fixer, whose events Tickets and QualityControl react to.
|
|
7
7
|
%w[Bluebook Hecksagon World Adapter Port Translation Expression Tenancy Deploy Site Tickets Composer QualityControl
|
|
8
|
-
Coder Fixer]
|
|
8
|
+
Coder Fixer PipelineBoard Pipeline]
|
|
9
9
|
.each { |declaration| attaches declaration }
|
|
10
10
|
# Persistence is not bound here, so the domain is in Memory. A copy opts in with a
|
|
11
11
|
# hecks.local.hecksagon whose `persisted_by` the attached bluebooks inherit (ADR 0136).
|
|
@@ -96,6 +96,16 @@ Hecks.hecksagon "Hecks" do
|
|
|
96
96
|
end
|
|
97
97
|
end
|
|
98
98
|
|
|
99
|
+
# Where a boarding's outcome is recorded: the boarded checkout's own launcher records it in that
|
|
100
|
+
# checkout's store. The train's own store stays Memory.
|
|
101
|
+
Hecks::SendTrain.port "PushRecords" do
|
|
102
|
+
asks "RecordOutcome", to: SendTrain do
|
|
103
|
+
attribute :run, RunKey
|
|
104
|
+
answers "OutcomeRecorded"
|
|
105
|
+
refuses "OutcomeUnrecorded"
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
99
109
|
Hecks::PushRehearsal.port "Rehearsing" do
|
|
100
110
|
asks "Trial", to: PushRehearsal do
|
|
101
111
|
attribute :run, RunKey
|
|
@@ -106,6 +116,18 @@ Hecks.hecksagon "Hecks" do
|
|
|
106
116
|
answers_query "Due"
|
|
107
117
|
end
|
|
108
118
|
|
|
119
|
+
Hecks::RedFlag.port "Flagging" do
|
|
120
|
+
%w[Hoist SignIn Lower Survey].each do |step|
|
|
121
|
+
asks step, to: RedFlag do
|
|
122
|
+
attribute :run, RunKey
|
|
123
|
+
answers "FlagAnswered"
|
|
124
|
+
refuses "FlagRefused"
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
answers_query "Status"
|
|
129
|
+
end
|
|
130
|
+
|
|
109
131
|
Hecks::QaQuiesce.port "Quiescing" do
|
|
110
132
|
asks "Mark", to: QaQuiesce do
|
|
111
133
|
attribute :run, RunKey
|
|
@@ -131,6 +153,15 @@ Hecks.hecksagon "Hecks" do
|
|
|
131
153
|
end
|
|
132
154
|
end
|
|
133
155
|
|
|
156
|
+
Hecks::SendTrain.port "Leftovers" do
|
|
157
|
+
asks "Leftovers", to: SendTrain do
|
|
158
|
+
attribute :run, RunKey
|
|
159
|
+
attribute :pushed, Word
|
|
160
|
+
answers "LeftoversListed"
|
|
161
|
+
refuses "LeftoversRefused"
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
134
165
|
Hecks::Workspace.port "Reading" do
|
|
135
166
|
answers_query "Status"
|
|
136
167
|
answers_query "Changes"
|
|
@@ -196,6 +227,12 @@ Hecks.hecksagon "Hecks" do
|
|
|
196
227
|
refuses "RemovalRefused"
|
|
197
228
|
end
|
|
198
229
|
|
|
230
|
+
asks "DropBranch", to: Landing do
|
|
231
|
+
attribute :run, RunKey
|
|
232
|
+
answers "DiscardAnswered"
|
|
233
|
+
refuses "DiscardRefused"
|
|
234
|
+
end
|
|
235
|
+
|
|
199
236
|
answers_query "Unlanded"
|
|
200
237
|
end
|
|
201
238
|
|
|
@@ -209,6 +246,43 @@ Hecks.hecksagon "Hecks" do
|
|
|
209
246
|
end
|
|
210
247
|
end
|
|
211
248
|
|
|
249
|
+
# The outside an integration of main reaches: the open runs an advance steps, a clean copy of
|
|
250
|
+
# main for a verification, the push train's own copy for a boarding, and GitHub's CI runs.
|
|
251
|
+
Hecks::Integration.port "Integrating" do
|
|
252
|
+
asks "Step", to: Integration do
|
|
253
|
+
attribute :run, RunKey
|
|
254
|
+
answers "AdvanceAnswered"
|
|
255
|
+
refuses "AdvanceRefused"
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
Hecks::Integration.port "MainVerifying" do
|
|
260
|
+
asks "Check", to: Integration do
|
|
261
|
+
attribute :run, RunKey
|
|
262
|
+
attribute :landed, Word
|
|
263
|
+
answers "VerifyAnswered"
|
|
264
|
+
refuses "VerifyRefused"
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
Hecks::Integration.port "MainBoarding" do
|
|
269
|
+
asks "Embark", to: Integration do
|
|
270
|
+
attribute :run, RunKey
|
|
271
|
+
attribute :landed, Word
|
|
272
|
+
answers "BoardAnswered"
|
|
273
|
+
refuses "BoardRefused"
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
Hecks::Integration.port "CiRuns" do
|
|
278
|
+
asks "Watch", to: Integration do
|
|
279
|
+
attribute :run, RunKey
|
|
280
|
+
attribute :landed, Word
|
|
281
|
+
answers "ObserveAnswered"
|
|
282
|
+
refuses "ObserveRefused"
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
212
286
|
Hecks::ReviewRequest.port "GitHubPullRequests" do
|
|
213
287
|
asks "Create", to: ReviewRequest do
|
|
214
288
|
attribute :run, RunKey
|
|
@@ -240,8 +314,8 @@ Hecks.hecksagon "Hecks" do
|
|
|
240
314
|
end
|
|
241
315
|
end
|
|
242
316
|
|
|
243
|
-
# The outside an agent run reaches: it finds the directory, starts the background
|
|
244
|
-
# reports the state
|
|
317
|
+
# The outside an agent run reaches: it finds the directory and the agents, starts the background
|
|
318
|
+
# session, and reports the state its job is in. The state is judged in the bluebook, not here.
|
|
245
319
|
Hecks::AgentRun.port "Agents" do
|
|
246
320
|
asks "Locate", to: AgentRun do
|
|
247
321
|
attribute :run, RunKey
|
|
@@ -255,10 +329,18 @@ Hecks.hecksagon "Hecks" do
|
|
|
255
329
|
refuses "StartRefused"
|
|
256
330
|
end
|
|
257
331
|
|
|
258
|
-
|
|
332
|
+
# The state a session's job is in, with the state the run last recorded beside it.
|
|
333
|
+
asks "ReadJob", to: AgentRun do
|
|
259
334
|
attribute :run, RunKey
|
|
260
|
-
answers "
|
|
261
|
-
refuses "
|
|
335
|
+
answers "JobRead"
|
|
336
|
+
refuses "JobUnread"
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
# The same reading, taken once a just-started session has had a few seconds to fail.
|
|
340
|
+
asks "AwaitJob", to: AgentRun do
|
|
341
|
+
attribute :run, RunKey
|
|
342
|
+
answers "JobRead"
|
|
343
|
+
refuses "JobUnread"
|
|
262
344
|
end
|
|
263
345
|
|
|
264
346
|
# Whether a person took the session over is a fact about its transcript; the bluebook judges it.
|
|
@@ -866,3 +948,21 @@ Hecks.hecksagon "Tenancy" do
|
|
|
866
948
|
trigger Tenant::Register, with: { slug: :slug, domain: :domain, realm: :realm, schema: :schema }
|
|
867
949
|
end
|
|
868
950
|
end
|
|
951
|
+
|
|
952
|
+
# A rehearsal that would mint is the record a mint reads: QualityControl's Maintenance keeps the verdict and
|
|
953
|
+
# the watermark the copy held, so Maintenance.MintEra finds it by this run (the mint plan's watermark guard).
|
|
954
|
+
# QualityControl is attached here, so the seam is its translation of the migrate bluebook's audit, not an
|
|
955
|
+
# `across` dispatch. It listens beside Judge, on the same audit and the same condition, because the rehearsal
|
|
956
|
+
# is already five reactions deep at Judge and a reaction to RehearsalJudged would pass the dispatcher's depth bound.
|
|
957
|
+
Hecks.hecksagon "QualityControl" do
|
|
958
|
+
subscribe "Hecks.RehearsalAudited"
|
|
959
|
+
|
|
960
|
+
translates "RecordVerdictWhenNothingWouldStopTheMint" do
|
|
961
|
+
on RehearsalRun::RehearsalAudited
|
|
962
|
+
where do
|
|
963
|
+
(minting.value != "next" || edge_present.value) && refusal_total.value == 0
|
|
964
|
+
end
|
|
965
|
+
trigger Maintenance::RecordRehearsalVerdict, with: { run: :run, domain: :rehearsed_domain,
|
|
966
|
+
watermark: :watermark, rehearsal_verdict: "would_mint" }
|
|
967
|
+
end
|
|
968
|
+
end
|
data/lib/hecks/hecks/hecks.world
CHANGED
|
@@ -45,6 +45,9 @@
|
|
|
45
45
|
# **test_scope** `suite_runs_in` names where the full suite runs ("ci": a local run of it is refused by name) and
|
|
46
46
|
# `spec_files_limit` is the most spec files one local `run_spec_files!` or `run_impacted_specs!` call runs.
|
|
47
47
|
#
|
|
48
|
+
# **event_log** `path` is the append-only file the runtime writes events and policy deliveries to (one JSON line each,
|
|
49
|
+
# names and outcomes, never payloads) and `max_bytes` the size at which it moves to `<path>.1`; absent, nothing is written.
|
|
50
|
+
#
|
|
48
51
|
# **landing** `stale_minutes` is how long a landing's ticket may go without a heartbeat before the next one treats
|
|
49
52
|
# it as abandoned and removes it (30 when absent); `wait_minutes` is how long a landing waits for its turn in the
|
|
50
53
|
# line before it gives up (40 when absent); `shell_lock` names a lock directory an older brief makes by hand,
|
|
@@ -64,6 +67,10 @@ Hecks.world "Hecks" do
|
|
|
64
67
|
# Locally `test_suite_run.run_suite!` is refused, and `run_spec_files!` and `run_impacted_specs!` run at
|
|
65
68
|
# most `spec_files_limit` files per call; CI is detected by the environment (`CI`, `GITHUB_ACTIONS`).
|
|
66
69
|
test_scope "Local", suite_runs_in: "ci", spec_files_limit: 25
|
|
70
|
+
# The runtime appends one JSON line per event and per policy delivery here, so a reader such as the
|
|
71
|
+
# PipelineBoard sees the domains that persist nothing (the push train runs in Memory). A client's
|
|
72
|
+
# world declares no `event_log`, so a client writes no file. The file rotates at `max_bytes`.
|
|
73
|
+
event_log "EventTap", path: "~/.claude/hecks-dev/events.jsonl", max_bytes: 5_000_000
|
|
67
74
|
launcher "Launcher", run_keys: true,
|
|
68
75
|
settled: %w[package.vendor package.revendor package.release
|
|
69
76
|
operation.bootstrap_admin smoke_run.run
|
|
@@ -72,11 +79,12 @@ Hecks.world "Hecks" do
|
|
|
72
79
|
preview_run.url preview_run.list preview_run.deploy
|
|
73
80
|
preview_run.destroy preview_run.login companion_roll.run
|
|
74
81
|
handover.clear rehearsal_run.request send_train.board
|
|
75
|
-
landing.land landing.train landing.retire agent_run.dispatch agent_run.check],
|
|
82
|
+
landing.land landing.train landing.retire landing.discard agent_run.dispatch agent_run.check],
|
|
76
83
|
unknown_runs: %w[rehearsal_run.rehearsal_outcome],
|
|
77
84
|
renamed: { "push_train.push" => "send_train.send", "pull_request.merge" => "review_request.take", "checkout.log" => "workspace.history" },
|
|
78
85
|
names: { "config" => "workspace.settings", "doctor" => "workspace.doctor", "mcp" => "server.serve_mcp", "console" => "operation.open_console", "init" => "launch.init",
|
|
79
86
|
"interview" => "launch.interview", "package.check" => "registry.check",
|
|
87
|
+
"agent_run.check_all" => "session_sweep.check_all",
|
|
80
88
|
"package.digest" => "registry.digest",
|
|
81
89
|
"package.release" => "registry.release" },
|
|
82
90
|
streams: %w[Follow],
|
|
@@ -908,6 +908,10 @@ Hecks.bluebook "Hecks" do
|
|
|
908
908
|
attribute :unchecked, list_of(Limit), sets: true
|
|
909
909
|
attribute :released, Switch, sets: true
|
|
910
910
|
attribute :kept, Report, optional: true, sets: true
|
|
911
|
+
# Carried, not kept: the rehearsed bluebook's name and the ledger watermark the copy held, plain, as
|
|
912
|
+
# Maintenance.RecordRehearsalVerdict takes them.
|
|
913
|
+
attribute :rehearsed_domain, String
|
|
914
|
+
attribute :watermark, Integer
|
|
911
915
|
|
|
912
916
|
|
|
913
917
|
emits RehearsalAudited
|
|
@@ -1035,7 +1039,8 @@ Hecks.bluebook "Hecks" do
|
|
|
1035
1039
|
rust_rows_examined: :rust_rows_examined,
|
|
1036
1040
|
aggregates_examined: :aggregates_examined, reason: :reason,
|
|
1037
1041
|
parity: :parity, unchecked: :unchecked,
|
|
1038
|
-
released: :released, kept: :kept
|
|
1042
|
+
released: :released, kept: :kept,
|
|
1043
|
+
rehearsed_domain: :rehearsed_domain, watermark: :watermark }
|
|
1039
1044
|
end
|
|
1040
1045
|
|
|
1041
1046
|
policy "JudgeWhenNothingWouldStopTheMint" do
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
Hecks.bluebook "Hecks" do
|
|
2
|
+
domain_module "Redflag" do
|
|
3
|
+
vision "Main red is a red flag: everyone working hears it, checks in to help, and stops landing until CI is green again."
|
|
4
|
+
|
|
5
|
+
# One request against the standing flag of the repository: raise it, note another red run on it,
|
|
6
|
+
# check in to help, or lower it. The flag itself is a marker in the repository's git directory, so
|
|
7
|
+
# Landing and SendTrain read it from every worktree. A CI run of main that completes red raises it
|
|
8
|
+
# (Integration.CiFailed, or `RedFlag.sync!`), and one that completes green lowers it. One flag
|
|
9
|
+
# stands at a time: a second red run is recorded on it. Anything can listen to the events
|
|
10
|
+
# RedFlagRaised, RedFlagRunNoted, RedFlagCheckedIn and RedFlagCleared through the ordinary journal.
|
|
11
|
+
aggregate "RedFlag" do
|
|
12
|
+
description "One request against main's red flag: raised, noted, checked in to, lowered, or refused."
|
|
13
|
+
created_by "RedFlag.raise!"
|
|
14
|
+
|
|
15
|
+
attribute :run, RunKey
|
|
16
|
+
attribute :commit, Word, optional: true
|
|
17
|
+
attribute :detail, Report, optional: true
|
|
18
|
+
attribute :rows, Report, optional: true
|
|
19
|
+
attribute :session, Word, optional: true
|
|
20
|
+
attribute :taking, Word, optional: true
|
|
21
|
+
attribute :checkout, Word, optional: true
|
|
22
|
+
attribute :flag, Word, optional: true
|
|
23
|
+
attribute :ci_run, Report, optional: true
|
|
24
|
+
attribute :jobs, Report, optional: true
|
|
25
|
+
attribute :output, Report, optional: true
|
|
26
|
+
attribute :refusal, Report, optional: true
|
|
27
|
+
identified_by :run
|
|
28
|
+
|
|
29
|
+
value_object "RunKey" do
|
|
30
|
+
attribute :value, String, matches: :present
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
value_object "Word" do
|
|
34
|
+
attribute :value, String, matches: :present
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
value_object "Report" do
|
|
38
|
+
attribute :value, String
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
value_object "Document" do
|
|
42
|
+
attribute :text, String
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
lifecycle :status, default: "requested" do
|
|
46
|
+
mark :failure, "refused"
|
|
47
|
+
transition "Record" => "raised", from: "requested"
|
|
48
|
+
transition "Note" => "noted", from: "requested"
|
|
49
|
+
transition "Welcome" => "checked_in", from: "requested"
|
|
50
|
+
transition "Lift" => "cleared", from: "requested"
|
|
51
|
+
transition "Settle" => "idle", from: "requested"
|
|
52
|
+
transition "Decline" => "refused", from: "requested"
|
|
53
|
+
mark :terminal, "raised", "noted", "checked_in", "cleared", "idle", "refused"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
command "Raise" do
|
|
57
|
+
role "System"
|
|
58
|
+
goal "Raise main's red flag for a red CI run, or record the run on the flag already standing"
|
|
59
|
+
|
|
60
|
+
attribute :run, RunKey, sets: true
|
|
61
|
+
attribute :commit, Word, sets: true
|
|
62
|
+
attribute :detail, Report, optional: true, sets: true
|
|
63
|
+
attribute :rows, Report, optional: true, sets: true
|
|
64
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
65
|
+
|
|
66
|
+
emits RaiseRequested
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
command "CheckIn" do
|
|
70
|
+
role "Operator"
|
|
71
|
+
goal "Say who is helping with the red flag and what they take (a red-* Work row or a cause), so nobody fixes the same thing twice"
|
|
72
|
+
|
|
73
|
+
attribute :run, RunKey, sets: true
|
|
74
|
+
attribute :session, Word, sets: true
|
|
75
|
+
attribute :taking, Word, sets: true
|
|
76
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
77
|
+
|
|
78
|
+
emits CheckInRequested
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
command "Clear" do
|
|
82
|
+
role "System"
|
|
83
|
+
goal "Lower main's red flag for a green CI run, which lets landing and the push train resume"
|
|
84
|
+
|
|
85
|
+
attribute :run, RunKey, sets: true
|
|
86
|
+
attribute :commit, Word, optional: true, sets: true
|
|
87
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
88
|
+
|
|
89
|
+
emits ClearRequested
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
command "Sync" do
|
|
93
|
+
role "Operator"
|
|
94
|
+
goal "Read main's newest CI run on GitHub and raise or lower the red flag to match it"
|
|
95
|
+
|
|
96
|
+
attribute :run, RunKey, sets: true
|
|
97
|
+
attribute :checkout, Word, optional: true, sets: true
|
|
98
|
+
|
|
99
|
+
emits SyncRequested
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
command "Record" do
|
|
103
|
+
role "System"
|
|
104
|
+
goal "Record that the red flag was raised, with the main commit, CI run, failed jobs and red Work rows"
|
|
105
|
+
|
|
106
|
+
reference_to RedFlag
|
|
107
|
+
attribute :flag, Word, sets: true
|
|
108
|
+
attribute :commit, Word, sets: true
|
|
109
|
+
attribute :ci_run, Report, optional: true, sets: true
|
|
110
|
+
attribute :jobs, Report, optional: true, sets: true
|
|
111
|
+
attribute :rows, Report, optional: true, sets: true
|
|
112
|
+
|
|
113
|
+
emits RedFlagRaised
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
command "Note" do
|
|
117
|
+
role "System"
|
|
118
|
+
goal "Record another red run on the flag that already stands"
|
|
119
|
+
|
|
120
|
+
reference_to RedFlag
|
|
121
|
+
attribute :flag, Word, sets: true
|
|
122
|
+
attribute :commit, Word, sets: true
|
|
123
|
+
attribute :ci_run, Report, optional: true, sets: true
|
|
124
|
+
attribute :jobs, Report, optional: true, sets: true
|
|
125
|
+
|
|
126
|
+
emits RedFlagRunNoted
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
command "Welcome" do
|
|
130
|
+
role "System"
|
|
131
|
+
goal "Record that a session checked in to help, and what it takes"
|
|
132
|
+
|
|
133
|
+
reference_to RedFlag
|
|
134
|
+
attribute :flag, Word, sets: true
|
|
135
|
+
attribute :session, Word, sets: true
|
|
136
|
+
attribute :taking, Word, sets: true
|
|
137
|
+
|
|
138
|
+
emits RedFlagCheckedIn
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
command "Lift" do
|
|
142
|
+
role "System"
|
|
143
|
+
goal "Record that the red flag was lowered by a green run"
|
|
144
|
+
|
|
145
|
+
reference_to RedFlag
|
|
146
|
+
attribute :flag, Word, sets: true
|
|
147
|
+
attribute :commit, Word, optional: true, sets: true
|
|
148
|
+
|
|
149
|
+
emits RedFlagCleared
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
command "Settle" do
|
|
153
|
+
role "System"
|
|
154
|
+
goal "Record that there was nothing to change: no flag stood to lower, or CI is still running"
|
|
155
|
+
|
|
156
|
+
reference_to RedFlag
|
|
157
|
+
attribute :output, Report, sets: true
|
|
158
|
+
|
|
159
|
+
emits RedFlagUnchanged
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
command "Decline" do
|
|
163
|
+
role "System"
|
|
164
|
+
goal "Record why a request against the flag was refused"
|
|
165
|
+
|
|
166
|
+
reference_to RedFlag
|
|
167
|
+
attribute :refusal, Report, sets: true
|
|
168
|
+
|
|
169
|
+
emits RedFlagDeclined
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
query "Status" do
|
|
173
|
+
description "Whether main is flagged: the flag, its commit, red time, failed jobs and who is helping."
|
|
174
|
+
attribute :run, RunKey, optional: true
|
|
175
|
+
returns Document
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
policy "HoistWhenRaised" do
|
|
180
|
+
on "RedFlag.RaiseRequested"
|
|
181
|
+
ask :hoist, with: { run: :run }
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
policy "SignInWhenCheckedIn" do
|
|
185
|
+
on "RedFlag.CheckInRequested"
|
|
186
|
+
ask :sign_in, with: { run: :run }
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
policy "LowerWhenCleared" do
|
|
190
|
+
on "RedFlag.ClearRequested"
|
|
191
|
+
ask :lower, with: { run: :run }
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
policy "SurveyWhenSynced" do
|
|
195
|
+
on "RedFlag.SyncRequested"
|
|
196
|
+
ask :survey, with: { run: :run }
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
policy "RecordTheRaisedFlag" do
|
|
200
|
+
on "RedFlag.FlagAnswered"
|
|
201
|
+
where { outcome.value == "raised" }
|
|
202
|
+
trigger RedFlag::Record, with: { flag: :flag, commit: :commit, ci_run: :ci_run, jobs: :jobs, rows: :rows }
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
policy "RecordTheNotedRun" do
|
|
206
|
+
on "RedFlag.FlagAnswered"
|
|
207
|
+
where { outcome.value == "noted" }
|
|
208
|
+
trigger RedFlag::Note, with: { flag: :flag, commit: :commit, ci_run: :ci_run, jobs: :jobs }
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
policy "RecordTheCheckIn" do
|
|
212
|
+
on "RedFlag.FlagAnswered"
|
|
213
|
+
where { outcome.value == "checked_in" }
|
|
214
|
+
trigger RedFlag::Welcome, with: { flag: :flag, session: :session, taking: :taking }
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
policy "RecordTheClearedFlag" do
|
|
218
|
+
on "RedFlag.FlagAnswered"
|
|
219
|
+
where { outcome.value == "cleared" }
|
|
220
|
+
trigger RedFlag::Lift, with: { flag: :flag, commit: :commit }
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
policy "RecordTheUnchangedFlag" do
|
|
224
|
+
on "RedFlag.FlagAnswered"
|
|
225
|
+
where { outcome.value == "idle" }
|
|
226
|
+
trigger RedFlag::Settle, with: { output: :output }
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
policy "RecordTheRefusedFlag" do
|
|
230
|
+
on "RedFlag.FlagRefused"
|
|
231
|
+
trigger RedFlag::Decline, with: { refusal: :refusal }
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
# A CI observation that ends red raises the flag; one that ends green lowers it. The policies hear
|
|
235
|
+
# the observation's answer, beside the ones that record it, so the chain stays within the
|
|
236
|
+
# reaction depth bound. The landed commit keys the request.
|
|
237
|
+
policy "RaiseTheFlagWhenCiFails" do
|
|
238
|
+
on "Integration.ObserveAnswered"
|
|
239
|
+
where { outcome.value == "failed" }
|
|
240
|
+
trigger RedFlag::Raise, with: { run: :landed, commit: :landed, detail: :report, checkout: :checkout }
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
policy "LowerTheFlagWhenCiPasses" do
|
|
244
|
+
on "Integration.ObserveAnswered"
|
|
245
|
+
where { outcome.value == "passed" }
|
|
246
|
+
trigger RedFlag::Clear, with: { run: :landed, commit: :landed, checkout: :checkout }
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
end
|
|
@@ -107,20 +107,6 @@ Hecks.bluebook "Hecks" do
|
|
|
107
107
|
attribute :value, String, pattern: '^(host|parser|json)$'
|
|
108
108
|
end
|
|
109
109
|
|
|
110
|
-
command "RefreshRuntimeBaseline" do
|
|
111
|
-
role "Maintainer"
|
|
112
|
-
goal "Regenerate the committed runtime baselines the sharded jobs group from"
|
|
113
|
-
|
|
114
|
-
attribute :workers, Count, default: 6, sets: true
|
|
115
|
-
attribute :from_run, RunId, optional: true, sets: true
|
|
116
|
-
attribute :run, RunKey, sets: true
|
|
117
|
-
attribute :confirm, Switch, optional: true, sets: true
|
|
118
|
-
|
|
119
|
-
sets :operation, to: "refresh_runtime_baseline"
|
|
120
|
-
|
|
121
|
-
emits RefreshRuntimeBaselineRequested
|
|
122
|
-
end
|
|
123
|
-
|
|
124
110
|
command "RunSpecExample" do
|
|
125
111
|
role "Maintainer"
|
|
126
112
|
goal "Run one spec file filtered to one example, through the test runner in this process"
|
|
@@ -334,11 +320,6 @@ Hecks.bluebook "Hecks" do
|
|
|
334
320
|
end
|
|
335
321
|
end
|
|
336
322
|
|
|
337
|
-
policy "ExamineWhenRefreshRuntimeBaselineRequested" do
|
|
338
|
-
on "TestSuiteRun.RefreshRuntimeBaselineRequested"
|
|
339
|
-
ask :examine, with: { run: :run }
|
|
340
|
-
end
|
|
341
|
-
|
|
342
323
|
policy "ExamineWhenRunSpecExampleRequested" do
|
|
343
324
|
on "TestSuiteRun.RunSpecExampleRequested"
|
|
344
325
|
ask :examine, with: { run: :run }
|
|
@@ -15,6 +15,9 @@ Hecks.bluebook "Adapter" do
|
|
|
15
15
|
# What this adapter can do beyond its port's contract, such as `set_transform`. Absent is
|
|
16
16
|
# not empty: most adapters provide nothing more.
|
|
17
17
|
attribute :provides, list_of(AdapterCapability)
|
|
18
|
+
# Whether this adapter stays inside: it reaches no network, model or host beyond the process
|
|
19
|
+
# and the checkout, so a behaviors suite may load it (ADR 0171). Absent means it reaches outside.
|
|
20
|
+
attribute :stays_inside, Containment, optional: true
|
|
18
21
|
|
|
19
22
|
# **A plugin answers named queries** — one that `runs` a wasm module says which queries it
|
|
20
23
|
# answers, each qualified by bluebook and aggregate, and the runtime binds them to it.
|
|
@@ -48,6 +51,12 @@ Hecks.bluebook "Adapter" do
|
|
|
48
51
|
attribute :value, String, matches: :snake_name
|
|
49
52
|
end
|
|
50
53
|
|
|
54
|
+
# What `stays_inside` records: the one claim an adapter can make about its reach.
|
|
55
|
+
value_object "Containment" do
|
|
56
|
+
attribute :value, String
|
|
57
|
+
invariant("an adapter that says where it reaches stays inside") { value.to_s == "inside" }
|
|
58
|
+
end
|
|
59
|
+
|
|
51
60
|
# The wasm module a plugin runs: a file beside its `.adapter`, never a path out of it.
|
|
52
61
|
value_object "PluginModule" do
|
|
53
62
|
attribute :value, String, pattern: '^[a-z0-9_-]+\.wasm$'
|
|
@@ -69,10 +78,13 @@ Hecks.bluebook "Adapter" do
|
|
|
69
78
|
attribute :port, AdapterPortName, optional: true
|
|
70
79
|
# Optional: only a plugin runs a wasm module.
|
|
71
80
|
attribute :runs, PluginModule, optional: true
|
|
81
|
+
# Optional: only an adapter that says `stays_inside` holds it.
|
|
82
|
+
attribute :stays_inside, Containment, optional: true
|
|
72
83
|
|
|
73
84
|
sets :name
|
|
74
85
|
sets :port
|
|
75
86
|
sets :runs
|
|
87
|
+
sets :stays_inside
|
|
76
88
|
|
|
77
89
|
emits "AdapterDeclared"
|
|
78
90
|
end
|
|
@@ -148,6 +160,7 @@ Hecks.bluebook "Adapter" do
|
|
|
148
160
|
|
|
149
161
|
|
|
150
162
|
member word: "provides", context: "Adapter", body: "none", inner: "", opens: "", fills: "provides"
|
|
163
|
+
member word: "stays_inside", context: "Adapter", body: "none", inner: "", opens: "", fills: "stays_inside"
|
|
151
164
|
end
|
|
152
165
|
|
|
153
166
|
value_object "ArgumentSeed" do
|
|
@@ -776,7 +776,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
776
776
|
title: "rspec (parallel)",
|
|
777
777
|
runs_in: "ci",
|
|
778
778
|
argv: "",
|
|
779
|
-
script: "# Workers are grouped by this machine's own last timings, kept under the git directory\n# (shared by every worktree, never committed)
|
|
779
|
+
script: "# Workers are grouped by this machine's own last timings, kept under the git directory\n# (shared by every worktree, never committed); the first run, with none, groups by file size and\n# writes the log.\nlog=\"$(git rev-parse --git-common-dir)/hecks_rspec_runtime.log\"\nif [ -f \"$log\" ]; then grouping=(--group-by runtime --runtime-log \"$log\" --allowed-missing 100); else grouping=(--group-by filesize); fi\nbundle exec parallel_rspec spec -n {workers} \"${grouping[@]}\" \\\n -o \"--format progress --format ParallelTests::RSpec::RuntimeLogger --out $log\"\n",
|
|
780
780
|
blocked: "the suite is red."
|
|
781
781
|
member name: "fuzzing", id: "fuzzing",
|
|
782
782
|
title: "spec/fuzzing, which the parallel run above excludes",
|
|
@@ -954,13 +954,13 @@ Hecks.bluebook "Bluebook" do
|
|
|
954
954
|
blocked: "a command's arguments changed with no regenerated doc; run `hecks regeneration_run.project_tools_doc! --confirm`."
|
|
955
955
|
member name: "rust_coverage", id: "rust_coverage",
|
|
956
956
|
title: "rust coverage, every generated module",
|
|
957
|
-
argv: "bundle exec exe/hecks
|
|
957
|
+
argv: "bundle exec exe/hecks corpus_run.corpus_rust_coverage --wait",
|
|
958
958
|
script: "",
|
|
959
959
|
blocked: "a construct a domain declares has no generated Rust, or an entry on RUST_COVERAGE_PENDING is now fixed and must be deleted."
|
|
960
960
|
member name: "rust_coverage_codegen", id: "rust_coverage_codegen",
|
|
961
961
|
title: "rust coverage against hecks-codegen's own manifest, pizzas governance identity banking meta",
|
|
962
962
|
argv: "",
|
|
963
|
-
script: "for module in pizzas governance identity banking meta; do\n bundle exec exe/hecks
|
|
963
|
+
script: "for module in pizzas governance identity banking meta; do\n bundle exec exe/hecks build.rust_coverage module_name=$module codegen=rust --wait\ndone\n",
|
|
964
964
|
blocked: "hecks-codegen generated nothing for a construct a domain declares."
|
|
965
965
|
member name: "kernel_coverage", id: "kernel_coverage",
|
|
966
966
|
title: "rust kernel coverage, every capability variant has a kernel file",
|
|
@@ -1129,7 +1129,7 @@ Hecks.bluebook "Bluebook" do
|
|
|
1129
1129
|
member name: "widening_tiers", type: "Array",
|
|
1130
1130
|
meaning: "Fuzz depth by `Target.clean_streak`, in three discrete tiers, read by `SweepDepth.for_streak`. The last row (`upto: Float::INFINITY`) is the ceiling."
|
|
1131
1131
|
member name: "sweep_max_parallel", type: "Integer",
|
|
1132
|
-
meaning: "How many `hecks quality_control
|
|
1132
|
+
meaning: "How many `hecks quality_control sweep.run <target>` children `--all` keeps running at once."
|
|
1133
1133
|
member name: "liveness_fallback_seconds", type: "Integer",
|
|
1134
1134
|
meaning: "How long the `/loop hecks_qa` caller waits for a tick's report before assuming it stalled."
|
|
1135
1135
|
member name: "draft_only", type: "Boolean",
|
|
@@ -1147,9 +1147,9 @@ Hecks.bluebook "Bluebook" do
|
|
|
1147
1147
|
member name: "runtime_coverage_feedback", type: "Boolean",
|
|
1148
1148
|
meaning: "Whether guided generation also admits a seed to the corpus for reaching a new line or branch of the Ruby runtime (`Hecks::Fuzzing::RuntimeCoverage`), not only a new (verb, kind, state, mutation, outcome) tuple. Off by default: tracing every line slows each seed."
|
|
1149
1149
|
member name: "self_consistency_checks", type: "Boolean",
|
|
1150
|
-
meaning: "Whether `hecks quality_control
|
|
1150
|
+
meaning: "Whether `hecks quality_control sweep.run` also runs the self-consistency pass (cold rehydration, replay idempotency, value-object JSON round trip) on the same generated sequence."
|
|
1151
1151
|
member name: "shrink_budget", type: "Integer",
|
|
1152
|
-
meaning: "Candidate replays `hecks quality_control
|
|
1152
|
+
meaning: "Candidate replays `hecks quality_control sweep.run` may spend shrinking one surprised check; 0 turns shrinking off. `concurrency` is never shrunk: a race does not reproduce on demand."
|
|
1153
1153
|
member name: "yield_weight_seconds", type: "Integer",
|
|
1154
1154
|
meaning: "Seconds of staleness that one point of yield score is worth in `RotationPriority.pick`. Zero would make yield invisible, so pick a number that lets it matter."
|
|
1155
1155
|
member name: "yield_decay_percent", type: "Integer",
|
|
@@ -1157,13 +1157,13 @@ Hecks.bluebook "Bluebook" do
|
|
|
1157
1157
|
member name: "rotation_stale_floor_seconds", type: "Integer",
|
|
1158
1158
|
meaning: "Once a waiting target is this stale, `RotationPriority.pick` takes it whatever its yield score, so a quiet target cannot starve."
|
|
1159
1159
|
member name: "persistence_parity_seed_cap", type: "Integer",
|
|
1160
|
-
meaning: "Ceiling on `--seeds` for `--persistence-parity`, which pays for real Postgres per dispatch. `hecks quality_control
|
|
1160
|
+
meaning: "Ceiling on `--seeds` for `--persistence-parity`, which pays for real Postgres per dispatch. `hecks quality_control sweep.run` clamps down, never up, and prints a note."
|
|
1161
1161
|
member name: "concurrency_seed_cap", type: "Integer",
|
|
1162
1162
|
meaning: "Ceiling on `--seeds` for the concurrency mode, which needs two disposable schemas per seed."
|
|
1163
1163
|
member name: "adapter_parity_pairs", type: "Hash",
|
|
1164
1164
|
meaning: "The two adapters each adapter-parity mode compares, by mode name; a new pairing is a new entry. `adapter_parity_sqlite` needs no `database:`/`schema:` because sqlite has no disposable database."
|
|
1165
1165
|
member name: "modes", type: "Hash",
|
|
1166
|
-
meaning: "Which comparison modes `hecks quality_control
|
|
1166
|
+
meaning: "Which comparison modes `hecks quality_control sweep.run` may run: the enabled ones intersected with what `TargetCapabilities.infer(path)` finds in the target. `--modes a,b,c` overrides for one run. `wasm_front` and `adapter_parity_postgres` are off because nothing runs them; the others are built and off because their I/O cost across the rotation is unmeasured. `hecks quality_control sweep.run` refuses to start when a mode outside `TargetCapabilities::RUNNABLE_MODES` is enabled."
|
|
1167
1167
|
member name: "role_draw_probability", type: "Numeric",
|
|
1168
1168
|
meaning: "How often a generated role-gated command step carries a drawn caller (`role:`/`actor_id:`); 0 turns the draw off."
|
|
1169
1169
|
member name: "dry_run_fraction", type: "Numeric",
|
|
@@ -1308,7 +1308,6 @@ Hecks.bluebook "Bluebook" do
|
|
|
1308
1308
|
member script: "rspec_shard_files", section: "Codebase", aggregate: "TestSuiteRun", verb: "shard_specs"
|
|
1309
1309
|
member script: "rspec_io_parallel_files", section: "Codebase", aggregate: "TestSuiteRun", verb: "list_io_parallel_specs"
|
|
1310
1310
|
member script: "rspec_io_parallel_files", section: "Codebase", aggregate: "TestSuiteRun", verb: "write_io_parallel_spec_list"
|
|
1311
|
-
member script: "refresh_rspec_runtime_baseline", section: "Codebase", aggregate: "TestSuiteRun", verb: "refresh_runtime_baseline"
|
|
1312
1311
|
member script: "spec_example", section: "Codebase", aggregate: "TestSuiteRun", verb: "run_spec_example"
|
|
1313
1312
|
member script: "stress_concurrency_specs", section: "Codebase", aggregate: "TestSuiteRun", verb: "stress_concurrency"
|
|
1314
1313
|
member script: "regenerate_persistence_legacy_fixtures", section: "Codebase", aggregate: "TestSuiteRun", verb: "regenerate_legacy_fixtures"
|
|
@@ -187,6 +187,8 @@ Hecks.bluebook "Sentence" do
|
|
|
187
187
|
member id: "examples_for", context: "ExamplesFile", pattern: "Examples for: {name:words}", opens: "Examples"
|
|
188
188
|
member id: "background", context: "Examples", pattern: "Background:", opens: "Background"
|
|
189
189
|
member id: "example", context: "Examples", pattern: "Example: {title:rest}", opens: "Example"
|
|
190
|
+
member id: "examples_goal", context: "Examples", pattern: "Goal: {goal:rest}", opens: "Goal"
|
|
191
|
+
member id: "goal_example", context: "Goal", pattern: "Example: {title:rest}", opens: "Example"
|
|
190
192
|
member id: "person_role", context: "Background", pattern: "{person:words} is (a|an) {role:words}", opens: ""
|
|
191
193
|
member id: "given_step", context: "Example", pattern: "Given {step:rest}", opens: ""
|
|
192
194
|
member id: "when_step", context: "Example", pattern: "When {step:rest}", opens: ""
|