Cortex.Pulse.State


On this page
  1. Overview
  2. Context
  3. Theorem Split
  4. Node Status Lattice
  5. Extensional Graph State
  6. Failure-Growth Order
  7. Recovery Normalization
  8. Normalization Theorem
Imports

Overview

This module defines the extensional state used by the fixed-topology Pulse kernel. Runtime payloads, failure details, and signal contents stay abstract; the proofs only inspect lifecycle status and whether a node has an output.

Context

The Haskell runtime stores maps keyed by durable node identifiers. The Lean model uses total functions over the finite topology instead, so the proofs can focus on lifecycle invariants rather than map bookkeeping.

Theorem Split

The page introduces the status lattice, the extensional graph state, the topology-domain invariant, and the recovery normalization lemma that removes volatile running marks.

namespace Cortex.Pulse

Node Status Lattice

NodeStatus is the lifecycle status for a node in the fixed-topology kernel.

The constructors mirror the runtime states in Cortex.Pulse.GraphRuntime while erasing payload details that are irrelevant to structural safety.

inductive NodeStatus : Type where | pending : NodeStatus | running : NodeStatus | completed : NodeStatus | failed : NodeStatus | skipped : NodeStatus | interrupted : NodeStatus | waiting : NodeStatus | rewritten : NodeStatus deriving Repr, DecidableEqnamespace NodeStatus

NodeStatus.terminal status means the status cannot make another local transition.

def terminal : NodeStatus Prop | completed => True | failed => True | skipped => True | rewritten => True | pending => False | running => False | interrupted => False | waiting => False

NodeStatus.propagatable status means failure closure may overwrite it with failed.

def propagatable : NodeStatus Prop | pending => True | waiting => True | completed => False | failed => False | skipped => False | running => False | interrupted => False | rewritten => False

NodeStatus.mayHaveOutput status means the status owns a durable payload.

def mayHaveOutput : NodeStatus Prop | completed => True | failed => False | skipped => False | rewritten => True | pending => False | running => False | interrupted => False | waiting => False

NodeStatus.requiresOutput status means the status must carry a durable payload.

def requiresOutput : NodeStatus Prop | completed => True | rewritten => True | failed => False | skipped => False | pending => False | running => False | interrupted => False | waiting => False

NodeStatus.unblocksSuccessors status means direct successors may run past it.

def unblocksSuccessors : NodeStatus Prop | completed => True | skipped => True | rewritten => True | failed => False | pending => False | running => False | interrupted => False | waiting => False

failureLe before after orders states by failure-propagation growth.

A status can stay unchanged, or a still-propagatable status can become failed. This is the order used for monotonicity of failure closure.

def failureLe : NodeStatus NodeStatus Prop | before, after => before = after (propagatable before after = failed)

unblocks_terminal says successor-unblocking statuses are terminal.

theorem unblocks_terminal {status : NodeStatus} (hUnblocks : unblocksSuccessors status) : terminal status := status:NodeStatushUnblocks:status.unblocksSuccessorsstatus.terminal hUnblocks:pending.unblocksSuccessorspending.terminalhUnblocks:running.unblocksSuccessorsrunning.terminalhUnblocks:completed.unblocksSuccessorscompleted.terminalhUnblocks:failed.unblocksSuccessorsfailed.terminalhUnblocks:skipped.unblocksSuccessorsskipped.terminalhUnblocks:interrupted.unblocksSuccessorsinterrupted.terminalhUnblocks:waiting.unblocksSuccessorswaiting.terminalhUnblocks:rewritten.unblocksSuccessorsrewritten.terminal hUnblocks:pending.unblocksSuccessorspending.terminalhUnblocks:running.unblocksSuccessorsrunning.terminalhUnblocks:completed.unblocksSuccessorscompleted.terminalhUnblocks:failed.unblocksSuccessorsfailed.terminalhUnblocks:skipped.unblocksSuccessorsskipped.terminalhUnblocks:interrupted.unblocksSuccessorsinterrupted.terminalhUnblocks:waiting.unblocksSuccessorswaiting.terminalhUnblocks:rewritten.unblocksSuccessorsrewritten.terminal All goals completed! 🐙

terminal_unblocks_of_not_failed recovers runtime-unblocking terminal statuses.

theorem terminal_unblocks_of_not_failed {status : NodeStatus} (hTerminal : terminal status) (hNotFailed : status failed) : unblocksSuccessors status := status:NodeStatushTerminal:status.terminalhNotFailed:status failedstatus.unblocksSuccessors hTerminal:pending.terminalhNotFailed:pending failedpending.unblocksSuccessorshTerminal:running.terminalhNotFailed:running failedrunning.unblocksSuccessorshTerminal:completed.terminalhNotFailed:completed failedcompleted.unblocksSuccessorshTerminal:failed.terminalhNotFailed:failed failedfailed.unblocksSuccessorshTerminal:skipped.terminalhNotFailed:skipped failedskipped.unblocksSuccessorshTerminal:interrupted.terminalhNotFailed:interrupted failedinterrupted.unblocksSuccessorshTerminal:waiting.terminalhNotFailed:waiting failedwaiting.unblocksSuccessorshTerminal:rewritten.terminalhNotFailed:rewritten failedrewritten.unblocksSuccessors hTerminal:pending.terminalhNotFailed:pending failedpending.unblocksSuccessorshTerminal:running.terminalhNotFailed:running failedrunning.unblocksSuccessorshTerminal:completed.terminalhNotFailed:completed failedcompleted.unblocksSuccessorshTerminal:failed.terminalhNotFailed:failed failedfailed.unblocksSuccessorshTerminal:skipped.terminalhNotFailed:skipped failedskipped.unblocksSuccessorshTerminal:interrupted.terminalhNotFailed:interrupted failedinterrupted.unblocksSuccessorshTerminal:waiting.terminalhNotFailed:waiting failedwaiting.unblocksSuccessorshTerminal:rewritten.terminalhNotFailed:rewritten failedrewritten.unblocksSuccessors All goals completed! 🐙

pending_not_terminal states that a pending node is not terminal.

theorem pending_not_terminal : ¬ terminal pending := ¬pending.terminal hTerminal:pending.terminalFalse All goals completed! 🐙

failed_not_propagatable states that a failed node is not propagatable.

theorem failed_not_propagatable : ¬ propagatable failed := ¬failed.propagatable hPropagatable:failed.propagatableFalse All goals completed! 🐙

failureLe_refl says status failure-growth is reflexive.

theorem failureLe_refl (status : NodeStatus) : failureLe status status := Or.inl rfl

failureLe_to_failed turns a propagatable status into a failure-growth step.

theorem failureLe_to_failed {status : NodeStatus} (hPropagatable : propagatable status) : failureLe status failed := Or.inr hPropagatable, rfl

failed_of_failureLe_failed says failed statuses cannot grow to another status.

theorem failed_of_failureLe_failed {after : NodeStatus} (hLe : failureLe failed after) : after = failed := after:NodeStatushLe:failed.failureLe afterafter = failed after:NodeStatushSame:failed = afterafter = failedafter:NodeStatushFailure:failed.propagatable after = failedafter = failed after:NodeStatushSame:failed = afterafter = failed All goals completed! 🐙 after:NodeStatushFailure:failed.propagatable after = failedafter = failed All goals completed! 🐙

failureLe_preserves_failed says failure-growth preserves existing failures.

theorem failureLe_preserves_failed {before after : NodeStatus} (hLe : failureLe before after) (hFailed : before = failed) : after = failed := before:NodeStatusafter:NodeStatushLe:before.failureLe afterhFailed:before = failedafter = failed after:NodeStatushLe:failed.failureLe afterafter = failed All goals completed! 🐙

failureLe_reflects_propagatable pulls propagatability back through failure-growth.

theorem failureLe_reflects_propagatable {before after : NodeStatus} (hLe : failureLe before after) (hPropagatable : propagatable after) : propagatable before := before:NodeStatusafter:NodeStatushLe:before.failureLe afterhPropagatable:after.propagatablebefore.propagatable before:NodeStatusafter:NodeStatushPropagatable:after.propagatablehSame:before = afterbefore.propagatablebefore:NodeStatusafter:NodeStatushPropagatable:after.propagatablehFailure:before.propagatable after = failedbefore.propagatable before:NodeStatusafter:NodeStatushPropagatable:after.propagatablehSame:before = afterbefore.propagatable before:NodeStatushPropagatable:before.propagatablebefore.propagatable All goals completed! 🐙 before:NodeStatusafter:NodeStatushPropagatable:after.propagatablehFailure:before.propagatable after = failedbefore.propagatable All goals completed! 🐙

failureLe_trans says status failure-growth is transitive.

theorem failureLe_trans {left middle right : NodeStatus} (hLeft : failureLe left middle) (hRight : failureLe middle right) : failureLe left right := left:NodeStatusmiddle:NodeStatusright:NodeStatushLeft:left.failureLe middlehRight:middle.failureLe rightleft.failureLe right left:NodeStatusmiddle:NodeStatusright:NodeStatushRight:middle.failureLe righthSame:left = middleleft.failureLe rightleft:NodeStatusmiddle:NodeStatusright:NodeStatushRight:middle.failureLe righthFailure:left.propagatable middle = failedleft.failureLe right left:NodeStatusmiddle:NodeStatusright:NodeStatushRight:middle.failureLe righthSame:left = middleleft.failureLe right left:NodeStatusright:NodeStatushRight:left.failureLe rightleft.failureLe right All goals completed! 🐙 left:NodeStatusmiddle:NodeStatusright:NodeStatushRight:middle.failureLe righthFailure:left.propagatable middle = failedleft.failureLe right left:NodeStatusmiddle:NodeStatusright:NodeStatushRight:middle.failureLe righthPropagatable:left.propagatablehMiddleFailed:middle = failedleft.failureLe right left:NodeStatusright:NodeStatushPropagatable:left.propagatablehRight:failed.failureLe rightleft.failureLe right left:NodeStatusright:NodeStatushPropagatable:left.propagatablehRight:failed.failureLe righthRightFailed:right = failedleft.failureLe right left:NodeStatushPropagatable:left.propagatablehRight:failed.failureLe failedleft.failureLe failed All goals completed! 🐙end NodeStatus

Extensional Graph State

GraphState ν payload is node statuses plus optional node outputs.

structure GraphState (ν : Type u) (payload : Type v) where

status node is the current lifecycle status for a node.

status : ν NodeStatus

output node is the optional node output. Payload contents remain abstract.

output : ν Option payloadnamespace GraphStatevariable {ν : Type u} {payload : Type v}@[ext] theorem ext {s t : GraphState ν payload} (hStatus : n : ν, s.status n = t.status n) (hOutput : n : ν, s.output n = t.output n) : s = t := ν:Type upayload:Type vs:GraphState ν payloadt:GraphState ν payloadhStatus: (n : ν), s.status n = t.status nhOutput: (n : ν), s.output n = t.output ns = t cases s with ν:Type upayload:Type vt:GraphState ν payloadsStatus:ν NodeStatussOutput:ν Option payloadhStatus: (n : ν), { status := sStatus, output := sOutput }.status n = t.status nhOutput: (n : ν), { status := sStatus, output := sOutput }.output n = t.output n{ status := sStatus, output := sOutput } = t cases t with ν:Type upayload:Type vsStatus:ν NodeStatussOutput:ν Option payloadtStatus:ν NodeStatustOutput:ν Option payloadhStatus: (n : ν), { status := sStatus, output := sOutput }.status n = { status := tStatus, output := tOutput }.status nhOutput: (n : ν), { status := sStatus, output := sOutput }.output n = { status := tStatus, output := tOutput }.output n{ status := sStatus, output := sOutput } = { status := tStatus, output := tOutput } ν:Type upayload:Type vsStatus:ν NodeStatussOutput:ν Option payloadtStatus:ν NodeStatustOutput:ν Option payloadhStatus: (n : ν), sStatus n = tStatus nhOutput: (n : ν), sOutput n = tOutput n{ status := sStatus, output := sOutput } = { status := tStatus, output := tOutput } ν:Type upayload:Type vsStatus:ν NodeStatussOutput:ν Option payloadtOutput:ν Option payloadhOutput: (n : ν), sOutput n = tOutput nhStatus: (n : ν), sStatus n = sStatus n{ status := sStatus, output := sOutput } = { status := sStatus, output := tOutput } ν:Type upayload:Type vsStatus:ν NodeStatussOutput:ν Option payloadhStatus: (n : ν), sStatus n = sStatus nhOutput: (n : ν), sOutput n = sOutput n{ status := sStatus, output := sOutput } = { status := sStatus, output := sOutput } All goals completed! 🐙

GraphState.initial sets every node to pending with no output.

def initial : GraphState ν payload where status := fun _ => NodeStatus.pending output := fun _ => none

Failure-Growth Order

GraphState.failureLe left right lifts status failure-growth pointwise.

Outputs are intentionally outside this order because failure propagation does not inspect them; output ownership and preservation are separate invariants.

def failureLe (left right : GraphState ν payload) : Prop := node : ν, NodeStatus.failureLe (left.status node) (right.status node)

failureLe_refl says graph-state failure-growth is reflexive.

theorem failureLe_refl (state : GraphState ν payload) : failureLe state state := ν:Type upayload:Type vstate:GraphState ν payloadstate.failureLe state ν:Type upayload:Type vstate:GraphState ν payloadnode:ν(state.status node).failureLe (state.status node) All goals completed! 🐙

failureLe_trans says graph-state failure-growth is transitive.

theorem failureLe_trans {left middle right : GraphState ν payload} (hLeft : failureLe left middle) (hRight : failureLe middle right) : failureLe left right := ν:Type upayload:Type vleft:GraphState ν payloadmiddle:GraphState ν payloadright:GraphState ν payloadhLeft:left.failureLe middlehRight:middle.failureLe rightleft.failureLe right ν:Type upayload:Type vleft:GraphState ν payloadmiddle:GraphState ν payloadright:GraphState ν payloadhLeft:left.failureLe middlehRight:middle.failureLe rightnode:ν(left.status node).failureLe (right.status node) All goals completed! 🐙

failureLe_preserves_failed lifts failed-status preservation to graph states.

theorem failureLe_preserves_failed {left right : GraphState ν payload} (hLe : failureLe left right) {node : ν} (hFailed : left.status node = NodeStatus.failed) : right.status node = NodeStatus.failed := NodeStatus.failureLe_preserves_failed (hLe node) hFailed

Recovery Normalization

resetStatus status resets only volatile execution statuses before resumption.

def resetStatus : NodeStatus NodeStatus | NodeStatus.running => NodeStatus.pending | NodeStatus.interrupted => NodeStatus.pending | NodeStatus.pending => NodeStatus.pending | NodeStatus.completed => NodeStatus.completed | NodeStatus.failed => NodeStatus.failed | NodeStatus.skipped => NodeStatus.skipped | NodeStatus.waiting => NodeStatus.waiting | NodeStatus.rewritten => NodeStatus.rewritten

resetStatus_preserves_terminal preserves terminal status through recovery reset.

theorem resetStatus_preserves_terminal {status : NodeStatus} (hTerminal : NodeStatus.terminal status) : NodeStatus.terminal (resetStatus status) := status:NodeStatushTerminal:status.terminal(resetStatus status).terminal hTerminal:NodeStatus.pending.terminal(resetStatus NodeStatus.pending).terminalhTerminal:NodeStatus.running.terminal(resetStatus NodeStatus.running).terminalhTerminal:NodeStatus.completed.terminal(resetStatus NodeStatus.completed).terminalhTerminal:NodeStatus.failed.terminal(resetStatus NodeStatus.failed).terminalhTerminal:NodeStatus.skipped.terminal(resetStatus NodeStatus.skipped).terminalhTerminal:NodeStatus.interrupted.terminal(resetStatus NodeStatus.interrupted).terminalhTerminal:NodeStatus.waiting.terminal(resetStatus NodeStatus.waiting).terminalhTerminal:NodeStatus.rewritten.terminal(resetStatus NodeStatus.rewritten).terminal hTerminal:NodeStatus.pending.terminal(resetStatus NodeStatus.pending).terminalhTerminal:NodeStatus.running.terminal(resetStatus NodeStatus.running).terminalhTerminal:NodeStatus.completed.terminal(resetStatus NodeStatus.completed).terminalhTerminal:NodeStatus.failed.terminal(resetStatus NodeStatus.failed).terminalhTerminal:NodeStatus.skipped.terminal(resetStatus NodeStatus.skipped).terminalhTerminal:NodeStatus.interrupted.terminal(resetStatus NodeStatus.interrupted).terminalhTerminal:NodeStatus.waiting.terminal(resetStatus NodeStatus.waiting).terminalhTerminal:NodeStatus.rewritten.terminal(resetStatus NodeStatus.rewritten).terminal All goals completed! 🐙

resetStatus_reflects_unblocks recovers original unblocking from reset unblocking.

theorem resetStatus_reflects_unblocks {status : NodeStatus} (hUnblocks : NodeStatus.unblocksSuccessors (resetStatus status)) : NodeStatus.unblocksSuccessors status := status:NodeStatushUnblocks:(resetStatus status).unblocksSuccessorsstatus.unblocksSuccessors hUnblocks:(resetStatus NodeStatus.pending).unblocksSuccessorsNodeStatus.pending.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.running).unblocksSuccessorsNodeStatus.running.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.completed).unblocksSuccessorsNodeStatus.completed.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.failed).unblocksSuccessorsNodeStatus.failed.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.skipped).unblocksSuccessorsNodeStatus.skipped.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.interrupted).unblocksSuccessorsNodeStatus.interrupted.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.waiting).unblocksSuccessorsNodeStatus.waiting.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.rewritten).unblocksSuccessorsNodeStatus.rewritten.unblocksSuccessors hUnblocks:(resetStatus NodeStatus.pending).unblocksSuccessorsNodeStatus.pending.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.running).unblocksSuccessorsNodeStatus.running.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.completed).unblocksSuccessorsNodeStatus.completed.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.failed).unblocksSuccessorsNodeStatus.failed.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.skipped).unblocksSuccessorsNodeStatus.skipped.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.interrupted).unblocksSuccessorsNodeStatus.interrupted.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.waiting).unblocksSuccessorsNodeStatus.waiting.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.rewritten).unblocksSuccessorsNodeStatus.rewritten.unblocksSuccessors All goals completed! 🐙

resetStatus_reflects_requiresOutput recovers original output requirements.

theorem resetStatus_reflects_requiresOutput {status : NodeStatus} (hRequiresOutput : NodeStatus.requiresOutput (resetStatus status)) : NodeStatus.requiresOutput status := status:NodeStatushRequiresOutput:(resetStatus status).requiresOutputstatus.requiresOutput hRequiresOutput:(resetStatus NodeStatus.pending).requiresOutputNodeStatus.pending.requiresOutputhRequiresOutput:(resetStatus NodeStatus.running).requiresOutputNodeStatus.running.requiresOutputhRequiresOutput:(resetStatus NodeStatus.completed).requiresOutputNodeStatus.completed.requiresOutputhRequiresOutput:(resetStatus NodeStatus.failed).requiresOutputNodeStatus.failed.requiresOutputhRequiresOutput:(resetStatus NodeStatus.skipped).requiresOutputNodeStatus.skipped.requiresOutputhRequiresOutput:(resetStatus NodeStatus.interrupted).requiresOutputNodeStatus.interrupted.requiresOutputhRequiresOutput:(resetStatus NodeStatus.waiting).requiresOutputNodeStatus.waiting.requiresOutputhRequiresOutput:(resetStatus NodeStatus.rewritten).requiresOutputNodeStatus.rewritten.requiresOutput hRequiresOutput:(resetStatus NodeStatus.pending).requiresOutputNodeStatus.pending.requiresOutputhRequiresOutput:(resetStatus NodeStatus.running).requiresOutputNodeStatus.running.requiresOutputhRequiresOutput:(resetStatus NodeStatus.completed).requiresOutputNodeStatus.completed.requiresOutputhRequiresOutput:(resetStatus NodeStatus.failed).requiresOutputNodeStatus.failed.requiresOutputhRequiresOutput:(resetStatus NodeStatus.skipped).requiresOutputNodeStatus.skipped.requiresOutputhRequiresOutput:(resetStatus NodeStatus.interrupted).requiresOutputNodeStatus.interrupted.requiresOutputhRequiresOutput:(resetStatus NodeStatus.waiting).requiresOutputNodeStatus.waiting.requiresOutputhRequiresOutput:(resetStatus NodeStatus.rewritten).requiresOutputNodeStatus.rewritten.requiresOutput All goals completed! 🐙

resetRunningToPending state makes in-flight nodes pending again after a crash.

def resetRunningToPending (s : GraphState ν payload) : GraphState ν payload where status := fun n => resetStatus (s.status n) output := s.output

noRunningNodes state means no node is still marked as running.

def noRunningNodes (s : GraphState ν payload) : Prop := n : ν, s.status n NodeStatus.running

noInterruptedNodes state means recovery has removed interrupted markers.

def noInterruptedNodes (s : GraphState ν payload) : Prop := n : ν, s.status n NodeStatus.interrupted

outputsRespectStatuses state constrains outputs to statuses that may retain them.

def outputsRespectStatuses (s : GraphState ν payload) : Prop := (n : ν) (value : payload), s.output n = some value NodeStatus.mayHaveOutput (s.status n)

outputsCompleteForStatuses state requires payload-owning statuses to have outputs.

def outputsCompleteForStatuses (s : GraphState ν payload) : Prop := n : ν, NodeStatus.requiresOutput (s.status n) value : payload, s.output n = some value

topologyDomain G state says off-topology nodes are absent from durable state.

def topologyDomain (G : DAG ν) (s : GraphState ν payload) : Prop := n : ν, n G.nodes s.status n = NodeStatus.pending s.output n = none

Normalization Theorem

resetRunning_no_running proves status reset removes every running marker.

theorem resetRunning_no_running (s : GraphState ν payload) : noRunningNodes (resetRunningToPending s) := ν:Type upayload:Type vs:GraphState ν payloads.resetRunningToPending.noRunningNodes ν:Type upayload:Type vs:GraphState ν payloadn:νs.resetRunningToPending.status n NodeStatus.running ν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.pendings.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.runnings.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.completeds.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.faileds.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.skippeds.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.interrupteds.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.waitings.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.rewrittens.resetRunningToPending.status n NodeStatus.running ν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.pendings.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.runnings.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.completeds.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.faileds.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.skippeds.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.interrupteds.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.waitings.resetRunningToPending.status n NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.rewrittens.resetRunningToPending.status n NodeStatus.running All goals completed! 🐙

resetRunning_no_interrupted proves status reset removes every interrupted marker.

theorem resetRunning_no_interrupted (s : GraphState ν payload) : noInterruptedNodes (resetRunningToPending s) := ν:Type upayload:Type vs:GraphState ν payloads.resetRunningToPending.noInterruptedNodes ν:Type upayload:Type vs:GraphState ν payloadn:νs.resetRunningToPending.status n NodeStatus.interrupted ν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.pendings.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.runnings.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.completeds.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.faileds.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.skippeds.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.interrupteds.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.waitings.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.rewrittens.resetRunningToPending.status n NodeStatus.interrupted ν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.pendings.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.runnings.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.completeds.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.faileds.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.skippeds.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.interrupteds.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.waitings.resetRunningToPending.status n NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.rewrittens.resetRunningToPending.status n NodeStatus.interrupted All goals completed! 🐙

resetRunning_preserves_topologyDomain preserves the off-topology invariant.

theorem resetRunning_preserves_topologyDomain (G : DAG ν) (s : GraphState ν payload) (hDomain : topologyDomain G s) : topologyDomain G (resetRunningToPending s) := ν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G stopologyDomain G s.resetRunningToPending intro node ν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G snode:νhNotMem:node G.nodess.resetRunningToPending.status node = NodeStatus.pending s.resetRunningToPending.output node = none ν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G snode:νhNotMem:node G.nodeshStatus:s.status node = NodeStatus.pendinghOutput:s.output node = nones.resetRunningToPending.status node = NodeStatus.pending s.resetRunningToPending.output node = none ν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G snode:νhNotMem:node G.nodeshStatus:s.status node = NodeStatus.pendinghOutput:s.output node = nones.resetRunningToPending.status node = NodeStatus.pendingν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G snode:νhNotMem:node G.nodeshStatus:s.status node = NodeStatus.pendinghOutput:s.output node = nones.resetRunningToPending.output node = none ν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G snode:νhNotMem:node G.nodeshStatus:s.status node = NodeStatus.pendinghOutput:s.output node = nones.resetRunningToPending.status node = NodeStatus.pending All goals completed! 🐙 ν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G snode:νhNotMem:node G.nodeshStatus:s.status node = NodeStatus.pendinghOutput:s.output node = nones.resetRunningToPending.output node = none All goals completed! 🐙

resetRunning_preserves_outputsRespectStatuses preserves output ownership.

theorem resetRunning_preserves_outputsRespectStatuses (s : GraphState ν payload) (hOutputs : outputsRespectStatuses s) : outputsRespectStatuses (resetRunningToPending s) := ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusess.resetRunningToPending.outputsRespectStatuses intro node ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloads.resetRunningToPending.output node = some value (s.resetRunningToPending.status node).mayHaveOutput ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some value(s.resetRunningToPending.status node).mayHaveOutput ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutput(s.resetRunningToPending.status node).mayHaveOutput ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.pending(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.running(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.completed(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.failed(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.skipped(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.interrupted(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.waiting(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.rewritten(s.resetRunningToPending.status node).mayHaveOutput ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.pending(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.running(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.completed(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.failed(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.skipped(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.interrupted(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.waiting(s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.rewritten(s.resetRunningToPending.status node).mayHaveOutput All goals completed! 🐙

resetRunning_preserves_outputsCompleteForStatuses preserves required outputs.

theorem resetRunning_preserves_outputsCompleteForStatuses (s : GraphState ν payload) (hOutputs : outputsCompleteForStatuses s) : outputsCompleteForStatuses (resetRunningToPending s) := ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsCompleteForStatusess.resetRunningToPending.outputsCompleteForStatuses intro node ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsCompleteForStatusesnode:νhRequiresOutput:(s.resetRunningToPending.status node).requiresOutput value, s.resetRunningToPending.output node = some value have hResetRequires : NodeStatus.requiresOutput (resetStatus (s.status node)) := ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsCompleteForStatusess.resetRunningToPending.outputsCompleteForStatuses All goals completed! 🐙 All goals completed! 🐙end GraphStateend Cortex.Pulse