From 143ef11a60a52fa87aa646132dce75a9eadf3f91 Mon Sep 17 00:00:00 2001 From: ScottW514 Date: Sun, 6 Sep 2026 20:57:56 -0400 Subject: [PATCH] forgetest: the liveness test waits for the probe's log line; forgectrl pinned at 0.1.4 (the probe's detail text); the campaign log records the first campaign --- docs/CAMPAIGN-LOG.md | 36 +++++++++++++++++++ forgetest/forgetest/suite/motion.py | 6 ++++ .../forgectrl/forgectrl-pin.inc | 4 +-- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/docs/CAMPAIGN-LOG.md b/docs/CAMPAIGN-LOG.md index dc87596..56e4c09 100644 --- a/docs/CAMPAIGN-LOG.md +++ b/docs/CAMPAIGN-LOG.md @@ -9120,6 +9120,42 @@ rebuilt from that head with the taint stamps cleared: stamp kind. That pair is the one to flash; the 20260907000214 pair, never flashed, was removed. +The CI on 60e06c7 then failed the shared-UI check: the acceptance page's +`theme.css` had not followed forgectrl's (54f6574). The coverage lint, run +locally on the tree manifest before the next push, found `src/wizrun.h` +uncovered and the sheet test's entry for the font generator hollow (a +non-behavioral path), both fixed in the sheet test's `covers` (0df0162). +Every CI step then passed locally. Both pushed; the pair rebuilt from +0df0162: stamp **20260907002443**, the same kernel, the same checks, no +warning. That pair is the one to flash; the 20260907001140 pair, never +flashed, was removed. + +## 2026-09-07: the first campaign on image 20260907002443 finds two defects + +The operator flashed the dev image 20260907002443 and power-cycled; forgetest +took the fresh-boot reference; the unattended batch (67 tests) started at +00:36Z in campaign c-20260907003616-ba87. 43 tests passed in a row; the +44th, `motion.liveness-probe`, failed at 00:52Z with "the first probe after +the restart was not MOTION OK: []" and closed the campaign. The machine was +fine: forgectrl's log shows the probe after the masked restart reading +MOTION OK and the supervisor reporting motion verified. + +Two causes, one in the daemon and one in the test: + +- **The probe's log line was cut to three characters** ("MOTION OK - hea"). + The commissioning change that made the probe's detail text static for + the setup page (`super.c`, `probe_detail[96]`) left the probe call with + `sizeof(detail)` on what had become a pointer: four bytes. The image of + 2026-09-03 logged the whole line ("head accel p2p x=1746 y=1543 + (moving>=800 dead<=250)"). Fixed: `sizeof(probe_detail)`. +- **The test read the log once, too early.** It reads the daemon's log for + the probe line as soon as `/mode` reports motion verified; the line + reaches the file through rsyslog a moment later, and this time the read + came first. Fixed: the test waits up to ten seconds for the line. + +The fix needs a forgectrl pin bump, so the pair is rebuilt and the +campaign starts over on the next image. + ## Reference notes ### Head-IRQ source validation — the beam-emission hypothesis diff --git a/forgetest/forgetest/suite/motion.py b/forgetest/forgetest/suite/motion.py index fbe9747..ccd51b3 100644 --- a/forgetest/forgetest/suite/motion.py +++ b/forgetest/forgetest/suite/motion.py @@ -383,7 +383,13 @@ def _liveness_masked_restart(ctx, fc, ev): or m.get("controller") == "motion-fault"): break ctx.sleep(1) + # The probe's own line reaches the file through rsyslog a moment after + # the supervisor reports its verdict: wait for it, briefly. + t1 = time.time() lines = _probe_lines(FORGECTRL_LOG, off) + while not lines and time.time() - t1 < 10: + ctx.sleep(0.5) + lines = _probe_lines(FORGECTRL_LOG, off) for ln in lines: ctx.log(" %s", ln.split(" INFO ", 1)[-1] if " INFO " in ln else ln[-160:]) ev["masked_restart"] = {"mode": m, "probe_lines": lines[-4:], "motor_lock_after": ctx.sysfs("cnc/motor_lock")} diff --git a/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl-pin.inc b/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl-pin.inc index 6f6be66..be1c9e6 100644 --- a/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl-pin.inc +++ b/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl-pin.inc @@ -2,5 +2,5 @@ # only SRCREV and PV here - the image manifest leaves *-pin.inc out of the # layer content hash because the component entry already identifies the # pinned source (forgefirm-image-manifest.bbclass). -SRCREV = "c895630281a62dc380ee8ad47f274243f85014cd" -PV = "0.1.3" +SRCREV = "9b178c2bb70d781ecb5f995ef74ed88af988098e" +PV = "0.1.4"