From 5249c1ecf8a0ede3170b293ed1b46d3d137f81a2 Mon Sep 17 00:00:00 2001 From: ScottW514 Date: Fri, 21 Aug 2026 18:39:43 -0400 Subject: [PATCH] CAMPAIGN-LOG: the job's limits pass through on a live session cloud.pause-resume passed on dev image 20260821220926 with the service's hunt windows (10 to 50 C) ignored as looser and the print's window (33 C, 5 C floor, 116 rpm air-assist floor) matched. The test now quotes the print's job-limits line rather than the session's first (a hunt's), and keeps the engine line that carries the header beside the last one. forgectrl pin moves to e0b41b3 (the "not stricter" notice once per value). --- docs/BRINGUP.md | 4 ++- docs/CAMPAIGN-LOG.md | 25 +++++++++++++++++++ forgetest/forgetest/suite/cloud.py | 14 +++++++---- forgetest/tests/test_cloud_suite.py | 4 +-- .../forgectrl/forgectrl-pin.inc | 2 +- 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/docs/BRINGUP.md b/docs/BRINGUP.md index d837636..db7540f 100644 --- a/docs/BRINGUP.md +++ b/docs/BRINGUP.md @@ -1332,7 +1332,9 @@ Open items only. Anything closed is in `CAMPAIGN-LOG.md`. header, never loosening and never overruling an off gate, logs the effective set and publishes it in `/cool/status`; the coolant ceiling is the live consumer, the floors wait for the fan gates - (`cloud.pause-resume` checks both log lines on a real print). The fan + (`cloud.pause-resume` checks both log lines on a real print; bench PASS + 2026-08-21 on dev image `20260821220926`, the service's hunt windows + ignored as looser and the print's 33 C window matched). The fan gates, the coolant critical tier and the watch-only board temperatures follow. diff --git a/docs/CAMPAIGN-LOG.md b/docs/CAMPAIGN-LOG.md index 10f1f86..3d8ed96 100644 --- a/docs/CAMPAIGN-LOG.md +++ b/docs/CAMPAIGN-LOG.md @@ -3229,6 +3229,31 @@ test (forgefirm f274eb1) waits for the engine's phase to leave `run` after every M9 and cycles a session after restoring; it was hot-deployed to the board for this run and is in the next dev image. +## 2026-08-21: the job's limits pass through, seen on a live session + +`cloud.pause-resume` PASS on dev image `20260821220926` (campaign +`c-20260821222752-4d93`, 22:30:52Z), the first print under the header +pass-through. The two logs together, from the same session: + +- Every hunt and motion file the service sent carried a coolant window of + 10 to 50 C; the client derived `coolant_max_c=50.0 coolant_min_c=10.0` + from each, and the engine answered `effective limits: coolant ceiling + 33.0 C (local 33.0, header 50.0)` with `header coolant ceiling 50.0 C is + not stricter than the local 33.0 C; the local one stands`. +- The print carried `air_assist_min_rpm=116 coolant_max_c=33.0 + coolant_min_c=5.0` (the captured cut-job values: `AArx` 64500 us, `CMrx` + 33000, `CMrn` 5000); the engine resolved the ceiling at 33.0 (equal to + the local one, so the local stands) and published the floors (coolant + 5.0 C, air assist 116 rpm, exhaust and intake 0) for the gates to come. +- At the job's end the limits left with it and the effective set fell + back to local. + +Two refinements from the run, neither a behavior change: the "not +stricter" notice printed twice per job (forgectrl e0b41b3 names it once per +value), and the test quoted the session's first job-limits line, a hunt's, +where the print's is the one worth keeping (it now takes the first line +after the print's action request). + ## Superseded status notes ### Shared machine services — remaining polish, as listed 2026-08-13 diff --git a/forgetest/forgetest/suite/cloud.py b/forgetest/forgetest/suite/cloud.py index 0286d70..3eb6321 100644 --- a/forgetest/forgetest/suite/cloud.py +++ b/forgetest/forgetest/suite/cloud.py @@ -836,15 +836,19 @@ def pause_resume(ctx): # the air-assist tach maximum) and hands them to the engine with every # report, and the engine names the effective set it is running on, # with the header's ceiling beside its own. - limits = next((ln.split(LIMITS_MARK, 1)[1].strip() for ln in lines if LIMITS_MARK in ln), None) + # The session's hunts and motions carry their own (looser) windows; the + # line that matters is the print's, the first after its action request. + print_at = max((i for i, ln in enumerate(lines) if "service action request: print" in ln), default=-1) + limits = next((ln.split(LIMITS_MARK, 1)[1].strip() for ln in lines[print_at + 1:] if LIMITS_MARK in ln), None) ev["header_limits"] = limits - ctx.log("job limits from the header: %s", limits) + ctx.log("job limits from the header (the print's): %s", limits) ctx.check(limits is not None, "the client named no job limits from the header") ctx.check("coolant_max_c=" in limits, "the header's coolant ceiling did not reach the engine: %s", limits) eff = [ln.strip()[:200] for ln in log_lines_since(FORGECTRL_LOG, fc_offset) if EFFECTIVE_MARK in ln] - ev["effective_limits"] = eff[-3:] - ctx.log("engine effective limits: %s", eff[-1] if eff else None) - ctx.check(any("header " in ln and "header none" not in ln for ln in eff), + with_header = [ln for ln in eff if "header " in ln and "header none" not in ln] + ev["effective_limits"] = with_header[-1:] + eff[-1:] + ctx.log("engine effective limits: %s", with_header[-1] if with_header else None) + ctx.check(with_header, "the engine never resolved an effective ceiling against the header's: %s", eff[-2:]) settle_cloud(ctx, offset) diff --git a/forgetest/tests/test_cloud_suite.py b/forgetest/tests/test_cloud_suite.py index 1414cbc..4430803 100644 --- a/forgetest/tests/test_cloud_suite.py +++ b/forgetest/tests/test_cloud_suite.py @@ -344,8 +344,8 @@ class CloudSuiteTests(unittest.TestCase): # the job's envelope passed through: the client's line and the engine's self.assertEqual(ev["header_limits"], "air_assist_min_rpm=116 coolant_max_c=33.0 coolant_min_c=5.0") - self.assertEqual(len(ev["effective_limits"]), 1) - self.assertIn("header 33.0", ev["effective_limits"][0]) + self.assertIn("header 33.0", ev["effective_limits"][0]) # the line with the header + self.assertTrue(all("effective limits: coolant ceiling 33.0 C" in ln for ln in ev["effective_limits"])) def test_pause_resume_fails_when_the_client_names_no_header_limits(self): self.client_limits = False diff --git a/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl-pin.inc b/meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl-pin.inc index a58ae4b..460889c 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 = "57f6064214939422eec51f6044b5868dc839a291" +SRCREV = "e0b41b33ee13c29d0ff772b15a919b2b24bfa24b" PV = "0.1.0"