diff --git a/dag/test/claim/compute/host_capacity_wet_witness_test.dag b/dag/test/claim/compute/host_capacity_wet_witness_test.dag index 490ef641cd8..0140266f9b2 100644 --- a/dag/test/claim/compute/host_capacity_wet_witness_test.dag +++ b/dag/test/claim/compute/host_capacity_wet_witness_test.dag @@ -28,6 +28,25 @@ import gunbc.compute.host_capacity { data one_gibibyte_in_kibibytes: Int = 1048576 +// THIS FILE RUNS ON THE LOCAL-REPO WET LANE, AND THAT TAKES THREE ROWS IN THREE AUTHORITIES. +// Named here because the carriers do not reference each other and nothing refuses a file that has +// some of them and not all -- the state this file was in from gunbc#11962 until gunbc#12025, which +// blocked the merge queue for gunbc#11829 with route_gap_unenrolled=5. +// +// 1. v2.workflow.local_repo_wet_terminal local_repo_wet_schedule -- a WetScheduledClaim per +// identity. This is the ROUTE, and it is what discharges the hold. +// 2. gunbc.ci_layer_roots witness_exclusion_frontier -- the row classifying this file +// LocalRepoWetLane. It does NOT keep the nominal floor from planning these identities: a +// changed witness is admitted regardless of any exclusion, deliberately, so an exclusion list +// cannot be how a witness opts out of the commit that introduces it. +// 3. v2.workflow.floor_route_gap floor_route_gap_expectation_chunk_21 -- the expectation for the +// five identities below that reach fresh_root(). Without it the nominal floor counts a measured +// identity as unmeasured and BLOCKS instead of holding. +// +// ONLY THE FIVE THAT CALL fresh_root() ARE ENROLLED IN (3). the_real_observation_reads_this_machine +// and two_instances_on_one_host_resolve_to_one_pool_at_one_root reach their subjects hermetically; +// enrolling either would be a stale_route_gap, which is its own red. So a claim added below that +// calls fresh_root() owes a chunk_21 row, and one that does not must not have one. fn fresh_root() -> String { shell.Mktemp.DirWithTemplate(template: "/tmp/gunbc_compute_capacity.XXXXXX").path } diff --git a/src/v2/workflow/floor_route_gap.dag b/src/v2/workflow/floor_route_gap.dag index 26a0c5d52c1..7a2c557a595 100644 --- a/src/v2/workflow/floor_route_gap.dag +++ b/src/v2/workflow/floor_route_gap.dag @@ -1464,8 +1464,62 @@ fn floor_route_gap_expectation_chunk_20() -> List { } } +// THE FIVE test.claim.compute.host_capacity_wet_witness IDENTITIES THAT REACH A REAL HOST POOL. +// Landed by gunbc#11962 with TWO of the three rows chunk_06's header names -- the WetScheduledClaim +// rows in v2.workflow.local_repo_wet_terminal local_repo_wet_schedule, and the +// gunbc.ci_layer_roots witness_exclusion_frontier row classifying the file LocalRepoWetLane -- and +// without this one. Nothing refused the incomplete triple, exactly as that header says nothing +// will; what happened instead is the state it predicts, five red floors later. The immediate cost +// is recorded because it is the argument for the wall that header asks for: these five blocked the +// merge queue for gunbc#11829 (queue run 35673852146, composed revision on 3ab9d319c02), and the +// floor receipt that run published read route_gap_unenrolled=5 route_gap_held=7 -- the seven being +// every OTHER wet identity in the same run, enrolled and therefore held rather than blocking. +// +// THE OPERATION AND GROUND ARE READ FROM THAT RUN, NOT INFERRED, on the standard chunk_06 states: +// each of the five refused with "the hermetic route has no arm for DirWithTemplate (operation +// declares no mock_response)". DirWithTemplate is shell.Mktemp's templated directory operation and +// is a DIFFERENT string from the Dir carried by the chunks above; writing Dir here from the +// neighbouring rows would have produced a floor_route_gap_expectation_mismatch instead of a +// discharge, which is the second half of the guard shape that header names. +// +// THE EXCLUSION ROW WAS NEVER GOING TO REMOVE THESE FROM THE NOMINAL PLAN, and the receipt says so +// at identity grain: disposition=planned_as_changed_witness. The changed-witness sublane admits a +// changed witness REGARDLESS of any exclusion (required_floor_runner cause=ChangedWitnessOutside +// PreparedSubject), deliberately, so that an exclusion list cannot be the way a witness opts out of +// the commit that introduces it. So for a witness whose file is being edited, enrolment here is not +// one of several remedies -- it is the only one that is not a weakening. +// +// WHAT DISCHARGES THE HOLD IS THE WET TERMINAL, NEVER THIS ENROLMENT. The same run recorded all +// seven identities of this module passing on the local-repo wet lane ([local-repo-wet] +// expected=passed observed=passed), and the changed-witness projection already read +// standing=hermetic-route-gap-held-and-wet-passed for exactly these five. +// +// THE OTHER TWO IDENTITIES OF THIS FILE ARE DELIBERATELY ABSENT. the_real_observation_reads_this_ +// machine and two_instances_on_one_host_resolve_to_one_pool_at_one_root reached their subjects +// hermetically in the same run (standing=planned-and-passed), so a row for either would be a stale +// enrolment -- an expectation of a gap that does not occur -- which the floor counts as +// stale_route_gap and which is its own red. +fn floor_route_gap_expectation_chunk_21() -> List { + Cons { + head: FloorRouteGapExpectation { identity: "test.claim.compute.host_capacity_wet_witness.a_request_the_machine_cannot_back_refuses_below_the_live_floor", operation: "DirWithTemplate", ground: NoMockResponse {} }, + tail: Cons { + head: FloorRouteGapExpectation { identity: "test.claim.compute.host_capacity_wet_witness.a_reused_reference_is_a_ledger_refusal_and_never_reported_as_a_full_pool", operation: "DirWithTemplate", ground: NoMockResponse {} }, + tail: Cons { + head: FloorRouteGapExpectation { identity: "test.claim.compute.host_capacity_wet_witness.an_appropriation_larger_than_the_machine_refuses_rather_than_admitting", operation: "DirWithTemplate", ground: NoMockResponse {} }, + tail: Cons { + head: FloorRouteGapExpectation { identity: "test.claim.compute.host_capacity_wet_witness.competing_reservations_cannot_over_reserve_and_a_release_returns_the_capacity", operation: "DirWithTemplate", ground: NoMockResponse {} }, + tail: Cons { + head: FloorRouteGapExpectation { identity: "test.claim.compute.host_capacity_wet_witness.two_requests_summing_past_the_observed_headroom_cannot_both_admit", operation: "DirWithTemplate", ground: NoMockResponse {} }, + tail: Empty {} + } + } + } + } + } +} + fn floor_route_gap_expectation_chunks() -> List> { - Cons { head: floor_route_gap_expectation_chunk_00(), tail: Cons { head: floor_route_gap_expectation_chunk_01(), tail: Cons { head: floor_route_gap_expectation_chunk_02(), tail: Cons { head: floor_route_gap_expectation_chunk_03(), tail: Cons { head: floor_route_gap_expectation_chunk_04(), tail: Cons { head: floor_route_gap_expectation_chunk_05(), tail: Cons { head: floor_route_gap_expectation_chunk_06(), tail: Cons { head: floor_route_gap_expectation_chunk_07(), tail: Cons { head: floor_route_gap_expectation_chunk_08(), tail: Cons { head: floor_route_gap_expectation_chunk_09(), tail: Cons { head: floor_route_gap_expectation_chunk_10(), tail: Cons { head: floor_route_gap_expectation_chunk_11(), tail: Cons { head: floor_route_gap_expectation_chunk_12(), tail: Cons { head: floor_route_gap_expectation_chunk_13(), tail: Cons { head: floor_route_gap_expectation_chunk_14(), tail: Cons { head: floor_route_gap_expectation_chunk_15(), tail: Cons { head: floor_route_gap_expectation_chunk_16(), tail: Cons { head: floor_route_gap_expectation_chunk_17(), tail: Cons { head: floor_route_gap_expectation_chunk_18(), tail: Cons { head: floor_route_gap_expectation_chunk_19(), tail: Cons { head: floor_route_gap_expectation_chunk_20(), tail: Empty {} } } } } } } } } } } } } } } } } } } } } } + Cons { head: floor_route_gap_expectation_chunk_00(), tail: Cons { head: floor_route_gap_expectation_chunk_01(), tail: Cons { head: floor_route_gap_expectation_chunk_02(), tail: Cons { head: floor_route_gap_expectation_chunk_03(), tail: Cons { head: floor_route_gap_expectation_chunk_04(), tail: Cons { head: floor_route_gap_expectation_chunk_05(), tail: Cons { head: floor_route_gap_expectation_chunk_06(), tail: Cons { head: floor_route_gap_expectation_chunk_07(), tail: Cons { head: floor_route_gap_expectation_chunk_08(), tail: Cons { head: floor_route_gap_expectation_chunk_09(), tail: Cons { head: floor_route_gap_expectation_chunk_10(), tail: Cons { head: floor_route_gap_expectation_chunk_11(), tail: Cons { head: floor_route_gap_expectation_chunk_12(), tail: Cons { head: floor_route_gap_expectation_chunk_13(), tail: Cons { head: floor_route_gap_expectation_chunk_14(), tail: Cons { head: floor_route_gap_expectation_chunk_15(), tail: Cons { head: floor_route_gap_expectation_chunk_16(), tail: Cons { head: floor_route_gap_expectation_chunk_17(), tail: Cons { head: floor_route_gap_expectation_chunk_18(), tail: Cons { head: floor_route_gap_expectation_chunk_19(), tail: Cons { head: floor_route_gap_expectation_chunk_20(), tail: Cons { head: floor_route_gap_expectation_chunk_21(), tail: Empty {} } } } } } } } } } } } } } } } } } } } } } } } fn floor_route_gap_expectations() -> List {