------------------------ MODULE IgnoredWorkspaceRouting ------------------------ EXTENDS Naturals, TLC (*************************************************************************** Generation-level safety model for ignored-workspace routing policy admission, host-priority backing transitions, crash continuation, and unsafe controls. Path traversal, object-copy durability, and Git encoding are refinements. ***************************************************************************) CONSTANTS Correct, LiveReconcile, InitialHostImport, StaleOverlay, IsolatedExport, EagerAdmission, UnstableClone, Mode Modes == { Correct, LiveReconcile, InitialHostImport, StaleOverlay, IsolatedExport, EagerAdmission, UnstableClone } Policies == {"Host", "Isolated"} SealedPolicies == Policies \cup {"None"} Phases == { "Down", "Ready", "CloneCopying", "CloneInstalled", "DeletePending", "DeleteInstalled" } Payloads == {"Absent", "HostA", "HostB", "SandboxA", "Partial"} Transitions == {"None", "Initial", "Same", "HostToIsolated", "IsolatedToHost"} ASSUME Mode \in Modes VARIABLES phase, online, sourcePolicy, sealedPolicy, admittedPolicy, targetPolicy, generation, host, isolated, staging, cloneSource, intent, lastTransition, hostClassDisclosed, liveRouteChanged, initialHostImported, staleOverlayRetained, isolatedExported, incompleteAdmission, unstableCloneAdmitted vars == << phase, online, sourcePolicy, sealedPolicy, admittedPolicy, targetPolicy, generation, host, isolated, staging, cloneSource, intent, lastTransition, hostClassDisclosed, liveRouteChanged, initialHostImported, staleOverlayRetained, isolatedExported, incompleteAdmission, unstableCloneAdmitted >> SafetyFlags == << liveRouteChanged, initialHostImported, staleOverlayRetained, isolatedExported, incompleteAdmission, unstableCloneAdmitted >> TypeOK == /\ phase \in Phases /\ online \in BOOLEAN /\ sourcePolicy \in Policies /\ sealedPolicy \in SealedPolicies /\ admittedPolicy \in SealedPolicies /\ targetPolicy \in SealedPolicies /\ generation \in 0..3 /\ host \in Payloads /\ isolated \in Payloads /\ staging \in Payloads /\ cloneSource \in Payloads /\ intent \in BOOLEAN /\ lastTransition \in Transitions /\ hostClassDisclosed \in BOOLEAN /\ liveRouteChanged \in BOOLEAN /\ initialHostImported \in BOOLEAN /\ staleOverlayRetained \in BOOLEAN /\ isolatedExported \in BOOLEAN /\ incompleteAdmission \in BOOLEAN /\ unstableCloneAdmitted \in BOOLEAN Init == /\ phase = "Down" /\ online = TRUE /\ sourcePolicy \in Policies /\ sealedPolicy = "None" /\ admittedPolicy = "None" /\ targetPolicy = "None" /\ generation = 0 /\ host = "HostA" /\ isolated = "Absent" /\ staging = "Absent" /\ cloneSource = "Absent" /\ intent = FALSE /\ lastTransition = "None" /\ hostClassDisclosed = FALSE /\ liveRouteChanged = FALSE /\ initialHostImported = FALSE /\ staleOverlayRetained = FALSE /\ isolatedExported = FALSE /\ incompleteAdmission = FALSE /\ unstableCloneAdmitted = FALSE InitialStartHost == /\ online /\ phase = "Down" /\ generation = 0 /\ sealedPolicy = "None" /\ sourcePolicy = "Host" /\ phase' = "Ready" /\ sealedPolicy' = "Host" /\ admittedPolicy' = "Host" /\ targetPolicy' = "None" /\ generation' = 1 /\ isolated' = "Absent" /\ lastTransition' = "Initial" /\ hostClassDisclosed' = TRUE /\ UNCHANGED <> InitialStartIsolated == /\ online /\ phase = "Down" /\ generation = 0 /\ sealedPolicy = "None" /\ sourcePolicy = "Isolated" /\ phase' = "Ready" /\ sealedPolicy' = "Isolated" /\ admittedPolicy' = "Isolated" /\ targetPolicy' = "None" /\ generation' = 1 /\ isolated' = IF Mode = InitialHostImport THEN host ELSE "Absent" /\ initialHostImported' = (Mode = InitialHostImport) /\ lastTransition' = "Initial" /\ UNCHANGED <> MutateRoutingInput == /\ online /\ phase = "Ready" /\ sourcePolicy' = IF sourcePolicy = "Host" THEN "Isolated" ELSE "Host" /\ sealedPolicy' = IF Mode = LiveReconcile THEN sourcePolicy' ELSE sealedPolicy /\ liveRouteChanged' = (liveRouteChanged \/ (Mode = LiveReconcile)) /\ UNCHANGED <> SandboxWrite == /\ online /\ phase = "Ready" /\ IF sealedPolicy = "Host" THEN /\ host' = IF host = "HostA" THEN "HostB" ELSE "HostA" /\ isolated' = isolated ELSE /\ isolated' = "SandboxA" /\ host' = host /\ UNCHANGED <> HostWrite == /\ online /\ host' = IF host = "HostA" THEN "HostB" ELSE "HostA" /\ UNCHANGED <> Stop == /\ online /\ phase = "Ready" /\ generation < 3 /\ phase' = "Down" /\ UNCHANGED <> RestartSamePolicy == /\ online /\ phase = "Down" /\ sealedPolicy \in Policies /\ sourcePolicy = sealedPolicy /\ generation < 3 /\ phase' = "Ready" /\ admittedPolicy' = sealedPolicy /\ generation' = generation + 1 /\ lastTransition' = "Same" /\ hostClassDisclosed' = (hostClassDisclosed \/ (sealedPolicy = "Host")) /\ UNCHANGED <> BeginHostToIsolated == /\ online /\ phase = "Down" /\ sealedPolicy = "Host" /\ sourcePolicy = "Isolated" /\ generation < 3 /\ phase' = "CloneCopying" /\ targetPolicy' = "Isolated" /\ staging' = "Partial" /\ cloneSource' = host /\ intent' = TRUE /\ UNCHANGED <> FinishClone == /\ online /\ phase = "CloneCopying" /\ intent /\ staging = "Partial" /\ host = cloneSource /\ staging' = cloneSource /\ UNCHANGED <> InstallClone == /\ online /\ phase = "CloneCopying" /\ intent /\ staging = cloneSource /\ host = cloneSource /\ phase' = "CloneInstalled" /\ isolated' = cloneSource /\ UNCHANGED <> PublishClone == /\ online /\ phase = "CloneInstalled" /\ intent /\ isolated = cloneSource /\ host = cloneSource /\ phase' = "Ready" /\ sealedPolicy' = "Isolated" /\ admittedPolicy' = "Isolated" /\ targetPolicy' = "None" /\ generation' = generation + 1 /\ staging' = "Absent" /\ cloneSource' = "Absent" /\ intent' = FALSE /\ lastTransition' = "HostToIsolated" /\ UNCHANGED <> AbortUnstableClone == /\ online /\ phase = "CloneCopying" /\ intent /\ host # cloneSource /\ phase' = "Down" /\ targetPolicy' = "None" /\ staging' = "Absent" /\ cloneSource' = "Absent" /\ intent' = FALSE /\ UNCHANGED <> UnsafeEagerAdmission == /\ Mode = EagerAdmission /\ online /\ phase = "CloneCopying" /\ intent /\ staging = "Partial" /\ phase' = "Ready" /\ sealedPolicy' = "Isolated" /\ admittedPolicy' = "Isolated" /\ targetPolicy' = "None" /\ generation' = generation + 1 /\ intent' = FALSE /\ lastTransition' = "HostToIsolated" /\ incompleteAdmission' = TRUE /\ UNCHANGED <> UnsafePublishUnstableClone == /\ Mode = UnstableClone /\ online /\ phase = "CloneCopying" /\ intent /\ host # cloneSource /\ phase' = "Ready" /\ sealedPolicy' = "Isolated" /\ admittedPolicy' = "Isolated" /\ targetPolicy' = "None" /\ generation' = generation + 1 /\ isolated' = cloneSource /\ staging' = "Absent" /\ cloneSource' = "Absent" /\ intent' = FALSE /\ lastTransition' = "HostToIsolated" /\ unstableCloneAdmitted' = TRUE /\ UNCHANGED <> BeginIsolatedToHost == /\ online /\ phase = "Down" /\ sealedPolicy = "Isolated" /\ sourcePolicy = "Host" /\ generation < 3 /\ phase' = "DeletePending" /\ targetPolicy' = "Host" /\ intent' = TRUE /\ UNCHANGED <> DeleteIsolated == /\ online /\ phase = "DeletePending" /\ intent /\ phase' = "DeleteInstalled" /\ isolated' = "Absent" /\ UNCHANGED <> PublishHost == /\ online /\ phase = "DeleteInstalled" /\ intent /\ isolated = "Absent" /\ phase' = "Ready" /\ sealedPolicy' = "Host" /\ admittedPolicy' = "Host" /\ targetPolicy' = "None" /\ generation' = generation + 1 /\ intent' = FALSE /\ lastTransition' = "IsolatedToHost" /\ hostClassDisclosed' = TRUE /\ UNCHANGED <> UnsafeRetainStaleOverlay == /\ Mode = StaleOverlay /\ online /\ phase = "DeletePending" /\ intent /\ isolated # "Absent" /\ phase' = "Ready" /\ sealedPolicy' = "Host" /\ admittedPolicy' = "Host" /\ targetPolicy' = "None" /\ generation' = generation + 1 /\ intent' = FALSE /\ lastTransition' = "IsolatedToHost" /\ hostClassDisclosed' = TRUE /\ staleOverlayRetained' = TRUE /\ UNCHANGED <> UnsafeExportIsolated == /\ Mode = IsolatedExport /\ online /\ phase = "DeletePending" /\ intent /\ isolated # "Absent" /\ phase' = "Ready" /\ sealedPolicy' = "Host" /\ admittedPolicy' = "Host" /\ targetPolicy' = "None" /\ generation' = generation + 1 /\ host' = isolated /\ isolated' = "Absent" /\ intent' = FALSE /\ lastTransition' = "IsolatedToHost" /\ hostClassDisclosed' = TRUE /\ isolatedExported' = TRUE /\ UNCHANGED <> Crash == /\ online /\ phase \in { "CloneCopying", "CloneInstalled", "DeletePending", "DeleteInstalled" } /\ online' = FALSE /\ UNCHANGED <> Recover == /\ ~online /\ online' = TRUE /\ UNCHANGED <> Next == \/ InitialStartHost \/ InitialStartIsolated \/ MutateRoutingInput \/ SandboxWrite \/ HostWrite \/ Stop \/ RestartSamePolicy \/ BeginHostToIsolated \/ FinishClone \/ InstallClone \/ PublishClone \/ AbortUnstableClone \/ UnsafeEagerAdmission \/ UnsafePublishUnstableClone \/ BeginIsolatedToHost \/ DeleteIsolated \/ PublishHost \/ UnsafeRetainStaleOverlay \/ UnsafeExportIsolated \/ Crash \/ Recover Spec == Init /\ [][Next]_vars ReadyHasSealedPolicy == phase = "Ready" => sealedPolicy \in Policies ReadyUsesGenerationPolicy == phase = "Ready" => sealedPolicy = admittedPolicy UndisclosedHostNotImported == (~hostClassDisclosed /\ phase = "Ready" /\ sealedPolicy = "Isolated") => isolated \notin {"HostA", "HostB"} DownOrTransitionNotAdmitted == phase # "Ready" => targetPolicy \in SealedPolicies HostRouteHasNoIsolatedOverlay == (phase = "Ready" /\ sealedPolicy = "Host") => isolated = "Absent" TransitionIntentIsDurable == phase \in {"CloneCopying", "CloneInstalled", "DeletePending", "DeleteInstalled"} => intent NoUnsafeOutcome == /\ ~liveRouteChanged /\ ~initialHostImported /\ ~staleOverlayRetained /\ ~isolatedExported /\ ~incompleteAdmission /\ ~unstableCloneAdmitted RoutingSafety == /\ ReadyHasSealedPolicy /\ ReadyUsesGenerationPolicy /\ UndisclosedHostNotImported /\ DownOrTransitionNotAdmitted /\ HostRouteHasNoIsolatedOverlay /\ TransitionIntentIsDurable /\ NoUnsafeOutcome =============================================================================