Three catalog tests leave for the host proofs that now carry them; the
catalog goes from 106 to 103.
- cooling.report-channel. forgectrl's tests/host_routes.sh (e69d967)
runs the channel against a live daemon: a run report with the
controller's secret writes exhaust 65535; no secret, a wrong secret
and a short secret are 403 and the duty file is unchanged; an accepted
idle while the ring still reads running writes 32768; the secret dies
with the controller. cool_report_test.py and super_test case L own the
secret, and cooling.fans-quiet-after-motion owns the live M8/M9 return
to the idle duty. The forged Host: localhost was the same secret
refusal.
- events.stream. events_test.c owns the hello, the replacement, and
motors.released; host_routes.sh owns the live cap (three peers held,
a fourth 503, GET /settings 200 beside them, closing one admitting the
next). forgectrl.lease and exthost.events still cover src/events.*,
and _EventStream stays for forgectrl.lease.
- setup.what-changed. setup_test holds tray -> laser.focus and fan ->
airflow under the image's table beside tube -> laser.floor;
host_routes.sh holds /wiz/changed (403, 400) and that every step the
menu names is one GET /wiz lists. src/setup.* and src/wiz.* stay
covered by the other setup tests, and help.js, panel.js and index.html
by camera.key-read. preserved() and flag_of() go with it; recommended()
stays.
tests/test_setup_suite.py drops setup.what-changed from the id list, the
takeover list and the covers lookup, and its flag_of case keeps only
the recommended() assertion.
test_setup_suite.py passes (36 tests). The coverage lint on the tree
manifest finds no uncovered path across the 103 tests; its one finding
is setup.check-lens's empty src/lensfind.* entry, which the forgectrl
pin bump clears. pyflakes on the four files reports only the unused t0
in cooling.py that HEAD already has. The full forgetest suite was not
run.
Fingerprints: the cuts change the shared text of suite/cooling.py,
suite/forgectrl.py and suite/setup.py, so 56 of the 103 tests'
implementation hashes move (cooling 12, setup 26, forgectrl 5, and
exthost 13 through its import of suite/forgectrl.py). The next forgectrl
pin bump already owes 54 of them; exthost.platform and
setup.machine-name are the two it adds. releases/ is unchanged.
setup.gate-blocks-controllers asserted on the machine which steps the
image's table requires (GET /wiz's missing list) and recommends (each
not run yet, never the gate's parts or the optional steps). Both are
the setup table's decisions over a record, software with no hardware in
them, and forgectrl's setup_test now proves both on the image's own
table: the required steps in order (10b), the missing list emptying
when they are done (4b), and the recommended steps in order, each not
run yet (10b). The catalog keeps what needs the machine: the supervisor
holding and spawning the controller, the process, and the Grbl port.
- The two missing-list checks and the recommended-list check leave the
test's body; its description says where they are proven.
- RECOMMENDED_STEPS and NEVER_RECOMMENDED go with them (no test read
them any more), and the meta-test case that only compared them.
Proof: the forgetest host suite passes under Linux (test_setup_suite
with the case removed among it); the coverage lint is unchanged.
Acceptance: every setup.py test (the constants were the module's shared
text), setup.gate-blocks-controllers among them.
forgectrl requires cooling.flow after preferences, machine, and cloud,
and GET /wiz lists the required steps the gate waits for as missing.
- REQUIRED_STEPS is the form steps plus cooling.flow, in the gate's
order; REQUIRED_FORM_STEPS are the form steps. cooling.flow leaves
RECOMMENDED_STEPS.
- setup.gate-blocks-controllers expects "setup required: preferences,
machine, cloud, cooling.flow" on a record with no step done, with all
four named in missing, and an empty missing list once they are done
and the gate is open.
- setup.first-run-flow walks the form steps alone: its seed keeps the
checks done, the calibration among them, so the gate's reason
narrows from the three form steps to open.
Proof: the setup host tests (74) and the manifest tests pass; the host
test of record_with_required_steps keeps the four.
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.
forgectrl gains a table of built-in extensions, with cloud mode as entry
one, GET /extensions to serve it, and POST /settings asking it which
selections point at the cloud, how to refuse them, and what they fall back
to. It also gains an example client under examples/, and its test tokens
lose the names of clients nobody is building.
setup.cloud-disabled-surface is the gate for "nothing points at the cloud
while it is off", so it now holds the list to the settings three times: as
found (enabled as cloud_enabled says, the two roles with their providers
and fallbacks, each active exactly when its setting selects it), with the
cloud off (not enabled, no role active), and as restored. The two refusals
are held to the table's words. Its covers name src/builtin.*. The helper
lives inside the test's own function, so no other test of the module
changes its fingerprint.
The unit test's fake daemon serves the route the way builtin.c does, and
gains a case with two lists that lie (enabled after the cloud went off; a
role that stays active), each of which must fail the test.
forgectrl.tokens: the jog token is "forgetest jogger".
manifest: forgectrl's examples/** joins the non-behavioral paths. They are
clients that run on another computer: outside the image, outside every
fingerprint, and outside the coverage lint.
Proven. The unit suite passes (421) with no undefined name; the two lying
lists fail the test as they should. On the bench reference, forgectrl's
registry daemon hot-deployed over image 20260920152153, on a machine with
cloud mode on: setup.cloud-disabled-surface PASS through the whole path
(off, the sweep, the refusals, the restore), and forgectrl.tokens PASS with
the renamed token.
Acceptance. setup.cloud-disabled-surface is the gate for forgectrl's
built-in table through the settings route.
The commission.* tests are setup.* (subsystem "setup"): suite/setup.py,
setup_dark.py, setup_sheet.py, and the host tests test_setup_*.py. The
coverage maps name src/setup.* in place of src/commission.*, the record
is setup.json, and the bench seed in forgetest.init creates
/run/forgefirm/setup-override.
setup.check-sensors follows the check as it is now: no question is
asked and no setting is written. The test reads the settings before
and after and fails on any change, and fails at once if the check
opens a prompt. The host test drives the fake daemon with no prompt
and proves both outcomes.
Proof: test_setup_dark.py, test_setup_sheet.py, and
test_setup_suite.py pass (46 tests). The coverage lint names
src/commission.c and .h as uncovered until the forgectrl pin moves to
the revision that carries the rename.