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
685 changes: 685 additions & 0 deletions dag/gunbc/fabric_cell_converge.dag

Large diffs are not rendered by default.

253 changes: 243 additions & 10 deletions dag/gunbc/fleet_converge_plan.dag

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions dag/gunbc/fleet_converge_plan_cli.dag
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import gunbc.runner_slot_provision {
RunnerSlotsUnobserved,
observe_runner_slot_members_wet,
}
import product.placement_supply { HostIdentity }
import gunbc.fabric_cell_converge { fabric_cell_population_unobserved }
import gunbc.fleet_converge_plan {
TimerRetirementMember,
fleet_converge_plan_artifact,
Expand Down Expand Up @@ -159,6 +161,7 @@ func fleet_converge_plan_wet() -> ProcessExit
observed_caps: observed_caps,
observed_spark: [],
observed_slots: observed_slots,
observed_fabric_cells: fabric_cell_population_unobserved(host: host as HostIdentity),
) {
Absent =>
exit_failure(reason: "fleet_converge_plan: observed baseline is not Fnv1a64Structural — plan refused")
Expand Down Expand Up @@ -301,6 +304,7 @@ func fleet_converge_apply_wet() -> ProcessExit
observed_caps: observed_caps,
observed_spark: [],
observed_slots: observed_slots,
observed_fabric_cells: fabric_cell_population_unobserved(host: observed_host as HostIdentity),
) {
exit_failure(reason: "fleet_converge_apply: SubjectIdentityMismatch — member set drifted since plan")
} else if !fleet_converge_observed_baseline_matches(
Expand All @@ -310,6 +314,7 @@ func fleet_converge_apply_wet() -> ProcessExit
observed_caps: observed_caps,
observed_spark: [],
observed_slots: observed_slots,
observed_fabric_cells: fabric_cell_population_unobserved(host: observed_host as HostIdentity),
) {
exit_failure(reason: "fleet_converge_apply: ObservedBaselineMismatch — host drifted since plan; rerun plan and review")
} else if !fleet_converge_plan_bundle_matches(
Expand Down
37 changes: 30 additions & 7 deletions dag/gunbc/runner_lifecycle.dag
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ fn runner_slot_add_steps_ordered() -> List<RunnerSlotAddStep> {

type RunnerSlotAddSequence
= GitHubRunnerAddSequence { steps: List<RunnerSlotAddStep> }
| FabricSlotProvisioningNotModeled { reason: String }
| FabricSlotHasNoGitHubAddSequence { reason: String }
| SlotIsNotACommittedMember { reason: String }

// REGISTRATION IS DERIVED FROM PURPOSE, WHICH IS THE HALF THAT MAKES THE PURPOSE FIELD REAL. A
Expand All @@ -106,10 +106,33 @@ type RunnerSlotAddSequence
// modeled yet. Answering with a plausible subsequence would be the fabricated-plausible-output
// failure DESIGN section 5 forbids; refusing names the gap and stops the line.
//
// NEXT-RUNG TRIGGER: the fabric slot's own provisioning sequence -- whatever installs and starts
// the fabric executor -- landing as its own arm here. Until then this refusal is the honest
// terminal state for the one fabric slot that exists (srv3-06), and it is why that slot is
// declared but not yet convergeable.
// THE FABRIC SLOT HAS NO PROVISIONING SEQUENCE, HERE OR ANYWHERE, AND THIS ANNOTATION SAID
// OTHERWISE. A previous revision claimed the fabric slot's own provisioning sequence "now exists",
// described the two families as "siblings with disjoint step enums", and named
// gunbc.fabric_cell_converge fabric_cell_provision_sequence_for as the sequence selector. That
// symbol does not exist and never did: the PR that wrote this sentence deleted the
// FabricCellProvisionStep vocabulary in the same diff and replaced it with a membership model, so
// the annotation described the shape the work started from rather than the shape it landed in.
// It is corrected rather than deleted because the reason the two families stay apart is still
// load-bearing, and because a fabricated symbol in a citation is the exact defect DESIGN section 3
// makes symbolic citation decidable in order to catch (found by side-chat review, not by any gate).
//
// WHAT gunbc.fabric_cell_converge ACTUALLY MODELS: the fabric family's DESIRED AND OBSERVED
// SUBSTRATE MEMBERSHIP -- resource-addressed members, a typed population, and a verdict over the
// two. Its host-effect realization is absent, which the plan family states as its own typed arm
// rather than by silence. So there is no fabric step vocabulary to be a sibling of, and no fabric
// success arm belongs in this GitHub lifecycle: the question this coproduct answers is which
// GitHub Actions add sequence applies, and the fabric slot's answer is that none does.
//
// WHAT IS STILL NOT TRUE, SAID PLAINLY: srv3-06 is not yet convergeable. Its substrate membership
// is modeled and can be planned; nothing observes it on a real host and nothing applies it.
// NEXT-RUNG TRIGGER, and it is two things rather than one: a real observer producing a
// FabricCellPopulation from the host, and a fabric host-effect realization for the membership
// actions that population implies. Until both land, a nonempty fabric plan is a counted
// realization refusal by construction, never an applied change. An earlier revision named a
// desired population in gunbc.runner_capacity_plan as the trigger; that is already satisfied by
// the fabric family's own host-exact desired fold, so it would have marked this row done while
// both real gaps stayed open.
// THIS GATE HAS NO PRODUCTION CALLER TODAY, AND SAYING SO IS THE DIFFERENCE BETWEEN A WALL AND A
// CLAIM ABOUT A WALL. Only its witness calls it. The apply path never reaches a step sequence at
// all: gunbc.runner_capacity_realize matches RunnerSlotAdd and discards the identity, counting adds
Expand Down Expand Up @@ -141,8 +164,8 @@ fn runner_slot_add_sequence_for(host: HostIdentity, slot_index: Nat) -> RunnerSl
SlotServesGitHubActions =>
GitHubRunnerAddSequence { steps: runner_slot_add_steps_ordered() }
SlotServesFabricExecution =>
FabricSlotProvisioningNotModeled {
reason: "fabric execution slot: the GitHub runner add sequence does not apply and no fabric provisioning sequence is modeled yet; refusing rather than returning a filtered subsequence that would install an actions-runner for a slot that never serves Actions"
FabricSlotHasNoGitHubAddSequence {
reason: "fabric execution slot: the GitHub runner add sequence does not apply to it, and refusing is not the same as having nothing to say. gunbc.fabric_cell_converge now models the fabric family's DESIRED AND OBSERVED SUBSTRATE MEMBERSHIP; its host-effect realization remains absent, so there is no provisioning sequence to name and no fabric success arm belongs in this GitHub lifecycle. What is refused here is the FILTERED SUBSEQUENCE: this sequence fetches an actions-runner release, verifies its arch digest and starts an actions-runner unit, so the GitHub steps minus the GitHub-specific ones would provision a slot that downloads GitHub's runner in order never to run GitHub's runner"
}
}
}
Expand Down
8 changes: 8 additions & 0 deletions dag/gunbc/spark/serving_converge_plan.dag
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ import gunbc.spark.serving_member_realization {
}
import gunbc.spark.serving_realization { ServingInstallEffect, EnableLingerForOwnAccount }
import gunbc.runner_slot_provision { RunnerSlotMember }
import gunbc.fabric_cell_converge { FabricCellPopulation, fabric_cell_population_unobserved }
import gunbc.fleet_converge_plan {
FleetConvergePlanArtifact,
FleetConvergeSparkServingTypedAction,
Expand Down Expand Up @@ -291,11 +292,13 @@ fn spark_serving_fleet_converge_apply_shell(
timer_plan: MembershipPlan<TimerRetirementMember, TimerRetirementMemberAt>,
host: NonEmptyStr,
observed_slots: List<RunnerSlotMember>,
observed_fabric_cells: FabricCellPopulation,
) -> String {
fleet_converge_apply_shell(
timer_plan: timer_plan,
host: host,
observed_slots: observed_slots,
observed_fabric_cells: observed_fabric_cells,
)
}

Expand Down Expand Up @@ -416,6 +419,7 @@ fn spark_serving_fleet_converge_plan_artifact_for_release(
spark_rows: spark_rows,
observed_spark: observed_members,
observed_slots: [],
observed_fabric_cells: fabric_cell_population_unobserved(host: host as HostIdentity),
),
}
}
Expand Down Expand Up @@ -449,13 +453,15 @@ fn spark_serving_fleet_converge_plan_artifact_from_rows(
spark_rows: ScheduledRows<FleetConvergeSparkServingTypedAction>,
observed_spark: List<SparkServingMember>,
observed_slots: List<RunnerSlotMember>,
observed_fabric_cells: FabricCellPopulation,
) -> FleetConvergePlanArtifact {
let subject = fleet_converge_plan_subject(
host: host,
observed_timers: observed_timers,
observed_caps: observed_caps,
observed_spark: observed_spark,
observed_slots: observed_slots,
observed_fabric_cells: observed_fabric_cells,
)
let timer_plan = timer_retirement_plan(observed: observed_timers)
let cap_plan = caps_reconcile(desired: fleet_converge_desired_caps(), observed: observed_caps)
Expand All @@ -468,13 +474,15 @@ fn spark_serving_fleet_converge_plan_artifact_from_rows(
observed_caps: observed_caps,
observed_spark: observed_spark,
observed_slots: observed_slots,
observed_fabric_cells: observed_fabric_cells,
)
let planned_generation = prior_generation + 1
let spark_wire = fleet_converge_spark_serving_typed_actions_wire(rows: scheduled_rows_list(scheduled: spark_rows))
let apply_shell = spark_serving_fleet_converge_apply_shell(
timer_plan: timer_plan,
host: host,
observed_slots: observed_slots,
observed_fabric_cells: observed_fabric_cells,
)
let body = join(
concat(
Expand Down
Loading
Loading