Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ env:
jobs:
build:
runs-on: [self-hosted, linux, arm64]
timeout-minutes: 70
timeout-minutes: 75
steps:
- name: Checkout
uses: actions/checkout@v5
Expand Down Expand Up @@ -76,6 +76,11 @@ jobs:
- name: cargo fmt --all --check (fast gate; fails in seconds, before the release build)
run: "\"$CARGO_BIN\" fmt --all --check"
timeout-minutes: 5
- name: cargo check -p v1-compiler-tests --tests (compile gate; no test execution)
run: |
# 🟡 dissolve-on: ci_v1_compiler_tests_compile_gate_script — foreign-executor (GitHub Actions run:) shell transport for extdeps.cargo_build cargo.Build.Check(extra_args: ci_v1_compiler_tests_compile_gate_extra_args); DISSOLVES WHEN bash-emit (#5828 / ROADMAP 6-shell-slice0 / shell→intent Phase 2) binds the build-job step to orchestration emit over the typed cargo operation — the same de-fork ci_fmt_gate_line and ci_release_build_script await
"$CARGO_BIN" 'check' '-p' 'v1-compiler-tests' '--tests'
timeout-minutes: 5
- name: Build release bins (claim_executor + gunbc)
run: |
# 🟡 dissolve-on: ci_release_build_script — concat-built foreign-executor (GitHub Actions run:) release-build runner (ROOT stamp + verify-artifacts + sccache stats wrapping the orch-emitted EAGAIN retry core); membership of --bin / verify paths is derived from gunbc.ci_release_bins, but the runner transport itself remains hand-shell; DISSOLVES WHEN bash-emit (#5828 / ROADMAP 6-shell-slice0 / shell→intent Phase 2) realizes the release-build runner through orchestration emit or typed host_effect_apply without a medium-as-string concat scaffold
Expand Down
14 changes: 14 additions & 0 deletions dag/extdeps/rust/cargo_build.dag
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,20 @@ service cargo.Build {
}
}

operation Check {
input { extra_args: List<String> = [] }
output {
success: Bool from "exit_success"
stdout: String from "stdout"
stderr: String from "stderr"
}
transport shell { argv: ["cargo", "check", extra_args] }
exit {
0 => Unit
101 => String "Check failed"
}
}

operation Doc {
input { extra_args: List<String> = [] }
output {
Expand Down
2 changes: 2 additions & 0 deletions dag/gunbc/ci_spec.dag
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,8 @@ fn ci_fmt_gate_line() -> String {
"\"$CARGO_BIN\" fmt --all --check"
}

data ci_v1_compiler_tests_compile_gate_note: String = "cargo check -p v1-compiler-tests --tests, RE-ENROLLED 2026-07-31 (operator ruling, PR #7490 repair): the nextest RUN half of commit_gate_rust_suite_removed_disposition stays retired (~37 GiB, seed-runtime red), but #7490's typecheck_module signature migration updated stage0 call sites and left four direct integration-test callers stale on main — compile breakage invisible to DagCompileCleanGate (dag-only) and the release build (v1-compiler stage0 only; v1-compiler-tests is a separate workspace crate). This is the fmt-amendment pattern applied to the missing COMPILE half: compile-only, no test execution, ~41s measured cold on the repair host — not RustMonolithGate re-enrollment. Placement: build job immediately after fmt, before the ~33min release build. Operation shape and shell scaffold: v2.workflow.ci_v1_compiler_tests_compile_gate_emit (extdeps.cargo_build cargo.Build.Check)."

fn ci_retry_body_run(command: String) -> Run {
Run {
command: command,
Expand Down
19 changes: 17 additions & 2 deletions dag/gunbc/ci_workflow.dag
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import v2.workflow.ci_workflow_run_emit {
ci_selection_control_script
}
import v2.workflow.ci_release_build_emit { ci_release_build_script }
import v2.workflow.ci_v1_compiler_tests_compile_gate_emit { ci_v1_compiler_tests_compile_gate_script }
import std.disposition { Disposition, RealizationDispatch, Scaffold, SingleAuthority, Terminal }
import std.decl_ref { DeclarationRef, WholeDeclaration }
import std.types { Duration }
Expand Down Expand Up @@ -240,6 +241,20 @@ fn ci_fmt_gate_step() -> Step {
}
}

fn ci_v1_compiler_tests_compile_gate_step() -> Step {
RunStep {
name: Present { value: "cargo check -p v1-compiler-tests --tests (compile gate; no test execution)" },
id: none,
run: ci_v1_compiler_tests_compile_gate_script(),
shell: none,
env: none,
working_directory: none,
if_condition: none,
continue_on_error: none,
timeout_minutes: Present { value: gunbc_ci_aux_step_timeout_minutes }
}
}

fn ci_release_build_step() -> Step {
RunStep {
name: Present { value: "Build release bins (claim_executor + gunbc)" },
Expand Down Expand Up @@ -444,7 +459,7 @@ data gunbc_ci_release_build_step_timeout_minutes: Int = 45
data gunbc_ci_deploy_job_backstop_timeout_minutes: Int = 10

fn gunbc_ci_build_job_backstop_timeout_minutes() -> Int {
gunbc_ci_aux_step_timeout_minutes + gunbc_ci_release_build_step_timeout_minutes + gunbc_ci_aux_step_timeout_minutes + gunbc_ci_artifact_transfer_step_timeout_minutes + gunbc_ci_prelude_allowance_minutes
gunbc_ci_aux_step_timeout_minutes + gunbc_ci_aux_step_timeout_minutes + gunbc_ci_release_build_step_timeout_minutes + gunbc_ci_aux_step_timeout_minutes + gunbc_ci_artifact_transfer_step_timeout_minutes + gunbc_ci_prelude_allowance_minutes
}

data gunbc_ci_receipt_gate_steps_moved_in_executor_note: String = "The resolve-receipt and materialization-receipt gate STEPS are deleted (ruling 2026-07-30): their laws — resolves_total equals the declared count, and the materialization receipt exists/parses/keyed nonzero — now run INSIDE claim_executor as ordinary-floor finalization (run_walk, FloorFinalization), so a receipt-law violation blocks every on-success stage instead of redding a step AFTER admission had already stamped. The two aux terms leave the backstop sum in the same motion, keeping it the exact step-sum + prelude the witness pins. The receipt FILES keep writing — they are observability the falsifier and operators read — only the shell re-validation of them is gone, because keeping it would be a second representation of the floor-completion rule."
Expand Down Expand Up @@ -568,7 +583,7 @@ fn ci_build_job() -> Job {
id: "build",
name: none,
runner: gunbc_ci_selected_runner_spec(),
steps: concat(ci_prelude_steps(), [ci_fmt_gate_step(), ci_release_build_step(), ci_release_bins_pack_step(), ci_release_bins_upload_step()]),
steps: concat(ci_prelude_steps(), [ci_fmt_gate_step(), ci_v1_compiler_tests_compile_gate_step(), ci_release_build_step(), ci_release_bins_pack_step(), ci_release_bins_upload_step()]),
needs: [],
env: none,
outputs: none,
Expand Down
2 changes: 1 addition & 1 deletion dag/gunbc/commit_workflow.dag
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ data githooks_pre_push_slimmed_to_fmt_disposition: Disposition = Terminal {
}

data commit_gate_rust_suite_removed_disposition: Disposition = Terminal {
reason: "The v1 Rust test suite (cargo fmt --all --check plus cargo nextest run -p v1-compiler-tests) was REMOVED from CI 2026-07-11 (operator ruling) — its RustMonolithGate enrollment, the rust_tests job, and rust_gates_ci.dag's CI consumers are all gone. This records the removal as intentional, not silent (the review-flagged concern). Rationale: rust_tests was NON-required (only the ci job is protection-required on the gunbc main ruleset; rust_tests and ci_regen were not) AND red on main (it exercises the v1 seed, which is being deleted under the §7 burn-down), so it delivered a permanent non-required red — the §5 tolerated-red anti-pattern — at ~37 GiB, the fleet's single largest CI memory job. AMENDED 2026-07-15 (operator ruling, the falsifier lane): the fmt HALF of this removal is REVERSED — cargo fmt --all --check is re-enrolled as a standalone build-job step (gunbc.ci_spec ci_fmt_gate_note / ci_fmt_gate_line). Every rationale above is a fact about NEXTEST (37 GiB, red, seed-runtime); fmt is 4.3s measured, parse-only, needs no build, and is green — it was collateral damage of a §3 fusion, since tools.rust_gates_ci.run_gates welds both into one ProcessExit, so killing the bundle killed the cheap green half. This amendment does NOT re-enroll RustMonolithGate (still REJECTED below) and does not return nextest to CI. The former claim 'cargo fmt stays enforced by the pre-push hook (CommitCargoFmtCheck on GitPrePushHook)' is RETRACTED as the enforcement authority: a hook is an escape hatch (§5) — opt-in per clone via a manual core.hooksPath config, bypassable with --no-verify, and absent in container worktrees — and it is PROVEN ineffective, not merely theoretically weak: #6658 landed an unformatted .rs on main 2026-07-15 and no gate caught it. The hook remains as fast local feedback, never as the wall. Coverage now: cargo fmt = the required CI path (ci needs:[build], so a red fmt step blocks the required job by construction); cargo nextest run -p v1-compiler-tests still runs LOCALLY, not in CI. Return trigger for NEXTEST — NONE by design: that suite does not re-enroll. It is retired WITH the v1 seed and deleted at §7 terminal collapse. Re-enrolling RustMonolithGate onto the required ci floor is explicitly REJECTED — it would move the ~37 GiB red job into the required merge gate. Compile-level v1 seed breakage is still caught by the required floor's DagCompileCleanGate and RegenVerifyGate; only the seed's runtime test behavior moves local."
reason: "The v1 Rust test suite (cargo fmt --all --check plus cargo nextest run -p v1-compiler-tests) was REMOVED from CI 2026-07-11 (operator ruling) — its RustMonolithGate enrollment, the rust_tests job, and rust_gates_ci.dag's CI consumers are all gone. This records the removal as intentional, not silent (the review-flagged concern). Rationale: rust_tests was NON-required (only the ci job is protection-required on the gunbc main ruleset; rust_tests and ci_regen were not) AND red on main (it exercises the v1 seed, which is being deleted under the §7 burn-down), so it delivered a permanent non-required red — the §5 tolerated-red anti-pattern — at ~37 GiB, the fleet's single largest CI memory job. AMENDED 2026-07-15 (operator ruling, the falsifier lane): the fmt HALF of this removal is REVERSED — cargo fmt --all --check is re-enrolled as a standalone build-job step (gunbc.ci_spec ci_fmt_gate_note / ci_fmt_gate_line). Every rationale above is a fact about NEXTEST (37 GiB, red, seed-runtime); fmt is 4.3s measured, parse-only, needs no build, and is green — it was collateral damage of a §3 fusion, since tools.rust_gates_ci.run_gates welds both into one ProcessExit, so killing the bundle killed the cheap green half. This amendment does NOT re-enroll RustMonolithGate (still REJECTED below) and does not return nextest to CI. AMENDED 2026-07-31 (operator ruling, PR #7490 repair): the COMPILE half for the separate v1-compiler-tests workspace crate is RE-ENROLLED as cargo check -p v1-compiler-tests --tests (gunbc.ci_spec ci_v1_compiler_tests_compile_gate_note / ci_v1_compiler_tests_compile_gate_line) — compile-only, no test execution, ~41s measured cold; NOT nextest and NOT RustMonolithGate. #7490 updated typecheck_module and fixed stage0 call sites but left four direct integration-test callers stale because neither DagCompileCleanGate nor the release build compiles that crate. The former claim 'cargo fmt stays enforced by the pre-push hook (CommitCargoFmtCheck on GitPrePushHook)' is RETRACTED as the enforcement authority: a hook is an escape hatch (§5) — opt-in per clone via a manual core.hooksPath config, bypassable with --no-verify, and absent in container worktrees — and it is PROVEN ineffective, not merely theoretically weak: #6658 landed an unformatted .rs on main 2026-07-15 and no gate caught it. The hook remains as fast local feedback, never as the wall. Coverage now: cargo fmt = the required CI path (ci needs:[build], so a red fmt step blocks the required job by construction); cargo check -p v1-compiler-tests --tests = the required CI compile path for direct Rust integration-test call sites; cargo nextest run -p v1-compiler-tests still runs LOCALLY, not in CI. Return trigger for NEXTEST — NONE by design: that suite does not re-enroll. It is retired WITH the v1 seed and deleted at §7 terminal collapse. Re-enrolling RustMonolithGate onto the required ci floor is explicitly REJECTED — it would move the ~37 GiB red job into the required merge gate. DagCompileCleanGate and RegenVerifyGate still catch .dag compile drift; this gate closes the v1-compiler-tests direct-caller hole they cannot see."
}

data commit_gate_roster: List<CommitCheckEnrollment> = [
Expand Down
31 changes: 31 additions & 0 deletions dag/gunbc/v1_compiler_tests_typecheck_module_callers_scaffold.dag
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
module gunbc.v1_compiler_tests_typecheck_module_callers_scaffold

import std.disposition { Disposition, Scaffold, SingleAuthority }
import std.decl_ref { DeclarationRef, WholeDeclaration }
import std.types { List, String }

data v1_compiler_tests_typecheck_module_callers_hand_rust_scaffold: Disposition = Scaffold {
dissolves_to: SingleAuthority,
bind: DeclarationRef {
module_path: "v2.workflow.ci_v1_compiler_tests_compile_gate_emit",
decl_name: "ci_v1_compiler_tests_compile_gate_script",
field: WholeDeclaration
}
}

data v1_compiler_tests_typecheck_module_callers_hand_rust_dissolve_trigger: String = "🟡 dissolve-on: the four src/v1/tests/src/* integration-test typecheck_module call sites wired for #7490's global_variant_base seventh argument — counted interim HAND-Rust growth, NOT a census shrink (review 45400). The checkable receipt is NOT a marker grep in the test files: cargo check -p v1-compiler-tests --tests enrolled on the build job (v2.workflow.ci_v1_compiler_tests_compile_gate_emit / dag/test/claim/ci_v1_compiler_tests_compile_gate_witness_test.dag) proves every direct caller compiles after each signature migration. DISSOLVES WHEN the v1-compiler-tests crate crosses the emitted-crate partition / v1-zero-hand-maintained-rust frontier and these seed integration tests delete with the crate — authority dag/gunbc/v1_deletion_plan.dag, ROADMAP v1-zero-hand-maintained-rust."

data v1_compiler_tests_typecheck_module_callers_hand_rust_loc_delta_net: Int = 4

data v1_compiler_tests_typecheck_module_callers_hand_rust_receipt_plan_anchor: String = "dag/gunbc/v1_deletion_plan.dag"

data v1_compiler_tests_typecheck_module_callers_hand_rust_roadmap_lane_anchor: String = "ROADMAP.md v1-zero-hand-maintained-rust / docs/plans/emitted-crate-partition-design.md"

data v1_compiler_tests_typecheck_module_callers_hand_rust_paths: List<String> = [
"src/v1/tests/src/variant_export_surface_witness_test.rs",
"src/v1/tests/src/transitive_interface_binding_test.rs",
"src/v1/tests/src/direct_import_precedence_over_transitive_leak_test.rs",
"src/v1/tests/src/global_bare_variant_locals_receipt_test.rs"
]

data v1_compiler_tests_typecheck_module_callers_hand_rust_receipt_witness_entry: String = "dag/test/claim/v1_compiler_tests_typecheck_module_callers_hand_rust_witness_test.dag"
41 changes: 41 additions & 0 deletions dag/test/claim/ci_v1_compiler_tests_compile_gate_witness_test.dag
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
module test.claim.ci_v1_compiler_tests_compile_gate_witness

import v2.workflow.ci_v1_compiler_tests_compile_gate_emit {
ci_v1_compiler_tests_compile_gate_script,
ci_v1_compiler_tests_compile_gate_shell_emit_scaffold,
}
import gunbc.ci_workflow { ci_build_job }
import extdeps.github.actions { Step, RunStep, UsesStep }
import std.disposition { Scaffold }

fn build_job_has_v1_compiler_tests_compile_gate_step() -> Bool {
fold(ci_build_job().steps, init: false, f: (acc, step) => {
acc || match step {
RunStep { name: _, id: _, run: cmd, shell: _, env: _, working_directory: _, if_condition: _, continue_on_error: _, timeout_minutes: _ } =>
string_contains(s: cmd, pattern: "'check'")
&& string_contains(s: cmd, pattern: "'v1-compiler-tests'")
&& string_contains(s: cmd, pattern: "🟡 dissolve-on: ci_v1_compiler_tests_compile_gate_script")
UsesStep { name: _, id: _, uses: _, with: _, env: _, if_condition: _, continue_on_error: _, timeout_minutes: _ } => false
}
})
}

test fn w_gate_script_names_compile_only_command() -> Bool {
let script = ci_v1_compiler_tests_compile_gate_script()
string_contains(s: script, pattern: "'check'")
&& string_contains(s: script, pattern: "'v1-compiler-tests'")
&& string_contains(s: script, pattern: "'--tests'")
&& string_contains(s: script, pattern: "\"$CARGO_BIN\"")
&& !string_contains(s: script, pattern: "nextest")
}

test fn w_gate_carrier_is_scaffold() -> Bool {
match ci_v1_compiler_tests_compile_gate_shell_emit_scaffold {
Scaffold { dissolves_to: _, bind: _ } => true
_ => false
}
}

test fn w_build_job_enrolls_compile_gate_before_release_build() -> Bool {
build_job_has_v1_compiler_tests_compile_gate_step()
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@ import extdeps.shell.exec { TransportScript }
import v2.std.effect_plan { Do, EffectPlan, EffectPlanStep }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }
import v2.std.operation_argv {
BoundOperationInvocation,
OperationInputBinding,
OperationRef,
bind_operation_invocation,
operation_argv_bind_text
}
import v2.std.orchestration { FailFast }
import v2.workflow.effect_plan_bash_materialize {
BashBoundOperationInvocation,
EffectPlanBashMaterialization,
EffectPlanBashMaterializationRefused,
EffectPlanBashMaterialized,
bash_bind_operation_invocation,
effect_plan_bash_materialize
}

Expand All @@ -31,14 +31,14 @@ fn wet_invocation(
service: String,
operation: String,
bindings: List<OperationInputBinding>
) -> BoundOperationInvocation {
bind_operation_invocation(
) -> BashBoundOperationInvocation {
bash_bind_operation_invocation(
at: wet_ref(path: path, service: service, operation: operation),
bindings: bindings
)
}

fn wet_test_path(operation: String, path: String) -> BoundOperationInvocation {
fn wet_test_path(operation: String, path: String) -> BashBoundOperationInvocation {
wet_invocation(
path: "dag/extdeps/shell.dag",
service: "shell.Test",
Expand All @@ -47,7 +47,7 @@ fn wet_test_path(operation: String, path: String) -> BoundOperationInvocation {
)
}

fn wet_id_uid() -> BoundOperationInvocation {
fn wet_id_uid() -> BashBoundOperationInvocation {
wet_invocation(
path: "dag/extdeps/tools/id.dag",
service: "os.Id",
Expand All @@ -57,12 +57,12 @@ fn wet_id_uid() -> BoundOperationInvocation {
}

fn wet_plan(
steps: List<EffectPlanStep<BoundOperationInvocation>>
) -> EffectPlan<BoundOperationInvocation> {
steps: List<EffectPlanStep<BashBoundOperationInvocation>>
) -> EffectPlan<BashBoundOperationInvocation> {
EffectPlan { steps: steps, on_failure: FailFast }
}

fn wet_exec_succeeds_with_output(plan: EffectPlan<BoundOperationInvocation>) -> Bool {
fn wet_exec_succeeds_with_output(plan: EffectPlan<BashBoundOperationInvocation>) -> Bool {
match effect_plan_bash_materialize(plan: plan) {
EffectPlanBashMaterialized { source: source } => {
let result = shell.Exec.Run(script: source as TransportScript)
Expand All @@ -72,7 +72,7 @@ fn wet_exec_succeeds_with_output(plan: EffectPlan<BoundOperationInvocation>) ->
}
}

fn wet_exec_fails_without_output(plan: EffectPlan<BoundOperationInvocation>) -> Bool {
fn wet_exec_fails_without_output(plan: EffectPlan<BashBoundOperationInvocation>) -> Bool {
match effect_plan_bash_materialize(plan: plan) {
EffectPlanBashMaterialized { source: source } => {
let result = shell.Exec.Run(script: source as TransportScript)
Expand Down
Loading
Loading