- baseline: the lid lamp fades to a new level (the kernel's smooth
trigger), so the hand-back reads it until it holds the wanted level
twice in a row, for up to 3 s, before it is a leftover.
motion.deadman failed its hand-back reading 232 against 236 0.05 s
after the supervisor re-applied 236 to a respawned controller.
- setup.check-lens and setup.focus: grblHAL reads the lens window and
the edge only at its start, and their restore came after the wizard
had restarted the controller on the test's values. Each test now waits
for the step to end, puts the settings back, and restarts the
controller (stop, start, running and verified with a new pid) on every
exit path; cloud mode restarts nothing.
- setup.focus and setup.floor: the served program ends with G0 Z<edge>,
G0 X0 Y0, G92.1, M2; setup.floor requires setup.focus and checks the
scrap's thickness against the lens reach; the burns cover lenshome.
- setup.check-intakes: the two assertions that could not fail are gone;
an intake-count prompt fails the test unanswered (the bench
reference's intakes both turn). The precheck's refusal names no
setting.
- setup.check-airflow: the machine's count rules (intake 2 turning
writes 2; silent on a one-fan machine, the count is not written).
Shared text: setup_dark.py's precheck string (all setup_dark tests,
setup_burns, setup.check-envelope), setup_burns.py's imports, covers,
docstring and preview check, cooling_intake.py's docstring; every test
they move covers paths forgectrl changed in the same work.
Proof: the forgetest host suite passes (548), with new host tests for
the lamp's fade, the restarts on pass, fail and abort, the floor's Focus
refusal and reach, the tail without G92.1, the intakes prompt, and the
airflow count rules; pyflakes is clean on the changed modules.
Acceptance: these are the tests.
setup.focus and setup.floor follow forgectrl: a burn counts on the tube
current and the kernel's LASER_ON samples, and its result records the
beam sensor's rise and beam_sensor_seen, never requiring a rise (a head
may give no output from the sensor). The check reads that both are
recorded and logs them; the descriptions name the two witnesses.
Proof: the setup host tests (74) and the manifest tests pass, two of
them new: a burn whose sensor gave no output passes, and a result that
does not record the sensor fails, each with the settings put back.
Acceptance: these are the tests.
The catalog follows forgectrl's setup (openglow-org/forgefirm#4): the
gate is the advisories with the press, the account, the required steps
(preferences, machine, cloud), and the intake fan count; every other
step is recommended; the setup sheet is retired for two self-contained
burns and a dark lens travel check; the override file is gone.
- setup.gate-blocks-controllers installs four records: without consent,
without the account, and without the three required steps the
controller is gated with the reason naming the cause; with them done
the gate opens, the controller runs, and the other steps are
recommended as not run. Clearing cool_intake_fans closes the gate live
with its reason, and putting it back as found reopens it.
- setup.override-until-reboot is deleted with its helpers, and
forgetest.init no longer writes the override file at boot.
- setup.first-run-flow follows the reason from the three required steps
to open; setup.first-run-page walks the choice screen after them;
setup.what-changed reads the one-level map with the gate unmoved.
- New setup.check-intakes (the count by the tachs equals the machine's,
the setting put back as found) and setup.check-lens (the window
written equals the stops found or the fallback, and the settings and
/status hold it; both keys restored). A precheck refuses the intake
and airflow checks while cool_intake_fans is unset, so neither can
leave it unset in the middle of a campaign.
- setup_burns.py replaces setup_sheet.py: setup.focus and setup.floor
answer the gantry stops, the home, the scrap and the thickness, and
keep the preview, emission and window checks; motion.tray starts the
focus burn for its tray-out refusal.
Proof: the forgetest host suite (529 before the required-steps edits,
and the full suite after them) and the manifest load pass; pyflakes
reports no undefined names. The coverage lint is clean against
forgectrl's working tree; against the current pin, setup.check-lens's
src/lensfind.* glob selects no file until the forgectrl pin moves to the
commit that adds it.
Acceptance: these are the tests themselves; the campaign runs them with
cool_intake_fans set on the bench.