Skip to content
Closed
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 @@ -24,7 +24,7 @@ env:
jobs:
build:
runs-on: [self-hosted, linux, arm64]
timeout-minutes: 85
timeout-minutes: 100
steps:
- name: Checkout
uses: actions/checkout@v5
Expand Down Expand Up @@ -124,6 +124,11 @@ jobs:
# 🟡 dissolve-on: ci_v1_compiler_tests_compile_gate_script — foreign-executor (GitHub Actions run:) shell transport for extdeps.cargo_build cargo.Build.Test(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" 'test' '-p' 'v1-compiler-tests' '--release' '--no-run'
timeout-minutes: 15
- name: cargo check all seven stage0 partition crates (compile gate; roster drift backstop)
run: |
# 🟡 dissolve-on: ci_stage0_partition_compile_gate_script — foreign-executor (GitHub Actions run:) shell transport for seven partition-crate cargo.Build.Check invocations; DISSOLVES WHEN bash-emit (#5828 / shell→intent Phase 2) binds the build-job step to orchestration emit over the typed cargo operations — same de-fork as ci_v1_compiler_tests_compile_gate_script and ci_fmt_gate_line
"$CARGO_BIN" 'check' '-p' 'v1-stage0-runtime' && "$CARGO_BIN" 'check' '-p' 'v1-stage0-std-core' && "$CARGO_BIN" 'check' '-p' 'v1-stage0-std-surface' && "$CARGO_BIN" 'check' '-p' 'v1-stage0-extdeps-languages' && "$CARGO_BIN" 'check' '-p' 'v1-stage0-v1-infer' && "$CARGO_BIN" 'check' '-p' 'v1-stage0-v1-artifact' && "$CARGO_BIN" 'check' '-p' 'v1-stage0-emit-core'
timeout-minutes: 15
- name: Pack release bins for cross-job handoff (tar keeps exec bits)
run: |
# 🟡 dissolve-on: ci_release_bins_pack_script — concat-built foreign-executor (GitHub Actions run:) release-bins tar pack runner; membership of archived bin names is derived from gunbc.ci_release_bins, but the pack transport itself remains hand-shell; DISSOLVES WHEN bash-emit (#5828 / ROADMAP 6-shell-slice0 / shell→intent Phase 2) realizes the pack runner through orchestration emit or typed host_effect_apply without a medium-as-string concat scaffold
Expand Down
23 changes: 21 additions & 2 deletions dag/gunbc/ci_workflow.dag
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,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_stage0_partition_compile_gate_emit { ci_stage0_partition_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 @@ -297,6 +298,20 @@ fn ci_v1_compiler_tests_compile_gate_step() -> Step {
}
}

fn ci_stage0_partition_compile_gate_step() -> Step {
RunStep {
name: Present { value: "cargo check all seven stage0 partition crates (compile gate; roster drift backstop)" },
id: none,
run: ci_stage0_partition_compile_gate_script(),
shell: none,
env: none,
working_directory: none,
if_condition: none,
continue_on_error: none,
timeout_minutes: Present { value: gunbc_ci_stage0_partition_compile_gate_timeout_minutes }
}
}

fn ci_release_build_step() -> Step {
RunStep {
name: Present { value: "Build release bins (claim_executor + gunbc)" },
Expand Down Expand Up @@ -474,6 +489,10 @@ data gunbc_ci_v1_compiler_tests_compile_gate_timeout_minutes: Duration = 15

data gunbc_ci_v1_compiler_tests_compile_gate_timeout_note: String = "v1-compiler-tests compile-contract gate step budget (operator ruling 2026-08-05, PR A / fierce-heron-177): reordered after the release build and switched to cargo test --release --no-run so v1-compiler compiles once per job. Warm runs should complete in seconds once the release artifact is warm; 15m retains the prior cold-host envelope without raising the cap."

data gunbc_ci_stage0_partition_compile_gate_timeout_minutes: Int = 15

data gunbc_ci_stage0_partition_compile_gate_timeout_note: String = "stage0 partition compile gate step budget (sharp-fox-403): seven sequential cargo check -p v1-stage0-* partition crates enrolled as the roster_registry interim backstop after seed-plus-closure derived membership landed. Cold-host envelope matches v1-compiler-tests compile gate until a dedicated receipt exists; warm partition crates are smaller than the monolith test crate."

data gunbc_ci_artifact_transfer_step_timeout_minutes: Int = 10

data gunbc_ci_artifact_transfer_step_note: String = "Cross-job handoff of the release bins (operator job-split ruling 2026-07-11): the build job packs ci_floor_required_artifact_names into one tgz (tar preserves the executable bits a raw artifact zip would drop) and uploads it; the ci floor job downloads, unpacks into target/release, and re-verifies via claim_executor --verify-build-artifacts before any step consumes a bin (fail-closed: a missing or truncated artifact reds the job at the verify, never as a mid-floor bin fallback). 10m is the transfer envelope for a ~200MB archive under fleet pressure; upload uses if-no-files-found: error so an empty pack is loud."
Expand All @@ -491,7 +510,7 @@ data srv1_dashboard_deploy_concurrency_group: String = "srv1-dashboard-deploy"
data srv1_dashboard_deploy_serialization_note: String = "Blue/green selection is observe-then-mutate, so two deploy jobs may not overlap: both could observe blue active, then the first flips green while the second restarts what has become the active green slot, recreating the outage. Job-grain concurrency serializes the entire cutover with cancel-in-progress=false; QueueNotMax may replace an older pending deployment with the newest main revision, but it never interrupts the one holding the host mutation window."

fn gunbc_ci_build_job_backstop_timeout_minutes() -> Int {
gunbc_ci_aux_step_timeout_minutes + gunbc_ci_v1_compiler_tests_compile_gate_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_v1_compiler_tests_compile_gate_timeout_minutes + gunbc_ci_stage0_partition_compile_gate_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 @@ -661,7 +680,7 @@ fn ci_build_job() -> Job {
id: "build",
name: none,
runner: gunbc_ci_selected_runner_spec(),
steps: concat(ci_heal_revalidation_prelude_steps(), [ci_fmt_gate_step(), ci_release_build_step(), ci_v1_compiler_tests_compile_gate_step(), ci_release_bins_pack_step(), ci_release_bins_upload_step()]),
steps: concat(ci_heal_revalidation_prelude_steps(), [ci_fmt_gate_step(), ci_release_build_step(), ci_v1_compiler_tests_compile_gate_step(), ci_stage0_partition_compile_gate_step(), ci_release_bins_pack_step(), ci_release_bins_upload_step()]),
needs: [],
env: none,
outputs: none,
Expand Down
22 changes: 21 additions & 1 deletion dag/gunbc/host_assimilation_program.dag
Original file line number Diff line number Diff line change
Expand Up @@ -138,9 +138,29 @@ fn assimilation_program_for(intent: HostEnrollmentIntent) -> HostAssimilationPro

data host_enrollment_participation_nonempty_note: String = "Enrollment participation is authored as a non-empty list at every fleet enrollment site today. An empty list would yield an empty program identity (invalid NonEmptyStr) and zero completion obligations; a NonEmptyList carrier on HostEnrollmentIntent is deferred until enrollment validation walls land."

data fleet_participation_canonical_roster_note: String = "Participation has SET semantics but is carried as a List, and identity must not be able to tell the two apart. Step selection already reads the list as membership -- step_serves_any asks only whether SOME participation claims the step -- so order and repetition are invisible to which obligations exist. Deriving the identity from the raw list did let them through: [CiRunner, InferenceServing] and [InferenceServing, CiRunner] and [CiRunner, CiRunner, InferenceServing] select exactly the same steps while producing three different identity strings, which is a second representation of one program (DESIGN section 3) and would fork any consumer that keys on identity. The correction projects through a FIXED roster instead of reading the caller's list order: filtering the roster by membership yields at most one occurrence of each participation, in one order, whatever the caller wrote. That is the construction half -- a duplicate or a reordering cannot reach the identity, so there is no post-hoc canonicalization check to remember to call. The roster's own completeness is the residue this cannot construct away, and it is walled by an EXHAUSTIVE match in fleet_participation_in_canonical_roster: a newly added participation does not compile until it is stated there, and its witness reds if it is stated but left out of the roster."

data fleet_participation_canonical_roster: List<FleetParticipation> = [
CiRunnerParticipation,
InferenceServingParticipation,
]

fn fleet_participation_in_canonical_roster(p: FleetParticipation) -> Bool {
match p {
CiRunnerParticipation =>
participation_list_contains(ps: fleet_participation_canonical_roster, wanted: CiRunnerParticipation)
InferenceServingParticipation =>
participation_list_contains(ps: fleet_participation_canonical_roster, wanted: InferenceServingParticipation)
}
}

fn canonical_participation(ps: List<FleetParticipation>) -> List<FleetParticipation> {
filter(fleet_participation_canonical_roster, c => participation_list_contains(ps: ps, wanted: c))
}

fn host_enrollment_program_identity(intent: HostEnrollmentIntent) -> NonEmptyStr {
join(
map(intent.participation, p => fleet_participation_label(p: p)),
map(canonical_participation(ps: intent.participation), p => fleet_participation_label(p: p)),
"+"
) as NonEmptyStr
}
Expand Down
8 changes: 5 additions & 3 deletions dag/gunbc/roster_registry.dag
Original file line number Diff line number Diff line change
Expand Up @@ -284,9 +284,11 @@ data roster_registry: List<RosterRegistration> = [
RosterRegistration {
roster: roster_decl(module_path: "v2.workflow.rust_crate_partition", decl_name: "stage0_partition_crate_rows"),
unit_kind: "stage0 seed module basename per partition crate",
membership: DeclaredFrontier {
reason: "the hand-drawn stage0 crate split: per-crate module membership is hand-listed (stage0_std_primitive_modules and siblings) while the true relation is the module import closure — enrolled 2026-07-23 off two drift incidents this class caused silently (std_currency absent from std-core after #6977 added the measure→currency edge, so v1-stage0-std-core stopped building standalone; the partition allow-block lacked the monolith's recursion_limit so v1-stage0-extdeps-languages failed on serde json_internal). Nothing in CI builds the partition crate libs, so the drift had zero signal (sheet row ts-group-partition-drift)",
dissolve_on: "the emitted-crate-partition thread derives the crate layout ByDerivation from the module graph (docs/plans/emitted-crate-partition-design.md), at which point the hand lists delete; interim backstop = an executing per-crate cargo-check consumer in the CI build job"
membership: ByDerivation {
predicate: roster_decl(
module_path: "v2.workflow.rust_crate_partition",
decl_name: "stage0_partition_crate_row_membership_derived"
)
}
},
RosterRegistration {
Expand Down
61 changes: 42 additions & 19 deletions dag/gunbc/stage0_crate_partition_generated.dag
Original file line number Diff line number Diff line change
Expand Up @@ -39,37 +39,38 @@ data generated_partition_crate_rows: List<GeneratedPartitionCrateRow> = [
"std_content_hash",
"std_coercion",
"std_currency",
"std_decl_ref",
"std_keyed_row",
"std_keyed_roster",
"std_roster_frontier",
"std_disposition",
"std_error_primitives",
"std_http_path",
"std_emit_model",
"std_http_path",
"std_magnitude",
"std_measure",
"std_types",
"std_unicode_types",
"std_lens_verdict",
"std_algebra",
"std_nat",
"std_node",
"std_syntax",
"std_computation",
"std_termination",
"std_induction",
"std_iteration",
"std_graph",
"extdeps_uri",
"extdeps_external_authority",
"extdeps_container_oci_digest",
"extdeps_units_dimensionless",
"extdeps_units_iec_80000_13",
"extdeps_units_iso8601",
"std_occurrence_identity",
"v1_std_core",
"std_algebra",
"std_node",
"std_termination",
"extdeps_uri",
"std_roster_frontier",
"std_decl_ref",
"std_keyed_roster",
"std_keyed_row",
"std_source_annotation",
"v1_std_core"
"std_induction",
"std_types",
"v1_rt",
"std_error_primitives",
"std_computation",
"std_unicode_types",
"std_occurrence_identity"
],
reexport_packages: [
"v1-stage0-runtime"
Expand All @@ -86,7 +87,16 @@ data generated_partition_crate_rows: List<GeneratedPartitionCrateRow> = [
"std_interface_summary",
"std_pareto",
"std_realization_schedule",
"std_trait_derive_shape"
"std_trait_derive_shape",
"std_types",
"std_decl_ref",
"std_disposition",
"std_algebra",
"std_measure",
"std_error_primitives",
"extdeps_units_dimensionless",
"extdeps_units_iec_80000_13",
"extdeps_units_iso8601"
],
reexport_packages: [
"v1-stage0-runtime",
Expand All @@ -110,7 +120,15 @@ data generated_partition_crate_rows: List<GeneratedPartitionCrateRow> = [
"extdeps_languages_python_types",
"extdeps_languages_rust_emit",
"extdeps_languages_rust_syntax",
"extdeps_languages_rust_types"
"extdeps_languages_rust_types",
"std_syntax",
"std_trait_derive_shape",
"std_node",
"std_induction",
"std_computation",
"std_termination",
"std_algebra",
"std_error_primitives"
],
reexport_packages: [
"v1-stage0-runtime",
Expand All @@ -130,7 +148,12 @@ data generated_partition_crate_rows: List<GeneratedPartitionCrateRow> = [
"v1_compiler_infer_occurrence_binding",
"v1_compiler_infer_service",
"v1_compiler_infer_sigs",
"v1_compiler_infer_types"
"v1_compiler_infer_types",
"std_induction",
"std_computation",
"std_termination",
"std_algebra",
"std_error_primitives"
],
reexport_packages: [
"v1-stage0-runtime",
Expand Down
11 changes: 1 addition & 10 deletions dag/gunbc/stage0_rust_source_lifecycle_scaffold.dag
Original file line number Diff line number Diff line change
Expand Up @@ -489,10 +489,6 @@ data residue_frontier_module_gap_reason: String = "frontier module with behavior

data residue_frontier_module_gap_dissolve_on: String = "dissolve-on: the module basename appears on hand_maintained_stage0_filenames() or generated_stage0_files and this residue row deletes"

data residue_stage0_core_lib_reason: String = "src/v1/stage0_core/src/lib.rs exists on disk but is absent from stage0_partition_crate_rows — authority contradiction surfaced for operator resolution"

data residue_stage0_core_lib_dissolve_on: String = "dissolve-on: stage0_partition_crate_rows enrolls src/v1/stage0_core OR the crate deletes"

fn residue_row(path: String, reason: String, dissolve_on: String) -> RustSourceLifecycleRow {
RustSourceLifecycleRow {
path: path,
Expand Down Expand Up @@ -538,11 +534,6 @@ data rust_source_lifecycle_residue_rows: List<RustSourceLifecycleRow> = [
path: "src/v1/stage0/src/v2_compiler_source_authority.rs",
reason: residue_frontier_module_gap_reason,
dissolve_on: residue_frontier_module_gap_dissolve_on
),
residue_row(
path: "src/v1/stage0_core/src/lib.rs",
reason: residue_stage0_core_lib_reason,
dissolve_on: residue_stage0_core_lib_dissolve_on
)
]

Expand Down Expand Up @@ -773,4 +764,4 @@ fn stage0_rust_lifecycle_scaffold_mechanical_checks_holds() -> Bool {
&& manifest_state_verdict_scaffold_holds()
}

data rust_source_lifecycle_partition_contradiction_note: String = "OPEN: src/v1/stage0_core/src/lib.rs is tracked on disk but stage0_partition_crate_rows has no src/v1/stage0_core row. Residue row surfaces the contradiction; operator resolves via partition row or crate deletion."
data rust_source_lifecycle_partition_contradiction_note: String = "CLOSED (sharp-fox-403): legacy src/v1/stage0_core monolith boundary crate deleted — partition crates are the sole stage0 crate authority; residue row removed from rust_source_lifecycle_residue_rows."
Loading
Loading