A step someone claimed is not a step that was sensed. Each row has two columns, OPERATOR and SENSOR, and they never merge into one tick: a step is VERIFIED only when both agree. The interlock opens on the sensor, so PRESSURISE below, claimed and not backed, holds everything after it, and every waiting row says what it waits on before anyone presses. CREW CLEAR has no sensor: it can only ever be claimed, and a sequence that rests on it completes ON CLAIM, outlined, never the filled ARMED. A verified step whose sensor goes back reads SENSE LOST; a dropout reads NO DATA and verifies nothing. The buttons below are the sensors; the CONFIRM buttons in each row are yours.
import 'overscan'
import 'overscan/overscan.css'
<ov-procedure
steps="SEAL HATCH,PRESSURISE,CREW CLEAR,ARM PYROS,RELEASE CLAMPS"
unsensed="CREW CLEAR"
armed="ARMED"
sensed="SEAL HATCH=on, PRESSURISE=off, RELEASE CLAMPS=on"
claimed="SEAL HATCH,PRESSURISE"
label="Launch arming"
></ov-procedure>import { OvProcedure } from 'overscan/react'
<OvProcedure
steps="SEAL HATCH,PRESSURISE,CREW CLEAR,ARM PYROS,RELEASE CLAMPS"
unsensed="CREW CLEAR"
armed="ARMED"
sensed="SEAL HATCH=on, PRESSURISE=off, RELEASE CLAMPS=on"
claimed="SEAL HATCH,PRESSURISE"
label="Launch arming"
/>import { OvProcedure } from 'overscan/vue'
<OvProcedure
steps="SEAL HATCH,PRESSURISE,CREW CLEAR,ARM PYROS,RELEASE CLAMPS"
unsensed="CREW CLEAR"
armed="ARMED"
sensed="SEAL HATCH=on, PRESSURISE=off, RELEASE CLAMPS=on"
claimed="SEAL HATCH,PRESSURISE"
label="Launch arming"
/>import OvProcedure from 'overscan/svelte/OvProcedure.svelte'
<OvProcedure
steps="SEAL HATCH,PRESSURISE,CREW CLEAR,ARM PYROS,RELEASE CLAMPS"
unsensed="CREW CLEAR"
armed="ARMED"
sensed="SEAL HATCH=on, PRESSURISE=off, RELEASE CLAMPS=on"
claimed="SEAL HATCH,PRESSURISE"
label="Launch arming"
/>