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).
This commit is contained in:
ScottW514
2026-08-21 18:39:43 -04:00
parent d530f773e2
commit 5249c1ecf8
5 changed files with 40 additions and 9 deletions
+3 -1
View File
@@ -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.
+25
View File
@@ -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
+9 -5
View File
@@ -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)
+2 -2
View File
@@ -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
@@ -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"