From c0c74d1658546f2d76c9956ab9fcc6b6d47781fe Mon Sep 17 00:00:00 2001 From: ScottW514 Date: Thu, 15 Oct 2026 21:27:22 -0400 Subject: [PATCH] laser_lifecycle_test: rule 3 names the holders of the sender-change reset Rule 3 of the header says a sender change closes the window and a reconnected client must re-arm. The harness does not walk the sequence on from there, a new sender's soft reset of the held job, as a session of its own (commit 09cf924 removed test_sender_change_then_reset), and the header did not say where each assertion of that sequence lives. The disarm and the latch relock at the change are laser_arm_test.c case H (glowforge_laser.c: the client generation changing mid-cycle enqueues the feed hold and disarms). The soft reset of the held job is the core's reset from a completed hold, which session hold-reset-restart walks under rule 10 with more asserted than the removed case had: the reset banner, Idle with no alarm, and the position kept. The hold's origin does not reach the reset path (driver.c driverReset disarms and resets the stream whatever held the job, and gflaser_disarm is idempotent), so the sender-change variant is a permutation of that one branch, and this repository keeps one proof per rule. Rule 3 now names both holders. Proof: header text only, no behavior change. python3 -B -m py_compile and pyflakes are clean on scripts/bench/laser_lifecycle_test.py, and the harness passes whole against the native null-sink build of the driver at badc832 (-DGFMCODE_WAIT_S=5.0), hold-reset-restart among its sessions. The harness runs in grblHAL-glowforge CI (python3 forgefirm/scripts/bench/laser_lifecycle_test.py build/grblHAL_glowforge). Acceptance: none; the header docstring of a harness outside every covers map. --- scripts/bench/laser_lifecycle_test.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/bench/laser_lifecycle_test.py b/scripts/bench/laser_lifecycle_test.py index 01a6a63..f0481a6 100644 --- a/scripts/bench/laser_lifecycle_test.py +++ b/scripts/bench/laser_lifecycle_test.py @@ -16,7 +16,10 @@ reported messages: 2. program end (M2) closing the window, and the next job arming afresh: laser_stream_test session K 3. a sender change closes the window: a reconnected client must - re-arm - the displaced session's consent does not carry over + re-arm - the displaced session's consent does not carry over; the + disarm and the relock at the change are laser_arm_test.c case H, + and a new sender's soft reset of the held job is the core's reset + from a completed hold, session hold-reset-restart under rule 10 4. the spindle-off grace counts down in HOLD, not only in Idle - a job abandoned in feed hold disarms after laser_disarm_s 5. arming refused while the cooling verdict blocks fire, or before