webapp/imaging: bump rewind threshold to stage_index <= 2
Reset trigger previously fired only when a new POST landed at idx <= 1,
which meant a reimage didn't reset the dashboard card until
Run-ShopfloorSetup ran post-PPKG (~10-20 min in). With the WinPE-phase
status push from startnet.cmd in commit 4e018fe firing at idx=2, that
earlier signal needs to count as a new-run marker too.
Threshold of 2 makes startnet.cmd the canonical reset point: within
seconds of PXE menu choice on the bay, the dashboard card flips from
the previous run's high-idx state back to "WinPE: PESetup / WIM apply"
+ fresh started_at.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -66,20 +66,28 @@ def update_session(payload: dict) -> dict:
|
|||||||
except (json.JSONDecodeError, OSError):
|
except (json.JSONDecodeError, OSError):
|
||||||
state = {}
|
state = {}
|
||||||
|
|
||||||
# Reimage detection: if the new payload's stage_index is <= 1 and we have
|
# Reimage detection: if the new payload's stage_index <= 2 (WinPE startnet
|
||||||
# an existing session that was further along, treat this as a fresh run.
|
# = 2, Run-ShopfloorSetup start = 1) AND that's lower than the cached
|
||||||
# Clear log_tail + reset started_at; preserve serial. Without this, a
|
# stage_index, treat as a fresh imaging run on the same bay. Clear
|
||||||
# reimage on the same bay leaves stale "succeeded" / high-idx state on
|
# log_tail + reset started_at; preserve serial; remember the previous
|
||||||
# the dashboard until the new run progresses past idx 1.
|
# run's last_updated for audit. Without this, a reimage leaves stale
|
||||||
|
# "succeeded" / high-idx state visible until the new run progresses
|
||||||
|
# past idx 2.
|
||||||
|
#
|
||||||
|
# Threshold of 2 covers the first signal of a new run: the WinPE-phase
|
||||||
|
# status push from startnet.cmd at idx=2 (fires within seconds of PXE
|
||||||
|
# menu choice). Previously the threshold was 1, which meant the reset
|
||||||
|
# only triggered once Run-ShopfloorSetup ran post-PPKG, ~10-20 minutes
|
||||||
|
# into a new run.
|
||||||
if state:
|
if state:
|
||||||
try:
|
try:
|
||||||
old_idx = int(state.get("stage_index") or 0)
|
old_idx = int(state.get("stage_index") or 0)
|
||||||
new_idx = int(payload.get("stage_index") or 0)
|
new_idx = int(payload.get("stage_index") or 0)
|
||||||
except (TypeError, ValueError):
|
except (TypeError, ValueError):
|
||||||
old_idx, new_idx = 0, 0
|
old_idx, new_idx = 0, 0
|
||||||
rewind = new_idx > 0 and new_idx < old_idx and new_idx <= 1
|
rewind = new_idx > 0 and new_idx < old_idx and new_idx <= 2
|
||||||
prev_done = state.get("status") in ("succeeded", "failed")
|
prev_done = state.get("status") in ("succeeded", "failed")
|
||||||
if rewind or (prev_done and new_idx > 0 and new_idx <= 1):
|
if rewind or (prev_done and new_idx > 0 and new_idx <= 2):
|
||||||
state = {"serial": serial, "previous_run_at": state.get("last_updated"), "log_tail": []}
|
state = {"serial": serial, "previous_run_at": state.get("last_updated"), "log_tail": []}
|
||||||
|
|
||||||
if not state:
|
if not state:
|
||||||
|
|||||||
Reference in New Issue
Block a user