diff --git a/docs/BRINGUP.md b/docs/BRINGUP.md index 79088f4..c99b6c4 100644 --- a/docs/BRINGUP.md +++ b/docs/BRINGUP.md @@ -1376,9 +1376,11 @@ feature requests, enhancements) will eventually be tracked as GitHub issues. the headers of kernel patches 0011-0013 (`meta-glowforge-bsp`, `recipes-kernel/linux/`). 3. **Release acceptance follow-through.** The campaign is the release gate - and runs as designed: dev image `20260824230512`, 45 of 45 from nothing, - 36 of them unattended with the bench actuator in the loop, release - authorized (the export is on the board at `/data/forgetest/export/`). + and runs as designed: dev image `20260907005922`, 81 of 81 (53 run, 28 + inherited from the campaign before it on the same pins), 67 of them + unattended with the bench actuator in the loop, release authorized + (the export is on the board at `/data/forgetest/export/` and beside + the images under `images/20260907005922/`). What is left is small. Two catalog gaps from the tool's own plan, `cooling.confirm-escalate` and `cooling.fire-gate-blocks-arm`, are not ported (both need the pump @@ -1419,55 +1421,7 @@ feature requests, enhancements) will eventually be tracked as GitHub issues. far): re-measure the two heat coefficients and the machine's air-assist offset; and if a lit check still trips, the void-on-emission design with the tube as its own flow tracer. -8. **Initial commissioning: measure and set the machine's own numbers - methodically.** Phase 1 (consent, account, preferences, machine facts, - the cloud decision, the gate, HTTPS on 443, the factory return), - phase 2 (the setup checks: switches, sensors, airflow, motion, cameras, - the coolant offset and the flow calibration as checks, the cloud header - capture, the Commissioning tab, the engine-raised flags), and phase 3 - (the sheet: the stroke font and renderer, the daemon's own sender with - the emission witnesses, the placement, the frame, the focus, floor, - dose-curve, corner, and flow-load cards, M102 in the driver) are in - forgectrl and the driver. Phase 1 passes the - first-run walk-through and the commission acceptance set on the bench; - phase 2 passes its six automated checks (`commission.check-*`) and the - cloud header capture; phase 3 passes `commission.sheet`, one live run - over the whole sheet on one piece. Phase 4 (the lifecycle: the - what-changed menu, the record as a download and a printable page and - inside the log bundle, the button LED choreography, the second-browser - mirror) is built in forgectrl with its three unattended cases. The - commissioning acceptance set is 23 cases, three of them attended with - the bench actuator up (the page walk, one Print in the Glowforge app, - and the sheet with one press), and every one has passed on the bench. - The usability pass over the cards (every wait named and counted, the - press prompted when the button lights, the result as a sentence with - the settings written and the numbers under a fold) is bench-proven with - the content-sized layout. All of it waits for its push and pin. Every tunable - that was measured on the bench machine - and shipped as a default varies from machine to machine: the flow - check's bands and `cool_flow_rise`, the tube's heat coefficients - (`cool_laser_heat_cw`, `cool_laser_heat_density`), the air-assist - ground offset on the coolant readings, the laser's striking and lasing - thresholds and the duty floor, the fan floors, the thermistor curve - itself. Owed: one commissioning procedure, run once on a new machine - from the panel or the bench page, that measures each of these in - order with the tube dark wherever it can be, fires only where it - must, and writes the results as that machine's settings with a - record; and a reading of what the cloud sets for the same machine, - taken from cloud cuts (the pulse header carries the factory's - per-machine values), so the commissioning can start from the - factory's own numbers where they exist and note where they differ - from the measured ones. The dose-curve recorder (the panel's one-press - ladder, fit and apply) is the first piece of this tool family and the - template for the rest. Next piece, from the corner work: a - **side-by-side chooser** - the tool cuts the same corner-heavy pattern - at several settings of a knob (the corner rolloff first: a row of - passes at, say, 1.0 / 1.25 / 1.5 / 1.75 / 2.0), labels them, and the - operator picks the best by eye; Apply writes the winner. The rolloff - is the proof case (this bench settled at 1.5 and may go lower, so the - shipped default of 2 is a starting point, not a truth), and the same - shape fits any by-eye tunable the commissioning flow meets. -9. **Idle before the kernel drains.** The driver reports Idle when the +8. **Idle before the kernel drains.** The driver reports Idle when the stream is produced, up to about 550 ms before the pulse engine finishes playing it after chained jogs (the fact under "Running the controller"). A sender or a service that stops the controller at Idle loses that tail diff --git a/docs/CAMPAIGN-LOG.md b/docs/CAMPAIGN-LOG.md index 56e4c09..72ad802 100644 --- a/docs/CAMPAIGN-LOG.md +++ b/docs/CAMPAIGN-LOG.md @@ -9154,7 +9154,88 @@ Two causes, one in the daemon and one in the test: came first. Fixed: the test waits up to ten seconds for the line. The fix needs a forgectrl pin bump, so the pair is rebuilt and the -campaign starts over on the next image. +campaign starts over on the next image: forgectrl 9b178c2 pushed, pinned +at 0.1.4 (forgefirm 143ef11 with the test's wait), the pair rebuilt from +those heads, stamp **20260907005922**, the same kernel and checks, forgectrl +0.1.4 on both images. That pair is the one to flash. + +## 2026-09-07: the full campaign passes on image 20260907005922, 81 of 81 + +The operator flashed the dev image 20260907005922 and power-cycled; +forgetest took the fresh-boot reference (the probe line whole again: "head +accel p2p x=3364 y=2018"). Campaign c-20260907010414-d825 started at +01:04Z. The unattended batch: 39 tests run, 39 PASS, by 01:19Z; 28 tests +inherited their PASS from the first campaign, their fingerprints not +naming the daemon. The operator then ran the 14 attended tests from the +acceptance page, in the prerequisite order: `laser.emission-witness`, +`commission.first-run-page`, `laser.m5-rapid-dark`, `laser.disarm-in-hold`, +`laser.armed-kill`, `laser.pause-resume-lid-cancel`, `cooling.flow-under-load`, +`commission.sheet`, `commission.cloud-header-capture`, +`cloud.service-protocol`, `cloud.pause-resume`, `cloud.lid-interlock-abort`, +`cloud.oversize-stream`, `cloud.paused-lid-cancel`: every one PASS. At +01:56Z the campaign read 81 of 81 satisfied (28 inherited, 53 run), nothing +required, and the export authorized the image: artifact sha256 +`60d9f7aa9f9b0005f9acffa460f863d4e8f9adc120da43e6b050cea98851a910`, kept +beside the images under `images/20260907005922/` (not committed under +`releases/`: the first signed release is the operator's call). The last +cloud test left the machine in cloud mode; switched back to GRBL. Board at +the end: `/tmp` empty, `/data` as found. + +This closes BRINGUP "Next work" item 8, the first-run commissioning. The +plan file `COMMISSIONING_PLAN.md` and the review file `AGREEMENTS_REVIEW.md` +at the tree root are deleted; their decisions live in this log's entries of +2026-09-04 to 2026-09-07 and on the docs site. + +The item's text as it stood in BRINGUP when it closed: + +> 8. **Initial commissioning: measure and set the machine's own numbers +> methodically.** Phase 1 (consent, account, preferences, machine facts, +> the cloud decision, the gate, HTTPS on 443, the factory return), +> phase 2 (the setup checks: switches, sensors, airflow, motion, cameras, +> the coolant offset and the flow calibration as checks, the cloud header +> capture, the Commissioning tab, the engine-raised flags), and phase 3 +> (the sheet: the stroke font and renderer, the daemon's own sender with +> the emission witnesses, the placement, the frame, the focus, floor, +> dose-curve, corner, and flow-load cards, M102 in the driver) are in +> forgectrl and the driver. Phase 1 passes the +> first-run walk-through and the commission acceptance set on the bench; +> phase 2 passes its six automated checks (`commission.check-*`) and the +> cloud header capture; phase 3 passes `commission.sheet`, one live run +> over the whole sheet on one piece. Phase 4 (the lifecycle: the +> what-changed menu, the record as a download and a printable page and +> inside the log bundle, the button LED choreography, the second-browser +> mirror) is built in forgectrl with its three unattended cases. The +> commissioning acceptance set is 23 cases, three of them attended with +> the bench actuator up (the page walk, one Print in the Glowforge app, +> and the sheet with one press), and every one has passed on the bench. +> The usability pass over the cards (every wait named and counted, the +> press prompted when the button lights, the result as a sentence with +> the settings written and the numbers under a fold) is bench-proven with +> the content-sized layout. All of it waits for its push and pin. Every tunable +> that was measured on the bench machine +> and shipped as a default varies from machine to machine: the flow +> check's bands and `cool_flow_rise`, the tube's heat coefficients +> (`cool_laser_heat_cw`, `cool_laser_heat_density`), the air-assist +> ground offset on the coolant readings, the laser's striking and lasing +> thresholds and the duty floor, the fan floors, the thermistor curve +> itself. Owed: one commissioning procedure, run once on a new machine +> from the panel or the bench page, that measures each of these in +> order with the tube dark wherever it can be, fires only where it +> must, and writes the results as that machine's settings with a +> record; and a reading of what the cloud sets for the same machine, +> taken from cloud cuts (the pulse header carries the factory's +> per-machine values), so the commissioning can start from the +> factory's own numbers where they exist and note where they differ +> from the measured ones. The dose-curve recorder (the panel's one-press +> ladder, fit and apply) is the first piece of this tool family and the +> template for the rest. Next piece, from the corner work: a +> **side-by-side chooser** - the tool cuts the same corner-heavy pattern +> at several settings of a knob (the corner rolloff first: a row of +> passes at, say, 1.0 / 1.25 / 1.5 / 1.75 / 2.0), labels them, and the +> operator picks the best by eye; Apply writes the winner. The rolloff +> is the proof case (this bench settled at 1.5 and may go lower, so the +> shipped default of 2 is a starting point, not a truth), and the same +> shape fits any by-eye tunable the commissioning flow meets. ## Reference notes