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"