diff --git a/dag/gunbc/ci/ci_layer_roots.dag b/dag/gunbc/ci/ci_layer_roots.dag index 2d2718dc882..464c141c6d1 100644 --- a/dag/gunbc/ci/ci_layer_roots.dag +++ b/dag/gunbc/ci/ci_layer_roots.dag @@ -374,6 +374,10 @@ data excl_local_repo_wet_bash_materialized_reason: String = "real host-effect ex data excl_local_repo_wet_bash_materialized_dissolve: DissolutionCondition = unbound_dissolution(description: "mock_response coverage lands for shell.Exec.Run over a sealed transport script and the emitted-bytes assertions are re-checked under a fixed mock -- which the transport_script_stdin_byte_fidelity note already refuses as vacuous for a byte-fidelity claim -- OR the bin-witness wet class regains an executing per-PR consumer; then these fns re-enroll there, drop off local_repo_wet_schedule, and this row deletes") +data excl_local_repo_wet_executor_identity_reason: String = "real host-effect execution witness whose effects are the EXECUTOR'S OWN IDENTITY AND EVENT-LOG READ: the instrument entry reads the executing host's hostname (shell.Exec.RunArgv, no mock_response), resolves that host's event log layout, and reads each claimed group's serving authority from the log before judging any standing (gunbc.instruments.fabric_capacity_standing fabric_capacity_standing over gunbc.spark.pair_serving_authority_log). No temporary repository is built and nothing is written; on a runner that is no dashboard host the read refuses at the layout step and the entry reports every group unread, which is the route the claim asserts. It is the wet half of the pairing obligation whose hermetic half is test.claim.spark.fabric_capacity_standing_witness over a supplied roster." + +data excl_local_repo_wet_executor_identity_dissolve: DissolutionCondition = unbound_dissolution(description: "mock_response coverage lands for shell.Exec.RunArgv and the event-log head read, so the instrument entry can be driven hermetically with a fixed executor and a fixed partition head; then the claim re-enrolls as an ordinary hermetic discovery row, drops off local_repo_wet_schedule, and this row deletes") + data excl_local_repo_wet_host_probe_reason: String = "real host-effect execution witness whose ONLY effect is a READ-ONLY HOST PATH PROBE (shell.PosixCommandV.Check, i.e. command -v) -- refused by the hermetic envelope (no mock_response for operation Check), so excluded from the discovery corpus and executed by the required floor's local-repo wet lane. THIS IS A DISTINCT ADMITTED EFFECT, NOT THE THROWAWAY-REPOSITORY PROPERTY excl_local_repo_wet_reason NAMES: these fns build no temporary repository and write nothing. What they share with that class, and what admits them to the same lane, is the negative half -- no network, no cargo, no remote host, no install media. THE VERDICT IS HOST-INDEPENDENT ON THE TOOL-PRESENCE AXIS, MEASURED RATHER THAN ASSUMED (2026-09-02, PR #10055): every arm of both fns returns the literal true, and the npm fn was executed on one host in both conditions -- probe found, and probe exit=127 with sh still resolvable -- returning the same verdict in each. So admitting them imports no host-conditional red. The residual red these fns CAN produce is route-unreachability (no shell at all: TypeError failed to execute sh), which is the same reachability risk every member of this lane already carries and is not specific to the probed tool. PROVENANCE CARRIED FORWARD from the bin-wet row this replaces: falsifier Codex materialization reuses the same PosixCommandV.Check.exists path (migrated off shell.Which.Check, crisp-wren-896, PR #8590)." data excl_local_repo_wet_host_probe_dissolve: DissolutionCondition = unbound_dissolution(description: "mock_response coverage lands for shell.PosixCommandV.Check, so observe_host_cli_dependency can be asserted under a fixed mock; then these fns re-enroll as ordinary hermetic discovery rows, drop off local_repo_wet_schedule, and this row deletes") @@ -913,6 +917,21 @@ data witness_exclusion_frontier: List = [ classification: LocalRepoWetLane, reason: excl_local_repo_wet_reason, dissolution: excl_local_repo_wet_dissolve}, + WitnessExclusionRow { + pattern: "pair_serving_authority_log_real_execution_witness_test.dag", + classification: LocalRepoWetLane, + reason: excl_local_repo_wet_reason, + dissolution: excl_local_repo_wet_dissolve}, + WitnessExclusionRow { + pattern: "fabric_capacity_standing_wet_witness_test.dag", + classification: LocalRepoWetLane, + reason: excl_local_repo_wet_executor_identity_reason, + dissolution: excl_local_repo_wet_executor_identity_dissolve}, + WitnessExclusionRow { + pattern: "spark_pair_serving_apply_wet_witness_test.dag", + classification: LocalRepoWetLane, + reason: excl_local_repo_wet_executor_identity_reason, + dissolution: excl_local_repo_wet_executor_identity_dissolve}, WitnessExclusionRow { pattern: "devboot_text_blob_real_execution_witness_test.dag", classification: LocalRepoWetLane, diff --git a/dag/gunbc/fabric/fabric_event_log.dag b/dag/gunbc/fabric/fabric_event_log.dag index 472b71b93e8..2e81cfe9f56 100644 --- a/dag/gunbc/fabric/fabric_event_log.dag +++ b/dag/gunbc/fabric/fabric_event_log.dag @@ -18,9 +18,10 @@ import product.capacity.pool { Pool, PoolReading, PoolRead, PoolReadingRefused, import product.capacity.event_chain { PartitionId, EventId, ChainEvent, ChainEnvelope, HeadExpectation, HeadAbsent, HeadAt, head_expectation_eq, event_parent_expectation, AppendDecision, AppendAdmitted, AppendStale, ChainWalk, ChainWalked, ChainIncomplete, ChainBudgetExhausted, chain_from_head, + EventDecode, EventDecoded, EventUndecodable, } import product.capacity.pool_events { - PoolEvent, pool_event_wire_text, pool_event_decode, PoolEventDecode, PoolEventDecoded, PoolEventUndecodable, + PoolEvent, pool_event_wire_text, pool_event_decode, PoolFold, PoolFolded, PoolFoldRefused, pool_fold, SeatRequest, SeatProposal, SeatProposed, SeatRefused, propose_acquire, grant_from_admission, } import product.capacity.lease { LeasePolicy, LeaseGrant, release_law_eq, release_law_wire } @@ -172,17 +173,25 @@ fn event_log_observe_head_from_mirror(layout: EventLogLayout, partition: Partiti // READING A PARTITION: fetch the head's objects into the mirror, then read each event by its // address following parents, bounded, and hand the collected envelopes to the pure walk so the // chain's shape is decided by one authority. -type PartitionRead - = PartitionReadOk { head: HeadExpectation, walk: ChainWalk } +// THE LOG IS GENERIC IN ITS PAYLOAD, AND THE CODEC IS THE PAYLOAD'S. One object per event, one ref +// per partition, one compare-and-set on the head -- none of that is about seats. The pool events +// were the first partition kind and the read and append were written against their codec, which +// made a second partition kind (the pair-serving authority, gunbc.spark.pair_serving_authority_log) +// need a second read and a second append: the §2 duplication, with the linearization law copied +// twice. So the read walks and the append publishes for ANY payload, taking the payload's encode +// and decode, and event_log_read_partition / event_log_append below are those two with the pool +// codec supplied -- specializations of one root, not a second spelling of it. +type PartitionRead

+ = PartitionReadOk { head: HeadExpectation, walk: ChainWalk

} | PartitionReadRefused { step: String, reason: String } -type CollectState { +type CollectState

{ current: HeadExpectation - collected: List> + collected: List> refused: String? } -fn collect_step(layout: EventLogLayout, st: CollectState) -> CollectState { +fn collect_step

(layout: EventLogLayout, st: CollectState

, decode: fn(String) -> EventDecode

) -> CollectState

{ match st.refused { Present { value: _ } => st Absent => @@ -193,9 +202,9 @@ fn collect_step(layout: EventLogLayout, st: CollectState) -> CollectState { if !r.success { CollectState { current: st.current, collected: st.collected, refused: Present { value: join(["cat-file ", h as String, " refused"], "") } } } else { - match pool_event_decode(text: r.content) { - PoolEventUndecodable { reason: why } => CollectState { current: st.current, collected: st.collected, refused: Present { value: join(["event ", h as String, " undecodable: ", why], "") } } - PoolEventDecoded { event: e } => CollectState { + match decode(r.content) { + EventUndecodable { reason: why } => CollectState { current: st.current, collected: st.collected, refused: Present { value: join(["event ", h as String, " undecodable: ", why], "") } } + EventDecoded { event: e } => CollectState { current: event_parent_expectation(e: e), collected: concat(st.collected, [ChainEnvelope { id: h, event: e }]), refused: none, @@ -207,7 +216,7 @@ fn collect_step(layout: EventLogLayout, st: CollectState) -> CollectState { } } -fn event_log_read_partition(layout: EventLogLayout, partition: PartitionId, budget: Nat) -> PartitionRead { +fn event_log_read_partition_with

(layout: EventLogLayout, partition: PartitionId, budget: Nat, decode: fn(String) -> EventDecode

) -> PartitionRead

{ match event_log_ensure_mirror(layout: layout) { MirrorRefused { step: s, reason: why } => PartitionReadRefused { step: s, reason: why } MirrorReady => @@ -222,7 +231,7 @@ fn event_log_read_partition(layout: EventLogLayout, partition: PartitionId, budg if f.exit_code != 0 { PartitionReadRefused { step: "fetch", reason: join(["exit ", to_string(f.exit_code), ": ", trim(s: f.stderr)], "") } } else { - let st = fold(nat_range_inclusive(lo: 1, hi: budget), init: CollectState { current: HeadAt { id: h }, collected: [], refused: none }, f: (acc, _i) => collect_step(layout: layout, st: acc)) + let st = fold(nat_range_inclusive(lo: 1, hi: budget), init: CollectState { current: HeadAt { id: h }, collected: [], refused: none }, f: (acc, _i) => collect_step(layout: layout, st: acc, decode: decode)) match st.refused { Present { value: why } => PartitionReadRefused { step: "read", reason: why } Absent => PartitionReadOk { head: HeadAt { id: h }, walk: chain_from_head(envs: st.collected, head: HeadAt { id: h }, budget: budget) } @@ -234,6 +243,10 @@ fn event_log_read_partition(layout: EventLogLayout, partition: PartitionId, budg } } +fn event_log_read_partition(layout: EventLogLayout, partition: PartitionId, budget: Nat) -> PartitionRead { + event_log_read_partition_with(layout: layout, partition: partition, budget: budget, decode: fn(text) { pool_event_decode(text: text) }) +} + // APPEND: publish the bytes as an object in the mirror, then advance the partition ref at the // placement with a lease on the expected head. A refused push is classified by re-observing the // head, because git's exit code cannot tell a lost race from an unreachable placement: the head @@ -249,7 +262,7 @@ type EventAppend // and a completed foreign write published another writer's event under this writer's admitted // append. The lease guards the head, not the object's content. The enrolled evidence is // test.claim.fabric_event_log_append_real_execution. -fn event_log_append(layout: EventLogLayout, partition: PartitionId, event: ChainEvent, expected: HeadExpectation) -> EventAppend { +fn event_log_append_with

(layout: EventLogLayout, partition: PartitionId, event: ChainEvent

, expected: HeadExpectation, encode: fn(ChainEvent

) -> String) -> EventAppend { if !head_expectation_eq(a: event_parent_expectation(e: event), b: expected) { EventAppendRefused { step: "parent", reason: "the event's parent is not the head the append expects" } } else { @@ -259,7 +272,7 @@ fn event_log_append(layout: EventLogLayout, partition: PartitionId, event: Chain match event_log_remote_word(remote: layout.remote) { Absent => EventAppendRefused { step: "remote", reason: "the event log is unplaced" } Present { value: remote } => { - let h = git.Plumbing.HashObjectWriteStdin(address: mirror_address(layout: layout), content: pool_event_wire_text(event: event)) + let h = git.Plumbing.HashObjectWriteStdin(address: mirror_address(layout: layout), content: encode(event)) if h.exit_code != 0 { EventAppendRefused { step: "hash-object", reason: join(["exit ", to_string(h.exit_code), ": ", trim(s: h.stderr)], "") } } else { @@ -285,6 +298,10 @@ fn event_log_append(layout: EventLogLayout, partition: PartitionId, event: Chain } } +fn event_log_append(layout: EventLogLayout, partition: PartitionId, event: ChainEvent, expected: HeadExpectation) -> EventAppend { + event_log_append_with(layout: layout, partition: partition, event: event, expected: expected, encode: fn(e) { pool_event_wire_text(event: e) }) +} + // THE SEAT TRANSACTION, WET AND BOUNDED: read, fold, propose, append; a stale append re-reads and // decides again, at most `attempts` times, and exhaustion is its own typed outcome rather than a // seat. The grant is minted only from an admitted append. diff --git a/dag/gunbc/instruments/fabric_capacity_standing.dag b/dag/gunbc/instruments/fabric_capacity_standing.dag index ac037201b4e..eab08a7e084 100644 --- a/dag/gunbc/instruments/fabric_capacity_standing.dag +++ b/dag/gunbc/instruments/fabric_capacity_standing.dag @@ -11,10 +11,13 @@ import gunbc.spark.fabric_switch_observed { FabricGroup, fabric_group_wire } import std.content_hash { ContentHash, Sha256Hash, sha256_hex_digest } import product.placement_supply { HostIdentity } import gunbc.spark.pair_serving_authority { - PairServingGroupAuthority, spark_pair_serving_authorities, pair_serving_capacity_subject, + PairServingGroupAuthority, pair_serving_capacity_subject, CapacityOrdinarySubject, CapacitySuspendedSubject, CapacityReleasedSubject, } import gunbc.spark.vllm_serving_launch { VllmServingLaunch, vllm_serving_launch } +import gunbc.spark.pair_serving_authority_log { CurrentAuthority, CurrentAuthorityRead, CurrentAuthorityUnread, current_pair_serving_authorities } +import gunbc.spark.fabric_reach { ExecutorReachKnown, ExecutorReachUnknown, observe_executor_reach } +import std.resources { Network } import gunbc.spark.vllm_kv_layout_observe { VllmKvLayoutReceipt, admit_kv_layout, } @@ -552,6 +555,32 @@ fn capacity_standing_verdict(standings: List) -> ProcessExit { } } -fn fabric_capacity_standing() -> ProcessExit { - capacity_standing_verdict(standings: map(spark_pair_serving_authorities, a => standing_for_authority(a: a))) +// THE AUTHORITY IS READ FROM THE LOG, NOT THE SOURCE ROW. gunbc.spark.pair_serving_authority_log +// folds the resting row through every recorded transition, so a group a transaction has suspended +// is reported suspended here without a commit. An authority that could not be read is a refused +// standing naming the read's step -- the instrument does not stand for a group whose state it +// could not establish, and it does not fall back to the row. +fn standing_for_current(c: CurrentAuthority) -> GroupStanding { + match c { + CurrentAuthorityRead { authority: a, head: _, generation: _ } => standing_for_authority(a: a) + CurrentAuthorityUnread { group: g, step: s, reason: why } => + refused_standing(text: join([fabric_group_wire(g: g) as String, ": serving authority could not be read at ", s, ": ", why], "")) + } +} + +// The verdict over a SUPPLIED current roster: the real group_report route for every read +// authority, so a witness can hand in the resting row at generation 0 and still execute the +// producer and the binding, while the live entry below hands in what the executor's log says. +fn fabric_capacity_standing_current(current: List) -> ProcessExit { + capacity_standing_verdict(standings: map(current, c => standing_for_current(c: c))) +} + +fn fabric_capacity_standing() -> ProcessExit + uses net: Network +{ + match observe_executor_reach() { + ExecutorReachUnknown { cause: c } => exit_failure(reason: join(["fabric capacity standing: ", c], "")) + ExecutorReachKnown { short_hostname: executor, path: _ } => + fabric_capacity_standing_current(current: current_pair_serving_authorities(short_hostname: executor)) + } } diff --git a/dag/gunbc/namespace/transition_admission/gunbc_fleet_converge_plan_cli_fleet_converge_operator_cli_dispatch_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/gunbc_fleet_converge_plan_cli_fleet_converge_operator_cli_dispatch_deployment_spec_srv1.dag deleted file mode 100644 index c8c22c4ad36..00000000000 --- a/dag/gunbc/namespace/transition_admission/gunbc_fleet_converge_plan_cli_fleet_converge_operator_cli_dispatch_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.gunbc_fleet_converge_plan_cli_fleet_converge_operator_cli_dispatch_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data gunbc_fleet_converge_plan_cli_fleet_converge_operator_cli_dispatch_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("gunbc.fleet_converge_plan_cli", "fleet_converge_operator_cli_dispatch"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/gunbc_fleet_converge_plan_timer_retirement_observed_legacy_srv1_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/gunbc_fleet_converge_plan_timer_retirement_observed_legacy_srv1_deployment_spec_srv1.dag deleted file mode 100644 index 01ab84a50b2..00000000000 --- a/dag/gunbc/namespace/transition_admission/gunbc_fleet_converge_plan_timer_retirement_observed_legacy_srv1_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.gunbc_fleet_converge_plan_timer_retirement_observed_legacy_srv1_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data gunbc_fleet_converge_plan_timer_retirement_observed_legacy_srv1_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("gunbc.fleet_converge_plan", "timer_retirement_observed_legacy_srv1"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/gunbc_live_deploy_apply_live_deploy_apply_srv1_with_access_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/gunbc_live_deploy_apply_live_deploy_apply_srv1_with_access_deployment_spec_srv1.dag deleted file mode 100644 index 6cdfa2cc271..00000000000 --- a/dag/gunbc/namespace/transition_admission/gunbc_live_deploy_apply_live_deploy_apply_srv1_with_access_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.gunbc_live_deploy_apply_live_deploy_apply_srv1_with_access_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data gunbc_live_deploy_apply_live_deploy_apply_srv1_with_access_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("gunbc.live_deploy.apply", "live_deploy_apply_srv1_with_access"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/gunbc_live_deploy_apply_live_deploy_retract_srv1_with_access_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/gunbc_live_deploy_apply_live_deploy_retract_srv1_with_access_deployment_spec_srv1.dag deleted file mode 100644 index 83568c35bf1..00000000000 --- a/dag/gunbc/namespace/transition_admission/gunbc_live_deploy_apply_live_deploy_retract_srv1_with_access_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.gunbc_live_deploy_apply_live_deploy_retract_srv1_with_access_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data gunbc_live_deploy_apply_live_deploy_retract_srv1_with_access_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("gunbc.live_deploy.apply", "live_deploy_retract_srv1_with_access"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/gunbc_live_deploy_readiness_live_deploy_poll_until_service_ready_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/gunbc_live_deploy_readiness_live_deploy_poll_until_service_ready_deployment_spec_srv1.dag deleted file mode 100644 index c4ea22ecf68..00000000000 --- a/dag/gunbc/namespace/transition_admission/gunbc_live_deploy_readiness_live_deploy_poll_until_service_ready_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.gunbc_live_deploy_readiness_live_deploy_poll_until_service_ready_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data gunbc_live_deploy_readiness_live_deploy_poll_until_service_ready_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("gunbc.live_deploy.readiness", "live_deploy_poll_until_service_ready"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/gunbc_roadmap_launch_deployment_cli_rlm_launch_deployment_receipt_bound_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/gunbc_roadmap_launch_deployment_cli_rlm_launch_deployment_receipt_bound_deployment_spec_srv1.dag deleted file mode 100644 index 46e9537b6d2..00000000000 --- a/dag/gunbc/namespace/transition_admission/gunbc_roadmap_launch_deployment_cli_rlm_launch_deployment_receipt_bound_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.gunbc_roadmap_launch_deployment_cli_rlm_launch_deployment_receipt_bound_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data gunbc_roadmap_launch_deployment_cli_rlm_launch_deployment_receipt_bound_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("gunbc.roadmap_launch_deployment_cli", "rlm_launch_deployment_receipt_bound"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/gunbc_roadmap_launch_deployment_cli_rlm_routed_base_url_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/gunbc_roadmap_launch_deployment_cli_rlm_routed_base_url_deployment_spec_srv1.dag deleted file mode 100644 index bf690844e36..00000000000 --- a/dag/gunbc/namespace/transition_admission/gunbc_roadmap_launch_deployment_cli_rlm_routed_base_url_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.gunbc_roadmap_launch_deployment_cli_rlm_routed_base_url_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data gunbc_roadmap_launch_deployment_cli_rlm_routed_base_url_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("gunbc.roadmap_launch_deployment_cli", "rlm_routed_base_url"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/gunbc_roadmap_launch_deployment_cli_unit_standing_fact_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/gunbc_roadmap_launch_deployment_cli_unit_standing_fact_deployment_spec_srv1.dag deleted file mode 100644 index 8733360b46d..00000000000 --- a/dag/gunbc/namespace/transition_admission/gunbc_roadmap_launch_deployment_cli_unit_standing_fact_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.gunbc_roadmap_launch_deployment_cli_unit_standing_fact_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data gunbc_roadmap_launch_deployment_cli_unit_standing_fact_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("gunbc.roadmap_launch_deployment_cli", "unit_standing_fact"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/product_capacity_pool_events_pool_event_kind_decode_member_nat_event_json.dag b/dag/gunbc/namespace/transition_admission/product_capacity_pool_events_pool_event_kind_decode_member_nat_event_json.dag new file mode 100644 index 00000000000..9069d4eab9e --- /dev/null +++ b/dag/gunbc/namespace/transition_admission/product_capacity_pool_events_pool_event_kind_decode_member_nat_event_json.dag @@ -0,0 +1,19 @@ +module gunbc.namespace.transition_admission.product_capacity_pool_events_pool_event_kind_decode_member_nat_event_json + +import std.types { NonEmptyStr, List } +import std.integer { UInt32 } +import std.decl_ref { decl_ref } +import gunbc.compiler_frontend_program_interlock { TargetChanged } +import gunbc.namespace.transition_admission { TransitionAdmission, Binding, PullRequest } + +data product_capacity_pool_events_pool_event_kind_decode_member_nat_event_json: TransitionAdmission = TransitionAdmission { + label: "Cut D 2a: the chain-envelope JSON codec moves to product.capacity.event_json; pool_events consumes member_nat from there" as NonEmptyStr, + subject: Binding { + enclosing: decl_ref("product.capacity.pool_events", "pool_event_kind_decode"), + spelling: "member_nat" as NonEmptyStr, + expected_candidates: [decl_ref("product.capacity.event_json", "member_nat")], + }, + disposition: TargetChanged, + deletion_follow_up: PullRequest { number: 11555 as UInt32 }, + owner_pull_request: 11550 as UInt32, +} diff --git a/dag/gunbc/namespace/transition_admission/product_capacity_pool_events_pool_event_kind_decode_member_nonempty_event_json.dag b/dag/gunbc/namespace/transition_admission/product_capacity_pool_events_pool_event_kind_decode_member_nonempty_event_json.dag new file mode 100644 index 00000000000..6133332f5e4 --- /dev/null +++ b/dag/gunbc/namespace/transition_admission/product_capacity_pool_events_pool_event_kind_decode_member_nonempty_event_json.dag @@ -0,0 +1,19 @@ +module gunbc.namespace.transition_admission.product_capacity_pool_events_pool_event_kind_decode_member_nonempty_event_json + +import std.types { NonEmptyStr, List } +import std.integer { UInt32 } +import std.decl_ref { decl_ref } +import gunbc.compiler_frontend_program_interlock { TargetChanged } +import gunbc.namespace.transition_admission { TransitionAdmission, Binding, PullRequest } + +data product_capacity_pool_events_pool_event_kind_decode_member_nonempty_event_json: TransitionAdmission = TransitionAdmission { + label: "Cut D 2a: the chain-envelope JSON codec moves to product.capacity.event_json; pool_events consumes member_nonempty from there" as NonEmptyStr, + subject: Binding { + enclosing: decl_ref("product.capacity.pool_events", "pool_event_kind_decode"), + spelling: "member_nonempty" as NonEmptyStr, + expected_candidates: [decl_ref("product.capacity.event_json", "member_nonempty")], + }, + disposition: TargetChanged, + deletion_follow_up: PullRequest { number: 11555 as UInt32 }, + owner_pull_request: 11550 as UInt32, +} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_belt_tick_receipt_home_witness_belt_upsert_commands_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_belt_tick_receipt_home_witness_belt_upsert_commands_deployment_spec_srv1.dag deleted file mode 100644 index faf3f8d6f4f..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_belt_tick_receipt_home_witness_belt_upsert_commands_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_belt_tick_receipt_home_witness_belt_upsert_commands_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_belt_tick_receipt_home_witness_belt_upsert_commands_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.belt_tick_receipt_home_witness", "belt_upsert_commands"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_devboot_subject_identity_witness_no_retract_can_remove_the_devboot_store_root_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_devboot_subject_identity_witness_no_retract_can_remove_the_devboot_store_root_deployment_spec_srv1.dag deleted file mode 100644 index b0bda76b17a..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_devboot_subject_identity_witness_no_retract_can_remove_the_devboot_store_root_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_devboot_subject_identity_witness_no_retract_can_remove_the_devboot_store_root_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_devboot_subject_identity_witness_no_retract_can_remove_the_devboot_store_root_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.devboot_subject_identity_witness", "no_retract_can_remove_the_devboot_store_root"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_devboot_subject_identity_witness_the_devboot_store_root_reaches_the_deploy_apply_path_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_devboot_subject_identity_witness_the_devboot_store_root_reaches_the_deploy_apply_path_deployment_spec_srv1.dag deleted file mode 100644 index 07246544aa1..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_devboot_subject_identity_witness_the_devboot_store_root_reaches_the_deploy_apply_path_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_devboot_subject_identity_witness_the_devboot_store_root_reaches_the_deploy_apply_path_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_devboot_subject_identity_witness_the_devboot_store_root_reaches_the_deploy_apply_path_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.devboot_subject_identity_witness", "the_devboot_store_root_reaches_the_deploy_apply_path"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_fleet_converge_launch_environment_scope_witness_the_launch_environment_owns_no_runner_unit_and_no_runner_unit_owns_it_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_fleet_converge_launch_environment_scope_witness_the_launch_environment_owns_no_runner_unit_and_no_runner_unit_owns_it_deployment_spec_srv1.dag deleted file mode 100644 index 5c56e230b49..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_fleet_converge_launch_environment_scope_witness_the_launch_environment_owns_no_runner_unit_and_no_runner_unit_owns_it_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_fleet_converge_launch_environment_scope_witness_the_launch_environment_owns_no_runner_unit_and_no_runner_unit_owns_it_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_fleet_converge_launch_environment_scope_witness_the_launch_environment_owns_no_runner_unit_and_no_runner_unit_owns_it_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.fleet_converge_launch_environment_scope_witness", "the_launch_environment_owns_no_runner_unit_and_no_runner_unit_owns_it"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_apply_fixture_converged_mutation_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_apply_fixture_converged_mutation_deployment_spec_srv1.dag deleted file mode 100644 index 93b5382fe2a..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_apply_fixture_converged_mutation_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_apply_fixture_converged_mutation_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_apply_fixture_converged_mutation_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.apply", "fixture_converged_mutation"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_apply_witness_digest_readback_script_is_bounded_and_post_mutation_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_apply_witness_digest_readback_script_is_bounded_and_post_mutation_deployment_spec_srv1.dag deleted file mode 100644 index d4ec75650db..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_apply_witness_digest_readback_script_is_bounded_and_post_mutation_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_apply_witness_digest_readback_script_is_bounded_and_post_mutation_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_apply_witness_digest_readback_script_is_bounded_and_post_mutation_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.apply", "witness_digest_readback_script_is_bounded_and_post_mutation"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_binary_only_plan_installs_and_restarts_without_publishing_the_tree_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_binary_only_plan_installs_and_restarts_without_publishing_the_tree_deployment_spec_srv1.dag deleted file mode 100644 index affad786ba3..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_binary_only_plan_installs_and_restarts_without_publishing_the_tree_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_a_binary_only_plan_installs_and_restarts_without_publishing_the_tree_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_a_binary_only_plan_installs_and_restarts_without_publishing_the_tree_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "a_binary_only_plan_installs_and_restarts_without_publishing_the_tree"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_matching_authorization_applies_the_staged_caps_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_matching_authorization_applies_the_staged_caps_deployment_spec_srv1.dag deleted file mode 100644 index 812b180ae43..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_matching_authorization_applies_the_staged_caps_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_a_matching_authorization_applies_the_staged_caps_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_a_matching_authorization_applies_the_staged_caps_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "a_matching_authorization_applies_the_staged_caps"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_twin_deployment_on_one_host_collides_with_nothing_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_twin_deployment_on_one_host_collides_with_nothing_deployment_spec_srv1.dag deleted file mode 100644 index 8c0ead6d1da..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_twin_deployment_on_one_host_collides_with_nothing_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_a_twin_deployment_on_one_host_collides_with_nothing_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_a_twin_deployment_on_one_host_collides_with_nothing_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "a_twin_deployment_on_one_host_collides_with_nothing"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_withheld_decision_applies_no_caps_at_the_production_root_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_withheld_decision_applies_no_caps_at_the_production_root_deployment_spec_srv1.dag deleted file mode 100644 index 8bfe624e6cd..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_withheld_decision_applies_no_caps_at_the_production_root_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_a_withheld_decision_applies_no_caps_at_the_production_root_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_a_withheld_decision_applies_no_caps_at_the_production_root_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "a_withheld_decision_applies_no_caps_at_the_production_root"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_zero_mutation_plan_installs_publishes_and_restarts_nothing_of_the_release_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_zero_mutation_plan_installs_publishes_and_restarts_nothing_of_the_release_deployment_spec_srv1.dag deleted file mode 100644 index 46be7cef7d4..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_a_zero_mutation_plan_installs_publishes_and_restarts_nothing_of_the_release_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_a_zero_mutation_plan_installs_publishes_and_restarts_nothing_of_the_release_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_a_zero_mutation_plan_installs_publishes_and_restarts_nothing_of_the_release_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "a_zero_mutation_plan_installs_publishes_and_restarts_nothing_of_the_release"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_an_authorization_for_another_host_applies_no_caps_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_an_authorization_for_another_host_applies_no_caps_deployment_spec_srv1.dag deleted file mode 100644 index c7543a3ad31..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_an_authorization_for_another_host_applies_no_caps_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_an_authorization_for_another_host_applies_no_caps_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_an_authorization_for_another_host_applies_no_caps_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "an_authorization_for_another_host_applies_no_caps"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_emitted_twin_retract_removes_nothing_of_productions_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_emitted_twin_retract_removes_nothing_of_productions_deployment_spec_srv1.dag deleted file mode 100644 index 1dfc22688ec..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_emitted_twin_retract_removes_nothing_of_productions_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_emitted_twin_retract_removes_nothing_of_productions_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_emitted_twin_retract_removes_nothing_of_productions_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "emitted_twin_retract_removes_nothing_of_productions"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_fabric_event_log_root_joins_the_directory_member_roster_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_fabric_event_log_root_joins_the_directory_member_roster_deployment_spec_srv1.dag deleted file mode 100644 index 25f912b7c48..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_fabric_event_log_root_joins_the_directory_member_roster_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_fabric_event_log_root_joins_the_directory_member_roster_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_fabric_event_log_root_joins_the_directory_member_roster_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "fabric_event_log_root_joins_the_directory_member_roster"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_fleet_converge_timer_not_installed_by_deploy_apply_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_fleet_converge_timer_not_installed_by_deploy_apply_deployment_spec_srv1.dag deleted file mode 100644 index da2ef893468..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_fleet_converge_timer_not_installed_by_deploy_apply_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_fleet_converge_timer_not_installed_by_deploy_apply_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_fleet_converge_timer_not_installed_by_deploy_apply_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "fleet_converge_timer_not_installed_by_deploy_apply"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_member_fragment_text_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_member_fragment_text_deployment_spec_srv1.dag deleted file mode 100644 index 188167388a5..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_member_fragment_text_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_member_fragment_text_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_member_fragment_text_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "member_fragment_text"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_apply_carries_its_own_handler_and_tree_sync_env_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_apply_carries_its_own_handler_and_tree_sync_env_deployment_spec_srv1.dag deleted file mode 100644 index 593aa287f99..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_apply_carries_its_own_handler_and_tree_sync_env_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_production_apply_carries_its_own_handler_and_tree_sync_env_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_production_apply_carries_its_own_handler_and_tree_sync_env_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "production_apply_carries_its_own_handler_and_tree_sync_env"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_apply_creates_productions_binary_parent_directory_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_apply_creates_productions_binary_parent_directory_deployment_spec_srv1.dag deleted file mode 100644 index d6c5954cda5..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_apply_creates_productions_binary_parent_directory_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_production_apply_creates_productions_binary_parent_directory_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_production_apply_creates_productions_binary_parent_directory_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "production_apply_creates_productions_binary_parent_directory"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_apply_serves_its_own_endpoint_and_scopes_no_path_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_apply_serves_its_own_endpoint_and_scopes_no_path_deployment_spec_srv1.dag deleted file mode 100644 index 19968579d6c..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_apply_serves_its_own_endpoint_and_scopes_no_path_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_production_apply_serves_its_own_endpoint_and_scopes_no_path_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_production_apply_serves_its_own_endpoint_and_scopes_no_path_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "production_apply_serves_its_own_endpoint_and_scopes_no_path"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_belt_unit_carries_productions_spawn_root_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_belt_unit_carries_productions_spawn_root_deployment_spec_srv1.dag deleted file mode 100644 index a358287966d..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_belt_unit_carries_productions_spawn_root_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_production_belt_unit_carries_productions_spawn_root_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_production_belt_unit_carries_productions_spawn_root_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "production_belt_unit_carries_productions_spawn_root"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_retract_offs_its_own_endpoint_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_retract_offs_its_own_endpoint_deployment_spec_srv1.dag deleted file mode 100644 index a6fe3eef890..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_production_retract_offs_its_own_endpoint_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_production_retract_offs_its_own_endpoint_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_production_retract_offs_its_own_endpoint_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "production_retract_offs_its_own_endpoint"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_retract_is_not_emitted_without_an_observed_scoped_removal_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_retract_is_not_emitted_without_an_observed_scoped_removal_deployment_spec_srv1.dag deleted file mode 100644 index 12ba3c17ce8..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_retract_is_not_emitted_without_an_observed_scoped_removal_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_retract_is_not_emitted_without_an_observed_scoped_removal_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_retract_is_not_emitted_without_an_observed_scoped_removal_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "retract_is_not_emitted_without_an_observed_scoped_removal"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_the_full_plan_lands_its_members_in_the_deployments_order_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_the_full_plan_lands_its_members_in_the_deployments_order_deployment_spec_srv1.dag deleted file mode 100644 index 0fec49a234f..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_the_full_plan_lands_its_members_in_the_deployments_order_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_the_full_plan_lands_its_members_in_the_deployments_order_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_the_full_plan_lands_its_members_in_the_deployments_order_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "the_full_plan_lands_its_members_in_the_deployments_order"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_the_preamble_ensures_the_publication_principal_as_a_nologin_system_account_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_the_preamble_ensures_the_publication_principal_as_a_nologin_system_account_deployment_spec_srv1.dag deleted file mode 100644 index c3057b5a2c9..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_the_preamble_ensures_the_publication_principal_as_a_nologin_system_account_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_the_preamble_ensures_the_publication_principal_as_a_nologin_system_account_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_the_preamble_ensures_the_publication_principal_as_a_nologin_system_account_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "the_preamble_ensures_the_publication_principal_as_a_nologin_system_account"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_the_publication_member_emits_convergence_and_no_rsync_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_the_publication_member_emits_convergence_and_no_rsync_deployment_spec_srv1.dag deleted file mode 100644 index 796315996e8..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_the_publication_member_emits_convergence_and_no_rsync_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_the_publication_member_emits_convergence_and_no_rsync_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_the_publication_member_emits_convergence_and_no_rsync_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "the_publication_member_emits_convergence_and_no_rsync"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_the_writer_reverts_only_the_authorized_target_units_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_the_writer_reverts_only_the_authorized_target_units_deployment_spec_srv1.dag deleted file mode 100644 index 643e8e201a4..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_the_writer_reverts_only_the_authorized_target_units_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_the_writer_reverts_only_the_authorized_target_units_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_the_writer_reverts_only_the_authorized_target_units_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "the_writer_reverts_only_the_authorized_target_units"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_twin_apply_serves_its_own_endpoint_and_not_productions_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_twin_apply_serves_its_own_endpoint_and_not_productions_deployment_spec_srv1.dag deleted file mode 100644 index eb3755197af..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_twin_apply_serves_its_own_endpoint_and_not_productions_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_twin_apply_serves_its_own_endpoint_and_not_productions_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_twin_apply_serves_its_own_endpoint_and_not_productions_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "twin_apply_serves_its_own_endpoint_and_not_productions"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_twin_retract_offs_its_own_endpoint_and_not_productions_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_twin_retract_offs_its_own_endpoint_and_not_productions_deployment_spec_srv1.dag deleted file mode 100644 index 8a81205d89b..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_twin_retract_offs_its_own_endpoint_and_not_productions_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_twin_retract_offs_its_own_endpoint_and_not_productions_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_twin_retract_offs_its_own_endpoint_and_not_productions_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "twin_retract_offs_its_own_endpoint_and_not_productions"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_twin_teardown_removes_nothing_production_owns_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_twin_teardown_removes_nothing_production_owns_deployment_spec_srv1.dag deleted file mode 100644 index 8951ade8db7..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_twin_teardown_removes_nothing_production_owns_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_twin_teardown_removes_nothing_production_owns_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_twin_teardown_removes_nothing_production_owns_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "twin_teardown_removes_nothing_production_owns"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_apply_preamble_text_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_apply_preamble_text_deployment_spec_srv1.dag deleted file mode 100644 index 8928ecfd7ee..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_apply_preamble_text_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_apply_preamble_text_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_apply_preamble_text_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_apply_preamble_text"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_apply_script_contains_systemd_and_tailscale_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_apply_script_contains_systemd_and_tailscale_deployment_spec_srv1.dag deleted file mode 100644 index 3996795f179..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_apply_script_contains_systemd_and_tailscale_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_apply_script_contains_systemd_and_tailscale_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_apply_script_contains_systemd_and_tailscale_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_apply_script_contains_systemd_and_tailscale"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_apply_script_text_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_apply_script_text_deployment_spec_srv1.dag deleted file mode 100644 index 8fbb99a9302..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_apply_script_text_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_apply_script_text_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_apply_script_text_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_apply_script_text"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_apply_script_wires_memory_cap_deploy_consumer_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_apply_script_wires_memory_cap_deploy_consumer_deployment_spec_srv1.dag deleted file mode 100644 index 3b0b6e8874f..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_apply_script_wires_memory_cap_deploy_consumer_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_apply_script_wires_memory_cap_deploy_consumer_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_apply_script_wires_memory_cap_deploy_consumer_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_apply_script_wires_memory_cap_deploy_consumer"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_execstart_at_another_candidate_differs_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_execstart_at_another_candidate_differs_deployment_spec_srv1.dag deleted file mode 100644 index ce35398902e..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_execstart_at_another_candidate_differs_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_execstart_at_another_candidate_differs_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_execstart_at_another_candidate_differs_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_execstart_at_another_candidate_differs"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_execstart_carries_exactly_the_admitted_revision_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_execstart_carries_exactly_the_admitted_revision_deployment_spec_srv1.dag deleted file mode 100644 index b211790677a..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_execstart_carries_exactly_the_admitted_revision_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_execstart_carries_exactly_the_admitted_revision_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_execstart_carries_exactly_the_admitted_revision_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_execstart_carries_exactly_the_admitted_revision"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_execstart_omitting_the_revision_is_not_the_emitted_line_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_execstart_omitting_the_revision_is_not_the_emitted_line_deployment_spec_srv1.dag deleted file mode 100644 index 315db01a30d..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_execstart_omitting_the_revision_is_not_the_emitted_line_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_execstart_omitting_the_revision_is_not_the_emitted_line_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_execstart_omitting_the_revision_is_not_the_emitted_line_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_execstart_omitting_the_revision_is_not_the_emitted_line"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_owned_vs_ensured_typed_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_owned_vs_ensured_typed_deployment_spec_srv1.dag deleted file mode 100644 index b7cc8dac58a..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_owned_vs_ensured_typed_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_owned_vs_ensured_typed_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_owned_vs_ensured_typed_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_owned_vs_ensured_typed"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_retract_owned_process_removes_serve_service_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_retract_owned_process_removes_serve_service_deployment_spec_srv1.dag deleted file mode 100644 index 7fc07eda0fa..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_retract_owned_process_removes_serve_service_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_retract_owned_process_removes_serve_service_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_retract_owned_process_removes_serve_service_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_retract_owned_process_removes_serve_service"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_retract_preamble_acknowledges_shared_sudoers_install_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_retract_preamble_acknowledges_shared_sudoers_install_deployment_spec_srv1.dag deleted file mode 100644 index 43b1fec7e26..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_retract_preamble_acknowledges_shared_sudoers_install_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_retract_preamble_acknowledges_shared_sudoers_install_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_retract_preamble_acknowledges_shared_sudoers_install_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_retract_preamble_acknowledges_shared_sudoers_install"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_retract_script_owned_only_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_retract_script_owned_only_deployment_spec_srv1.dag deleted file mode 100644 index b304a3a3fbc..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_retract_script_owned_only_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_retract_script_owned_only_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_retract_script_owned_only_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_retract_script_owned_only"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_retract_script_text_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_retract_script_text_deployment_spec_srv1.dag deleted file mode 100644 index fed64f8318f..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_retract_script_text_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_retract_script_text_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_retract_script_text_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_retract_script_text"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_spec_listen_port_is_8080_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_spec_listen_port_is_8080_deployment_spec_srv1.dag deleted file mode 100644 index 5a97ce5b335..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_spec_listen_port_is_8080_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_spec_listen_port_is_8080_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_spec_listen_port_is_8080_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_spec_listen_port_is_8080"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_spec_targets_srv1_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_spec_targets_srv1_deployment_spec_srv1.dag deleted file mode 100644 index de9b6eb10ad..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_spec_targets_srv1_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_spec_targets_srv1_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_spec_targets_srv1_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_spec_targets_srv1"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_spec_uses_apt_package_manager_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_spec_uses_apt_package_manager_deployment_spec_srv1.dag deleted file mode 100644 index 16f3cad589c..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_spec_uses_apt_package_manager_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_spec_uses_apt_package_manager_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_spec_uses_apt_package_manager_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_spec_uses_apt_package_manager"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_systemd_unit_emitted_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_systemd_unit_emitted_deployment_spec_srv1.dag deleted file mode 100644 index 5df3ed00aae..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_systemd_unit_emitted_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_systemd_unit_emitted_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_systemd_unit_emitted_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_systemd_unit_emitted"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_tailnet_domain_propagates_optional_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_tailnet_domain_propagates_optional_deployment_spec_srv1.dag deleted file mode 100644 index 7a75f82e39d..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_tailnet_domain_propagates_optional_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_tailnet_domain_propagates_optional_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_tailnet_domain_propagates_optional_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_tailnet_domain_propagates_optional"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_tailnet_url_absent_not_fabricated_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_tailnet_url_absent_not_fabricated_deployment_spec_srv1.dag deleted file mode 100644 index 94a87c1662e..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_tailnet_url_absent_not_fabricated_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_tailnet_url_absent_not_fabricated_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_tailnet_url_absent_not_fabricated_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_tailnet_url_absent_not_fabricated"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_tree_sync_restart_diagnoses_on_failure_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_tree_sync_restart_diagnoses_on_failure_deployment_spec_srv1.dag deleted file mode 100644 index db90bbea0d1..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_emit_witness_tree_sync_restart_diagnoses_on_failure_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_emit_witness_tree_sync_restart_diagnoses_on_failure_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_emit_witness_tree_sync_restart_diagnoses_on_failure_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.emit", "witness_tree_sync_restart_diagnoses_on_failure"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_intent_witness_readback_requires_service_ready_gate_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_intent_witness_readback_requires_service_ready_gate_deployment_spec_srv1.dag deleted file mode 100644 index 33f98a4221c..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_intent_witness_readback_requires_service_ready_gate_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_intent_witness_readback_requires_service_ready_gate_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_intent_witness_readback_requires_service_ready_gate_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.intent", "witness_readback_requires_service_ready_gate"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_intent_witness_service_ready_gate_is_required_on_readback_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_intent_witness_service_ready_gate_is_required_on_readback_deployment_spec_srv1.dag deleted file mode 100644 index ed4a107bb6d..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_intent_witness_service_ready_gate_is_required_on_readback_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_intent_witness_service_ready_gate_is_required_on_readback_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_intent_witness_service_ready_gate_is_required_on_readback_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.intent", "witness_service_ready_gate_is_required_on_readback"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_readiness_witness_bounded_poll_one_iteration_composes_probe_and_modeled_sleep_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_readiness_witness_bounded_poll_one_iteration_composes_probe_and_modeled_sleep_deployment_spec_srv1.dag deleted file mode 100644 index 882b6813a4e..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_readiness_witness_bounded_poll_one_iteration_composes_probe_and_modeled_sleep_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_readiness_witness_bounded_poll_one_iteration_composes_probe_and_modeled_sleep_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_readiness_witness_bounded_poll_one_iteration_composes_probe_and_modeled_sleep_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.readiness", "witness_bounded_poll_one_iteration_composes_probe_and_modeled_sleep"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_readiness_witness_red_control_readiness_never_ready_refuses_at_poll_bound_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_readiness_witness_red_control_readiness_never_ready_refuses_at_poll_bound_deployment_spec_srv1.dag deleted file mode 100644 index 6b48fddc054..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_readiness_witness_red_control_readiness_never_ready_refuses_at_poll_bound_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_readiness_witness_red_control_readiness_never_ready_refuses_at_poll_bound_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_readiness_witness_red_control_readiness_never_ready_refuses_at_poll_bound_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.readiness", "witness_red_control_readiness_never_ready_refuses_at_poll_bound"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_readiness_witness_transport_get_probe_over_ssh_does_not_ground_mock_stdout_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_readiness_witness_transport_get_probe_over_ssh_does_not_ground_mock_stdout_deployment_spec_srv1.dag deleted file mode 100644 index 3a728a7076d..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_readiness_witness_transport_get_probe_over_ssh_does_not_ground_mock_stdout_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_readiness_witness_transport_get_probe_over_ssh_does_not_ground_mock_stdout_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_readiness_witness_transport_get_probe_over_ssh_does_not_ground_mock_stdout_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.readiness", "witness_transport_get_probe_over_ssh_does_not_ground_mock_stdout"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_readiness_witness_transport_probe_targets_localhost_healthz_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_readiness_witness_transport_probe_targets_localhost_healthz_deployment_spec_srv1.dag deleted file mode 100644 index 544d9d52080..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_readiness_witness_transport_probe_targets_localhost_healthz_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_readiness_witness_transport_probe_targets_localhost_healthz_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_readiness_witness_transport_probe_targets_localhost_healthz_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy.readiness", "witness_transport_probe_targets_localhost_healthz"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_unit_emission_oracle_witness_live_spec_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_unit_emission_oracle_witness_live_spec_deployment_spec_srv1.dag deleted file mode 100644 index 4cb55353d83..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_live_deploy_unit_emission_oracle_witness_live_spec_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_live_deploy_unit_emission_oracle_witness_live_spec_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_live_deploy_unit_emission_oracle_witness_live_spec_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.live_deploy_unit_emission_oracle_witness", "live_spec"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_admitted_operands_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_admitted_operands_deployment_spec_srv1.dag deleted file mode 100644 index 47cca7a6577..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_admitted_operands_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_repository_convergence_placement_witness_test_admitted_operands_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_repository_convergence_placement_witness_test_admitted_operands_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.repository_convergence_placement_witness_test", "admitted_operands"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_operands_refused_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_operands_refused_deployment_spec_srv1.dag deleted file mode 100644 index dc151d71aec..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_operands_refused_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_repository_convergence_placement_witness_test_operands_refused_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_repository_convergence_placement_witness_test_operands_refused_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.repository_convergence_placement_witness_test", "operands_refused"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_srv1_repo_root_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_srv1_repo_root_deployment_spec_srv1.dag deleted file mode 100644 index 6a44283cc5d..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_srv1_repo_root_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_repository_convergence_placement_witness_test_srv1_repo_root_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_repository_convergence_placement_witness_test_srv1_repo_root_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.repository_convergence_placement_witness_test", "srv1_repo_root"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_srv1_service_user_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_srv1_service_user_deployment_spec_srv1.dag deleted file mode 100644 index 71ed9b5c4fa..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_srv1_service_user_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_repository_convergence_placement_witness_test_srv1_service_user_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_repository_convergence_placement_witness_test_srv1_service_user_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.repository_convergence_placement_witness_test", "srv1_service_user"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_srv1_unit_text_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_srv1_unit_text_deployment_spec_srv1.dag deleted file mode 100644 index bb289ccc48b..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_srv1_unit_text_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_repository_convergence_placement_witness_test_srv1_unit_text_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_repository_convergence_placement_witness_test_srv1_unit_text_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.repository_convergence_placement_witness_test", "srv1_unit_text"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_the_unit_runs_the_admitted_binary_over_the_runner_checkout_corpus_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_the_unit_runs_the_admitted_binary_over_the_runner_checkout_corpus_deployment_spec_srv1.dag deleted file mode 100644 index 84e8b360f9c..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_repository_convergence_placement_witness_test_the_unit_runs_the_admitted_binary_over_the_runner_checkout_corpus_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_repository_convergence_placement_witness_test_the_unit_runs_the_admitted_binary_over_the_runner_checkout_corpus_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_repository_convergence_placement_witness_test_the_unit_runs_the_admitted_binary_over_the_runner_checkout_corpus_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.repository_convergence_placement_witness_test", "the_unit_runs_the_admitted_binary_over_the_runner_checkout_corpus"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_roadmap_publication_helper_witness_live_spec_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_roadmap_publication_helper_witness_live_spec_deployment_spec_srv1.dag deleted file mode 100644 index 752650bebc5..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_roadmap_publication_helper_witness_live_spec_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_roadmap_publication_helper_witness_live_spec_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_roadmap_publication_helper_witness_live_spec_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.roadmap_publication_helper_witness", "live_spec"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/namespace/transition_admission/test_claim_shell_exec_run_argv_embed_witness_witness_apply_script_stays_under_argv_embed_budget_deployment_spec_srv1.dag b/dag/gunbc/namespace/transition_admission/test_claim_shell_exec_run_argv_embed_witness_witness_apply_script_stays_under_argv_embed_budget_deployment_spec_srv1.dag deleted file mode 100644 index cfda1f48ac4..00000000000 --- a/dag/gunbc/namespace/transition_admission/test_claim_shell_exec_run_argv_embed_witness_witness_apply_script_stays_under_argv_embed_budget_deployment_spec_srv1.dag +++ /dev/null @@ -1,19 +0,0 @@ -module gunbc.namespace.transition_admission.test_claim_shell_exec_run_argv_embed_witness_witness_apply_script_stays_under_argv_embed_budget_deployment_spec_srv1 - -import std.types { NonEmptyStr, List } -import std.integer { UInt32 } -import std.decl_ref { decl_ref } -import gunbc.compiler_frontend_program_interlock { TargetChanged } -import gunbc.namespace.transition_admission { TransitionAdmission, Binding, NotAuthored } - -data test_claim_shell_exec_run_argv_embed_witness_witness_apply_script_stays_under_argv_embed_budget_deployment_spec_srv1: TransitionAdmission = TransitionAdmission { - label: "CONVERGENCE-ONE C2 deployment_spec_srv1 home gunbc.live_deploy.desired" as NonEmptyStr, - subject: Binding { - enclosing: decl_ref("test.claim.shell_exec_run_argv_embed_witness", "witness_apply_script_stays_under_argv_embed_budget"), - spelling: "deployment_spec_srv1" as NonEmptyStr, - expected_candidates: [decl_ref("gunbc.live_deploy.desired", "deployment_spec_srv1")], - }, - disposition: TargetChanged, - deletion_follow_up: NotAuthored, - owner_pull_request: 11425 as UInt32, -} diff --git a/dag/gunbc/product/capacity/event_chain.dag b/dag/gunbc/product/capacity/event_chain.dag index 8f22bae7878..7afb6fb52a2 100644 --- a/dag/gunbc/product/capacity/event_chain.dag +++ b/dag/gunbc/product/capacity/event_chain.dag @@ -34,6 +34,15 @@ type ChainEnvelope

{ event: ChainEvent

} +// WHAT A PARTITION'S BYTES DECODE TO, for any payload. The log stores one object per event and +// reads it back through the payload's own codec; this is the codec's answer, and it is generic +// because the log is: a second decode result per payload type would re-spell this arm pair once +// per partition kind. Undecodable is a typed refusal carried up to the reader, never a skipped +// event. +type EventDecode

+ = EventDecoded { event: ChainEvent

} + | EventUndecodable { reason: String } + // The head a writer believes the partition is at. Absent is a real value: the first event of a // partition is admitted against an absent head, and a writer that observed absence while another // wrote first is stale exactly like any other. diff --git a/dag/gunbc/product/capacity/event_json.dag b/dag/gunbc/product/capacity/event_json.dag new file mode 100644 index 00000000000..8adf94fbf86 --- /dev/null +++ b/dag/gunbc/product/capacity/event_json.dag @@ -0,0 +1,111 @@ +module product.capacity.event_json + +import std.types { String, NonEmptyStr, List } +import std.nat { Nat } +import v2.std.optional { Present, Absent } +import extdeps.languages.json.emit { JsonValue, JsonString, JsonNumber, JsonKeyValue, json_object, json_kv, json_string, json_int, serialize_json } +import extdeps.languages.json.parse { + parse_json_document, JsonDocumentParsed, JsonDocumentUnreadable, json_document_gap_text, + json_object_unique_member, JsonMemberFound, +} +import product.capacity.event_chain { PartitionId, EventId, ChainEvent, EventDecode, EventDecoded, EventUndecodable } + +// ── THE ENVELOPE ON THE WIRE, ONCE, FOR EVERY PARTITION KIND ──────────────────────────────────── +// +// A chain event is an envelope -- schema, partition, parent, recorded_at, actor -- around a +// payload the partition kind owns. The pool events were the first kind and their codec spelled +// the envelope inline; the pair-serving authority partition (gunbc.spark.pair_serving_authority_log) +// is the second, and a second inline spelling would be the envelope written twice with nothing +// keeping the two agreeing (DESIGN §2). So the envelope is encoded and decoded HERE for any +// payload, and a kind supplies only its schema word, its kind word and its members -- the three +// things that are actually about it. +// +// THE WIRE IS THE EVENT'S CANONICAL TEXT AND NOTHING ELSE. The id is not inside it: the store's +// content address of these bytes IS the id, so carrying it inside would make the bytes depend on +// their own hash. + +fn chain_event_json

(schema: String, e: ChainEvent

, kind: String, members: List) -> JsonValue { + json_object(members: concat([ + json_kv(key: "schema", value: json_string(s: schema)), + json_kv(key: "partition", value: json_string(s: e.partition as String)), + json_kv(key: "parent", value: json_string(s: match e.parent { Present { value: p } => p as String Absent => "" })), + json_kv(key: "recorded_at", value: json_int(n: e.recorded_at)), + json_kv(key: "actor", value: json_string(s: e.actor as String)), + json_kv(key: "kind", value: json_string(s: kind)), + ], members)) +} + +fn chain_event_wire_text

(schema: String, e: ChainEvent

, kind: String, members: List) -> String { + serialize_json(v: chain_event_json(schema: schema, e: e, kind: kind, members: members)) +} + +fn member_string(doc: JsonValue, key: String) -> String? { + match json_object_unique_member(v: doc, key: key) { + JsonMemberFound { value: JsonString { value: s } } => Present { value: s } + _ => none + } +} + +fn member_nonempty(doc: JsonValue, key: String) -> NonEmptyStr? { + match member_string(doc: doc, key: key) { + Present { value: s } => if s == "" { none } else { Present { value: s as NonEmptyStr } } + Absent => none + } +} + +fn member_nat(doc: JsonValue, key: String) -> Nat? { + match json_object_unique_member(v: doc, key: key) { + JsonMemberFound { value: JsonNumber { lexeme: lex } } => + match parse_int(s: lex as String) { + Present { value: n } => if n < 0 { none } else { Present { value: n } } + Absent => none + } + _ => none + } +} + +// THE DECODE, generic in the payload: the envelope is read here and the kind word and document are +// handed to the payload's own decoder, which answers a payload or nothing. A schema that is not +// this kind's, a missing envelope member, or a payload that did not decode are each a typed +// refusal naming what was missing -- never a skipped event. +fn chain_event_decode

(text: String, schema: String, kind_decode: fn(JsonValue, String) -> P?) -> EventDecode

{ + match parse_json_document(s: text) { + JsonDocumentUnreadable { gap } => EventUndecodable { reason: join(["not JSON: ", json_document_gap_text(gap: gap)], "") } + JsonDocumentParsed { value: doc } => + match member_string(doc: doc, key: "schema") { + Absent => EventUndecodable { reason: "schema missing" } + Present { value: s } => + if s != schema { + EventUndecodable { reason: join(["schema ", s, " is not ", schema], "") } + } else { + match member_nonempty(doc: doc, key: "partition") { + Absent => EventUndecodable { reason: "partition missing" } + Present { value: part } => + match member_nat(doc: doc, key: "recorded_at") { + Absent => EventUndecodable { reason: "recorded_at missing or not a non-negative integer" } + Present { value: at } => + match member_nonempty(doc: doc, key: "actor") { + Absent => EventUndecodable { reason: "actor missing" } + Present { value: actor } => + match member_string(doc: doc, key: "kind") { + Absent => EventUndecodable { reason: "kind missing" } + Present { value: kind } => + match kind_decode(doc, kind) { + Absent => EventUndecodable { reason: join(["kind ", kind, " did not decode"], "") } + Present { value: payload } => + EventDecoded { event: ChainEvent { + partition: (part as String) as PartitionId, + parent: match member_string(doc: doc, key: "parent") { Present { value: p } => if p == "" { none } else { Present { value: p as EventId } } Absent => none }, + recorded_at: at, + actor: actor, + payload: payload, + } } + } + } + } + } + } + } + } + } +} diff --git a/dag/gunbc/product/capacity/pool_events.dag b/dag/gunbc/product/capacity/pool_events.dag index 265c2bcae5e..a7c765f7c2c 100644 --- a/dag/gunbc/product/capacity/pool_events.dag +++ b/dag/gunbc/product/capacity/pool_events.dag @@ -3,11 +3,8 @@ module product.capacity.pool_events import std.types { String, Bool, Int, NonEmptyStr, List, EpochSecs } import std.nat { Nat } import std.measure { Measure } -import extdeps.languages.json.emit { JsonValue, JsonString, JsonNumber, JsonKeyValue, json_object, json_kv, json_string, json_int, serialize_json } -import extdeps.languages.json.parse { - parse_json_document, JsonDocumentParsed, JsonDocumentUnreadable, json_document_gap_text, - json_object_unique_member, JsonMemberFound, -} +import extdeps.languages.json.emit { JsonValue, JsonKeyValue, json_kv, json_string, json_int } +import product.capacity.event_json { chain_event_wire_text, chain_event_decode, member_nonempty, member_nat } import product.capacity.pool { Pool, PoolOutcome, PoolAdvanced, PoolRefused, PoolRefusal, LedgerRefusal, PoolReading, PoolRead, PoolReadingRefused, @@ -16,7 +13,7 @@ import product.capacity.pool { import extdeps.accounting.encumbrance { EncumbranceRefusal, ExceedsAppropriation } import product.capacity.event_chain { PartitionId, EventId, ChainEvent, ChainEnvelope, HeadExpectation, HeadAbsent, HeadAt, - AppendDecision, AppendAdmitted, AppendStale, + AppendDecision, AppendAdmitted, AppendStale, EventDecode, EventDecoded, EventUndecodable, } import product.capacity.lease { LeasePolicy, LeaseGrant, lease_grant, lease_fence_of } @@ -75,51 +72,8 @@ fn pool_event_kind_members(e: PoolEvent) -> List { } } -// THE WIRE IS THE EVENT'S CANONICAL TEXT AND NOTHING ELSE. The id is not inside it: the store's -// content address of these bytes IS the id, so carrying it inside would make the bytes depend on -// their own hash. -fn pool_event_canonical_json(e: ChainEvent) -> JsonValue { - json_object(members: concat([ - json_kv(key: "schema", value: json_string(s: pool_event_schema)), - json_kv(key: "partition", value: json_string(s: e.partition as String)), - json_kv(key: "parent", value: json_string(s: match e.parent { Present { value: p } => p as String Absent => "" })), - json_kv(key: "recorded_at", value: json_int(n: e.recorded_at)), - json_kv(key: "actor", value: json_string(s: e.actor as String)), - json_kv(key: "kind", value: json_string(s: pool_event_kind_word(e: e.payload))), - ], pool_event_kind_members(e: e.payload))) -} - fn pool_event_wire_text(event: ChainEvent) -> String { - serialize_json(v: pool_event_canonical_json(e: event)) -} - -type PoolEventDecode - = PoolEventDecoded { event: ChainEvent } - | PoolEventUndecodable { reason: String } - -fn member_string(doc: JsonValue, key: String) -> String? { - match json_object_unique_member(v: doc, key: key) { - JsonMemberFound { value: JsonString { value: s } } => Present { value: s } - _ => none - } -} - -fn member_nonempty(doc: JsonValue, key: String) -> NonEmptyStr? { - match member_string(doc: doc, key: key) { - Present { value: s } => if s == "" { none } else { Present { value: s as NonEmptyStr } } - Absent => none - } -} - -fn member_nat(doc: JsonValue, key: String) -> Nat? { - match json_object_unique_member(v: doc, key: key) { - JsonMemberFound { value: JsonNumber { lexeme: lex } } => - match parse_int(s: lex as String) { - Present { value: n } => if n < 0 { none } else { Present { value: n } } - Absent => none - } - _ => none - } + chain_event_wire_text(schema: pool_event_schema, e: event, kind: pool_event_kind_word(e: event.payload), members: pool_event_kind_members(e: event.payload)) } fn pool_event_kind_decode(doc: JsonValue, word: String) -> PoolEvent? { @@ -175,49 +129,10 @@ fn pool_event_kind_decode(doc: JsonValue, word: String) -> PoolEvent? { } } -fn pool_event_decode(text: String) -> PoolEventDecode { - match parse_json_document(s: text) { - JsonDocumentUnreadable { gap } => PoolEventUndecodable { reason: join(["not JSON: ", json_document_gap_text(gap: gap)], "") } - JsonDocumentParsed { value: doc } => - match member_string(doc: doc, key: "schema") { - Present { value: s } => - if s != pool_event_schema { - PoolEventUndecodable { reason: join(["schema ", s, " is not ", pool_event_schema], "") } - } else { - match member_nonempty(doc: doc, key: "partition") { - Absent => PoolEventUndecodable { reason: "partition missing" } - Present { value: part } => - match member_nat(doc: doc, key: "recorded_at") { - Absent => PoolEventUndecodable { reason: "recorded_at missing or not a non-negative integer" } - Present { value: at } => - match member_nonempty(doc: doc, key: "actor") { - Absent => PoolEventUndecodable { reason: "actor missing" } - Present { value: actor } => - match member_string(doc: doc, key: "kind") { - Absent => PoolEventUndecodable { reason: "kind missing" } - Present { value: kind } => - match pool_event_kind_decode(doc: doc, word: kind) { - Absent => PoolEventUndecodable { reason: join(["kind ", kind, " did not decode"], "") } - Present { value: payload } => - PoolEventDecoded { event: ChainEvent { - partition: (part as String) as PartitionId, - parent: match member_string(doc: doc, key: "parent") { Present { value: p } => if p == "" { none } else { Present { value: p as EventId } } Absent => none }, - recorded_at: at, - actor: actor, - payload: payload, - } } - } - } - } - } - } - } - Absent => PoolEventUndecodable { reason: "schema missing" } - } - } +fn pool_event_decode(text: String) -> EventDecode { + chain_event_decode(text: text, schema: pool_event_schema, kind_decode: fn(doc, word) { pool_event_kind_decode(doc: doc, word: word) }) } -// APPLYING ONE EVENT IS THE POOL TRANSITION IT NAMES, at the instant the chain recorded it. fn pool_apply_event(pool: Pool, env: ChainEnvelope) -> PoolOutcome { let at = env.event.recorded_at match env.event.payload { diff --git a/dag/gunbc/spark/fabric_switch_observed.dag b/dag/gunbc/spark/fabric_switch_observed.dag index 847b313deda..f278ef93d40 100644 --- a/dag/gunbc/spark/fabric_switch_observed.dag +++ b/dag/gunbc/spark/fabric_switch_observed.dag @@ -180,6 +180,13 @@ fn fabric_group_wire(g: FabricGroup) -> NonEmptyStr { } } +// The exact inverse of fabric_group_wire; a word naming no group is no group. +fn parse_fabric_group(wire: String) -> FabricGroup? { + if wire == "group-a" { Present { value: FabricGroupA } } + else if wire == "group-b" { Present { value: FabricGroupB } } + else { none } +} + fn fabric_group_hosts(g: FabricGroup) -> List { map(filter(fabric_lane_observations, o => o.cage == fabric_group_cage(g: g)), o => o.host) } diff --git a/dag/gunbc/spark/pair_serving_apply.dag b/dag/gunbc/spark/pair_serving_apply.dag index 6176f0c06d7..8b450c58f1b 100644 --- a/dag/gunbc/spark/pair_serving_apply.dag +++ b/dag/gunbc/spark/pair_serving_apply.dag @@ -15,7 +15,10 @@ import gunbc.fleet_bootstrap_principal_session { } import extdeps.docker.images.sparkrun_vllm_ds4_gb10 { gunbc_spark_pair_runtime_dockerfile } import gunbc.spark.fabric_switch_observed { FabricGroup } -import gunbc.spark.pair_serving_authority { PairServingGroupAuthority, pair_serving_apply_admits, pair_serving_authority_for } +import gunbc.spark.pair_serving_authority { PairServingGroupAuthority, pair_serving_apply_admits } +import gunbc.spark.pair_serving_authority_log { + CurrentAuthority, CurrentAuthorityRead, CurrentAuthorityUnread, current_pair_serving_authorities, current_authority_for, current_authority_wire, +} import gunbc.auth.materialized_secret { with_materialized_ssh_key_file, MaterializedSshKeyFileBracketCompleted, MaterializedSshKeyFileBracketRefused } import gunbc.clock_read { clock_now_probed_at, probed_at_word } import gunbc.spark.fabric_reach { SparkReachPath, ReachManagementLan, ReachFabricRail, spark_reach_path_wire, spark_reach_endpoint, ExecutorReach, ExecutorReachKnown, ExecutorReachUnknown, observe_executor_reach } @@ -194,8 +197,22 @@ fn spark_pair_apply_plan_under(r: SparkPairRealization, authority: PairServingGr } } -fn spark_pair_apply_plan(r: SparkPairRealization) -> SparkPairApplyPlan { - spark_pair_apply_plan_under(r: r, authority: pair_serving_authority_for(group: spark_pair_realization_group(r: r))) +// THE LIVE AUTHORITY IS THE LOG'S, NOT THE SOURCE ROW'S. gunbc.spark.pair_serving_authority_log +// folds the row through every recorded transition, so a group a transaction has suspended is +// suspended HERE, from the transaction's own tree. A group whose authority could not be read is +// refused with the read's cause -- never planned on the row it rests on -- and a group the roster +// does not name at all is refused as having no authority (absence is not permission). +fn spark_pair_apply_plan_current(r: SparkPairRealization, current: List) -> SparkPairApplyPlan { + match current_authority_for(current: current, group: spark_pair_realization_group(r: r)) { + Absent => spark_pair_apply_plan_under(r: r, authority: none) + Present { value: c } => + match c { + CurrentAuthorityUnread { group: _, step: _, reason: _ } => + SparkPairApplyRefused { cause: join(["the serving authority could not be read, so nothing is converged: ", current_authority_wire(c: c)], "") } + CurrentAuthorityRead { authority: a, head: _, generation: _ } => + spark_pair_apply_plan_under(r: r, authority: Present { value: a }) + } + } } fn spark_pair_realization_group(r: SparkPairRealization) -> FabricGroup { @@ -205,11 +222,15 @@ fn spark_pair_realization_group(r: SparkPairRealization) -> FabricGroup { } } -// EVERY PROMOTED GROUP IS PLANNED, IN ROSTER ORDER. One refusal anywhere refuses the whole apply: -// a converge that brought up group A while silently skipping group B would report success for a -// desired state it did not reach. -fn spark_pair_apply_plans() -> List { - map(spark_pair_realizations(), r => spark_pair_apply_plan(r: r)) +// EVERY PROMOTED GROUP IS PLANNED, IN ROSTER ORDER, UNDER THE AUTHORITY THE EXECUTOR READS. One +// refusal anywhere refuses the whole apply: a converge that brought up group A while silently +// skipping group B would report success for a desired state it did not reach. +fn spark_pair_apply_plans_current(current: List) -> List { + map(spark_pair_realizations(), r => spark_pair_apply_plan_current(r: r, current: current)) +} + +fn spark_pair_apply_plans(executor: String) -> List { + spark_pair_apply_plans_current(current: current_pair_serving_authorities(short_hostname: executor)) } fn spark_pair_apply_plan_refusals(plans: List) -> List { @@ -293,16 +314,16 @@ fn spark_pair_serving_apply_wet() -> ProcessExit uses net: Network { let now = clock_now_probed_at() - let plans = spark_pair_apply_plans() - let refusals = spark_pair_apply_plan_refusals(plans: plans) - if length(plans) == 0 { - exit_failure(reason: "spark_pair_serving_apply: no group is promoted to pair serving") - } else if length(refusals) != 0 { - exit_failure(reason: join(["spark_pair_serving_apply: a group realization refused: ", join(refusals, "; ")], "")) - } else { - match observe_executor_reach() { - ExecutorReachUnknown { cause: c } => exit_failure(reason: join(["spark_pair_serving_apply: ", c], "")) - ExecutorReachKnown { short_hostname: executor, path: path } => + match observe_executor_reach() { + ExecutorReachUnknown { cause: c } => exit_failure(reason: join(["spark_pair_serving_apply: ", c], "")) + ExecutorReachKnown { short_hostname: executor, path: path } => { + let plans = spark_pair_apply_plans(executor: executor) + let refusals = spark_pair_apply_plan_refusals(plans: plans) + if length(plans) == 0 { + exit_failure(reason: "spark_pair_serving_apply: no group is promoted to pair serving") + } else if length(refusals) != 0 { + exit_failure(reason: join(["spark_pair_serving_apply: a group realization refused: ", join(refusals, "; ")], "")) + } else { match read_bootstrap_credential() { BootstrapCredentialNotMaterialized { cause: c } => exit_failure(reason: c as String) BootstrapCredentialReady { secret: administrator } => @@ -351,3 +372,4 @@ fn spark_pair_serving_apply_wet() -> ProcessExit } } } +} diff --git a/dag/gunbc/spark/pair_serving_authority_log.dag b/dag/gunbc/spark/pair_serving_authority_log.dag new file mode 100644 index 00000000000..227a13d6c87 --- /dev/null +++ b/dag/gunbc/spark/pair_serving_authority_log.dag @@ -0,0 +1,440 @@ +module gunbc.spark.pair_serving_authority_log + +import std.types { String, Bool, Int, NonEmptyStr, List, EpochSecs } +import std.nat { Nat } +import v2.std.optional { Present, Absent } +import std.content_hash { ContentHash, serialize_content_hash, parse_content_hash } +import std.temporal_effect { + HeldLease, LeaseEpoch, held_lease, held_lease_observed_state_wire, parse_held_lease_observed_state, +} +import extdeps.languages.json.emit { JsonValue, JsonKeyValue, json_kv, json_string, json_int, json_object, serialize_json } +import product.capacity.event_chain { + PartitionId, EventId, ChainEvent, ChainEnvelope, HeadExpectation, HeadAbsent, HeadAt, + EventDecode, ChainWalk, ChainWalked, ChainIncomplete, ChainBudgetExhausted, +} +import product.capacity.event_json { chain_event_wire_text, chain_event_decode, member_string, member_nonempty, member_nat } +import gunbc.fabric_event_log { + EventLogLayout, PartitionRead, PartitionReadOk, PartitionReadRefused, event_log_read_partition_with, + EventAppend, EventAppended, EventAppendStale, EventAppendRefused, event_log_append_with, +} +import gunbc.fabric_event_log_host { HostLayoutResolved, HostLayoutRefused, event_log_layout_for_host } +import gunbc.spark.fabric_switch_observed { FabricGroup, fabric_group_wire, parse_fabric_group } +import gunbc.spark.pair_serving_authority { + PairServingGroupAuthority, PairServingActive, SuspensionPendingReconciliation, SuspendedForAuthorizedSuccessor, FencedRefusal, ReleasedToFleet, + PairRealizationIdentity, PairRealizationKeyed, PairRealizationUnestablished, + pair_serving_authority_group, pair_serving_authority_for, spark_pair_serving_authorities, +} + +// ── THE AUTHORITY THAT CAN CHANGE WITHOUT A COMMIT ───────────────────────────────────────────── +// +// gunbc.spark.pair_serving_authority spark_pair_serving_authorities is source data: it says which +// groups we CLAIM and what each group's RESTING authority is, and it is edited by a pull request. +// A replacement transaction (docs/plans/dsv41-cut-d-redesign.md, D0) has to move a group from +// Active to SuspensionPendingReconciliation to SuspendedForAuthorizedSuccessor and back, under a +// lease, between two readings of the same fleet -- and a pure function returning the next state +// changes nothing any consumer reads. The state a transaction is in has to be WRITTEN somewhere +// every effectful consumer reads, and written by a compare-and-set, so two transactions cannot +// both believe they hold the group. +// +// THE STORE IS THE FABRIC EVENT LOG, ON ITS OWN PARTITION PER GROUP. DESIGN §3b puts serving-side +// occupancy on the event chain (a termed LeaseGrant settled by fabric_seat_acquire over a +// partition head), and this is the same linearization fact about a different subject: one +// partition `pair-serving-authority/`, one event per transition, the head advanced by a +// leased push. gunbc.fabric_event_log was generic in nothing but its seats until this module; it +// now reads and appends for any payload, and this module supplies the authority's codec. +// +// CLAIM AND TRANSACTION STATE ARE TWO FACTS, AND THIS IS WHERE THE SPLIT IS DECIDED. The source row +// stays the claim and the resting authority: membership (the desired roster, host commitment) is +// pure and reads it, and the design says suspension KEEPS the claim, so membership does not move +// during a transaction. The log carries the open transaction's state, folded FROM the resting +// authority: an empty partition means no transition was ever recorded and the authored resting +// state governs -- that is an authored fact, not a default -- while an UNREADABLE partition +// refuses, because a consumer that fell back to the row when the log could not be read would act +// on a state a transaction may have left behind. Absence is authored; unreadability is never +// permission. +// +// A TRANSITION NAMES THE STATE IT LEAVES, AND THE FOLD CHECKS IT. Every event carries the previous +// authority beside the next one, and the fold refuses a chain whose event claims to leave a state +// that was not current -- so a transaction that decided on a stale reading and still won the +// push (impossible under the head lease, but the fold does not assume the push) is a typed refusal +// at the event that lied, never a silently rewritten history. + +data pair_authority_event_schema: String = "pair-serving-authority-event/v1" +data pair_authority_partition_prefix: String = "pair-serving-authority/" + +fn pair_authority_partition(group: FabricGroup) -> PartitionId { + join([pair_authority_partition_prefix, fabric_group_wire(g: group) as String], "") as PartitionId +} + +type PairAuthorityEvent + = AuthorityTransitioned { + previous: PairServingGroupAuthority + next: PairServingGroupAuthority + transaction: NonEmptyStr + } + +// ── THE CODEC ────────────────────────────────────────────────────────────────────────────────── +// +// Flat members with a prefix per side (prev_ / next_), one state word, and only the fields the +// arm carries. The decode is the exact inverse and refuses a document whose fields do not inhabit +// the arm its state word names. + +fn kv(prefix: String, key: String, value: String) -> JsonKeyValue { + json_kv(key: join([prefix, key], ""), value: json_string(s: value)) +} + +fn realization_members(prefix: String, r: PairRealizationIdentity) -> List { + match r { + PairRealizationKeyed { key: k } => [kv(prefix: prefix, key: "key", value: serialize_content_hash(hash: k) as String)] + PairRealizationUnestablished { obligation: o } => [kv(prefix: prefix, key: "obligation", value: o as String)] + } +} + +fn lease_members(prefix: String, l: HeldLease) -> List { + [ + kv(prefix: prefix, key: "lease_key", value: l.epoch.lease_key as String), + kv(prefix: prefix, key: "lease_resource", value: serialize_content_hash(hash: l.epoch.resource_fingerprint) as String), + kv(prefix: prefix, key: "lease_owner", value: serialize_content_hash(hash: l.epoch.owner_fingerprint) as String), + json_kv(key: join([prefix, "lease_generation"], ""), value: json_int(n: l.epoch.generation)), + kv(prefix: prefix, key: "lease_observed", value: held_lease_observed_state_wire(observed: l.observed) as String), + ] +} + +fn authority_state_word(a: PairServingGroupAuthority) -> String { + match a { + PairServingActive { group: _, exact_realization: _ } => "active" + SuspensionPendingReconciliation { group: _, transaction: _, lease: _ } => "suspension-pending-reconciliation" + SuspendedForAuthorizedSuccessor { group: _, authorization: _, exact_candidate_realization: _, lease: _, cleanup: _ } => "suspended-for-authorized-successor" + FencedRefusal { group: _, cause: _, disposition_authority: _ } => "fenced-refusal" + ReleasedToFleet { group: _, release_receipt: _ } => "released-to-fleet" + } +} + +fn authority_members(prefix: String, a: PairServingGroupAuthority) -> List { + let head = [ + kv(prefix: prefix, key: "state", value: authority_state_word(a: a)), + kv(prefix: prefix, key: "group", value: fabric_group_wire(g: pair_serving_authority_group(a: a)) as String), + ] + match a { + PairServingActive { group: _, exact_realization: r } => + concat(head, realization_members(prefix: join([prefix, "realization_"], ""), r: r)) + SuspensionPendingReconciliation { group: _, transaction: t, lease: l } => + concat(head, concat([kv(prefix: prefix, key: "transaction", value: t as String)], lease_members(prefix: prefix, l: l))) + SuspendedForAuthorizedSuccessor { group: _, authorization: au, exact_candidate_realization: r, lease: l, cleanup: c } => + concat(head, concat( + [kv(prefix: prefix, key: "authorization", value: au as String), kv(prefix: prefix, key: "cleanup", value: c as String)], + concat(realization_members(prefix: join([prefix, "candidate_"], ""), r: r), lease_members(prefix: prefix, l: l)), + )) + FencedRefusal { group: _, cause: c, disposition_authority: d } => + concat(head, [kv(prefix: prefix, key: "cause", value: c as String), kv(prefix: prefix, key: "disposition_authority", value: d as String)]) + ReleasedToFleet { group: _, release_receipt: r } => + concat(head, [kv(prefix: prefix, key: "release_receipt", value: serialize_content_hash(hash: r) as String)]) + } +} + +// THE ONE EQUALITY. Two authorities are the same state exactly when their canonical members +// serialize identically; there is no second, hand-written field-by-field comparison to drift. +fn authority_wire(a: PairServingGroupAuthority) -> String { + serialize_json(v: json_object(members: authority_members(prefix: "", a: a))) +} + +fn authority_eq(a: PairServingGroupAuthority, b: PairServingGroupAuthority) -> Bool { + authority_wire(a: a) == authority_wire(a: b) +} + +fn pair_authority_event_members(e: PairAuthorityEvent) -> List { + match e { + AuthorityTransitioned { previous: p, next: n, transaction: t } => + concat([kv(prefix: "", key: "transaction", value: t as String)], concat(authority_members(prefix: "prev_", a: p), authority_members(prefix: "next_", a: n))) + } +} + +fn pair_authority_event_wire_text(event: ChainEvent) -> String { + chain_event_wire_text(schema: pair_authority_event_schema, e: event, kind: "transitioned", members: pair_authority_event_members(e: event.payload)) +} + +fn member_hash(doc: JsonValue, key: String) -> ContentHash? { + match member_string(doc: doc, key: key) { + Absent => none + Present { value: s } => parse_content_hash(wire: s) + } +} + +fn realization_decode(doc: JsonValue, prefix: String) -> PairRealizationIdentity? { + match member_hash(doc: doc, key: join([prefix, "key"], "")) { + Present { value: k } => Present { value: PairRealizationKeyed { key: k } } + Absent => + match member_nonempty(doc: doc, key: join([prefix, "obligation"], "")) { + Present { value: o } => Present { value: PairRealizationUnestablished { obligation: o } } + Absent => none + } + } +} + +fn lease_decode(doc: JsonValue, prefix: String) -> HeldLease? { + match member_nonempty(doc: doc, key: join([prefix, "lease_key"], "")) { + Absent => none + Present { value: k } => + match member_hash(doc: doc, key: join([prefix, "lease_resource"], "")) { + Absent => none + Present { value: res } => + match member_hash(doc: doc, key: join([prefix, "lease_owner"], "")) { + Absent => none + Present { value: own } => + match member_nat(doc: doc, key: join([prefix, "lease_generation"], "")) { + Absent => none + Present { value: g } => + match member_string(doc: doc, key: join([prefix, "lease_observed"], "")) { + Absent => none + Present { value: ow } => + match parse_held_lease_observed_state(wire: ow) { + Absent => none + Present { value: obs } => + Present { value: held_lease(epoch: LeaseEpoch { lease_key: k, resource_fingerprint: res, owner_fingerprint: own, generation: g }, observed: obs) } + } + } + } + } + } + } +} + +fn authority_decode(doc: JsonValue, prefix: String) -> PairServingGroupAuthority? { + match member_string(doc: doc, key: join([prefix, "group"], "")) { + Absent => none + Present { value: gw } => + match parse_fabric_group(wire: gw) { + Absent => none + Present { value: g } => + match member_string(doc: doc, key: join([prefix, "state"], "")) { + Absent => none + Present { value: state } => + if state == "active" { + match realization_decode(doc: doc, prefix: join([prefix, "realization_"], "")) { + Absent => none + Present { value: r } => Present { value: PairServingActive { group: g, exact_realization: r } } + } + } else if state == "suspension-pending-reconciliation" { + match member_nonempty(doc: doc, key: join([prefix, "transaction"], "")) { + Absent => none + Present { value: t } => + match lease_decode(doc: doc, prefix: prefix) { + Absent => none + Present { value: l } => Present { value: SuspensionPendingReconciliation { group: g, transaction: t, lease: l } } + } + } + } else if state == "suspended-for-authorized-successor" { + match member_nonempty(doc: doc, key: join([prefix, "authorization"], "")) { + Absent => none + Present { value: au } => + match member_nonempty(doc: doc, key: join([prefix, "cleanup"], "")) { + Absent => none + Present { value: c } => + match realization_decode(doc: doc, prefix: join([prefix, "candidate_"], "")) { + Absent => none + Present { value: r } => + match lease_decode(doc: doc, prefix: prefix) { + Absent => none + Present { value: l } => + Present { value: SuspendedForAuthorizedSuccessor { group: g, authorization: au, exact_candidate_realization: r, lease: l, cleanup: c } } + } + } + } + } + } else if state == "fenced-refusal" { + match member_nonempty(doc: doc, key: join([prefix, "cause"], "")) { + Absent => none + Present { value: c } => + match member_nonempty(doc: doc, key: join([prefix, "disposition_authority"], "")) { + Absent => none + Present { value: d } => Present { value: FencedRefusal { group: g, cause: c, disposition_authority: d } } + } + } + } else if state == "released-to-fleet" { + match member_hash(doc: doc, key: join([prefix, "release_receipt"], "")) { + Absent => none + Present { value: r } => Present { value: ReleasedToFleet { group: g, release_receipt: r } } + } + } else { + none + } + } + } + } +} + +fn pair_authority_kind_decode(doc: JsonValue, word: String) -> PairAuthorityEvent? { + if word != "transitioned" { + none + } else { + match member_nonempty(doc: doc, key: "transaction") { + Absent => none + Present { value: t } => + match authority_decode(doc: doc, prefix: "prev_") { + Absent => none + Present { value: p } => + match authority_decode(doc: doc, prefix: "next_") { + Absent => none + Present { value: n } => Present { value: AuthorityTransitioned { previous: p, next: n, transaction: t } } + } + } + } + } +} + +fn pair_authority_event_decode(text: String) -> EventDecode { + chain_event_decode(text: text, schema: pair_authority_event_schema, kind_decode: fn(doc, word) { pair_authority_kind_decode(doc: doc, word: word) }) +} + +// ── THE FOLD ─────────────────────────────────────────────────────────────────────────────────── + +type AuthorityFold + = AuthorityFolded { current: PairServingGroupAuthority, generation: Nat } + | AuthorityFoldRefused { at_event: EventId, reason: String } + +fn authority_fold_step(acc: AuthorityFold, env: ChainEnvelope) -> AuthorityFold { + match acc { + AuthorityFoldRefused { at_event: _, reason: _ } => acc + AuthorityFolded { current: cur, generation: g } => + match env.event.payload { + AuthorityTransitioned { previous: p, next: n, transaction: _ } => + if !authority_eq(a: p, b: cur) { + AuthorityFoldRefused { at_event: env.id, reason: join(["the event leaves state ", authority_wire(a: p), " but the current state was ", authority_wire(a: cur)], "") } + } else if (fabric_group_wire(g: pair_serving_authority_group(a: n)) as String) != (fabric_group_wire(g: pair_serving_authority_group(a: cur)) as String) { + AuthorityFoldRefused { at_event: env.id, reason: "the event's next state names a different group than the partition's" } + } else { + AuthorityFolded { current: n, generation: g + 1 } + } + } + } +} + +// From the resting authority through every recorded transition, oldest first. Generation 0 is the +// resting state itself; each admitted transition adds one. +fn authority_fold(resting: PairServingGroupAuthority, oldest_first: List>) -> AuthorityFold { + fold(oldest_first, init: AuthorityFolded { current: resting, generation: 0 }, f: (acc, env) => authority_fold_step(acc: acc, env: env)) +} + +// ── THE READ ─────────────────────────────────────────────────────────────────────────────────── + +type CurrentAuthority + = CurrentAuthorityRead { authority: PairServingGroupAuthority, head: HeadExpectation, generation: Nat } + | CurrentAuthorityUnread { group: FabricGroup, step: String, reason: String } + +data pair_authority_read_budget: Nat = 4096 + +// THE CURRENT AUTHORITY OF A CLAIMED GROUP. A group with no resting row is not claimed and has no +// authority to read (absence is not permission, exactly as pair_serving_authority_for says); a +// claimed group's partition is read and folded from its resting row. Every failure to read is +// Unread with its step, and no arm answers the resting row when the log could not be read. +fn current_pair_serving_authority(layout: EventLogLayout, group: FabricGroup) -> CurrentAuthority { + match pair_serving_authority_for(group: group) { + Absent => CurrentAuthorityUnread { group: group, step: "claim", reason: "no authority row claims this group" } + Present { value: resting } => + match event_log_read_partition_with(layout: layout, partition: pair_authority_partition(group: group), budget: pair_authority_read_budget, decode: fn(text) { pair_authority_event_decode(text: text) }) { + PartitionReadRefused { step: s, reason: why } => CurrentAuthorityUnread { group: group, step: s, reason: why } + PartitionReadOk { head: head, walk: walk } => + match walk { + ChainIncomplete { missing: m, newest_first_so_far: _ } => + CurrentAuthorityUnread { group: group, step: "chain", reason: join(["partition chain is missing event ", m as String], "") } + ChainBudgetExhausted { at: a } => + CurrentAuthorityUnread { group: group, step: "chain", reason: join(["partition chain exceeded the read budget at ", a as String], "") } + ChainWalked { oldest_first: xs } => + match authority_fold(resting: resting, oldest_first: xs) { + AuthorityFoldRefused { at_event: e, reason: why } => + CurrentAuthorityUnread { group: group, step: "fold", reason: join(["event ", e as String, " refused: ", why], "") } + AuthorityFolded { current: cur, generation: g } => + CurrentAuthorityRead { authority: cur, head: head, generation: g } + } + } + } + } +} + +// THE ROSTER, AS AN EXECUTOR SEES IT. Every effectful consumer of the authority -- the apply seam, +// the capacity instrument, and the Cut D actuators to come -- asks this and never the source row: +// one read per claimed group, on the event log the executing host resolves. A host with no event +// log placement reads NOTHING, as one Unread per claimed group, so a consumer that folds these +// cannot mistake "could not read" for an empty roster. +fn current_pair_serving_authorities(short_hostname: String) -> List { + match event_log_layout_for_host(short_hostname: short_hostname) { + HostLayoutRefused { detail: d } => + map(spark_pair_serving_authorities, a => CurrentAuthorityUnread { group: pair_serving_authority_group(a: a), step: "layout", reason: d }) + HostLayoutResolved { layout: layout, executor: _ } => + map(spark_pair_serving_authorities, a => current_pair_serving_authority(layout: layout, group: pair_serving_authority_group(a: a))) + } +} + +fn current_authority_for(current: List, group: FabricGroup) -> CurrentAuthority? { + first(filter(current, c => (fabric_group_wire(g: current_authority_group(c: c)) as String) == (fabric_group_wire(g: group) as String))) +} + +fn current_authority_group(c: CurrentAuthority) -> FabricGroup { + match c { + CurrentAuthorityRead { authority: a, head: _, generation: _ } => pair_serving_authority_group(a: a) + CurrentAuthorityUnread { group: g, step: _, reason: _ } => g + } +} + +// ── THE TRANSITION ───────────────────────────────────────────────────────────────────────────── +// +// ONE COMPARE-AND-SET, NO RETRY. A seat re-folds and tries again on a stale head because a seat +// is fungible: whichever writer wins, the loser wants the same thing from the new state. An +// authority transition is not: it was decided against ONE observed state, and if that state moved +// the decision has to be re-made by the transaction, which may now refuse. So a stale append is +// returned to the caller with the state that is now current, and nothing here re-decides. + +type AuthorityTransition + = AuthorityTransitionAppended { id: EventId, generation: Nat, next: PairServingGroupAuthority } + | AuthorityTransitionStale { expected: PairServingGroupAuthority, current: PairServingGroupAuthority } + | AuthorityTransitionRefused { group: FabricGroup, step: String, reason: String } + +fn pair_serving_authority_transition( + layout: EventLogLayout, + group: FabricGroup, + expected: PairServingGroupAuthority, + next: PairServingGroupAuthority, + transaction: NonEmptyStr, + actor: NonEmptyStr, + at: EpochSecs, +) -> AuthorityTransition { + if (fabric_group_wire(g: pair_serving_authority_group(a: next)) as String) != (fabric_group_wire(g: group) as String) { + AuthorityTransitionRefused { group: group, step: "subject", reason: "the next authority names a different group than the transition" } + } else { + match current_pair_serving_authority(layout: layout, group: group) { + CurrentAuthorityUnread { group: g, step: s, reason: why } => AuthorityTransitionRefused { group: g, step: s, reason: why } + CurrentAuthorityRead { authority: cur, head: head, generation: g } => + if !authority_eq(a: cur, b: expected) { + AuthorityTransitionStale { expected: expected, current: cur } + } else { + let parent = match head { + HeadAbsent => none + HeadAt { id: h } => Present { value: h } + } + let event = ChainEvent { + partition: pair_authority_partition(group: group), + parent: parent, + recorded_at: at, + actor: actor, + payload: AuthorityTransitioned { previous: cur, next: next, transaction: transaction }, + } + match event_log_append_with(layout: layout, partition: pair_authority_partition(group: group), event: event, expected: head, encode: fn(e) { pair_authority_event_wire_text(event: e) }) { + EventAppendRefused { step: s, reason: why } => AuthorityTransitionRefused { group: group, step: s, reason: why } + EventAppendStale { expected: _, observed: _ } => + match current_pair_serving_authority(layout: layout, group: group) { + CurrentAuthorityUnread { group: g2, step: s, reason: why } => AuthorityTransitionRefused { group: g2, step: join(["stale/", s], ""), reason: why } + CurrentAuthorityRead { authority: now_cur, head: _, generation: _ } => AuthorityTransitionStale { expected: expected, current: now_cur } + } + EventAppended { id: h } => AuthorityTransitionAppended { id: h, generation: g + 1, next: next } + } + } + } + } +} + +fn current_authority_wire(c: CurrentAuthority) -> String { + match c { + CurrentAuthorityRead { authority: a, head: _, generation: g } => join(["generation ", to_string(g), ": ", authority_wire(a: a)], "") + CurrentAuthorityUnread { group: g, step: s, reason: why } => join([fabric_group_wire(g: g) as String, " authority unread at ", s, ": ", why], "") + } +} diff --git a/dag/std/content_hash.dag b/dag/std/content_hash.dag index d673482d38d..bd47cefae55 100644 --- a/dag/std/content_hash.dag +++ b/dag/std/content_hash.dag @@ -253,6 +253,47 @@ fn serialize_content_hash(hash: ContentHash) -> NonEmptyStr { } } +// THE INVERSE OF serialize_content_hash, AT THE SAME HOME. It stood in std.materialization_object +// as parse_recorded_store_key, named for one consumer; the pair-serving authority log is a second +// consumer of the same wire, so the inverse lives beside the grammar it inverts (DESIGN §4: one +// grammar read in both directions). The round-trip check is what makes it exact: a candidate that +// does not re-serialize to the text it was read from is not that text's hash. +fn parse_content_hash_candidate(wire: String) -> ContentHash? { + if starts_with(s: wire, prefix: "sha256:") { + match get(xs: split(s: wire, delimiter: "sha256:"), index: 1) { + Absent => none + Present { value: hex } => + match sha256_hex_digest(hex: hex) { + Absent => none + Present { value: d } => Present { value: as_content_hash_cryptographic(digest: d) } + } + } + } else if starts_with(s: wire, prefix: "sha512:") { + match get(xs: split(s: wire, delimiter: "sha512:"), index: 1) { + Absent => none + Present { value: hex } => + match sha512_hex_digest(hex: hex) { + Absent => none + Present { value: d } => Present { value: as_content_hash_sha512(digest: d) } + } + } + } else { + content_hash_from_structural_digest(digest: wire) + } +} + +fn parse_content_hash(wire: String) -> ContentHash? { + match parse_content_hash_candidate(wire: wire) { + Absent => none + Present { value: parsed } => + if (serialize_content_hash(hash: parsed) as String) == wire { + Present { value: parsed } + } else { + none + } + } +} + fn sha256_digest_wire_form(digest: Sha256Digest) -> NonEmptyStr { join(["sha256:", digest.hex as String], "") as NonEmptyStr } diff --git a/dag/std/materialization_object.dag b/dag/std/materialization_object.dag index 10e7ac031f2..d28e969d502 100644 --- a/dag/std/materialization_object.dag +++ b/dag/std/materialization_object.dag @@ -3,6 +3,7 @@ module std.materialization_object import std.types { Bool, Int, List, String, NonEmptyStr } import std.content_hash { ContentHash, + parse_content_hash, Fnv1a64Structural, content_hash_atom, content_hash_from_structural_digest, @@ -271,42 +272,6 @@ fn store_object_line(line: String) -> StoreObjectLine { } } -fn parse_recorded_store_key_candidate(key_text: String) -> ContentHash? { - if starts_with(s: key_text, prefix: "sha256:") { - match get(xs: split(s: key_text, delimiter: "sha256:"), index: 1) { - Absent => none - Present { value: hex } => - match sha256_hex_digest(hex: hex) { - Absent => none - Present { value: d } => Present { value: as_content_hash_cryptographic(digest: d) } - } - } - } else if starts_with(s: key_text, prefix: "sha512:") { - match get(xs: split(s: key_text, delimiter: "sha512:"), index: 1) { - Absent => none - Present { value: hex } => - match sha512_hex_digest(hex: hex) { - Absent => none - Present { value: d } => Present { value: as_content_hash_sha512(digest: d) } - } - } - } else { - content_hash_from_structural_digest(digest: key_text) - } -} - -fn parse_recorded_store_key(key_text: String) -> ContentHash? { - match parse_recorded_store_key_candidate(key_text: key_text) { - Absent => none - Present { value: parsed } => - if (serialize_content_hash(hash: parsed) as String) == key_text { - Present { value: parsed } - } else { - none - } - } -} - type StoreObjectDecode = StoreObjectDecoded { manifest: ArtifactManifest, @@ -408,7 +373,7 @@ fn decode_store_object(content: String) -> StoreObjectDecode { match store_object_header_value(lines: lines, index: 2, tag: "request_key") { Absent => StoreObjectMalformed { cause: "line 3 is not a `request_key ` header" } Present { value: key_text } => - match parse_recorded_store_key(key_text: key_text) { + match parse_content_hash(wire: key_text) { Absent => StoreObjectMalformed { cause: concat("the recorded request key is not a ContentHash wire form: ", key_text) } Present { value: key } => match store_object_header_value(lines: lines, index: 3, tag: "evaluation_preimage") { diff --git a/dag/std/materialization_provider.dag b/dag/std/materialization_provider.dag index 9f8aa3caefb..5c1938ee73d 100644 --- a/dag/std/materialization_provider.dag +++ b/dag/std/materialization_provider.dag @@ -354,7 +354,7 @@ type EvaluationIdentityCollisionDisposition = FnvBucketPreimageVerified { restoration_trigger: NonEmptyStr } data evaluation_identity_fnv_store_preimage_exception: EvaluationIdentityCollisionDisposition = FnvBucketPreimageVerified { - restoration_trigger: "parse_recorded_store_key (algorithm-qualified ContentHash wire, inverse of serialize_content_hash) round-trips Sha256Family and Sha512Family object headers, and every persistent consumer of EvaluationStoreAddress — store_object_name, store_lookup_decide, store_commit_prepare, local_store_lookup, provider_serve PersistedProbe — derives EvaluationIdentity from evaluation_bucket under that family for PersistentStoreScope and CrossRunScope" + restoration_trigger: "std.content_hash parse_content_hash (algorithm-qualified ContentHash wire, inverse of serialize_content_hash) round-trips Sha256Family and Sha512Family object headers, and every persistent consumer of EvaluationStoreAddress — store_object_name, store_lookup_decide, store_commit_prepare, local_store_lookup, provider_serve PersistedProbe — derives EvaluationIdentity from evaluation_bucket under that family for PersistentStoreScope and CrossRunScope" } type EvaluationStoreAddressStanding diff --git a/dag/std/temporal_effect.dag b/dag/std/temporal_effect.dag index 0b15881ccce..d623f65b7ca 100644 --- a/dag/std/temporal_effect.dag +++ b/dag/std/temporal_effect.dag @@ -65,6 +65,27 @@ type HeldLease { observed: HeldLeaseObservedState } +// The observed state on a wire, and back. One grammar read in both directions: the parse is the +// exact inverse of the wire, and a word that is not one of the five is no state, never a default. +fn held_lease_observed_state_wire(observed: HeldLeaseObservedState) -> NonEmptyStr { + match observed { + LeaseAbsent => "lease-absent" as NonEmptyStr + LeaseRunningExpected => "lease-running-expected" as NonEmptyStr + LeaseRunningStale => "lease-running-stale" as NonEmptyStr + LeasePortForeign => "lease-port-foreign" as NonEmptyStr + LeaseInaccessible => "lease-inaccessible" as NonEmptyStr + } +} + +fn parse_held_lease_observed_state(wire: String) -> HeldLeaseObservedState? { + if wire == "lease-absent" { Present { value: LeaseAbsent } } + else if wire == "lease-running-expected" { Present { value: LeaseRunningExpected } } + else if wire == "lease-running-stale" { Present { value: LeaseRunningStale } } + else if wire == "lease-port-foreign" { Present { value: LeasePortForeign } } + else if wire == "lease-inaccessible" { Present { value: LeaseInaccessible } } + else { none } +} + fn held_lease(epoch: LeaseEpoch, observed: HeldLeaseObservedState) -> HeldLease { HeldLease { epoch: epoch, observed: observed } } diff --git a/dag/test/claim/capacity_lease_chain_witness_test.dag b/dag/test/claim/capacity_lease_chain_witness_test.dag index 80d34320318..825874a4632 100644 --- a/dag/test/claim/capacity_lease_chain_witness_test.dag +++ b/dag/test/claim/capacity_lease_chain_witness_test.dag @@ -7,12 +7,13 @@ import product.capacity.pool { Pool, NoReplenishment, pool_of, pool_reading_at, import product.capacity.event_chain { PartitionId, EventId, ChainEvent, ChainEnvelope, HeadExpectation, HeadAbsent, HeadAt, AppendDecision, AppendAdmitted, AppendStale, decide_append, chain_from_head, ChainWalk, ChainWalked, ChainIncomplete, ChainBudgetExhausted, + EventDecoded, EventUndecodable, } import product.capacity.lease { LeaseFence, lease_fence_of, fence_verdict, FenceVerdict, FenceCurrent, FenceObsolete, FenceForeignGrant, LeasePolicy, LeaseGrant, lease_grant, ReleaseLaw, FencedResource, QuiescenceRequired, QuiescenceFact, Quiescent, QuiescenceUnobserved, CapacityAfterExpiry, LeaseNotExpired, CapacityFreed, CapacityHeldPendingQuiescence, capacity_after_expiry } import product.capacity.pool_events { PoolEvent, PoolAcquired, PoolSettled, PoolReleased, PoolLapsed, PoolUpstreamObserved, PoolResetObserved, PoolFold, PoolFolded, PoolFoldRefused, pool_fold, - SeatRequest, SeatProposal, SeatProposed, SeatRefused, propose_acquire, pool_event_wire_text, pool_event_decode, PoolEventDecode, PoolEventDecoded, PoolEventUndecodable, + SeatRequest, SeatProposal, SeatProposed, SeatRefused, propose_acquire, pool_event_wire_text, pool_event_decode, grant_from_admission, } @@ -169,11 +170,11 @@ test fn every_pool_event_kind_round_trips_through_its_wire_and_junk_is_refused() all(kinds, k => { let env = w_env(id: "x", parent: "p", payload: k, at: 42) match pool_event_decode(text: pool_event_wire_text(event: env.event)) { - PoolEventDecoded { event: e } => pool_event_wire_text(event: e) == pool_event_wire_text(event: env.event) && e.recorded_at == 42 - PoolEventUndecodable { reason: _ } => false + EventDecoded { event: e } => pool_event_wire_text(event: e) == pool_event_wire_text(event: env.event) && e.recorded_at == 42 + EventUndecodable { reason: _ } => false } }) - && (match pool_event_decode(text: "{\"schema\":\"nope\"}") { PoolEventUndecodable { reason: _ } => true PoolEventDecoded { event: _ } => false }) + && (match pool_event_decode(text: "{\"schema\":\"nope\"}") { EventUndecodable { reason: _ } => true EventDecoded { event: _ } => false }) } // A LOWERED CEILING DOES NOT INVALIDATE HISTORY THAT WAS ADMITTED UNDER THE OLD ONE. diff --git a/dag/test/claim/materialization_store_witness_test.dag b/dag/test/claim/materialization_store_witness_test.dag index 2b996c3b11d..a767a81c699 100644 --- a/dag/test/claim/materialization_store_witness_test.dag +++ b/dag/test/claim/materialization_store_witness_test.dag @@ -2,7 +2,7 @@ module test.claim.materialization_store_witness import std.types { Bool, Int, List, String, NonEmptyStr } import std.content_hash { - ContentHash, Fnv1a64Structural, content_hash_atom, content_hash_of_value, serialize_content_hash, + ContentHash, Fnv1a64Structural, content_hash_atom, content_hash_of_value, serialize_content_hash, parse_content_hash, sha256_hex_digest, sha512_hex_digest, as_content_hash_cryptographic, as_content_hash_sha512, content_hash_family, Sha256Family, Sha512Family, Sha1Family, Fnv1a64StructuralFamily } @@ -37,7 +37,6 @@ import std.materialization_object { store_lookup_is_hit, store_lookup_is_miss, store_lookup_payload, store_lookup_refusal_tag, store_commit_refusal_tag, store_lookup_fold, encode_store_object, decode_store_object, percent_encode_payload, percent_decode_payload, - parse_recorded_store_key, result_content_canonical, store_object_name, store_object_magic, store_object_format_version, StoreObjectDecoded, StoreObjectMalformed, store_observed_digest, artifact_from_manifest, ManifestDecoded, @@ -647,12 +646,12 @@ test fn recorded_store_key_round_trips_sha256_and_sha512_wire() -> Bool { Sha1Family => false Sha256Family => false } - && match parse_recorded_store_key(key_text: serialize_content_hash(hash: k256) as String) { + && match parse_content_hash(wire: serialize_content_hash(hash: k256) as String) { Absent => false Present { value: p } => (p == k256) && ((serialize_content_hash(hash: p) as String) == (serialize_content_hash(hash: k256) as String)) } - && match parse_recorded_store_key(key_text: serialize_content_hash(hash: k512) as String) { + && match parse_content_hash(wire: serialize_content_hash(hash: k512) as String) { Absent => false Present { value: p } => (p == k512) && ((serialize_content_hash(hash: p) as String) == (serialize_content_hash(hash: k512) as String)) @@ -664,17 +663,17 @@ test fn recorded_store_key_round_trips_sha256_and_sha512_wire() -> Bool { } } -test fn parse_recorded_store_key_refuses_trailing_repeated_prefix() -> Bool { +test fn parse_content_hash_refuses_trailing_repeated_prefix() -> Bool { match sha256_hex_digest(hex: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") { Absent => false Present { value: sha } => { let h = as_content_hash_cryptographic(digest: sha) let canon = serialize_content_hash(hash: h) as String let alias = concat(canon, "sha256:ignored") - match parse_recorded_store_key(key_text: alias) { + match parse_content_hash(wire: alias) { Present { value: _ } => false Absent => - match parse_recorded_store_key(key_text: canon) { + match parse_content_hash(wire: canon) { Absent => false Present { value: p } => (p == h) && ((serialize_content_hash(hash: p) as String) == canon) diff --git a/dag/test/claim/spark/fabric_capacity_standing_wet_witness_test.dag b/dag/test/claim/spark/fabric_capacity_standing_wet_witness_test.dag new file mode 100644 index 00000000000..f0c203c6be5 --- /dev/null +++ b/dag/test/claim/spark/fabric_capacity_standing_wet_witness_test.dag @@ -0,0 +1,27 @@ +module test.claim.spark.fabric_capacity_standing_wet_witness + +import std.logic { Bool } +import std.types { String } +import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly } +import std.process { ExitSuccess, ExitFailure } +import gunbc.instruments.fabric_capacity_standing { fabric_capacity_standing } + +data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly + +// THE LIVE ENTRY, EXECUTED. test.claim.spark.fabric_capacity_standing_witness drives the verdict +// over a SUPPLIED roster so the real group_report producer and its binding run hermetically; this +// file is the other half of DESIGN §3's pairing obligation, the one that cannot be hermetic: the +// entry reads the executor's hostname (shell.Exec.RunArgv, no mock_response), resolves its event +// log layout and reads every claimed group's authority from the log before any standing is +// judged. On the wet lane's runner that read does not reach a log -- the runner is no dashboard +// host, or its remote is unreachable -- so the honest verdict is a refusal that NAMES THE READ: +// every claimed group is reported "serving authority could not be read at ", and no +// group's capacity is stood for. That is the route: deleting the live binding, or letting an +// unreadable log fall back to the source row, changes this text. +test fn the_live_entry_reads_the_authority_before_judging_and_refuses_off_fleet() -> Bool { + match fabric_capacity_standing() { + ExitSuccess => false + ExitFailure { code: _, reason: reason } => + string_contains(s: reason, pattern: "group-a: serving authority could not be read at ") + } +} diff --git a/dag/test/claim/spark/fabric_capacity_standing_witness_test.dag b/dag/test/claim/spark/fabric_capacity_standing_witness_test.dag index 879dfd0622e..93d555baf1e 100644 --- a/dag/test/claim/spark/fabric_capacity_standing_witness_test.dag +++ b/dag/test/claim/spark/fabric_capacity_standing_witness_test.dag @@ -1,6 +1,6 @@ module test.claim.spark.fabric_capacity_standing_witness -import std.types { Bool, String, NonEmptyStr } +import std.types { Bool, String, NonEmptyStr, List } import std.process { ProcessExit, ExitSuccess, ExitFailure } import v2.std.optional { Present, Absent } import std.content_hash { ContentHash, Sha256Hash, Sha256Digest, Sha256DigestHex } @@ -17,13 +17,16 @@ import gunbc.instruments.fabric_capacity_standing { ProbeFieldName, Invocation, UnitSha, Container, ImageSha, StartedAt, PoolLine, ConcurrencyLine, AllocatorBlocks, BlockSize, MaxModelLen, LaunchRead, LaunchIdentified, LaunchUnidentified, launch_from_fields, - GroupStanding, capacity_standing_verdict, group_report, fabric_capacity_standing, + GroupStanding, capacity_standing_verdict, group_report, fabric_capacity_standing_current, standing_for_authority, } +import gunbc.spark.pair_serving_authority_log { CurrentAuthority, CurrentAuthorityRead } +import product.capacity.event_chain { HeadAbsent } import std.temporal_effect { held_lease, LeaseEpoch, LeaseRunningExpected } import std.content_hash { ContentHash, Sha256Hash, sha256_hex_digest } import gunbc.spark.pair_serving_authority { PairServingGroupAuthority, PairServingActive, SuspensionPendingReconciliation, ReleasedToFleet, PairRealizationUnestablished, + spark_pair_serving_authorities, } fn w_cell(name: ProbeFieldName) -> String { @@ -308,9 +311,18 @@ test fn one_refusing_member_refuses_the_whole_standing() -> Bool { // the entry refuses until a modeled host-effect realizes remote inventory, so refusal IS today's // correct answer on the live path. When that frontier fires this claim flips, and it should -- it is // the control that notices, rather than a green that would have said nothing either way. -test fn the_live_entry_point_runs_its_real_producer_and_refuses_today() -> Bool { +// THE ROSTER IS SUPPLIED AT GENERATION 0 -- every claimed group's resting row, which is what the +// authority log folds to when no transition is recorded -- so the claim stays hermetic while the +// real group_report producer and the binding that maps it over the roster both execute. The +// live entry, which reads that roster from the event log first, is executed by +// test.claim.spark.fabric_capacity_standing_wet_witness on the local-repo wet lane. +fn w_resting_current() -> List { + map(spark_pair_serving_authorities, a => CurrentAuthorityRead { authority: a, head: HeadAbsent, generation: 0 }) +} + +test fn the_verdict_over_the_resting_roster_runs_its_real_producer_and_refuses_today() -> Bool { let live = group_report(group: FabricGroupA) - match fabric_capacity_standing() { + match fabric_capacity_standing_current(current: w_resting_current()) { ExitSuccess => false ExitFailure { code: _, reason: reason } => (live.admitting == false) diff --git a/dag/test/claim/spark/pair_serving_authority_log_real_execution_witness_test.dag b/dag/test/claim/spark/pair_serving_authority_log_real_execution_witness_test.dag new file mode 100644 index 00000000000..0599c2cb134 --- /dev/null +++ b/dag/test/claim/spark/pair_serving_authority_log_real_execution_witness_test.dag @@ -0,0 +1,112 @@ +module test.claim.spark.pair_serving_authority_log_real_execution + +import std.logic { Bool } +import std.types { String, NonEmptyStr, FilePath, List } +import v2.std.optional { Present, Absent } +import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly } +import extdeps.shell +import extdeps.git.plumbing +import extdeps.git.plumbing { GitWorktreeAt } +import std.content_hash { ContentHash, Sha256Hash, sha256_hex_digest } +import std.temporal_effect { held_lease, LeaseEpoch, LeaseRunningExpected } +import product.capacity.event_chain { HeadAbsent, HeadAt } +import gunbc.fabric_event_log { RemoteLocalPath, EventLogLayout, event_log_layout } +import gunbc.spark.fabric_switch_observed { FabricGroupA, FabricGroupB } +import gunbc.spark.pair_serving_authority { PairServingGroupAuthority, PairServingActive, SuspensionPendingReconciliation, PairRealizationUnestablished, pair_serving_authority_for } +import gunbc.spark.pair_serving_authority_log { + CurrentAuthority, CurrentAuthorityRead, CurrentAuthorityUnread, current_pair_serving_authority, + AuthorityTransition, AuthorityTransitionAppended, AuthorityTransitionStale, AuthorityTransitionRefused, pair_serving_authority_transition, + authority_eq, +} + +data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly + +// THE TRANSITION IS A COMPARE-AND-SET ON A REAL PARTITION HEAD, by real execution against a bare +// remote in a temporary directory -- the same fixture test.claim.fabric_event_log_append_real_execution +// uses for the seat ledger, because it is the same log. What is established here and nowhere +// hermetic: an empty partition folds to the resting row; one admitted transition is read back as +// the current authority at generation 1; a second transition decided against the state the first +// one LEFT is stale, carries the state now current, and appends nothing. + +fn alr_with_temp_dir(scenario: fn(FilePath) -> Bool) -> Bool { + let dir = shell.Mktemp.Dir() + let observed = scenario(dir.path) + let cleaned = shell.Remove.RecursiveForce(path: dir.path) + dir.success && observed && cleaned.success +} + +fn alr_witness_layout(dir: FilePath) -> EventLogLayout { + event_log_layout(root: dir, remote: RemoteLocalPath { path: join([dir as String, "/remote.git"], "") as FilePath }) +} + +fn alr_witness_remote_ready(dir: FilePath) -> Bool { + git.Plumbing.InitBareAt(address: GitWorktreeAt { path: dir }, path: join([dir as String, "/remote.git"], "") as FilePath).exit_code == 0 +} + +fn alr_with_hash(scenario: fn(ContentHash) -> Bool) -> Bool { + match sha256_hex_digest(hex: "2222222222222222222222222222222222222222222222222222222222222222") { + Absent => false + Present { value: d } => scenario(Sha256Hash(d)) + } +} + +fn alr_w_pending(h: ContentHash) -> PairServingGroupAuthority { + SuspensionPendingReconciliation { + group: FabricGroupA, transaction: "tx-real" as NonEmptyStr, + lease: held_lease(epoch: LeaseEpoch { lease_key: "witness-lease" as NonEmptyStr, resource_fingerprint: h, owner_fingerprint: h, generation: 1 }, observed: LeaseRunningExpected), + } +} + +fn alr_current_is(c: CurrentAuthority, expected: PairServingGroupAuthority, generation: Int) -> Bool { + match c { + CurrentAuthorityRead { authority: a, head: _, generation: g } => authority_eq(a: a, b: expected) && g == generation + CurrentAuthorityUnread { group: _, step: _, reason: _ } => false + } +} + +// The whole route: empty log reads the resting row at 0; a transition from it appends and reads +// back at 1; a second transition still expecting the resting row is stale and names the current. +test fn a_transition_is_read_back_and_a_stale_one_names_the_current_by_real_execution() -> Bool { + alr_with_hash(scenario: fn(h) { + alr_with_temp_dir(scenario: fn(dir) { + let layout = alr_witness_layout(dir: dir) + match pair_serving_authority_for(group: FabricGroupA) { + Absent => false + Present { value: resting } => + alr_witness_remote_ready(dir: dir) + && alr_current_is(c: current_pair_serving_authority(layout: layout, group: FabricGroupA), expected: resting, generation: 0) + && (match pair_serving_authority_transition(layout: layout, group: FabricGroupA, expected: resting, next: alr_w_pending(h: h), transaction: "tx-real" as NonEmptyStr, actor: "witness" as NonEmptyStr, at: 1000) { + AuthorityTransitionAppended { id: _, generation: g, next: n } => g == 1 && authority_eq(a: n, b: alr_w_pending(h: h)) + AuthorityTransitionStale { expected: _, current: _ } => false + AuthorityTransitionRefused { group: _, step: _, reason: _ } => false + }) + && alr_current_is(c: current_pair_serving_authority(layout: layout, group: FabricGroupA), expected: alr_w_pending(h: h), generation: 1) + && (match pair_serving_authority_transition(layout: layout, group: FabricGroupA, expected: resting, next: alr_w_pending(h: h), transaction: "tx-late" as NonEmptyStr, actor: "witness" as NonEmptyStr, at: 1001) { + AuthorityTransitionStale { expected: _, current: c } => authority_eq(a: c, b: alr_w_pending(h: h)) + AuthorityTransitionAppended { id: _, generation: _, next: _ } => false + AuthorityTransitionRefused { group: _, step: _, reason: _ } => false + }) + && alr_current_is(c: current_pair_serving_authority(layout: layout, group: FabricGroupA), expected: alr_w_pending(h: h), generation: 1) + } + }) + }) +} + +// RED -- an unclaimed group has no authority to read or move: both refuse at the claim, and the +// log is never touched. +test fn an_unclaimed_group_is_refused_at_the_claim_by_real_execution() -> Bool { + alr_with_hash(scenario: fn(h) { + alr_with_temp_dir(scenario: fn(dir) { + let layout = alr_witness_layout(dir: dir) + alr_witness_remote_ready(dir: dir) + && (match current_pair_serving_authority(layout: layout, group: FabricGroupB) { + CurrentAuthorityUnread { group: _, step: s, reason: _ } => s == "claim" + CurrentAuthorityRead { authority: _, head: _, generation: _ } => false + }) + && (match pair_serving_authority_transition(layout: layout, group: FabricGroupB, expected: PairServingActive { group: FabricGroupB, exact_realization: PairRealizationUnestablished { obligation: "w" as NonEmptyStr } }, next: PairServingActive { group: FabricGroupB, exact_realization: PairRealizationUnestablished { obligation: "w" as NonEmptyStr } }, transaction: "tx" as NonEmptyStr, actor: "witness" as NonEmptyStr, at: 1000) { + AuthorityTransitionRefused { group: _, step: s, reason: _ } => s == "claim" + _ => false + }) + }) + }) +} diff --git a/dag/test/claim/spark/pair_serving_authority_log_witness_test.dag b/dag/test/claim/spark/pair_serving_authority_log_witness_test.dag new file mode 100644 index 00000000000..823d06ab5cd --- /dev/null +++ b/dag/test/claim/spark/pair_serving_authority_log_witness_test.dag @@ -0,0 +1,206 @@ +module test.claim.spark.pair_serving_authority_log_witness + +import std.logic { Bool } +import std.types { String, NonEmptyStr, List } +import v2.std.optional { Present, Absent } +import std.content_hash { ContentHash, Sha256Hash, sha256_hex_digest } +import std.temporal_effect { HeldLease, held_lease, LeaseEpoch, LeaseRunningExpected, LeaseInaccessible } +import product.capacity.event_chain { ChainEvent, ChainEnvelope, EventId, EventDecoded, EventUndecodable } +import gunbc.spark.fabric_switch_observed { FabricGroupA, FabricGroupB } +import gunbc.spark.pair_serving_authority { + PairServingGroupAuthority, PairServingActive, SuspensionPendingReconciliation, SuspendedForAuthorizedSuccessor, FencedRefusal, ReleasedToFleet, + PairRealizationKeyed, PairRealizationUnestablished, +} +import gunbc.spark.pair_serving_authority_log { + PairAuthorityEvent, AuthorityTransitioned, pair_authority_partition, + pair_authority_event_wire_text, pair_authority_event_decode, authority_eq, authority_wire, + AuthorityFold, AuthorityFolded, AuthorityFoldRefused, authority_fold, +} + +// THE CODEC AND THE FOLD, OVER SUPPLIED VALUES. Every arm of the authority round-trips through +// the wire, the fold walks recorded transitions from a resting row and refuses one that leaves a +// state that was not current. The linearization itself -- append under a leased head, read back -- +// executes for real in test.claim.spark.pair_serving_authority_log_real_execution on the wet lane. + +fn alw_with_hash(scenario: fn(ContentHash) -> Bool) -> Bool { + match sha256_hex_digest(hex: "1111111111111111111111111111111111111111111111111111111111111111") { + Absent => false + Present { value: d } => scenario(Sha256Hash(d)) + } +} + +fn alw_w_lease(h: ContentHash, inaccessible: Bool) -> HeldLease { + held_lease( + epoch: LeaseEpoch { lease_key: "witness-lease" as NonEmptyStr, resource_fingerprint: h, owner_fingerprint: h, generation: 3 }, + observed: if inaccessible { LeaseInaccessible } else { LeaseRunningExpected }, + ) +} + +fn alw_w_active_unestablished() -> PairServingGroupAuthority { + PairServingActive { group: FabricGroupA, exact_realization: PairRealizationUnestablished { obligation: "witness" as NonEmptyStr } } +} + +fn alw_w_all_arms(h: ContentHash) -> List { + [ + alw_w_active_unestablished(), + PairServingActive { group: FabricGroupA, exact_realization: PairRealizationKeyed { key: h } }, + SuspensionPendingReconciliation { group: FabricGroupA, transaction: "tx-1" as NonEmptyStr, lease: alw_w_lease(h: h, inaccessible: false) }, + SuspendedForAuthorizedSuccessor { + group: FabricGroupA, authorization: "auth-1" as NonEmptyStr, exact_candidate_realization: PairRealizationKeyed { key: h }, + lease: alw_w_lease(h: h, inaccessible: true), cleanup: "baseline" as NonEmptyStr, + }, + FencedRefusal { group: FabricGroupA, cause: "foreign occupant" as NonEmptyStr, disposition_authority: "operator" as NonEmptyStr }, + ReleasedToFleet { group: FabricGroupA, release_receipt: h }, + ] +} + +fn alw_w_event(previous: PairServingGroupAuthority, next: PairServingGroupAuthority, parent: EventId?) -> ChainEvent { + ChainEvent { + partition: pair_authority_partition(group: FabricGroupA), + parent: parent, + recorded_at: 1000, + actor: "witness" as NonEmptyStr, + payload: AuthorityTransitioned { previous: previous, next: next, transaction: "tx-1" as NonEmptyStr }, + } +} + +fn alw_round_trips(previous: PairServingGroupAuthority, next: PairServingGroupAuthority) -> Bool { + let e = alw_w_event(previous: previous, next: next, parent: none) + match pair_authority_event_decode(text: pair_authority_event_wire_text(event: e)) { + EventUndecodable { reason: _ } => false + EventDecoded { event: back } => + match back.payload { + AuthorityTransitioned { previous: p, next: n, transaction: t } => + authority_eq(a: p, b: previous) && authority_eq(a: n, b: next) && (t as String) == "tx-1" + && back.recorded_at == 1000 && (back.partition as String) == (pair_authority_partition(group: FabricGroupA) as String) + } + } +} + +// ── THE CODEC ────────────────────────────────────────────────────────────────────────────────── + +// EVERY ARM, WITH EVERY FIELD IT CARRIES, SURVIVES THE WIRE -- one claim per arm, because the +// fold that renders and parses an authority is the whole cost of each and a conjunction over six +// arms pays it six times under one budget (DESIGN §3: split independent cases when splitting +// loses no coverage). The `previous` position runs the same members fold, so it is covered once. +fn alw_arm_round_trips(index: Int) -> Bool { + alw_with_hash(scenario: fn(h) { + match get(xs: alw_w_all_arms(h: h), index: index) { + Absent => false + Present { value: a } => alw_round_trips(previous: alw_w_active_unestablished(), next: a) + } + }) +} + +test fn an_unestablished_active_arm_round_trips_through_the_wire() -> Bool { + alw_arm_round_trips(index: 0) +} + +test fn a_keyed_active_arm_round_trips_through_the_wire() -> Bool { + alw_arm_round_trips(index: 1) +} + +test fn a_pending_arm_round_trips_through_the_wire() -> Bool { + alw_arm_round_trips(index: 2) +} + +test fn a_suspended_for_successor_arm_round_trips_through_the_wire() -> Bool { + alw_arm_round_trips(index: 3) +} + +test fn a_fenced_arm_round_trips_through_the_wire() -> Bool { + alw_arm_round_trips(index: 4) +} + +test fn a_released_arm_round_trips_through_the_wire() -> Bool { + alw_arm_round_trips(index: 5) +} + +// The `previous` position, with a leased arm, so both sides of one event are read back. +test fn a_leased_previous_arm_round_trips_through_the_wire() -> Bool { + alw_with_hash(scenario: fn(h) { + match get(xs: alw_w_all_arms(h: h), index: 3) { + Absent => false + Present { value: a } => alw_round_trips(previous: a, next: alw_w_active_unestablished()) + } + }) +} + +// RED -- two arms that differ only in a field the wire must carry are not equal on the wire. +test fn the_wire_distinguishes_arms_and_fields() -> Bool { + alw_with_hash(scenario: fn(h) { + let arms = alw_w_all_arms(h: h) + let live = alw_w_lease(h: h, inaccessible: false) + let dead = alw_w_lease(h: h, inaccessible: true) + length(arms) == 6 + && !any(arms, a => any(arms, b => (authority_wire(a: a) != authority_wire(a: b)) && authority_eq(a: a, b: b))) + && !authority_eq( + a: SuspensionPendingReconciliation { group: FabricGroupA, transaction: "tx-1" as NonEmptyStr, lease: live }, + b: SuspensionPendingReconciliation { group: FabricGroupA, transaction: "tx-1" as NonEmptyStr, lease: dead }) + && !authority_eq(a: alw_w_active_unestablished(), b: PairServingActive { group: FabricGroupB, exact_realization: PairRealizationUnestablished { obligation: "witness" as NonEmptyStr } }) + }) +} + +// A document of another schema, or one whose state word names an arm its fields do not inhabit, +// is a typed refusal -- never an authority. +test fn a_foreign_or_incoherent_document_does_not_decode() -> Bool { + match pair_authority_event_decode(text: "{\"schema\":\"capacity-pool-event/v1\"}") { + EventUndecodable { reason: _ } => + match pair_authority_event_decode(text: "{\"schema\":\"pair-serving-authority-event/v1\",\"partition\":\"p\",\"parent\":\"\",\"recorded_at\":1,\"actor\":\"w\",\"kind\":\"transitioned\",\"transaction\":\"t\",\"prev_state\":\"suspension-pending-reconciliation\",\"prev_group\":\"group-a\",\"next_state\":\"active\",\"next_group\":\"group-a\",\"next_realization_obligation\":\"o\"}") { + EventUndecodable { reason: _ } => true + EventDecoded { event: _ } => false + } + EventDecoded { event: _ } => false + } +} + +// ── THE FOLD ─────────────────────────────────────────────────────────────────────────────────── + +fn alw_env(id: String, e: ChainEvent) -> ChainEnvelope { + ChainEnvelope { id: id as EventId, event: e } +} + +// No transitions: the resting row at generation 0. Two chained transitions: the last next, at 2. +test fn the_fold_walks_from_the_resting_row_through_each_transition() -> Bool { + alw_with_hash(scenario: fn(h) { + let resting = alw_w_active_unestablished() + let pending = SuspensionPendingReconciliation { group: FabricGroupA, transaction: "tx-1" as NonEmptyStr, lease: alw_w_lease(h: h, inaccessible: false) } + let fenced = FencedRefusal { group: FabricGroupA, cause: "foreign occupant" as NonEmptyStr, disposition_authority: "operator" as NonEmptyStr } + let chain = [alw_env(id: "e1", e: alw_w_event(previous: resting, next: pending, parent: none)), alw_env(id: "e2", e: alw_w_event(previous: pending, next: fenced, parent: Present { value: "e1" as EventId }))] + (match authority_fold(resting: resting, oldest_first: [] as List>) { + AuthorityFolded { current: c, generation: g } => g == 0 && authority_eq(a: c, b: resting) + AuthorityFoldRefused { at_event: _, reason: _ } => false + }) + && (match authority_fold(resting: resting, oldest_first: chain) { + AuthorityFolded { current: c, generation: g } => g == 2 && authority_eq(a: c, b: fenced) + AuthorityFoldRefused { at_event: _, reason: _ } => false + }) + }) +} + +// RED -- an event that claims to leave a state that was not current is refused AT THAT EVENT, and +// the fold does not continue past it. +test fn a_transition_from_a_state_that_was_not_current_refuses_at_that_event() -> Bool { + alw_with_hash(scenario: fn(h) { + let resting = alw_w_active_unestablished() + let pending = SuspensionPendingReconciliation { group: FabricGroupA, transaction: "tx-1" as NonEmptyStr, lease: alw_w_lease(h: h, inaccessible: false) } + let fenced = FencedRefusal { group: FabricGroupA, cause: "foreign occupant" as NonEmptyStr, disposition_authority: "operator" as NonEmptyStr } + let chain = [alw_env(id: "e1", e: alw_w_event(previous: pending, next: fenced, parent: none))] + match authority_fold(resting: resting, oldest_first: chain) { + AuthorityFoldRefused { at_event: e, reason: _ } => (e as String) == "e1" + AuthorityFolded { current: _, generation: _ } => false + } + }) +} + +// RED -- a transition whose next state names another group than the partition's is refused. +test fn a_transition_to_another_groups_authority_refuses() -> Bool { + alw_with_hash(scenario: fn(h) { + let resting = alw_w_active_unestablished() + let elsewhere = ReleasedToFleet { group: FabricGroupB, release_receipt: h } + match authority_fold(resting: resting, oldest_first: [alw_env(id: "e1", e: alw_w_event(previous: resting, next: elsewhere, parent: none))]) { + AuthorityFoldRefused { at_event: e, reason: _ } => (e as String) == "e1" + AuthorityFolded { current: _, generation: _ } => false + } + }) +} diff --git a/dag/test/claim/spark/spark_pair_serving_apply_wet_witness_test.dag b/dag/test/claim/spark/spark_pair_serving_apply_wet_witness_test.dag new file mode 100644 index 00000000000..05f501e6523 --- /dev/null +++ b/dag/test/claim/spark/spark_pair_serving_apply_wet_witness_test.dag @@ -0,0 +1,32 @@ +module test.claim.spark.spark_pair_serving_apply_wet_witness + +import std.logic { Bool } +import std.types { String, List } +import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly } +import gunbc.spark.fabric_reach { ExecutorReachKnown, ExecutorReachUnknown, observe_executor_reach } +import gunbc.spark.pair_serving_apply { spark_pair_apply_plans, spark_pair_apply_plan_refusals } +import gunbc.spark.pair_serving_authority { spark_pair_serving_authorities } + +data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly + +// THE APPLY SEAM'S LIVE BINDING, EXECUTED. test.claim.spark.spark_pair_serving_apply_witness drives +// the plan fold over a SUPPLIED roster; this is the other half of DESIGN §3's pairing obligation: +// spark_pair_apply_plans reads the executor's hostname, resolves its event log layout and reads +// every claimed group's authority from the log before planning anything. On the wet lane's +// runner that read does not reach a log, so every claimed group's plan is a refusal that NAMES +// THE READ -- "the serving authority could not be read" -- and nothing is planned from the +// resting row. Deleting the log read, or letting an unreadable log fall back to the row, turns +// these refusals into plans and this claim red. +test fn the_apply_seam_reads_the_authority_before_planning_and_refuses_off_fleet() -> Bool { + match observe_executor_reach() { + ExecutorReachUnknown { cause: _ } => false + ExecutorReachKnown { short_hostname: executor, path: _ } => + { + let plans = spark_pair_apply_plans(executor: executor) + let refusals = spark_pair_apply_plan_refusals(plans: plans) + length(plans) == length(spark_pair_serving_authorities) + && length(refusals) == length(plans) + && all(refusals, r => string_contains(s: r, pattern: "the serving authority could not be read")) + } + } +} diff --git a/dag/test/claim/spark/spark_pair_serving_apply_witness_test.dag b/dag/test/claim/spark/spark_pair_serving_apply_witness_test.dag index dd3fecb59a2..4c5dca0248e 100644 --- a/dag/test/claim/spark/spark_pair_serving_apply_witness_test.dag +++ b/dag/test/claim/spark/spark_pair_serving_apply_witness_test.dag @@ -2,17 +2,27 @@ module test.claim.spark.spark_pair_serving_apply_witness import std.types { Bool, List, NonEmptyStr, String } import product.placement_supply { host_identity_eq } -import gunbc.fleet_intent_network { operator_host_srv5, operator_host_srv6, operator_host_srv7, operator_host_srv8, operator_host_srv9, operator_host_srv12 } +import gunbc.fleet_intent_network { operator_host_srv5, operator_host_srv6, operator_host_srv7, operator_host_srv8 } import gunbc.spark.pair_serving_realization { spark_pair_realizations } import gunbc.spark.pair_serving_apply { SparkPairApplyPlan, SparkPairApplyPlanned, SparkPairApplyRefused, SparkPairHostApplyPlan, - spark_pair_apply_plan, spark_pair_apply_plans, spark_pair_apply_plan_refusals, + spark_pair_apply_plan_current, spark_pair_apply_plans_current, spark_pair_apply_plan_refusals, +} +import gunbc.spark.pair_serving_authority { spark_pair_serving_authorities, pair_serving_authority_group } +import gunbc.spark.pair_serving_authority_log { CurrentAuthority, CurrentAuthorityRead, CurrentAuthorityUnread } +import product.capacity.event_chain { HeadAbsent } + +// THE CURRENT AUTHORITY IS SUPPLIED: the resting row of every claimed group at generation 0, which +// is exactly what the log folds to when no transition has been recorded. The live read of the log +// is executed by test.claim.spark.spark_pair_serving_apply_wet_witness on the local-repo wet lane. +fn w_current() -> List { + map(spark_pair_serving_authorities, a => CurrentAuthorityRead { authority: a, head: HeadAbsent, generation: 0 }) } fn w_plan() -> SparkPairApplyPlan { match first(spark_pair_realizations()) { Absent => SparkPairApplyRefused { cause: "no realization" } - Present { value: r } => spark_pair_apply_plan(r: r) + Present { value: r } => spark_pair_apply_plan_current(r: r, current: w_current()) } } @@ -56,15 +66,27 @@ test fn the_script_is_made_of_the_rendered_argv_and_carries_the_cache_over() -> }) } -// BOTH PROMOTED GROUPS PLAN, NONE REFUSES, AND THE SECOND PLAN IS GROUP B: srv9's head with three -// workers including srv12, so one apply carries the whole desired roster. -test fn every_promoted_group_plans_and_the_second_is_group_b_headed_by_srv9() -> Bool { - let plans = spark_pair_apply_plans() - length(plans) == 2 && length(spark_pair_apply_plan_refusals(plans: plans)) == 0 - && any(plans, p => match p { - SparkPairApplyRefused { cause: _ } => false - SparkPairApplyPlanned { workers: ws, head: h } => - length(ws) == 3 && host_identity_eq(a: h.host, b: operator_host_srv9) - && any(ws, w => host_identity_eq(a: w.host, b: operator_host_srv12)) - }) +// EVERY CLAIMED GROUP PLANS AND NONE REFUSES: one plan per authority row, so one apply carries +// the whole claimed roster. The roster is the authority population -- Group A alone since the +// membership became a projection of gunbc.spark.pair_serving_authority (#11501) -- and this claim +// reads its expected count from that population rather than from a literal, so an earlier +// spelling that named a second group headed by srv9 with srv12 was measuring a roster that no +// longer exists. The head-and-workers shape of the one plan is the claim above. +test fn every_claimed_group_plans_and_none_refuses() -> Bool { + let plans = spark_pair_apply_plans_current(current: w_current()) + length(plans) == length(spark_pair_serving_authorities) && length(plans) >= 1 + && length(spark_pair_apply_plan_refusals(plans: plans)) == 0 +} + +// RED -- AN UNREADABLE AUTHORITY IS NEVER PLANNED FROM THE RESTING ROW. The supplied roster says the +// log could not be read for the claimed group; the plan for that group is a refusal carrying the +// read's cause, and nothing renders. Folding the unread arm back onto the source row would plan +// the incumbent here and turn this red. +test fn an_unread_authority_refuses_the_plan_with_the_reads_cause() -> Bool { + let unread = map(spark_pair_serving_authorities, a => CurrentAuthorityUnread { group: pair_serving_authority_group(a: a), step: "fetch" as String, reason: "witness: the partition could not be fetched" as String }) + let plans = spark_pair_apply_plans_current(current: unread) + let refusals = spark_pair_apply_plan_refusals(plans: plans) + length(plans) == length(spark_pair_serving_authorities) && length(plans) >= 1 + && length(refusals) == length(plans) + && all(refusals, r => string_contains(s: r, pattern: "the serving authority could not be read") && string_contains(s: r, pattern: "witness: the partition could not be fetched")) } diff --git a/src/v1/stage0/src/std_content_hash.rs b/src/v1/stage0/src/std_content_hash.rs index 0bd77b54f03..536b2ea4f5e 100644 --- a/src/v1/stage0/src/std_content_hash.rs +++ b/src/v1/stage0/src/std_content_hash.rs @@ -297,6 +297,59 @@ pub fn serialize_content_hash(hash: Rc) -> String { } } +pub fn parse_content_hash_candidate(wire: String) -> Option> { + if v1_rt::starts_with(wire.clone(), "sha256:".to_string()) { + match Rc::new( + wire.clone() + .split(&"sha256:".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .get((1) as usize) + .cloned() + { + std::option::Option::None => std::option::Option::None, + Some(hex) => match sha256_hex_digest(hex.clone()) { + std::option::Option::None => std::option::Option::None, + Some(d) => Some(as_content_hash_cryptographic(d.clone())), + }, + } + } else { + if v1_rt::starts_with(wire.clone(), "sha512:".to_string()) { + match Rc::new( + wire.clone() + .split(&"sha512:".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .get((1) as usize) + .cloned() + { + std::option::Option::None => std::option::Option::None, + Some(hex) => match sha512_hex_digest(hex.clone()) { + std::option::Option::None => std::option::Option::None, + Some(d) => Some(as_content_hash_sha512(d.clone())), + }, + } + } else { + content_hash_from_structural_digest(wire.clone()) + } + } +} + +pub fn parse_content_hash(wire: String) -> Option> { + match parse_content_hash_candidate(wire.clone()) { + std::option::Option::None => std::option::Option::None, + Some(parsed) => { + if (serialize_content_hash(parsed.clone()) == wire.clone()) { + Some(parsed.clone()) + } else { + std::option::Option::None + } + } + } +} + pub fn sha256_digest_wire_form(digest: Rc) -> String { Rc::new(vec!["sha256:".to_string(), digest.hex.clone()]).join(&"".to_string()) } diff --git a/src/v2/workflow/floor_route_gap.dag b/src/v2/workflow/floor_route_gap.dag index 6db9435f3a4..e677eb0c2a7 100644 --- a/src/v2/workflow/floor_route_gap.dag +++ b/src/v2/workflow/floor_route_gap.dag @@ -929,6 +929,14 @@ fn floor_route_gap_expectation_chunk_08() -> List { tail: Cons { head: FloorRouteGapExpectation { identity: "test.claim.fabric_event_log_append_real_execution.two_appends_chain_oldest_first_by_real_execution", operation: "Dir", ground: NoMockResponse {} }, tail: Cons { + head: FloorRouteGapExpectation { identity: "test.claim.spark.pair_serving_authority_log_real_execution.a_transition_is_read_back_and_a_stale_one_names_the_current_by_real_execution", operation: "Dir", ground: NoMockResponse {} }, + tail: Cons { + head: FloorRouteGapExpectation { identity: "test.claim.spark.pair_serving_authority_log_real_execution.an_unclaimed_group_is_refused_at_the_claim_by_real_execution", operation: "Dir", ground: NoMockResponse {} }, + tail: Cons { + head: FloorRouteGapExpectation { identity: "test.claim.spark.fabric_capacity_standing_wet_witness.the_live_entry_reads_the_authority_before_judging_and_refuses_off_fleet", operation: "RunArgv", ground: NoMockResponse {} }, + tail: Cons { + head: FloorRouteGapExpectation { identity: "test.claim.spark.spark_pair_serving_apply_wet_witness.the_apply_seam_reads_the_authority_before_planning_and_refuses_off_fleet", operation: "RunArgv", ground: NoMockResponse {} }, + tail: Cons { head: FloorRouteGapExpectation { identity: "test.claim.devboot_text_blob_real_execution.a_lease_claim_is_stored_as_exactly_its_bytes_in_the_bare_store_by_real_execution", operation: "Dir", ground: NoMockResponse {} }, tail: Cons { head: FloorRouteGapExpectation { identity: "test.claim.devboot_text_blob_real_execution.a_staged_entry_is_stored_as_exactly_its_bytes_in_the_worktree_repository_by_real_execution", operation: "Dir", ground: NoMockResponse {} }, @@ -938,6 +946,10 @@ fn floor_route_gap_expectation_chunk_08() -> List { } } } + } + } + } + } } // The eight test.claim.materialization_store_local_wet_witness identities: the provider spine's diff --git a/src/v2/workflow/local_repo_wet_terminal.dag b/src/v2/workflow/local_repo_wet_terminal.dag index fcab83bbd44..5c30a01d00b 100644 --- a/src/v2/workflow/local_repo_wet_terminal.dag +++ b/src/v2/workflow/local_repo_wet_terminal.dag @@ -763,6 +763,30 @@ fn local_repo_wet_schedule() -> List { function: "two_appends_chain_oldest_first_by_real_execution", expectation: ExpectedToHold {} }, + WetScheduledClaim { + identity: WitnessIdentity { module_path: "test.claim.spark.pair_serving_authority_log_real_execution", function: "a_transition_is_read_back_and_a_stale_one_names_the_current_by_real_execution" }, + entry: "dag/test/claim/spark/pair_serving_authority_log_real_execution_witness_test.dag", + function: "a_transition_is_read_back_and_a_stale_one_names_the_current_by_real_execution", + expectation: ExpectedToHold {} + }, + WetScheduledClaim { + identity: WitnessIdentity { module_path: "test.claim.spark.pair_serving_authority_log_real_execution", function: "an_unclaimed_group_is_refused_at_the_claim_by_real_execution" }, + entry: "dag/test/claim/spark/pair_serving_authority_log_real_execution_witness_test.dag", + function: "an_unclaimed_group_is_refused_at_the_claim_by_real_execution", + expectation: ExpectedToHold {} + }, + WetScheduledClaim { + identity: WitnessIdentity { module_path: "test.claim.spark.fabric_capacity_standing_wet_witness", function: "the_live_entry_reads_the_authority_before_judging_and_refuses_off_fleet" }, + entry: "dag/test/claim/spark/fabric_capacity_standing_wet_witness_test.dag", + function: "the_live_entry_reads_the_authority_before_judging_and_refuses_off_fleet", + expectation: ExpectedToHold {} + }, + WetScheduledClaim { + identity: WitnessIdentity { module_path: "test.claim.spark.spark_pair_serving_apply_wet_witness", function: "the_apply_seam_reads_the_authority_before_planning_and_refuses_off_fleet" }, + entry: "dag/test/claim/spark/spark_pair_serving_apply_wet_witness_test.dag", + function: "the_apply_seam_reads_the_authority_before_planning_and_refuses_off_fleet", + expectation: ExpectedToHold {} + }, WetScheduledClaim { identity: WitnessIdentity { module_path: "test.claim.devboot_text_blob_real_execution", function: "a_lease_claim_is_stored_as_exactly_its_bytes_in_the_bare_store_by_real_execution" }, entry: "dag/test/claim/devboot_text_blob_real_execution_witness_test.dag",