From 89731e654b95ffc45054474700cf97758a322063 Mon Sep 17 00:00:00 2001 From: ScottW514 Date: Sat, 29 Aug 2026 15:55:21 -0400 Subject: [PATCH] Record the bench proof on image 20260829190323 and the warm-loop flow check CAMPAIGN-LOG: the three flowload t1 runs on the new image (judged rise 11.3, 11.1 and 11.8 C with the tube lit through most of each window, the laser's share on the line), and Test 3, the flow check from a warm loop (23.6 to 24.9 C baselines, 0 of 6 wrong, the 14.4 C limit 2.25 C above the flow band and 3.67 C below the no-flow band). flow_warm_validate.py takes the warm target and the warm-up budget as arguments (defaults 28 C, 20 min), and the bench page passes them; the warm-up still judges on the upstream sensor beside the heater, which is why this run's baselines stopped near 25 C (BRINGUP item 1). BRINGUP: item 1's open half is the loop above 25 C; item 22 holds what remains of the flow check under load. No catalog consequence: a bench tool's arguments and documentation; no runtime behavior of the release image changes. --- docs/BRINGUP.md | 24 +++++++------- docs/CAMPAIGN-LOG.md | 49 +++++++++++++++++++++++++++++ forgetest/forgetest/bench.py | 4 ++- scripts/bench/flow_warm_validate.py | 9 ++++-- 4 files changed, 70 insertions(+), 16 deletions(-) diff --git a/docs/BRINGUP.md b/docs/BRINGUP.md index 2f35572..d3cbf42 100644 --- a/docs/BRINGUP.md +++ b/docs/BRINGUP.md @@ -1045,11 +1045,11 @@ Open items only. Anything closed is in `CAMPAIGN-LOG.md`. 1. **Laser commissioning leftovers.** Verify the hardware button latch persists across kernel-run gaps mid-job (if OK_2_FIRE drops between motion bursts, the - fix is a stream keepalive across armed gaps); characterize warm-baseline - flow-check behavior under real laser heating (all flow characterization used - 19–23 °C baselines; physics argues the dependence is weak — ΔT = P/(ṁ·c) - carries no absolute-temperature term — but that is reasoning, not - measurement). + fix is a stream keepalive across armed gaps); the flow check's bands from + a loop warmer than 25 C (the bands hold from 19 to 25 C with the margin + widening warm; the warm-up in `flow_warm_validate.py` must be judged on + the mixed bulk, not the upstream sensor beside the heater, to reach 28 C + and above). 2. **Low-temperature gates and warm-up (planned).** Two keys in the Cooling card: `cool_temp_min` (hard floor, default ~5 °C, a fire gate) and `cool_temp_start` (warm-up gate, default ~16 °C) — a job starting below the @@ -1479,13 +1479,13 @@ Open items only. Anything closed is in `CAMPAIGN-LOG.md`. carries a common-mode offset of about 1 C that steps in when the airflow goes to the run profile, steps out when it returns to idle, and toggles between two levels in between. Together they put an - ordinary job's check within a few tenths of the limit. Owed, in order: - the engine's reading (means for the baseline and the end, the tube's - share taken off from the `hv_current` integral, one coefficient per - power model) on an image; three `flowload t1` runs to show the - engine's rise back in the dark band; a `cooling.*` catalog case with - an armed CW load; and if that is not enough, the void-on-emission - design with the tube as its own flow tracer. + ordinary job's check within a few tenths of the limit. The engine now + reads means and takes the tube's share off (`cool_laser_heat_cw`, + `cool_laser_heat_density`). Owed: a `cooling.*` catalog case with an + armed CW load; a re-measure of the two coefficients once a second + machine is on the bench (one tube, one supply so far); and if a lit + check still trips, the void-on-emission design with the tube as its + own flow tracer. Open question, the offset's source: the timing points at the airflow drive (the step lands one sample after the fans go to run duty, before any HV, and lifts when they go idle, long after the tube is dark), but diff --git a/docs/CAMPAIGN-LOG.md b/docs/CAMPAIGN-LOG.md index fc857c0..0ff976f 100644 --- a/docs/CAMPAIGN-LOG.md +++ b/docs/CAMPAIGN-LOG.md @@ -4308,6 +4308,55 @@ absurd coefficient is bounded at 3 C and no flow is still SUSPECT (17.2); under the density model the density coefficient applies (1.1 off). The `flowload` drill's verdict parser accepts the new suffix. +## 2026-08-29: image 20260829190323, the flow check under load on the bench + +Pins forgefirm d577629 (grblHAL-glowforge a7dcdca, forgectrl 2f18b16), +both images built rc=0 from the committed trees, the dev image flashed by +the operator at 19:11. Three `flowload t1` runs from the installed drill, +each a prompt press with the tube lit for 58 to 63 percent of the check +window, the check opening 4 to 7 s after the fire (about 15 s after the +session open, from the fresh history): + +| run | engine line | lit | +|---|---|---| +| 191517 | `verified (heater rise 11.3 C, dT 9.6 C; laser 0.8 off 12.0)` | 58 % | +| 192051 | `verified (heater rise 11.1 C, dT 9.4 C; laser 0.7 off 11.9)` | 63 % | +| 192439 | `verified (heater rise 11.8 C, dT 9.8 C; laser 0.7 off 12.5)` | 58 % | + +The judged rise sits in the loop's dark band, 2.6 to 3.3 C under the +14.4 C limit, where the same conditions read 14.1 in the morning. The arm +sequence on the new driver was clean in every run (prompt, armed on the +press, `Pgm End` and the disarm at program end, the window closed with +the M2, all 55 lines queued at once). The power-good warning at the session +open persists (BRINGUP item 23). Board left idle, heater off, conf +restored, nothing under `/data`; records in `bench-data/`. + +## 2026-08-29: the flow check from a warm loop (Test 3) + +The plan's third test: the check's bands from a heater-warmed loop, the +tube dark, run from the bench page as the `flow-warm` takeover +(`flow_warm_validate.py 3`, forgectrl and the controller stopped for the +run and restarted on its exit), three checks with the pump on and three +with it commanded off, alternating, each from a fresh warm-up. The tool's +warm target reads the upstream sensor, which sits near the heater and +reaches 28 C within two minutes while the mixed bulk settles near 24.5, so +the baselines landed at 23.6 to 24.9 C rather than the 28 to 30 the plan +asked for; the tree's copy now takes the target and the warm-up budget as +arguments (defaults 28 C, 20 min, registered on the bench page), and a +warm-up judged on the mixed bulk is the follow-up. + +| case | rises (C) | band | +|---|---|---| +| pump on | 11.54, 12.15, 11.78 | max 12.15 (cold data: 12.75) | +| pump off | 18.97, 18.70, 18.07 | min 18.07 (cold data: 16.04) | + +Every verdict correct; the 14.4 C limit sits 2.25 C above the warm flow +band and 3.67 C below the warm no-flow band, a 5.9 C gap where the cold +data has 3.3. A warmer loop sheds the heater's heat no worse with the pump +on and holds it better with the pump off, so `cool_flow_rise` needs no +warm-end value through 25 C; above that is not measured. Records: +`bench-data/flow_warm_log_20260829.txt`, `flow_warm_results_20260829.json`. + ## Superseded status notes ### Shared machine services — remaining polish, as listed 2026-08-13 diff --git a/forgetest/forgetest/bench.py b/forgetest/forgetest/bench.py index 827cfc6..ea21933 100644 --- a/forgetest/forgetest/bench.py +++ b/forgetest/forgetest/bench.py @@ -123,7 +123,9 @@ TOOLS = [ "desc": "Long run of the real re-check cadence via M8: verdicts, false faults, loop heat accumulation."}, {"id": "flow-warm", "title": "Coolant warm-baseline validation", "script": "flow_warm_validate.py", "safety": "takeover", "where": "board", "ported": True, - "args": [_arg("cycles", "int", 3, "cycles per case (flow / no-flow)")], + "args": [_arg("cycles", "int", 3, "cycles per case (flow / no-flow)"), + _arg("target_c", "float", 28.0, "warm the upstream sensor to this before each check"), + _arg("warm_min", "float", 20.0, "warm-up budget per check, minutes")], "desc": "Runs the real check (40 percent / 50 s, cut-profile fans) from a heater-warmed baseline, alternating " "flow and no-flow; results to the bench data directory. Slow: about 15 minutes per cycle."}, {"id": "critical-tier", "title": "Coolant critical-tier warm-loop drill", "script": "critical_tier_drill.py", diff --git a/scripts/bench/flow_warm_validate.py b/scripts/bench/flow_warm_validate.py index 2f890e4..c24fd12 100644 --- a/scripts/bench/flow_warm_validate.py +++ b/scripts/bench/flow_warm_validate.py @@ -15,7 +15,10 @@ controller stopped (the bench page's takeover does that; from a host, stop them first). Runs on the board or from a host (gfbench: GF_HOST). Results and the log go to the bench data directory (gfbench.data_path). -Usage: flow_warm_validate.py [cycles_per_case] (default 3) +Usage: flow_warm_validate.py [cycles_per_case] [target_c] [warm_budget_min] + (defaults 3, 28.0, 20: the loop's own heater at 50 percent plateaus + near 28 to 29 C in a 20 C room, the most a warm baseline can be + without the tube) """ import json import statistics @@ -29,8 +32,8 @@ RESULTS = data_path('flow_warm_results.json') DUTY = 40 CHECK_S = 50 THRESHOLD = float(setting('cool_flow_rise', 14.4)) # forgectrl's configured threshold -WARM_TARGET_C = 25.5 # what a ~19-20 C room permits at 50% duty -WARM_MAX_S = 780 +WARM_TARGET_C = float(sys.argv[2]) if len(sys.argv) > 2 else 28.0 +WARM_MAX_S = 60.0 * (float(sys.argv[3]) if len(sys.argv) > 3 else 20.0) ABORT_C = 48.0 FANS_RUN = ('echo 65535 > /sys/glowforge/thermal/exhaust_pwm; '