diff --git a/releases/v0.0.1/acceptance.json b/releases/v0.0.1/acceptance.json index da9a667..a993687 100644 --- a/releases/v0.0.1/acceptance.json +++ b/releases/v0.0.1/acceptance.json @@ -2,25 +2,25 @@ "authorized": true, "campaign": { "catalog_hash": "e2a2fe18e70fee24f81780b33c7210a530bb6d3f5267503ed8a97ee493944241", - "id": "c-20260909160235-7649", - "image": "20260909150456 (dev)", - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "id": "c-20260909204732-3fa9", + "image": "20260909193551 (dev)", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "t": "campaign", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:47:32Z" }, "catalog_hash": "e2a2fe18e70fee24f81780b33c7210a530bb6d3f5267503ed8a97ee493944241", "counts": { - "inherited": 0, + "inherited": 62, "required": 0, "satisfied": 83, "total": 83 }, - "exported_at": "2026-09-09T17:13:20Z", + "exported_at": "2026-09-09T21:55:08Z", "format": 1, - "identity_sha": "5d9a8555976d42e16a36a795086c5799a59beeb8407c0041ad83ec5918f14382", + "identity_sha": "b05b65afde3e98622a4ea0a559f806a8688127c247f46c599e4ecb20fba5f152", "image": { "name": "forgefirm-image-dev", - "version": "20260909150456 (dev)" + "version": "20260909193551 (dev)" }, "invalidate": null, "manifest": { @@ -32,7 +32,7 @@ }, "meta-forgefirm": { "dirty": false, - "rev": "4a95595afd93d1ac21992ce63677483410c78a13" + "rev": "64301d322190a6fc9a4ca3053c7e015abebe2fcc" }, "meta-freescale": { "dirty": false, @@ -44,7 +44,7 @@ }, "meta-glowforge-bsp": { "dirty": false, - "rev": "d655e1e58c97224236f21472b02cb19f32eab982" + "rev": "b7ad6d9377fbb4215dc4d898837906b06b47e5e9" }, "meta-networking": { "dirty": false, @@ -56,7 +56,7 @@ }, "meta-openglow-core": { "dirty": false, - "rev": "d655e1e58c97224236f21472b02cb19f32eab982" + "rev": "b7ad6d9377fbb4215dc4d898837906b06b47e5e9" }, "meta-poky": { "dirty": false, @@ -269,11 +269,11 @@ ], [ "src/fflog.c", - "b465502f53146b05d71cc05ab5758f100d160a92" + "cdeb518386db022df74cbfff89008bf17f5a864c" ], [ "src/fflog.h", - "c2142e9e28e93313979ee12d5f346c9d8bc4e175" + "905314b0d5be06487faecdf97720e23d2506bb4e" ], [ "src/font_hershey.c", @@ -345,7 +345,7 @@ ], [ "src/logs.c", - "d7dfcd5f84397560892fe84c9fd61ac665d4076e" + "c47015f3be4aa6934f1327d484242217025611c2" ], [ "src/logs.h", @@ -353,7 +353,7 @@ ], [ "src/main.c", - "0fa8b979a8bf65ffe1c788ec5e10ae13f9e65b84" + "c789f238b18b37e73b92ad6703070818b6ed2993" ], [ "src/mp4mux.c", @@ -401,11 +401,11 @@ ], [ "src/settings.c", - "2047f3adde23560d1aaf7ce9391fa444c2c85575" + "33338d8c2b7f073fe300373352250505796e3596" ], [ "src/settings.h", - "6b137456da0bdcc62de1ff55fd0be3e11fcec742" + "a2c073b5beefac147237367cd859bbac43f0c134" ], [ "src/sha256.c", @@ -433,7 +433,7 @@ ], [ "src/status.c", - "c6944ba34aeba55e8c908f8f7247a41bb27c3928" + "278b4cf86cd3e73dee026409d59c9e0282606015" ], [ "src/status.h", @@ -693,7 +693,7 @@ ], [ "tests/status_idle_test.c", - "ffd5dd1464431c8fb0cb3ae5754c1f9bff562951" + "86b391499fca9870578d047c5fb75a46aad444a7" ], [ "tests/status_sys_test.c", @@ -724,12 +724,12 @@ "44d64ed985d797a3ba974e877f15bdc6831ab553" ] ], - "pv": "0.1.10", + "pv": "0.1.12", "recipes": [ "forgectrl" ], "source": "git://github.com/openglow-org/forgectrl.git", - "srcrev": "7e03073863c63b93da6281d318eb25dc3e822f2c" + "srcrev": "468ee215dd1148b92c979decacecc41aa6a75ccf" }, "forgefirm-app": { "component": "forgefirm-app", @@ -764,7 +764,7 @@ ], [ "forgefirm-app/ffmachine.py", - "5b3fe945952bddc86b7919fd9115ff03b0f67d29" + "28a87dda2b8115c482aa8f111ba69ec2a6b5bc50" ], [ "forgefirm-app/gfcloud.init", @@ -772,15 +772,15 @@ ], [ "forgefirm-app/gfcloud.py", - "d4a150d13e8ee6cd4c81e82db6fda160392e32ee" + "f9448524a945f522575521b7bd019ab390bbf9a9" ], [ "forgefirm-app/gfhome.conf.sample", - "4ac21983435c7c41cc3c580eec53ee8dd0a57ff5" + "d00bf0e00c8a795443f95c6f227c8d8df3291869" ], [ "forgefirm-app/gfhome.py", - "d51b7f1b413062703f8be9b55d612d8a30c0dc7c" + "de0d236de68c67503f3a2b292044160469b70a19" ], [ "gfhardware/__init__.py", @@ -824,7 +824,7 @@ ], [ "gfhardware/machine.py", - "f47da3db4aa34feee886dffc2c861f65aabe25cc" + "f15a9005d8df642d651d83efc153c71033588237" ], [ "gfhardware/src/bayer.c", @@ -895,14 +895,14 @@ "b1f06f68c7463d925ce7ff341094c9604bb21f5f" ] ], - "pv": "0.1.27+git", + "pv": "0.1.28+git", "recipes": [ "gfcloud", "gfhome", "python3-ffmachine" ], "source": "git://github.com/openglow-org/python3-gfhardware.git", - "srcrev": "53d57f7c84fd314012f21bbbee883dde95353ded" + "srcrev": "56f134a1e6393a2096c16e8226027fbbd38d79c7" }, "forgetest": { "component": "forgetest", @@ -1021,7 +1021,7 @@ ], [ "suite/image.py", - "b62a8c6b3cc88915f1dd7d2594fdbd1d3dd7de32" + "1431732dc6bf0e31dd98d80081a4ffa76a9aebf9" ], [ "suite/kernel.py", @@ -1124,7 +1124,7 @@ ], [ "src/boards/glowforge.h", - "8027346c13983fa24678d8205e736e1bb7ae6b38" + "1b09515bf828564849bffa2bc723c2be6c56150b" ], [ "src/build_info.h.in", @@ -1148,11 +1148,11 @@ ], [ "src/fflog.c", - "b465502f53146b05d71cc05ab5758f100d160a92" + "cdeb518386db022df74cbfff89008bf17f5a864c" ], [ "src/fflog.h", - "c2142e9e28e93313979ee12d5f346c9d8bc4e175" + "905314b0d5be06487faecdf97720e23d2506bb4e" ], [ "src/glowforge_cooling.c", @@ -1164,19 +1164,19 @@ ], [ "src/glowforge_homing.c", - "9efb587bb4396d24eb32cb04f055cf0ef7b321bb" + "e000d94e4b81069fa078b9f24c7cbc7dce2de4eb" ], [ "src/glowforge_homing.h", - "f0f836ec938e609d7b136bb36b231aa5c451cd7b" + "f09618a28c55e3df8f7d89dc0d32b1d9f6228f46" ], [ "src/glowforge_io.c", - "c4b939734e0748f83d578f4d58eddbd74c5efd2b" + "c916237cc976725ff532d84f7f3040aa62208495" ], [ "src/glowforge_io.h", - "1dfb13cdd187791be21dcf525fef54ecbe453aa5" + "6b08d2ffbee02f513b701a50ca43b3eba8002f85" ], [ "src/glowforge_laser.c", @@ -1688,7 +1688,7 @@ ], [ "src/main.c", - "f4e660ce30b260010d490caf783b4f992a28db37" + "9afe8580374751a7209cc431a8dca532ce697629" ], [ "src/my_machine.h", @@ -1743,12 +1743,12 @@ "43bc3afad92d879036497bba2c719686aa208aab" ] ], - "pv": "0.1.9", + "pv": "0.1.10", "recipes": [ "grblhal-glowforge" ], "source": "gitsm://github.com/openglow-org/grblHAL-glowforge.git", - "srcrev": "97be92bbc8443ff8c4a3176fa2594cd6828c1c65" + "srcrev": "9ee624bbc1d1fd929f1f5587b6fc6acaa13a4561" }, "kernel-module-glowforge": { "component": "kernel-module-glowforge", @@ -1991,7 +1991,7 @@ ], [ "forgefirm-app/ffmachine.py", - "5b3fe945952bddc86b7919fd9115ff03b0f67d29" + "28a87dda2b8115c482aa8f111ba69ec2a6b5bc50" ], [ "forgefirm-app/gfcloud.init", @@ -1999,15 +1999,15 @@ ], [ "forgefirm-app/gfcloud.py", - "d4a150d13e8ee6cd4c81e82db6fda160392e32ee" + "f9448524a945f522575521b7bd019ab390bbf9a9" ], [ "forgefirm-app/gfhome.conf.sample", - "4ac21983435c7c41cc3c580eec53ee8dd0a57ff5" + "d00bf0e00c8a795443f95c6f227c8d8df3291869" ], [ "forgefirm-app/gfhome.py", - "d51b7f1b413062703f8be9b55d612d8a30c0dc7c" + "de0d236de68c67503f3a2b292044160469b70a19" ], [ "gfhardware/__init__.py", @@ -2051,7 +2051,7 @@ ], [ "gfhardware/machine.py", - "f47da3db4aa34feee886dffc2c861f65aabe25cc" + "f15a9005d8df642d651d83efc153c71033588237" ], [ "gfhardware/src/bayer.c", @@ -2127,7 +2127,7 @@ "python3-gfhardware" ], "source": "git://github.com/openglow-org/python3-gfhardware.git", - "srcrev": "53d57f7c84fd314012f21bbbee883dde95353ded" + "srcrev": "56f134a1e6393a2096c16e8226027fbbd38d79c7" }, "python3-gfutilities": { "component": "python3-gfutilities", @@ -2345,11 +2345,11 @@ "srcrev": "f32bd5832bf657f13bf520b37ff886bc449a3f92" } }, - "content_sha256": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "content_sha256": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "format": 1, "image": { "name": "forgefirm-image-dev", - "version": "20260909150456 (dev)" + "version": "20260909193551 (dev)" }, "platform": { "dtb": { @@ -2365,7 +2365,7 @@ "rev": "70ed6f677234d32198371a030178d2f272cf2d94" }, "meta-forgefirm": { - "content_sha256": "0372fdd9d6c564c6fd224ffd144bb1c4e4dd485b7f8f457f5cd790a58a60978e" + "content_sha256": "8407f24c787fb7728a33b0ebb094b83270b66e889b88b4493673dd73147b68ea" }, "meta-freescale": { "rev": "b699d026506a6fc402e03afb432dcabd3d81c7ab" @@ -2395,8 +2395,8 @@ "machine": "glowforge" } }, - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", - "sha256": "0984d4f8517148a64cbc9ddf1271f0371df890e15318f33ad5433567fec30a0f", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", + "sha256": "2aa22f306e56792a8120de6d3b2b6817162f011544099da0c37540a0dae90b09", "tests": [ { "always": true, @@ -2434,17 +2434,17 @@ "**" ] ], - "fingerprint": "f2388939ddb3a5254624eae4c60db259c430b8db1bce15faaf94e354cf08cc58", + "fingerprint": "e5c90d1f67d6d1fb1a74f9e43a02d531fdc58df025ed9933112b4280d7db6475", "hardware": "api", "id": "image.health", "inherited": false, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909204732-3fa9", "duration_s": 0, "evidence": { - "/data/forgefirm.conf": "600", + "/data/forgefirm/forgefirm.conf": "600", "/data/forgefirm/panel.token": "600", "CONFIG_IMX2_WDT": "y", "CONFIG_PANIC_ON_OOPS": "y", @@ -2455,13 +2455,13 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:54:34Z" }, "cnc_free": 33521664, "cnc_pool_bytes": 33554432, "cnc_ring_bytes": 33554432, "cnc_state": "idle", - "data_free_mb": 2814, + "data_free_mb": 2813, "dev_image": true, "factory_mounts": [ "/factory/img1", @@ -2478,9 +2478,9 @@ "released": [] }, "forgectrl_pids": [ - 458 + 5083 ], - "forgefirm_version": "20260909150456 (dev)", + "forgefirm_version": "20260909193551 (dev)", "kernel_release": "6.12.20-fslc-fslc-g90f2862b2d55", "logging_init": [ "forgefirm-logging" @@ -2489,9 +2489,9 @@ "controller": "running", "gated": false, "local": false, - "mode": "grbl", + "mode": "cloud", "motion": "verified", - "pid": 508, + "pid": 8090, "why": "" }, "mounts": { @@ -2541,7 +2541,7 @@ } }, "pulse_device_holders": [ - 458 + 5083 ], "rc6_kill": [ "K09sshd", @@ -2572,45 +2572,45 @@ "wde": true } }, - "fingerprint": "f2388939ddb3a5254624eae4c60db259c430b8db1bce15faaf94e354cf08cc58", - "image": "20260909150456 (dev)", + "fingerprint": "e5c90d1f67d6d1fb1a74f9e43a02d531fdc58df025ed9933112b4280d7db6475", + "image": "20260909193551 (dev)", "log": [ - "16:02:35 start image.health (auto, api) in campaign c-20260909160235-7649", - "16:02:35 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:02:35 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:02:35 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:02:35 baseline: pre: clean", - "16:02:35 forgefirm-version: 20260909150456 (dev) (manifest: 20260909150456 (dev))", - "16:02:35 CONFIG_PREEMPT=y", - "16:02:35 CONFIG_IMX2_WDT=y", - "16:02:35 CONFIG_PANIC_ON_OOPS=y", - "16:02:35 watchdog0: {'identity': 'imx2+ watchdog', 'state': 'inactive', 'timeout': '60', 'bootstatus': '0', 'wcr': '0x771f', 'wde': True, 'period_s': 60.0}", - "16:02:35 kernel release 6.12.20-fslc-fslc-g90f2862b2d55 (manifest modules dirs: 6.12.20-fslc-fslc)", - "16:02:35 cnc/state: idle", - "16:02:35 cnc/free: 33521664 bytes", - "16:02:35 cnc-pulsebuf pool: 33554432 bytes, ring_mb: 33554432 bytes", - "16:02:35 sdma clk_enable_count: 1", - "16:02:35 forgectrl pids [458], holding /dev/glowforge: [458]", - "16:02:35 mode: {'mode': 'grbl', 'controller': 'running', 'pid': 508, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", - "16:02:35 rc6.d: K09sshd K19avahi-daemon K20dbus-1 K20hwclock.sh K20ntpd K31umountnfs.sh K70forgetest K80gfcloud K80grblhal K80networking K90forgectrl K95syslog", - "16:02:35 /data/forgefirm/panel.token mode 600", - "16:02:35 /data/forgefirm.conf mode 600", - "16:02:35 /data free: 2814 MiB", - "16:02:35 / mounted ro,relatime; /data rw,relatime; /var/lib rw,relatime", - "16:02:35 dev image True; /factory mounts: ['/factory/img1', '/factory/img2']", - "16:02:35 manifest 58b4d750b424: 9 components", - "16:02:36 baseline: post: clean", - "16:02:36 result PASS" + "20:54:35 start image.health (auto, api) in campaign c-20260909204732-3fa9", + "20:54:35 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:54:35 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:54:35 queued by the unattended queue opened 2026-09-09T20:54:34Z", + "20:54:35 baseline: pre: clean", + "20:54:35 forgefirm-version: 20260909193551 (dev) (manifest: 20260909193551 (dev))", + "20:54:35 CONFIG_PREEMPT=y", + "20:54:35 CONFIG_IMX2_WDT=y", + "20:54:35 CONFIG_PANIC_ON_OOPS=y", + "20:54:35 watchdog0: {'identity': 'imx2+ watchdog', 'state': 'inactive', 'timeout': '60', 'bootstatus': '0', 'wcr': '0x771f', 'wde': True, 'period_s': 60.0}", + "20:54:35 kernel release 6.12.20-fslc-fslc-g90f2862b2d55 (manifest modules dirs: 6.12.20-fslc-fslc)", + "20:54:35 cnc/state: idle", + "20:54:35 cnc/free: 33521664 bytes", + "20:54:35 cnc-pulsebuf pool: 33554432 bytes, ring_mb: 33554432 bytes", + "20:54:35 sdma clk_enable_count: 1", + "20:54:35 forgectrl pids [5083], holding /dev/glowforge: [5083]", + "20:54:35 mode: {'mode': 'cloud', 'controller': 'running', 'pid': 8090, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", + "20:54:35 rc6.d: K09sshd K19avahi-daemon K20dbus-1 K20hwclock.sh K20ntpd K31umountnfs.sh K70forgetest K80gfcloud K80grblhal K80networking K90forgectrl K95syslog", + "20:54:35 /data/forgefirm/panel.token mode 600", + "20:54:35 /data/forgefirm/forgefirm.conf mode 600", + "20:54:35 /data free: 2813 MiB", + "20:54:35 / mounted ro,relatime; /data rw,relatime; /var/lib rw,relatime", + "20:54:35 dev image True; /factory mounts: ['/factory/img1', '/factory/img2']", + "20:54:35 manifest d02c25b76481: 9 components", + "20:54:35 baseline: post: clean", + "20:54:35 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "image.health", - "ts": "2026-09-09T16:02:36Z" + "ts": "2026-09-09T20:54:35Z" }, "requires": [], "satisfied": true, - "source_sha": "caa67844a9f088d78247f5ad132c7d4e0a47a52fdb601bf110dc503e2a0afc2d", + "source_sha": "16d06e80fe3453fd92ead044ce79b5b39c0a2c56b79a18c2e965b42ccb52eef2", "subsystem": "image", "title": "Post-flash image health" }, @@ -2634,14 +2634,14 @@ "src/ui/login.html" ] ], - "fingerprint": "9c62b451a4737cd39bc40afac1174c27f3689d237595bd0489ad9ded7edd6032", + "fingerprint": "73693e1cd0a4dd971dff1b881a7d7d02dda6715d4932c092a8acbc7e96e6fdb5", "hardware": "api", "id": "image.license-bundle", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 2, "evidence": { "baseline": { @@ -2650,9 +2650,9 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, - "bundle_bytes": 697650, + "bundle_bytes": 697648, "fixture": { "channels": [ "lid", @@ -2666,24 +2666,24 @@ "generic_texts": 411, "packages": 265 }, - "fingerprint": "9c62b451a4737cd39bc40afac1174c27f3689d237595bd0489ad9ded7edd6032", - "image": "20260909150456 (dev)", + "fingerprint": "73693e1cd0a4dd971dff1b881a7d7d02dda6715d4932c092a8acbc7e96e6fdb5", + "image": "20260909193551 (dev)", "log": [ - "16:02:38 start image.license-bundle (auto, api) in campaign c-20260909160235-7649", - "16:02:38 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:02:38 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:02:38 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:02:38 baseline: pre: clean", - "16:02:38 /usr/share/forgefirm/licenses.tar.gz: 697650 bytes", - "16:02:39 manifest lists 265 packages; 411 generic license entries", - "16:02:40 baseline: post: clean", - "16:02:40 result PASS" + "20:00:57 start image.license-bundle (auto, api) in campaign c-20260909200054-7947", + "20:00:57 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:00:57 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:00:57 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:00:57 baseline: pre: clean", + "20:00:57 /usr/share/forgefirm/licenses.tar.gz: 697648 bytes", + "20:00:58 manifest lists 265 packages; 411 generic license entries", + "20:01:00 baseline: post: clean", + "20:01:00 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "image.license-bundle", - "ts": "2026-09-09T16:02:40Z" + "ts": "2026-09-09T20:01:00Z" }, "requires": [ "forgectrl.panel-serves" @@ -2717,14 +2717,14 @@ "src/driver.c" ] ], - "fingerprint": "0cd62557c5a8d00f943ef25fe3ff63e82ce0a7ddb97364229f1d999971c5cac3", + "fingerprint": "81363ef0f7275112c45da968defd5d1db54cab2f5c47041699551056acd8ed4f", "hardware": "api", "id": "kernel.latch-locked-idle", "inherited": false, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909204732-3fa9", "duration_s": 0, "evidence": { "baseline": { @@ -2733,7 +2733,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:54:34Z" }, "cnc_state": "idle", "faults": 0, @@ -2753,28 +2753,28 @@ "laser_on": 0, "laser_on_sampled": 0 }, - "fingerprint": "0cd62557c5a8d00f943ef25fe3ff63e82ce0a7ddb97364229f1d999971c5cac3", - "image": "20260909150456 (dev)", + "fingerprint": "81363ef0f7275112c45da968defd5d1db54cab2f5c47041699551056acd8ed4f", + "image": "20260909193551 (dev)", "log": [ - "16:02:40 start kernel.latch-locked-idle (auto, api) in campaign c-20260909160235-7649", - "16:02:41 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:02:41 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:02:41 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:02:41 baseline: pre: clean", - "16:02:41 cnc/state: idle", - "16:02:41 interlock_circuit: 45 (0x2d)", - "16:02:41 laser_enable (FIRE line): 0", - "16:02:41 laser_on: 0, laser_on_sampled: 0", - "16:02:41 faults: 0", - "16:02:41 forgectrl /status laser_locked=True state=idle", - "16:02:41 baseline: post: clean", - "16:02:41 result PASS" + "20:54:35 start kernel.latch-locked-idle (auto, api) in campaign c-20260909204732-3fa9", + "20:54:35 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:54:35 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:54:35 queued by the unattended queue opened 2026-09-09T20:54:34Z", + "20:54:35 baseline: pre: clean", + "20:54:35 cnc/state: idle", + "20:54:35 interlock_circuit: 45 (0x2d)", + "20:54:35 laser_enable (FIRE line): 0", + "20:54:35 laser_on: 0, laser_on_sampled: 0", + "20:54:35 faults: 0", + "20:54:35 forgectrl /status laser_locked=True state=idle", + "20:54:36 baseline: post: clean", + "20:54:36 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "kernel.latch-locked-idle", - "ts": "2026-09-09T16:02:41Z" + "ts": "2026-09-09T20:54:36Z" }, "requires": [], "satisfied": true, @@ -2794,15 +2794,15 @@ "**" ] ], - "fingerprint": "ff02683a7badf9d141b5a991bc0843b8c7fd038e6a6180a7d80b9a147630725d", + "fingerprint": "7528e686dbb599947631800ef06ab4bf82cc965aeb3aeaefe1385af86f7f6fc2", "hardware": "takeover", "id": "kernel.k1-k2", "inherited": false, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 21, + "campaign": "c-20260909204732-3fa9", + "duration_s": 23, "evidence": { "baseline": { "post": [], @@ -2810,7 +2810,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:54:34Z" }, "fixture": { "channels": [ @@ -2825,7 +2825,7 @@ "k1": { "faults": "0", "state": "idle", - "stop_to_idle_s": 0.0908 + "stop_to_idle_s": 0.0907 }, "k2": { "end_state": "idle", @@ -2846,45 +2846,46 @@ 0, 55001 ], - "underruns": "0" + "underruns": "3" } }, - "fingerprint": "ff02683a7badf9d141b5a991bc0843b8c7fd038e6a6180a7d80b9a147630725d", - "image": "20260909150456 (dev)", + "fingerprint": "7528e686dbb599947631800ef06ab4bf82cc965aeb3aeaefe1385af86f7f6fc2", + "image": "20260909193551 (dev)", "log": [ - "16:02:41 start kernel.k1-k2 (auto, takeover) in campaign c-20260909160235-7649", - "16:02:41 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:02:41 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:02:41 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:02:41 baseline: pre: clean", - "16:02:41 takeover: waiting for forgectrl to be settled", - "16:02:41 baseline: /mode controller=running motion=verified", - "16:02:41 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:02:41 takeover: stopping the controller through forgectrl", - "16:02:41 takeover: POST /controller/stop -> 200", - "16:02:42 takeover: forgectrl stop -> rc 0", - "16:02:43 takeover: pulse device free", - "16:02:43 K1: 60001 bytes = 6.0 s of pads at 10000 Hz, ramp 125000 Hz/s", - "16:02:43 K1 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", - "16:02:45 K1 controlled stop: state=idle after 0.0908 s, faults=0", - "16:02:50 K1 PASS: decelerating tail 0.0908 s, no burst, no fault", - "16:02:50 K2: 55001 bytes = 5.5 s; latch stays LOCKED; waypoint +200; motor_lock=15", - "16:02:50 K2 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", - "16:02:51 K2: paused inside the pads; resuming with waypoint +200 (latch LOCKED)", - "16:02:56 K2 post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", - "16:02:56 K2 done: state=idle pos before=(0, 0, 0, 0, 55001) after=(0, 0, 0, 55001, 55001)", - "16:02:56 K2 PASS: FIRE window replayed after the resume waypoint with laser_enable/laser_on at 0 throughout", - "16:02:56 takeover: forgectrl start -> rc 0", - "16:02:58 baseline: /mode controller=stopped motion=unverified", - "16:03:03 baseline: /mode controller=running motion=verified", - "16:03:03 baseline: post: clean", - "16:03:03 result PASS" + "20:54:36 start kernel.k1-k2 (auto, takeover) in campaign c-20260909204732-3fa9", + "20:54:36 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:54:36 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:54:36 queued by the unattended queue opened 2026-09-09T20:54:34Z", + "20:54:36 baseline: pre: clean", + "20:54:36 takeover: waiting for forgectrl to be settled", + "20:54:36 baseline: /mode controller=running motion=verified", + "20:54:36 takeover: preserving cnc/motor_lock=8, cnc/step_freq=10000, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:54:36 takeover: stopping the controller through forgectrl", + "20:54:37 takeover: POST /controller/stop -> 200", + "20:54:38 takeover: forgectrl stop -> rc 0", + "20:54:39 takeover: pulse device free", + "20:54:39 K1: 60001 bytes = 6.0 s of pads at 10000 Hz, ramp 125000 Hz/s", + "20:54:39 K1 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", + "20:54:41 K1 controlled stop: state=idle after 0.0907 s, faults=0", + "20:54:45 K1 PASS: decelerating tail 0.0907 s, no burst, no fault", + "20:54:45 K2: 55001 bytes = 5.5 s; latch stays LOCKED; waypoint +200; motor_lock=15", + "20:54:45 K2 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", + "20:54:46 K2: paused inside the pads; resuming with waypoint +200 (latch LOCKED)", + "20:54:52 K2 post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", + "20:54:52 K2 done: state=idle pos before=(0, 0, 0, 0, 55001) after=(0, 0, 0, 55001, 55001)", + "20:54:52 K2 PASS: FIRE window replayed after the resume waypoint with laser_enable/laser_on at 0 throughout", + "20:54:52 takeover: forgectrl start -> rc 0", + "20:54:54 baseline: /mode controller=stopped motion=unverified", + "20:54:58 baseline: /mode controller=stopped motion=verified", + "20:54:59 baseline: /mode controller=running motion=verified", + "20:54:59 baseline: post: clean", + "20:54:59 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "kernel.k1-k2", - "ts": "2026-09-09T16:03:03Z" + "ts": "2026-09-09T20:54:59Z" }, "requires": [ "kernel.latch-locked-idle" @@ -2906,15 +2907,15 @@ "**" ] ], - "fingerprint": "5726f3e5a2a88945492b353ee12954ea4bf818b9bc9f21403f8537a93e15ff47", + "fingerprint": "deafd5fbc820007241148cb70b56fffb4295ed178656d99c357101aedc7f98f4", "hardware": "takeover", "id": "kernel.deadman-close", "inherited": false, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 9, + "campaign": "c-20260909204732-3fa9", + "duration_s": 10, "evidence": { "baseline": { "post": [], @@ -2922,11 +2923,11 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:54:34Z" }, "close": { "faults": "0", - "halt_s": 0.0531, + "halt_s": 0.0363, "interlock_circuit": 13, "state": "idle" }, @@ -2951,36 +2952,36 @@ "z_enable": "0" } }, - "fingerprint": "5726f3e5a2a88945492b353ee12954ea4bf818b9bc9f21403f8537a93e15ff47", - "image": "20260909150456 (dev)", + "fingerprint": "deafd5fbc820007241148cb70b56fffb4295ed178656d99c357101aedc7f98f4", + "image": "20260909193551 (dev)", "log": [ - "16:03:03 start kernel.deadman-close (auto, takeover) in campaign c-20260909160235-7649", - "16:03:03 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:03:03 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:03:03 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:03:03 baseline: pre: clean", - "16:03:03 takeover: waiting for forgectrl to be settled", - "16:03:03 baseline: /mode controller=running motion=verified", - "16:03:03 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:03:03 takeover: stopping the controller through forgectrl", - "16:03:03 takeover: POST /controller/stop -> 200", - "16:03:03 takeover: forgectrl stop -> rc 0", - "16:03:04 takeover: pulse device free", - "16:03:04 deadman pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", - "16:03:06 deadman post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", - "16:03:06 final close: state=idle after 0.0531 s; head {'z_enable': '1', 'z_current': '1', 'measure_laser': '0', 'uv_led': '0'}", - "16:03:06 PASS: the final close halted the engine in 0.053 s, latch locked, head safed", - "16:03:06 takeover: forgectrl start -> rc 0", - "16:03:08 baseline: /mode controller=stopped motion=unverified", - "16:03:13 baseline: /mode controller=running motion=verified", - "16:03:13 baseline: post: clean", - "16:03:13 result PASS" + "20:54:59 start kernel.deadman-close (auto, takeover) in campaign c-20260909204732-3fa9", + "20:54:59 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:54:59 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:54:59 queued by the unattended queue opened 2026-09-09T20:54:34Z", + "20:54:59 baseline: pre: clean", + "20:54:59 takeover: waiting for forgectrl to be settled", + "20:54:59 baseline: /mode controller=running motion=verified", + "20:54:59 takeover: preserving cnc/motor_lock=0, cnc/step_freq=10000, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:54:59 takeover: stopping the controller through forgectrl", + "20:55:00 takeover: POST /controller/stop -> 200", + "20:55:00 takeover: forgectrl stop -> rc 0", + "20:55:00 takeover: pulse device free", + "20:55:00 deadman pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", + "20:55:02 deadman post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", + "20:55:02 final close: state=idle after 0.0363 s; head {'z_enable': '1', 'z_current': '1', 'measure_laser': '0', 'uv_led': '0'}", + "20:55:02 PASS: the final close halted the engine in 0.036 s, latch locked, head safed", + "20:55:02 takeover: forgectrl start -> rc 0", + "20:55:03 baseline: /mode controller=stopped motion=unverified", + "20:55:09 baseline: /mode controller=running motion=verified", + "20:55:09 baseline: post: clean", + "20:55:09 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "kernel.deadman-close", - "ts": "2026-09-09T16:03:13Z" + "ts": "2026-09-09T20:55:09Z" }, "requires": [ "kernel.k1-k2" @@ -3002,21 +3003,21 @@ "**" ] ], - "fingerprint": "8858d603478d1e4294eb9aa4caca511e1c17e85358b6cc9a1ba8ce52f7cd4a64", + "fingerprint": "f96d698bb0eb4136956db4a8bde439a4ea6c7dbf5a2a49f8e83beb3e12b772ab", "hardware": "takeover", "id": "kernel.backtrack-bounds", "inherited": false, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909204732-3fa9", "duration_s": 18, "evidence": { "after": { "faults": "0", "max_backtrack": 0, "state": "idle", - "underruns": "0" + "underruns": "3" }, "baseline": { "post": [], @@ -3024,7 +3025,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:54:34Z" }, "fixture": { "channels": [ @@ -3036,42 +3037,41 @@ "ip": "172.16.1.135", "released": [] }, - "max_backtrack": 15065, + "max_backtrack": 15064, "over_long_errno": 1, - "played": 15465 + "played": 15464 }, - "fingerprint": "8858d603478d1e4294eb9aa4caca511e1c17e85358b6cc9a1ba8ce52f7cd4a64", - "image": "20260909150456 (dev)", + "fingerprint": "f96d698bb0eb4136956db4a8bde439a4ea6c7dbf5a2a49f8e83beb3e12b772ab", + "image": "20260909193551 (dev)", "log": [ - "16:03:13 start kernel.backtrack-bounds (auto, takeover) in campaign c-20260909160235-7649", - "16:03:13 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:03:13 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:03:13 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:03:13 baseline: pre: clean", - "16:03:13 takeover: waiting for forgectrl to be settled", - "16:03:13 baseline: /mode controller=running motion=verified", - "16:03:13 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:03:13 takeover: stopping the controller through forgectrl", - "16:03:13 takeover: POST /controller/stop -> 200", - "16:03:14 takeover: forgectrl stop -> rc 0", - "16:03:14 takeover: pulse device free", - "16:03:14 60001 bytes = 6.0 s of pads at 10000 Hz; decel tail 400 steps", - "16:03:14 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", - "16:03:16 played 15465 bytes; max_backtrack 15065", - "16:03:18 backtrack of 15065 done: state=idle max_backtrack now 0", - "16:03:24 PASS: max_backtrack tracks the played history, the boundary is enforced, and the run at it plays out clean", - "16:03:24 takeover: forgectrl start -> rc 0", - "16:03:26 baseline: /mode controller=stopped motion=unverified", - "16:03:30 baseline: /mode controller=stopped motion=verified", - "16:03:31 baseline: /mode controller=running motion=verified", - "16:03:31 baseline: post: clean", - "16:03:31 result PASS" + "20:55:09 start kernel.backtrack-bounds (auto, takeover) in campaign c-20260909204732-3fa9", + "20:55:09 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:55:09 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:55:09 queued by the unattended queue opened 2026-09-09T20:54:34Z", + "20:55:10 baseline: pre: clean", + "20:55:10 takeover: waiting for forgectrl to be settled", + "20:55:10 baseline: /mode controller=running motion=verified", + "20:55:10 takeover: preserving cnc/motor_lock=0, cnc/step_freq=10000, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:55:10 takeover: stopping the controller through forgectrl", + "20:55:10 takeover: POST /controller/stop -> 200", + "20:55:10 takeover: forgectrl stop -> rc 0", + "20:55:11 takeover: pulse device free", + "20:55:11 60001 bytes = 6.0 s of pads at 10000 Hz; decel tail 400 steps", + "20:55:11 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", + "20:55:13 played 15464 bytes; max_backtrack 15064", + "20:55:14 backtrack of 15064 done: state=idle max_backtrack now 0", + "20:55:20 PASS: max_backtrack tracks the played history, the boundary is enforced, and the run at it plays out clean", + "20:55:20 takeover: forgectrl start -> rc 0", + "20:55:22 baseline: /mode controller=stopped motion=unverified", + "20:55:27 baseline: /mode controller=running motion=verified", + "20:55:28 baseline: post: clean", + "20:55:28 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "kernel.backtrack-bounds", - "ts": "2026-09-09T16:03:31Z" + "ts": "2026-09-09T20:55:28Z" }, "requires": [ "kernel.k1-k2" @@ -3093,14 +3093,14 @@ "**" ] ], - "fingerprint": "1b95b6d126f1882b91848fd5c50a58dcf0ed31b5b7f96c35c222c74063714442", + "fingerprint": "4be4e98e178192b11f8cbb021ab4744c866fec97942222cb02d2c8233f47afb7", "hardware": "takeover", "id": "kernel.fire-line", "inherited": false, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909204732-3fa9", "duration_s": 43, "evidence": { "A": { @@ -3112,17 +3112,17 @@ "laser_enable": "0", "laser_on": "0", "laser_on_sampled": "0", - "t": 1.5 + "t": 1.51 }, "moved": false, "tail": { - "after_s": 6.03, + "after_s": 6.04, "laser_enable": "0", "laser_on": "0", "state": "idle" }, - "underruns_after": 0, - "underruns_before": 0 + "underruns_after": 3, + "underruns_before": 3 }, "B": { "any_fire_driven": true, @@ -3137,13 +3137,13 @@ }, "moved": false, "tail": { - "after_s": 6.04, + "after_s": 6.05, "laser_enable": "0", "laser_on": "0", "state": "idle" }, - "underruns_after": 0, - "underruns_before": 0 + "underruns_after": 3, + "underruns_before": 3 }, "U": { "any_fire_driven": true, @@ -3159,13 +3159,13 @@ "moved": false, "tail": { "acked_state": "idle", - "after_s": 6.03, + "after_s": 6.05, "laser_enable": "0", "laser_on": "0", "state": "underrun" }, - "underruns_after": 1, - "underruns_before": 0 + "underruns_after": 4, + "underruns_before": 3 }, "baseline": { "post": [], @@ -3173,7 +3173,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:54:34Z" }, "charge_pump_alive": "0", "fixture": { @@ -3188,9 +3188,9 @@ }, "hv_release_s": [ 0.0, - 0.43, 0.41, - 0.42 + 0.41, + 0.36 ], "k3": { "end_state": "idle", @@ -3198,73 +3198,73 @@ "hits": [], "interlock_after_unlock": "5", "laser_on_sampled": "0", - "underruns": "1" + "underruns": "4" }, "kernel_state": "idle" }, - "fingerprint": "1b95b6d126f1882b91848fd5c50a58dcf0ed31b5b7f96c35c222c74063714442", - "image": "20260909150456 (dev)", + "fingerprint": "4be4e98e178192b11f8cbb021ab4744c866fec97942222cb02d2c8233f47afb7", + "image": "20260909193551 (dev)", "log": [ - "16:03:31 start kernel.fire-line (auto, takeover) in campaign c-20260909160235-7649", - "16:03:31 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:03:31 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:03:31 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:03:31 baseline: pre: clean", - "16:03:31 takeover: waiting for forgectrl to be settled", - "16:03:31 baseline: /mode controller=running motion=verified", - "16:03:31 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:03:31 takeover: stopping the controller through forgectrl", - "16:03:32 takeover: POST /controller/stop -> 200", - "16:03:32 takeover: forgectrl stop -> rc 0", - "16:03:32 takeover: pulse device free", - "16:03:32 fire A: stream 60001 bytes = 6.000 s", - "16:03:32 fire A pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", - "16:03:34 fire A mid (inside FIRE window): laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", - "16:03:39 fire A done: state=idle after 6.0 s (laser_enable=0)", - "16:03:39 fire A post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", - "16:03:39 fire A: moved=False underruns 0->0 faults=0", - "16:03:39 fire A PASS: latch locked, no FIRE drive, no LASER_ON", - "16:03:39 fire B: stream 60001 bytes = 6.000 s", - "16:03:39 hv off: released after 0.43 s", - "16:03:39 fire B pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", - "16:03:40 fire B: latch UNLOCKED for this run", - "16:03:41 fire B mid (inside FIRE window): laser_enable=1 laser_on=0 laser_on_sampled=0 interlock=7", - "16:03:46 fire B done: state=idle after 6.0 s (laser_enable=0)", - "16:03:46 fire B post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", - "16:03:46 fire B: moved=False underruns 0->0 faults=0", - "16:03:46 fire B PASS: FIRE driven mid-window, LASER_ON off, FIRE clear at end-of-data", - "16:03:46 fire U: stream 60001 bytes = 6.000 s", - "16:03:46 hv off: released after 0.41 s", - "16:03:46 fire U pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", - "16:03:47 fire U: streaming=1, the terminal end-of-data will be a TRUE UNDERRUN", - "16:03:47 fire U: latch UNLOCKED for this run", - "16:03:48 fire U mid (inside FIRE window): laser_enable=1 laser_on=0 laser_on_sampled=0 interlock=7", - "16:03:53 fire U done: state=underrun after 6.0 s (laser_enable=0)", - "16:03:53 fire U: underrun state reached as EXPECTED; acking via stop", - "16:03:53 fire U: acked: state=idle", - "16:03:53 fire U post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", - "16:03:53 fire U: moved=False underruns 0->1 faults=0", - "16:03:53 fire U PASS: true underrun, backstop dropped FIRE, stop acked", - "16:03:53 hv off: released after 0.42 s", - "16:03:53 K3: 35001 bytes = 3.5 s of FIRE bits; ramp_rate 10000 Hz/s (~0.9 s accel window); unlock at t=+0.15 s", - "16:03:53 K3 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", - "16:03:54 K3: latch UNLOCKED mid-ramp; interlock=5 (bit 3 should read 0)", - "16:03:57 K3 post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=5", - "16:03:57 K3 PASS: laser_enable stayed 0 for the entire run after the mid-ramp unlock", - "16:03:57 safe state restored: state=disabled latch=LOCKED", - "16:03:57 takeover: forgectrl start -> rc 0", - "16:03:59 baseline: /mode controller=stopped motion=unverified", - "16:04:02 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:04:14 baseline: /mode controller=stopped motion=verified", - "16:04:15 baseline: /mode controller=running motion=verified", - "16:04:15 baseline: post: clean", - "16:04:15 result PASS" + "20:55:28 start kernel.fire-line (auto, takeover) in campaign c-20260909204732-3fa9", + "20:55:28 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:55:28 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:55:28 queued by the unattended queue opened 2026-09-09T20:54:34Z", + "20:55:28 baseline: pre: clean", + "20:55:28 takeover: waiting for forgectrl to be settled", + "20:55:28 baseline: /mode controller=running motion=verified", + "20:55:28 takeover: preserving cnc/motor_lock=0, cnc/step_freq=10000, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:55:28 takeover: stopping the controller through forgectrl", + "20:55:28 takeover: POST /controller/stop -> 200", + "20:55:29 takeover: forgectrl stop -> rc 0", + "20:55:29 takeover: pulse device free", + "20:55:29 fire A: stream 60001 bytes = 6.000 s", + "20:55:29 fire A pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", + "20:55:31 fire A mid (inside FIRE window): laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", + "20:55:36 fire A done: state=idle after 6.0 s (laser_enable=0)", + "20:55:36 fire A post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", + "20:55:36 fire A: moved=False underruns 3->3 faults=0", + "20:55:36 fire A PASS: latch locked, no FIRE drive, no LASER_ON", + "20:55:36 fire B: stream 60001 bytes = 6.000 s", + "20:55:36 hv off: released after 0.41 s", + "20:55:36 fire B pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", + "20:55:37 fire B: latch UNLOCKED for this run", + "20:55:38 fire B mid (inside FIRE window): laser_enable=1 laser_on=0 laser_on_sampled=0 interlock=7", + "20:55:43 fire B done: state=idle after 6.0 s (laser_enable=0)", + "20:55:43 fire B post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", + "20:55:43 fire B: moved=False underruns 3->3 faults=0", + "20:55:43 fire B PASS: FIRE driven mid-window, LASER_ON off, FIRE clear at end-of-data", + "20:55:43 fire U: stream 60001 bytes = 6.000 s", + "20:55:43 hv off: released after 0.41 s", + "20:55:43 fire U pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", + "20:55:44 fire U: streaming=1, the terminal end-of-data will be a TRUE UNDERRUN", + "20:55:44 fire U: latch UNLOCKED for this run", + "20:55:45 fire U mid (inside FIRE window): laser_enable=1 laser_on=0 laser_on_sampled=0 interlock=7", + "20:55:50 fire U done: state=underrun after 6.1 s (laser_enable=0)", + "20:55:50 fire U: underrun state reached as EXPECTED; acking via stop", + "20:55:50 fire U: acked: state=idle", + "20:55:50 fire U post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", + "20:55:50 fire U: moved=False underruns 3->4 faults=0", + "20:55:50 fire U PASS: true underrun, backstop dropped FIRE, stop acked", + "20:55:50 hv off: released after 0.36 s", + "20:55:50 K3: 35001 bytes = 3.5 s of FIRE bits; ramp_rate 10000 Hz/s (~0.9 s accel window); unlock at t=+0.15 s", + "20:55:50 K3 pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", + "20:55:51 K3: latch UNLOCKED mid-ramp; interlock=5 (bit 3 should read 0)", + "20:55:54 K3 post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=5", + "20:55:54 K3 PASS: laser_enable stayed 0 for the entire run after the mid-ramp unlock", + "20:55:54 safe state restored: state=disabled latch=LOCKED", + "20:55:54 takeover: forgectrl start -> rc 0", + "20:55:55 baseline: /mode controller=stopped motion=unverified", + "20:55:59 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:56:10 baseline: /mode controller=stopped motion=verified", + "20:56:11 baseline: /mode controller=running motion=verified", + "20:56:12 baseline: post: clean", + "20:56:12 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "kernel.fire-line", - "ts": "2026-09-09T16:04:15Z" + "ts": "2026-09-09T20:56:12Z" }, "requires": [ "kernel.k1-k2" @@ -3286,14 +3286,14 @@ "**" ] ], - "fingerprint": "1fb5762dee2645c9d9f58a44a3afcd05e7d43e74c37246bb906887b282907e63", + "fingerprint": "0c28fbd6fcedd330a6e704f42294f30459c7dad1f36c0b77dcfaa2fbbc96e44f", "hardware": "takeover", "id": "kernel.resume-lead", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 22, "evidence": { "E": { @@ -3306,14 +3306,14 @@ }, "L": { "any_laser_on": false, - "driven_samples": 884, + "driven_samples": 878, "end_state": "idle", "faults": "0", - "first_driven_s": 1.0032, + "first_driven_s": 1.0035, "inside_lead": [], "laser_on_sampled": "0", "last_driven_s": 2.003, - "samples": 1956 + "samples": 2002 }, "baseline": { "post": [], @@ -3321,7 +3321,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "charge_pump_alive": "0", "fixture": { @@ -3336,48 +3336,48 @@ }, "hv_release_s": [ 0.0, - 0.32 + 0.36 ], "kernel_state": "idle" }, - "fingerprint": "1fb5762dee2645c9d9f58a44a3afcd05e7d43e74c37246bb906887b282907e63", - "image": "20260909150456 (dev)", + "fingerprint": "0c28fbd6fcedd330a6e704f42294f30459c7dad1f36c0b77dcfaa2fbbc96e44f", + "image": "20260909193551 (dev)", "log": [ - "16:04:15 start kernel.resume-lead (auto, takeover) in campaign c-20260909160235-7649", - "16:04:15 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:04:15 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:04:15 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:04:15 baseline: pre: clean", - "16:04:15 takeover: waiting for forgectrl to be settled", - "16:04:15 baseline: /mode controller=running motion=verified", - "16:04:15 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:04:15 takeover: stopping the controller through forgectrl", - "16:04:15 takeover: POST /controller/stop -> 200", - "16:04:15 takeover: forgectrl stop -> rc 0", - "16:04:16 takeover: pulse device free", - "16:04:16 E: 501 bytes = 0.5 s of pads at 1000 Hz; resume with a 10000-byte lead (never reached)", - "16:04:16 E pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", - "16:04:17 E: idle after 0.506 s (the data is 0.501 s; a lost end-of-data would add 0.255 s)", - "16:04:17 E PASS: end-of-data before the waypoint ended the run on time", - "16:04:17 hv off: released after 0.32 s", - "16:04:17 L: 2201 bytes = 2.2 s (2.0 s of FIRE bits then pads); lead 1000 bytes = 1.0 s; latch UNLOCKED, chain unarmed", - "16:04:17 L pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", - "16:04:20 L post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", - "16:04:20 L: 1956 samples, FIRE driven in 884, first at 1.0032 s, last at 2.003 s, end state idle", - "16:04:20 L PASS: FIRE low through the 1.0 s lead, driven from the waypoint on, LASER_ON off", - "16:04:20 safe state restored: state=disabled latch=LOCKED", - "16:04:20 takeover: forgectrl start -> rc 0", - "16:04:22 baseline: /mode controller=stopped motion=unverified", - "16:04:36 baseline: /mode controller=stopped motion=verified", - "16:04:37 baseline: /mode controller=running motion=verified", - "16:04:37 baseline: post: clean", - "16:04:37 result PASS" + "20:02:34 start kernel.resume-lead (auto, takeover) in campaign c-20260909200054-7947", + "20:02:34 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:02:34 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:02:34 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:02:34 baseline: pre: clean", + "20:02:34 takeover: waiting for forgectrl to be settled", + "20:02:34 baseline: /mode controller=running motion=verified", + "20:02:34 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:02:34 takeover: stopping the controller through forgectrl", + "20:02:34 takeover: POST /controller/stop -> 200", + "20:02:34 takeover: forgectrl stop -> rc 0", + "20:02:35 takeover: pulse device free", + "20:02:35 E: 501 bytes = 0.5 s of pads at 1000 Hz; resume with a 10000-byte lead (never reached)", + "20:02:35 E pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", + "20:02:36 E: idle after 0.506 s (the data is 0.501 s; a lost end-of-data would add 0.255 s)", + "20:02:36 E PASS: end-of-data before the waypoint ended the run on time", + "20:02:36 hv off: released after 0.36 s", + "20:02:36 L: 2201 bytes = 2.2 s (2.0 s of FIRE bits then pads); lead 1000 bytes = 1.0 s; latch UNLOCKED, chain unarmed", + "20:02:36 L pre: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=45", + "20:02:39 L post: state=idle laser_enable=0 laser_on=0 laser_on_sampled=0 interlock=13", + "20:02:39 L: 2002 samples, FIRE driven in 878, first at 1.0035 s, last at 2.003 s, end state idle", + "20:02:39 L PASS: FIRE low through the 1.0 s lead, driven from the waypoint on, LASER_ON off", + "20:02:39 safe state restored: state=disabled latch=LOCKED", + "20:02:39 takeover: forgectrl start -> rc 0", + "20:02:41 baseline: /mode controller=stopped motion=unverified", + "20:02:55 baseline: /mode controller=stopped motion=verified", + "20:02:56 baseline: /mode controller=running motion=verified", + "20:02:56 baseline: post: clean", + "20:02:56 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "kernel.resume-lead", - "ts": "2026-09-09T16:04:37Z" + "ts": "2026-09-09T20:02:56Z" }, "requires": [ "kernel.k1-k2" @@ -3403,14 +3403,14 @@ "src/diag.c" ] ], - "fingerprint": "24aedae93cbf443639cd75e82416839d5d285c05c55f1f30394c3d63a4b5e831", + "fingerprint": "2c9078a4537b331025155574172dfe20f33bcb78ea3f9d68943ec339abb8ac32", "hardware": "api", "id": "kernel.pic-soc-load", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 3, "evidence": { "baseline": { @@ -3419,23 +3419,23 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "control": { "busy": { "iqr": 2, - "max": 661, - "mean": 649.08, - "med": 649, - "min": 643, + "max": 662, + "mean": 655.24, + "med": 655, + "min": 652, "n": 200 }, "idle": { "iqr": 3, - "max": 663, - "mean": 644.62, - "med": 643, - "min": 635, + "max": 666, + "mean": 650.5, + "med": 649, + "min": 645, "n": 200 } }, @@ -3455,44 +3455,44 @@ "settled": { "busy": { "iqr": 2, - "max": 657, - "mean": 646.88, - "med": 647, - "min": 639, + "max": 662, + "mean": 653.12, + "med": 653, + "min": 649, "n": 200 }, "idle": { "iqr": 2, - "max": 663, - "mean": 646.15, - "med": 646, - "min": 642, + "max": 665, + "mean": 652.18, + "med": 652, + "min": 649, "n": 200 } }, "settled_idle_moved": 3, "settled_split": 1 }, - "fingerprint": "24aedae93cbf443639cd75e82416839d5d285c05c55f1f30394c3d63a4b5e831", - "image": "20260909150456 (dev)", + "fingerprint": "2c9078a4537b331025155574172dfe20f33bcb78ea3f9d68943ec339abb8ac32", + "image": "20260909193551 (dev)", "log": [ - "16:04:38 start kernel.pic-soc-load (auto, api) in campaign c-20260909160235-7649", - "16:04:38 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:04:38 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:04:38 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:04:38 baseline: pre: clean", - "16:04:41 control (settle off): after sleep median 643 (iqr 3, 635..663); after spin median 649 (iqr 2, 643..661)", - "16:04:41 settled (500 us): after sleep median 646 (iqr 2, 642..663); after spin median 647 (iqr 2, 639..657)", - "16:04:41 split busy minus idle: control +6, settled +1", - "16:04:41 PASS: settled, an idle reader and a busy reader read the same (split +1); control split +6", - "16:04:41 baseline: post: clean", - "16:04:41 result PASS" + "20:02:56 start kernel.pic-soc-load (auto, api) in campaign c-20260909200054-7947", + "20:02:56 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:02:56 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:02:56 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:02:56 baseline: pre: clean", + "20:02:59 control (settle off): after sleep median 649 (iqr 3, 645..666); after spin median 655 (iqr 2, 652..662)", + "20:02:59 settled (500 us): after sleep median 652 (iqr 2, 649..665); after spin median 653 (iqr 2, 649..662)", + "20:02:59 split busy minus idle: control +6, settled +1", + "20:02:59 PASS: settled, an idle reader and a busy reader read the same (split +1); control split +6", + "20:03:00 baseline: post: clean", + "20:03:00 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "kernel.pic-soc-load", - "ts": "2026-09-09T16:04:41Z" + "ts": "2026-09-09T20:03:00Z" }, "requires": [], "satisfied": true, @@ -3532,14 +3532,14 @@ "src/ui/wizard.js" ] ], - "fingerprint": "bbf8317b373d250bb0da396120958355bf3816aea397407e502f048df1235563", + "fingerprint": "b076c49535033995046f965c64184ddb66c8b395034d3f58c93aee5ae91c4b2c", "hardware": "api", "id": "forgectrl.auth", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 0, "evidence": { "alive_after_oversize": 200, @@ -3549,7 +3549,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "cool_state_from_lan": 403, "cool_state_from_lan_http": { @@ -3595,50 +3595,50 @@ }, "sfs_cross": 403 }, - "fingerprint": "bbf8317b373d250bb0da396120958355bf3816aea397407e502f048df1235563", - "image": "20260909150456 (dev)", + "fingerprint": "b076c49535033995046f965c64184ddb66c8b395034d3f58c93aee5ae91c4b2c", + "image": "20260909193551 (dev)", "log": [ - "16:04:41 start forgectrl.auth (auto, api) in campaign c-20260909160235-7649", - "16:04:41 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:04:41 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:04:41 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:04:41 baseline: pre: clean", - "16:04:41 GET /status -> 200", - "16:04:41 POST /controller/stop (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /controller/start (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /mode (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /settings (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /diag/flow-verify (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /diag/abort (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /update/apply (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /boot (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /system/reboot (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /restore/factory (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /restore/factory-return (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /system/ssh (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /wiz/advisories/accept (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /wiz/account (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /wiz/complete (no token) -> 403 {'error': 'authentication required'}", - "16:04:41 POST /update/upload (no token) -> 403", - "16:04:42 POST /settings (no token, 4 MiB body) -> 403", - "16:04:42 GET /status after the oversized body -> 200", - "16:04:42 GET /status Host=evil.example.net -> 403", - "16:04:42 GET /status Origin=http://evil.example.net -> 403", - "16:04:42 GET /status Sec-Fetch-Site=cross-site -> 403", - "16:04:42 GET /fuse-identity (no token) -> 403 {'error': 'authentication required'}", - "16:04:42 GET /fuse-identity (token, button not held) -> 403 ", - "16:04:42 POST /cool/state from loopback -> 200 {'ok': True}", - "16:04:42 POST http://172.16.1.97/cool/state -> 302 https://172.16.1.97/cool/state", - "16:04:42 POST https://172.16.1.97/cool/state -> 403 {'error': 'loopback only'}", - "16:04:42 GET https://172.16.1.97/setup?step=laser.focus (no session) -> 302 /login?next=/setup%3Fstep%3Dlaser.focus", - "16:04:42 baseline: post: clean", - "16:04:42 result PASS" + "20:03:00 start forgectrl.auth (auto, api) in campaign c-20260909200054-7947", + "20:03:00 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:03:00 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:03:00 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:03:00 baseline: pre: clean", + "20:03:00 GET /status -> 200", + "20:03:00 POST /controller/stop (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /controller/start (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /mode (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /settings (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /diag/flow-verify (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /diag/abort (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /update/apply (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /boot (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /system/reboot (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /restore/factory (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /restore/factory-return (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /system/ssh (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /wiz/advisories/accept (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /wiz/account (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /wiz/complete (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 POST /update/upload (no token) -> 403", + "20:03:00 POST /settings (no token, 4 MiB body) -> 403", + "20:03:00 GET /status after the oversized body -> 200", + "20:03:00 GET /status Host=evil.example.net -> 403", + "20:03:00 GET /status Origin=http://evil.example.net -> 403", + "20:03:00 GET /status Sec-Fetch-Site=cross-site -> 403", + "20:03:00 GET /fuse-identity (no token) -> 403 {'error': 'authentication required'}", + "20:03:00 GET /fuse-identity (token, button not held) -> 403 ", + "20:03:00 POST /cool/state from loopback -> 200 {'ok': True}", + "20:03:00 POST http://172.16.1.97/cool/state -> 302 https://172.16.1.97/cool/state", + "20:03:00 POST https://172.16.1.97/cool/state -> 403 {'error': 'loopback only'}", + "20:03:00 GET https://172.16.1.97/setup?step=laser.focus (no session) -> 302 /login?next=/setup%3Fstep%3Dlaser.focus", + "20:03:01 baseline: post: clean", + "20:03:01 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "forgectrl.auth", - "ts": "2026-09-09T16:04:42Z" + "ts": "2026-09-09T20:03:01Z" }, "requires": [], "satisfied": true, @@ -3662,14 +3662,14 @@ "src/cam.c" ] ], - "fingerprint": "77185822c3fa76ab253aa01fa654594d4b69b893858100559057e75a6a3c03ed", + "fingerprint": "accbc0417c621b0f4bd9489fa07afe6b51f0c8d9a096cc086f7030e62e580a38", "hardware": "api", "id": "forgectrl.settings-bounds", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 0, "evidence": { "accepted": { @@ -3683,7 +3683,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -3707,32 +3707,32 @@ "pulse_bytes_out_of_range": 400, "unknown_key": 400 }, - "fingerprint": "77185822c3fa76ab253aa01fa654594d4b69b893858100559057e75a6a3c03ed", - "image": "20260909150456 (dev)", + "fingerprint": "accbc0417c621b0f4bd9489fa07afe6b51f0c8d9a096cc086f7030e62e580a38", + "image": "20260909193551 (dev)", "log": [ - "16:04:42 start forgectrl.settings-bounds (auto, api) in campaign c-20260909160235-7649", - "16:04:42 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:04:42 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:04:42 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:04:42 baseline: pre: clean", - "16:04:42 POST /settings gf_serial=<300 chars> -> 400 ", - "16:04:42 POST /settings laser_disarm_s=99999 -> 400", - "16:04:42 POST /settings pulse_reject_threshold_bytes=2000000000 -> 400", - "16:04:42 POST /settings no_such_key_forgetest=1 -> 400", - "16:04:42 settings unchanged after the refused writes", - "16:04:42 POST /settings ui_units=imperial -> 200", - "16:04:42 lid lamp: setting '', pic/lid_led=236 (expected 236)", - "16:04:42 lid_lamp_idle 256 / -1 / bright refused", - "16:04:42 lid_lamp_idle=100 -> pic/lid_led=100 after 0.0 s", - "16:04:42 lid lamp follows the setting live and returns to 236", - "16:04:43 baseline: post: clean", - "16:04:43 result PASS" + "20:03:01 start forgectrl.settings-bounds (auto, api) in campaign c-20260909200054-7947", + "20:03:01 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:03:01 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:03:01 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:03:01 baseline: pre: clean", + "20:03:01 POST /settings gf_serial=<300 chars> -> 400 ", + "20:03:01 POST /settings laser_disarm_s=99999 -> 400", + "20:03:01 POST /settings pulse_reject_threshold_bytes=2000000000 -> 400", + "20:03:01 POST /settings no_such_key_forgetest=1 -> 400", + "20:03:01 settings unchanged after the refused writes", + "20:03:01 POST /settings ui_units=imperial -> 200", + "20:03:01 lid lamp: setting '', pic/lid_led=236 (expected 236)", + "20:03:01 lid_lamp_idle 256 / -1 / bright refused", + "20:03:01 lid_lamp_idle=100 -> pic/lid_led=100 after 0.0 s", + "20:03:01 lid lamp follows the setting live and returns to 236", + "20:03:01 baseline: post: clean", + "20:03:01 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "forgectrl.settings-bounds", - "ts": "2026-09-09T16:04:43Z" + "ts": "2026-09-09T20:03:01Z" }, "requires": [], "satisfied": true, @@ -3780,14 +3780,14 @@ "src/curverec.*" ] ], - "fingerprint": "72cccd7f3dd3481e5aa53d5090f840af7f9d436da5c4c1b78dc132b88aabd70d", + "fingerprint": "b2744c4d4dc4a53386b103dbc5f7ad4bcfba4c027c5ad7285af5b9924160d15e", "hardware": "api", "id": "forgectrl.panel-serves", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 1, "evidence": { "baseline": { @@ -3796,7 +3796,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "cam_status": 200, "curve_status": { @@ -3818,10 +3818,10 @@ "released": [] }, "grbl": { - "age_s": 3.6, + "age_s": 3.0, "report": { "alarm": 0, - "driver": "97be92b", + "driver": "9ee624b", "laser": { "armed": false, "arming": false, @@ -3842,7 +3842,7 @@ "peer": "" }, "state": "Idle", - "ts_mono": 125.122 + "ts_mono": 404.226 } }, "grbl_nvs": true, @@ -3858,32 +3858,32 @@ "lid": true }, "sys": { - "cpu_pct": 6.9, - "mem_pct": 20.8 + "cpu_pct": 7.8, + "mem_pct": 20.1 } }, - "fingerprint": "72cccd7f3dd3481e5aa53d5090f840af7f9d436da5c4c1b78dc132b88aabd70d", - "image": "20260909150456 (dev)", + "fingerprint": "b2744c4d4dc4a53386b103dbc5f7ad4bcfba4c027c5ad7285af5b9924160d15e", + "image": "20260909193551 (dev)", "log": [ - "16:02:36 start forgectrl.panel-serves (auto, api) in campaign c-20260909160235-7649", - "16:02:36 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:02:36 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:02:36 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:02:36 baseline: pre: clean", - "16:02:36 GET / -> 200 (463316 bytes)", - "16:02:36 /status state=idle switches={'lid': True, 'button': False, 'interlock_ok': True, 'head': True, 'hv_enable': False}", - "16:02:37 /status sys={'cpu_pct': 6.9, 'mem_pct': 20.8}", - "16:02:37 /status homed_axes=4 pos.z=3.42 reach=-1.31..10.32", - "16:02:37 GET /cam/status -> 200 {'running': False, 'cam': 'lid', 'clients': 0, 'frames': 0, 'fps': 0.0, 'fps_cap': 0.0, 'hw_fps_skip': False, 'encoder': 'software', 'convert': 'cpu', 'buffers': 'uncached', 'sensor': 'OV5648', 'stream': {'width': 1296, 'height': 972}, 'snapshot': {'width': 2592, 'height': 1944}, 'h264': {'active': False, 'clients': 0}, 'health': {'captured': 0, 'corrupt': 0, 'restarts': 0}, 'capture_allowed': True, 'stopped_by_lid': False}", - "16:02:37 /status grbl={'age_s': 3.6, 'report': {'ts_mono': 125.122, 'state': 'Idle', 'alarm': 0, 'sender': {'connected': False, 'generation': 0, 'for_s': 0, 'peer': ''}, 'laser': {'armed': False, 'arming': False, 'model': 'density', 'floor_pct': 12, 'curve': 'custom', 'gamma': 1.5}, 'modals': '[GC:G0 G54 G17 G21 G90 G94 G40 G49 G98 G50 M5 M9 T0 F0 S0.]', 'overrides': {'feed': 100, 'rapid': 100}, 'driver': '97be92b'}}", - "16:02:37 baseline: post: clean", - "16:02:37 result PASS" + "20:00:55 start forgectrl.panel-serves (auto, api) in campaign c-20260909200054-7947", + "20:00:55 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:00:55 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:00:55 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:00:55 baseline: pre: clean", + "20:00:55 GET / -> 200 (463316 bytes)", + "20:00:55 /status state=idle switches={'lid': True, 'button': False, 'interlock_ok': True, 'head': True, 'hv_enable': False}", + "20:00:56 /status sys={'cpu_pct': 7.8, 'mem_pct': 20.1}", + "20:00:56 /status homed_axes=4 pos.z=3.42 reach=-1.31..10.32", + "20:00:56 GET /cam/status -> 200 {'running': False, 'cam': 'lid', 'clients': 0, 'frames': 0, 'fps': 0.0, 'fps_cap': 0.0, 'hw_fps_skip': False, 'encoder': 'software', 'convert': 'cpu', 'buffers': 'cached', 'sensor': 'OV5648', 'stream': {'width': 1296, 'height': 972}, 'snapshot': {'width': 2592, 'height': 1944}, 'h264': {'active': False, 'clients': 0}, 'health': {'captured': 638, 'corrupt': 0, 'restarts': 0}, 'capture_allowed': True, 'stopped_by_lid': False}", + "20:00:57 /status grbl={'age_s': 3.0, 'report': {'ts_mono': 404.226, 'state': 'Idle', 'alarm': 0, 'sender': {'connected': False, 'generation': 0, 'for_s': 0, 'peer': ''}, 'laser': {'armed': False, 'arming': False, 'model': 'density', 'floor_pct': 12, 'curve': 'custom', 'gamma': 1.5}, 'modals': '[GC:G0 G54 G17 G21 G90 G94 G40 G49 G98 G50 M5 M9 T0 F0 S0.]', 'overrides': {'feed': 100, 'rapid': 100}, 'driver': '9ee624b'}}", + "20:00:57 baseline: post: clean", + "20:00:57 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "forgectrl.panel-serves", - "ts": "2026-09-09T16:02:37Z" + "ts": "2026-09-09T20:00:57Z" }, "requires": [], "satisfied": true, @@ -3911,14 +3911,14 @@ "src/paths.h" ] ], - "fingerprint": "803e6f9d1054c36398a55a51fb673211f0e81a07633e666f20c06df7774859a0", + "fingerprint": "6fd6fa70f2bb4abe2255dc4304d55ff2aea0a6d5dea7317eaaa484477ac8859d", "hardware": "takeover", "id": "commission.gate-blocks-controllers", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 18, "evidence": { "after": { @@ -3964,7 +3964,7 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 1312, + "pid": 1805, "why": "" }, "baseline": { @@ -3973,7 +3973,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "before": { "acceptance_done": true, @@ -4079,7 +4079,7 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 1268, + "pid": 1761, "why": "" }, "override_wiz": { @@ -4116,52 +4116,51 @@ "why": "override active (required: advisories, account, preferences, machine, cloud, switches, sensors, airflow, cooling.aa-offset, cooling.flow, motion, cameras, cloud.header, sheet.place, shee)" } }, - "fingerprint": "803e6f9d1054c36398a55a51fb673211f0e81a07633e666f20c06df7774859a0", - "image": "20260909150456 (dev)", + "fingerprint": "6fd6fa70f2bb4abe2255dc4304d55ff2aea0a6d5dea7317eaaa484477ac8859d", + "image": "20260909193551 (dev)", "log": [ - "16:04:43 start commission.gate-blocks-controllers (auto, takeover) in campaign c-20260909160235-7649", - "16:04:43 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:04:43 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:04:43 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:04:43 baseline: pre: clean", - "16:04:43 mode: test needs grbl - already in grbl mode", - "16:04:43 before: gate open, override True, required ['cooling.aa-offset', 'cooling.flow']", - "16:04:43 takeover: waiting for forgectrl to be settled", - "16:04:43 baseline: /mode controller=running motion=verified", - "16:04:43 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:04:43 takeover: stopping the controller through forgectrl", - "16:04:43 takeover: POST /controller/stop -> 200", - "16:04:43 takeover: forgectrl stop -> rc 0", - "16:04:45 takeover: pulse device free", - "16:04:45 takeover: forgectrl start -> rc 0", - "16:04:47 baseline: /mode controller=gated motion=unverified", - "16:04:47 installed under a restart: commissioning.json=1215 B, commissioning-override=removed", - "16:04:47 /mode after the restart: {'mode': 'grbl', 'controller': 'gated', 'pid': 0, 'motion': 'unverified', 'gated': True, 'local': False, 'why': 'commissioning required: advisories, account, preferences, machine, cloud, switches, sensors, airflow, cooling.aa-offset, cooling.flow, motion, cameras, cloud.header, sheet.place, shee'} (after 0.004770755767822266 s)", - "16:04:47 gated: no controller process, the Grbl port is closed", - "16:04:53 the controller spawned under the override (6.122625350952148 s)", - "16:04:53 baseline: /mode controller=running motion=verified", - "16:04:53 override: the controller is back ({'mode': 'grbl', 'controller': 'running', 'pid': 1268, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''})", - "16:04:53 takeover: waiting for forgectrl to be settled", - "16:04:53 baseline: /mode controller=running motion=verified", - "16:04:53 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:04:53 takeover: stopping the controller through forgectrl", - "16:04:53 takeover: POST /controller/stop -> 200", - "16:04:53 takeover: forgectrl stop -> rc 0", - "16:04:54 takeover: pulse device free", - "16:04:54 takeover: forgectrl start -> rc 0", - "16:04:56 baseline: /mode controller=stopped motion=unverified", - "16:05:00 baseline: /mode controller=stopped motion=verified", - "16:05:01 baseline: /mode controller=running motion=verified", - "16:05:01 restored under a restart: commissioning.json, commissioning-override", - "16:05:01 restored: gate open, controller running", - "16:05:01 baseline: post: clean", - "16:05:01 result PASS" + "20:03:01 start commission.gate-blocks-controllers (auto, takeover) in campaign c-20260909200054-7947", + "20:03:01 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:03:01 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:03:01 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:03:02 baseline: pre: clean", + "20:03:02 mode: test needs grbl - already in grbl mode", + "20:03:02 before: gate open, override True, required ['cooling.aa-offset', 'cooling.flow']", + "20:03:02 takeover: waiting for forgectrl to be settled", + "20:03:02 baseline: /mode controller=running motion=verified", + "20:03:02 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:03:02 takeover: stopping the controller through forgectrl", + "20:03:02 takeover: POST /controller/stop -> 200", + "20:03:02 takeover: forgectrl stop -> rc 0", + "20:03:03 takeover: pulse device free", + "20:03:03 takeover: forgectrl start -> rc 0", + "20:03:05 baseline: /mode controller=gated motion=unverified", + "20:03:05 installed under a restart: commissioning.json=1215 B, commissioning-override=removed", + "20:03:05 /mode after the restart: {'mode': 'grbl', 'controller': 'gated', 'pid': 0, 'motion': 'unverified', 'gated': True, 'local': False, 'why': 'commissioning required: advisories, account, preferences, machine, cloud, switches, sensors, airflow, cooling.aa-offset, cooling.flow, motion, cameras, cloud.header, sheet.place, shee'} (after 0.0049207210540771484 s)", + "20:03:05 gated: no controller process, the Grbl port is closed", + "20:03:11 the controller spawned under the override (6.3901755809783936 s)", + "20:03:11 baseline: /mode controller=running motion=verified", + "20:03:11 override: the controller is back ({'mode': 'grbl', 'controller': 'running', 'pid': 1761, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''})", + "20:03:11 takeover: waiting for forgectrl to be settled", + "20:03:11 baseline: /mode controller=running motion=verified", + "20:03:11 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:03:11 takeover: stopping the controller through forgectrl", + "20:03:12 takeover: POST /controller/stop -> 200", + "20:03:12 takeover: forgectrl stop -> rc 0", + "20:03:12 takeover: pulse device free", + "20:03:12 takeover: forgectrl start -> rc 0", + "20:03:14 baseline: /mode controller=stopped motion=unverified", + "20:03:19 baseline: /mode controller=running motion=verified", + "20:03:19 restored under a restart: commissioning.json, commissioning-override", + "20:03:20 restored: gate open, controller running", + "20:03:20 baseline: post: clean", + "20:03:20 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.gate-blocks-controllers", - "ts": "2026-09-09T16:05:01Z" + "ts": "2026-09-09T20:03:20Z" }, "requires": [ "forgectrl.auth" @@ -4191,14 +4190,14 @@ "src/paths.h" ] ], - "fingerprint": "c72555ecf0c7381c68c65916f7c093906191303c804494451cb93b2b3a86e764", + "fingerprint": "1a5522182cf9182dbe0bd1d74b96494e1d3b47c37efce8a9a0cf2e4a33b37984", "hardware": "api", "id": "commission.override-until-reboot", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 0, "evidence": { "baseline": { @@ -4207,7 +4206,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -4225,7 +4224,7 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 1312, + "pid": 1805, "why": "" }, "mount": { @@ -4270,25 +4269,25 @@ "why": "override active (required: cooling.aa-offset, cooling.flow)" } }, - "fingerprint": "c72555ecf0c7381c68c65916f7c093906191303c804494451cb93b2b3a86e764", - "image": "20260909150456 (dev)", + "fingerprint": "1a5522182cf9182dbe0bd1d74b96494e1d3b47c37efce8a9a0cf2e4a33b37984", + "image": "20260909193551 (dev)", "log": [ - "16:05:02 start commission.override-until-reboot (auto, api) in campaign c-20260909160235-7649", - "16:05:02 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:05:02 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:05:02 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:05:02 baseline: pre: clean", - "16:05:02 /run/forgefirm/commissioning-override is on /run (tmpfs)", - "16:05:02 GET /wiz: {'first_run': False, 'gate': 'open', 'override': True, 'why': 'override active (required: cooling.aa-offset, cooling.flow)', 'required': ['cooling.aa-offset', 'cooling.flow'], 'advisories_complete': True, 'acceptance_done': True, 'account': True, 'completed': True, 'versions': {'account': 1, 'advisories': 1, 'airflow': 1, 'cameras': 1, 'cloud': 1, 'cloud.header': 1, 'cooling.flow-load': 1, 'cooling.flow-verify': 1, 'laser.corner': 1, 'laser.dose-curve': 1, 'laser.floor': 1, 'laser.focus': 1, 'machine': 1, 'motion': 1, 'motion.scale': 1, 'preferences': 1, 'sensors': 1, 'sheet.frame': 1, 'sheet.place': 1, 'sheet.record': 1, 'switches': 1}}", - "16:05:02 the override lifts: ['cooling.aa-offset', 'cooling.flow']", - "16:05:02 baseline: post: clean", - "16:05:02 result PASS" + "20:03:20 start commission.override-until-reboot (auto, api) in campaign c-20260909200054-7947", + "20:03:20 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:03:20 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:03:20 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:03:20 baseline: pre: clean", + "20:03:20 /run/forgefirm/commissioning-override is on /run (tmpfs)", + "20:03:20 GET /wiz: {'first_run': False, 'gate': 'open', 'override': True, 'why': 'override active (required: cooling.aa-offset, cooling.flow)', 'required': ['cooling.aa-offset', 'cooling.flow'], 'advisories_complete': True, 'acceptance_done': True, 'account': True, 'completed': True, 'versions': {'account': 1, 'advisories': 1, 'airflow': 1, 'cameras': 1, 'cloud': 1, 'cloud.header': 1, 'cooling.flow-load': 1, 'cooling.flow-verify': 1, 'laser.corner': 1, 'laser.dose-curve': 1, 'laser.floor': 1, 'laser.focus': 1, 'machine': 1, 'motion': 1, 'motion.scale': 1, 'preferences': 1, 'sensors': 1, 'sheet.frame': 1, 'sheet.place': 1, 'sheet.record': 1, 'switches': 1}}", + "20:03:20 the override lifts: ['cooling.aa-offset', 'cooling.flow']", + "20:03:20 baseline: post: clean", + "20:03:20 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.override-until-reboot", - "ts": "2026-09-09T16:05:02Z" + "ts": "2026-09-09T20:03:20Z" }, "requires": [ "forgectrl.auth" @@ -4330,14 +4329,14 @@ "src/ui/embed_docs.cmake" ] ], - "fingerprint": "9002a6ba5a54bd9a9d3d00b479d1eeea1f121f99071b373e10966cbb72edf2e7", + "fingerprint": "a20bbd3ea7d6952a1113b08314ba5a93f86b7664bccf0dd5cde04bd20ff90f26", "hardware": "takeover", "id": "commission.advisories-rehash", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 9, "evidence": { "accept": 200, @@ -4421,7 +4420,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "before": { "acceptance_done": true, @@ -4476,37 +4475,38 @@ "stale_hash": 409, "unknown_doc": 400 }, - "fingerprint": "9002a6ba5a54bd9a9d3d00b479d1eeea1f121f99071b373e10966cbb72edf2e7", - "image": "20260909150456 (dev)", + "fingerprint": "a20bbd3ea7d6952a1113b08314ba5a93f86b7664bccf0dd5cde04bd20ff90f26", + "image": "20260909193551 (dev)", "log": [ - "16:05:02 start commission.advisories-rehash (auto, takeover) in campaign c-20260909160235-7649", - "16:05:02 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:05:02 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:05:02 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:05:02 baseline: pre: clean", - "16:05:02 GET /advisories/safety-and-risk -> 200, 6868 bytes, ETag cb0ce8ae5fa98b850785d681957a9142e4ccad6c0c8f17ceddee5a3cd215b99d", - "16:05:02 accept with a stale hash -> 409 {'error': 'the document changed; read it again'}", - "16:05:02 accept at the current hash with the phrase -> 200", - "16:05:02 acceptance_done cleared, gate closed: the advisories are not accepted", - "16:05:02 takeover: waiting for forgectrl to be settled", - "16:05:02 baseline: /mode controller=gated motion=verified", - "16:05:02 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:05:02 takeover: stopping the controller through forgectrl", - "16:05:02 takeover: POST /controller/stop -> 200", - "16:05:03 takeover: forgectrl stop -> rc 0", - "16:05:04 takeover: pulse device free", - "16:05:04 takeover: forgectrl start -> rc 0", - "16:05:06 baseline: /mode controller=stopped motion=unverified", - "16:05:11 baseline: /mode controller=running motion=verified", - "16:05:11 the previous record is back under a restart", - "16:05:11 baseline: post: clean", - "16:05:11 result PASS" + "20:03:20 start commission.advisories-rehash (auto, takeover) in campaign c-20260909200054-7947", + "20:03:20 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:03:20 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:03:20 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:03:21 baseline: pre: clean", + "20:03:21 GET /advisories/safety-and-risk -> 200, 6868 bytes, ETag cb0ce8ae5fa98b850785d681957a9142e4ccad6c0c8f17ceddee5a3cd215b99d", + "20:03:21 accept with a stale hash -> 409 {'error': 'the document changed; read it again'}", + "20:03:21 accept at the current hash with the phrase -> 200", + "20:03:21 acceptance_done cleared, gate closed: the advisories are not accepted", + "20:03:21 takeover: waiting for forgectrl to be settled", + "20:03:21 baseline: /mode controller=running motion=verified", + "20:03:21 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:03:21 takeover: stopping the controller through forgectrl", + "20:03:21 takeover: POST /controller/stop -> 200", + "20:03:21 takeover: forgectrl stop -> rc 0", + "20:03:22 takeover: pulse device free", + "20:03:22 takeover: forgectrl start -> rc 0", + "20:03:24 baseline: /mode controller=stopped motion=unverified", + "20:03:28 baseline: /mode controller=stopped motion=verified", + "20:03:29 baseline: /mode controller=running motion=verified", + "20:03:29 the previous record is back under a restart", + "20:03:29 baseline: post: clean", + "20:03:29 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.advisories-rehash", - "ts": "2026-09-09T16:05:11Z" + "ts": "2026-09-09T20:03:29Z" }, "requires": [ "forgectrl.auth" @@ -4548,14 +4548,14 @@ "src/ui/login.*" ] ], - "fingerprint": "195d3c88960af8d11e084b6729cbb8784b992630ef4761816136db3e60d0276e", + "fingerprint": "70a350b297d49b163151ccbe03c8ed29428a6c3fd2e4662ed2710a3271bc5fde", "hardware": "takeover", "id": "commission.account-login", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 49, "evidence": { "account_before": "scott", @@ -4565,7 +4565,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "cookie_flags": [ "httponly", @@ -4600,52 +4600,52 @@ ], "wrong_name": 401 }, - "fingerprint": "195d3c88960af8d11e084b6729cbb8784b992630ef4761816136db3e60d0276e", - "image": "20260909150456 (dev)", + "fingerprint": "70a350b297d49b163151ccbe03c8ed29428a6c3fd2e4662ed2710a3271bc5fde", + "image": "20260909193551 (dev)", "log": [ - "16:05:11 start commission.account-login (auto, takeover) in campaign c-20260909160235-7649", - "16:05:11 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:05:11 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:05:11 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:05:12 baseline: pre: clean", - "16:05:12 takeover: waiting for forgectrl to be settled", - "16:05:12 baseline: /mode controller=running motion=verified", - "16:05:12 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:05:12 takeover: stopping the controller through forgectrl", - "16:05:12 takeover: POST /controller/stop -> 200", - "16:05:12 takeover: forgectrl stop -> rc 0", - "16:05:13 takeover: pulse device free", - "16:05:13 takeover: forgectrl start -> rc 0", - "16:05:15 baseline: /mode controller=stopped motion=unverified", - "16:05:20 baseline: /mode controller=running motion=verified", - "16:05:20 installed under a restart: users=removed", - "16:05:20 POST /wiz/account (temporary 'forgetest') -> 200 {'ok': True, 'name': 'forgetest'}", - "16:05:20 GET https://127.0.0.1/wiz -> 200", - "16:05:21 wrong password attempts -> [401, 401, 401, 401, 401, 429]", - "16:05:21 locked for 30 s; the right password is refused inside the lock", - "16:05:42 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:05:52 POST /login (right) -> 200, cookie flags ['httponly', 'max-age', 'path', 'samesite', 'secure']", - "16:05:52 session set by the login, seen by GET /wiz, ended by the logout", - "16:05:52 takeover: waiting for forgectrl to be settled", - "16:05:52 baseline: /mode controller=running motion=verified", - "16:05:52 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:05:52 takeover: stopping the controller through forgectrl", - "16:05:52 takeover: POST /controller/stop -> 200", - "16:05:52 takeover: forgectrl stop -> rc 0", - "16:05:53 takeover: pulse device free", - "16:05:53 takeover: forgectrl start -> rc 0", - "16:05:55 baseline: /mode controller=stopped motion=unverified", - "16:06:00 baseline: /mode controller=running motion=verified", - "16:06:00 restored under a restart: users", - "16:06:00 forgefirm-users reload -> rc 0 forgefirm-users: account scott created\nforgefirm-users: removing account forgetest (not in the record)", - "16:06:01 baseline: post: clean", - "16:06:01 result PASS" + "20:03:30 start commission.account-login (auto, takeover) in campaign c-20260909200054-7947", + "20:03:30 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:03:30 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:03:30 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:03:30 baseline: pre: clean", + "20:03:30 takeover: waiting for forgectrl to be settled", + "20:03:30 baseline: /mode controller=running motion=verified", + "20:03:30 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:03:30 takeover: stopping the controller through forgectrl", + "20:03:30 takeover: POST /controller/stop -> 200", + "20:03:30 takeover: forgectrl stop -> rc 0", + "20:03:31 takeover: pulse device free", + "20:03:31 takeover: forgectrl start -> rc 0", + "20:03:33 baseline: /mode controller=stopped motion=unverified", + "20:03:38 baseline: /mode controller=running motion=verified", + "20:03:38 installed under a restart: users=removed", + "20:03:38 POST /wiz/account (temporary 'forgetest') -> 200 {'ok': True, 'name': 'forgetest'}", + "20:03:38 GET https://127.0.0.1/wiz -> 200", + "20:03:39 wrong password attempts -> [401, 401, 401, 401, 401, 429]", + "20:03:39 locked for 30 s; the right password is refused inside the lock", + "20:04:00 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:04:10 POST /login (right) -> 200, cookie flags ['httponly', 'max-age', 'path', 'samesite', 'secure']", + "20:04:10 session set by the login, seen by GET /wiz, ended by the logout", + "20:04:10 takeover: waiting for forgectrl to be settled", + "20:04:10 baseline: /mode controller=running motion=verified", + "20:04:10 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:04:10 takeover: stopping the controller through forgectrl", + "20:04:10 takeover: POST /controller/stop -> 200", + "20:04:11 takeover: forgectrl stop -> rc 0", + "20:04:11 takeover: pulse device free", + "20:04:11 takeover: forgectrl start -> rc 0", + "20:04:13 baseline: /mode controller=stopped motion=unverified", + "20:04:18 baseline: /mode controller=running motion=verified", + "20:04:18 restored under a restart: users", + "20:04:18 forgefirm-users reload -> rc 0 forgefirm-users: account scott created\nforgefirm-users: removing account forgetest (not in the record)", + "20:04:19 baseline: post: clean", + "20:04:19 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.account-login", - "ts": "2026-09-09T16:06:01Z" + "ts": "2026-09-09T20:04:19Z" }, "requires": [ "forgectrl.auth" @@ -4675,14 +4675,14 @@ "src/main.c" ] ], - "fingerprint": "54383d3589ca39d76ce276d062359d80d347e0887eb1a06d510ac274c530388b", + "fingerprint": "d3e00388146e30ad5ed4265766c60f4e30f5dc1621c5dffa20222f48c5c693b8", "hardware": "api", "id": "commission.https-only-writes", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 0, "evidence": { "account": true, @@ -4692,7 +4692,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "dev_image": true, "fixture": { @@ -4723,28 +4723,28 @@ "lan_ip": "172.16.1.97", "loopback_http_write": 200 }, - "fingerprint": "54383d3589ca39d76ce276d062359d80d347e0887eb1a06d510ac274c530388b", - "image": "20260909150456 (dev)", + "fingerprint": "d3e00388146e30ad5ed4265766c60f4e30f5dc1621c5dffa20222f48c5c693b8", + "image": "20260909193551 (dev)", "log": [ - "16:06:01 start commission.https-only-writes (auto, api) in campaign c-20260909160235-7649", - "16:06:01 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:06:01 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:06:01 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:06:01 baseline: pre: clean", - "16:06:01 GET https://172.16.1.97/status -> 200", - "16:06:01 GET http://172.16.1.97/status -> 200", - "16:06:01 POST http://172.16.1.97/settings (token) -> 302 Location https://172.16.1.97/settings", - "16:06:01 GET http://172.16.1.97/system/ssh (token) -> 302 Location https://172.16.1.97/system/ssh", - "16:06:01 GET http://172.16.1.97/logs (token) -> 302 Location https://172.16.1.97/logs", - "16:06:01 POST https://172.16.1.97/settings (token, no session) -> 200 (dev image True, account True)", - "16:06:01 baseline: post: clean", - "16:06:01 result PASS" + "20:04:19 start commission.https-only-writes (auto, api) in campaign c-20260909200054-7947", + "20:04:19 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:04:19 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:04:19 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:04:19 baseline: pre: clean", + "20:04:19 GET https://172.16.1.97/status -> 200", + "20:04:19 GET http://172.16.1.97/status -> 200", + "20:04:19 POST http://172.16.1.97/settings (token) -> 302 Location https://172.16.1.97/settings", + "20:04:19 GET http://172.16.1.97/system/ssh (token) -> 302 Location https://172.16.1.97/system/ssh", + "20:04:19 GET http://172.16.1.97/logs (token) -> 302 Location https://172.16.1.97/logs", + "20:04:19 POST https://172.16.1.97/settings (token, no session) -> 200 (dev image True, account True)", + "20:04:19 baseline: post: clean", + "20:04:19 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.https-only-writes", - "ts": "2026-09-09T16:06:01Z" + "ts": "2026-09-09T20:04:19Z" }, "requires": [ "forgectrl.auth" @@ -4766,14 +4766,14 @@ "src/paths.h" ] ], - "fingerprint": "88e6f60170be6223342f632bf51c500ce7947fa8ac46c50e1981aaae920d6c4b", + "fingerprint": "74709cb83cd3d0ae4a41df2f9e863a5e37378b8953eb9ab0155c4dcc9fc5d9c6", "hardware": "api", "id": "commission.ssh-until-reboot", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 0, "evidence": { "after": { @@ -4787,7 +4787,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "before": { "dev_image": true, @@ -4820,27 +4820,27 @@ "permitrootlogin": "yes" } }, - "fingerprint": "88e6f60170be6223342f632bf51c500ce7947fa8ac46c50e1981aaae920d6c4b", - "image": "20260909150456 (dev)", + "fingerprint": "74709cb83cd3d0ae4a41df2f9e863a5e37378b8953eb9ab0155c4dcc9fc5d9c6", + "image": "20260909193551 (dev)", "log": [ - "16:06:02 start commission.ssh-until-reboot (auto, api) in campaign c-20260909160235-7649", - "16:06:02 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:06:02 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:06:02 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:06:02 baseline: pre: clean", - "16:06:02 GET /system/ssh -> 200 {'enabled': False, 'running': True, 'dev_image': True}", - "16:06:02 POST /system/ssh enable=1 -> 200 {'enabled': True, 'running': True, 'dev_image': True}", - "16:06:02 sshd listens on 22 (0.0 s)", - "16:06:02 sshd -T: {'permitrootlogin': 'yes', 'passwordauthentication': 'yes', 'permitemptypasswords': 'yes'}", - "16:06:02 dev image: flag removed by hand; GET /system/ssh -> 200 {'enabled': False, 'running': True, 'dev_image': True}", - "16:06:03 baseline: post: clean", - "16:06:03 result PASS" + "20:04:19 start commission.ssh-until-reboot (auto, api) in campaign c-20260909200054-7947", + "20:04:19 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:04:19 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:04:19 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:04:20 baseline: pre: clean", + "20:04:20 GET /system/ssh -> 200 {'enabled': False, 'running': True, 'dev_image': True}", + "20:04:20 POST /system/ssh enable=1 -> 200 {'enabled': True, 'running': True, 'dev_image': True}", + "20:04:20 sshd listens on 22 (0.0 s)", + "20:04:20 sshd -T: {'permitrootlogin': 'yes', 'passwordauthentication': 'yes', 'permitemptypasswords': 'yes'}", + "20:04:20 dev image: flag removed by hand; GET /system/ssh -> 200 {'enabled': False, 'running': True, 'dev_image': True}", + "20:04:20 baseline: post: clean", + "20:04:20 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.ssh-until-reboot", - "ts": "2026-09-09T16:06:03Z" + "ts": "2026-09-09T20:04:20Z" }, "requires": [ "forgectrl.auth" @@ -4874,14 +4874,14 @@ "src/hooks.h" ] ], - "fingerprint": "8052978f11a241cf80902e30bf8f7b1b6610dc885bd90aa52f5cae5bdeb3f1c8", + "fingerprint": "a01afa7c2d866fbb3b54ef32901a7e45bae45c0484161a583dbb26d3e28a6a63", "hardware": "api", "id": "commission.cloud-disabled-surface", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 0, "evidence": { "baseline": { @@ -4890,7 +4890,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -4922,30 +4922,30 @@ "settings controller_mode=cloud": 409, "settings homing_mode=gfcloud": 409 }, - "fingerprint": "8052978f11a241cf80902e30bf8f7b1b6610dc885bd90aa52f5cae5bdeb3f1c8", - "image": "20260909150456 (dev)", + "fingerprint": "a01afa7c2d866fbb3b54ef32901a7e45bae45c0484161a583dbb26d3e28a6a63", + "image": "20260909193551 (dev)", "log": [ - "16:06:03 start commission.cloud-disabled-surface (auto, api) in campaign c-20260909160235-7649", - "16:06:03 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:06:03 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:06:03 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:06:03 baseline: pre: clean", - "16:06:03 mode: test needs grbl - already in grbl mode", - "16:06:03 cloud mode turned off for the test (found {'cloud_enabled': '1', 'homing_mode': 'gfcloud', 'controller_mode': 'grbl'})", - "16:06:03 POST /settings controller_mode=cloud -> 409 cloud mode is not enabled on this machine", - "16:06:03 POST /settings homing_mode=gfcloud -> 409 cloud homing needs cloud mode enabled", - "16:06:03 POST /settings cloud_enabled=1 (no phrase) -> 400 type I UNDERSTAND to turn cloud mode on", - "16:06:03 POST /mode controller=cloud -> 409 cloud mode is not enabled on this machine", - "16:06:03 restore cloud_enabled='1' -> 200", - "16:06:03 restore homing_mode='gfcloud' -> 200", - "16:06:03 baseline: post: clean", - "16:06:03 result PASS" + "20:04:20 start commission.cloud-disabled-surface (auto, api) in campaign c-20260909200054-7947", + "20:04:21 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:04:21 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:04:21 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:04:21 baseline: pre: clean", + "20:04:21 mode: test needs grbl - already in grbl mode", + "20:04:21 cloud mode turned off for the test (found {'cloud_enabled': '1', 'homing_mode': 'gfcloud', 'controller_mode': 'grbl'})", + "20:04:21 POST /settings controller_mode=cloud -> 409 cloud mode is not enabled on this machine", + "20:04:21 POST /settings homing_mode=gfcloud -> 409 cloud homing needs cloud mode enabled", + "20:04:21 POST /settings cloud_enabled=1 (no phrase) -> 400 type I UNDERSTAND to turn cloud mode on", + "20:04:21 POST /mode controller=cloud -> 409 cloud mode is not enabled on this machine", + "20:04:21 restore cloud_enabled='1' -> 200", + "20:04:21 restore homing_mode='gfcloud' -> 200", + "20:04:21 baseline: post: clean", + "20:04:21 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.cloud-disabled-surface", - "ts": "2026-09-09T16:06:03Z" + "ts": "2026-09-09T20:04:21Z" }, "requires": [ "forgectrl.settings-bounds" @@ -4971,14 +4971,14 @@ "src/ui/wizard.js" ] ], - "fingerprint": "61598f77f2ffadaefe5483c782d12f8145bd1fff64beb55578a9a92a9af70794", + "fingerprint": "14c8f2ec4c145d19f06e669f152e45f9de40f1f51eaf54dd1e5960e0b232499f", "hardware": "api", "id": "commission.factory-return", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 0, "evidence": { "archives": [ @@ -5001,7 +5001,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -5024,25 +5024,25 @@ "status": 200 } }, - "fingerprint": "61598f77f2ffadaefe5483c782d12f8145bd1fff64beb55578a9a92a9af70794", - "image": "20260909150456 (dev)", + "fingerprint": "14c8f2ec4c145d19f06e669f152e45f9de40f1f51eaf54dd1e5960e0b232499f", + "image": "20260909193551 (dev)", "log": [ - "16:06:05 start commission.factory-return (auto, api) in campaign c-20260909160235-7649", - "16:06:05 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:06:05 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:06:05 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:06:05 baseline: pre: clean", - "16:06:05 POST /restore/factory-return (no confirm) -> 400 {'error': 'confirm=1 required'}", - "16:06:06 GET /slots archives: [{'file': 'factory-rootfs-20240612194245.img.gz', 'bytes': 37039693, 'version': '2.6.0-2228', 'date': '2024-06-12'}, {'file': 'factory-rootfs-20220810204015.img.gz', 'bytes': 26349275, 'version': '2.5.1-2192', 'date': '2022-08-10'}]", - "16:06:06 PASS: the return is refused without confirm=1; the page confirms before it calls", - "16:06:06 baseline: post: clean", - "16:06:06 result PASS" + "20:04:23 start commission.factory-return (auto, api) in campaign c-20260909200054-7947", + "20:04:23 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:04:23 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:04:23 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:04:23 baseline: pre: clean", + "20:04:23 POST /restore/factory-return (no confirm) -> 400 {'error': 'confirm=1 required'}", + "20:04:23 GET /slots archives: [{'file': 'factory-rootfs-20240612194245.img.gz', 'bytes': 37039693, 'version': '2.6.0-2228', 'date': '2024-06-12'}, {'file': 'factory-rootfs-20220810204015.img.gz', 'bytes': 26349275, 'version': '2.5.1-2192', 'date': '2022-08-10'}]", + "20:04:23 PASS: the return is refused without confirm=1; the page confirms before it calls", + "20:04:23 baseline: post: clean", + "20:04:23 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.factory-return", - "ts": "2026-09-09T16:06:06Z" + "ts": "2026-09-09T20:04:23Z" }, "requires": [ "update.slots-and-signature" @@ -5055,22 +5055,22 @@ { "always": false, "covers": [], - "fingerprint": "35b372cfb03d2e825c8d60c460baeffbf73039a4e587bc783d8ef0449c750bf9", + "fingerprint": "efc399f88830b27c974e1dde2cf30ef316bef61c38deddc91f66c1a23689ea50", "hardware": "api", "id": "commission.mdns-announce", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 0, "evidence": { "answers": [ "172.16.1.97" ], "avahi_pids": [ - 447, - 449 + 459, + 461 ], "baseline": { "post": [], @@ -5078,7 +5078,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -5094,23 +5094,23 @@ "resolve_s": 0.0, "service_file_bytes": 461 }, - "fingerprint": "35b372cfb03d2e825c8d60c460baeffbf73039a4e587bc783d8ef0449c750bf9", - "image": "20260909150456 (dev)", + "fingerprint": "efc399f88830b27c974e1dde2cf30ef316bef61c38deddc91f66c1a23689ea50", + "image": "20260909193551 (dev)", "log": [ - "16:06:06 start commission.mdns-announce (auto, api) in campaign c-20260909160235-7649", - "16:06:06 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:06:06 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:06:06 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:06:06 baseline: pre: clean", - "16:06:06 forgefirm.local -> ['172.16.1.97'] (0.0 s)", - "16:06:06 baseline: post: clean", - "16:06:06 result PASS" + "20:04:24 start commission.mdns-announce (auto, api) in campaign c-20260909200054-7947", + "20:04:24 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:04:24 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:04:24 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:04:24 baseline: pre: clean", + "20:04:24 forgefirm.local -> ['172.16.1.97'] (0.0 s)", + "20:04:24 baseline: post: clean", + "20:04:24 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.mdns-announce", - "ts": "2026-09-09T16:06:06Z" + "ts": "2026-09-09T20:04:24Z" }, "requires": [ "forgectrl.auth" @@ -5164,15 +5164,15 @@ "src/main.c" ] ], - "fingerprint": "41e6f97021c7c680f5a4cad2f7eef26b40e2a5b99976e1e77d8bd03113a93094", + "fingerprint": "73177d5530cd91ca8cd6ff5a54ca812be35348f6655fa7ade8f2ef814efd2b84", "hardware": "takeover", "id": "commission.first-run-flow", - "inherited": false, + "inherited": true, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 21, + "campaign": "c-20260909200054-7947", + "duration_s": 22, "evidence": { "account": { "cookie": true, @@ -5184,8 +5184,8 @@ "by": "fixture", "channel": "button", "state": "press", - "took_s": 0.3, - "ts": "2026-09-09T16:06:10Z" + "took_s": 0.29, + "ts": "2026-09-09T20:04:29Z" } ], "after": { @@ -5231,7 +5231,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "before": { "acceptance_done": true, @@ -5382,7 +5382,7 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 2057, + "pid": 2562, "why": "" }, "settings_before": { @@ -5396,62 +5396,62 @@ }, "users_reload_rc": 0 }, - "fingerprint": "41e6f97021c7c680f5a4cad2f7eef26b40e2a5b99976e1e77d8bd03113a93094", - "image": "20260909150456 (dev)", + "fingerprint": "73177d5530cd91ca8cd6ff5a54ca812be35348f6655fa7ade8f2ef814efd2b84", + "image": "20260909193551 (dev)", "log": [ - "16:06:06 start commission.first-run-flow (operator, takeover) in campaign c-20260909160235-7649", - "16:06:06 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:06:06 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:06:06 fixture: running unattended (no prompt can be answered)", - "16:06:06 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:06:07 baseline: pre: clean", - "16:06:07 takeover: waiting for forgectrl to be settled", - "16:06:07 baseline: /mode controller=running motion=verified", - "16:06:07 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:06:07 takeover: stopping the controller through forgectrl", - "16:06:07 takeover: POST /controller/stop -> 200", - "16:06:07 takeover: forgectrl stop -> rc 0", - "16:06:08 takeover: pulse device free", - "16:06:08 takeover: forgectrl start -> rc 0", - "16:06:10 baseline: /mode controller=gated motion=unverified", - "16:06:10 installed under a restart: commissioning.json=12633 B, users=removed, commissioning-override=0 B", - "16:06:10 the four documents are accepted", - "16:06:10 ACT button press (fixture)", - "16:06:11 ACT button press: done after 0.3 s", - "16:06:11 the press step: teal ({'target': [0, 255, 255], 'pulse_on': [0, 1400, 1400], 'pulse_off': [0, 1400, 1400]}), the press accepted", - "16:06:11 account 'bench-90e1' created, the session cookie set", - "16:06:12 preferences, machine (basic), cloud (1) written", - "16:06:12 baseline: /mode controller=stopped motion=unverified", - "16:06:18 baseline: /mode controller=running motion=verified", - "16:06:18 the run completed: gate open, the controller back", - "16:06:18 takeover: waiting for forgectrl to be settled", - "16:06:18 baseline: /mode controller=running motion=verified", - "16:06:18 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:06:18 takeover: stopping the controller through forgectrl", - "16:06:18 takeover: POST /controller/stop -> 200", - "16:06:18 takeover: forgectrl stop -> rc 0", - "16:06:19 takeover: pulse device free", - "16:06:19 takeover: forgectrl start -> rc 0", - "16:06:21 baseline: /mode controller=stopped motion=unverified", - "16:06:26 baseline: /mode controller=running motion=verified", - "16:06:26 restored under a restart: commissioning.json, users, commissioning-override", - "16:06:26 restore cloud_enabled='1' -> 200", - "16:06:26 restore homing_mode='gfcloud' -> 200", - "16:06:26 restore controller_mode='grbl' -> 200", - "16:06:27 restore gfcloud_home_timeout_s='' -> 200", - "16:06:27 restore cool_tec_present='0' -> 200", - "16:06:27 restore ui_units='imperial' -> 200", - "16:06:27 restore wifi_country='US' -> 200", - "16:06:28 forgefirm-users reload -> rc 0 forgefirm-users: account scott created\nforgefirm-users: removing account bench-90e1 (not in the record)", - "16:06:28 removed the temporary home directory of 'bench-90e1'", - "16:06:28 baseline: post: clean", - "16:06:28 result PASS" + "20:04:24 start commission.first-run-flow (operator, takeover) in campaign c-20260909200054-7947", + "20:04:24 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:04:24 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:04:24 fixture: running unattended (no prompt can be answered)", + "20:04:24 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:04:24 baseline: pre: clean", + "20:04:24 takeover: waiting for forgectrl to be settled", + "20:04:24 baseline: /mode controller=running motion=verified", + "20:04:24 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:04:24 takeover: stopping the controller through forgectrl", + "20:04:25 takeover: POST /controller/stop -> 200", + "20:04:25 takeover: forgectrl stop -> rc 0", + "20:04:26 takeover: pulse device free", + "20:04:26 takeover: forgectrl start -> rc 0", + "20:04:28 baseline: /mode controller=gated motion=unverified", + "20:04:28 installed under a restart: commissioning.json=12659 B, users=removed, commissioning-override=0 B", + "20:04:29 the four documents are accepted", + "20:04:29 ACT button press (fixture)", + "20:04:29 ACT button press: done after 0.3 s", + "20:04:29 the press step: teal ({'target': [0, 255, 255], 'pulse_on': [0, 1400, 1400], 'pulse_off': [0, 1400, 1400]}), the press accepted", + "20:04:29 account 'bench-94b6' created, the session cookie set", + "20:04:30 preferences, machine (basic), cloud (1) written", + "20:04:30 baseline: /mode controller=stopped motion=unverified", + "20:04:36 baseline: /mode controller=running motion=verified", + "20:04:36 the run completed: gate open, the controller back", + "20:04:36 takeover: waiting for forgectrl to be settled", + "20:04:36 baseline: /mode controller=running motion=verified", + "20:04:36 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:04:36 takeover: stopping the controller through forgectrl", + "20:04:36 takeover: POST /controller/stop -> 200", + "20:04:36 takeover: forgectrl stop -> rc 0", + "20:04:38 takeover: pulse device free", + "20:04:38 takeover: forgectrl start -> rc 0", + "20:04:40 baseline: /mode controller=stopped motion=unverified", + "20:04:45 baseline: /mode controller=running motion=verified", + "20:04:45 restored under a restart: commissioning.json, users, commissioning-override", + "20:04:45 restore cloud_enabled='1' -> 200", + "20:04:45 restore homing_mode='gfcloud' -> 200", + "20:04:45 restore controller_mode='grbl' -> 200", + "20:04:45 restore gfcloud_home_timeout_s='' -> 200", + "20:04:45 restore cool_tec_present='0' -> 200", + "20:04:45 restore ui_units='imperial' -> 200", + "20:04:46 restore wifi_country='US' -> 200", + "20:04:46 forgefirm-users reload -> rc 0 forgefirm-users: account scott created\nforgefirm-users: removing account bench-94b6 (not in the record)", + "20:04:46 removed the temporary home directory of 'bench-94b6'", + "20:04:46 baseline: post: clean", + "20:04:46 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.first-run-flow", - "ts": "2026-09-09T16:06:28Z" + "ts": "2026-09-09T20:04:46Z" }, "requires": [ "commission.gate-blocks-controllers", @@ -5490,7 +5490,7 @@ "src/tls.*" ] ], - "fingerprint": "68eea9e59da4c713ff953e3c34857c2c38502aa9968d3ec81025b31ad9f7bd0a", + "fingerprint": "d03bb96a289c4d5b21bc4b01fa314948d4aded62ef97177feca3f8447bc2eebd", "hardware": "takeover", "id": "commission.first-run-page", "inherited": false, @@ -5500,11 +5500,11 @@ { "answer": "Yes", "question": "Did the control panel open after Finish?", - "ts": "2026-09-09T16:36:26Z" + "ts": "2026-09-09T20:58:20Z" } ], - "campaign": "c-20260909160235-7649", - "duration_s": 150, + "campaign": "c-20260909204732-3fa9", + "duration_s": 77, "evidence": { "account_before": "scott", "actions": [ @@ -5512,8 +5512,8 @@ "by": "fixture", "channel": "button", "state": "press", - "took_s": 0.72, - "ts": "2026-09-09T16:34:44Z" + "took_s": 1.05, + "ts": "2026-09-09T20:57:42Z" } ], "after": { @@ -5554,20 +5554,9 @@ "why": "override active (required: cooling.aa-offset, cooling.flow)" }, "baseline": { - "post": [ - { - "action": "restored", - "expected": "cloud", - "found": "cloud", - "item": "mode" - } - ], + "post": [], "pre": [] }, - "batch": { - "group": "attended", - "ts": "2026-09-09T16:34:09Z" - }, "before": { "acceptance_done": true, "account": true, @@ -5707,85 +5696,80 @@ "controller": "running", "gated": false, "local": false, - "mode": "cloud", + "mode": "grbl", "motion": "verified", - "pid": 6610, + "pid": 10584, "why": "" }, "root_page": 200, "settings_before": { "cloud_enabled": "1", - "controller_mode": "cloud", + "controller_mode": "grbl", "cool_tec_present": "0", "gfcloud_home_timeout_s": "", "homing_mode": "gfcloud", "ui_units": "imperial", "wifi_country": "US" }, - "temp_account": "boogerboopoops", + "temp_account": "bigbootytits", "users_reload_rc": 0 }, - "fingerprint": "68eea9e59da4c713ff953e3c34857c2c38502aa9968d3ec81025b31ad9f7bd0a", - "image": "20260909150456 (dev)", + "fingerprint": "d03bb96a289c4d5b21bc4b01fa314948d4aded62ef97177feca3f8447bc2eebd", + "image": "20260909193551 (dev)", "log": [ - "16:34:09 start commission.first-run-page (operator, takeover) in campaign c-20260909160235-7649", - "16:34:10 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:34:10 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:34:10 queued by the attended queue opened 2026-09-09T16:34:09Z", - "16:34:10 baseline: pre: clean", - "16:34:10 takeover: waiting for forgectrl to be settled", - "16:34:10 baseline: /mode controller=running motion=verified", - "16:34:10 takeover: preserving cnc/motor_lock=8, cnc/step_freq=10000, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:34:10 takeover: stopping the controller through forgectrl", - "16:34:10 takeover: POST /controller/stop -> 200", - "16:34:10 takeover: forgectrl stop -> rc 0", - "16:34:11 takeover: pulse device free", - "16:34:11 takeover: forgectrl start -> rc 0", - "16:34:13 baseline: /mode controller=gated motion=unverified", - "16:34:13 installed under a restart: commissioning.json=12634 B, users=removed, commissioning-override=0 B", - "16:34:13 NOTICE: Open https://172.16.1.97/ from the workstation, accept the certificate, and click through the setup as the steps describe. The test follows the record.", - "16:34:41 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:34:43 the documents are accepted (30 s)", - "16:34:44 ACT button press (fixture)", - "16:34:45 ACT button press: done after 0.7 s", - "16:34:45 NOTICE: Continue on the page: the account, the preferences, the machine, the cloud step, Finish.", - "16:35:13 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:35:18 account 'boogerboopoops' created (32 s)", - "16:35:41 baseline: /mode controller=running motion=verified", - "16:35:41 PROMPT: Did the control panel open after Finish?", - "16:35:45 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:36:16 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:36:26 ANSWER: Yes", - "16:36:26 takeover: waiting for forgectrl to be settled", - "16:36:26 baseline: /mode controller=running motion=verified", - "16:36:26 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:36:26 takeover: stopping the controller through forgectrl", - "16:36:26 takeover: POST /controller/stop -> 200", - "16:36:26 takeover: forgectrl stop -> rc 0", - "16:36:28 takeover: pulse device free", - "16:36:28 takeover: forgectrl start -> rc 0", - "16:36:30 baseline: /mode controller=stopped motion=unverified", - "16:36:34 baseline: /mode controller=stopped motion=verified", - "16:36:35 baseline: /mode controller=running motion=verified", - "16:36:35 restored under a restart: commissioning.json, users, commissioning-override", - "16:36:35 restore cloud_enabled='1' -> 200", - "16:36:35 restore homing_mode='gfcloud' -> 200", - "16:36:35 restore controller_mode='cloud' -> 200", - "16:36:35 restore gfcloud_home_timeout_s='' -> 200", - "16:36:35 restore cool_tec_present='0' -> 200", - "16:36:35 restore ui_units='imperial' -> 200", - "16:36:36 restore wifi_country='US' -> 200", - "16:36:36 forgefirm-users reload -> rc 0 forgefirm-users: account scott created\nforgefirm-users: removing account boogerboopoops (not in the record)", - "16:36:36 removed the temporary home directory of 'boogerboopoops'", - "16:36:40 baseline: /mode controller=running motion=verified", - "16:36:40 baseline: post: 1 leftover(s): mode=cloud (expected cloud) -> restored", - "16:36:40 result PASS" + "20:57:13 start commission.first-run-page (operator, takeover) in campaign c-20260909204732-3fa9", + "20:57:13 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:57:13 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:57:13 baseline: pre: clean", + "20:57:13 takeover: waiting for forgectrl to be settled", + "20:57:13 baseline: /mode controller=running motion=verified", + "20:57:13 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:57:13 takeover: stopping the controller through forgectrl", + "20:57:13 takeover: POST /controller/stop -> 200", + "20:57:13 takeover: forgectrl stop -> rc 0", + "20:57:14 takeover: pulse device free", + "20:57:14 takeover: forgectrl start -> rc 0", + "20:57:16 baseline: /mode controller=gated motion=unverified", + "20:57:16 installed under a restart: commissioning.json=12658 B, users=removed, commissioning-override=0 B", + "20:57:16 NOTICE: Open https://172.16.1.97/ from the workstation, accept the certificate, and click through the setup as the steps describe. The test follows the record.", + "20:57:41 the documents are accepted (25 s)", + "20:57:42 ACT button press (fixture)", + "20:57:43 ACT button press: done after 1.1 s", + "20:57:43 NOTICE: Continue on the page: the account, the preferences, the machine, the cloud step, Finish.", + "20:57:43 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:57:59 account 'bigbootytits' created (16 s)", + "20:58:15 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:58:15 baseline: /mode controller=running motion=verified", + "20:58:15 PROMPT: Did the control panel open after Finish?", + "20:58:20 ANSWER: Yes", + "20:58:20 takeover: waiting for forgectrl to be settled", + "20:58:20 baseline: /mode controller=running motion=verified", + "20:58:20 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:58:20 takeover: stopping the controller through forgectrl", + "20:58:20 takeover: POST /controller/stop -> 200", + "20:58:20 takeover: forgectrl stop -> rc 0", + "20:58:22 takeover: pulse device free", + "20:58:22 takeover: forgectrl start -> rc 0", + "20:58:24 baseline: /mode controller=stopped motion=unverified", + "20:58:29 baseline: /mode controller=running motion=verified", + "20:58:29 restored under a restart: commissioning.json, users, commissioning-override", + "20:58:29 restore cloud_enabled='1' -> 200", + "20:58:29 restore homing_mode='gfcloud' -> 200", + "20:58:29 restore controller_mode='grbl' -> 200", + "20:58:29 restore gfcloud_home_timeout_s='' -> 200", + "20:58:29 restore cool_tec_present='0' -> 200", + "20:58:29 restore ui_units='imperial' -> 200", + "20:58:30 restore wifi_country='US' -> 200", + "20:58:30 forgefirm-users reload -> rc 0 forgefirm-users: account scott created\nforgefirm-users: removing account bigbootytits (not in the record)", + "20:58:30 removed the temporary home directory of 'bigbootytits'", + "20:58:30 baseline: post: clean", + "20:58:30 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.first-run-page", - "ts": "2026-09-09T16:36:40Z" + "ts": "2026-09-09T20:58:30Z" }, "requires": [ "commission.gate-blocks-controllers", @@ -5817,14 +5801,14 @@ "src/ui/wizard.js" ] ], - "fingerprint": "97d03f7ae4741f855a78148bb7803616237124cf57bfd848bffd482909332e2d", + "fingerprint": "36d7347755321eb7a01b1026904190e3d00ebc026e84bce014436791ea0eb14d", "hardware": "api", "id": "commission.cert-page", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 0, "evidence": { "baseline": { @@ -5833,7 +5817,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fingerprint": "62:6A:AD:FA:3D:85:68:A0:EF:B0:9D:75:28:06:41:5C:14:1B:49:22:16:4A:02:A3:E3:95:E1:A2:2E:7C:2F:D8", "fixture": { @@ -5848,24 +5832,24 @@ }, "pem_bytes": 668 }, - "fingerprint": "97d03f7ae4741f855a78148bb7803616237124cf57bfd848bffd482909332e2d", - "image": "20260909150456 (dev)", + "fingerprint": "36d7347755321eb7a01b1026904190e3d00ebc026e84bce014436791ea0eb14d", + "image": "20260909193551 (dev)", "log": [ - "16:06:28 start commission.cert-page (auto, api) in campaign c-20260909160235-7649", - "16:06:28 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:06:28 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:06:28 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:06:28 baseline: pre: clean", - "16:06:28 GET http://172.16.1.97/cert -> 200", - "16:06:28 GET https://172.16.1.97/cert -> 200", - "16:06:28 baseline: post: clean", - "16:06:28 result PASS" + "20:04:46 start commission.cert-page (auto, api) in campaign c-20260909200054-7947", + "20:04:46 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:04:46 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:04:46 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:04:47 baseline: pre: clean", + "20:04:47 GET http://172.16.1.97/cert -> 200", + "20:04:47 GET https://172.16.1.97/cert -> 200", + "20:04:47 baseline: post: clean", + "20:04:47 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.cert-page", - "ts": "2026-09-09T16:06:28Z" + "ts": "2026-09-09T20:04:47Z" }, "requires": [ "forgectrl.auth" @@ -5903,14 +5887,14 @@ "src/ui/help.js" ] ], - "fingerprint": "269aeabcd701569ea1fae1f2810f011d15413d63ecac08859ccbc587aea63677", + "fingerprint": "1dc25fda572869a961c048dd46c6730273bc17673cf98f71074d2ba7227c012d", "hardware": "takeover", "id": "commission.what-changed", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 8, "evidence": { "after": { @@ -5956,7 +5940,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "before": { "acceptance_done": true, @@ -6020,37 +6004,37 @@ "override": true, "tray_reason": "the tray was replaced" }, - "fingerprint": "269aeabcd701569ea1fae1f2810f011d15413d63ecac08859ccbc587aea63677", - "image": "20260909150456 (dev)", + "fingerprint": "1dc25fda572869a961c048dd46c6730273bc17673cf98f71074d2ba7227c012d", + "image": "20260909193551 (dev)", "log": [ - "16:06:28 start commission.what-changed (auto, takeover) in campaign c-20260909160235-7649", - "16:06:28 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:06:28 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:06:28 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:06:29 baseline: pre: clean", - "16:06:29 POST /wiz/changed what=nothing-like-this -> 400", - "16:06:29 POST /wiz/changed what=tray -> 200", - "16:06:29 POST /wiz/changed what=fan -> 200", - "16:06:29 tray -> focus recommended; fan -> airflow required; gate open (override True)", - "16:06:29 takeover: waiting for forgectrl to be settled", - "16:06:29 baseline: /mode controller=running motion=verified", - "16:06:29 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:06:29 takeover: stopping the controller through forgectrl", - "16:06:29 takeover: POST /controller/stop -> 200", - "16:06:29 takeover: forgectrl stop -> rc 0", - "16:06:30 takeover: pulse device free", - "16:06:30 takeover: forgectrl start -> rc 0", - "16:06:32 baseline: /mode controller=stopped motion=unverified", - "16:06:37 baseline: /mode controller=running motion=verified", - "16:06:37 restored under a restart: commissioning.json", - "16:06:37 baseline: post: clean", - "16:06:37 result PASS" + "20:04:47 start commission.what-changed (auto, takeover) in campaign c-20260909200054-7947", + "20:04:47 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:04:47 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:04:47 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:04:47 baseline: pre: clean", + "20:04:47 POST /wiz/changed what=nothing-like-this -> 400", + "20:04:47 POST /wiz/changed what=tray -> 200", + "20:04:47 POST /wiz/changed what=fan -> 200", + "20:04:47 tray -> focus recommended; fan -> airflow required; gate open (override True)", + "20:04:47 takeover: waiting for forgectrl to be settled", + "20:04:47 baseline: /mode controller=running motion=verified", + "20:04:47 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:04:47 takeover: stopping the controller through forgectrl", + "20:04:48 takeover: POST /controller/stop -> 200", + "20:04:48 takeover: forgectrl stop -> rc 0", + "20:04:48 takeover: pulse device free", + "20:04:48 takeover: forgectrl start -> rc 0", + "20:04:50 baseline: /mode controller=stopped motion=unverified", + "20:04:55 baseline: /mode controller=running motion=verified", + "20:04:55 restored under a restart: commissioning.json", + "20:04:56 baseline: post: clean", + "20:04:56 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.what-changed", - "ts": "2026-09-09T16:06:37Z" + "ts": "2026-09-09T20:04:56Z" }, "requires": [ "forgectrl.auth" @@ -6096,15 +6080,15 @@ "src/ui/wizard.html" ] ], - "fingerprint": "a82ac0b3e6b91a26d782fb4b1bad9981136093fc7f29b7cfd45478fc2ecd7d46", + "fingerprint": "ed96a08d0b515136ce791eb530a2246397f064c8f8fd128485074b9b1eb53f52", "hardware": "api", "id": "commission.record-export", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 39, + "campaign": "c-20260909200054-7947", + "duration_s": 40, "evidence": { "baseline": { "post": [], @@ -6112,11 +6096,11 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, - "bundle_record_bytes": 18541, + "bundle_record_bytes": 18511, "download_disposition": "attachment; filename=\"forgefirm-commissioning-PVHHW-32AQ7.json\"", - "export_s": 38.6, + "export_s": 39.3, "fixture": { "channels": [ "lid", @@ -6128,7 +6112,7 @@ "released": [] }, "missing_on_page": [], - "page_bytes": 16156, + "page_bytes": 16157, "sheet_id": "PVHHW-32AQ7", "wizards_in_record": [ "account", @@ -6154,27 +6138,27 @@ "switches" ] }, - "fingerprint": "a82ac0b3e6b91a26d782fb4b1bad9981136093fc7f29b7cfd45478fc2ecd7d46", - "image": "20260909150456 (dev)", + "fingerprint": "ed96a08d0b515136ce791eb530a2246397f064c8f8fd128485074b9b1eb53f52", + "image": "20260909193551 (dev)", "log": [ - "16:07:17 start commission.record-export (auto, api) in campaign c-20260909160235-7649", - "16:07:17 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:07:17 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:07:17 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:07:17 baseline: pre: clean", - "16:07:17 GET /wiz/record -> 200 (11580 bytes)", - "16:07:18 GET /wiz/record.html -> 200 (16156 bytes)", - "16:07:48 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:07:56 POST /logs/export -> 200 (3295188 bytes, 38.6 s)", - "16:07:57 record 21 wizards; page 16156 bytes; bundle carries the record", - "16:07:57 baseline: post: clean", - "16:07:57 result PASS" + "20:05:37 start commission.record-export (auto, api) in campaign c-20260909200054-7947", + "20:05:37 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:05:37 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:05:37 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:05:37 baseline: pre: clean", + "20:05:37 GET /wiz/record -> 200 (11550 bytes)", + "20:05:37 GET /wiz/record.html -> 200 (16157 bytes)", + "20:06:08 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:06:16 POST /logs/export -> 200 (3403747 bytes, 39.3 s)", + "20:06:17 record 21 wizards; page 16157 bytes; bundle carries the record", + "20:06:17 baseline: post: clean", + "20:06:17 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.record-export", - "ts": "2026-09-09T16:07:57Z" + "ts": "2026-09-09T20:06:17Z" }, "requires": [ "forgectrl.auth", @@ -6217,14 +6201,14 @@ "src/ui/wizard.css" ] ], - "fingerprint": "8ab44d35750a400f8e0f436bde6b0e20d8d510a76d2b5c0d6c5589d8ebd9091c", + "fingerprint": "10ca12195b81bded762326d8399fc2ab7cacbddfbbf8daf8d597dadee7017633", "hardware": "takeover", "id": "commission.mirror", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 19, "evidence": { "a_sees": { @@ -6249,7 +6233,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "end": { "error": "aborted", @@ -6272,49 +6256,49 @@ }, "users_reload_rc": 0 }, - "fingerprint": "8ab44d35750a400f8e0f436bde6b0e20d8d510a76d2b5c0d6c5589d8ebd9091c", - "image": "20260909150456 (dev)", + "fingerprint": "10ca12195b81bded762326d8399fc2ab7cacbddfbbf8daf8d597dadee7017633", + "image": "20260909193551 (dev)", "log": [ - "16:08:10 start commission.mirror (auto, takeover) in campaign c-20260909160235-7649", - "16:08:10 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:08:10 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:08:10 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:08:10 baseline: pre: clean", - "16:08:10 takeover: waiting for forgectrl to be settled", - "16:08:10 baseline: /mode controller=running motion=verified", - "16:08:10 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:08:10 takeover: stopping the controller through forgectrl", - "16:08:10 takeover: POST /controller/stop -> 200", - "16:08:10 takeover: forgectrl stop -> rc 0", - "16:08:12 takeover: pulse device free", - "16:08:12 takeover: forgectrl start -> rc 0", - "16:08:14 baseline: /mode controller=stopped motion=unverified", - "16:08:19 baseline: /mode controller=running motion=verified", - "16:08:19 installed under a restart: users=removed", - "16:08:19 POST /wiz/sensors/start (session A) -> 200", - "16:08:19 POST /wiz/sensors/abort (session B) -> 409 {'error': 'another browser is running this step; take it over to answer'}", - "16:08:19 POST /wiz/sensors/takeover (session B) -> 200", - "16:08:19 POST /wiz/sensors/abort (session B, owner) -> 200", - "16:08:21 takeover: waiting for forgectrl to be settled", - "16:08:21 baseline: /mode controller=running motion=verified", - "16:08:21 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", - "16:08:21 takeover: stopping the controller through forgectrl", - "16:08:21 takeover: POST /controller/stop -> 200", - "16:08:21 takeover: forgectrl stop -> rc 0", - "16:08:22 takeover: pulse device free", - "16:08:22 takeover: forgectrl start -> rc 0", - "16:08:24 baseline: /mode controller=stopped motion=unverified", - "16:08:29 baseline: /mode controller=running motion=verified", - "16:08:29 restored under a restart: users", - "16:08:29 A owned the run, B mirrored, B took over and stopped it; the account is back", - "16:08:30 baseline: post: clean", - "16:08:30 result PASS" + "20:06:30 start commission.mirror (auto, takeover) in campaign c-20260909200054-7947", + "20:06:30 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:06:30 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:06:30 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:06:30 baseline: pre: clean", + "20:06:30 takeover: waiting for forgectrl to be settled", + "20:06:30 baseline: /mode controller=running motion=verified", + "20:06:30 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:06:30 takeover: stopping the controller through forgectrl", + "20:06:30 takeover: POST /controller/stop -> 200", + "20:06:30 takeover: forgectrl stop -> rc 0", + "20:06:31 takeover: pulse device free", + "20:06:31 takeover: forgectrl start -> rc 0", + "20:06:33 baseline: /mode controller=stopped motion=unverified", + "20:06:38 baseline: /mode controller=running motion=verified", + "20:06:38 installed under a restart: users=removed", + "20:06:39 POST /wiz/sensors/start (session A) -> 200", + "20:06:39 POST /wiz/sensors/abort (session B) -> 409 {'error': 'another browser is running this step; take it over to answer'}", + "20:06:39 POST /wiz/sensors/takeover (session B) -> 200", + "20:06:39 POST /wiz/sensors/abort (session B, owner) -> 200", + "20:06:40 takeover: waiting for forgectrl to be settled", + "20:06:40 baseline: /mode controller=running motion=verified", + "20:06:40 takeover: preserving cnc/motor_lock=0, cnc/step_freq=28160, cnc/ramp_rate=125000, cnc/streaming=0, cnc/x_mode=8, cnc/y_mode=8, cnc/x_decay=1, cnc/y_decay=1, pic/x_step_current=33, pic/y_step_current=5", + "20:06:40 takeover: stopping the controller through forgectrl", + "20:06:40 takeover: POST /controller/stop -> 200", + "20:06:40 takeover: forgectrl stop -> rc 0", + "20:06:41 takeover: pulse device free", + "20:06:42 takeover: forgectrl start -> rc 0", + "20:06:44 baseline: /mode controller=stopped motion=unverified", + "20:06:49 baseline: /mode controller=running motion=verified", + "20:06:49 restored under a restart: users", + "20:06:49 A owned the run, B mirrored, B took over and stopped it; the account is back", + "20:06:49 baseline: post: clean", + "20:06:49 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.mirror", - "ts": "2026-09-09T16:08:30Z" + "ts": "2026-09-09T20:06:49Z" }, "requires": [ "forgectrl.auth", @@ -6358,14 +6342,14 @@ "src/status.c" ] ], - "fingerprint": "0677d79747fd250ac08fba854187d09a45272eca46f59661a08c72145a8bb805", + "fingerprint": "451d31fbd60be7e46ca46e6670ffaadecd812b0245a58c08bfbdeb49a902fd22", "hardware": "api", "id": "commission.check-switches", - "inherited": false, + "inherited": true, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 5, "evidence": { "actions": [ @@ -6374,21 +6358,21 @@ "channel": "lid", "state": "open", "took_s": 0.26, - "ts": "2026-09-09T16:08:31Z" + "ts": "2026-09-09T20:06:50Z" }, { "by": "fixture", "channel": "lid", "state": "close", "took_s": 0.26, - "ts": "2026-09-09T16:08:32Z" + "ts": "2026-09-09T20:06:52Z" }, { "by": "fixture", "channel": "button", "state": "press", "took_s": 0.26, - "ts": "2026-09-09T16:08:34Z" + "ts": "2026-09-09T20:06:53Z" } ], "baseline": { @@ -6397,7 +6381,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "elapsed_s": 4.9, "error": "", @@ -6414,7 +6398,7 @@ "log": [ "00:00 switches at start: 0x0b", "00:01 lid-open: seen", - "00:02 lid-close: seen", + "00:03 lid-close: seen", "00:03 HV enable readback: closed 0, open 0, closed 0 (did not follow the lid)", "00:04 button-press: seen", "00:04 button-release: seen", @@ -6434,37 +6418,37 @@ }, "started": true }, - "fingerprint": "0677d79747fd250ac08fba854187d09a45272eca46f59661a08c72145a8bb805", - "image": "20260909150456 (dev)", + "fingerprint": "451d31fbd60be7e46ca46e6670ffaadecd812b0245a58c08bfbdeb49a902fd22", + "image": "20260909193551 (dev)", "log": [ - "16:08:30 start commission.check-switches (operator, api) in campaign c-20260909160235-7649", - "16:08:30 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:08:30 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:08:30 fixture: running unattended (no prompt can be answered)", - "16:08:30 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:08:30 baseline: pre: clean", - "16:08:30 POST /wiz/switches/start -> 200 {'started': True, 'id': 'switches'}", - "16:08:31 switches: Open the lid.", - "16:08:31 prompt lid-open (wait): Open the lid.", - "16:08:31 ACT lid open (fixture)", - "16:08:31 ACT lid open: done after 0.3 s", - "16:08:32 switches: Close the lid.", - "16:08:32 prompt lid-close (wait): Close the lid.", - "16:08:32 ACT lid close (fixture)", - "16:08:33 ACT lid close: done after 0.3 s", - "16:08:34 switches: Press the button once.", - "16:08:34 prompt button-press (wait): Press the button once.", - "16:08:34 ACT button press (fixture)", - "16:08:34 ACT button press: done after 0.3 s", - "16:08:35 switches: {\"lid\": true, \"hv_enable_follows_lid\": false, \"button\": true, \"interlock\": \"satisfied\", \"head_present\": true}", - "16:08:35 baseline: post: clean", - "16:08:35 result PASS" + "20:06:49 start commission.check-switches (operator, api) in campaign c-20260909200054-7947", + "20:06:49 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:06:49 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:06:49 fixture: running unattended (no prompt can be answered)", + "20:06:49 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:06:49 baseline: pre: clean", + "20:06:49 POST /wiz/switches/start -> 200 {'started': True, 'id': 'switches'}", + "20:06:50 switches: Open the lid.", + "20:06:50 prompt lid-open (wait): Open the lid.", + "20:06:50 ACT lid open (fixture)", + "20:06:51 ACT lid open: done after 0.3 s", + "20:06:52 switches: Close the lid.", + "20:06:52 prompt lid-close (wait): Close the lid.", + "20:06:52 ACT lid close (fixture)", + "20:06:52 ACT lid close: done after 0.3 s", + "20:06:53 switches: Press the button once.", + "20:06:53 prompt button-press (wait): Press the button once.", + "20:06:53 ACT button press (fixture)", + "20:06:53 ACT button press: done after 0.3 s", + "20:06:54 switches: {\"lid\": true, \"hv_enable_follows_lid\": false, \"button\": true, \"interlock\": \"satisfied\", \"head_present\": true}", + "20:06:54 baseline: post: clean", + "20:06:54 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.check-switches", - "ts": "2026-09-09T16:08:35Z" + "ts": "2026-09-09T20:06:54Z" }, "requires": [ "forgectrl.auth" @@ -6514,14 +6498,14 @@ "src/cool.c" ] ], - "fingerprint": "56d02f1af0ec708a10a4f2f06d63fdf0f86cba48bd7396d88585d18e76bc3e1a", + "fingerprint": "89fe90f68c162f738f3c3a3477922e808e843ff457609f74a0c9a5a06b75c4c4", "hardware": "api", "id": "commission.check-sensors", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 12, "evidence": { "baseline": { @@ -6530,7 +6514,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "elapsed_s": 12.1, "error": "", @@ -6545,7 +6529,7 @@ "released": [] }, "log": [ - "00:10 coolant 26.5/26.5 C, chassis 30.4, SoC 50.8, IR max 57/58/61/62, pgood 255, HV 0" + "00:10 coolant 26.0/26.0 C, chassis 29.8, SoC 49.7, IR max 57/57/60/62, pgood 255, HV 0" ], "phases": [ "sampling the sensors at rest for 10 s" @@ -6553,48 +6537,48 @@ "result": { "accel_events": 0, "accel_watched": true, - "chassis_c": 30.4, - "coolant_down_c": 26.5, - "coolant_up_c": 26.5, + "chassis_c": 29.8, + "coolant_down_c": 26.0, + "coolant_up_c": 26.0, "exhaust_rpm_idle": 0.0, "hv_current_max": 0, - "intake_rpm_idle": 732.0, + "intake_rpm_idle": 731.0, "laser_pgood": 1, "lid_ir_max": [ 57, - 58, - 61, + 57, + 60, 62 ], - "purge_current": 633, - "soc_c": 50.8 + "purge_current": 632, + "soc_c": 49.7 }, "settings_before": { "cool_temp_offset_c": "" }, "started": true }, - "fingerprint": "56d02f1af0ec708a10a4f2f06d63fdf0f86cba48bd7396d88585d18e76bc3e1a", - "image": "20260909150456 (dev)", + "fingerprint": "89fe90f68c162f738f3c3a3477922e808e843ff457609f74a0c9a5a06b75c4c4", + "image": "20260909193551 (dev)", "log": [ - "16:07:57 start commission.check-sensors (auto, api) in campaign c-20260909160235-7649", - "16:07:57 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:07:57 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:07:57 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:07:57 baseline: pre: clean", - "16:07:57 POST /wiz/sensors/start -> 200 {'started': True, 'id': 'sensors'}", - "16:07:58 sensors: sampling the sensors at rest for 10 s", - "16:08:08 prompt room-temp (number): Optional: if you have a thermometer, enter the room temperature in C and the coolant readings get a per-machine offset. Otherwise skip.", - "16:08:09 sensors: coolant 26.5/26.5 C, IR [57, 58, 61, 62], HV 0", - "16:08:09 restore cool_temp_offset_c='' -> 200", - "16:08:10 baseline: post: clean", - "16:08:10 result PASS" + "20:06:17 start commission.check-sensors (auto, api) in campaign c-20260909200054-7947", + "20:06:17 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:06:17 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:06:17 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:06:17 baseline: pre: clean", + "20:06:17 POST /wiz/sensors/start -> 200 {'started': True, 'id': 'sensors'}", + "20:06:18 sensors: sampling the sensors at rest for 10 s", + "20:06:28 prompt room-temp (number): Optional: if you have a thermometer, enter the room temperature in C and the coolant readings get a per-machine offset. Otherwise skip.", + "20:06:29 sensors: coolant 26.0/26.0 C, IR [57, 57, 60, 62], HV 0", + "20:06:29 restore cool_temp_offset_c='' -> 200", + "20:06:29 baseline: post: clean", + "20:06:29 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.check-sensors", - "ts": "2026-09-09T16:08:10Z" + "ts": "2026-09-09T20:06:29Z" }, "requires": [ "forgectrl.auth" @@ -6648,32 +6632,25 @@ "src/super.c" ] ], - "fingerprint": "19df182f93a0eff09b9d2f3b7bbb117952137d57790ac8169d5e9cee0881394a", + "fingerprint": "1d4f8ba041886f84ce09dacddda947230a6f37e5fb172a180c0a7f889c8f70ba", "hardware": "takeover", "id": "commission.check-airflow", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 39, "evidence": { "baseline": { - "post": [ - { - "action": "waited", - "expected": "idle/unarmed/no hold", - "found": "diag/armed=False/hold=True", - "item": "cool" - } - ], + "post": [], "pre": [] }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, - "elapsed_s": 38.3, + "elapsed_s": 39.2, "error": "", "fixture": { "channels": [ @@ -6687,12 +6664,12 @@ }, "log": [ "00:00 fans to run duty, purge on", - "00:38 exhaust: 11646 rpm steady, 90 percent at 4.5 s", - "00:38 intake 1: 4182 rpm steady, 90 percent at 0.6 s", - "00:38 intake 2: 4172 rpm steady, 90 percent at 0.6 s", - "00:38 air assist: 2005 rpm steady, 90 percent at 0.0 s", - "00:38 purge current 632 on, 0 off", - "00:38 floors: exhaust 6405, intake 2294, air assist 5500, purge 348; grace 10 s" + "00:38 exhaust: 11644 rpm steady, 90 percent at 4.5 s", + "00:38 intake 1: 4167 rpm steady, 90 percent at 0.6 s", + "00:38 intake 2: 4181 rpm steady, 90 percent at 0.6 s", + "00:38 air assist: 2154 rpm steady, 90 percent at 0.0 s", + "00:38 purge current 632 on, 1 off", + "00:38 floors: exhaust 6404, intake 2292, air assist 5500, purge 348; grace 10 s" ], "phases": [ "stopping the motion controller", @@ -6704,32 +6681,32 @@ "air assist": { "ok": true, "spinup_s": 0.0, - "steady_rpm": 2005.0 + "steady_rpm": 2154.0 }, "exhaust": { "ok": true, "spinup_s": 4.5, - "steady_rpm": 11646.0 + "steady_rpm": 11644.0 }, "intake 1": { "ok": true, "spinup_s": 0.6, - "steady_rpm": 4182.0 + "steady_rpm": 4167.0 }, "intake 2": { "ok": true, "spinup_s": 0.6, - "steady_rpm": 4172.0 + "steady_rpm": 4181.0 } }, "floors": { "cool_fan_grace_s": "10", "cool_purge_min_current": "348", "cool_tach_air_assist_min_rpm": "5500", - "cool_tach_exhaust_min_rpm": "6405", - "cool_tach_intake_min_rpm": "2294" + "cool_tach_exhaust_min_rpm": "6404", + "cool_tach_intake_min_rpm": "2292" }, - "purge_current_off": 0.0, + "purge_current_off": 1.0, "purge_current_on": 632.0 }, "settings_before": { @@ -6741,37 +6718,37 @@ }, "started": true }, - "fingerprint": "19df182f93a0eff09b9d2f3b7bbb117952137d57790ac8169d5e9cee0881394a", - "image": "20260909150456 (dev)", + "fingerprint": "1d4f8ba041886f84ce09dacddda947230a6f37e5fb172a180c0a7f889c8f70ba", + "image": "20260909193551 (dev)", "log": [ - "16:09:27 start commission.check-airflow (auto, takeover) in campaign c-20260909160235-7649", - "16:09:27 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:09:27 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:09:27 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:09:27 baseline: pre: clean", - "16:09:28 POST /wiz/airflow/start -> 200 {'started': True, 'id': 'airflow'}", - "16:09:28 airflow: stopping the motion controller", - "16:09:29 airflow: fans to the run profile for 35 s", - "16:09:58 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:10:03 airflow: purge off, reading the off current", - "16:10:06 exhaust: 11646.0 rpm steady, 90 percent at 4.5 s", - "16:10:06 intake 1: 4182.0 rpm steady, 90 percent at 0.6 s", - "16:10:06 intake 2: 4172.0 rpm steady, 90 percent at 0.6 s", - "16:10:06 air assist: 2005.0 rpm steady, 90 percent at 0.0 s", - "16:10:06 floors: {\"cool_tach_exhaust_min_rpm\": \"6405\", \"cool_tach_intake_min_rpm\": \"2294\", \"cool_tach_air_assist_min_rpm\": \"5500\", \"cool_purge_min_current\": \"348\", \"cool_fan_grace_s\": \"10\"}", - "16:10:06 restore cool_tach_exhaust_min_rpm='' -> 200", - "16:10:06 restore cool_tach_intake_min_rpm='' -> 200", - "16:10:06 restore cool_tach_air_assist_min_rpm='' -> 200", - "16:10:06 restore cool_purge_min_current='' -> 200", - "16:10:06 restore cool_fan_grace_s='' -> 200", - "16:10:07 baseline: post: 1 leftover(s): cool=diag/armed=False/hold=True (expected idle/unarmed/no hold) -> waited", - "16:10:07 result PASS" + "20:07:48 start commission.check-airflow (auto, takeover) in campaign c-20260909200054-7947", + "20:07:49 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:07:49 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:07:49 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:07:49 baseline: pre: clean", + "20:07:49 POST /wiz/airflow/start -> 200 {'started': True, 'id': 'airflow'}", + "20:07:49 airflow: stopping the motion controller", + "20:07:50 airflow: fans to the run profile for 35 s", + "20:08:19 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:08:25 airflow: purge off, reading the off current", + "20:08:28 exhaust: 11644.0 rpm steady, 90 percent at 4.5 s", + "20:08:28 intake 1: 4167.0 rpm steady, 90 percent at 0.6 s", + "20:08:28 intake 2: 4181.0 rpm steady, 90 percent at 0.6 s", + "20:08:28 air assist: 2154.0 rpm steady, 90 percent at 0.0 s", + "20:08:28 floors: {\"cool_tach_exhaust_min_rpm\": \"6404\", \"cool_tach_intake_min_rpm\": \"2292\", \"cool_tach_air_assist_min_rpm\": \"5500\", \"cool_purge_min_current\": \"348\", \"cool_fan_grace_s\": \"10\"}", + "20:08:28 restore cool_tach_exhaust_min_rpm='' -> 200", + "20:08:28 restore cool_tach_intake_min_rpm='' -> 200", + "20:08:28 restore cool_tach_air_assist_min_rpm='' -> 200", + "20:08:28 restore cool_purge_min_current='' -> 200", + "20:08:28 restore cool_fan_grace_s='' -> 200", + "20:08:28 baseline: post: clean", + "20:08:28 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.check-airflow", - "ts": "2026-09-09T16:10:07Z" + "ts": "2026-09-09T20:08:28Z" }, "requires": [ "forgectrl.auth", @@ -6814,14 +6791,14 @@ "src/cam.c" ] ], - "fingerprint": "38471924cfa99dcbe15accb815bd6677459f68fe2167e1a5b9b91ece9662c920", + "fingerprint": "89e9414be19697c16468b7db3608f0b46f2a650fdf4ed0331060860f3a8695a9", "hardware": "api", "id": "commission.check-cameras", - "inherited": false, + "inherited": true, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 14, "evidence": { "actions": [ @@ -6830,7 +6807,7 @@ "channel": "lid", "state": "close", "took_s": 0.04, - "ts": "2026-09-09T16:10:23Z" + "ts": "2026-09-09T20:08:44Z" } ], "baseline": { @@ -6839,7 +6816,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "elapsed_s": 5.1, "error": "", @@ -6854,8 +6831,8 @@ "released": [] }, "log": [ - "00:02 lid snapshot: 107576 bytes", - "00:04 head snapshot: 56378 bytes" + "00:02 lid snapshot: 110608 bytes", + "00:04 head snapshot: 55641 bytes" ], "phases": [ "a lid camera snapshot", @@ -6869,43 +6846,43 @@ }, "shots": { "head": { - "bytes": 56378, + "bytes": 55641, "jpeg": true, "status": 200 }, "lid": { - "bytes": 107576, + "bytes": 110608, "jpeg": true, "status": 200 } }, "started": true }, - "fingerprint": "38471924cfa99dcbe15accb815bd6677459f68fe2167e1a5b9b91ece9662c920", - "image": "20260909150456 (dev)", + "fingerprint": "89e9414be19697c16468b7db3608f0b46f2a650fdf4ed0331060860f3a8695a9", + "image": "20260909193551 (dev)", "log": [ - "16:10:23 start commission.check-cameras (operator, api) in campaign c-20260909160235-7649", - "16:10:23 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:10:23 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:10:23 fixture: running unattended (no prompt can be answered)", - "16:10:23 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:10:23 baseline: pre: clean", - "16:10:23 ACT lid close (fixture)", - "16:10:23 ACT lid close: done after 0.0 s", - "16:10:23 POST /wiz/cameras/start -> 200 {'started': True, 'id': 'cameras'}", - "16:10:24 cameras: a lid camera snapshot", - "16:10:25 prompt lid-view (confirm): This is the lid camera. Can you see the bed?", - "16:10:26 cameras: a head camera snapshot", - "16:10:27 prompt head-view (confirm): This is the head camera. Can you see the bed under the lens?", - "16:10:28 cameras: OV5648, lid 107576 bytes, head 56378 bytes", - "16:10:38 baseline: post: clean", - "16:10:38 result PASS" + "20:08:44 start commission.check-cameras (operator, api) in campaign c-20260909200054-7947", + "20:08:44 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:08:44 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:08:44 fixture: running unattended (no prompt can be answered)", + "20:08:44 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:08:44 baseline: pre: clean", + "20:08:44 ACT lid close (fixture)", + "20:08:44 ACT lid close: done after 0.0 s", + "20:08:44 POST /wiz/cameras/start -> 200 {'started': True, 'id': 'cameras'}", + "20:08:45 cameras: a lid camera snapshot", + "20:08:46 prompt lid-view (confirm): This is the lid camera. Can you see the bed?", + "20:08:47 cameras: a head camera snapshot", + "20:08:48 prompt head-view (confirm): This is the head camera. Can you see the bed under the lens?", + "20:08:50 cameras: OV5648, lid 110608 bytes, head 55641 bytes", + "20:08:59 baseline: post: clean", + "20:08:59 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.check-cameras", - "ts": "2026-09-09T16:10:38Z" + "ts": "2026-09-09T20:08:59Z" }, "requires": [ "forgectrl.auth", @@ -6964,14 +6941,14 @@ "src/cool.c" ] ], - "fingerprint": "08663d01e34028b261c95081f572329e923f01b3e2b5de235eb7a490e04b41db", + "fingerprint": "67c36a9fb533a9d146ab35b5d7c0d693b80c1688641ac10e406774fd415b583e", "hardware": "takeover", "id": "commission.check-motion", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 25, "evidence": { "baseline": { @@ -6980,7 +6957,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "elapsed_s": 25.2, "error": "", @@ -6995,21 +6972,21 @@ "released": [] }, "log": [ - "00:06 liveness probe: head accel p2p x=3389 y=2757 (moving>=800 dead<=250)", + "00:06 liveness probe: head accel p2p x=1813 y=2143 (moving>=800 dead<=250)", "00:08 lens reference pass 1: 0", "00:09 lens reference pass 2: 0", "00:10 lens reference pass 3: 0", "00:11 lens reference pass 4: 0", "00:12 lens reference pass 5: 0", - "00:19 at rest: accelerometer low-passed p2p x 217 y 140 (rms 153 113) over 183 samples", - "00:20 +X: accelerometer low-passed p2p x 1789 y 695 (rms 804 406, raw p2p 4275 3089, 208 sampl", - "00:22 -X: accelerometer low-passed p2p x 1888 y 825 (rms 907 351, raw p2p 6349 1971, 210 sampl", - "00:23 +Y: accelerometer low-passed p2p x 325 y 1651 (rms 251 428, raw p2p 2593 2957, 211 sampl", - "00:24 -Y: accelerometer low-passed p2p x 339 y 1283 (rms 205 390, raw p2p 1253 2685, 214 sampl" + "00:19 at rest: accelerometer low-passed p2p x 244 y 158 (rms 143 86) over 183 samples", + "00:20 +X: accelerometer low-passed p2p x 2238 y 861 (rms 899 326, raw p2p 7966 2360, 212 sampl", + "00:22 -X: accelerometer low-passed p2p x 2083 y 735 (rms 876 359, raw p2p 4619 2819, 205 sampl", + "00:23 +Y: accelerometer low-passed p2p x 433 y 1502 (rms 227 378, raw p2p 1852 2578, 214 sampl", + "00:24 -Y: accelerometer low-passed p2p x 536 y 1157 (rms 232 369, raw p2p 1491 3187, 214 sampl" ], "phases": [ + "stopping the motion controller", "rail up, the liveness probe", - "the lens hall reference", "the lens finds its reference on the hall sensor: pass 1 of 5", "the lens finds its reference on the hall sensor: pass 2 of 5", "the lens finds its reference on the hall sensor: pass 3 of 5", @@ -7025,58 +7002,58 @@ "moves": { "+X": { "crash_event": false, - "p2p_lp_x": 1789, - "p2p_lp_y": 695, - "p2p_x": 4275, - "p2p_y": 3089, - "rms_x": 804.0, - "rms_y": 406.0, - "samples": 208, + "p2p_lp_x": 2238, + "p2p_lp_y": 861, + "p2p_x": 7966, + "p2p_y": 2360, + "rms_x": 899.0, + "rms_y": 326.0, + "samples": 212, "witnessed": true }, "+Y": { "crash_event": false, - "p2p_lp_x": 325, - "p2p_lp_y": 1651, - "p2p_x": 2593, - "p2p_y": 2957, - "rms_x": 251.0, - "rms_y": 428.0, - "samples": 211, + "p2p_lp_x": 433, + "p2p_lp_y": 1502, + "p2p_x": 1852, + "p2p_y": 2578, + "rms_x": 227.0, + "rms_y": 378.0, + "samples": 214, "witnessed": true }, "-X": { "crash_event": false, - "p2p_lp_x": 1888, - "p2p_lp_y": 825, - "p2p_x": 6349, - "p2p_y": 1971, - "rms_x": 907.0, - "rms_y": 351.0, - "samples": 210, + "p2p_lp_x": 2083, + "p2p_lp_y": 735, + "p2p_x": 4619, + "p2p_y": 2819, + "rms_x": 876.0, + "rms_y": 359.0, + "samples": 205, "witnessed": true }, "-Y": { "crash_event": false, - "p2p_lp_x": 339, - "p2p_lp_y": 1283, - "p2p_x": 1253, - "p2p_y": 2685, - "rms_x": 205.0, - "rms_y": 390.0, + "p2p_lp_x": 536, + "p2p_lp_y": 1157, + "p2p_x": 1491, + "p2p_y": 3187, + "rms_x": 232.0, + "rms_y": 369.0, "samples": 214, "witnessed": true } }, - "probe": "head accel p2p x=3389 y=2757 (moving>=800 dead<=250)", + "probe": "head accel p2p x=1813 y=2143 (moving>=800 dead<=250)", "rail": "up", "rest": { - "p2p_lp_x": 217, - "p2p_lp_y": 140, - "p2p_x": 876, - "p2p_y": 722, - "rms_x": 153.0, - "rms_y": 113.0, + "p2p_lp_x": 244, + "p2p_lp_y": 158, + "p2p_x": 1007, + "p2p_y": 714, + "rms_x": 143.0, + "rms_y": 86.0, "samples": 183 }, "z_passes": [ @@ -7090,39 +7067,38 @@ }, "started": true }, - "fingerprint": "08663d01e34028b261c95081f572329e923f01b3e2b5de235eb7a490e04b41db", - "image": "20260909150456 (dev)", + "fingerprint": "67c36a9fb533a9d146ab35b5d7c0d693b80c1688641ac10e406774fd415b583e", + "image": "20260909193551 (dev)", "log": [ - "16:10:54 start commission.check-motion (auto, takeover) in campaign c-20260909160235-7649", - "16:10:54 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:10:54 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:10:54 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:10:54 baseline: pre: clean", - "16:10:54 NOTICE: The head moves 50 mm each way on X and on Y. Keep the bed clear.", - "16:10:54 POST /wiz/motion/start -> 200 {'started': True, 'id': 'motion'}", - "16:10:54 motion: stopping the motion controller", - "16:10:55 motion: rail up, the liveness probe", - "16:11:01 motion: the lens hall reference", - "16:11:02 motion: the lens finds its reference on the hall sensor: pass 1 of 5", - "16:11:03 motion: the lens finds its reference on the hall sensor: pass 2 of 5", - "16:11:04 motion: the lens finds its reference on the hall sensor: pass 3 of 5", - "16:11:05 motion: the lens finds its reference on the hall sensor: pass 4 of 5", - "16:11:06 motion: the lens finds its reference on the hall sensor: pass 5 of 5", - "16:11:07 motion: starting the controller in loopback posture", - "16:11:12 prompt jogs (continue): The head moves 50 mm each way on X, then on Y, at 3000 mm/min. Keep the bed clear and the lid closed.", - "16:11:13 motion: jog +X", - "16:11:15 motion: jog -X", - "16:11:16 motion: jog +Y", - "16:11:17 motion: jog -Y", - "16:11:19 motion: probe 'head accel p2p x=3389 y=2757 (moving>=800 dead<=250)', passes [0, 0, 0, 0, 0], rest {'samples': 183, 'p2p_lp_x': 217, 'p2p_lp_y': 140, 'p2p_x': 876, 'p2p_y': 722, 'rms_x': 153.0, 'rms_y': 113.0}, moves {'+X': (1789, 695), '-X': (1888, 825), '+Y': (325, 1651), '-Y': (339, 1283)}", - "16:11:19 baseline: post: clean", - "16:11:19 result PASS" + "20:09:15 start commission.check-motion (auto, takeover) in campaign c-20260909200054-7947", + "20:09:15 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:09:15 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:09:15 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:09:15 baseline: pre: clean", + "20:09:15 NOTICE: The head moves 50 mm each way on X and on Y. Keep the bed clear.", + "20:09:15 POST /wiz/motion/start -> 200 {'started': True, 'id': 'motion'}", + "20:09:15 motion: stopping the motion controller", + "20:09:16 motion: rail up, the liveness probe", + "20:09:22 motion: the lens finds its reference on the hall sensor: pass 1 of 5", + "20:09:23 motion: the lens finds its reference on the hall sensor: pass 2 of 5", + "20:09:24 motion: the lens finds its reference on the hall sensor: pass 3 of 5", + "20:09:26 motion: the lens finds its reference on the hall sensor: pass 4 of 5", + "20:09:27 motion: the lens finds its reference on the hall sensor: pass 5 of 5", + "20:09:28 motion: starting the controller in loopback posture", + "20:09:33 prompt jogs (continue): The head moves 50 mm each way on X, then on Y, at 3000 mm/min. Keep the bed clear and the lid closed.", + "20:09:34 motion: jog +X", + "20:09:36 motion: jog -X", + "20:09:37 motion: jog +Y", + "20:09:38 motion: jog -Y", + "20:09:40 motion: probe 'head accel p2p x=1813 y=2143 (moving>=800 dead<=250)', passes [0, 0, 0, 0, 0], rest {'samples': 183, 'p2p_lp_x': 244, 'p2p_lp_y': 158, 'p2p_x': 1007, 'p2p_y': 714, 'rms_x': 143.0, 'rms_y': 86.0}, moves {'+X': (2238, 861), '-X': (2083, 735), '+Y': (433, 1502), '-Y': (536, 1157)}", + "20:09:40 baseline: post: clean", + "20:09:40 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.check-motion", - "ts": "2026-09-09T16:11:19Z" + "ts": "2026-09-09T20:09:40Z" }, "requires": [ "forgectrl.auth", @@ -7165,15 +7141,15 @@ "src/diag.c" ] ], - "fingerprint": "d9d3afad5174d559904d1b4a84f866bb613b82664218945d11eac961361cb242", + "fingerprint": "dc209e70c452841824da51d1511b8257b73dc5db9eccb373aa95e79cdc9da606", "hardware": "takeover", "id": "commission.check-flow-verify", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 184, + "campaign": "c-20260909200054-7947", + "duration_s": 186, "evidence": { "baseline": { "post": [], @@ -7181,9 +7157,9 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, - "elapsed_s": 183.9, + "elapsed_s": 186.0, "error": "", "fixture": { "channels": [ @@ -7204,47 +7180,47 @@ "trial 1/1: heater 40% for 50 s (pump off)" ], "result": { - "flow_dt": 10.9, - "flow_rise": 11.3, - "margin_flow": 3.1, - "margin_noflow": 3.0, - "noflow_dt": 12.0, - "noflow_rise": 17.4, + "flow_dt": 9.8, + "flow_rise": 11.2, + "margin_flow": 3.2, + "margin_noflow": 4.3, + "noflow_dt": 13.0, + "noflow_rise": 18.7, "pass": true, "thin_margin": false, "threshold": 14.4 }, "started": true }, - "fingerprint": "d9d3afad5174d559904d1b4a84f866bb613b82664218945d11eac961361cb242", - "image": "20260909150456 (dev)", + "fingerprint": "dc209e70c452841824da51d1511b8257b73dc5db9eccb373aa95e79cdc9da606", + "image": "20260909193551 (dev)", "log": [ - "16:15:33 start commission.check-flow-verify (auto, takeover) in campaign c-20260909160235-7649", - "16:15:33 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:15:33 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:15:33 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:15:33 baseline: pre: clean", - "16:15:33 POST /wiz/cooling.flow-verify/start -> 200 {'started': True, 'id': 'cooling.flow-verify'}", - "16:15:33 cooling.flow-verify: the flow check: settling the loop", - "16:15:34 cooling.flow-verify: settling before trial 1/1 (pump on)", - "16:16:04 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:16:16 cooling.flow-verify: trial 1/1: heater 40% for 50 s (pump on)", - "16:16:34 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:17:04 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:17:09 cooling.flow-verify: settling before trial 1/1 (pump off)", - "16:17:34 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:17:44 cooling.flow-verify: trial 1/1: heater 40% for 50 s (pump off)", - "16:18:05 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:18:35 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:18:37 flow check: threshold 14.4, flow 11.3, no-flow 17.4, thin False", - "16:18:38 baseline: post: clean", - "16:18:38 result PASS" + "20:13:58 start commission.check-flow-verify (auto, takeover) in campaign c-20260909200054-7947", + "20:13:58 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:13:58 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:13:58 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:13:58 baseline: pre: clean", + "20:13:58 POST /wiz/cooling.flow-verify/start -> 200 {'started': True, 'id': 'cooling.flow-verify'}", + "20:13:58 cooling.flow-verify: the flow check: settling the loop", + "20:13:59 cooling.flow-verify: settling before trial 1/1 (pump on)", + "20:14:29 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:14:41 cooling.flow-verify: trial 1/1: heater 40% for 50 s (pump on)", + "20:14:59 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:15:29 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:15:34 cooling.flow-verify: settling before trial 1/1 (pump off)", + "20:15:59 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:16:11 cooling.flow-verify: trial 1/1: heater 40% for 50 s (pump off)", + "20:16:30 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:17:00 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:17:04 flow check: threshold 14.4, flow 11.2, no-flow 18.7, thin False", + "20:17:05 baseline: post: clean", + "20:17:05 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.check-flow-verify", - "ts": "2026-09-09T16:18:38Z" + "ts": "2026-09-09T20:17:05Z" }, "requires": [ "forgectrl.auth", @@ -7300,15 +7276,15 @@ "forgefirm-app/ffmachine.py" ] ], - "fingerprint": "f20302b01e15db074e169a33ca16680637e70032f85003be8701cc91e9219d8f", + "fingerprint": "fa5d706a3b257bbb28b47c3a3e0a42119cd1cebdd97678a99adff4df89b25786", "hardware": "takeover", "id": "commission.cloud-header-capture", "inherited": false, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 74, + "campaign": "c-20260909204732-3fa9", + "duration_s": 70, "evidence": { "baseline": { "post": [], @@ -7316,9 +7292,9 @@ }, "batch": { "group": "attended", - "ts": "2026-09-09T16:34:09Z" + "ts": "2026-09-09T21:25:38Z" }, - "elapsed_s": 72.5, + "elapsed_s": 67.5, "error": "", "fixture": { "channels": [ @@ -7373,7 +7349,7 @@ "IFid" ], "log": [ - "01:08 factory envelope captured: 134 tags, 57 calibration-bearing" + "01:02 factory envelope captured: 134 tags, 57 calibration-bearing" ], "mode": { "detail": "grbl mode up", @@ -7448,8 +7424,8 @@ "YSrc": 22, "ZSmd": 0 }, - "captured": "2026-09-09T16:37:50Z", - "job_id": 1583587497, + "captured": "2026-09-09T21:26:43Z", + "job_id": 1583713043, "limits": { "air_assist_min_rpm": 116, "coolant_max_c": 33.0, @@ -7510,38 +7486,38 @@ }, "started": true }, - "fingerprint": "f20302b01e15db074e169a33ca16680637e70032f85003be8701cc91e9219d8f", - "image": "20260909150456 (dev)", + "fingerprint": "fa5d706a3b257bbb28b47c3a3e0a42119cd1cebdd97678a99adff4df89b25786", + "image": "20260909193551 (dev)", "log": [ - "16:36:41 start commission.cloud-header-capture (operator, takeover) in campaign c-20260909160235-7649", - "16:36:41 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:36:41 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:36:41 queued by the attended queue opened 2026-09-09T16:34:09Z", - "16:36:41 baseline: pre: clean", - "16:36:41 baseline: switching to grbl mode (found cloud, controller running)", - "16:36:42 baseline: /mode controller=running motion=verified", - "16:36:42 mode: test needs grbl - grbl mode up", - "16:36:42 NOTICE: Print any small design from the Glowforge app once it shows the machine online. Do not press the machine's button.", - "16:36:42 POST /wiz/cloud.header/start -> 200 {'started': True, 'id': 'cloud.header'}", - "16:36:44 cloud.header: starting the cloud client", - "16:36:48 prompt print (continue): The machine is in cloud mode. In the Glowforge app, place any small design on the bed image and press Print. Do not press the machine's button: the wizard takes the print's header and cancels it.", - "16:36:49 cloud.header: waiting for the print's header from the service", - "16:37:12 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:37:43 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:37:50 cloud.header: the cloud client cancels the print", - "16:37:53 cloud.header: back to GRBL mode", - "16:37:55 header: 134 tags, 57 kept; job 1583587497", - "16:37:55 restore cloud_enabled='1' -> 200", - "16:37:55 restore homing_mode='gfcloud' -> 200", - "16:37:55 restore controller_mode='grbl' -> 200", - "16:37:55 baseline: post: clean", - "16:37:55 result PASS" + "21:25:38 start commission.cloud-header-capture (operator, takeover) in campaign c-20260909204732-3fa9", + "21:25:39 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:25:39 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "21:25:39 queued by the attended queue opened 2026-09-09T21:25:38Z", + "21:25:39 baseline: pre: clean", + "21:25:39 baseline: switching to grbl mode (found cloud, controller running)", + "21:25:41 baseline: /mode controller=running motion=verified", + "21:25:41 mode: test needs grbl - grbl mode up", + "21:25:41 NOTICE: Print any small design from the Glowforge app once it shows the machine online. Do not press the machine's button.", + "21:25:41 POST /wiz/cloud.header/start -> 200 {'started': True, 'id': 'cloud.header'}", + "21:25:42 cloud.header: starting the cloud client", + "21:25:46 prompt print (continue): The machine is in cloud mode. In the Glowforge app, place any small design on the bed image and press Print. Do not press the machine's button: the wizard takes the print's header and cancels it.", + "21:25:47 cloud.header: waiting for the print's header from the service", + "21:26:09 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:26:41 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:26:44 cloud.header: the cloud client cancels the print", + "21:26:47 cloud.header: back to GRBL mode", + "21:26:48 header: 134 tags, 57 kept; job 1583713043", + "21:26:48 restore cloud_enabled='1' -> 200", + "21:26:48 restore homing_mode='gfcloud' -> 200", + "21:26:48 restore controller_mode='grbl' -> 200", + "21:26:48 baseline: post: clean", + "21:26:48 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.cloud-header-capture", - "ts": "2026-09-09T16:37:55Z" + "ts": "2026-09-09T21:26:48Z" }, "requires": [ "forgectrl.auth", @@ -7636,65 +7612,65 @@ "src/glowforge_io.*" ] ], - "fingerprint": "312c91f0ddf577efd01d76ce2ea484f37e75d189d33dfce4b81e0fced990e5de", + "fingerprint": "c7b60440ce671efc7803f83630ac3c88c3d39be3d821ed755cf98cfa0b14e2bd", "hardware": "takeover", "id": "commission.sheet", "inherited": false, "kind": "live", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 875, + "campaign": "c-20260909204732-3fa9", + "duration_s": 830, "evidence": { "actions": [ { "by": "operator", "channel": "button", "state": "presence", - "took_s": 19.66, - "ts": "2026-09-09T16:39:45Z" + "took_s": 12.01, + "ts": "2026-09-09T21:27:45Z" + }, + { + "by": "fixture", + "channel": "button", + "state": "arm", + "took_s": 0.52, + "ts": "2026-09-09T21:28:01Z" }, { "by": "fixture", "channel": "button", "state": "arm", "took_s": 0.26, - "ts": "2026-09-09T16:40:01Z" + "ts": "2026-09-09T21:29:43Z" + }, + { + "by": "fixture", + "channel": "button", + "state": "arm", + "took_s": 0.25, + "ts": "2026-09-09T21:31:17Z" + }, + { + "by": "fixture", + "channel": "button", + "state": "arm", + "took_s": 0.26, + "ts": "2026-09-09T21:33:09Z" + }, + { + "by": "fixture", + "channel": "button", + "state": "arm", + "took_s": 0.25, + "ts": "2026-09-09T21:35:39Z" }, { "by": "fixture", "channel": "button", "state": "arm", "took_s": 0.51, - "ts": "2026-09-09T16:42:00Z" - }, - { - "by": "fixture", - "channel": "button", - "state": "arm", - "took_s": 0.5, - "ts": "2026-09-09T16:43:44Z" - }, - { - "by": "fixture", - "channel": "button", - "state": "arm", - "took_s": 0.26, - "ts": "2026-09-09T16:45:43Z" - }, - { - "by": "fixture", - "channel": "button", - "state": "arm", - "took_s": 0.26, - "ts": "2026-09-09T16:48:19Z" - }, - { - "by": "fixture", - "channel": "button", - "state": "arm", - "took_s": 0.51, - "ts": "2026-09-09T16:49:19Z" + "ts": "2026-09-09T21:36:41Z" } ], "baseline": { @@ -7703,24 +7679,24 @@ }, "batch": { "group": "attended", - "ts": "2026-09-09T16:34:09Z" + "ts": "2026-09-09T21:25:38Z" }, "cards": { "cooling.flow-load": { - "elapsed_s": 281.0, + "elapsed_s": 281.1, "emission": { "hv_max": 1023, - "laser_on_samples": 218, - "lit_s": 90.52465068699985, - "thermopile_delta": 1351 + "laser_on_samples": 221, + "lit_s": 90.52963792199989, + "thermopile_delta": 1149 }, "error": "", "log": [ "00:04 lens reference pass 1: 0", "00:05 lens reference pass 2: 0", - "01:07 the coolant loop is quiet after 60 s (downstream 21.68 C)", - "04:41 streamed 220 lines; tube current peak 1023, LASER_ON samples 218, thermopile +1351", - "04:41 lit 66 s, dose 37481 raw-s, rise 1.82 C at 85 s: k 4.85e-05 C per raw-s" + "01:07 the coolant loop is quiet after 60 s (downstream 22.30 C)", + "04:41 streamed 220 lines; tube current peak 1023, LASER_ON samples 221, thermopile +1149", + "04:41 lit 66 s, dose 36718 raw-s, rise 2.02 C at 95 s: k 5.5e-05 C per raw-s" ], "phases": [ "the tube is dark: the coolant sensors follow the heat, 11 s more", @@ -7739,23 +7715,23 @@ "preview_bytes": 3258, "program_lines": 214, "result": { - "base_c": 22.36411764705883, - "dose_raw_s": 37480.70000000007, + "base_c": 22.6164705882353, + "dose_raw_s": 36718.15999999994, "emission": { "hv_max": 1023, - "laser_on_samples": 218, - "lit_s": 90.52465068699985, - "thermopile_delta": 1351 + "laser_on_samples": 221, + "lit_s": 90.52963792199989, + "thermopile_delta": 1149 }, - "hv_mean": 565.577549788775, - "k_cw": 6.300670807376111e-05, - "k_density": 4.8515165216796054e-05, + "hv_mean": 554.8537764350453, + "k_cw": 7.142965414999814e-05, + "k_density": 5.500083369549857e-05, "lag_s": 80.0, - "lit_s": 66.24000000000001, - "peak_c": 1.8183823529411711, - "summary": "The tube was lit for 66 s and warmed the coolant by 1.82 C, peaking 85 s after the fire began. That is the tube's own share of a flow check's rise on this machine. It is written, and the flow check allows for it from now on.", - "t_peak_s": 85.0, - "up_base_c": 22.419411764705885, + "lit_s": 66.16, + "peak_c": 2.0195294117647045, + "summary": "The tube was lit for 66 s and warmed the coolant by 2.02 C, peaking 95 s after the fire began. That is the tube's own share of a flow check's rise on this machine. It is written, and the flow check allows for it from now on.", + "t_peak_s": 95.0, + "up_base_c": 22.644705882352937, "z_passes": [ 0, 0 @@ -7764,36 +7740,36 @@ "started": true }, "laser.corner": { - "elapsed_s": 60.4, + "elapsed_s": 62.5, "emission": { - "hv_max": 972, - "laser_on_samples": 148, - "lit_s": 31.045071525000367, - "thermopile_delta": 819 + "hv_max": 1023, + "laser_on_samples": 153, + "lit_s": 31.033151726999677, + "thermopile_delta": 1040 }, "error": "", "log": [ "00:03 lens reference pass 1: 0", "00:04 lens reference pass 2: 0", - "00:38 corner gamma 1.00: the next pattern", - "00:42 corner gamma 1.25: the next pattern", - "00:45 corner gamma 1.50: the next pattern", - "00:47 corner gamma 1.75: the next pattern", - "00:50 corner gamma 2.00: the next pattern", - "00:59 streamed 468 lines; tube current peak 972, LASER_ON samples 148, thermopile +819", - "00:59 corner rolloff gamma 1.50" + "00:39 corner gamma 1.00: the next pattern", + "00:44 corner gamma 1.25: the next pattern", + "00:46 corner gamma 1.50: the next pattern", + "00:49 corner gamma 1.75: the next pattern", + "00:52 corner gamma 2.00: the next pattern", + "01:00 streamed 468 lines; tube current peak 1023, LASER_ON samples 153, thermopile +1040", + "01:01 corner rolloff gamma 1.50" ], "phases": [ + "burning: 0 s lit", "burning: 1 s lit", - "burning: 2 s lit", "burning: the tube is between passes", "burning: 1 s lit", "burning: the tube is between passes", "burning: 0 s lit", "burning: 1 s lit", "burning: the tube is between passes", + "burning: 0 s lit", "burning: 1 s lit", - "burning: 2 s lit", "burning: the tube is between passes", "the tube is dark: the pulse engine plays the rest" ], @@ -7801,10 +7777,10 @@ "program_lines": 462, "result": { "emission": { - "hv_max": 972, - "laser_on_samples": 148, - "lit_s": 31.045071525000367, - "thermopile_delta": 819 + "hv_max": 1023, + "laser_on_samples": 153, + "lit_s": 31.033151726999677, + "thermopile_delta": 1040 }, "gamma": 1.5, "summary": "Pattern 1.50 has the most even corners: the corner rolloff is set to 1.50. Under velocity-scaled power the machine eases the power into every corner by that exponent, so corners burn like the straights.", @@ -7816,24 +7792,23 @@ "started": true }, "laser.dose-curve": { - "elapsed_s": 155.3, + "elapsed_s": 149.3, "emission": { "hv_max": 1023, "laser_on_samples": 255, - "lit_s": 110.8990827030002, - "thermopile_delta": 2273 + "lit_s": 110.959464992, + "thermopile_delta": 2260 }, "error": "", "log": [ - "00:04 lens reference pass 1: 0", + "00:03 lens reference pass 1: 0", "00:04 lens reference pass 2: 0", - "00:36 the floor and the dose curve are off from here", - "02:35 streamed 391 lines; tube current peak 1023, LASER_ON samples 255, thermopile +2273", - "02:35 dose curve 10:0.49,20:2.06,30:8.72,45:24.63,60:39.95,80:54.54,100:100.00" + "00:30 the floor and the dose curve are off from here", + "02:28 streamed 391 lines; tube current peak 1023, LASER_ON samples 255, thermopile +2260", + "02:28 dose curve 10:0.68,20:2.83,30:9.09,45:24.02,60:37.13,80:47.17,100:100.00" ], "phases": [ - "the tube is dark: the fit needs the dark tail, 12 s more", - "the tube is dark: the fit needs the dark tail, 10 s more", + "the tube is dark: the fit needs the dark tail, 11 s more", "the tube is dark: the fit needs the dark tail, 9 s more", "the tube is dark: the fit needs the dark tail, 8 s more", "the tube is dark: the fit needs the dark tail, 7 s more", @@ -7843,49 +7818,50 @@ "the tube is dark: the fit needs the dark tail, 3 s more", "the tube is dark: the fit needs the dark tail, 2 s more", "the tube is dark: the fit needs the dark tail, 1 s more", - "the tube is dark: the fit needs the dark tail, 0 s more" + "the tube is dark: the fit needs the dark tail, 0 s more", + "the machine goes back to its normal posture" ], "preview_bytes": 5722, "program_lines": 386, "result": { - "curve": "10:0.49,20:2.06,30:8.72,45:24.63,60:39.95,80:54.54,100:100.00", + "curve": "10:0.68,20:2.83,30:9.09,45:24.02,60:37.13,80:47.17,100:100.00", "emission": { "hv_max": 1023, "laser_on_samples": 255, - "lit_s": 110.8990827030002, - "thermopile_delta": 2273 + "lit_s": 110.959464992, + "thermopile_delta": 2260 }, "points": [ { "density": 10.0, - "light": 0.49057235251401216 + "light": 0.6766890992084529 }, { "density": 20.0, - "light": 2.0614631639416827 + "light": 2.8297303390001796 }, { "density": 30.0, - "light": 8.72107651829892 + "light": 9.09286082209558 }, { "density": 45.0, - "light": 24.625062162849353 + "light": 24.016003898180884 }, { "density": 60.0, - "light": 39.95399812794241 + "light": 37.126334461791224 }, { "density": 80.0, - "light": 54.53909448497147 + "light": 47.17385976777021 }, { "density": 100.0, "light": 100.0 } ], - "summary": "The curve rose rung by rung and is written. It maps the density a job asks for to the light the tube gives: 10 percent density gives 0.5 percent of the light, 45 gives 25, and 100 gives 100. The chart shows the fit.", + "summary": "The curve rose rung by rung and is written. It maps the density a job asks for to the light the tube gives: 10 percent density gives 0.7 percent of the light, 45 gives 24, and 100 gives 100. The chart shows the fit.", "z_passes": [ 0, 0 @@ -7894,33 +7870,33 @@ "started": true }, "laser.floor": { - "elapsed_s": 119.1, + "elapsed_s": 112.1, "emission": { "hv_max": 1023, - "laser_on_samples": 147, - "lit_s": 90.97312882000006, - "thermopile_delta": 787 + "laser_on_samples": 141, + "lit_s": 90.98896351100029, + "thermopile_delta": 862 }, "error": "", "log": [ "00:04 lens reference pass 1: 0", "00:05 lens reference pass 2: 0", - "00:38 the floor and the dose curve are off from here", - "01:57 streamed 421 lines; tube current peak 1023, LASER_ON samples 147, thermopile +787", - "01:58 the faintest continuous rung is 8 percent: the floor is 10" + "00:31 the floor and the dose curve are off from here", + "01:50 streamed 421 lines; tube current peak 1023, LASER_ON samples 141, thermopile +862", + "01:51 the faintest continuous rung is 8 percent: the floor is 10" ], "phases": [ "burning: 2 s lit", "burning: 3 s lit", "burning: 4 s lit", - "burning: 5 s lit", + "burning: the tube is between passes", "burning: 0 s lit", "burning: 1 s lit", "burning: 2 s lit", "burning: 3 s lit", "burning: 4 s lit", - "burning: 5 s lit", "burning: the tube is between passes", + "the tube is dark: the samples run on, 1 s more", "the tube is dark: the pulse engine plays the rest" ], "preview_bytes": 5760, @@ -7928,9 +7904,9 @@ "result": { "emission": { "hv_max": 1023, - "laser_on_samples": 147, - "lit_s": 90.97312882000006, - "thermopile_delta": 787 + "laser_on_samples": 141, + "lit_s": 90.98896351100029, + "thermopile_delta": 862 }, "faintest_density": 8.0, "floor_density": 10.0, @@ -7943,27 +7919,30 @@ "started": true }, "laser.focus": { - "elapsed_s": 103.9, + "elapsed_s": 93.8, "emission": { "hv_max": 1023, - "laser_on_samples": 233, - "lit_s": 47.34520324599998, - "thermopile_delta": 1314 + "laser_on_samples": 234, + "lit_s": 47.36215806200016, + "thermopile_delta": 1489 }, "error": "", "log": [ "00:04 lens reference pass 1: 0", - "00:05 lens reference pass 2: 0", - "00:19 bottom ring 1-15 (x100): 67 194 71 183 91 184 77 176 86 135 79 228 67 180 46", - "00:19 bottom ring 16-16 (x100): 33", - "00:19 the bottom stop: the ring died 16 half-steps below the edge", - "00:26 top ring 1-15 (x100): 57 187 34 150 44 169 27 173 42 201 29 165 32 175 30", - "00:26 top ring 16-22 (x100): 183 29 190 33 252 27 68", - "00:26 the top stop: the ring died 22 half-steps above the edge", - "01:41 streamed 297 lines; tube current peak 1023, LASER_ON samples 233, thermopile +1314", - "01:43 line 11 on 0.125 in: -11 half-steps from the hall edge, so the focus at the edge is 0.27" + "00:04 lens reference pass 2: 0", + "00:18 bottom ring 1-15 (x100): 102 188 62 202 88 153 54 156 67 191 69 175 73 227 45", + "00:18 bottom ring 16-16 (x100): 71", + "00:18 the bottom stop: the ring died 16 half-steps below the edge", + "00:25 top ring 1-15 (x100): 56 201 34 180 49 193 31 176 41 134 37 180 37 195 30", + "00:25 top ring 16-22 (x100): 191 41 218 37 222 33 70", + "00:25 the top stop: the ring died 22 half-steps above the edge", + "01:32 streamed 297 lines; tube current peak 1023, LASER_ON samples 234, thermopile +1489", + "01:33 line 11 on 0.125 in: -11 half-steps from the hall edge, so the focus at the edge is 0.27" ], "phases": [ + "burning: the tube is between passes", + "burning: 1 s lit", + "burning: the tube is between passes", "burning: 0 s lit", "burning: 1 s lit", "burning: the tube is between passes", @@ -7972,9 +7951,6 @@ "burning: 0 s lit", "burning: 1 s lit", "burning: the tube is between passes", - "burning: 1 s lit", - "burning: 2 s lit", - "burning: the tube is between passes", "the tube is dark: the pulse engine plays the rest" ], "preview_bytes": 3966, @@ -7983,9 +7959,9 @@ "edge_z_mm": 6.939544832306639, "emission": { "hv_max": 1023, - "laser_on_samples": 233, - "lit_s": 47.34520324599998, - "thermopile_delta": 1314 + "laser_on_samples": 234, + "lit_s": 47.36215806200016, + "thermopile_delta": 1489 }, "focus_range_mm": { "max": 13.784171800136892, @@ -8017,18 +7993,18 @@ "started": true }, "sheet.frame": { - "elapsed_s": 119.1, + "elapsed_s": 102.0, "emission": { "hv_max": 1023, - "laser_on_samples": 141, - "lit_s": 82.59907572300017, - "thermopile_delta": 928 + "laser_on_samples": 154, + "lit_s": 82.16030385400063, + "thermopile_delta": 919 }, "error": "", "log": [ "00:02 lens reference pass 1: 0", "00:03 lens reference pass 2: 0", - "01:57 streamed 1608 lines; tube current peak 1023, LASER_ON samples 141, thermopile +928" + "01:40 streamed 1617 lines; tube current peak 1023, LASER_ON samples 154, thermopile +919" ], "phases": [ "burning: the tube is between passes", @@ -8044,18 +8020,18 @@ "burning: the tube is between passes", "the tube is dark: the pulse engine plays the rest" ], - "preview_bytes": 23423, - "program_lines": 1602, + "preview_bytes": 23570, + "program_lines": 1611, "result": { "emission": { "hv_max": 1023, - "laser_on_samples": 141, - "lit_s": 82.59907572300017, - "thermopile_delta": 928 + "laser_on_samples": 154, + "lit_s": 82.16030385400063, + "thermopile_delta": 919 }, "mark_feed": 3000, "mark_s": 400, - "started": "2026-09-09 16:40Z", + "started": "2026-09-09 21:28Z", "summary": "The frame and the header are on the sheet. The mark dose is S400 at 3000 mm/min; every card's box and labels burn at it. All three witnesses saw the beam: the tube current, the kernel's LASER_ON samples, and the head thermopile.", "z_passes": [ 0, @@ -8065,17 +8041,18 @@ "started": true }, "sheet.place": { - "elapsed_s": 15.1, + "elapsed_s": 16.1, "error": "", "log": [ "00:02 lens reference pass 1: 0", "00:03 lens reference pass 2: 0", - "00:14 origin at counters 0, 0 (full sheet, 0.125 in)" + "00:15 origin at counters 0, 0 (full sheet, 0.125 in)" ], "phases": [ "stopping the motion controller", + "the lens finds its reference on the hall sensor", "the lens finds its reference on the hall sensor: pass 1 of 2", - "starting the motion controller for the card: 0 s (60 at most)", + "the lens finds its reference on the hall sensor: pass 2 of 2", "the cooling engine takes the controller's report: 0 s (20 at most)", "placing the sheet" ], @@ -8119,7 +8096,7 @@ }, "operator": { "ack_live": true, - "ts": "2026-09-09T16:39:25Z" + "ts": "2026-09-09T21:27:32Z" }, "settings_before": { "cool_laser_heat_cw": "2.784e-05", @@ -8133,788 +8110,735 @@ }, "thickness_answer": "0.125" }, - "fingerprint": "312c91f0ddf577efd01d76ce2ea484f37e75d189d33dfce4b81e0fced990e5de", - "image": "20260909150456 (dev)", + "fingerprint": "c7b60440ce671efc7803f83630ac3c88c3d39be3d821ed755cf98cfa0b14e2bd", + "image": "20260909193551 (dev)", "log": [ - "16:39:25 start commission.sheet (live, takeover) in campaign c-20260909160235-7649", - "16:39:25 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:39:25 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:39:25 queued by the attended queue opened 2026-09-09T16:34:09Z", - "16:39:25 baseline: pre: clean", - "16:39:25 mode: test needs grbl - already in grbl mode", - "16:39:25 NOTICE: The sheet: the placement, then the frame and the five cards burn after a press each. The bench presses when the button lights. Then press the button on the machine to start.", - "16:39:25 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", - "16:39:45 READY: operator present (press after 19.7 s); the bench takes the presses", - "16:39:45 POST /wiz/sheet.place/start -> 200 {'started': True, 'id': 'sheet.place'}", - "16:39:45 sheet.place: stopping the motion controller", - "16:39:46 sheet.place: the lens finds its reference on the hall sensor: pass 1 of 2", - "16:39:48 sheet.place: starting the motion controller for the card: 0 s (60 at most)", - "16:39:49 sheet.place: the cooling engine takes the controller's report: 0 s (20 at most)", - "16:39:55 sheet.place: placing the sheet", - "16:39:55 prompt place (jog): The head should be at the back-left, where the machine normally homes; the arrows move it (lid closed). Then open the lid, push the sheet as far left as it goes with its top edge on the top of the cut area, close the lid, and set the origin.", - "16:39:56 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:39:56 prompt place (jog): The head should be at the back-left, where the machine normally homes; the arrows move it (lid closed). Then open the lid, push the sheet as far left as it goes with its top edge on the top of the cut area, close the lid, and set the origin.", - "16:39:57 prompt place (jog): The head should be at the back-left, where the machine normally homes; the arrows move it (lid closed). Then open the lid, push the sheet as far left as it goes with its top edge on the top of the cut area, close the lid, and set the origin.", - "16:39:58 prompt sheet-kind (choice): Is this the full commissioning sheet (8 x 6 in or more), or a smaller piece for one card?", - "16:39:59 prompt thickness (number): The thickness of the sheet in inches.", - "16:40:01 placed: datum at 0, 0; steps per mm {'x': 53.333, 'y': 53.333, 'z': 2.922}", - "16:40:01 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", - "16:40:01 POST /wiz/sheet.frame/start -> 200 {'started': True, 'id': 'sheet.frame'}", - "16:40:01 sheet.frame: stopping the motion controller", - "16:40:01 ARM press by the fixture, button lit after 0.3 s", - "16:40:02 sheet.frame: the lens finds its reference on the hall sensor", - "16:40:03 sheet.frame: the lens finds its reference on the hall sensor: pass 1 of 2", - "16:40:04 sheet.frame: the lens finds its reference on the hall sensor: pass 2 of 2", - "16:40:05 sheet.frame: the cooling engine takes the controller's report: 0 s (20 at most)", - "16:40:07 prompt frame-arm (continue): The frame and the header burn now: 7.1 x 5.1 in at the mark dose. Eye protection on, exhaust on, lid closed. Continue, then press the machine's button when it lights white; this page says when.", - "16:40:08 sheet.frame: the program goes to the controller, the button lights at the arm", - "16:40:09 sheet.frame: the button is lit: press it now (0 s; the job waits 599 at most)", - "16:40:09 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.", - "16:40:10 sheet.frame: the button is lit: press it now (1 s; the job waits 599 at most)", - "16:40:11 sheet.frame: the button is lit: press it now (2 s; the job waits 599 at most)", - "16:40:12 sheet.frame: the button is lit: press it now (3 s; the job waits 599 at most)", - "16:40:13 sheet.frame: the button is lit: press it now (4 s; the job waits 599 at most)", - "16:40:14 sheet.frame: the button is lit: press it now (5 s; the job waits 599 at most)", - "16:40:15 sheet.frame: the button is lit: press it now (6 s; the job waits 599 at most)", - "16:40:16 sheet.frame: the button is lit: press it now (7 s; the job waits 599 at most)", - "16:40:17 sheet.frame: the button is lit: press it now (8 s; the job waits 599 at most)", - "16:40:18 sheet.frame: the button is lit: press it now (9 s; the job waits 599 at most)", - "16:40:19 sheet.frame: the button is lit: press it now (10 s; the job waits 599 at most)", - "16:40:20 sheet.frame: the button is lit: press it now (11 s; the job waits 599 at most)", - "16:40:21 sheet.frame: the button is lit: press it now (12 s; the job waits 599 at most)", - "16:40:22 sheet.frame: the button is lit: press it now (13 s; the job waits 599 at most)", - "16:40:23 sheet.frame: the button is lit: press it now (14 s; the job waits 599 at most)", - "16:40:24 sheet.frame: the button is lit: press it now (15 s; the job waits 599 at most)", - "16:40:25 sheet.frame: the button is lit: press it now (17 s; the job waits 599 at most)", - "16:40:26 sheet.frame: the button is lit: press it now (18 s; the job waits 599 at most)", - "16:40:27 sheet.frame: the button is lit: press it now (19 s; the job waits 599 at most)", - "16:40:27 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:40:28 sheet.frame: the button is lit: press it now (20 s; the job waits 599 at most)", - "16:40:29 sheet.frame: the button is lit: press it now (21 s; the job waits 599 at most)", - "16:40:30 sheet.frame: the button is lit: press it now (22 s; the job waits 599 at most)", - "16:40:31 sheet.frame: the button is lit: press it now (23 s; the job waits 599 at most)", - "16:40:32 sheet.frame: the button is lit: press it now (24 s; the job waits 599 at most)", - "16:40:33 sheet.frame: the button is lit: press it now (25 s; the job waits 599 at most)", - "16:40:34 sheet.frame: burning: 1 s lit", - "16:40:35 sheet.frame: burning: 2 s lit", - "16:40:36 sheet.frame: burning: 3 s lit", - "16:40:37 sheet.frame: burning: 4 s lit", - "16:40:38 sheet.frame: burning: 5 s lit", - "16:40:39 sheet.frame: burning: 6 s lit", - "16:40:40 sheet.frame: burning: 7 s lit", - "16:40:41 sheet.frame: burning: 8 s lit", - "16:40:42 sheet.frame: burning: 9 s lit", - "16:40:43 sheet.frame: burning: 10 s lit", - "16:40:44 sheet.frame: burning: 11 s lit", - "16:40:45 sheet.frame: burning: 12 s lit", - "16:40:46 sheet.frame: burning: 0 s lit", - "16:40:47 sheet.frame: burning: the tube is between passes", - "16:40:50 sheet.frame: burning: 0 s lit", - "16:40:54 sheet.frame: burning: the tube is between passes", - "16:40:55 sheet.frame: burning: 0 s lit", - "16:40:57 sheet.frame: burning: 1 s lit", - "16:40:57 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:40:58 sheet.frame: burning: the tube is between passes", - "16:40:59 sheet.frame: burning: 0 s lit", - "16:41:00 sheet.frame: burning: 1 s lit", - "16:41:01 sheet.frame: burning: 0 s lit", - "16:41:03 sheet.frame: burning: the tube is between passes", - "16:41:07 sheet.frame: burning: 0 s lit", - "16:41:10 sheet.frame: burning: the tube is between passes", - "16:41:11 sheet.frame: burning: 0 s lit", - "16:41:12 sheet.frame: burning: the tube is between passes", - "16:41:13 sheet.frame: burning: 0 s lit", - "16:41:16 sheet.frame: burning: the tube is between passes", - "16:41:17 sheet.frame: burning: 0 s lit", - "16:41:21 sheet.frame: burning: the tube is between passes", - "16:41:22 sheet.frame: burning: 0 s lit", - "16:41:28 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:41:33 sheet.frame: burning: the tube is between passes", - "16:41:40 sheet.frame: burning: 0 s lit", - "16:41:41 sheet.frame: burning: the tube is between passes", - "16:41:43 sheet.frame: burning: 0 s lit", - "16:41:44 sheet.frame: burning: the tube is between passes", - "16:41:45 sheet.frame: burning: 0 s lit", - "16:41:47 sheet.frame: burning: the tube is between passes", - "16:41:48 sheet.frame: burning: 0 s lit", - "16:41:50 sheet.frame: burning: the tube is between passes", - "16:41:51 sheet.frame: burning: 0 s lit", - "16:41:53 sheet.frame: burning: the tube is between passes", - "16:41:54 sheet.frame: burning: 0 s lit", - "16:41:56 sheet.frame: burning: the tube is between passes", - "16:41:58 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:41:59 sheet.frame: the tube is dark: the pulse engine plays the rest", - "16:41:59 prompt frame-ok (choice): Is the frame on the sheet, square, and visible? Look, but do not move the sheet: every card after this is placed from the same datum.", - "16:42:00 sheet.frame: {'mark_s': 400, 'mark_feed': 3000}, emission {'hv_max': 1023, 'laser_on_samples': 141, 'thermopile_delta': 928, 'lit_s': 82.59907572300017}", - "16:42:00 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", - "16:42:00 POST /wiz/laser.focus/start -> 200 {'started': True, 'id': 'laser.focus'}", - "16:42:00 laser.focus: stopping the motion controller", - "16:42:00 ARM press by the fixture, button lit after 0.5 s", - "16:42:01 laser.focus: the lens finds its reference on the hall sensor", - "16:42:04 laser.focus: the lens finds its reference on the hall sensor: pass 1 of 2", - "16:42:05 laser.focus: the lens finds its reference on the hall sensor: pass 2 of 2", - "16:42:06 laser.focus: the fans stop before the listening: 0 s of 10", - "16:42:07 laser.focus: the fans stop before the listening: 1 s of 10", - "16:42:08 laser.focus: the fans stop before the listening: 2 s of 10", - "16:42:09 laser.focus: the fans stop before the listening: 3 s of 10", - "16:42:10 laser.focus: the fans stop before the listening: 4 s of 10", - "16:42:11 laser.focus: the fans stop before the listening: 5 s of 10", - "16:42:12 laser.focus: the fans stop before the listening: 6 s of 10", - "16:42:13 laser.focus: the fans stop before the listening: 7 s of 10", - "16:42:14 laser.focus: the fans stop before the listening: 8 s of 10", - "16:42:15 laser.focus: the fans stop before the listening: 9 s of 10", - "16:42:16 laser.focus: finding the bottom stop by the head accelerometer: 3 half-steps below the edge", - "16:42:17 laser.focus: finding the bottom stop by the head accelerometer: 9 half-steps below the edge", - "16:42:18 laser.focus: finding the bottom stop by the head accelerometer: 14 half-steps below the edge", - "16:42:19 laser.focus: finding the bottom stop by the head accelerometer: 16 half-steps below the edge", - "16:42:22 laser.focus: finding the top stop by the head accelerometer: 5 half-steps above the edge", - "16:42:23 laser.focus: finding the top stop by the head accelerometer: 10 half-steps above the edge", - "16:42:24 laser.focus: finding the top stop by the head accelerometer: 16 half-steps above the edge", - "16:42:25 laser.focus: finding the top stop by the head accelerometer: 21 half-steps above the edge", - "16:42:26 laser.focus: finding the top stop by the head accelerometer: 22 half-steps above the edge", - "16:42:29 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:42:32 laser.focus: the cooling engine takes the controller's report: 0 s (20 at most)", - "16:42:34 prompt focus-arm (continue): The lens is on its hall reference. Its stops were found by the head accelerometer, 14 half-steps below the reference and 20 above, without a slip. Twelve 1.772 in lines burn heavy, the lens stepped from 0.269 in above the reference to 0.189 in below it. Lid closed. Continue, then press the button when it lights white;", - "16:42:35 laser.focus: the program goes to the controller, the button lights at the arm", - "16:42:36 laser.focus: the button is lit: press it now (0 s; the job waits 599 at most)", - "16:42:36 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.", - "16:42:37 laser.focus: the button is lit: press it now (1 s; the job waits 599 at most)", - "16:42:38 laser.focus: the button is lit: press it now (2 s; the job waits 599 at most)", - "16:42:39 laser.focus: the button is lit: press it now (3 s; the job waits 599 at most)", - "16:42:40 laser.focus: the button is lit: press it now (4 s; the job waits 599 at most)", - "16:42:41 laser.focus: the button is lit: press it now (5 s; the job waits 599 at most)", - "16:42:42 laser.focus: the button is lit: press it now (6 s; the job waits 599 at most)", - "16:42:43 laser.focus: the button is lit: press it now (7 s; the job waits 599 at most)", - "16:42:44 laser.focus: the button is lit: press it now (8 s; the job waits 599 at most)", - "16:42:45 laser.focus: the button is lit: press it now (9 s; the job waits 599 at most)", - "16:42:46 laser.focus: the button is lit: press it now (10 s; the job waits 599 at most)", - "16:42:47 laser.focus: the button is lit: press it now (11 s; the job waits 599 at most)", - "16:42:48 laser.focus: the button is lit: press it now (12 s; the job waits 599 at most)", - "16:42:49 laser.focus: the button is lit: press it now (13 s; the job waits 599 at most)", - "16:42:50 laser.focus: the button is lit: press it now (14 s; the job waits 599 at most)", - "16:42:51 laser.focus: burning: 0 s lit", - "16:42:52 laser.focus: burning: 1 s lit", - "16:42:53 laser.focus: burning: 2 s lit", - "16:42:54 laser.focus: burning: 3 s lit", - "16:42:55 laser.focus: burning: 4 s lit", - "16:42:56 laser.focus: burning: 0 s lit", - "16:42:57 laser.focus: burning: the tube is between passes", - "16:43:00 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:43:00 laser.focus: burning: 0 s lit", - "16:43:04 laser.focus: burning: the tube is between passes", - "16:43:07 laser.focus: burning: 0 s lit", - "16:43:08 laser.focus: burning: 1 s lit", - "16:43:09 laser.focus: burning: the tube is between passes", - "16:43:10 laser.focus: burning: 1 s lit", - "16:43:11 laser.focus: burning: 2 s lit", - "16:43:12 laser.focus: burning: 0 s lit", - "16:43:13 laser.focus: burning: 1 s lit", - "16:43:14 laser.focus: burning: the tube is between passes", - "16:43:15 laser.focus: burning: 0 s lit", - "16:43:16 laser.focus: burning: 1 s lit", - "16:43:17 laser.focus: burning: the tube is between passes", - "16:43:18 laser.focus: burning: 1 s lit", - "16:43:19 laser.focus: burning: the tube is between passes", - "16:43:20 laser.focus: burning: 0 s lit", - "16:43:22 laser.focus: burning: 1 s lit", - "16:43:23 laser.focus: burning: the tube is between passes", - "16:43:24 laser.focus: burning: 1 s lit", - "16:43:25 laser.focus: burning: 2 s lit", - "16:43:26 laser.focus: burning: the tube is between passes", - "16:43:27 laser.focus: burning: 1 s lit", - "16:43:28 laser.focus: burning: the tube is between passes", - "16:43:29 laser.focus: burning: 0 s lit", - "16:43:30 laser.focus: burning: 1 s lit", - "16:43:30 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:43:31 laser.focus: burning: the tube is between passes", - "16:43:32 laser.focus: burning: 1 s lit", - "16:43:33 laser.focus: burning: 2 s lit", - "16:43:34 laser.focus: burning: 0 s lit", - "16:43:35 laser.focus: burning: 1 s lit", - "16:43:36 laser.focus: burning: the tube is between passes", - "16:43:37 laser.focus: burning: 1 s lit", - "16:43:38 laser.focus: burning: 2 s lit", - "16:43:39 laser.focus: burning: the tube is between passes", - "16:43:42 laser.focus: the tube is dark: the pulse engine plays the rest", - "16:43:42 prompt focus-pick (multichoice): Every line is dark. Which is the narrowest dark line, with the crispest edges? Count from the top, 1 to 12. Several adjacent lines can look the same, since the depth of focus spans a few of them: choose every one that does, and the middle of the run is taken. Then Done. Look, but do not move the sheet: every card afte", - "16:43:43 prompt thickness (number): The sheet thickness (0.125 in from the placement).", - "16:43:44 laser.focus: {'pick': 11.0, 'thickness_mm': 3.175, 'pick_half_steps': -11.0, 'edge_z_mm': 6.939544832306639, 'steps_per_mm': 2.922, 'max_height_mm': 13.784171800136892, 'focus_range_mm': {'min': 2.148305954825462, 'max': 13.784171800136892}, 'stops': {'found': True, 'below': 14, 'above': 20, 'contact_below': 16, 'contact_above': 22, 'why': ''}}, emission {'hv_max': 1023, 'laser_on_samples': 233, 'thermopile_delta': 1314, 'lit_s': 47.34520324599998}", - "16:43:44 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", - "16:43:44 POST /wiz/laser.floor/start -> 200 {'started': True, 'id': 'laser.floor'}", - "16:43:44 laser.floor: stopping the motion controller", - "16:43:44 ARM press by the fixture, button lit after 0.5 s", - "16:43:45 laser.floor: the lens finds its reference on the hall sensor", - "16:43:48 laser.floor: the lens finds its reference on the hall sensor: pass 1 of 2", - "16:43:49 laser.floor: the lens finds its reference on the hall sensor: pass 2 of 2", - "16:43:50 laser.floor: the cooling engine takes the controller's report: 0 s (20 at most)", - "16:43:52 prompt floor-arm (continue): Twelve 2.087 in rungs from 2 to 24 percent density, the floor and the dose curve off for the rungs. Lid closed. Continue, then press the button when it lights white; this page says when.", - "16:43:53 laser.floor: the program goes to the controller, the button lights at the arm", - "16:43:54 laser.floor: the button is lit: press it now (0 s; the job waits 599 at most)", - "16:43:54 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.", - "16:43:55 laser.floor: the button is lit: press it now (1 s; the job waits 599 at most)", - "16:43:56 laser.floor: the button is lit: press it now (2 s; the job waits 599 at most)", - "16:43:57 laser.floor: the button is lit: press it now (3 s; the job waits 599 at most)", - "16:43:58 laser.floor: the button is lit: press it now (4 s; the job waits 599 at most)", - "16:43:59 laser.floor: the button is lit: press it now (5 s; the job waits 599 at most)", - "16:44:00 laser.floor: the button is lit: press it now (6 s; the job waits 599 at most)", - "16:44:01 laser.floor: the button is lit: press it now (7 s; the job waits 599 at most)", - "16:44:02 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:44:02 laser.floor: the button is lit: press it now (8 s; the job waits 599 at most)", - "16:44:03 laser.floor: the button is lit: press it now (9 s; the job waits 599 at most)", - "16:44:04 laser.floor: the button is lit: press it now (10 s; the job waits 599 at most)", - "16:44:05 laser.floor: the button is lit: press it now (11 s; the job waits 599 at most)", - "16:44:06 laser.floor: the button is lit: press it now (12 s; the job waits 599 at most)", - "16:44:07 laser.floor: the button is lit: press it now (13 s; the job waits 599 at most)", - "16:44:08 laser.floor: burning: 0 s lit", - "16:44:09 laser.floor: burning: 1 s lit", - "16:44:10 laser.floor: burning: 2 s lit", - "16:44:11 laser.floor: burning: 3 s lit", - "16:44:12 laser.floor: burning: 4 s lit", - "16:44:13 laser.floor: burning: the tube is between passes", - "16:44:14 laser.floor: burning: 0 s lit", - "16:44:15 laser.floor: burning: the tube is between passes", - "16:44:16 laser.floor: burning: 0 s lit", - "16:44:17 laser.floor: burning: the tube is between passes", - "16:44:18 laser.floor: burning: 0 s lit", - "16:44:20 laser.floor: burning: the tube is between passes", - "16:44:22 laser.floor: burning: 0 s lit", - "16:44:26 laser.floor: burning: the tube is between passes", - "16:44:32 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:44:33 laser.floor: burning: 0 s lit", - "16:44:36 laser.floor: burning: the tube is between passes", - "16:44:40 laser.floor: burning: 0 s lit", - "16:44:42 laser.floor: burning: the tube is between passes", - "16:44:43 laser.floor: burning: 0 s lit", - "16:44:44 laser.floor: burning: the tube is between passes", - "16:44:45 laser.floor: burning: 0 s lit", - "16:44:46 laser.floor: burning: the tube is between passes", - "16:44:48 laser.floor: burning: 0 s lit", - "16:44:50 laser.floor: burning: the tube is between passes", - "16:44:51 laser.floor: burning: 0 s lit", - "16:44:54 laser.floor: burning: the tube is between passes", - "16:44:59 laser.floor: burning: 0 s lit", - "16:45:00 laser.floor: burning: 1 s lit", - "16:45:01 laser.floor: burning: 0 s lit", - "16:45:02 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:45:03 laser.floor: burning: the tube is between passes", - "16:45:04 laser.floor: burning: 0 s lit", - "16:45:06 laser.floor: burning: 1 s lit", - "16:45:07 laser.floor: burning: 0 s lit", - "16:45:09 laser.floor: burning: the tube is between passes", - "16:45:10 laser.floor: burning: 1 s lit", - "16:45:11 laser.floor: burning: 2 s lit", - "16:45:12 laser.floor: burning: 3 s lit", - "16:45:13 laser.floor: burning: 4 s lit", - "16:45:14 laser.floor: burning: 5 s lit", - "16:45:15 laser.floor: burning: the tube is between passes", - "16:45:16 laser.floor: burning: 1 s lit", - "16:45:17 laser.floor: burning: 2 s lit", - "16:45:18 laser.floor: burning: 3 s lit", - "16:45:19 laser.floor: burning: 4 s lit", - "16:45:20 laser.floor: burning: 5 s lit", - "16:45:21 laser.floor: burning: the tube is between passes", - "16:45:22 laser.floor: burning: 1 s lit", - "16:45:23 laser.floor: burning: 2 s lit", - "16:45:24 laser.floor: burning: 3 s lit", - "16:45:25 laser.floor: burning: 4 s lit", - "16:45:26 laser.floor: burning: 5 s lit", - "16:45:27 laser.floor: burning: the tube is between passes", - "16:45:28 laser.floor: burning: 1 s lit", - "16:45:29 laser.floor: burning: 2 s lit", - "16:45:30 laser.floor: burning: 3 s lit", - "16:45:31 laser.floor: burning: 4 s lit", - "16:45:32 laser.floor: burning: 5 s lit", - "16:45:33 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:45:34 laser.floor: burning: 0 s lit", - "16:45:35 laser.floor: burning: 1 s lit", - "16:45:36 laser.floor: burning: 2 s lit", - "16:45:37 laser.floor: burning: 3 s lit", - "16:45:38 laser.floor: burning: 4 s lit", - "16:45:39 laser.floor: burning: 5 s lit", - "16:45:40 laser.floor: burning: the tube is between passes", - "16:45:41 laser.floor: the tube is dark: the pulse engine plays the rest", - "16:45:42 prompt floor-pick (choice): Which is the faintest rung that shows a continuous line? The labels are the percent density; the top rung is 2. Look, but do not move the sheet: every card after this is placed from the same datum.", - "16:45:43 laser.floor: {'faintest_density': 8.0, 'floor_density': 10.0}, emission {'hv_max': 1023, 'laser_on_samples': 147, 'thermopile_delta': 787, 'lit_s': 90.97312882000006}", - "16:45:43 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", - "16:45:43 POST /wiz/laser.dose-curve/start -> 200 {'started': True, 'id': 'laser.dose-curve'}", - "16:45:43 laser.dose-curve: stopping the motion controller", - "16:45:44 ARM press by the fixture, button lit after 0.3 s", - "16:45:44 laser.dose-curve: the lens finds its reference on the hall sensor", - "16:45:46 laser.dose-curve: the lens finds its reference on the hall sensor: pass 1 of 2", - "16:45:47 laser.dose-curve: the lens finds its reference on the hall sensor: pass 2 of 2", - "16:45:48 laser.dose-curve: the cooling engine takes the controller's report: 0 s (20 at most)", - "16:45:49 prompt dose-arm (continue): Seven 100 mm rungs from 10 to 100 percent density, the thermopile reading each. The curve fits itself. Lid closed. Continue, then press the button when it lights white; this page says when.", - "16:45:50 laser.dose-curve: the program goes to the controller, the button lights at the arm", - "16:45:51 laser.dose-curve: the button is lit: press it now (0 s; the job waits 599 at most)", - "16:45:51 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.", - "16:45:52 laser.dose-curve: the button is lit: press it now (1 s; the job waits 599 at most)", - "16:45:53 laser.dose-curve: the button is lit: press it now (2 s; the job waits 599 at most)", - "16:45:54 laser.dose-curve: the button is lit: press it now (3 s; the job waits 599 at most)", - "16:45:55 laser.dose-curve: the button is lit: press it now (4 s; the job waits 599 at most)", - "16:45:56 laser.dose-curve: the button is lit: press it now (5 s; the job waits 599 at most)", - "16:45:57 laser.dose-curve: the button is lit: press it now (6 s; the job waits 599 at most)", - "16:45:58 laser.dose-curve: the button is lit: press it now (7 s; the job waits 599 at most)", - "16:45:59 laser.dose-curve: the button is lit: press it now (8 s; the job waits 599 at most)", - "16:46:00 laser.dose-curve: the button is lit: press it now (9 s; the job waits 599 at most)", - "16:46:01 laser.dose-curve: the button is lit: press it now (10 s; the job waits 599 at most)", - "16:46:02 laser.dose-curve: the button is lit: press it now (11 s; the job waits 599 at most)", - "16:46:03 laser.dose-curve: the button is lit: press it now (12 s; the job waits 599 at most)", - "16:46:03 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:46:04 laser.dose-curve: the button is lit: press it now (13 s; the job waits 599 at most)", - "16:46:05 laser.dose-curve: the button is lit: press it now (14 s; the job waits 599 at most)", - "16:46:06 laser.dose-curve: burning: 1 s lit", - "16:46:07 laser.dose-curve: burning: 2 s lit", - "16:46:08 laser.dose-curve: burning: 3 s lit", - "16:46:09 laser.dose-curve: burning: 4 s lit", - "16:46:10 laser.dose-curve: burning: 5 s lit", - "16:46:11 laser.dose-curve: burning: 6 s lit", - "16:46:12 laser.dose-curve: burning: the tube is between passes", - "16:46:13 laser.dose-curve: burning: 0 s lit", - "16:46:14 laser.dose-curve: burning: the tube is between passes", - "16:46:15 laser.dose-curve: burning: 0 s lit", - "16:46:16 laser.dose-curve: burning: the tube is between passes", - "16:46:18 laser.dose-curve: burning: 0 s lit", - "16:46:19 laser.dose-curve: burning: the tube is between passes", - "16:46:20 laser.dose-curve: burning: 0 s lit", - "16:46:23 laser.dose-curve: burning: the tube is between passes", - "16:46:28 laser.dose-curve: burning: 0 s lit", - "16:46:33 laser.dose-curve: burning: the tube is between passes", - "16:46:34 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:46:35 laser.dose-curve: burning: 0 s lit", - "16:46:37 laser.dose-curve: burning: the tube is between passes", - "16:46:40 laser.dose-curve: burning: 0 s lit", - "16:46:41 laser.dose-curve: burning: 1 s lit", - "16:46:42 laser.dose-curve: burning: 2 s lit", - "16:46:43 laser.dose-curve: burning: 3 s lit", - "16:46:44 laser.dose-curve: burning: 4 s lit", - "16:46:45 laser.dose-curve: burning: 5 s lit", - "16:46:46 laser.dose-curve: burning: 6 s lit", - "16:46:47 laser.dose-curve: burning: 7 s lit", - "16:46:48 laser.dose-curve: burning: 8 s lit", - "16:46:49 laser.dose-curve: burning: 9 s lit", - "16:46:50 laser.dose-curve: burning: the tube is between passes", - "16:46:53 laser.dose-curve: burning: 0 s lit", - "16:46:54 laser.dose-curve: burning: 1 s lit", - "16:46:55 laser.dose-curve: burning: 2 s lit", - "16:46:56 laser.dose-curve: burning: 3 s lit", - "16:46:57 laser.dose-curve: burning: 4 s lit", - "16:46:58 laser.dose-curve: burning: 5 s lit", - "16:46:59 laser.dose-curve: burning: 6 s lit", - "16:47:00 laser.dose-curve: burning: 7 s lit", - "16:47:01 laser.dose-curve: burning: 8 s lit", - "16:47:02 laser.dose-curve: burning: 9 s lit", - "16:47:03 laser.dose-curve: burning: the tube is between passes", - "16:47:04 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:47:06 laser.dose-curve: burning: 0 s lit", - "16:47:07 laser.dose-curve: burning: 1 s lit", - "16:47:08 laser.dose-curve: burning: 2 s lit", - "16:47:09 laser.dose-curve: burning: 3 s lit", - "16:47:10 laser.dose-curve: burning: 4 s lit", - "16:47:11 laser.dose-curve: burning: 5 s lit", - "16:47:13 laser.dose-curve: burning: 6 s lit", - "16:47:14 laser.dose-curve: burning: 7 s lit", - "16:47:15 laser.dose-curve: burning: 8 s lit", - "16:47:16 laser.dose-curve: burning: 9 s lit", - "16:47:17 laser.dose-curve: burning: the tube is between passes", - "16:47:20 laser.dose-curve: burning: 0 s lit", - "16:47:21 laser.dose-curve: burning: 1 s lit", - "16:47:22 laser.dose-curve: burning: 2 s lit", - "16:47:23 laser.dose-curve: burning: 3 s lit", - "16:47:24 laser.dose-curve: burning: 4 s lit", - "16:47:25 laser.dose-curve: burning: 5 s lit", - "16:47:26 laser.dose-curve: burning: 6 s lit", - "16:47:27 laser.dose-curve: burning: 7 s lit", - "16:47:28 laser.dose-curve: burning: 8 s lit", - "16:47:29 laser.dose-curve: burning: 9 s lit", - "16:47:30 laser.dose-curve: burning: the tube is between passes", - "16:47:33 laser.dose-curve: burning: 0 s lit", - "16:47:34 laser.dose-curve: burning: 1 s lit", - "16:47:34 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:47:35 laser.dose-curve: burning: 2 s lit", - "16:47:36 laser.dose-curve: burning: 3 s lit", - "16:47:37 laser.dose-curve: burning: 4 s lit", - "16:47:38 laser.dose-curve: burning: 5 s lit", - "16:47:39 laser.dose-curve: burning: 6 s lit", - "16:47:40 laser.dose-curve: burning: 7 s lit", - "16:47:41 laser.dose-curve: burning: 8 s lit", - "16:47:42 laser.dose-curve: burning: 9 s lit", - "16:47:43 laser.dose-curve: burning: the tube is between passes", - "16:47:46 laser.dose-curve: burning: 0 s lit", - "16:47:47 laser.dose-curve: burning: 1 s lit", - "16:47:48 laser.dose-curve: burning: 2 s lit", - "16:47:49 laser.dose-curve: burning: 3 s lit", - "16:47:50 laser.dose-curve: burning: 4 s lit", - "16:47:51 laser.dose-curve: burning: 5 s lit", - "16:47:52 laser.dose-curve: burning: 6 s lit", - "16:47:53 laser.dose-curve: burning: 7 s lit", - "16:47:54 laser.dose-curve: burning: 8 s lit", - "16:47:55 laser.dose-curve: burning: 9 s lit", - "16:47:56 laser.dose-curve: burning: the tube is between passes", - "16:47:59 laser.dose-curve: the tube is dark: the fit needs the dark tail, 17 s more", - "16:48:00 laser.dose-curve: the tube is dark: the fit needs the dark tail, 16 s more", - "16:48:01 laser.dose-curve: the tube is dark: the fit needs the dark tail, 15 s more", - "16:48:02 laser.dose-curve: the tube is dark: the fit needs the dark tail, 14 s more", - "16:48:03 laser.dose-curve: the tube is dark: the fit needs the dark tail, 13 s more", - "16:48:04 laser.dose-curve: the tube is dark: the fit needs the dark tail, 12 s more", - "16:48:04 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:48:05 laser.dose-curve: the tube is dark: the fit needs the dark tail, 10 s more", - "16:48:06 laser.dose-curve: the tube is dark: the fit needs the dark tail, 9 s more", - "16:48:07 laser.dose-curve: the tube is dark: the fit needs the dark tail, 8 s more", - "16:48:08 laser.dose-curve: the tube is dark: the fit needs the dark tail, 7 s more", - "16:48:09 laser.dose-curve: the tube is dark: the fit needs the dark tail, 6 s more", - "16:48:10 laser.dose-curve: the tube is dark: the fit needs the dark tail, 5 s more", - "16:48:11 laser.dose-curve: the tube is dark: the fit needs the dark tail, 4 s more", - "16:48:12 laser.dose-curve: the tube is dark: the fit needs the dark tail, 3 s more", - "16:48:13 laser.dose-curve: the tube is dark: the fit needs the dark tail, 2 s more", - "16:48:14 laser.dose-curve: the tube is dark: the fit needs the dark tail, 1 s more", - "16:48:15 laser.dose-curve: the tube is dark: the fit needs the dark tail, 0 s more", - "16:48:19 laser.dose-curve: {'points': [{'density': 10.0, 'light': 0.49057235251401216}, {'density': 20.0, 'light': 2.0614631639416827}, {'density': 30.0, 'light': 8.72107651829892}, {'density': 45.0, 'light': 24.625062162849353}, {'density': 60.0, 'light': 39.95399812794241}, {'density': 80.0, 'light': 54.53909448497147}, {'density': 100.0, 'light': 100.0}], 'curve': '10:0.49,20:2.06,30:8.72,45:24.63,60:39.95,80:54.54,100:100.00'}, emission {'hv_max': 1023, 'laser_on_samples': 255, 'thermopile_delta': 2273, 'lit_s': 110.8990827030002}", - "16:48:19 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", - "16:48:19 POST /wiz/laser.corner/start -> 200 {'started': True, 'id': 'laser.corner'}", - "16:48:19 laser.corner: stopping the motion controller", - "16:48:19 ARM press by the fixture, button lit after 0.3 s", - "16:48:20 laser.corner: the lens finds its reference on the hall sensor", - "16:48:22 laser.corner: the lens finds its reference on the hall sensor: pass 1 of 2", - "16:48:23 laser.corner: the lens finds its reference on the hall sensor: pass 2 of 2", - "16:48:24 laser.corner: the cooling engine takes the controller's report: 0 s (20 at most)", - "16:48:26 prompt corner-arm (continue): The same corner-heavy pattern five times at rolloff exponents 1.0 to 2.0 under velocity-scaled power at 30 percent. Lid closed. Continue, then press the button when it lights white; this page says when.", - "16:48:27 laser.corner: the program goes to the controller, the button lights at the arm", - "16:48:28 laser.corner: the button is lit: press it now (0 s; the job waits 599 at most)", - "16:48:28 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.", - "16:48:29 laser.corner: the button is lit: press it now (1 s; the job waits 599 at most)", - "16:48:30 laser.corner: the button is lit: press it now (2 s; the job waits 599 at most)", - "16:48:31 laser.corner: the button is lit: press it now (3 s; the job waits 599 at most)", - "16:48:32 laser.corner: the button is lit: press it now (4 s; the job waits 599 at most)", - "16:48:33 laser.corner: the button is lit: press it now (5 s; the job waits 599 at most)", - "16:48:34 laser.corner: the button is lit: press it now (6 s; the job waits 599 at most)", - "16:48:35 laser.corner: the button is lit: press it now (7 s; the job waits 599 at most)", - "16:48:35 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:48:36 laser.corner: the button is lit: press it now (8 s; the job waits 599 at most)", - "16:48:37 laser.corner: the button is lit: press it now (9 s; the job waits 599 at most)", - "16:48:38 laser.corner: the button is lit: press it now (10 s; the job waits 599 at most)", - "16:48:39 laser.corner: the button is lit: press it now (11 s; the job waits 599 at most)", - "16:48:40 laser.corner: the button is lit: press it now (12 s; the job waits 599 at most)", - "16:48:41 laser.corner: the button is lit: press it now (13 s; the job waits 599 at most)", - "16:48:42 laser.corner: the button is lit: press it now (14 s; the job waits 599 at most)", - "16:48:43 laser.corner: the button is lit: press it now (15 s; the job waits 599 at most)", - "16:48:44 laser.corner: the button is lit: press it now (16 s; the job waits 599 at most)", - "16:48:45 laser.corner: burning: 0 s lit", - "16:48:46 laser.corner: burning: 1 s lit", - "16:48:47 laser.corner: burning: 2 s lit", - "16:48:48 laser.corner: burning: 3 s lit", - "16:48:49 laser.corner: burning: 0 s lit", - "16:48:51 laser.corner: burning: the tube is between passes", - "16:48:52 laser.corner: burning: 0 s lit", - "16:48:55 laser.corner: burning: the tube is between passes", - "16:48:57 laser.corner: burning: 0 s lit", - "16:48:59 laser.corner: burning: the tube is between passes", - "16:49:00 laser.corner: burning: 0 s lit", - "16:49:02 laser.corner: burning: the tube is between passes", - "16:49:03 laser.corner: burning: 0 s lit", - "16:49:04 laser.corner: burning: 1 s lit", - "16:49:05 laser.corner: burning: the tube is between passes", - "16:49:05 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:49:06 laser.corner: burning: 1 s lit", - "16:49:07 laser.corner: burning: 2 s lit", - "16:49:08 laser.corner: burning: the tube is between passes", - "16:49:09 laser.corner: burning: 1 s lit", - "16:49:10 laser.corner: burning: the tube is between passes", - "16:49:11 laser.corner: burning: 0 s lit", - "16:49:12 laser.corner: burning: 1 s lit", - "16:49:13 laser.corner: burning: the tube is between passes", - "16:49:14 laser.corner: burning: 1 s lit", - "16:49:15 laser.corner: burning: 2 s lit", - "16:49:16 laser.corner: burning: the tube is between passes", - "16:49:18 laser.corner: the tube is dark: the pulse engine plays the rest", - "16:49:18 prompt corner-pick (choice): Which pattern has the most even corners, neither burned dark nor faded, through the teeth, the square, and the root sign at the end? The top pattern is 1.00. Look, but do not move the sheet: every card after this is placed from the same datum.", - "16:49:19 laser.corner: {'gamma': 1.5}, emission {'hv_max': 972, 'laser_on_samples': 148, 'thermopile_delta': 819, 'lit_s': 31.045071525000367}", - "16:49:19 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", - "16:49:19 POST /wiz/cooling.flow-load/start -> 200 {'started': True, 'id': 'cooling.flow-load'}", - "16:49:19 cooling.flow-load: stopping the motion controller", - "16:49:20 ARM press by the fixture, button lit after 0.5 s", - "16:49:20 cooling.flow-load: the lens finds its reference on the hall sensor", - "16:49:22 cooling.flow-load: the lens finds its reference on the hall sensor: pass 1 of 2", - "16:49:23 cooling.flow-load: the lens finds its reference on the hall sensor: pass 2 of 2", - "16:49:24 cooling.flow-load: the cooling engine takes the controller's report: 0 s (20 at most)", - "16:49:26 cooling.flow-load: the coolant loop settles before the press: 0 s (60 at least, 240 at most), reading the sensors", - "16:49:27 cooling.flow-load: the coolant loop settles before the press: 1 s (60 at least, 240 at most), reading the sensors", - "16:49:28 cooling.flow-load: the coolant loop settles before the press: 2 s (60 at least, 240 at most), reading the sensors", - "16:49:29 cooling.flow-load: the coolant loop settles before the press: 3 s (60 at least, 240 at most), reading the sensors", - "16:49:30 cooling.flow-load: the coolant loop settles before the press: 4 s (60 at least, 240 at most), reading the sensors", - "16:49:31 cooling.flow-load: the coolant loop settles before the press: 5 s (60 at least, 240 at most), reading the sensors", - "16:49:32 cooling.flow-load: the coolant loop settles before the press: 6 s (60 at least, 240 at most), reading the sensors", - "16:49:33 cooling.flow-load: the coolant loop settles before the press: 7 s (60 at least, 240 at most), reading the sensors", - "16:49:34 cooling.flow-load: the coolant loop settles before the press: 8 s (60 at least, 240 at most), reading the sensors", - "16:49:35 cooling.flow-load: the coolant loop settles before the press: 9 s (60 at least, 240 at most), reading the sensors", - "16:49:36 cooling.flow-load: the coolant loop settles before the press: 10 s (60 at least, 240 at most), reading the sensors", - "16:49:36 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:49:37 cooling.flow-load: the coolant loop settles before the press: 11 s (60 at least, 240 at most), reading the sensors", - "16:49:38 cooling.flow-load: the coolant loop settles before the press: 12 s (60 at least, 240 at most), reading the sensors", - "16:49:39 cooling.flow-load: the coolant loop settles before the press: 13 s (60 at least, 240 at most), reading the sensors", - "16:49:40 cooling.flow-load: the coolant loop settles before the press: 14 s (60 at least, 240 at most), reading the sensors", - "16:49:41 cooling.flow-load: the coolant loop settles before the press: 15 s (60 at least, 240 at most), reading the sensors", - "16:49:42 cooling.flow-load: the coolant loop settles before the press: 16 s (60 at least, 240 at most), reading the sensors", - "16:49:43 cooling.flow-load: the coolant loop settles before the press: 17 s (60 at least, 240 at most), reading the sensors", - "16:49:44 cooling.flow-load: the coolant loop settles before the press: 18 s (60 at least, 240 at most), reading the sensors", - "16:49:45 cooling.flow-load: the coolant loop settles before the press: 19 s (60 at least, 240 at most), reading the sensors", - "16:49:46 cooling.flow-load: the coolant loop settles before the press: 20 s (60 at least, 240 at most), reading the sensors", - "16:49:47 cooling.flow-load: the coolant loop settles before the press: 21 s (60 at least, 240 at most), reading the sensors", - "16:49:48 cooling.flow-load: the coolant loop settles before the press: 22 s (60 at least, 240 at most), reading the sensors", - "16:49:49 cooling.flow-load: the coolant loop settles before the press: 23 s (60 at least, 240 at most), reading the sensors", - "16:49:50 cooling.flow-load: the coolant loop settles before the press: 24 s (60 at least, 240 at most), reading the sensors", - "16:49:51 cooling.flow-load: the coolant loop settles before the press: 25 s (60 at least, 240 at most), reading the sensors", - "16:49:52 cooling.flow-load: the coolant loop settles before the press: 26 s (60 at least, 240 at most), reading the sensors", - "16:49:53 cooling.flow-load: the coolant loop settles before the press: 27 s (60 at least, 240 at most), reading the sensors", - "16:49:54 cooling.flow-load: the coolant loop settles before the press: 28 s (60 at least, 240 at most), reading the sensors", - "16:49:55 cooling.flow-load: the coolant loop settles before the press: 29 s (60 at least, 240 at most), drifting -0.161 C p", - "16:49:56 cooling.flow-load: the coolant loop settles before the press: 30 s (60 at least, 240 at most), drifting -0.136 C p", - "16:49:57 cooling.flow-load: the coolant loop settles before the press: 31 s (60 at least, 240 at most), drifting -0.119 C p", - "16:49:58 cooling.flow-load: the coolant loop settles before the press: 32 s (60 at least, 240 at most), drifting -0.111 C p", - "16:49:59 cooling.flow-load: the coolant loop settles before the press: 33 s (60 at least, 240 at most), drifting -0.099 C p", - "16:50:00 cooling.flow-load: the coolant loop settles before the press: 34 s (60 at least, 240 at most), drifting -0.087 C p", - "16:50:01 cooling.flow-load: the coolant loop settles before the press: 35 s (60 at least, 240 at most), drifting -0.077 C p", - "16:50:02 cooling.flow-load: the coolant loop settles before the press: 36 s (60 at least, 240 at most), drifting -0.070 C p", - "16:50:03 cooling.flow-load: the coolant loop settles before the press: 37 s (60 at least, 240 at most), drifting -0.064 C p", - "16:50:04 cooling.flow-load: the coolant loop settles before the press: 38 s (60 at least, 240 at most), drifting -0.059 C p", - "16:50:05 cooling.flow-load: the coolant loop settles before the press: 39 s (60 at least, 240 at most), drifting -0.053 C p", - "16:50:06 cooling.flow-load: the coolant loop settles before the press: 40 s (60 at least, 240 at most), drifting -0.047 C p", - "16:50:07 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:50:07 cooling.flow-load: the coolant loop settles before the press: 41 s (60 at least, 240 at most), drifting -0.040 C p", - "16:50:08 cooling.flow-load: the coolant loop settles before the press: 42 s (60 at least, 240 at most), drifting -0.035 C p", - "16:50:09 cooling.flow-load: the coolant loop settles before the press: 43 s (60 at least, 240 at most), drifting -0.032 C p", - "16:50:10 cooling.flow-load: the coolant loop settles before the press: 44 s (60 at least, 240 at most), drifting -0.030 C p", - "16:50:11 cooling.flow-load: the coolant loop settles before the press: 45 s (60 at least, 240 at most), drifting -0.029 C p", - "16:50:12 cooling.flow-load: the coolant loop settles before the press: 46 s (60 at least, 240 at most), drifting -0.026 C p", - "16:50:13 cooling.flow-load: the coolant loop settles before the press: 47 s (60 at least, 240 at most), drifting -0.026 C p", - "16:50:14 cooling.flow-load: the coolant loop settles before the press: 48 s (60 at least, 240 at most), drifting -0.023 C p", - "16:50:15 cooling.flow-load: the coolant loop settles before the press: 49 s (60 at least, 240 at most), drifting -0.022 C p", - "16:50:16 cooling.flow-load: the coolant loop settles before the press: 50 s (60 at least, 240 at most), drifting -0.020 C p", - "16:50:17 cooling.flow-load: the coolant loop settles before the press: 51 s (60 at least, 240 at most), drifting -0.018 C p", - "16:50:18 cooling.flow-load: the coolant loop settles before the press: 52 s (60 at least, 240 at most), drifting -0.018 C p", - "16:50:19 cooling.flow-load: the coolant loop settles before the press: 53 s (60 at least, 240 at most), drifting -0.017 C p", - "16:50:20 cooling.flow-load: the coolant loop settles before the press: 54 s (60 at least, 240 at most), drifting -0.016 C p", - "16:50:22 cooling.flow-load: the coolant loop settles before the press: 55 s (60 at least, 240 at most), drifting -0.015 C p", - "16:50:23 cooling.flow-load: the coolant loop settles before the press: 56 s (60 at least, 240 at most), drifting -0.015 C p", - "16:50:24 cooling.flow-load: the coolant loop settles before the press: 57 s (60 at least, 240 at most), drifting -0.014 C p", - "16:50:25 cooling.flow-load: the coolant loop settles before the press: 58 s (60 at least, 240 at most), drifting -0.014 C p", - "16:50:26 cooling.flow-load: the coolant loop settles before the press: 59 s (60 at least, 240 at most), drifting -0.015 C p", - "16:50:27 prompt load-arm (continue): The loop is quiet. Now the box, then a 60 x 15 mm patch at 60 percent that keeps the tube lit for about a minute, both coolant sensors read for 100 s after. About four minutes in all. Lid closed. Continue, then press the button when it lights white; this page says when.", - "16:50:28 cooling.flow-load: the program goes to the controller, the button lights at the arm", - "16:50:29 cooling.flow-load: the button is lit: press it now (0 s; the job waits 599 at most)", - "16:50:29 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.", - "16:50:30 cooling.flow-load: the button is lit: press it now (1 s; the job waits 599 at most)", - "16:50:31 cooling.flow-load: the button is lit: press it now (2 s; the job waits 599 at most)", - "16:50:32 cooling.flow-load: the button is lit: press it now (3 s; the job waits 599 at most)", - "16:50:33 cooling.flow-load: the button is lit: press it now (4 s; the job waits 599 at most)", - "16:50:34 cooling.flow-load: the button is lit: press it now (5 s; the job waits 599 at most)", - "16:50:35 cooling.flow-load: the button is lit: press it now (6 s; the job waits 599 at most)", - "16:50:36 cooling.flow-load: the button is lit: press it now (7 s; the job waits 599 at most)", - "16:50:37 cooling.flow-load: the button is lit: press it now (8 s; the job waits 599 at most)", - "16:50:38 cooling.flow-load: the button is lit: press it now (9 s; the job waits 599 at most)", - "16:50:38 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:50:39 cooling.flow-load: burning: 1 s lit", - "16:50:40 cooling.flow-load: burning: 2 s lit", - "16:50:41 cooling.flow-load: burning: 3 s lit", - "16:50:42 cooling.flow-load: burning: 4 s lit", - "16:50:43 cooling.flow-load: burning: 0 s lit", - "16:50:45 cooling.flow-load: burning: the tube is between passes", - "16:50:46 cooling.flow-load: burning: 0 s lit", - "16:50:50 cooling.flow-load: burning: the tube is between passes", - "16:50:52 cooling.flow-load: burning: 0 s lit", - "16:50:53 cooling.flow-load: burning: 1 s lit", - "16:50:54 cooling.flow-load: burning: 2 s lit", - "16:50:55 cooling.flow-load: burning: 3 s lit", - "16:50:56 cooling.flow-load: burning: 4 s lit", - "16:50:57 cooling.flow-load: burning: 5 s lit", - "16:50:58 cooling.flow-load: burning: 6 s lit", - "16:50:59 cooling.flow-load: burning: 7 s lit", - "16:51:00 cooling.flow-load: burning: 8 s lit", - "16:51:01 cooling.flow-load: burning: 9 s lit", - "16:51:02 cooling.flow-load: burning: 10 s lit", - "16:51:03 cooling.flow-load: burning: 11 s lit", - "16:51:04 cooling.flow-load: burning: 12 s lit", - "16:51:05 cooling.flow-load: burning: 13 s lit", - "16:51:06 cooling.flow-load: burning: 14 s lit", - "16:51:07 cooling.flow-load: burning: 15 s lit", - "16:51:08 cooling.flow-load: burning: 16 s lit", - "16:51:09 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:51:09 cooling.flow-load: burning: 17 s lit", - "16:51:10 cooling.flow-load: burning: 18 s lit", - "16:51:11 cooling.flow-load: burning: 19 s lit", - "16:51:12 cooling.flow-load: burning: 20 s lit", - "16:51:13 cooling.flow-load: burning: 22 s lit", - "16:51:14 cooling.flow-load: burning: 23 s lit", - "16:51:15 cooling.flow-load: burning: 24 s lit", - "16:51:16 cooling.flow-load: burning: 25 s lit", - "16:51:17 cooling.flow-load: burning: 26 s lit", - "16:51:18 cooling.flow-load: burning: 27 s lit", - "16:51:19 cooling.flow-load: burning: 28 s lit", - "16:51:20 cooling.flow-load: burning: 29 s lit", - "16:51:21 cooling.flow-load: burning: 30 s lit", - "16:51:22 cooling.flow-load: burning: 31 s lit", - "16:51:23 cooling.flow-load: burning: 32 s lit", - "16:51:24 cooling.flow-load: burning: 33 s lit", - "16:51:25 cooling.flow-load: burning: 34 s lit", - "16:51:26 cooling.flow-load: burning: 35 s lit", - "16:51:27 cooling.flow-load: burning: 36 s lit", - "16:51:28 cooling.flow-load: burning: 37 s lit", - "16:51:29 cooling.flow-load: burning: 38 s lit", - "16:51:30 cooling.flow-load: burning: 39 s lit", - "16:51:31 cooling.flow-load: burning: 40 s lit", - "16:51:32 cooling.flow-load: burning: 41 s lit", - "16:51:33 cooling.flow-load: burning: 42 s lit", - "16:51:34 cooling.flow-load: burning: 43 s lit", - "16:51:35 cooling.flow-load: burning: 44 s lit", - "16:51:36 cooling.flow-load: burning: 45 s lit", - "16:51:37 cooling.flow-load: burning: 46 s lit", - "16:51:38 cooling.flow-load: burning: 47 s lit", - "16:51:39 cooling.flow-load: burning: 48 s lit", - "16:51:39 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:51:40 cooling.flow-load: burning: 49 s lit", - "16:51:41 cooling.flow-load: burning: 50 s lit", - "16:51:42 cooling.flow-load: burning: 51 s lit", - "16:51:43 cooling.flow-load: burning: 52 s lit", - "16:51:44 cooling.flow-load: burning: 53 s lit", - "16:51:45 cooling.flow-load: burning: 54 s lit", - "16:51:46 cooling.flow-load: burning: 55 s lit", - "16:51:47 cooling.flow-load: burning: 56 s lit", - "16:51:48 cooling.flow-load: burning: 57 s lit", - "16:51:49 cooling.flow-load: burning: 58 s lit", - "16:51:50 cooling.flow-load: burning: 59 s lit", - "16:51:51 cooling.flow-load: burning: 60 s lit", - "16:51:52 cooling.flow-load: burning: 61 s lit", - "16:51:53 cooling.flow-load: burning: 62 s lit", - "16:51:54 cooling.flow-load: burning: 63 s lit", - "16:51:55 cooling.flow-load: burning: 64 s lit", - "16:51:56 cooling.flow-load: burning: 65 s lit", - "16:51:57 cooling.flow-load: burning: 66 s lit", - "16:51:58 cooling.flow-load: burning: 67 s lit", - "16:51:59 cooling.flow-load: burning: 68 s lit", - "16:52:00 cooling.flow-load: burning: 69 s lit", - "16:52:01 cooling.flow-load: burning: 70 s lit", - "16:52:02 cooling.flow-load: burning: 71 s lit", - "16:52:03 cooling.flow-load: burning: 72 s lit", - "16:52:04 cooling.flow-load: burning: 73 s lit", - "16:52:05 cooling.flow-load: burning: 74 s lit", - "16:52:06 cooling.flow-load: burning: 75 s lit", - "16:52:08 cooling.flow-load: burning: the tube is between passes", - "16:52:10 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:52:11 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 97 s more", - "16:52:12 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 96 s more", - "16:52:14 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 95 s more", - "16:52:15 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 94 s more", - "16:52:16 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 93 s more", - "16:52:17 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 92 s more", - "16:52:18 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 91 s more", - "16:52:19 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 90 s more", - "16:52:20 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 89 s more", - "16:52:21 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 88 s more", - "16:52:22 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 87 s more", - "16:52:23 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 86 s more", - "16:52:24 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 85 s more", - "16:52:25 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 83 s more", - "16:52:26 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 82 s more", - "16:52:27 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 81 s more", - "16:52:28 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 80 s more", - "16:52:29 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 79 s more", - "16:52:30 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 78 s more", - "16:52:31 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 77 s more", - "16:52:32 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 76 s more", - "16:52:33 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 75 s more", - "16:52:34 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 74 s more", - "16:52:35 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 73 s more", - "16:52:36 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 72 s more", - "16:52:37 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 71 s more", - "16:52:38 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 70 s more", - "16:52:39 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 69 s more", - "16:52:40 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 68 s more", - "16:52:41 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:52:41 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 67 s more", - "16:52:42 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 66 s more", - "16:52:43 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 65 s more", - "16:52:44 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 64 s more", - "16:52:45 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 63 s more", - "16:52:46 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 62 s more", - "16:52:47 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 61 s more", - "16:52:48 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 60 s more", - "16:52:49 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 59 s more", - "16:52:50 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 58 s more", - "16:52:51 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 57 s more", - "16:52:52 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 56 s more", - "16:52:54 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 55 s more", - "16:52:55 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 54 s more", - "16:52:56 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 53 s more", - "16:52:57 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 52 s more", - "16:52:58 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 51 s more", - "16:52:59 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 49 s more", - "16:53:00 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 48 s more", - "16:53:01 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 47 s more", - "16:53:02 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 46 s more", - "16:53:03 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 45 s more", - "16:53:04 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 44 s more", - "16:53:05 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 43 s more", - "16:53:06 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 42 s more", - "16:53:07 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 41 s more", - "16:53:08 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 40 s more", - "16:53:09 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 39 s more", - "16:53:10 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 38 s more", - "16:53:11 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 37 s more", - "16:53:11 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:53:12 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 36 s more", - "16:53:13 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 35 s more", - "16:53:14 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 34 s more", - "16:53:15 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 33 s more", - "16:53:16 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 32 s more", - "16:53:17 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 31 s more", - "16:53:18 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 30 s more", - "16:53:19 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 29 s more", - "16:53:20 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 28 s more", - "16:53:21 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 27 s more", - "16:53:22 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 26 s more", - "16:53:23 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 25 s more", - "16:53:24 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 24 s more", - "16:53:25 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 23 s more", - "16:53:26 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 22 s more", - "16:53:27 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 21 s more", - "16:53:28 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 20 s more", - "16:53:29 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 19 s more", - "16:53:30 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 17 s more", - "16:53:31 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 16 s more", - "16:53:32 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 15 s more", - "16:53:33 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 14 s more", - "16:53:35 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 13 s more", - "16:53:36 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 12 s more", - "16:53:37 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 11 s more", - "16:53:38 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 10 s more", - "16:53:39 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 9 s more", - "16:53:40 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 8 s more", - "16:53:41 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 7 s more", - "16:53:42 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 6 s more", - "16:53:42 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:53:43 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 5 s more", - "16:53:44 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 4 s more", - "16:53:45 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 3 s more", - "16:53:46 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 2 s more", - "16:53:47 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 1 s more", - "16:53:48 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 0 s more", - "16:54:00 cooling.flow-load: {'lit_s': 66.24000000000001, 'dose_raw_s': 37480.70000000007, 'peak_c': 1.8183823529411711, 'k_density': 4.8515165216796054e-05, 'k_cw': 6.300670807376111e-05}, emission {'hv_max': 1023, 'laser_on_samples': 218, 'thermopile_delta': 1351, 'lit_s': 90.52465068699985}", - "16:54:00 restore lens_hall_edge_z_mm='3.48' -> 200", - "16:54:00 restore lens_stop_below_steps='14' -> 200", - "16:54:00 restore lens_stop_above_steps='20' -> 200", - "16:54:00 restore laser_floor_density='12' -> 200", - "16:54:00 restore laser_dose_curve='10:0.44,20:2.98,30:9.31,45:26.26,60:45.50,80:57.30,100:100.00' -> 200", - "16:54:00 restore laser_corner_gamma='1.50' -> 200", - "16:54:00 restore cool_laser_heat_density='2.144e-05' -> 200", - "16:54:00 restore cool_laser_heat_cw='2.784e-05' -> 200", - "16:54:00 PASS: the sheet's seven wizards ran on one piece; settings restored", - "16:54:01 baseline: post: clean", - "16:54:01 result PASS" + "21:27:32 start commission.sheet (live, takeover) in campaign c-20260909204732-3fa9", + "21:27:32 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:27:32 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "21:27:32 queued by the attended queue opened 2026-09-09T21:25:38Z", + "21:27:32 baseline: pre: clean", + "21:27:32 mode: test needs grbl - already in grbl mode", + "21:27:32 NOTICE: The sheet: the placement, then the frame and the five cards burn after a press each. The bench presses when the button lights. Then press the button on the machine to start.", + "21:27:32 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", + "21:27:45 READY: operator present (press after 12.0 s); the bench takes the presses", + "21:27:45 POST /wiz/sheet.place/start -> 200 {'started': True, 'id': 'sheet.place'}", + "21:27:45 sheet.place: stopping the motion controller", + "21:27:46 sheet.place: the lens finds its reference on the hall sensor", + "21:27:47 sheet.place: the lens finds its reference on the hall sensor: pass 1 of 2", + "21:27:48 sheet.place: the lens finds its reference on the hall sensor: pass 2 of 2", + "21:27:49 sheet.place: the cooling engine takes the controller's report: 0 s (20 at most)", + "21:27:56 sheet.place: placing the sheet", + "21:27:56 prompt place (jog): The head should be at the back-left, where the machine normally homes; the arrows move it (lid closed). Then open the lid, push the sheet as far left as it goes with its top edge on the top of the cut area, close the lid, and set the origin.", + "21:27:57 prompt place (jog): The head should be at the back-left, where the machine normally homes; the arrows move it (lid closed). Then open the lid, push the sheet as far left as it goes with its top edge on the top of the cut area, close the lid, and set the origin.", + "21:27:58 prompt place (jog): The head should be at the back-left, where the machine normally homes; the arrows move it (lid closed). Then open the lid, push the sheet as far left as it goes with its top edge on the top of the cut area, close the lid, and set the origin.", + "21:27:59 prompt sheet-kind (choice): Is this the full commissioning sheet (8 x 6 in or more), or a smaller piece for one card?", + "21:28:00 prompt thickness (number): The thickness of the sheet in inches.", + "21:28:01 placed: datum at 0, 0; steps per mm {'x': 53.333, 'y': 53.333, 'z': 2.922}", + "21:28:01 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", + "21:28:01 POST /wiz/sheet.frame/start -> 200 {'started': True, 'id': 'sheet.frame'}", + "21:28:01 sheet.frame: stopping the motion controller", + "21:28:01 ARM press by the fixture, button lit after 0.5 s", + "21:28:02 sheet.frame: the lens finds its reference on the hall sensor", + "21:28:03 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:28:03 sheet.frame: the lens finds its reference on the hall sensor: pass 1 of 2", + "21:28:04 sheet.frame: the lens finds its reference on the hall sensor: pass 2 of 2", + "21:28:05 sheet.frame: the cooling engine takes the controller's report: 0 s (20 at most)", + "21:28:07 prompt frame-arm (continue): The frame and the header burn now: 7.1 x 5.1 in at the mark dose. Eye protection on, exhaust on, lid closed. Continue, then press the machine's button when it lights white; this page says when.", + "21:28:08 sheet.frame: the program goes to the controller, the button lights at the arm", + "21:28:09 sheet.frame: the button is lit: press it now (0 s; the job waits 599 at most)", + "21:28:09 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.", + "21:28:10 sheet.frame: the button is lit: press it now (1 s; the job waits 599 at most)", + "21:28:11 sheet.frame: the button is lit: press it now (2 s; the job waits 599 at most)", + "21:28:12 sheet.frame: the button is lit: press it now (3 s; the job waits 599 at most)", + "21:28:13 sheet.frame: the button is lit: press it now (4 s; the job waits 599 at most)", + "21:28:14 sheet.frame: the button is lit: press it now (5 s; the job waits 599 at most)", + "21:28:15 sheet.frame: the button is lit: press it now (6 s; the job waits 599 at most)", + "21:28:16 sheet.frame: the button is lit: press it now (7 s; the job waits 599 at most)", + "21:28:17 sheet.frame: the button is lit: press it now (8 s; the job waits 599 at most)", + "21:28:18 sheet.frame: burning: 1 s lit", + "21:28:19 sheet.frame: burning: 2 s lit", + "21:28:20 sheet.frame: burning: 3 s lit", + "21:28:21 sheet.frame: burning: 4 s lit", + "21:28:22 sheet.frame: burning: 5 s lit", + "21:28:23 sheet.frame: burning: 6 s lit", + "21:28:24 sheet.frame: burning: 7 s lit", + "21:28:25 sheet.frame: burning: 8 s lit", + "21:28:26 sheet.frame: burning: 9 s lit", + "21:28:27 sheet.frame: burning: 10 s lit", + "21:28:28 sheet.frame: burning: 11 s lit", + "21:28:29 sheet.frame: burning: 12 s lit", + "21:28:30 sheet.frame: burning: 0 s lit", + "21:28:33 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:28:35 sheet.frame: burning: the tube is between passes", + "21:28:36 sheet.frame: burning: 0 s lit", + "21:28:37 sheet.frame: burning: the tube is between passes", + "21:28:38 sheet.frame: burning: 0 s lit", + "21:28:39 sheet.frame: burning: the tube is between passes", + "21:28:41 sheet.frame: burning: 0 s lit", + "21:28:44 sheet.frame: burning: the tube is between passes", + "21:28:48 sheet.frame: burning: 0 s lit", + "21:28:50 sheet.frame: burning: the tube is between passes", + "21:28:51 sheet.frame: burning: 0 s lit", + "21:28:54 sheet.frame: burning: the tube is between passes", + "21:28:56 sheet.frame: burning: 0 s lit", + "21:29:03 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:29:08 sheet.frame: burning: the tube is between passes", + "21:29:09 sheet.frame: burning: 0 s lit", + "21:29:12 sheet.frame: burning: the tube is between passes", + "21:29:13 sheet.frame: burning: 0 s lit", + "21:29:18 sheet.frame: burning: the tube is between passes", + "21:29:20 sheet.frame: burning: 0 s lit", + "21:29:22 sheet.frame: burning: the tube is between passes", + "21:29:23 sheet.frame: burning: 0 s lit", + "21:29:24 sheet.frame: burning: the tube is between passes", + "21:29:25 sheet.frame: burning: 0 s lit", + "21:29:26 sheet.frame: burning: the tube is between passes", + "21:29:27 sheet.frame: burning: 0 s lit", + "21:29:29 sheet.frame: burning: the tube is between passes", + "21:29:32 sheet.frame: burning: 0 s lit", + "21:29:34 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:29:40 sheet.frame: burning: the tube is between passes", + "21:29:42 sheet.frame: the tube is dark: the pulse engine plays the rest", + "21:29:42 prompt frame-ok (choice): Is the frame on the sheet, square, and visible? Look, but do not move the sheet: every card after this is placed from the same datum.", + "21:29:43 sheet.frame: {'mark_s': 400, 'mark_feed': 3000}, emission {'hv_max': 1023, 'laser_on_samples': 154, 'thermopile_delta': 919, 'lit_s': 82.16030385400063}", + "21:29:43 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", + "21:29:43 POST /wiz/laser.focus/start -> 200 {'started': True, 'id': 'laser.focus'}", + "21:29:43 laser.focus: stopping the motion controller", + "21:29:43 ARM press by the fixture, button lit after 0.3 s", + "21:29:44 laser.focus: the lens finds its reference on the hall sensor", + "21:29:46 laser.focus: the lens finds its reference on the hall sensor: pass 1 of 2", + "21:29:47 laser.focus: the lens finds its reference on the hall sensor: pass 2 of 2", + "21:29:48 laser.focus: the fans stop before the listening: 0 s of 10", + "21:29:49 laser.focus: the fans stop before the listening: 1 s of 10", + "21:29:50 laser.focus: the fans stop before the listening: 2 s of 10", + "21:29:51 laser.focus: the fans stop before the listening: 3 s of 10", + "21:29:52 laser.focus: the fans stop before the listening: 4 s of 10", + "21:29:53 laser.focus: the fans stop before the listening: 5 s of 10", + "21:29:54 laser.focus: the fans stop before the listening: 6 s of 10", + "21:29:55 laser.focus: the fans stop before the listening: 7 s of 10", + "21:29:56 laser.focus: the fans stop before the listening: 8 s of 10", + "21:29:57 laser.focus: the fans stop before the listening: 9 s of 10", + "21:29:58 laser.focus: finding the bottom stop by the head accelerometer: 4 half-steps below the edge", + "21:29:59 laser.focus: finding the bottom stop by the head accelerometer: 10 half-steps below the edge", + "21:30:00 laser.focus: finding the bottom stop by the head accelerometer: 15 half-steps below the edge", + "21:30:01 laser.focus: finding the bottom stop by the head accelerometer: 16 half-steps below the edge", + "21:30:04 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:30:04 laser.focus: finding the top stop by the head accelerometer: 6 half-steps above the edge", + "21:30:05 laser.focus: finding the top stop by the head accelerometer: 11 half-steps above the edge", + "21:30:06 laser.focus: finding the top stop by the head accelerometer: 17 half-steps above the edge", + "21:30:07 laser.focus: finding the top stop by the head accelerometer: 22 half-steps above the edge", + "21:30:13 laser.focus: the cooling engine takes the controller's report: 0 s (20 at most)", + "21:30:14 prompt focus-arm (continue): The lens is on its hall reference. Its stops were found by the head accelerometer, 14 half-steps below the reference and 20 above, without a slip. Twelve 1.772 in lines burn heavy, the lens stepped from 0.269 in above the reference to 0.189 in below it. Lid closed. Continue, then press the button when it lights white;", + "21:30:15 laser.focus: the program goes to the controller, the button lights at the arm", + "21:30:16 laser.focus: the button is lit: press it now (0 s; the job waits 599 at most)", + "21:30:16 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.", + "21:30:17 laser.focus: the button is lit: press it now (1 s; the job waits 599 at most)", + "21:30:18 laser.focus: the button is lit: press it now (2 s; the job waits 599 at most)", + "21:30:19 laser.focus: the button is lit: press it now (3 s; the job waits 599 at most)", + "21:30:20 laser.focus: the button is lit: press it now (4 s; the job waits 599 at most)", + "21:30:21 laser.focus: the button is lit: press it now (5 s; the job waits 599 at most)", + "21:30:22 laser.focus: the button is lit: press it now (6 s; the job waits 599 at most)", + "21:30:23 laser.focus: the button is lit: press it now (7 s; the job waits 599 at most)", + "21:30:24 laser.focus: the button is lit: press it now (8 s; the job waits 599 at most)", + "21:30:25 laser.focus: burning: 1 s lit", + "21:30:26 laser.focus: burning: 2 s lit", + "21:30:27 laser.focus: burning: 3 s lit", + "21:30:28 laser.focus: burning: 4 s lit", + "21:30:29 laser.focus: burning: the tube is between passes", + "21:30:31 laser.focus: burning: 0 s lit", + "21:30:34 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:30:34 laser.focus: burning: the tube is between passes", + "21:30:36 laser.focus: burning: 0 s lit", + "21:30:38 laser.focus: burning: the tube is between passes", + "21:30:41 laser.focus: burning: 1 s lit", + "21:30:42 laser.focus: burning: 2 s lit", + "21:30:43 laser.focus: burning: 0 s lit", + "21:30:45 laser.focus: burning: 1 s lit", + "21:30:46 laser.focus: burning: the tube is between passes", + "21:30:47 laser.focus: burning: 0 s lit", + "21:30:48 laser.focus: burning: 1 s lit", + "21:30:49 laser.focus: burning: the tube is between passes", + "21:30:50 laser.focus: burning: 1 s lit", + "21:30:51 laser.focus: burning: the tube is between passes", + "21:30:52 laser.focus: burning: 0 s lit", + "21:30:53 laser.focus: burning: 1 s lit", + "21:30:54 laser.focus: burning: the tube is between passes", + "21:30:55 laser.focus: burning: 1 s lit", + "21:30:56 laser.focus: burning: 2 s lit", + "21:30:57 laser.focus: burning: 0 s lit", + "21:30:58 laser.focus: burning: 1 s lit", + "21:30:59 laser.focus: burning: the tube is between passes", + "21:31:00 laser.focus: burning: 0 s lit", + "21:31:01 laser.focus: burning: 1 s lit", + "21:31:02 laser.focus: burning: the tube is between passes", + "21:31:03 laser.focus: burning: 1 s lit", + "21:31:04 laser.focus: burning: the tube is between passes", + "21:31:04 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:31:05 laser.focus: burning: 0 s lit", + "21:31:06 laser.focus: burning: 1 s lit", + "21:31:07 laser.focus: burning: the tube is between passes", + "21:31:08 laser.focus: burning: 1 s lit", + "21:31:09 laser.focus: burning: 2 s lit", + "21:31:10 laser.focus: burning: 0 s lit", + "21:31:11 laser.focus: burning: 1 s lit", + "21:31:12 laser.focus: burning: the tube is between passes", + "21:31:15 laser.focus: the tube is dark: the pulse engine plays the rest", + "21:31:15 prompt focus-pick (multichoice): Every line is dark. Which is the narrowest dark line, with the crispest edges? Count from the top, 1 to 12. Several adjacent lines can look the same, since the depth of focus spans a few of them: choose every one that does, and the middle of the run is taken. Then Done. Look, but do not move the sheet: every card afte", + "21:31:16 prompt thickness (number): The sheet thickness (0.125 in from the placement).", + "21:31:17 laser.focus: {'pick': 11.0, 'thickness_mm': 3.175, 'pick_half_steps': -11.0, 'edge_z_mm': 6.939544832306639, 'steps_per_mm': 2.922, 'max_height_mm': 13.784171800136892, 'focus_range_mm': {'min': 2.148305954825462, 'max': 13.784171800136892}, 'stops': {'found': True, 'below': 14, 'above': 20, 'contact_below': 16, 'contact_above': 22, 'why': ''}}, emission {'hv_max': 1023, 'laser_on_samples': 234, 'thermopile_delta': 1489, 'lit_s': 47.36215806200016}", + "21:31:17 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", + "21:31:17 POST /wiz/laser.floor/start -> 200 {'started': True, 'id': 'laser.floor'}", + "21:31:17 laser.floor: stopping the motion controller", + "21:31:17 ARM press by the fixture, button lit after 0.3 s", + "21:31:18 laser.floor: the lens finds its reference on the hall sensor", + "21:31:20 laser.floor: the lens finds its reference on the hall sensor: pass 1 of 2", + "21:31:21 laser.floor: the lens finds its reference on the hall sensor: pass 2 of 2", + "21:31:23 laser.floor: the cooling engine takes the controller's report: 0 s (20 at most)", + "21:31:25 prompt floor-arm (continue): Twelve 2.087 in rungs from 2 to 24 percent density, the floor and the dose curve off for the rungs. Lid closed. Continue, then press the button when it lights white; this page says when.", + "21:31:26 laser.floor: the program goes to the controller, the button lights at the arm", + "21:31:27 laser.floor: the button is lit: press it now (0 s; the job waits 599 at most)", + "21:31:27 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.", + "21:31:28 laser.floor: the button is lit: press it now (1 s; the job waits 599 at most)", + "21:31:29 laser.floor: the button is lit: press it now (2 s; the job waits 599 at most)", + "21:31:30 laser.floor: the button is lit: press it now (3 s; the job waits 599 at most)", + "21:31:31 laser.floor: the button is lit: press it now (4 s; the job waits 599 at most)", + "21:31:32 laser.floor: the button is lit: press it now (5 s; the job waits 599 at most)", + "21:31:33 laser.floor: the button is lit: press it now (6 s; the job waits 599 at most)", + "21:31:34 laser.floor: the button is lit: press it now (7 s; the job waits 599 at most)", + "21:31:35 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:31:35 laser.floor: burning: 0 s lit", + "21:31:36 laser.floor: burning: 2 s lit", + "21:31:37 laser.floor: burning: 3 s lit", + "21:31:38 laser.floor: burning: 4 s lit", + "21:31:39 laser.floor: burning: 5 s lit", + "21:31:40 laser.floor: burning: 0 s lit", + "21:31:42 laser.floor: burning: the tube is between passes", + "21:31:43 laser.floor: burning: 0 s lit", + "21:31:44 laser.floor: burning: the tube is between passes", + "21:31:45 laser.floor: burning: 0 s lit", + "21:31:48 laser.floor: burning: the tube is between passes", + "21:31:50 laser.floor: burning: 0 s lit", + "21:31:52 laser.floor: burning: the tube is between passes", + "21:32:02 laser.floor: burning: 0 s lit", + "21:32:03 laser.floor: burning: the tube is between passes", + "21:32:05 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:32:09 laser.floor: burning: 0 s lit", + "21:32:11 laser.floor: burning: the tube is between passes", + "21:32:12 laser.floor: burning: 0 s lit", + "21:32:15 laser.floor: burning: the tube is between passes", + "21:32:17 laser.floor: burning: 0 s lit", + "21:32:18 laser.floor: burning: the tube is between passes", + "21:32:19 laser.floor: burning: 1 s lit", + "21:32:20 laser.floor: burning: 0 s lit", + "21:32:31 laser.floor: burning: 1 s lit", + "21:32:32 laser.floor: burning: 0 s lit", + "21:32:33 laser.floor: burning: the tube is between passes", + "21:32:34 laser.floor: burning: 0 s lit", + "21:32:36 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:32:37 laser.floor: burning: 1 s lit", + "21:32:38 laser.floor: burning: 2 s lit", + "21:32:39 laser.floor: burning: 3 s lit", + "21:32:40 laser.floor: burning: 4 s lit", + "21:32:41 laser.floor: burning: the tube is between passes", + "21:32:42 laser.floor: burning: 0 s lit", + "21:32:43 laser.floor: burning: 1 s lit", + "21:32:44 laser.floor: burning: 2 s lit", + "21:32:45 laser.floor: burning: 3 s lit", + "21:32:46 laser.floor: burning: 4 s lit", + "21:32:47 laser.floor: burning: the tube is between passes", + "21:32:48 laser.floor: burning: 0 s lit", + "21:32:49 laser.floor: burning: 1 s lit", + "21:32:50 laser.floor: burning: 2 s lit", + "21:32:51 laser.floor: burning: 3 s lit", + "21:32:52 laser.floor: burning: 4 s lit", + "21:32:53 laser.floor: burning: the tube is between passes", + "21:32:54 laser.floor: burning: 0 s lit", + "21:32:55 laser.floor: burning: 1 s lit", + "21:32:56 laser.floor: burning: 2 s lit", + "21:32:57 laser.floor: burning: 3 s lit", + "21:32:58 laser.floor: burning: 4 s lit", + "21:32:59 laser.floor: burning: the tube is between passes", + "21:33:00 laser.floor: burning: 0 s lit", + "21:33:01 laser.floor: burning: 1 s lit", + "21:33:02 laser.floor: burning: 2 s lit", + "21:33:03 laser.floor: burning: 3 s lit", + "21:33:04 laser.floor: burning: 4 s lit", + "21:33:05 laser.floor: burning: the tube is between passes", + "21:33:06 laser.floor: the tube is dark: the samples run on, 1 s more", + "21:33:07 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:33:07 laser.floor: the tube is dark: the pulse engine plays the rest", + "21:33:08 prompt floor-pick (choice): Which is the faintest rung that shows a continuous line? The labels are the percent density; the top rung is 2. Look, but do not move the sheet: every card after this is placed from the same datum.", + "21:33:09 laser.floor: {'faintest_density': 8.0, 'floor_density': 10.0}, emission {'hv_max': 1023, 'laser_on_samples': 141, 'thermopile_delta': 862, 'lit_s': 90.98896351100029}", + "21:33:09 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", + "21:33:09 POST /wiz/laser.dose-curve/start -> 200 {'started': True, 'id': 'laser.dose-curve'}", + "21:33:09 laser.dose-curve: stopping the motion controller", + "21:33:09 ARM press by the fixture, button lit after 0.3 s", + "21:33:10 laser.dose-curve: the lens finds its reference on the hall sensor", + "21:33:12 laser.dose-curve: the lens finds its reference on the hall sensor: pass 1 of 2", + "21:33:13 laser.dose-curve: the lens finds its reference on the hall sensor: pass 2 of 2", + "21:33:14 laser.dose-curve: the cooling engine takes the controller's report: 0 s (20 at most)", + "21:33:15 prompt dose-arm (continue): Seven 100 mm rungs from 10 to 100 percent density, the thermopile reading each. The curve fits itself. Lid closed. Continue, then press the button when it lights white; this page says when.", + "21:33:16 laser.dose-curve: the program goes to the controller, the button lights at the arm", + "21:33:17 laser.dose-curve: the button is lit: press it now (0 s; the job waits 599 at most)", + "21:33:17 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.", + "21:33:18 laser.dose-curve: the button is lit: press it now (1 s; the job waits 599 at most)", + "21:33:19 laser.dose-curve: the button is lit: press it now (2 s; the job waits 599 at most)", + "21:33:20 laser.dose-curve: the button is lit: press it now (3 s; the job waits 599 at most)", + "21:33:21 laser.dose-curve: the button is lit: press it now (4 s; the job waits 599 at most)", + "21:33:22 laser.dose-curve: the button is lit: press it now (5 s; the job waits 599 at most)", + "21:33:23 laser.dose-curve: the button is lit: press it now (6 s; the job waits 599 at most)", + "21:33:24 laser.dose-curve: the button is lit: press it now (7 s; the job waits 599 at most)", + "21:33:25 laser.dose-curve: burning: 1 s lit", + "21:33:26 laser.dose-curve: burning: 2 s lit", + "21:33:27 laser.dose-curve: burning: 0 s lit", + "21:33:28 laser.dose-curve: burning: 2 s lit", + "21:33:29 laser.dose-curve: burning: 3 s lit", + "21:33:30 laser.dose-curve: burning: 0 s lit", + "21:33:37 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:33:37 laser.dose-curve: burning: the tube is between passes", + "21:33:38 laser.dose-curve: burning: 0 s lit", + "21:33:43 laser.dose-curve: burning: the tube is between passes", + "21:33:46 laser.dose-curve: burning: 0 s lit", + "21:33:52 laser.dose-curve: burning: the tube is between passes", + "21:33:54 laser.dose-curve: burning: 0 s lit", + "21:33:56 laser.dose-curve: burning: the tube is between passes", + "21:33:59 laser.dose-curve: burning: 0 s lit", + "21:34:00 laser.dose-curve: burning: 1 s lit", + "21:34:01 laser.dose-curve: burning: 2 s lit", + "21:34:02 laser.dose-curve: burning: 3 s lit", + "21:34:03 laser.dose-curve: burning: 4 s lit", + "21:34:04 laser.dose-curve: burning: 5 s lit", + "21:34:05 laser.dose-curve: burning: 6 s lit", + "21:34:06 laser.dose-curve: burning: 7 s lit", + "21:34:07 laser.dose-curve: burning: 8 s lit", + "21:34:08 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:34:08 laser.dose-curve: burning: 9 s lit", + "21:34:09 laser.dose-curve: burning: the tube is between passes", + "21:34:12 laser.dose-curve: burning: 0 s lit", + "21:34:13 laser.dose-curve: burning: 1 s lit", + "21:34:14 laser.dose-curve: burning: 2 s lit", + "21:34:15 laser.dose-curve: burning: 3 s lit", + "21:34:16 laser.dose-curve: burning: 4 s lit", + "21:34:17 laser.dose-curve: burning: 5 s lit", + "21:34:18 laser.dose-curve: burning: 6 s lit", + "21:34:19 laser.dose-curve: burning: 7 s lit", + "21:34:20 laser.dose-curve: burning: 8 s lit", + "21:34:21 laser.dose-curve: burning: 9 s lit", + "21:34:22 laser.dose-curve: burning: the tube is between passes", + "21:34:26 laser.dose-curve: burning: 0 s lit", + "21:34:27 laser.dose-curve: burning: 1 s lit", + "21:34:28 laser.dose-curve: burning: 2 s lit", + "21:34:29 laser.dose-curve: burning: 3 s lit", + "21:34:30 laser.dose-curve: burning: 4 s lit", + "21:34:31 laser.dose-curve: burning: 5 s lit", + "21:34:32 laser.dose-curve: burning: 6 s lit", + "21:34:33 laser.dose-curve: burning: 7 s lit", + "21:34:34 laser.dose-curve: burning: 8 s lit", + "21:34:35 laser.dose-curve: burning: 9 s lit", + "21:34:36 laser.dose-curve: burning: the tube is between passes", + "21:34:38 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:34:39 laser.dose-curve: burning: 0 s lit", + "21:34:40 laser.dose-curve: burning: 1 s lit", + "21:34:41 laser.dose-curve: burning: 2 s lit", + "21:34:42 laser.dose-curve: burning: 3 s lit", + "21:34:43 laser.dose-curve: burning: 4 s lit", + "21:34:44 laser.dose-curve: burning: 5 s lit", + "21:34:45 laser.dose-curve: burning: 6 s lit", + "21:34:46 laser.dose-curve: burning: 7 s lit", + "21:34:47 laser.dose-curve: burning: 8 s lit", + "21:34:48 laser.dose-curve: burning: 9 s lit", + "21:34:49 laser.dose-curve: burning: the tube is between passes", + "21:34:52 laser.dose-curve: burning: 0 s lit", + "21:34:53 laser.dose-curve: burning: 1 s lit", + "21:34:54 laser.dose-curve: burning: 2 s lit", + "21:34:55 laser.dose-curve: burning: 3 s lit", + "21:34:56 laser.dose-curve: burning: 4 s lit", + "21:34:57 laser.dose-curve: burning: 5 s lit", + "21:34:58 laser.dose-curve: burning: 6 s lit", + "21:34:59 laser.dose-curve: burning: 7 s lit", + "21:35:00 laser.dose-curve: burning: 8 s lit", + "21:35:01 laser.dose-curve: burning: 9 s lit", + "21:35:02 laser.dose-curve: burning: the tube is between passes", + "21:35:05 laser.dose-curve: burning: 0 s lit", + "21:35:06 laser.dose-curve: burning: 1 s lit", + "21:35:07 laser.dose-curve: burning: 2 s lit", + "21:35:08 laser.dose-curve: burning: 3 s lit", + "21:35:09 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:35:09 laser.dose-curve: burning: 4 s lit", + "21:35:10 laser.dose-curve: burning: 5 s lit", + "21:35:11 laser.dose-curve: burning: 6 s lit", + "21:35:12 laser.dose-curve: burning: 7 s lit", + "21:35:13 laser.dose-curve: burning: 8 s lit", + "21:35:14 laser.dose-curve: burning: 9 s lit", + "21:35:15 laser.dose-curve: burning: the tube is between passes", + "21:35:18 laser.dose-curve: the tube is dark: the fit needs the dark tail, 17 s more", + "21:35:19 laser.dose-curve: the tube is dark: the fit needs the dark tail, 16 s more", + "21:35:20 laser.dose-curve: the tube is dark: the fit needs the dark tail, 15 s more", + "21:35:21 laser.dose-curve: the tube is dark: the fit needs the dark tail, 14 s more", + "21:35:22 laser.dose-curve: the tube is dark: the fit needs the dark tail, 13 s more", + "21:35:23 laser.dose-curve: the tube is dark: the fit needs the dark tail, 12 s more", + "21:35:24 laser.dose-curve: the tube is dark: the fit needs the dark tail, 11 s more", + "21:35:25 laser.dose-curve: the tube is dark: the fit needs the dark tail, 9 s more", + "21:35:26 laser.dose-curve: the tube is dark: the fit needs the dark tail, 8 s more", + "21:35:27 laser.dose-curve: the tube is dark: the fit needs the dark tail, 7 s more", + "21:35:28 laser.dose-curve: the tube is dark: the fit needs the dark tail, 6 s more", + "21:35:29 laser.dose-curve: the tube is dark: the fit needs the dark tail, 5 s more", + "21:35:30 laser.dose-curve: the tube is dark: the fit needs the dark tail, 4 s more", + "21:35:31 laser.dose-curve: the tube is dark: the fit needs the dark tail, 3 s more", + "21:35:32 laser.dose-curve: the tube is dark: the fit needs the dark tail, 2 s more", + "21:35:33 laser.dose-curve: the tube is dark: the fit needs the dark tail, 1 s more", + "21:35:35 laser.dose-curve: the tube is dark: the fit needs the dark tail, 0 s more", + "21:35:37 laser.dose-curve: the machine goes back to its normal posture", + "21:35:39 laser.dose-curve: {'points': [{'density': 10.0, 'light': 0.6766890992084529}, {'density': 20.0, 'light': 2.8297303390001796}, {'density': 30.0, 'light': 9.09286082209558}, {'density': 45.0, 'light': 24.016003898180884}, {'density': 60.0, 'light': 37.126334461791224}, {'density': 80.0, 'light': 47.17385976777021}, {'density': 100.0, 'light': 100.0}], 'curve': '10:0.68,20:2.83,30:9.09,45:24.02,60:37.13,80:47.17,100:100.00'}, emission {'hv_max': 1023, 'laser_on_samples': 255, 'thermopile_delta': 2260, 'lit_s': 110.959464992}", + "21:35:39 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", + "21:35:39 POST /wiz/laser.corner/start -> 200 {'started': True, 'id': 'laser.corner'}", + "21:35:39 laser.corner: stopping the motion controller", + "21:35:39 ARM press by the fixture, button lit after 0.3 s", + "21:35:40 laser.corner: the lens finds its reference on the hall sensor", + "21:35:40 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:35:42 laser.corner: the lens finds its reference on the hall sensor: pass 1 of 2", + "21:35:43 laser.corner: the lens finds its reference on the hall sensor: pass 2 of 2", + "21:35:44 laser.corner: the cooling engine takes the controller's report: 0 s (20 at most)", + "21:35:46 prompt corner-arm (continue): The same corner-heavy pattern five times at rolloff exponents 1.0 to 2.0 under velocity-scaled power at 30 percent. Lid closed. Continue, then press the button when it lights white; this page says when.", + "21:35:47 laser.corner: the program goes to the controller, the button lights at the arm", + "21:35:48 laser.corner: the button is lit: press it now (0 s; the job waits 599 at most)", + "21:35:48 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.", + "21:35:49 laser.corner: the button is lit: press it now (1 s; the job waits 599 at most)", + "21:35:50 laser.corner: the button is lit: press it now (2 s; the job waits 599 at most)", + "21:35:51 laser.corner: the button is lit: press it now (3 s; the job waits 599 at most)", + "21:35:52 laser.corner: the button is lit: press it now (4 s; the job waits 599 at most)", + "21:35:53 laser.corner: the button is lit: press it now (5 s; the job waits 599 at most)", + "21:35:54 laser.corner: the button is lit: press it now (6 s; the job waits 599 at most)", + "21:35:55 laser.corner: the button is lit: press it now (7 s; the job waits 599 at most)", + "21:35:56 laser.corner: the button is lit: press it now (8 s; the job waits 599 at most)", + "21:35:57 laser.corner: the button is lit: press it now (9 s; the job waits 599 at most)", + "21:35:58 laser.corner: the button is lit: press it now (10 s; the job waits 599 at most)", + "21:35:59 laser.corner: the button is lit: press it now (11 s; the job waits 599 at most)", + "21:36:00 laser.corner: the button is lit: press it now (12 s; the job waits 599 at most)", + "21:36:01 laser.corner: the button is lit: press it now (13 s; the job waits 599 at most)", + "21:36:02 laser.corner: the button is lit: press it now (14 s; the job waits 599 at most)", + "21:36:03 laser.corner: the button is lit: press it now (15 s; the job waits 599 at most)", + "21:36:04 laser.corner: the button is lit: press it now (17 s; the job waits 599 at most)", + "21:36:05 laser.corner: the button is lit: press it now (18 s; the job waits 599 at most)", + "21:36:06 laser.corner: burning: 0 s lit", + "21:36:07 laser.corner: burning: 1 s lit", + "21:36:08 laser.corner: burning: 2 s lit", + "21:36:09 laser.corner: burning: 3 s lit", + "21:36:10 laser.corner: burning: the tube is between passes", + "21:36:11 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:36:12 laser.corner: burning: 0 s lit", + "21:36:15 laser.corner: burning: the tube is between passes", + "21:36:17 laser.corner: burning: 0 s lit", + "21:36:21 laser.corner: burning: the tube is between passes", + "21:36:22 laser.corner: burning: 0 s lit", + "21:36:24 laser.corner: burning: the tube is between passes", + "21:36:25 laser.corner: burning: 1 s lit", + "21:36:26 laser.corner: burning: the tube is between passes", + "21:36:27 laser.corner: burning: 0 s lit", + "21:36:28 laser.corner: burning: 1 s lit", + "21:36:29 laser.corner: burning: the tube is between passes", + "21:36:30 laser.corner: burning: 1 s lit", + "21:36:31 laser.corner: burning: the tube is between passes", + "21:36:32 laser.corner: burning: 0 s lit", + "21:36:33 laser.corner: burning: 1 s lit", + "21:36:34 laser.corner: burning: the tube is between passes", + "21:36:35 laser.corner: burning: 0 s lit", + "21:36:36 laser.corner: burning: 1 s lit", + "21:36:37 laser.corner: burning: the tube is between passes", + "21:36:39 laser.corner: the tube is dark: the pulse engine plays the rest", + "21:36:40 prompt corner-pick (choice): Which pattern has the most even corners, neither burned dark nor faded, through the teeth, the square, and the root sign at the end? The top pattern is 1.00. Look, but do not move the sheet: every card after this is placed from the same datum.", + "21:36:41 laser.corner: {'gamma': 1.5}, emission {'hv_max': 1023, 'laser_on_samples': 153, 'thermopile_delta': 1040, 'lit_s': 31.033151726999677}", + "21:36:41 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", + "21:36:41 POST /wiz/cooling.flow-load/start -> 200 {'started': True, 'id': 'cooling.flow-load'}", + "21:36:41 cooling.flow-load: stopping the motion controller", + "21:36:42 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:36:42 ARM press by the fixture, button lit after 0.5 s", + "21:36:42 cooling.flow-load: the lens finds its reference on the hall sensor", + "21:36:44 cooling.flow-load: the lens finds its reference on the hall sensor: pass 1 of 2", + "21:36:45 cooling.flow-load: the lens finds its reference on the hall sensor: pass 2 of 2", + "21:36:46 cooling.flow-load: the cooling engine takes the controller's report: 0 s (20 at most)", + "21:36:48 cooling.flow-load: the coolant loop settles before the press: 0 s (60 at least, 240 at most), reading the sensors", + "21:36:49 cooling.flow-load: the coolant loop settles before the press: 1 s (60 at least, 240 at most), reading the sensors", + "21:36:50 cooling.flow-load: the coolant loop settles before the press: 2 s (60 at least, 240 at most), reading the sensors", + "21:36:51 cooling.flow-load: the coolant loop settles before the press: 3 s (60 at least, 240 at most), reading the sensors", + "21:36:52 cooling.flow-load: the coolant loop settles before the press: 4 s (60 at least, 240 at most), reading the sensors", + "21:36:53 cooling.flow-load: the coolant loop settles before the press: 5 s (60 at least, 240 at most), reading the sensors", + "21:36:54 cooling.flow-load: the coolant loop settles before the press: 6 s (60 at least, 240 at most), reading the sensors", + "21:36:55 cooling.flow-load: the coolant loop settles before the press: 7 s (60 at least, 240 at most), reading the sensors", + "21:36:56 cooling.flow-load: the coolant loop settles before the press: 8 s (60 at least, 240 at most), reading the sensors", + "21:36:57 cooling.flow-load: the coolant loop settles before the press: 9 s (60 at least, 240 at most), reading the sensors", + "21:36:58 cooling.flow-load: the coolant loop settles before the press: 10 s (60 at least, 240 at most), reading the sensors", + "21:36:59 cooling.flow-load: the coolant loop settles before the press: 11 s (60 at least, 240 at most), reading the sensors", + "21:37:00 cooling.flow-load: the coolant loop settles before the press: 12 s (60 at least, 240 at most), reading the sensors", + "21:37:01 cooling.flow-load: the coolant loop settles before the press: 13 s (60 at least, 240 at most), reading the sensors", + "21:37:02 cooling.flow-load: the coolant loop settles before the press: 14 s (60 at least, 240 at most), reading the sensors", + "21:37:03 cooling.flow-load: the coolant loop settles before the press: 15 s (60 at least, 240 at most), reading the sensors", + "21:37:04 cooling.flow-load: the coolant loop settles before the press: 16 s (60 at least, 240 at most), reading the sensors", + "21:37:05 cooling.flow-load: the coolant loop settles before the press: 17 s (60 at least, 240 at most), reading the sensors", + "21:37:06 cooling.flow-load: the coolant loop settles before the press: 18 s (60 at least, 240 at most), reading the sensors", + "21:37:07 cooling.flow-load: the coolant loop settles before the press: 19 s (60 at least, 240 at most), reading the sensors", + "21:37:08 cooling.flow-load: the coolant loop settles before the press: 20 s (60 at least, 240 at most), reading the sensors", + "21:37:09 cooling.flow-load: the coolant loop settles before the press: 21 s (60 at least, 240 at most), reading the sensors", + "21:37:10 cooling.flow-load: the coolant loop settles before the press: 22 s (60 at least, 240 at most), reading the sensors", + "21:37:11 cooling.flow-load: the coolant loop settles before the press: 23 s (60 at least, 240 at most), reading the sensors", + "21:37:12 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:37:12 cooling.flow-load: the coolant loop settles before the press: 24 s (60 at least, 240 at most), reading the sensors", + "21:37:13 cooling.flow-load: the coolant loop settles before the press: 25 s (60 at least, 240 at most), reading the sensors", + "21:37:14 cooling.flow-load: the coolant loop settles before the press: 26 s (60 at least, 240 at most), reading the sensors", + "21:37:15 cooling.flow-load: the coolant loop settles before the press: 27 s (60 at least, 240 at most), reading the sensors", + "21:37:16 cooling.flow-load: the coolant loop settles before the press: 28 s (60 at least, 240 at most), reading the sensors", + "21:37:17 cooling.flow-load: the coolant loop settles before the press: 29 s (60 at least, 240 at most), drifting -0.171 C p", + "21:37:18 cooling.flow-load: the coolant loop settles before the press: 30 s (60 at least, 240 at most), drifting -0.143 C p", + "21:37:19 cooling.flow-load: the coolant loop settles before the press: 31 s (60 at least, 240 at most), drifting -0.126 C p", + "21:37:20 cooling.flow-load: the coolant loop settles before the press: 32 s (60 at least, 240 at most), drifting -0.114 C p", + "21:37:21 cooling.flow-load: the coolant loop settles before the press: 33 s (60 at least, 240 at most), drifting -0.100 C p", + "21:37:22 cooling.flow-load: the coolant loop settles before the press: 34 s (60 at least, 240 at most), drifting -0.087 C p", + "21:37:23 cooling.flow-load: the coolant loop settles before the press: 35 s (60 at least, 240 at most), drifting -0.079 C p", + "21:37:24 cooling.flow-load: the coolant loop settles before the press: 36 s (60 at least, 240 at most), drifting -0.070 C p", + "21:37:25 cooling.flow-load: the coolant loop settles before the press: 37 s (60 at least, 240 at most), drifting -0.061 C p", + "21:37:26 cooling.flow-load: the coolant loop settles before the press: 38 s (60 at least, 240 at most), drifting -0.057 C p", + "21:37:27 cooling.flow-load: the coolant loop settles before the press: 39 s (60 at least, 240 at most), drifting -0.053 C p", + "21:37:28 cooling.flow-load: the coolant loop settles before the press: 40 s (60 at least, 240 at most), drifting -0.049 C p", + "21:37:29 cooling.flow-load: the coolant loop settles before the press: 41 s (60 at least, 240 at most), drifting -0.046 C p", + "21:37:30 cooling.flow-load: the coolant loop settles before the press: 42 s (60 at least, 240 at most), drifting -0.044 C p", + "21:37:32 cooling.flow-load: the coolant loop settles before the press: 43 s (60 at least, 240 at most), drifting -0.039 C p", + "21:37:33 cooling.flow-load: the coolant loop settles before the press: 44 s (60 at least, 240 at most), drifting -0.036 C p", + "21:37:34 cooling.flow-load: the coolant loop settles before the press: 45 s (60 at least, 240 at most), drifting -0.034 C p", + "21:37:35 cooling.flow-load: the coolant loop settles before the press: 46 s (60 at least, 240 at most), drifting -0.030 C p", + "21:37:36 cooling.flow-load: the coolant loop settles before the press: 47 s (60 at least, 240 at most), drifting -0.030 C p", + "21:37:37 cooling.flow-load: the coolant loop settles before the press: 48 s (60 at least, 240 at most), drifting -0.029 C p", + "21:37:38 cooling.flow-load: the coolant loop settles before the press: 49 s (60 at least, 240 at most), drifting -0.028 C p", + "21:37:39 cooling.flow-load: the coolant loop settles before the press: 50 s (60 at least, 240 at most), drifting -0.025 C p", + "21:37:40 cooling.flow-load: the coolant loop settles before the press: 51 s (60 at least, 240 at most), drifting -0.023 C p", + "21:37:41 cooling.flow-load: the coolant loop settles before the press: 52 s (60 at least, 240 at most), drifting -0.022 C p", + "21:37:42 cooling.flow-load: the coolant loop settles before the press: 53 s (60 at least, 240 at most), drifting -0.022 C p", + "21:37:43 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:37:43 cooling.flow-load: the coolant loop settles before the press: 54 s (60 at least, 240 at most), drifting -0.020 C p", + "21:37:44 cooling.flow-load: the coolant loop settles before the press: 55 s (60 at least, 240 at most), drifting -0.017 C p", + "21:37:45 cooling.flow-load: the coolant loop settles before the press: 56 s (60 at least, 240 at most), drifting -0.017 C p", + "21:37:46 cooling.flow-load: the coolant loop settles before the press: 57 s (60 at least, 240 at most), drifting -0.016 C p", + "21:37:47 cooling.flow-load: the coolant loop settles before the press: 58 s (60 at least, 240 at most), drifting -0.017 C p", + "21:37:48 cooling.flow-load: the coolant loop settles before the press: 59 s (60 at least, 240 at most), drifting -0.013 C p", + "21:37:49 prompt load-arm (continue): The loop is quiet. Now the box, then a 60 x 15 mm patch at 60 percent that keeps the tube lit for about a minute, both coolant sensors read for 100 s after. About four minutes in all. Lid closed. Continue, then press the button when it lights white; this page says when.", + "21:37:50 cooling.flow-load: the program goes to the controller, the button lights at the arm", + "21:37:51 cooling.flow-load: the button is lit: press it now (0 s; the job waits 599 at most)", + "21:37:51 prompt press (wait): The button is lit white. Press it now: the laser fires after your press.", + "21:37:52 cooling.flow-load: the button is lit: press it now (1 s; the job waits 599 at most)", + "21:37:53 cooling.flow-load: the button is lit: press it now (2 s; the job waits 599 at most)", + "21:37:54 cooling.flow-load: the button is lit: press it now (3 s; the job waits 599 at most)", + "21:37:55 cooling.flow-load: the button is lit: press it now (4 s; the job waits 599 at most)", + "21:37:56 cooling.flow-load: the button is lit: press it now (5 s; the job waits 599 at most)", + "21:37:57 cooling.flow-load: the button is lit: press it now (6 s; the job waits 599 at most)", + "21:37:58 cooling.flow-load: the button is lit: press it now (7 s; the job waits 599 at most)", + "21:37:59 cooling.flow-load: the button is lit: press it now (8 s; the job waits 599 at most)", + "21:38:00 cooling.flow-load: burning: 0 s lit", + "21:38:01 cooling.flow-load: burning: 1 s lit", + "21:38:02 cooling.flow-load: burning: 2 s lit", + "21:38:03 cooling.flow-load: burning: 3 s lit", + "21:38:04 cooling.flow-load: burning: 1 s lit", + "21:38:05 cooling.flow-load: burning: 0 s lit", + "21:38:06 cooling.flow-load: burning: the tube is between passes", + "21:38:07 cooling.flow-load: burning: 0 s lit", + "21:38:08 cooling.flow-load: burning: the tube is between passes", + "21:38:09 cooling.flow-load: burning: 0 s lit", + "21:38:12 cooling.flow-load: burning: the tube is between passes", + "21:38:13 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:38:14 cooling.flow-load: burning: 0 s lit", + "21:38:15 cooling.flow-load: burning: 1 s lit", + "21:38:16 cooling.flow-load: burning: 2 s lit", + "21:38:17 cooling.flow-load: burning: 3 s lit", + "21:38:18 cooling.flow-load: burning: 4 s lit", + "21:38:19 cooling.flow-load: burning: 5 s lit", + "21:38:20 cooling.flow-load: burning: 6 s lit", + "21:38:21 cooling.flow-load: burning: 7 s lit", + "21:38:22 cooling.flow-load: burning: 8 s lit", + "21:38:23 cooling.flow-load: burning: 9 s lit", + "21:38:24 cooling.flow-load: burning: 10 s lit", + "21:38:25 cooling.flow-load: burning: 12 s lit", + "21:38:26 cooling.flow-load: burning: 13 s lit", + "21:38:27 cooling.flow-load: burning: 14 s lit", + "21:38:28 cooling.flow-load: burning: 15 s lit", + "21:38:29 cooling.flow-load: burning: 16 s lit", + "21:38:30 cooling.flow-load: burning: 17 s lit", + "21:38:31 cooling.flow-load: burning: 18 s lit", + "21:38:32 cooling.flow-load: burning: 19 s lit", + "21:38:33 cooling.flow-load: burning: 20 s lit", + "21:38:34 cooling.flow-load: burning: 21 s lit", + "21:38:35 cooling.flow-load: burning: 22 s lit", + "21:38:36 cooling.flow-load: burning: 23 s lit", + "21:38:37 cooling.flow-load: burning: 24 s lit", + "21:38:38 cooling.flow-load: burning: 25 s lit", + "21:38:39 cooling.flow-load: burning: 26 s lit", + "21:38:40 cooling.flow-load: burning: 27 s lit", + "21:38:41 cooling.flow-load: burning: 28 s lit", + "21:38:42 cooling.flow-load: burning: 29 s lit", + "21:38:43 cooling.flow-load: burning: 30 s lit", + "21:38:44 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:38:44 cooling.flow-load: burning: 31 s lit", + "21:38:45 cooling.flow-load: burning: 32 s lit", + "21:38:46 cooling.flow-load: burning: 33 s lit", + "21:38:47 cooling.flow-load: burning: 34 s lit", + "21:38:48 cooling.flow-load: burning: 35 s lit", + "21:38:49 cooling.flow-load: burning: 36 s lit", + "21:38:50 cooling.flow-load: burning: 37 s lit", + "21:38:51 cooling.flow-load: burning: 38 s lit", + "21:38:52 cooling.flow-load: burning: 39 s lit", + "21:38:53 cooling.flow-load: burning: 40 s lit", + "21:38:54 cooling.flow-load: burning: 41 s lit", + "21:38:55 cooling.flow-load: burning: 42 s lit", + "21:38:56 cooling.flow-load: burning: 43 s lit", + "21:38:57 cooling.flow-load: burning: 44 s lit", + "21:38:58 cooling.flow-load: burning: 45 s lit", + "21:38:59 cooling.flow-load: burning: 46 s lit", + "21:39:00 cooling.flow-load: burning: 47 s lit", + "21:39:01 cooling.flow-load: burning: 48 s lit", + "21:39:02 cooling.flow-load: burning: 49 s lit", + "21:39:03 cooling.flow-load: burning: 50 s lit", + "21:39:04 cooling.flow-load: burning: 51 s lit", + "21:39:05 cooling.flow-load: burning: 52 s lit", + "21:39:06 cooling.flow-load: burning: 53 s lit", + "21:39:07 cooling.flow-load: burning: 54 s lit", + "21:39:08 cooling.flow-load: burning: 55 s lit", + "21:39:09 cooling.flow-load: burning: 56 s lit", + "21:39:10 cooling.flow-load: burning: 57 s lit", + "21:39:11 cooling.flow-load: burning: 58 s lit", + "21:39:12 cooling.flow-load: burning: 60 s lit", + "21:39:13 cooling.flow-load: burning: 61 s lit", + "21:39:14 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:39:15 cooling.flow-load: burning: 62 s lit", + "21:39:16 cooling.flow-load: burning: 63 s lit", + "21:39:17 cooling.flow-load: burning: 64 s lit", + "21:39:18 cooling.flow-load: burning: 65 s lit", + "21:39:19 cooling.flow-load: burning: 66 s lit", + "21:39:20 cooling.flow-load: burning: 67 s lit", + "21:39:22 cooling.flow-load: burning: 68 s lit", + "21:39:23 cooling.flow-load: burning: 69 s lit", + "21:39:24 cooling.flow-load: burning: 70 s lit", + "21:39:25 cooling.flow-load: burning: 71 s lit", + "21:39:26 cooling.flow-load: burning: 72 s lit", + "21:39:27 cooling.flow-load: burning: 73 s lit", + "21:39:28 cooling.flow-load: burning: 74 s lit", + "21:39:29 cooling.flow-load: burning: 75 s lit", + "21:39:30 cooling.flow-load: burning: 76 s lit", + "21:39:31 cooling.flow-load: burning: the tube is between passes", + "21:39:34 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 97 s more", + "21:39:35 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 95 s more", + "21:39:36 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 94 s more", + "21:39:37 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 93 s more", + "21:39:38 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 92 s more", + "21:39:39 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 91 s more", + "21:39:40 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 90 s more", + "21:39:41 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 89 s more", + "21:39:42 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 88 s more", + "21:39:43 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 87 s more", + "21:39:44 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 86 s more", + "21:39:45 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:39:45 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 85 s more", + "21:39:46 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 84 s more", + "21:39:47 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 83 s more", + "21:39:48 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 82 s more", + "21:39:49 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 81 s more", + "21:39:50 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 80 s more", + "21:39:51 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 79 s more", + "21:39:52 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 78 s more", + "21:39:53 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 77 s more", + "21:39:54 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 76 s more", + "21:39:55 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 75 s more", + "21:39:56 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 74 s more", + "21:39:57 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 73 s more", + "21:39:58 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 72 s more", + "21:39:59 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 71 s more", + "21:40:00 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 70 s more", + "21:40:01 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 69 s more", + "21:40:02 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 68 s more", + "21:40:03 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 67 s more", + "21:40:04 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 66 s more", + "21:40:06 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 65 s more", + "21:40:07 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 64 s more", + "21:40:08 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 62 s more", + "21:40:09 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 61 s more", + "21:40:10 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 60 s more", + "21:40:11 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 59 s more", + "21:40:12 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 58 s more", + "21:40:13 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 57 s more", + "21:40:14 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 56 s more", + "21:40:15 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:40:15 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 55 s more", + "21:40:16 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 54 s more", + "21:40:17 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 53 s more", + "21:40:18 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 52 s more", + "21:40:19 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 51 s more", + "21:40:20 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 50 s more", + "21:40:21 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 49 s more", + "21:40:22 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 48 s more", + "21:40:23 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 47 s more", + "21:40:24 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 46 s more", + "21:40:25 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 45 s more", + "21:40:26 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 44 s more", + "21:40:27 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 43 s more", + "21:40:28 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 42 s more", + "21:40:29 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 41 s more", + "21:40:30 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 40 s more", + "21:40:31 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 39 s more", + "21:40:32 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 38 s more", + "21:40:33 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 37 s more", + "21:40:34 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 36 s more", + "21:40:35 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 35 s more", + "21:40:36 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 34 s more", + "21:40:37 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 33 s more", + "21:40:38 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 31 s more", + "21:40:39 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 30 s more", + "21:40:40 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 29 s more", + "21:40:41 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 28 s more", + "21:40:42 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 27 s more", + "21:40:43 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 26 s more", + "21:40:45 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 25 s more", + "21:40:46 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:40:46 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 24 s more", + "21:40:47 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 23 s more", + "21:40:48 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 22 s more", + "21:40:49 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 21 s more", + "21:40:50 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 20 s more", + "21:40:51 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 19 s more", + "21:40:52 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 18 s more", + "21:40:53 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 17 s more", + "21:40:54 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 16 s more", + "21:40:55 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 15 s more", + "21:40:56 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 14 s more", + "21:40:57 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 13 s more", + "21:40:58 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 12 s more", + "21:40:59 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 11 s more", + "21:41:00 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 10 s more", + "21:41:01 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 9 s more", + "21:41:02 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 8 s more", + "21:41:03 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 7 s more", + "21:41:04 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 6 s more", + "21:41:05 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 5 s more", + "21:41:06 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 4 s more", + "21:41:07 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 3 s more", + "21:41:08 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 2 s more", + "21:41:09 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 1 s more", + "21:41:10 cooling.flow-load: the tube is dark: the coolant sensors follow the heat, 0 s more", + "21:41:17 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:41:22 cooling.flow-load: {'lit_s': 66.16, 'dose_raw_s': 36718.15999999994, 'peak_c': 2.0195294117647045, 'k_density': 5.500083369549857e-05, 'k_cw': 7.142965414999814e-05}, emission {'hv_max': 1023, 'laser_on_samples': 221, 'thermopile_delta': 1149, 'lit_s': 90.52963792199989}", + "21:41:22 restore lens_hall_edge_z_mm='3.48' -> 200", + "21:41:22 restore lens_stop_below_steps='14' -> 200", + "21:41:22 restore lens_stop_above_steps='20' -> 200", + "21:41:22 restore laser_floor_density='12' -> 200", + "21:41:22 restore laser_dose_curve='10:0.44,20:2.98,30:9.31,45:26.26,60:45.50,80:57.30,100:100.00' -> 200", + "21:41:22 restore laser_corner_gamma='1.50' -> 200", + "21:41:23 restore cool_laser_heat_density='2.144e-05' -> 200", + "21:41:23 restore cool_laser_heat_cw='2.784e-05' -> 200", + "21:41:23 PASS: the sheet's seven wizards ran on one piece; settings restored", + "21:41:23 baseline: post: clean", + "21:41:23 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "commission.sheet", - "ts": "2026-09-09T16:54:01Z" + "ts": "2026-09-09T21:41:23Z" }, "requires": [ "forgectrl.auth", @@ -8947,15 +8871,15 @@ "src/main.c" ] ], - "fingerprint": "462c6578bd0d86cca3da9043fe2170e7d2d778b534762133b33308284f718b56", + "fingerprint": "7d2843ae198a53bda83fcb160d42c9ac65c689aa341b023e2aefc53d4e505833", "hardware": "api", "id": "logs.tree-tail-export", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 39, + "campaign": "c-20260909200054-7947", + "duration_s": 40, "evidence": { "baseline": { "post": [], @@ -8963,11 +8887,11 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "camera_key_leaks": [], - "export_bytes": 3295192, - "export_s": 39.1, + "export_bytes": 3403785, + "export_s": 40.0, "fixture": { "channels": [ "lid", @@ -8986,31 +8910,31 @@ "kernel", "system" ], - "members": 35, + "members": 38, "panel_token_leaks": [] }, - "fingerprint": "462c6578bd0d86cca3da9043fe2170e7d2d778b534762133b33308284f718b56", - "image": "20260909150456 (dev)", + "fingerprint": "7d2843ae198a53bda83fcb160d42c9ac65c689aa341b023e2aefc53d4e505833", + "image": "20260909193551 (dev)", "log": [ - "16:06:37 start logs.tree-tail-export (auto, api) in campaign c-20260909160235-7649", - "16:06:37 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:06:37 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:06:37 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:06:37 baseline: pre: clean", - "16:06:37 GET /logs -> 200", - "16:06:37 loggers: ['forgectrl', 'grblhal', 'gfcloud', 'gfhome', 'kernel', 'system']", - "16:06:38 GET /logs/tail?name=forgectrl -> 200", - "16:07:08 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:07:17 POST /logs/export -> 200 (3295192 bytes, 39.1 s)", - "16:07:17 bundle: 35 members, e.g. ['forgefirm-logs', 'forgefirm-logs/README.txt', 'forgefirm-logs/logs', 'forgefirm-logs/logs/grblhal', 'forgefirm-logs/logs/grblhal/grblhal.log']", - "16:07:17 baseline: post: clean", - "16:07:17 result PASS" + "20:04:56 start logs.tree-tail-export (auto, api) in campaign c-20260909200054-7947", + "20:04:56 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:04:56 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:04:56 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:04:56 baseline: pre: clean", + "20:04:56 GET /logs -> 200", + "20:04:56 loggers: ['forgectrl', 'grblhal', 'gfcloud', 'gfhome', 'kernel', 'system']", + "20:04:56 GET /logs/tail?name=forgectrl -> 200", + "20:05:26 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:05:36 POST /logs/export -> 200 (3403785 bytes, 40.0 s)", + "20:05:36 bundle: 38 members, e.g. ['forgefirm-logs', 'forgefirm-logs/README.txt', 'forgefirm-logs/logs', 'forgefirm-logs/logs/grblhal', 'forgefirm-logs/logs/grblhal/grblhal.log']", + "20:05:36 baseline: post: clean", + "20:05:36 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "logs.tree-tail-export", - "ts": "2026-09-09T16:07:17Z" + "ts": "2026-09-09T20:05:36Z" }, "requires": [ "forgectrl.auth" @@ -9060,14 +8984,14 @@ "forgefirm-app/gfhome.py" ] ], - "fingerprint": "50161643f3874d817567e6cf0896c395ea362b252ad5e0a2421a27d78907955e", + "fingerprint": "0fef61d1ae31c1cb552696fc598be6d9c450bcf0eb2efdc37574b44946d4f0e3", "hardware": "api", "id": "logs.routing", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 4, "evidence": { "baseline": { @@ -9076,7 +9000,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "controller": "running", "effective": { @@ -9117,39 +9041,39 @@ }, "kernel_lines": 50, "logger_relays": [ - 2603, - 3666 + 3121, + 4254 ], "own_lines": 176, - "probe_gfhome": "2026-09-09T16:18:39.500215+00:00 gfhome[-] ERR forgetest-routing-1788970718 gfhome", - "probe_grblhal": "2026-09-09T16:18:38.467498+00:00 grblhal[-] ERR forgetest-routing-1788970718 grblhal", + "probe_gfhome": "2026-09-09T20:17:06.596015+00:00 gfhome[-] ERR forgetest-routing-1788985025 gfhome", + "probe_grblhal": "2026-09-09T20:17:05.561267+00:00 grblhal[-] ERR forgetest-routing-1788985025 grblhal", "rsyslogd_pids": [ - 437 + 449 ] }, - "fingerprint": "50161643f3874d817567e6cf0896c395ea362b252ad5e0a2421a27d78907955e", - "image": "20260909150456 (dev)", + "fingerprint": "0fef61d1ae31c1cb552696fc598be6d9c450bcf0eb2efdc37574b44946d4f0e3", + "image": "20260909193551 (dev)", "log": [ - "16:18:38 start logs.routing (auto, api) in campaign c-20260909160235-7649", - "16:18:38 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:18:38 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:18:38 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:18:38 baseline: pre: clean", - "16:18:38 rsyslogd [437]; no syslogd/klogd", - "16:18:38 effective levels: {'forgectrl': ('info', 'off'), 'grblhal': ('debug', 'off'), 'gfcloud': ('info', 'off'), 'gfhome': ('info', 'off'), 'kernel': ('info', 'off'), 'system': ('info', 'off')}", - "16:18:38 forgectrl[[2604]] lines in its file: 176", - "16:18:39 grblhal: 2026-09-09T16:18:38.467498+00:00 grblhal[-] ERR forgetest-routing-1788970718 grblhal", - "16:18:40 gfhome: 2026-09-09T16:18:39.500215+00:00 gfhome[-] ERR forgetest-routing-1788970718 gfhome", - "16:18:42 logger relays: [2603, 3666] (controller running)", - "16:18:42 no ForgeFIRM log outside /data/log/forgefirm", - "16:18:42 baseline: post: clean", - "16:18:42 result PASS" + "20:17:05 start logs.routing (auto, api) in campaign c-20260909200054-7947", + "20:17:05 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:17:05 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:17:05 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:17:05 baseline: pre: clean", + "20:17:05 rsyslogd [449]; no syslogd/klogd", + "20:17:05 effective levels: {'forgectrl': ('info', 'off'), 'grblhal': ('debug', 'off'), 'gfcloud': ('info', 'off'), 'gfhome': ('info', 'off'), 'kernel': ('info', 'off'), 'system': ('info', 'off')}", + "20:17:05 forgectrl[[3122]] lines in its file: 176", + "20:17:06 grblhal: 2026-09-09T20:17:05.561267+00:00 grblhal[-] ERR forgetest-routing-1788985025 grblhal", + "20:17:07 gfhome: 2026-09-09T20:17:06.596015+00:00 gfhome[-] ERR forgetest-routing-1788985025 gfhome", + "20:17:09 logger relays: [3121, 4254] (controller running)", + "20:17:09 no ForgeFIRM log outside /data/log/forgefirm", + "20:17:09 baseline: post: clean", + "20:17:09 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "logs.routing", - "ts": "2026-09-09T16:18:42Z" + "ts": "2026-09-09T20:17:09Z" }, "requires": [ "logs.tree-tail-export" @@ -9175,14 +9099,14 @@ "src/settings.*" ] ], - "fingerprint": "29bd3f5bd59877a537b9dd42ef1c25fd0cdada218f6d2173b639e759ac280546", + "fingerprint": "fcd4b56be2263bb212af63876d030d5542ef563f5accfb15ac5397ea9c2b6e9b", "hardware": "api", "id": "logs.level-settings", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 0, "evidence": { "baseline": { @@ -9191,7 +9115,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -9211,30 +9135,30 @@ "refused syslog_server=bad host name": 400, "system_remote_before": "off" }, - "fingerprint": "29bd3f5bd59877a537b9dd42ef1c25fd0cdada218f6d2173b639e759ac280546", - "image": "20260909150456 (dev)", + "fingerprint": "fcd4b56be2263bb212af63876d030d5542ef563f5accfb15ac5397ea9c2b6e9b", + "image": "20260909193551 (dev)", "log": [ - "16:18:42 start logs.level-settings (auto, api) in campaign c-20260909160235-7649", - "16:18:42 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:18:42 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:18:42 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:18:42 baseline: pre: clean", - "16:18:42 POST /settings log_grblhal_disk=verbose -> 400", - "16:18:42 POST /settings log_kernel_remote=7 -> 400", - "16:18:42 POST /settings syslog_port=70000 -> 400", - "16:18:42 POST /settings syslog_proto=tls -> 400", - "16:18:42 POST /settings syslog_server=bad host name -> 400", - "16:18:42 POST /settings log_system_remote=warning -> 200", - "16:18:42 configured warning, effective off, pending_reboot True", - "16:18:42 restore log_system_remote -> 200", - "16:18:42 baseline: post: clean", - "16:18:42 result PASS" + "20:17:09 start logs.level-settings (auto, api) in campaign c-20260909200054-7947", + "20:17:09 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:17:09 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:17:09 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:17:09 baseline: pre: clean", + "20:17:09 POST /settings log_grblhal_disk=verbose -> 400", + "20:17:09 POST /settings log_kernel_remote=7 -> 400", + "20:17:09 POST /settings syslog_port=70000 -> 400", + "20:17:09 POST /settings syslog_proto=tls -> 400", + "20:17:09 POST /settings syslog_server=bad host name -> 400", + "20:17:09 POST /settings log_system_remote=warning -> 200", + "20:17:09 configured warning, effective off, pending_reboot True", + "20:17:09 restore log_system_remote -> 200", + "20:17:09 baseline: post: clean", + "20:17:09 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "logs.level-settings", - "ts": "2026-09-09T16:18:42Z" + "ts": "2026-09-09T20:17:09Z" }, "requires": [ "logs.tree-tail-export", @@ -9265,14 +9189,14 @@ "src/liveness.*" ] ], - "fingerprint": "d4b3f986fc64f40eb66e67d47d97ee9f9d0b9155c6ec81ba4d0d006dae4f8a36", + "fingerprint": "8bfd54c4f9e0f8bc4acf10b1bd16b6d608e10770a94d18a03507ff652ede81ed", "hardware": "api", "id": "motion.pacing", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 15, "evidence": { "baseline": { @@ -9281,9 +9205,9 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, - "controller_pid": 2967, + "controller_pid": 3525, "final_drift_mm": 0.0, "fixture": { "channels": [ @@ -9296,7 +9220,7 @@ "released": [] }, "held_state": "Hold:0", - "idle_cpu_pct": 0.7, + "idle_cpu_pct": 1.0, "mode": { "detail": "already in grbl mode", "found": "grbl", @@ -9306,31 +9230,31 @@ }, "moved_mm": 30.0, "moving_cpu_pct": 23.0, - "parked_cpu_pct": 0.7 + "parked_cpu_pct": 1.0 }, - "fingerprint": "d4b3f986fc64f40eb66e67d47d97ee9f9d0b9155c6ec81ba4d0d006dae4f8a36", - "image": "20260909150456 (dev)", + "fingerprint": "8bfd54c4f9e0f8bc4acf10b1bd16b6d608e10770a94d18a03507ff652ede81ed", + "image": "20260909193551 (dev)", "log": [ - "16:10:38 start motion.pacing (auto, api) in campaign c-20260909160235-7649", - "16:10:38 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:10:38 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:10:38 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:10:38 baseline: pre: clean", - "16:10:38 mode: test needs grbl - already in grbl mode", - "16:10:39 connect: Idle", - "16:10:42 [1] idle CPU = 0.7%", - "16:10:44 [3] state=Run CPU during move = 23.0%", - "16:10:48 [2] Hold:0: CPU parked in Hold = 0.7%", - "16:10:49 [4] start X=0.000 end X=30.000 moved=30.000 (expect 30.0)", - "16:10:53 PASS: idle 0.7%, moving 23.0%, parked 0.7%, hold/resume exact", - "16:10:53 baseline: post: clean", - "16:10:53 result PASS" + "20:08:59 start motion.pacing (auto, api) in campaign c-20260909200054-7947", + "20:08:59 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:08:59 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:08:59 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:08:59 baseline: pre: clean", + "20:08:59 mode: test needs grbl - already in grbl mode", + "20:09:00 connect: Idle", + "20:09:03 [1] idle CPU = 1.0%", + "20:09:05 [3] state=Run CPU during move = 23.0%", + "20:09:09 [2] Hold:0: CPU parked in Hold = 1.0%", + "20:09:11 [4] start X=0.000 end X=30.000 moved=30.000 (expect 30.0)", + "20:09:14 PASS: idle 1.0%, moving 23.0%, parked 1.0%, hold/resume exact", + "20:09:14 baseline: post: clean", + "20:09:14 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "motion.pacing", - "ts": "2026-09-09T16:10:53Z" + "ts": "2026-09-09T20:09:14Z" }, "requires": [ "kernel.latch-locked-idle" @@ -9360,29 +9284,27 @@ "src/liveness.*" ] ], - "fingerprint": "388757adbe9d1201033ee0d5dc815a30c312713e9dc920ea90983e5acce3e248", + "fingerprint": "66899528626012e7da981bb72c341ec9158572947db07380261fb644cf224d90", "hardware": "api", "id": "motion.jog-roundtrip", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 13, "evidence": { "accel_moving_legs": [ - "X sanity 40mm out", "X sanity 40mm back", "Y sanity 40mm out", - "Y sanity 40mm back", "X max-rate 60mm back", "diag 40mm back" ], "accel_overall": { "errors": 0, "p2p": [ - 3122, - 3079 + 3742, + 2331 ], "samples": 17 }, @@ -9392,7 +9314,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "drift_mm": 0.0, "final": [ @@ -9422,8 +9344,8 @@ "moves": [ { "accel_p2p": [ - 1284, - 1012 + 388, + 724 ], "accel_samples": 2, "leg": "out", @@ -9433,13 +9355,13 @@ "Jog", "Idle" ], - "t0": 1788970723.7233863, - "t1": 1788970724.8255339 + "t0": 1788985030.8664267, + "t1": 1788985031.9702091 }, { "accel_p2p": [ - 2142, - 1434 + 1642, + 516 ], "accel_samples": 3, "leg": "back", @@ -9449,13 +9371,13 @@ "Jog", "Idle" ], - "t0": 1788970724.8257546, - "t1": 1788970725.9285553 + "t0": 1788985031.9704313, + "t1": 1788985033.0874238 }, { "accel_p2p": [ - 2221, - 2170 + 2111, + 918 ], "accel_samples": 3, "leg": "out", @@ -9465,13 +9387,13 @@ "Jog", "Idle" ], - "t0": 1788970725.9287798, - "t1": 1788970727.03909 + "t0": 1788985033.0876398, + "t1": 1788985034.1917865 }, { "accel_p2p": [ - 35, - 872 + 648, + 9 ], "accel_samples": 2, "leg": "back", @@ -9481,13 +9403,13 @@ "Jog", "Idle" ], - "t0": 1788970727.0392873, - "t1": 1788970728.1422658 + "t0": 1788985034.191981, + "t1": 1788985035.3018084 }, { "accel_p2p": [ - 172, - 468 + 34, + 51 ], "accel_samples": 2, "leg": "out", @@ -9497,13 +9419,13 @@ "Jog", "Idle" ], - "t0": 1788970728.1424997, - "t1": 1788970728.8457353 + "t0": 1788985035.3020124, + "t1": 1788985036.0057547 }, { "accel_p2p": [ - 1661, - 506 + 204, + 1157 ], "accel_samples": 2, "leg": "back", @@ -9513,8 +9435,8 @@ "Jog", "Idle" ], - "t0": 1788970728.8459384, - "t1": 1788970729.5444756 + "t0": 1788985036.0059597, + "t1": 1788985036.6972413 }, { "accel_p2p": [ @@ -9529,13 +9451,13 @@ "Jog", "Idle" ], - "t0": 1788970729.544687, - "t1": 1788970730.2365797 + "t0": 1788985036.697448, + "t1": 1788985037.3127484 }, { "accel_p2p": [ - 411, - 894 + 1518, + 1473 ], "accel_samples": 2, "leg": "back", @@ -9545,8 +9467,8 @@ "Jog", "Idle" ], - "t0": 1788970730.2367778, - "t1": 1788970730.9353638 + "t0": 1788985037.3129761, + "t1": 1788985038.0066922 } ], "start": [ @@ -9555,37 +9477,37 @@ 3.422 ] }, - "fingerprint": "388757adbe9d1201033ee0d5dc815a30c312713e9dc920ea90983e5acce3e248", - "image": "20260909150456 (dev)", + "fingerprint": "66899528626012e7da981bb72c341ec9158572947db07380261fb644cf224d90", + "image": "20260909193551 (dev)", "log": [ - "16:18:43 start motion.jog-roundtrip (auto, api) in campaign c-20260909160235-7649", - "16:18:43 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:18:43 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:18:43 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:18:43 baseline: pre: clean", - "16:18:43 mode: test needs grbl - already in grbl mode", - "16:18:43 connect: Idle", - "16:18:44 X sanity 40mm out: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=1284 y=1012 over 2 samples", - "16:18:45 X sanity 40mm back: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=2142 y=1434 over 3 samples", - "16:18:47 Y sanity 40mm out: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=2221 y=2170 over 3 samples", - "16:18:48 Y sanity 40mm back: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=35 y=872 over 2 samples", - "16:18:48 X max-rate 60mm out: peak 10500 mm/min, states ['Jog', 'Idle']; accel p2p x=172 y=468 over 2 samples", - "16:18:49 X max-rate 60mm back: peak 10500 mm/min, states ['Jog', 'Idle']; accel p2p x=1661 y=506 over 2 samples", - "16:18:50 diag 40mm out: peak 8000 mm/min, states ['Jog', 'Idle']; accel p2p x=0 y=0 over 1 samples", - "16:18:50 diag 40mm back: peak 8000 mm/min, states ['Jog', 'Idle']; accel p2p x=411 y=894 over 2 samples", - "16:18:50 accel over all 8 legs: p2p x=3122 y=3079 (17 samples, 0 errors); motion seen on 6 legs", - "16:18:52 after !: Hold:0", - "16:18:54 after ~: states ['Run', 'Idle']", - "16:18:55 final drift 0.000 mm (start (0.0, 0.0, 3.422), final (0.0, 0.0, 3.422))", - "16:18:56 PASS: 8 jogs, peak 10500 mm/min, hold parked, drift 0.000 mm, accel p2p 3122 over the jogs, motion on 6 of 8 legs", - "16:18:56 baseline: post: clean", - "16:18:56 result PASS" + "20:17:10 start motion.jog-roundtrip (auto, api) in campaign c-20260909200054-7947", + "20:17:10 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:17:10 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:17:10 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:17:10 baseline: pre: clean", + "20:17:10 mode: test needs grbl - already in grbl mode", + "20:17:10 connect: Idle", + "20:17:11 X sanity 40mm out: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=388 y=724 over 2 samples", + "20:17:13 X sanity 40mm back: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=1642 y=516 over 3 samples", + "20:17:14 Y sanity 40mm out: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=2111 y=918 over 3 samples", + "20:17:15 Y sanity 40mm back: peak 2400 mm/min, states ['Jog', 'Idle']; accel p2p x=648 y=9 over 2 samples", + "20:17:15 X max-rate 60mm out: peak 10500 mm/min, states ['Jog', 'Idle']; accel p2p x=34 y=51 over 2 samples", + "20:17:16 X max-rate 60mm back: peak 10500 mm/min, states ['Jog', 'Idle']; accel p2p x=204 y=1157 over 2 samples", + "20:17:17 diag 40mm out: peak 8000 mm/min, states ['Jog', 'Idle']; accel p2p x=0 y=0 over 1 samples", + "20:17:17 diag 40mm back: peak 8000 mm/min, states ['Jog', 'Idle']; accel p2p x=1518 y=1473 over 2 samples", + "20:17:17 accel over all 8 legs: p2p x=3742 y=2331 (17 samples, 0 errors); motion seen on 4 legs", + "20:17:19 after !: Hold:0", + "20:17:21 after ~: states ['Run', 'Idle']", + "20:17:22 final drift 0.000 mm (start (0.0, 0.0, 3.422), final (0.0, 0.0, 3.422))", + "20:17:23 PASS: 8 jogs, peak 10500 mm/min, hold parked, drift 0.000 mm, accel p2p 3742 over the jogs, motion on 4 of 8 legs", + "20:17:23 baseline: post: clean", + "20:17:23 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "motion.jog-roundtrip", - "ts": "2026-09-09T16:18:56Z" + "ts": "2026-09-09T20:17:23Z" }, "requires": [ "kernel.latch-locked-idle" @@ -9623,15 +9545,15 @@ "src/settings.*" ] ], - "fingerprint": "63b3dfc4f1cd511eb0e57c4a046917fd86d84bc7fd6c68ede7b1d46b7d95e7ff", + "fingerprint": "fb549d0e549a012c31413f7de51a05dbaf01525bd2b2f7c3f7c69fe030208b55", "hardware": "api", "id": "motion.microstep-modes", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 23, + "campaign": "c-20260909200054-7947", + "duration_s": 24, "evidence": { "baseline": { "post": [], @@ -9639,7 +9561,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -9663,8 +9585,8 @@ "$100": 53.333, "$101": 53.333, "accel_p2p": [ - 2347, - 1577 + 2814, + 720 ], "accel_samples": 6, "drift_mm": 0.0, @@ -9683,14 +9605,14 @@ "$100": 106.667, "$101": 106.667, "accel_p2p": [ - 1325, - 661 + 3741, + 368 ], - "accel_samples": 5, + "accel_samples": 6, "drift_mm": 0.0, "kernel_out_mm": 40.0, "mode": 16, - "peak": 9160.0, + "peak": 9580.0, "sysfs": { "cnc/ramp_rate": "250000", "cnc/step_freq": "56320", @@ -9703,8 +9625,8 @@ "$100": 213.33299, "$101": 213.33299, "accel_p2p": [ - 1549, - 747 + 4734, + 1461 ], "accel_samples": 5, "drift_mm": 0.0, @@ -9723,41 +9645,41 @@ "xy_microsteps_after": "(unset)", "xy_microsteps_before": "(unset)" }, - "fingerprint": "63b3dfc4f1cd511eb0e57c4a046917fd86d84bc7fd6c68ede7b1d46b7d95e7ff", - "image": "20260909150456 (dev)", + "fingerprint": "fb549d0e549a012c31413f7de51a05dbaf01525bd2b2f7c3f7c69fe030208b55", + "image": "20260909193551 (dev)", "log": [ - "16:18:56 start motion.microstep-modes (auto, api) in campaign c-20260909160235-7649", - "16:18:56 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:18:56 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:18:56 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:18:56 baseline: pre: clean", - "16:18:56 mode: test needs grbl - already in grbl mode", - "16:18:56 --- x8 ---", - "16:18:58 baseline: /mode controller=running motion=verified", - "16:18:59 baseline: controller configured 1.0 s after running", - "16:19:00 connect: Idle", - "16:19:03 x8: out 39.990 mm by the kernel, peak 9578/9578 mm/min, drift 0.000 mm, accel p2p x=2347 y=1577 over 6 samples", - "16:19:03 --- x16 ---", - "16:19:05 baseline: /mode controller=running motion=verified", - "16:19:06 baseline: controller configured 1.0 s after running", - "16:19:07 connect: Idle", - "16:19:10 x16: out 40.000 mm by the kernel, peak 9160/9160 mm/min, drift 0.000 mm, accel p2p x=1325 y=661 over 5 samples", - "16:19:10 --- x32 ---", - "16:19:12 baseline: /mode controller=running motion=verified", - "16:19:13 baseline: controller configured 1.0 s after running", - "16:19:14 connect: Idle", - "16:19:16 x32: out 40.000 mm by the kernel, peak 8739/9159 mm/min, drift 0.000 mm, accel p2p x=1549 y=747 over 5 samples", - "16:19:19 baseline: /mode controller=running motion=verified", - "16:19:20 baseline: controller configured 1.0 s after running", - "16:19:20 PASS: x8: 39.990 mm, drift 0.000, accel 2347; x16: 40.000 mm, drift 0.000, accel 1325; x32: 40.000 mm, drift 0.000, accel 1549", - "16:19:20 baseline: post: clean", - "16:19:20 result PASS" + "20:17:23 start motion.microstep-modes (auto, api) in campaign c-20260909200054-7947", + "20:17:23 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:17:23 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:17:23 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:17:24 baseline: pre: clean", + "20:17:24 mode: test needs grbl - already in grbl mode", + "20:17:24 --- x8 ---", + "20:17:26 baseline: /mode controller=running motion=verified", + "20:17:27 baseline: controller configured 1.0 s after running", + "20:17:27 connect: Idle", + "20:17:30 x8: out 39.990 mm by the kernel, peak 9578/9578 mm/min, drift 0.000 mm, accel p2p x=2814 y=720 over 6 samples", + "20:17:30 --- x16 ---", + "20:17:33 baseline: /mode controller=running motion=verified", + "20:17:34 baseline: controller configured 1.0 s after running", + "20:17:34 connect: Idle", + "20:17:37 x16: out 40.000 mm by the kernel, peak 9580/9580 mm/min, drift 0.000 mm, accel p2p x=3741 y=368 over 6 samples", + "20:17:37 --- x32 ---", + "20:17:39 baseline: /mode controller=running motion=verified", + "20:17:40 baseline: controller configured 1.0 s after running", + "20:17:41 connect: Idle", + "20:17:44 x32: out 40.000 mm by the kernel, peak 8739/9159 mm/min, drift 0.000 mm, accel p2p x=4734 y=1461 over 5 samples", + "20:17:46 baseline: /mode controller=running motion=verified", + "20:17:47 baseline: controller configured 1.0 s after running", + "20:17:47 PASS: x8: 39.990 mm, drift 0.000, accel 2814; x16: 40.000 mm, drift 0.000, accel 3741; x32: 40.000 mm, drift 0.000, accel 4734", + "20:17:48 baseline: post: clean", + "20:17:48 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "motion.microstep-modes", - "ts": "2026-09-09T16:19:20Z" + "ts": "2026-09-09T20:17:48Z" }, "requires": [ "motion.jog-roundtrip" @@ -9783,14 +9705,14 @@ "**" ] ], - "fingerprint": "2a568d3e233da7794094ec620fcda5b2c98663e3766470588fa093ee6c0ca650", + "fingerprint": "1c7e4b28a3bbbc730472287860912c9094927662ee6752ea181fc6fbfd70dd2c", "hardware": "api", "id": "motion.liveness-probe", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 8, "evidence": { "baseline": { @@ -9799,7 +9721,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -9818,12 +9740,12 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 3923, + "pid": 4517, "why": "" }, "motor_lock_after": "0", "probe_lines": [ - "2026-09-09T16:19:27.365125+00:00 forgectrl[3900] INFO super: liveness probe: MOTION OK - head accel p2p x=3536 y=2195 (moving>=800 dead<=250)" + "2026-09-09T20:17:54.680945+00:00 forgectrl[4493] INFO super: liveness probe: MOTION OK - head accel p2p x=2382 y=2801 (moving>=800 dead<=250)" ] }, "mode_after": { @@ -9832,7 +9754,7 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 3856, + "pid": 4449, "why": "" }, "mode_before": { @@ -9841,32 +9763,32 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 3856, + "pid": 4449, "why": "" } }, - "fingerprint": "2a568d3e233da7794094ec620fcda5b2c98663e3766470588fa093ee6c0ca650", - "image": "20260909150456 (dev)", + "fingerprint": "1c7e4b28a3bbbc730472287860912c9094927662ee6752ea181fc6fbfd70dd2c", + "image": "20260909193551 (dev)", "log": [ - "16:19:20 start motion.liveness-probe (auto, api) in campaign c-20260909160235-7649", - "16:19:20 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:19:20 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:19:20 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:19:21 baseline: pre: clean", - "16:19:21 mode: {'mode': 'grbl', 'controller': 'running', 'pid': 3856, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", - "16:19:21 mode after: {'mode': 'grbl', 'controller': 'running', 'pid': 3856, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", - "16:19:21 masked every axis (cnc/motor_lock=15); restarting forgectrl for a fresh probe", - "16:19:29 super: liveness probe: MOTION OK - head accel p2p x=3536 y=2195 (moving>=800 dead<=250)", - "16:19:29 kernel X 0.0 -> 0.0 mm across the probe (out and back)", - "16:19:29 PASS: masked restart probed MOTION OK on the first try, mask cleared, controller up", - "16:19:29 baseline: post: clean", - "16:19:29 result PASS" + "20:17:48 start motion.liveness-probe (auto, api) in campaign c-20260909200054-7947", + "20:17:48 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:17:48 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:17:48 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:17:48 baseline: pre: clean", + "20:17:48 mode: {'mode': 'grbl', 'controller': 'running', 'pid': 4449, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", + "20:17:48 mode after: {'mode': 'grbl', 'controller': 'running', 'pid': 4449, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", + "20:17:48 masked every axis (cnc/motor_lock=15); restarting forgectrl for a fresh probe", + "20:17:56 super: liveness probe: MOTION OK - head accel p2p x=2382 y=2801 (moving>=800 dead<=250)", + "20:17:56 kernel X 0.0 -> 0.0 mm across the probe (out and back)", + "20:17:56 PASS: masked restart probed MOTION OK on the first try, mask cleared, controller up", + "20:17:56 baseline: post: clean", + "20:17:56 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "motion.liveness-probe", - "ts": "2026-09-09T16:19:29Z" + "ts": "2026-09-09T20:17:56Z" }, "requires": [ "kernel.latch-locked-idle" @@ -9896,14 +9818,14 @@ "src/ui/panel.js" ] ], - "fingerprint": "b904fa38394eb6bb264a520c9889cd95a34ed646ba5daeb3416c5d758186165e", + "fingerprint": "9ff6d713edae289347ef338e9fb53d17d944faa6c8ee8cdf6656b01d08642498", "hardware": "api", "id": "motion.gate-waits-for-lid", - "inherited": false, + "inherited": true, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 15, "evidence": { "actions": [ @@ -9912,14 +9834,14 @@ "channel": "lid", "state": "open", "took_s": 0.04, - "ts": "2026-09-09T16:19:29Z" + "ts": "2026-09-09T20:17:57Z" }, { "by": "fixture", "channel": "lid", "state": "close", - "took_s": 0.41, - "ts": "2026-09-09T16:19:37Z" + "took_s": 0.39, + "ts": "2026-09-09T20:18:04Z" } ], "after_close": { @@ -9928,7 +9850,7 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 4005, + "pid": 4587, "why": "" }, "baseline": { @@ -9937,9 +9859,9 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, - "close_to_running_s": 6.5, + "close_to_running_s": 6.4, "fixture": { "channels": [ "lid", @@ -9961,7 +9883,7 @@ 0 ], "probe_lines": [ - "2026-09-09T16:19:42.295080+00:00 forgectrl[3965] INFO super: liveness probe: MOTION OK - head accel p2p x=3708 y=2140 (moving>=800 dead<=250)" + "2026-09-09T20:18:09.330921+00:00 forgectrl[4559] INFO super: liveness probe: MOTION OK - head accel p2p x=1677 y=2184 (moving>=800 dead<=250)" ], "waiting": { "controller": "waiting", @@ -9973,30 +9895,30 @@ "why": "the lid is open" } }, - "fingerprint": "b904fa38394eb6bb264a520c9889cd95a34ed646ba5daeb3416c5d758186165e", - "image": "20260909150456 (dev)", + "fingerprint": "9ff6d713edae289347ef338e9fb53d17d944faa6c8ee8cdf6656b01d08642498", + "image": "20260909193551 (dev)", "log": [ - "16:19:29 start motion.gate-waits-for-lid (operator, api) in campaign c-20260909160235-7649", - "16:19:29 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:19:29 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:19:29 fixture: running unattended (no prompt can be answered)", - "16:19:29 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:19:29 baseline: pre: clean", - "16:19:30 ACT lid open (fixture)", - "16:19:30 ACT lid open: done after 0.0 s", - "16:19:33 mode with the lid open: {'mode': 'grbl', 'controller': 'waiting', 'pid': 0, 'motion': 'unverified', 'gated': False, 'local': False, 'why': 'the lid is open'}", - "16:19:34 button LED targets while waiting (r, g, b): [255, 255, 0]", - "16:19:37 ACT lid close (fixture)", - "16:19:37 ACT lid close: done after 0.4 s", - "16:19:43 mode 6.5 s after the lid closed: {'mode': 'grbl', 'controller': 'running', 'pid': 4005, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", - "16:19:45 baseline: post: clean", - "16:19:45 result PASS" + "20:17:56 start motion.gate-waits-for-lid (operator, api) in campaign c-20260909200054-7947", + "20:17:56 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:17:56 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:17:56 fixture: running unattended (no prompt can be answered)", + "20:17:56 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:17:57 baseline: pre: clean", + "20:17:57 ACT lid open (fixture)", + "20:17:57 ACT lid open: done after 0.0 s", + "20:18:00 mode with the lid open: {'mode': 'grbl', 'controller': 'waiting', 'pid': 0, 'motion': 'unverified', 'gated': False, 'local': False, 'why': 'the lid is open'}", + "20:18:01 button LED targets while waiting (r, g, b): [255, 255, 0]", + "20:18:04 ACT lid close (fixture)", + "20:18:04 ACT lid close: done after 0.4 s", + "20:18:10 mode 6.4 s after the lid closed: {'mode': 'grbl', 'controller': 'running', 'pid': 4587, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", + "20:18:12 baseline: post: clean", + "20:18:12 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "motion.gate-waits-for-lid", - "ts": "2026-09-09T16:19:45Z" + "ts": "2026-09-09T20:18:12Z" }, "requires": [ "motion.liveness-probe" @@ -10026,14 +9948,14 @@ "src/liveness.*" ] ], - "fingerprint": "03aa0135c077b0d30be526948e895b5e45cf18ed6378508ff7ca09733d5fd47d", + "fingerprint": "700441d69ec914ec8a3198f47b17a57bbba9dedead588f669b19d9044579c4d6", "hardware": "api", "id": "motion.cancel-abort", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 6, "evidence": { "abort_drift_after_recovery_mm": 0.0, @@ -10045,7 +9967,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "cancel_moved_mm": 17.194, "final_drift_mm": 0.0, @@ -10067,29 +9989,29 @@ "switched": false } }, - "fingerprint": "03aa0135c077b0d30be526948e895b5e45cf18ed6378508ff7ca09733d5fd47d", - "image": "20260909150456 (dev)", + "fingerprint": "700441d69ec914ec8a3198f47b17a57bbba9dedead588f669b19d9044579c4d6", + "image": "20260909193551 (dev)", "log": [ - "16:19:45 start motion.cancel-abort (auto, api) in campaign c-20260909160235-7649", - "16:19:45 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:19:45 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:19:45 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:19:45 baseline: pre: clean", - "16:19:45 mode: test needs grbl - already in grbl mode", - "16:19:45 connect: Idle", - "16:19:46 jog cancel: moved 17.194 mm of 40 (state Idle)", - "16:19:48 ^X abort: state Alarm, moved 10.031 mm of 30, position retained (27.225, 0.0, 3.422)", - "16:19:48 $X -> ['ALARM:3', \"GrblHAL 1.1f ['$' or '$HELP' for help]\", \"[MSG:'$H'|'$X' to unlock]\", '[MSG:Caution: Unlocked]', 'ok']", - "16:19:50 after $X: (27.225, 0.0, 3.422) (moved 0.000 mm since the abort)", - "16:19:51 returned: drift 0.000 mm", - "16:19:52 baseline: post: clean", - "16:19:52 result PASS" + "20:18:12 start motion.cancel-abort (auto, api) in campaign c-20260909200054-7947", + "20:18:12 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:18:12 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:18:12 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:18:12 baseline: pre: clean", + "20:18:12 mode: test needs grbl - already in grbl mode", + "20:18:13 connect: Idle", + "20:18:13 jog cancel: moved 17.194 mm of 40 (state Idle)", + "20:18:15 ^X abort: state Alarm, moved 10.031 mm of 30, position retained (27.225, 0.0, 3.422)", + "20:18:15 $X -> ['ALARM:3', \"GrblHAL 1.1f ['$' or '$HELP' for help]\", \"[MSG:'$H'|'$X' to unlock]\", '[MSG:Caution: Unlocked]', 'ok']", + "20:18:17 after $X: (27.225, 0.0, 3.422) (moved 0.000 mm since the abort)", + "20:18:18 returned: drift 0.000 mm", + "20:18:19 baseline: post: clean", + "20:18:19 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "motion.cancel-abort", - "ts": "2026-09-09T16:19:52Z" + "ts": "2026-09-09T20:18:19Z" }, "requires": [ "motion.pacing" @@ -10127,14 +10049,14 @@ "init/**" ] ], - "fingerprint": "6de9ddb7b1feb72f63b2fcce1c3991ef634cc18268b6590c509f629f1b69d13b", + "fingerprint": "2d6c20033750d2dea8ff3798bf28579b9790ece818170e3df436141e5230bcfd", "hardware": "api", "id": "motion.deadman", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 29, "evidence": { "baseline": { @@ -10143,7 +10065,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -10169,7 +10091,7 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 4153, + "pid": 4747, "why": "" }, "rc": 0, @@ -10186,11 +10108,11 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 4075, + "pid": 4657, "why": "" }, - "old_pid": 4005, - "respawn_s": 1.3, + "old_pid": 4587, + "respawn_s": 1.4, "unlocked_seen": false }, "sigstop": { @@ -10200,7 +10122,7 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 4075, + "pid": 4657, "why": "" }, "halt_s": 0.2, @@ -10223,41 +10145,41 @@ ] } }, - "fingerprint": "6de9ddb7b1feb72f63b2fcce1c3991ef634cc18268b6590c509f629f1b69d13b", - "image": "20260909150456 (dev)", + "fingerprint": "2d6c20033750d2dea8ff3798bf28579b9790ece818170e3df436141e5230bcfd", + "image": "20260909193551 (dev)", "log": [ - "16:19:52 start motion.deadman (auto, api) in campaign c-20260909160235-7649", - "16:19:52 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:19:52 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:19:52 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:19:52 baseline: pre: clean", - "16:19:52 mode: test needs grbl - already in grbl mode", - "16:19:53 connect: Idle", - "16:19:54 SIGKILL sent to controller pid 4005 mid-move", - "16:19:55 after SIGKILL: respawned as {'mode': 'grbl', 'controller': 'running', 'pid': 4075, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''} in 1.3 s; latch unlocked seen: False", - "16:19:58 kernel X: 0.0 -> 0.0 mm", - "16:19:58 connect: Idle", - "16:20:00 SIGSTOP sent to controller pid 4075 mid-move", - "16:20:00 after SIGSTOP: kernel underrun in 0.2 s, latch locked True, underruns 2 -> 3", - "16:20:01 controller resumed: state Alarm", - "16:20:01 $X before the reset: ['ALARM:17', 'error:79']", - "16:20:03 after the soft reset: Alarm", - "16:20:03 $X after the reset: ['[MSG:Caution: Unlocked]', 'ok']", - "16:20:03 ring after the reset: free 33521664 (idle 33521664)", - "16:20:08 connect: Idle", - "16:20:10 forgectrl restart mid-move -> rc 0", - "16:20:14 move after the restart: states ['Run', 'Idle']", - "16:20:21 mode after restart: {'mode': 'grbl', 'controller': 'running', 'pid': 4153, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", - "16:20:21 retake: unmanaged pid 4075 finished the move; supervised pid 4153 started at idle", - "16:20:21 PASS: kill respawned in 1.3 s, hang -> underrun in 0.2 s, restart retook supervision (pid 4153)", - "16:20:21 baseline: post: clean", - "16:20:21 result PASS" + "20:18:19 start motion.deadman (auto, api) in campaign c-20260909200054-7947", + "20:18:19 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:18:19 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:18:19 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:18:19 baseline: pre: clean", + "20:18:19 mode: test needs grbl - already in grbl mode", + "20:18:20 connect: Idle", + "20:18:21 SIGKILL sent to controller pid 4587 mid-move", + "20:18:22 after SIGKILL: respawned as {'mode': 'grbl', 'controller': 'running', 'pid': 4657, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''} in 1.4 s; latch unlocked seen: False", + "20:18:25 kernel X: 0.0 -> 0.0 mm", + "20:18:26 connect: Idle", + "20:18:27 SIGSTOP sent to controller pid 4657 mid-move", + "20:18:27 after SIGSTOP: kernel underrun in 0.2 s, latch locked True, underruns 2 -> 3", + "20:18:28 controller resumed: state Alarm", + "20:18:28 $X before the reset: ['ALARM:17', 'error:79']", + "20:18:30 after the soft reset: Alarm", + "20:18:30 $X after the reset: ['[MSG:Caution: Unlocked]', 'ok']", + "20:18:30 ring after the reset: free 33521664 (idle 33521664)", + "20:18:35 connect: Idle", + "20:18:37 forgectrl restart mid-move -> rc 0", + "20:18:41 move after the restart: states ['Run', 'Idle']", + "20:18:48 mode after restart: {'mode': 'grbl', 'controller': 'running', 'pid': 4747, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", + "20:18:48 retake: unmanaged pid 4657 finished the move; supervised pid 4747 started at idle", + "20:18:48 PASS: kill respawned in 1.4 s, hang -> underrun in 0.2 s, restart retook supervision (pid 4747)", + "20:18:49 baseline: post: clean", + "20:18:49 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "motion.deadman", - "ts": "2026-09-09T16:20:21Z" + "ts": "2026-09-09T20:18:49Z" }, "requires": [ "motion.cancel-abort", @@ -10300,14 +10222,14 @@ "src/glowforge_laser.c" ] ], - "fingerprint": "748841e1d3f9af685524bfcc0c2a74526e9d46528b10f3d0f347a0a98c3a0b56", + "fingerprint": "e6f71d75354617ea872bc0f580ff36b217628c2834fbdcc34f92e45ac84e17be", "hardware": "api", "id": "motion.button-hold-resume", - "inherited": false, + "inherited": true, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 11, "evidence": { "actions": [ @@ -10315,15 +10237,15 @@ "by": "fixture", "channel": "button", "state": "press", - "took_s": 0.12, - "ts": "2026-09-09T16:20:23Z" + "took_s": 0.11, + "ts": "2026-09-09T20:18:50Z" }, { "by": "fixture", "channel": "button", "state": "press", "took_s": 0.13, - "ts": "2026-09-09T16:20:23Z" + "ts": "2026-09-09T20:18:50Z" } ], "baseline": { @@ -10332,7 +10254,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -10358,34 +10280,34 @@ "resume_message": true, "state_after_resume": "Run" }, - "fingerprint": "748841e1d3f9af685524bfcc0c2a74526e9d46528b10f3d0f347a0a98c3a0b56", - "image": "20260909150456 (dev)", + "fingerprint": "e6f71d75354617ea872bc0f580ff36b217628c2834fbdcc34f92e45ac84e17be", + "image": "20260909193551 (dev)", "log": [ - "16:20:21 start motion.button-hold-resume (operator, api) in campaign c-20260909160235-7649", - "16:20:21 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:20:21 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:20:21 fixture: running unattended (no prompt can be answered)", - "16:20:21 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:20:21 baseline: pre: clean", - "16:20:21 mode: test needs grbl - already in grbl mode", - "16:20:22 connect: Idle", - "16:20:22 READY (fixture performs the step): On Ready the head starts an 8 s move along +X. Press the button ONCE while it moves; the job holds and the test sees it.", - "16:20:23 ACT button press (fixture)", - "16:20:23 ACT button press: done after 0.1 s", - "16:20:23 held: Hold:0 at 3.694 mm of 40; message seen: True", - "16:20:23 ACT button press (fixture)", - "16:20:23 ACT button press: done after 0.1 s", - "16:20:23 resumed: Run; message seen: True", - "16:20:31 move completed after pause/resume: 39.994 mm of 40", - "16:20:32 PASS: button press held the job (Hold:0), the next press resumed it, target reached", - "16:20:32 baseline: post: clean", - "16:20:32 result PASS" + "20:18:49 start motion.button-hold-resume (operator, api) in campaign c-20260909200054-7947", + "20:18:49 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:18:49 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:18:49 fixture: running unattended (no prompt can be answered)", + "20:18:49 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:18:49 baseline: pre: clean", + "20:18:49 mode: test needs grbl - already in grbl mode", + "20:18:49 connect: Idle", + "20:18:49 READY (fixture performs the step): On Ready the head starts an 8 s move along +X. Press the button ONCE while it moves; the job holds and the test sees it.", + "20:18:50 ACT button press (fixture)", + "20:18:50 ACT button press: done after 0.1 s", + "20:18:50 held: Hold:0 at 3.694 mm of 40; message seen: True", + "20:18:50 ACT button press (fixture)", + "20:18:51 ACT button press: done after 0.1 s", + "20:18:51 resumed: Run; message seen: True", + "20:18:58 move completed after pause/resume: 39.994 mm of 40", + "20:19:00 PASS: button press held the job (Hold:0), the next press resumed it, target reached", + "20:19:00 baseline: post: clean", + "20:19:00 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "motion.button-hold-resume", - "ts": "2026-09-09T16:20:32Z" + "ts": "2026-09-09T20:19:00Z" }, "requires": [ "motion.pacing" @@ -10427,14 +10349,14 @@ "src/glowforge_laser.c" ] ], - "fingerprint": "7b45d1b9827f60fa2e0cd14e30c937052edcfb118c35e5fc72fdb7339464ebd6", + "fingerprint": "d6cead9eaf587417170fa5062cb9c6546f25e3417b61c953b0ffd00a413c1f37", "hardware": "api", "id": "motion.lid-cancel-home", - "inherited": false, + "inherited": true, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 15, "evidence": { "actions": [ @@ -10442,36 +10364,36 @@ "by": "fixture", "channel": "lid", "state": "open", - "took_s": 0.03, - "ts": "2026-09-09T16:20:34Z" + "took_s": 0.05, + "ts": "2026-09-09T20:19:01Z" }, { "by": "fixture", "channel": "lid", "state": "close", "took_s": 0.33, - "ts": "2026-09-09T16:20:37Z" + "ts": "2026-09-09T20:19:05Z" }, { "by": "fixture", "channel": "button", "state": "press", "took_s": 0.12, - "ts": "2026-09-09T16:20:41Z" + "ts": "2026-09-09T20:19:08Z" }, { "by": "fixture", "channel": "lid", "state": "open", "took_s": 0.04, - "ts": "2026-09-09T16:20:41Z" + "ts": "2026-09-09T20:19:09Z" }, { "by": "fixture", "channel": "lid", "state": "close", "took_s": 0.33, - "ts": "2026-09-09T16:20:44Z" + "ts": "2026-09-09T20:19:12Z" } ], "baseline": { @@ -10495,7 +10417,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -10551,46 +10473,46 @@ 3.422 ] }, - "fingerprint": "7b45d1b9827f60fa2e0cd14e30c937052edcfb118c35e5fc72fdb7339464ebd6", - "image": "20260909150456 (dev)", + "fingerprint": "d6cead9eaf587417170fa5062cb9c6546f25e3417b61c953b0ffd00a413c1f37", + "image": "20260909193551 (dev)", "log": [ - "16:20:33 start motion.lid-cancel-home (operator, api) in campaign c-20260909160235-7649", - "16:20:33 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:20:33 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:20:33 fixture: running unattended (no prompt can be answered)", - "16:20:33 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:20:33 baseline: pre: clean", - "16:20:33 mode: test needs grbl - already in grbl mode", - "16:20:33 connect: Idle", - "16:20:33 READY (fixture performs the step): On Ready the head starts an 8 s move along +X. Open the lid while it moves and leave it open until the head has come back on its own.", - "16:20:34 ACT lid open (fixture)", - "16:20:34 ACT lid open: done after 0.0 s", - "16:20:37 [running] controller: ['[MSG:Check Door]', '[MSG:Warning: lid opened - job canceled, returning to the job start]', \"GrblHAL 1.1f ['$' or '$HELP' for help]\", '[MSG:Info: returned to the job start]']", - "16:20:37 [running] back at the job start: drift 0.038 mm", - "16:20:37 kernel counters: start (0.00, 0.00) -> now (0.04, 0.00), drift 0.040 mm", - "16:20:37 ACT lid close (fixture)", - "16:20:38 ACT lid close: done after 0.3 s", - "16:20:40 READY (fixture performs the step): On Ready the head starts the 8 s move again. Press the button ONCE while it moves (the job pauses); then open the lid and leave it open until the head has come back.", - "16:20:41 ACT button press (fixture)", - "16:20:41 ACT button press: done after 0.1 s", - "16:20:41 paused: Hold:0; message seen: True", - "16:20:41 ACT lid open (fixture)", - "16:20:41 ACT lid open: done after 0.0 s", - "16:20:44 [hold] controller: ['[MSG:Check Door]', '[MSG:Warning: lid opened - job canceled, returning to the job start]', \"GrblHAL 1.1f ['$' or '$HELP' for help]\", '[MSG:Info: returned to the job start]']", - "16:20:44 [hold] back at the job start: drift 0.037 mm", - "16:20:44 kernel counters: start (0.04, 0.00) -> now (0.07, 0.00), drift 0.030 mm", - "16:20:44 ACT lid close (fixture)", - "16:20:45 ACT lid close: done after 0.3 s", - "16:20:47 PASS: lid open canceled the job from Run (drift 0.038 mm) and from the hold (drift 0.037 mm), reset without alarm, head returned to the start both times", - "16:20:48 baseline: head jogged back -0.075/-0.000 mm to its start", - "16:20:48 baseline: post: 1 leftover(s): position=[4, 0, 0] (expected [0, 0, 0]) -> restored (jogged back -0.1/-0.0 mm)", - "16:20:48 result PASS" + "20:19:00 start motion.lid-cancel-home (operator, api) in campaign c-20260909200054-7947", + "20:19:00 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:19:00 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:19:00 fixture: running unattended (no prompt can be answered)", + "20:19:00 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:19:00 baseline: pre: clean", + "20:19:00 mode: test needs grbl - already in grbl mode", + "20:19:01 connect: Idle", + "20:19:01 READY (fixture performs the step): On Ready the head starts an 8 s move along +X. Open the lid while it moves and leave it open until the head has come back on its own.", + "20:19:01 ACT lid open (fixture)", + "20:19:02 ACT lid open: done after 0.0 s", + "20:19:05 [running] controller: ['[MSG:Check Door]', '[MSG:Warning: lid opened - job canceled, returning to the job start]', \"GrblHAL 1.1f ['$' or '$HELP' for help]\", '[MSG:Info: returned to the job start]']", + "20:19:05 [running] back at the job start: drift 0.038 mm", + "20:19:05 kernel counters: start (0.00, 0.00) -> now (0.04, 0.00), drift 0.040 mm", + "20:19:05 ACT lid close (fixture)", + "20:19:05 ACT lid close: done after 0.3 s", + "20:19:08 READY (fixture performs the step): On Ready the head starts the 8 s move again. Press the button ONCE while it moves (the job pauses); then open the lid and leave it open until the head has come back.", + "20:19:08 ACT button press (fixture)", + "20:19:08 ACT button press: done after 0.1 s", + "20:19:08 paused: Hold:0; message seen: True", + "20:19:09 ACT lid open (fixture)", + "20:19:09 ACT lid open: done after 0.0 s", + "20:19:12 [hold] controller: ['[MSG:Check Door]', '[MSG:Warning: lid opened - job canceled, returning to the job start]', \"GrblHAL 1.1f ['$' or '$HELP' for help]\", '[MSG:Info: returned to the job start]']", + "20:19:12 [hold] back at the job start: drift 0.037 mm", + "20:19:12 kernel counters: start (0.04, 0.00) -> now (0.07, 0.00), drift 0.030 mm", + "20:19:12 ACT lid close (fixture)", + "20:19:12 ACT lid close: done after 0.3 s", + "20:19:15 PASS: lid open canceled the job from Run (drift 0.038 mm) and from the hold (drift 0.037 mm), reset without alarm, head returned to the start both times", + "20:19:16 baseline: head jogged back -0.075/-0.000 mm to its start", + "20:19:16 baseline: post: 1 leftover(s): position=[4, 0, 0] (expected [0, 0, 0]) -> restored (jogged back -0.1/-0.0 mm)", + "20:19:16 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "motion.lid-cancel-home", - "ts": "2026-09-09T16:20:48Z" + "ts": "2026-09-09T20:19:16Z" }, "requires": [ "motion.pacing", @@ -10633,14 +10555,14 @@ "src/glowforge_laser.c" ] ], - "fingerprint": "24f882bae2a811829b67245a58ebc831def7807b93ce846fcdc7d7dced1ca5b3", + "fingerprint": "14efcc9766de1f099e0883b501f2b6bc4cb3779577fc30b9890d3527a7e0c92b", "hardware": "api", "id": "motion.interlock-cancel-home", - "inherited": false, + "inherited": true, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 8, "evidence": { "actions": [ @@ -10648,15 +10570,15 @@ "by": "fixture", "channel": "interlock", "state": "open", - "took_s": 0.04, - "ts": "2026-09-09T16:20:50Z" + "took_s": 0.03, + "ts": "2026-09-09T20:19:17Z" }, { "by": "fixture", "channel": "interlock", "state": "close", "took_s": 0.33, - "ts": "2026-09-09T16:20:53Z" + "ts": "2026-09-09T20:19:21Z" } ], "baseline": { @@ -10680,7 +10602,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -10728,36 +10650,36 @@ "lid": true } }, - "fingerprint": "24f882bae2a811829b67245a58ebc831def7807b93ce846fcdc7d7dced1ca5b3", - "image": "20260909150456 (dev)", + "fingerprint": "14efcc9766de1f099e0883b501f2b6bc4cb3779577fc30b9890d3527a7e0c92b", + "image": "20260909193551 (dev)", "log": [ - "16:20:49 start motion.interlock-cancel-home (operator, api) in campaign c-20260909160235-7649", - "16:20:49 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:20:49 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:20:49 fixture: running unattended (no prompt can be answered)", - "16:20:49 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:20:49 baseline: pre: clean", - "16:20:49 mode: test needs grbl - already in grbl mode", - "16:20:49 connect: Idle", - "16:20:49 READY (fixture performs the step): On Ready the head starts a 12 s move along +X. Open the interlock loop while it moves and leave it open until the head has come back on its own.", - "16:20:50 ACT interlock open (fixture)", - "16:20:50 ACT interlock open: done after 0.0 s", - "16:20:53 [interlock] controller: ['[MSG:Check Door]', '[MSG:Warning: interlock open - job canceled, returning to the job start]', \"GrblHAL 1.1f ['$' or '$HELP' for help]\", '[MSG:Info: returned to the job start]']", - "16:20:53 [interlock] back at the job start: drift 0.038 mm", - "16:20:53 kernel counters: start (0.00, 0.00) -> now (0.04, 0.00), drift 0.040 mm", - "16:20:53 at the end of the park: {'lid': True, 'interlock_ok': False}", - "16:20:53 ACT interlock close (fixture)", - "16:20:54 ACT interlock close: done after 0.3 s", - "16:20:56 PASS: interlock open canceled the job with its own reason and the head returned to the start (drift 0.038 mm) with the loop still open", - "16:20:57 baseline: head jogged back -0.038/-0.000 mm to its start", - "16:20:57 baseline: post: 1 leftover(s): position=[2, 0, 0] (expected [0, 0, 0]) -> restored (jogged back -0.0/-0.0 mm)", - "16:20:57 result PASS" + "20:19:16 start motion.interlock-cancel-home (operator, api) in campaign c-20260909200054-7947", + "20:19:16 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:19:16 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:19:16 fixture: running unattended (no prompt can be answered)", + "20:19:16 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:19:16 baseline: pre: clean", + "20:19:16 mode: test needs grbl - already in grbl mode", + "20:19:17 connect: Idle", + "20:19:17 READY (fixture performs the step): On Ready the head starts a 12 s move along +X. Open the interlock loop while it moves and leave it open until the head has come back on its own.", + "20:19:17 ACT interlock open (fixture)", + "20:19:18 ACT interlock open: done after 0.0 s", + "20:19:21 [interlock] controller: ['[MSG:Check Door]', '[MSG:Warning: interlock open - job canceled, returning to the job start]', \"GrblHAL 1.1f ['$' or '$HELP' for help]\", '[MSG:Info: returned to the job start]']", + "20:19:21 [interlock] back at the job start: drift 0.038 mm", + "20:19:21 kernel counters: start (0.00, 0.00) -> now (0.04, 0.00), drift 0.040 mm", + "20:19:21 at the end of the park: {'lid': True, 'interlock_ok': False}", + "20:19:21 ACT interlock close (fixture)", + "20:19:21 ACT interlock close: done after 0.3 s", + "20:19:24 PASS: interlock open canceled the job with its own reason and the head returned to the start (drift 0.038 mm) with the loop still open", + "20:19:25 baseline: head jogged back -0.038/-0.000 mm to its start", + "20:19:25 baseline: post: 1 leftover(s): position=[2, 0, 0] (expected [0, 0, 0]) -> restored (jogged back -0.0/-0.0 mm)", + "20:19:25 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "motion.interlock-cancel-home", - "ts": "2026-09-09T16:20:57Z" + "ts": "2026-09-09T20:19:25Z" }, "requires": [ "motion.lid-cancel-home" @@ -10803,14 +10725,14 @@ "src/settings.*" ] ], - "fingerprint": "4fd191660b370c16879c0f8dc884987b88c59e5ba50856d16b1ccac3b1f75fa4", + "fingerprint": "7d73400b74ff62569284576bc608e4e0aace257fc358b87e0bfb1cbf0036ff66", "hardware": "api", "id": "motion.lid-policy-hold", - "inherited": false, + "inherited": true, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 13, "evidence": { "actions": [ @@ -10818,15 +10740,15 @@ "by": "fixture", "channel": "lid", "state": "open", - "took_s": 0.05, - "ts": "2026-09-09T16:20:59Z" + "took_s": 0.06, + "ts": "2026-09-09T20:19:26Z" }, { "by": "fixture", "channel": "lid", "state": "close", "took_s": 0.33, - "ts": "2026-09-09T16:20:59Z" + "ts": "2026-09-09T20:19:27Z" } ], "baseline": { @@ -10842,7 +10764,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "door_state": "Door:1", "fixture": { @@ -10869,7 +10791,7 @@ }, "moved_mm": 39.994, "parked_at": [ - 3.638, + 3.581, 0.0, 3.422 ], @@ -10879,35 +10801,35 @@ "Idle" ] }, - "fingerprint": "4fd191660b370c16879c0f8dc884987b88c59e5ba50856d16b1ccac3b1f75fa4", - "image": "20260909150456 (dev)", + "fingerprint": "7d73400b74ff62569284576bc608e4e0aace257fc358b87e0bfb1cbf0036ff66", + "image": "20260909193551 (dev)", "log": [ - "16:20:57 start motion.lid-policy-hold (operator, api) in campaign c-20260909160235-7649", - "16:20:57 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:20:57 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:20:57 fixture: running unattended (no prompt can be answered)", - "16:20:57 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:20:58 baseline: pre: clean", - "16:20:58 mode: test needs grbl - already in grbl mode", - "16:20:58 connect: Idle", - "16:20:58 READY (fixture performs the step): On Ready the head starts an 8 s move along +X. Open the lid while it moves; the job parks in the door state and waits.", - "16:20:59 ACT lid open (fixture)", - "16:20:59 ACT lid open: done after 0.0 s", - "16:20:59 parked in Door:1 at (3.638, 0.0, 3.422)", - "16:20:59 ACT lid close (fixture)", - "16:20:59 ACT lid close: done after 0.3 s", - "16:21:00 after the lid closed: Door:0 (a cycle start is needed)", - "16:21:08 finished: moved 39.994 mm of 40 (states ['Run', 'Idle'])", - "16:21:11 lid_policy restored to cancel", - "16:21:11 PASS: lid_policy=hold parked the job in Door and the cycle start finished it (39.994 mm)", - "16:21:11 baseline: post: 1 leftover(s): settings.lid_policy=cancel (expected ) -> restored", - "16:21:11 result PASS" + "20:19:25 start motion.lid-policy-hold (operator, api) in campaign c-20260909200054-7947", + "20:19:25 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:19:25 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:19:25 fixture: running unattended (no prompt can be answered)", + "20:19:25 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:19:25 baseline: pre: clean", + "20:19:25 mode: test needs grbl - already in grbl mode", + "20:19:26 connect: Idle", + "20:19:26 READY (fixture performs the step): On Ready the head starts an 8 s move along +X. Open the lid while it moves; the job parks in the door state and waits.", + "20:19:26 ACT lid open (fixture)", + "20:19:27 ACT lid open: done after 0.1 s", + "20:19:27 parked in Door:1 at (3.581, 0.0, 3.422)", + "20:19:27 ACT lid close (fixture)", + "20:19:27 ACT lid close: done after 0.3 s", + "20:19:28 after the lid closed: Door:0 (a cycle start is needed)", + "20:19:35 finished: moved 39.994 mm of 40 (states ['Run', 'Idle'])", + "20:19:38 lid_policy restored to cancel", + "20:19:38 PASS: lid_policy=hold parked the job in Door and the cycle start finished it (39.994 mm)", + "20:19:38 baseline: post: 1 leftover(s): settings.lid_policy=cancel (expected ) -> restored", + "20:19:38 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "motion.lid-policy-hold", - "ts": "2026-09-09T16:21:11Z" + "ts": "2026-09-09T20:19:38Z" }, "requires": [ "motion.lid-cancel-home" @@ -10937,14 +10859,14 @@ "src/liveness.*" ] ], - "fingerprint": "c1792cacfabc107d006bf5471556f0e4fddc3a0e14ada4026b74ae205fa7f986", + "fingerprint": "69bafbfdfdf158e601dc566d45365221256b94ca24aaeff4ff8cf56c2a6a9bac", "hardware": "api", "id": "motion.step-timing-under-load", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 30, "evidence": { "baseline": { @@ -10953,10 +10875,10 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "clamp_lines": [], - "controller_cpu_pct": 24.4, + "controller_cpu_pct": 24.5, "fixture": { "channels": [ "lid", @@ -10983,29 +10905,29 @@ ], "threads": 4 }, - "fingerprint": "c1792cacfabc107d006bf5471556f0e4fddc3a0e14ada4026b74ae205fa7f986", - "image": "20260909150456 (dev)", + "fingerprint": "69bafbfdfdf158e601dc566d45365221256b94ca24aaeff4ff8cf56c2a6a9bac", + "image": "20260909193551 (dev)", "log": [ - "16:21:11 start motion.step-timing-under-load (auto, api) in campaign c-20260909160235-7649", - "16:21:11 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:21:11 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:21:11 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:21:11 baseline: pre: clean", - "16:21:11 mode: test needs grbl - already in grbl mode", - "16:21:11 controller threads: 4, SCHED_FIFO priorities: [9, 10]", - "16:21:11 CPU hog started (pid 4369, nice 5)", - "16:21:12 connect: Idle", - "16:21:38 20 legs in 26.5 s, controller CPU 24.4 %", - "16:21:41 CPU hog stopped", - "16:21:41 PASS: 20 legs at 2000 mm/min against a nice-5 CPU hog, no clamped events", - "16:21:41 baseline: post: clean", - "16:21:41 result PASS" + "20:19:39 start motion.step-timing-under-load (auto, api) in campaign c-20260909200054-7947", + "20:19:39 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:19:39 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:19:39 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:19:39 baseline: pre: clean", + "20:19:39 mode: test needs grbl - already in grbl mode", + "20:19:39 controller threads: 4, SCHED_FIFO priorities: [9, 10]", + "20:19:39 CPU hog started (pid 4962, nice 5)", + "20:19:39 connect: Idle", + "20:20:06 20 legs in 26.5 s, controller CPU 24.5 %", + "20:20:09 CPU hog stopped", + "20:20:09 PASS: 20 legs at 2000 mm/min against a nice-5 CPU hog, no clamped events", + "20:20:09 baseline: post: clean", + "20:20:09 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "motion.step-timing-under-load", - "ts": "2026-09-09T16:21:41Z" + "ts": "2026-09-09T20:20:09Z" }, "requires": [ "kernel.latch-locked-idle", @@ -11068,14 +10990,14 @@ "src/pic*" ] ], - "fingerprint": "ce44e9016d66fe9d7b8f3bb4f2d1d829070edc96f465ae334dcf3f126b474d7e", + "fingerprint": "37ee9d6074bcd101cf9e11d4a5468ff2d27d39bc8c1614f5e9bb372053aee9f8", "hardware": "api", "id": "cooling.aa-offset-calibrate", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 92, "evidence": { "baseline": { @@ -11084,7 +11006,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -11097,76 +11019,76 @@ "released": [] }, "result": { - "offset_counts": 20.5, - "recommend": 20.5, - "spread_counts": 2.2, + "offset_counts": 15.4, + "recommend": 15.4, + "spread_counts": 1.2, "steps": [ [ - 21.0, - 21.2 + 16.0, + 15.3 ], [ - -19.8, - -20.4 + -15.8, + -15.7 ], [ - 20.3, - 20.3 + 14.8, + 15.6 ], [ - -20.5, - -20.8 + -15.5, + -15.1 ], [ - 20.3, - 19.0 + 15.3, + 15.5 ], [ - -20.7, - -21.2 + -14.8, + -15.4 ] ] } }, - "fingerprint": "ce44e9016d66fe9d7b8f3bb4f2d1d829070edc96f465ae334dcf3f126b474d7e", - "image": "20260909150456 (dev)", + "fingerprint": "37ee9d6074bcd101cf9e11d4a5468ff2d27d39bc8c1614f5e9bb372053aee9f8", + "image": "20260909193551 (dev)", "log": [ - "16:11:19 start cooling.aa-offset-calibrate (auto, api) in campaign c-20260909160235-7649", - "16:11:19 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:11:19 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:11:19 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:11:20 baseline: pre: clean", - "16:11:20 POST /diag/aa-offset-calibrate -> 202 {'started': True}", - "16:11:20 phase: stopping the motion controller", - "16:11:22 phase: settling with the fans idle", - "16:11:36 phase: cycle 1/3: air assist to run", - "16:11:48 phase: cycle 1/3: air assist to idle", - "16:11:50 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:12:00 phase: cycle 2/3: air assist to run", - "16:12:14 phase: cycle 2/3: air assist to idle", - "16:12:20 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:12:26 phase: cycle 3/3: air assist to run", - "16:12:38 phase: cycle 3/3: air assist to idle", - "16:12:50 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:12:52 phase: done", - "16:12:52 diag: 0:00 start: air assist 204 <-> 1023, 3 cycles", - "16:12:52 diag: 0:26 edge 1 (to run): down +21.0, up +21.2 counts", - "16:12:52 diag: 0:39 edge 2 (to idle): down -19.8, up -20.4 counts", - "16:12:52 diag: 0:52 edge 3 (to run): down +20.3, up +20.3 counts", - "16:12:52 diag: 1:05 edge 4 (to idle): down -20.5, up -20.8 counts", - "16:12:52 diag: 1:17 edge 5 (to run): down +20.3, up +19.0 counts", - "16:12:52 diag: 1:30 edge 6 (to idle): down -20.7, up -21.2 counts", - "16:12:52 diag: 1:30 offset 20.5 counts (spread 2.2) over 6 edges", - "16:12:52 diag: 1:30 done", - "16:12:52 offset 20.5 counts, spread 2.2, recommend 20.5, edges [[21.0, 21.2], [-19.8, -20.4], [20.3, 20.3], [-20.5, -20.8], [20.3, 19.0], [-20.7, -21.2]]", - "16:12:52 baseline: post: clean", - "16:12:52 result PASS" + "20:09:40 start cooling.aa-offset-calibrate (auto, api) in campaign c-20260909200054-7947", + "20:09:40 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:09:40 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:09:40 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:09:40 baseline: pre: clean", + "20:09:40 POST /diag/aa-offset-calibrate -> 202 {'started': True}", + "20:09:40 phase: stopping the motion controller", + "20:09:42 phase: settling with the fans idle", + "20:09:57 phase: cycle 1/3: air assist to run", + "20:10:09 phase: cycle 1/3: air assist to idle", + "20:10:11 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:10:21 phase: cycle 2/3: air assist to run", + "20:10:35 phase: cycle 2/3: air assist to idle", + "20:10:41 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:10:47 phase: cycle 3/3: air assist to run", + "20:10:59 phase: cycle 3/3: air assist to idle", + "20:11:12 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:11:13 phase: done", + "20:11:13 diag: 0:00 start: air assist 204 <-> 1023, 3 cycles", + "20:11:13 diag: 0:27 edge 1 (to run): down +16.0, up +15.3 counts", + "20:11:13 diag: 0:40 edge 2 (to idle): down -15.8, up -15.7 counts", + "20:11:13 diag: 0:53 edge 3 (to run): down +14.8, up +15.6 counts", + "20:11:13 diag: 1:05 edge 4 (to idle): down -15.5, up -15.1 counts", + "20:11:13 diag: 1:18 edge 5 (to run): down +15.3, up +15.5 counts", + "20:11:13 diag: 1:31 edge 6 (to idle): down -14.8, up -15.4 counts", + "20:11:13 diag: 1:31 offset 15.4 counts (spread 1.2) over 6 edges", + "20:11:13 diag: 1:31 done", + "20:11:13 offset 15.4 counts, spread 1.2, recommend 15.4, edges [[16.0, 15.3], [-15.8, -15.7], [14.8, 15.6], [-15.5, -15.1], [15.3, 15.5], [-14.8, -15.4]]", + "20:11:13 baseline: post: clean", + "20:11:13 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cooling.aa-offset-calibrate", - "ts": "2026-09-09T16:12:52Z" + "ts": "2026-09-09T20:11:13Z" }, "requires": [ "kernel.latch-locked-idle" @@ -11228,15 +11150,15 @@ "src/pic*" ] ], - "fingerprint": "22731ab7d3c260cf6529c5b65a8c81b38d643f389657903832c9ebaddb2d6978", + "fingerprint": "00e87325b62493a049ed9bcd083ee3015bcb71850f922642c6e592a6de4339c0", "hardware": "api", "id": "cooling.flow-verify", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 160, + "campaign": "c-20260909200054-7947", + "duration_s": 164, "evidence": { "baseline": { "post": [], @@ -11244,7 +11166,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -11257,51 +11179,51 @@ "released": [] }, "result": { - "flow_dt": 10.2, - "flow_rise": 11.8, - "margin_flow": 2.6, + "flow_dt": 10.5, + "flow_rise": 12.1, + "margin_flow": 2.3, "margin_noflow": 4.7, - "noflow_dt": 13.9, + "noflow_dt": 13.3, "noflow_rise": 19.1, "pass": true, "thin_margin": false, "threshold": 14.4 } }, - "fingerprint": "22731ab7d3c260cf6529c5b65a8c81b38d643f389657903832c9ebaddb2d6978", - "image": "20260909150456 (dev)", + "fingerprint": "00e87325b62493a049ed9bcd083ee3015bcb71850f922642c6e592a6de4339c0", + "image": "20260909193551 (dev)", "log": [ - "16:12:52 start cooling.flow-verify (auto, api) in campaign c-20260909160235-7649", - "16:12:52 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:12:52 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:12:52 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:12:52 baseline: pre: clean", - "16:12:52 POST /diag/flow-verify -> 202 {'started': True}", - "16:12:52 phase: stopping the motion controller (down 25.4 C, up 25.6 C)", - "16:12:54 phase: settling before trial 1/1 (pump on) (down 25.7 C, up 25.7 C)", - "16:13:08 phase: trial 1/1: heater 40% for 50 s (pump on) (down 25.4 C, up 25.5 C)", - "16:13:23 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:13:53 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:14:01 phase: settling before trial 1/1 (pump off) (down 37.3 C, up 27.0 C)", - "16:14:23 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:14:41 phase: trial 1/1: heater 40% for 50 s (pump off) (down 25.4 C, up 24.8 C)", - "16:14:53 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:15:24 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:15:33 phase: done (down 43.8 C, up 29.9 C)", - "16:15:33 diag: 0:00 start: duty 40%, window 50 s, threshold 14.4 C", - "16:15:33 diag: 1:08 trial 1/1 flow: rise 11.8 C, dT 10.2 C", - "16:15:33 diag: 2:40 trial 1/1 no-flow: rise 19.1 C, dT 13.9 C", - "16:15:33 diag: 2:40 verdict: PASS (flow 11.8 / threshold 14.4 / no-flow 19.1)", - "16:15:33 diag: 2:40 done", - "16:15:33 verdict: pass=True threshold=14.4 flow_rise=11.8 noflow_rise=19.1 margins 2.6/4.7 thin=False", - "16:15:33 baseline: post: clean", - "16:15:33 result PASS" + "20:11:13 start cooling.flow-verify (auto, api) in campaign c-20260909200054-7947", + "20:11:13 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:11:13 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:11:13 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:11:13 baseline: pre: clean", + "20:11:13 POST /diag/flow-verify -> 202 {'started': True}", + "20:11:13 phase: stopping the motion controller (down 25.1 C, up 25.1 C)", + "20:11:15 phase: settling before trial 1/1 (pump on) (down 25.2 C, up 25.2 C)", + "20:11:29 phase: trial 1/1: heater 40% for 50 s (pump on) (down 25.3 C, up 25.0 C)", + "20:11:44 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:12:15 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:12:22 phase: settling before trial 1/1 (pump off) (down 37.1 C, up 26.2 C)", + "20:12:45 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:13:06 phase: trial 1/1: heater 40% for 50 s (pump off) (down 24.6 C, up 24.4 C)", + "20:13:15 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:13:45 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:13:58 phase: done (down 43.4 C, up 30.1 C)", + "20:13:58 diag: 0:00 start: duty 40%, window 50 s, threshold 14.4 C", + "20:13:58 diag: 1:08 trial 1/1 flow: rise 12.1 C, dT 10.5 C", + "20:13:58 diag: 2:44 trial 1/1 no-flow: rise 19.1 C, dT 13.3 C", + "20:13:58 diag: 2:44 verdict: PASS (flow 12.1 / threshold 14.4 / no-flow 19.1)", + "20:13:58 diag: 2:44 done", + "20:13:58 verdict: pass=True threshold=14.4 flow_rise=12.1 noflow_rise=19.1 margins 2.3/4.7 thin=False", + "20:13:58 baseline: post: clean", + "20:13:58 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cooling.flow-verify", - "ts": "2026-09-09T16:15:33Z" + "ts": "2026-09-09T20:13:58Z" }, "requires": [ "kernel.latch-locked-idle" @@ -11367,21 +11289,21 @@ "src/super.c" ] ], - "fingerprint": "42ee21e10c8be7d583e39fd2c9896fb12327e3c8fb34ca45332e1a67ef7c476a", + "fingerprint": "250171e877036b8a8143ed1538fce2c773e634e79d50ddabb566e8779c1d1f1e", "hardware": "api", "id": "cooling.fans-quiet-after-motion", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 55, "evidence": { "after": { - "air_assist": 2129, + "air_assist": 2216, "exhaust": 0, "intake_1": 731, - "intake_2": 734 + "intake_2": 728 }, "baseline": { "post": [], @@ -11389,19 +11311,19 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "before": { - "air_assist": 2158, + "air_assist": 2145, "exhaust": 0, "intake_1": 734, - "intake_2": 728 + "intake_2": 733 }, "during_m8": { - "air_assist": 10997, - "exhaust": 6523, - "intake_1": 1127, - "intake_2": 1114 + "air_assist": 11061, + "exhaust": 7327, + "intake_1": 1257, + "intake_2": 1253 }, "duty_after": { "thermal/exhaust_pwm": 0, @@ -11437,39 +11359,39 @@ "restart_idle_s": 20.0, "settle_s": 15.1 }, - "fingerprint": "42ee21e10c8be7d583e39fd2c9896fb12327e3c8fb34ca45332e1a67ef7c476a", - "image": "20260909150456 (dev)", + "fingerprint": "250171e877036b8a8143ed1538fce2c773e634e79d50ddabb566e8779c1d1f1e", + "image": "20260909193551 (dev)", "log": [ - "16:21:41 start cooling.fans-quiet-after-motion (auto, api) in campaign c-20260909160235-7649", - "16:21:41 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:21:41 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:21:41 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:21:41 baseline: pre: clean", - "16:21:41 mode: test needs grbl - already in grbl mode", - "16:21:46 idle ref: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2152, 'exhaust': 0, 'intake_1': 735, 'intake_2': 735}", - "16:21:51 idle ref: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2160, 'exhaust': 0, 'intake_1': 731, 'intake_2': 727}", - "16:21:57 idle ref: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2158, 'exhaust': 0, 'intake_1': 734, 'intake_2': 728}", - "16:21:57 idle reference after 15.2 s: {'air_assist': 2158, 'exhaust': 0, 'intake_1': 734, 'intake_2': 728}", - "16:22:01 fans during M8: {'air_assist': 10997, 'exhaust': 6523, 'intake_1': 1127, 'intake_2': 1114} (duty {'thermal/exhaust_pwm': 65535, 'thermal/intake_pwm': 43278})", - "16:22:06 cooldown + 5 s: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2360, 'exhaust': 2182, 'intake_1': 964, 'intake_2': 933}", - "16:22:11 cooldown + 10 s: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2081, 'exhaust': 621, 'intake_1': 739, 'intake_2': 736}", - "16:22:12 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:22:16 cooldown + 15 s: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2128, 'exhaust': 0, 'intake_1': 734, 'intake_2': 727}", - "16:22:16 fans after: {'air_assist': 2129, 'exhaust': 0, 'intake_1': 731, 'intake_2': 734} duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} (settled in 15.1 s)", - "16:22:16 forgectrl stop -> rc 0", - "16:22:16 forgectrl start with cnc/state=disabled -> rc 0", - "16:22:21 after the restart + 5 s: controller stopped duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}", - "16:22:26 after the restart + 10 s: controller stopped duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}", - "16:22:31 after the restart + 15 s: controller stopped duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}", - "16:22:37 after the restart + 20 s: controller running duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}", - "16:22:37 baseline: post: clean", - "16:22:37 result PASS" + "20:20:09 start cooling.fans-quiet-after-motion (auto, api) in campaign c-20260909200054-7947", + "20:20:09 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:20:09 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:20:09 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:20:09 baseline: pre: clean", + "20:20:09 mode: test needs grbl - already in grbl mode", + "20:20:14 idle ref: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2102, 'exhaust': 0, 'intake_1': 734, 'intake_2': 733}", + "20:20:19 idle ref: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2122, 'exhaust': 0, 'intake_1': 731, 'intake_2': 728}", + "20:20:24 idle ref: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2145, 'exhaust': 0, 'intake_1': 734, 'intake_2': 733}", + "20:20:24 idle reference after 15.2 s: {'air_assist': 2145, 'exhaust': 0, 'intake_1': 734, 'intake_2': 733}", + "20:20:29 fans during M8: {'air_assist': 11061, 'exhaust': 7327, 'intake_1': 1257, 'intake_2': 1253} (duty {'thermal/exhaust_pwm': 65535, 'thermal/intake_pwm': 43278})", + "20:20:34 cooldown + 5 s: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2342, 'exhaust': 2066, 'intake_1': 936, 'intake_2': 926}", + "20:20:39 cooldown + 10 s: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2188, 'exhaust': 573, 'intake_1': 739, 'intake_2': 729}", + "20:20:39 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:20:44 cooldown + 15 s: phase idle duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} fans {'air_assist': 2216, 'exhaust': 0, 'intake_1': 734, 'intake_2': 733}", + "20:20:44 fans after: {'air_assist': 2216, 'exhaust': 0, 'intake_1': 731, 'intake_2': 728} duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0} (settled in 15.1 s)", + "20:20:44 forgectrl stop -> rc 0", + "20:20:44 forgectrl start with cnc/state=disabled -> rc 0", + "20:20:49 after the restart + 5 s: controller stopped duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}", + "20:20:54 after the restart + 10 s: controller stopped duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}", + "20:20:59 after the restart + 15 s: controller stopped duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}", + "20:21:04 after the restart + 20 s: controller running duty {'thermal/exhaust_pwm': 0, 'thermal/intake_pwm': 0}", + "20:21:04 baseline: post: clean", + "20:21:04 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cooling.fans-quiet-after-motion", - "ts": "2026-09-09T16:22:37Z" + "ts": "2026-09-09T20:21:04Z" }, "requires": [ "motion.pacing" @@ -11531,14 +11453,14 @@ "src/pic*" ] ], - "fingerprint": "6d96e593d47b96ed2e06b3178ef7227a77c4821ab6ff0717f46b65e3ec94eaf0", + "fingerprint": "daeb6f29f58386aeffd344c95227a4d1a71c9d6edabb2725922291cfa2e3b83e", "hardware": "api", "id": "cooling.gate-off", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 7, "evidence": { "baseline": { @@ -11547,7 +11469,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -11573,27 +11495,27 @@ "fan_gates": { "air_assist": { "floor": 6000, - "reading": 5263, + "reading": 5543, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 6084, + "reading": 6169, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 1110, + "reading": 1076, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 1109, + "reading": 1137, "state": "grace" }, "purge": { "floor": 300, - "reading": 631, + "reading": 632, "state": "grace" } }, @@ -11618,7 +11540,7 @@ "reason": "", "report_age_s": 1.0, "resume_ok": true, - "up_c": 26.0, + "up_c": 25.68, "verdict": "OK" }, "off_state": "off", @@ -11629,26 +11551,26 @@ "restored": { "accel_watch": "watch", "armed": false, - "down_c": 25.44, + "down_c": 25.76, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 5330, + "reading": 5605, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 5302, + "reading": 5399, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 1514, + "reading": 1459, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 1451, + "reading": 1506, "state": "grace" }, "purge": { @@ -11676,23 +11598,23 @@ "reason": "", "report_age_s": 1.0, "resume_ok": true, - "up_c": 26.0, + "up_c": 25.6, "verdict": "OK" }, "temps": { - "chassis_c": 30.4, - "soc_c": 50.2, + "chassis_c": 29.8, + "soc_c": 49.7, "soc_throttle": 0, - "supply_raw": 614 + "supply_raw": 608 }, "trip": { "accel_watch": "watch", "armed": false, - "down_c": 26.16, + "down_c": 26.32, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 1905, + "reading": 2175, "state": "grace" }, "exhaust": { @@ -11707,12 +11629,12 @@ }, "intake_2": { "floor": 2290, - "reading": 727, + "reading": 737, "state": "grace" }, "purge": { "floor": 300, - "reading": 632, + "reading": 631, "state": "grace" } }, @@ -11732,36 +11654,36 @@ }, "phase": "run", "quiet_hold": false, - "reason": "coolant 25.8 C over 6 C limit - hold until 5 C", + "reason": "coolant 26.2 C over 6 C limit - hold until 5 C", "report_age_s": 1.0, "resume_ok": false, - "up_c": 25.84, + "up_c": 26.24, "verdict": "OVERTEMP" }, "trip_state": "warn" }, - "fingerprint": "6d96e593d47b96ed2e06b3178ef7227a77c4821ab6ff0717f46b65e3ec94eaf0", - "image": "20260909150456 (dev)", + "fingerprint": "daeb6f29f58386aeffd344c95227a4d1a71c9d6edabb2725922291cfa2e3b83e", + "image": "20260909193551 (dev)", "log": [ - "16:08:35 start cooling.gate-off (auto, api) in campaign c-20260909160235-7649", - "16:08:35 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:08:35 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:08:35 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:08:35 baseline: pre: clean", - "16:08:35 mode: test needs grbl - already in grbl mode", - "16:08:36 original: {'cool_temp_max': '33', 'cool_temp_resume': '31'}", - "16:08:37 trip leg: verdict OVERTEMP fire_ok False hold True gates_off [] (after 1 s)", - "16:08:39 off leg: verdict OK fire_ok True hold False gates_off ['coolant_max'] (after 1 s)", - "16:08:41 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)", - "16:08:42 restored ceiling 33 reports state ok", - "16:08:43 baseline: post: clean", - "16:08:43 result PASS" + "20:06:55 start cooling.gate-off (auto, api) in campaign c-20260909200054-7947", + "20:06:55 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:06:55 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:06:55 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:06:55 baseline: pre: clean", + "20:06:55 mode: test needs grbl - already in grbl mode", + "20:06:55 original: {'cool_temp_max': '33', 'cool_temp_resume': '31'}", + "20:06:56 trip leg: verdict OVERTEMP fire_ok False hold True gates_off [] (after 1 s)", + "20:06:58 off leg: verdict OK fire_ok True hold False gates_off ['coolant_max'] (after 1 s)", + "20:07:01 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)", + "20:07:02 restored ceiling 33 reports state ok", + "20:07:02 baseline: post: clean", + "20:07:02 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cooling.gate-off", - "ts": "2026-09-09T16:08:43Z" + "ts": "2026-09-09T20:07:02Z" }, "requires": [ "kernel.latch-locked-idle" @@ -11823,15 +11745,15 @@ "src/pic*" ] ], - "fingerprint": "0712f304262da83eb61f7a6d06f2dfe961b6123fb7f9532d509c623bcc634ff3", + "fingerprint": "0d96afd01fa5496b7e2753aefc05a29d6112c1051ab0f42ced872ff3c705d88d", "hardware": "api", "id": "cooling.floor-and-warm-up", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 81, + "campaign": "c-20260909200054-7947", + "duration_s": 86, "evidence": { "baseline": { "post": [], @@ -11839,36 +11761,36 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "both_off": { "accel_watch": "watch", "armed": false, - "down_c": 31.29, + "down_c": 29.22, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 3702, + "reading": 5622, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 2962, + "reading": 4126, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 1930, + "reading": 3945, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 1851, + "reading": 3901, "state": "grace" }, "purge": { "floor": 300, - "reading": 630, + "reading": 631, "state": "grace" } }, @@ -11894,7 +11816,7 @@ "reason": "", "report_age_s": 1.0, "resume_ok": true, - "up_c": 26.08, + "up_c": 25.52, "verdict": "OK" }, "fixture": { @@ -11910,26 +11832,26 @@ "floor": { "accel_watch": "watch", "armed": false, - "down_c": 33.57, + "down_c": 30.38, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 5643, + "reading": 5665, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 6622, + "reading": 7116, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 1933, + "reading": 3860, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 1913, + "reading": 3852, "state": "grace" }, "purge": { @@ -11948,7 +11870,7 @@ "air_assist_min_rpm": 6000, "coolant_critical_c": 38.0, "coolant_max_c": 33.0, - "coolant_min_c": 29.2, + "coolant_min_c": 28.6, "coolant_resume_c": 31.0, "coolant_source": "local", "exhaust_min_rpm": 6400, @@ -11956,10 +11878,10 @@ }, "phase": "run", "quiet_hold": false, - "reason": "COLD: coolant 25.7 C under the 29.2 C floor - fire blocked until 30.2 C", + "reason": "COLD: coolant 26.0 C under the 28.6 C floor - fire blocked until 29.6 C", "report_age_s": 1.0, "resume_ok": false, - "up_c": 25.68, + "up_c": 26.0, "verdict": "COLD" }, "mode": { @@ -11976,142 +11898,26 @@ "restored": { "accel_watch": "watch", "armed": false, - "down_c": 29.22, + "down_c": 28.17, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 5605, + "reading": 5622, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 3584, + "reading": 3652, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 2141, + "reading": 3868, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 2099, - "state": "grace" - }, - "purge": { - "floor": 300, - "reading": 631, - "state": "grace" - } - }, - "fire_ok": true, - "fire_watch": "armed", - "gates_off": [], - "hold": false, - "limits": { - "air_assist_min_rpm": 6000, - "coolant_critical_c": 38.0, - "coolant_max_c": 33.0, - "coolant_min_c": 5.0, - "coolant_resume_c": 31.0, - "coolant_source": "local", - "exhaust_min_rpm": 6400, - "intake_min_rpm": 2290 - }, - "phase": "run", - "quiet_hold": false, - "reason": "", - "report_age_s": 0.0, - "resume_ok": true, - "up_c": 25.84, - "verdict": "OK" - }, - "run_duty": { - "thermal/exhaust_pwm": 65535, - "thermal/intake_pwm": 43278 - }, - "run_heater_pwm": 0, - "warmup_duty": { - "thermal/exhaust_pwm": 0, - "thermal/intake_pwm": 0 - }, - "warmup_heater_pwm": 26214, - "warmup_hold": { - "accel_watch": "watch", - "armed": false, - "down_c": 23.47, - "fan_gates": { - "air_assist": { - "floor": 6000, - "reading": 2136, - "state": "idle" - }, - "exhaust": { - "floor": 6400, - "reading": 0, - "state": "idle" - }, - "intake_1": { - "floor": 2290, - "reading": 728, - "state": "idle" - }, - "intake_2": { - "floor": 2290, - "reading": 735, - "state": "idle" - }, - "purge": { - "floor": 300, - "reading": 633, - "state": "idle" - } - }, - "fire_ok": false, - "fire_watch": "armed", - "gates_off": [], - "hold": true, - "limits": { - "air_assist_min_rpm": 6000, - "coolant_critical_c": 38.0, - "coolant_max_c": 33.0, - "coolant_min_c": 5.0, - "coolant_resume_c": 31.0, - "coolant_source": "local", - "exhaust_min_rpm": 6400, - "intake_min_rpm": 2290 - }, - "phase": "warm-up", - "quiet_hold": false, - "reason": "", - "report_age_s": 1.0, - "resume_ok": false, - "up_c": 23.47, - "verdict": "WARMUP" - }, - "warmup_release": { - "accel_watch": "watch", - "armed": false, - "down_c": 38.53, - "fan_gates": { - "air_assist": { - "floor": 6000, - "reading": 10807, - "state": "grace" - }, - "exhaust": { - "floor": 6400, - "reading": 4294, - "state": "grace" - }, - "intake_1": { - "floor": 2290, - "reading": 827, - "state": "grace" - }, - "intake_2": { - "floor": 2290, - "reading": 852, + "reading": 3894, "state": "grace" }, "purge": { @@ -12137,38 +11943,154 @@ "phase": "run", "quiet_hold": false, "reason": "", - "report_age_s": 0.8, + "report_age_s": 1.0, "resume_ok": true, - "up_c": 27.44, + "up_c": 25.92, "verdict": "OK" }, - "warmup_release_s": 70 + "run_duty": { + "thermal/exhaust_pwm": 65535, + "thermal/intake_pwm": 43278 + }, + "run_heater_pwm": 0, + "warmup_duty": { + "thermal/exhaust_pwm": 0, + "thermal/intake_pwm": 0 + }, + "warmup_heater_pwm": 26214, + "warmup_hold": { + "accel_watch": "watch", + "armed": false, + "down_c": 24.02, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 2216, + "state": "idle" + }, + "exhaust": { + "floor": 6400, + "reading": 0, + "state": "idle" + }, + "intake_1": { + "floor": 2290, + "reading": 731, + "state": "idle" + }, + "intake_2": { + "floor": 2290, + "reading": 729, + "state": "idle" + }, + "purge": { + "floor": 300, + "reading": 632, + "state": "idle" + } + }, + "fire_ok": false, + "fire_watch": "armed", + "gates_off": [], + "hold": true, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "warm-up", + "quiet_hold": false, + "reason": "", + "report_age_s": 1.0, + "resume_ok": false, + "up_c": 23.94, + "verdict": "WARMUP" + }, + "warmup_release": { + "accel_watch": "watch", + "armed": false, + "down_c": 35.66, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 11078, + "state": "grace" + }, + "exhaust": { + "floor": 6400, + "reading": 10102, + "state": "grace" + }, + "intake_1": { + "floor": 2290, + "reading": 1939, + "state": "grace" + }, + "intake_2": { + "floor": 2290, + "reading": 1944, + "state": "grace" + }, + "purge": { + "floor": 300, + "reading": 630, + "state": "grace" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "run", + "quiet_hold": false, + "reason": "", + "report_age_s": 0.7, + "resume_ok": true, + "up_c": 26.96, + "verdict": "OK" + }, + "warmup_release_s": 75 }, - "fingerprint": "0712f304262da83eb61f7a6d06f2dfe961b6123fb7f9532d509c623bcc634ff3", - "image": "20260909150456 (dev)", + "fingerprint": "0d96afd01fa5496b7e2753aefc05a29d6112c1051ab0f42ced872ff3c705d88d", + "image": "20260909193551 (dev)", "log": [ - "16:22:37 start cooling.floor-and-warm-up (auto, api) in campaign c-20260909160235-7649", - "16:22:37 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:22:37 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:22:37 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:22:37 baseline: pre: clean", - "16:22:37 mode: test needs grbl - already in grbl mode", - "16:22:37 original: {'cool_temp_min': '', 'cool_temp_start': '16'}", - "16:22:38 warm-up hold: verdict WARMUP phase warm-up fire_ok False hold True (after 1 s)", - "16:23:07 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:23:38 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:23:49 warm-up release after 70 s: verdict OK phase run up 27.44 (gate 24.9)", - "16:23:53 floor: verdict COLD fire_ok False hold True gates_off ['warm_up'] (after 1 s)", - "16:23:55 both off: verdict OK fire_ok True hold False gates_off ['coolant_min', 'warm_up'] (after 1 s)", - "16:23:57 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)", - "16:23:58 baseline: post: clean", - "16:23:58 result PASS" + "20:21:05 start cooling.floor-and-warm-up (auto, api) in campaign c-20260909200054-7947", + "20:21:05 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:21:05 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:21:05 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:21:05 baseline: pre: clean", + "20:21:05 mode: test needs grbl - already in grbl mode", + "20:21:05 original: {'cool_temp_min': '', 'cool_temp_start': '16'}", + "20:21:06 warm-up hold: verdict WARMUP phase warm-up fire_ok False hold True (after 1 s)", + "20:21:35 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:22:06 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:22:21 warm-up release after 75 s: verdict OK phase run up 26.96 (gate 24.9)", + "20:22:26 floor: verdict COLD fire_ok False hold True gates_off ['warm_up'] (after 1 s)", + "20:22:28 both off: verdict OK fire_ok True hold False gates_off ['coolant_min', 'warm_up'] (after 1 s)", + "20:22:30 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)", + "20:22:31 baseline: post: clean", + "20:22:31 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cooling.floor-and-warm-up", - "ts": "2026-09-09T16:23:58Z" + "ts": "2026-09-09T20:22:31Z" }, "requires": [ "kernel.latch-locked-idle", @@ -12231,14 +12153,14 @@ "src/pic*" ] ], - "fingerprint": "b033d066babf36dc4460065f334da9bcd5a7165f2d0aee8329de951374117ed3", + "fingerprint": "4267bed24f40da4345e931f86a6b8099d64c5ae061c49a38d4743050c3ff65fb", "hardware": "api", "id": "cooling.tec-drive", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 8, "evidence": { "baseline": { @@ -12247,7 +12169,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -12274,31 +12196,31 @@ "restored": { "accel_watch": "watch", "armed": false, - "down_c": 26.4, + "down_c": 26.0, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 5652, + "reading": 5601, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 3596, + "reading": 3567, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 2357, + "reading": 3714, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 2343, + "reading": 3633, "state": "grace" }, "purge": { "floor": 300, - "reading": 630, + "reading": 631, "state": "grace" } }, @@ -12321,35 +12243,35 @@ "reason": "", "report_age_s": 1.0, "resume_ok": true, - "up_c": 24.42, + "up_c": 24.57, "verdict": "OK" }, "tec_after_session": 0, "tec_not_fitted": 0, "tec_on_after_s": 1 }, - "fingerprint": "b033d066babf36dc4460065f334da9bcd5a7165f2d0aee8329de951374117ed3", - "image": "20260909150456 (dev)", + "fingerprint": "4267bed24f40da4345e931f86a6b8099d64c5ae061c49a38d4743050c3ff65fb", + "image": "20260909193551 (dev)", "log": [ - "16:23:58 start cooling.tec-drive (auto, api) in campaign c-20260909160235-7649", - "16:23:58 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:23:58 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:23:58 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:23:58 baseline: pre: clean", - "16:23:58 mode: test needs grbl - already in grbl mode", - "16:23:58 original: {'cool_tec_present': '0', 'cool_tec_on_c': '', 'cool_tec_off_c': ''}", - "16:24:00 fitted, in session: thermal/tec_on=1 after 1 s", - "16:24:02 after the session: phase idle thermal/tec_on=0", - "16:24:03 tec leg 2: verdict OK fire_ok True hold False gates_off [] (after 1 s)", - "16:24:05 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)", - "16:24:06 baseline: post: clean", - "16:24:06 result PASS" + "20:22:31 start cooling.tec-drive (auto, api) in campaign c-20260909200054-7947", + "20:22:31 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:22:31 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:22:31 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:22:31 baseline: pre: clean", + "20:22:31 mode: test needs grbl - already in grbl mode", + "20:22:31 original: {'cool_tec_present': '0', 'cool_tec_on_c': '', 'cool_tec_off_c': ''}", + "20:22:33 fitted, in session: thermal/tec_on=1 after 1 s", + "20:22:35 after the session: phase idle thermal/tec_on=0", + "20:22:36 tec leg 2: verdict OK fire_ok True hold False gates_off [] (after 1 s)", + "20:22:38 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)", + "20:22:39 baseline: post: clean", + "20:22:39 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cooling.tec-drive", - "ts": "2026-09-09T16:24:06Z" + "ts": "2026-09-09T20:22:39Z" }, "requires": [ "kernel.latch-locked-idle" @@ -12411,20 +12333,20 @@ "src/pic*" ] ], - "fingerprint": "32488059e23d43a07bc2764564319f0b45cc6ddc1e5245435ddabf76864aca81", + "fingerprint": "cd74ed5ebab5f9ffe232bcd0b9d627b92d8f76403d84c53f2517682f6a764988", "hardware": "api", "id": "cooling.fire-watch-tiers", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 15, "evidence": { "alert": { "accel_watch": "watch", "armed": false, - "down_c": 26.24, + "down_c": 26.0, "fan_gates": { "air_assist": { "floor": 6000, @@ -12433,22 +12355,22 @@ }, "exhaust": { "floor": 6400, - "reading": 4367, + "reading": 4316, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 2601, + "reading": 3831, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 2593, + "reading": 3799, "state": "grace" }, "purge": { "floor": 300, - "reading": 629, + "reading": 631, "state": "grace" } }, @@ -12468,10 +12390,10 @@ }, "phase": "run", "quiet_hold": false, - "reason": "lid IR flame alert (quartiles 55 56) - job held, fire blocked until the signal clears", + "reason": "lid IR flame alert (quartiles 55 55) - job held, fire blocked until the signal clears", "report_age_s": 1.0, "resume_ok": false, - "up_c": 24.65, + "up_c": 25.76, "verdict": "FLAME" }, "baseline": { @@ -12480,31 +12402,31 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "critical": { "accel_watch": "watch", "armed": false, - "down_c": 25.36, + "down_c": 25.52, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 10949, + "reading": 10965, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 4609, + "reading": 4518, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 4135, + "reading": 4134, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 4127, + "reading": 4142, "state": "grace" }, "purge": { @@ -12532,7 +12454,7 @@ "reason": "LID IR FIRE SIGNAL (quartiles 55 56) - motion stopped, laser locked, smoke airflow held", "report_age_s": 1.0, "resume_ok": false, - "up_c": 24.65, + "up_c": 24.89, "verdict": "FIRE" }, "fixture": { @@ -12547,7 +12469,7 @@ }, "interlock_circuit": 45, "lid_ir_idle": [ - 56, + 55, 56, 59, 60 @@ -12562,26 +12484,26 @@ "off": { "accel_watch": "watch", "armed": false, - "down_c": 24.89, + "down_c": 24.1, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 11062, + "reading": 5682, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 6162, + "reading": 6826, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 3826, + "reading": 3858, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 3806, + "reading": 3833, "state": "grace" }, "purge": { @@ -12614,7 +12536,7 @@ "reason": "", "report_age_s": 1.0, "resume_ok": true, - "up_c": 25.28, + "up_c": 24.5, "verdict": "OK" }, "orig": { @@ -12626,31 +12548,31 @@ "restored": { "accel_watch": "watch", "armed": false, - "down_c": 24.57, + "down_c": 24.5, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 3746, + "reading": 5626, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 3071, + "reading": 4250, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 3431, + "reading": 3914, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 3431, + "reading": 3929, "state": "grace" }, "purge": { "floor": 300, - "reading": 631, + "reading": 630, "state": "grace" } }, @@ -12673,33 +12595,33 @@ "reason": "", "report_age_s": 1.0, "resume_ok": true, - "up_c": 24.26, + "up_c": 24.5, "verdict": "OK" } }, - "fingerprint": "32488059e23d43a07bc2764564319f0b45cc6ddc1e5245435ddabf76864aca81", - "image": "20260909150456 (dev)", + "fingerprint": "cd74ed5ebab5f9ffe232bcd0b9d627b92d8f76403d84c53f2517682f6a764988", + "image": "20260909193551 (dev)", "log": [ - "16:24:07 start cooling.fire-watch-tiers (auto, api) in campaign c-20260909160235-7649", - "16:24:07 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:24:07 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:24:07 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:24:07 baseline: pre: clean", - "16:24:07 mode: test needs grbl - already in grbl mode", - "16:24:07 original: {'cool_fire_q1_alert': '', 'cool_fire_q1_critical': '', 'cool_fire_q2_alert': '', 'cool_fire_q2_critical': ''}", - "16:24:09 alert leg: verdict FLAME fire_watch alert hold True fire_ok False", - "16:24:12 post-alert: verdict OK fire_ok True hold False gates_off [] (after 1 s)", - "16:24:15 critical leg: verdict FIRE fire_watch ALARM", - "16:24:19 watch off: verdict OK fire_ok True hold False gates_off ['flame_q1_alert', 'flame_q1_critical', 'flame_q2_alert', 'flame_q2_critical'] (after 1 s)", - "16:24:21 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)", - "16:24:22 baseline: post: clean", - "16:24:22 result PASS" + "20:22:39 start cooling.fire-watch-tiers (auto, api) in campaign c-20260909200054-7947", + "20:22:40 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:22:40 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:22:40 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:22:40 baseline: pre: clean", + "20:22:40 mode: test needs grbl - already in grbl mode", + "20:22:40 original: {'cool_fire_q1_alert': '', 'cool_fire_q1_critical': '', 'cool_fire_q2_alert': '', 'cool_fire_q2_critical': ''}", + "20:22:42 alert leg: verdict FLAME fire_watch alert hold True fire_ok False", + "20:22:45 post-alert: verdict OK fire_ok True hold False gates_off [] (after 1 s)", + "20:22:48 critical leg: verdict FIRE fire_watch ALARM", + "20:22:52 watch off: verdict OK fire_ok True hold False gates_off ['flame_q1_alert', 'flame_q1_critical', 'flame_q2_alert', 'flame_q2_critical'] (after 1 s)", + "20:22:54 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)", + "20:22:55 baseline: post: clean", + "20:22:55 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cooling.fire-watch-tiers", - "ts": "2026-09-09T16:24:22Z" + "ts": "2026-09-09T20:22:55Z" }, "requires": [ "kernel.latch-locked-idle" @@ -12761,14 +12683,14 @@ "src/pic*" ] ], - "fingerprint": "95ca0721856d6f1a7e1f7633c43358e16ebdaadde7ebac8baeea1983d9237e3c", + "fingerprint": "eb538418a9b78898edefd72c6c6d1242be43b7cf06cd9dde69fde4e04bef8d73", "hardware": "api", "id": "cooling.crash-watch-plumbing", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 7, "evidence": { "baseline": { @@ -12777,7 +12699,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -12799,31 +12721,31 @@ "off": { "accel_watch": "watch", "armed": false, - "down_c": 23.79, + "down_c": 24.18, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 5648, + "reading": 5699, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 3556, + "reading": 3628, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 3647, + "reading": 3778, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 3642, + "reading": 3759, "state": "grace" }, "purge": { "floor": 300, - "reading": 629, + "reading": 631, "state": "grace" } }, @@ -12850,7 +12772,7 @@ "reason": "", "report_age_s": 1.0, "resume_ok": true, - "up_c": 23.94, + "up_c": 24.1, "verdict": "OK" }, "orig": { @@ -12861,79 +12783,26 @@ "restored": { "accel_watch": "watch", "armed": false, - "down_c": 23.47, + "down_c": 24.26, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 5686, + "reading": 5648, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 3618, + "reading": 3636, "state": "grace" }, "intake_1": { - "floor": 2290, - "reading": 3962, - "state": "grace" - }, - "intake_2": { "floor": 2290, "reading": 3970, "state": "grace" }, - "purge": { - "floor": 300, - "reading": 631, - "state": "grace" - } - }, - "fire_ok": true, - "fire_watch": "armed", - "gates_off": [], - "hold": false, - "limits": { - "air_assist_min_rpm": 6000, - "coolant_critical_c": 38.0, - "coolant_max_c": 33.0, - "coolant_min_c": 5.0, - "coolant_resume_c": 31.0, - "coolant_source": "local", - "exhaust_min_rpm": 6400, - "intake_min_rpm": 2290 - }, - "phase": "run", - "quiet_hold": false, - "reason": "", - "report_age_s": 0.0, - "resume_ok": true, - "up_c": 23.71, - "verdict": "OK" - }, - "unarmed": { - "accel_watch": "watch", - "armed": false, - "down_c": 24.81, - "fan_gates": { - "air_assist": { - "floor": 6000, - "reading": 3746, - "state": "grace" - }, - "exhaust": { - "floor": 6400, - "reading": 2713, - "state": "grace" - }, - "intake_1": { - "floor": 2290, - "reading": 3299, - "state": "grace" - }, "intake_2": { "floor": 2290, - "reading": 3264, + "reading": 3948, "state": "grace" }, "purge": { @@ -12963,29 +12832,82 @@ "resume_ok": true, "up_c": 24.34, "verdict": "OK" + }, + "unarmed": { + "accel_watch": "watch", + "armed": false, + "down_c": 24.18, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 3720, + "state": "grace" + }, + "exhaust": { + "floor": 6400, + "reading": 2895, + "state": "grace" + }, + "intake_1": { + "floor": 2290, + "reading": 3370, + "state": "grace" + }, + "intake_2": { + "floor": 2290, + "reading": 3357, + "state": "grace" + }, + "purge": { + "floor": 300, + "reading": 631, + "state": "grace" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "run", + "quiet_hold": false, + "reason": "", + "report_age_s": 1.0, + "resume_ok": true, + "up_c": 24.73, + "verdict": "OK" } }, - "fingerprint": "95ca0721856d6f1a7e1f7633c43358e16ebdaadde7ebac8baeea1983d9237e3c", - "image": "20260909150456 (dev)", + "fingerprint": "eb538418a9b78898edefd72c6c6d1242be43b7cf06cd9dde69fde4e04bef8d73", + "image": "20260909193551 (dev)", "log": [ - "16:24:22 start cooling.crash-watch-plumbing (auto, api) in campaign c-20260909160235-7649", - "16:24:22 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:24:22 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:24:22 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:24:22 baseline: pre: clean", - "16:24:22 mode: test needs grbl - already in grbl mode", - "16:24:22 original: {'cool_accel_x_alert': '132', 'cool_accel_y_alert': '', 'cool_accel_abort': ''}", - "16:24:24 unarmed session: verdict OK fire_ok True hold False gates_off [] (after 1 s)", - "16:24:26 watch off: verdict OK fire_ok True hold False gates_off ['crash_x_alert', 'crash_y_alert', 'crash_abort'] (after 1 s)", - "16:24:28 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)", - "16:24:29 baseline: post: clean", - "16:24:29 result PASS" + "20:22:55 start cooling.crash-watch-plumbing (auto, api) in campaign c-20260909200054-7947", + "20:22:55 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:22:55 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:22:55 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:22:55 baseline: pre: clean", + "20:22:55 mode: test needs grbl - already in grbl mode", + "20:22:55 original: {'cool_accel_x_alert': '132', 'cool_accel_y_alert': '', 'cool_accel_abort': ''}", + "20:22:57 unarmed session: verdict OK fire_ok True hold False gates_off [] (after 1 s)", + "20:22:59 watch off: verdict OK fire_ok True hold False gates_off ['crash_x_alert', 'crash_y_alert', 'crash_abort'] (after 1 s)", + "20:23:01 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)", + "20:23:02 baseline: post: clean", + "20:23:02 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cooling.crash-watch-plumbing", - "ts": "2026-09-09T16:24:29Z" + "ts": "2026-09-09T20:23:02Z" }, "requires": [ "kernel.latch-locked-idle" @@ -13051,14 +12973,14 @@ "src/main.c" ] ], - "fingerprint": "97b65ef9ca0606f4c9293d49bdc60d4aab9c43c99b304c08b25f08c9c7a79906", + "fingerprint": "c0ef8a8e7f9ae4d6a1536bae720ff740459343adffac64685b525dc2510ae7a0", "hardware": "api", "id": "cooling.critical-tier", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 8, "evidence": { "baseline": { @@ -13067,32 +12989,32 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "ceiling_off_accepted": 200, "critical": { "accel_watch": "watch", "armed": false, - "down_c": 24.26, + "down_c": 24.73, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 3756, + "reading": 3728, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 2683, + "reading": 2764, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 3345, + "reading": 3354, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 3367, + "reading": 3345, "state": "grace" }, "purge": { @@ -13117,35 +13039,35 @@ }, "phase": "run", "quiet_hold": false, - "reason": "CRITICAL: coolant 23.9 C at or over the 7 C critical line - hold, no resume this job", + "reason": "CRITICAL: coolant 24.3 C at or over the 7 C critical line - hold, no resume this job", "report_age_s": 1.0, "resume_ok": false, - "up_c": 23.87, + "up_c": 24.34, "verdict": "CRITICAL" }, "critical_after": { "accel_watch": "watch", "armed": false, - "down_c": 24.73, + "down_c": 24.42, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 5673, + "reading": 5648, "state": "idle" }, "exhaust": { "floor": 6400, - "reading": 6295, + "reading": 6260, "state": "idle" }, "intake_1": { "floor": 2290, - "reading": 3728, + "reading": 3759, "state": "idle" }, "intake_2": { "floor": 2290, - "reading": 3791, + "reading": 3721, "state": "idle" }, "purge": { @@ -13170,35 +13092,35 @@ }, "phase": "thermal", "quiet_hold": false, - "reason": "coolant 23.9 C over 6 C limit - hold until 5 C", + "reason": "coolant 24.3 C over 6 C limit - hold until 5 C", "report_age_s": 0.0, "resume_ok": false, - "up_c": 24.65, + "up_c": 24.42, "verdict": "OVERTEMP" }, "critical_off": { "accel_watch": "watch", "armed": false, - "down_c": 23.63, + "down_c": 24.26, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 3724, + "reading": 3717, "state": "grace" }, "exhaust": { "floor": 6400, - "reading": 6570, + "reading": 6573, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 3264, + "reading": 3281, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 3301, + "reading": 3247, "state": "grace" }, "purge": { @@ -13228,7 +13150,7 @@ "reason": "", "report_age_s": 1.0, "resume_ok": false, - "up_c": 23.63, + "up_c": 24.57, "verdict": "OVERTEMP" }, "cross_check": { @@ -13260,7 +13182,7 @@ "restored": { "accel_watch": "watch", "armed": false, - "down_c": 23.32, + "down_c": 25.44, "fan_gates": { "air_assist": { "floor": 6000, @@ -13269,22 +13191,22 @@ }, "exhaust": { "floor": 6400, - "reading": 6799, + "reading": 7025, "state": "grace" }, "intake_1": { "floor": 2290, - "reading": 3659, + "reading": 3665, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 3674, + "reading": 3647, "state": "grace" }, "purge": { "floor": 300, - "reading": 630, + "reading": 631, "state": "grace" } }, @@ -13305,33 +13227,33 @@ "phase": "run", "quiet_hold": false, "reason": "", - "report_age_s": 1.0, + "report_age_s": 0.0, "resume_ok": true, - "up_c": 23.63, + "up_c": 25.68, "verdict": "OK" } }, - "fingerprint": "97b65ef9ca0606f4c9293d49bdc60d4aab9c43c99b304c08b25f08c9c7a79906", - "image": "20260909150456 (dev)", + "fingerprint": "c0ef8a8e7f9ae4d6a1536bae720ff740459343adffac64685b525dc2510ae7a0", + "image": "20260909193551 (dev)", "log": [ - "16:24:30 start cooling.critical-tier (auto, api) in campaign c-20260909160235-7649", - "16:24:30 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:24:30 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:24:30 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:24:30 baseline: pre: clean", - "16:24:30 mode: test needs grbl - already in grbl mode", - "16:24:30 original: {'cool_temp_max': '33', 'cool_temp_resume': '31', 'cool_temp_critical_c': ''}", - "16:24:31 critical leg: verdict CRITICAL fire_ok False hold True gates_off [] (after 1 s)", - "16:24:34 critical off leg: verdict OVERTEMP fire_ok False hold True gates_off ['coolant_critical'] (after 1 s)", - "16:24:36 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)", - "16:24:38 baseline: post: clean", - "16:24:38 result PASS" + "20:23:02 start cooling.critical-tier (auto, api) in campaign c-20260909200054-7947", + "20:23:02 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:23:02 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:23:02 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:23:02 baseline: pre: clean", + "20:23:02 mode: test needs grbl - already in grbl mode", + "20:23:02 original: {'cool_temp_max': '33', 'cool_temp_resume': '31', 'cool_temp_critical_c': ''}", + "20:23:04 critical leg: verdict CRITICAL fire_ok False hold True gates_off [] (after 1 s)", + "20:23:07 critical off leg: verdict OVERTEMP fire_ok False hold True gates_off ['coolant_critical'] (after 1 s)", + "20:23:09 restored: verdict OK fire_ok True hold False gates_off [] (after 1 s)", + "20:23:11 baseline: post: clean", + "20:23:11 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cooling.critical-tier", - "ts": "2026-09-09T16:24:38Z" + "ts": "2026-09-09T20:23:11Z" }, "requires": [ "cooling.gate-off" @@ -13397,15 +13319,15 @@ "src/main.c" ] ], - "fingerprint": "6ec972c15c7535c6367aa7ebfbdaea4a131c7fe6b93ad3bccc3d407f613fc585", + "fingerprint": "f1892fe8bcc19fdc26d277ee13bb35c137e0d45e8829c4ced957c1dd55bd8808", "hardware": "api", "id": "cooling.fan-gate-trips", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 44, + "campaign": "c-20260909200054-7947", + "duration_s": 46, "evidence": { "baseline": { "post": [], @@ -13413,7 +13335,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "exhaust_off": { "cool": { @@ -13423,27 +13345,27 @@ "fan_gates": { "air_assist": { "floor": 6000, - "reading": 5673, + "reading": 5703, "state": "grace" }, "exhaust": { "floor": 0, - "reading": 7119, + "reading": 6971, "state": "off" }, "intake_1": { "floor": 2290, - "reading": 3792, + "reading": 3783, "state": "grace" }, "intake_2": { "floor": 2290, - "reading": 3818, + "reading": 3812, "state": "grace" }, "purge": { "floor": 300, - "reading": 631, + "reading": 630, "state": "grace" } }, @@ -13468,12 +13390,12 @@ "reason": "", "report_age_s": 1.0, "resume_ok": true, - "up_c": 25.44, + "up_c": 25.13, "verdict": "OK" }, "gate": { "floor": 0, - "reading": 7119, + "reading": 6971, "state": "off" } }, @@ -13481,31 +13403,31 @@ "cool": { "accel_watch": "watch", "armed": false, - "down_c": 26.24, + "down_c": 26.16, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 11062, + "reading": 11046, "state": "ok" }, "exhaust": { "floor": 20000, - "reading": 11554, + "reading": 11833, "state": "TRIPPED" }, "intake_1": { "floor": 2290, - "reading": 4156, + "reading": 4154, "state": "ok" }, "intake_2": { "floor": 2290, - "reading": 4179, + "reading": 4159, "state": "ok" }, "purge": { "floor": 300, - "reading": 630, + "reading": 629, "state": "ok" } }, @@ -13525,22 +13447,22 @@ }, "phase": "run", "quiet_hold": false, - "reason": "AIRFLOW: exhaust 11554 under the 20000 floor for 3 s - hold, no resume this job", - "report_age_s": 0.0, + "reason": "AIRFLOW: exhaust 11833 under the 20000 floor for 3 s - hold, no resume this job", + "report_age_s": 1.0, "resume_ok": false, - "up_c": 25.84, + "up_c": 25.76, "verdict": "AIRFLOW" }, "gate": { "floor": 20000, - "reading": 11554, + "reading": 11833, "state": "TRIPPED" } }, "exhaust_trip_after": { "accel_watch": "watch", "armed": false, - "down_c": 26.16, + "down_c": 25.84, "fan_gates": { "air_assist": { "floor": 6000, @@ -13549,17 +13471,17 @@ }, "exhaust": { "floor": 20000, - "reading": 7294, + "reading": 7421, "state": "idle" }, "intake_1": { "floor": 2290, - "reading": 3800, + "reading": 3790, "state": "idle" }, "intake_2": { "floor": 2290, - "reading": 3829, + "reading": 3806, "state": "idle" }, "purge": { @@ -13584,10 +13506,10 @@ }, "phase": "idle", "quiet_hold": false, - "reason": "AIRFLOW: exhaust 11554 under the 20000 floor for 3 s - hold, no resume this job", + "reason": "AIRFLOW: exhaust 11833 under the 20000 floor for 3 s - hold, no resume this job", "report_age_s": 1.0, "resume_ok": true, - "up_c": 26.4, + "up_c": 25.13, "verdict": "OK" }, "fixture": { @@ -13616,31 +13538,31 @@ "cool": { "accel_watch": "watch", "armed": false, - "down_c": 25.6, + "down_c": 25.28, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 11078, + "reading": 11062, "state": "ok" }, "exhaust": { "floor": 6400, - "reading": 11685, + "reading": 11670, "state": "ok" }, "intake_1": { "floor": 2290, - "reading": 4166, + "reading": 4164, "state": "ok" }, "intake_2": { "floor": 2290, - "reading": 4193, + "reading": 4169, "state": "ok" }, "purge": { "floor": 1023, - "reading": 630, + "reading": 629, "state": "TRIPPED" } }, @@ -13660,15 +13582,15 @@ }, "phase": "run", "quiet_hold": false, - "reason": "AIRFLOW: purge 630 under the 1023 floor for 3 s - hold, no resume this job", + "reason": "AIRFLOW: purge 629 under the 1023 floor for 3 s - hold, no resume this job", "report_age_s": 0.0, "resume_ok": false, - "up_c": 25.76, + "up_c": 25.6, "verdict": "AIRFLOW" }, "gate": { "floor": 1023, - "reading": 630, + "reading": 629, "state": "TRIPPED" } }, @@ -13680,17 +13602,17 @@ }, "exhaust": { "floor": 6400, - "reading": 11575, + "reading": 11629, "state": "ok" }, "intake_1": { "floor": 2290, - "reading": 4189, + "reading": 4177, "state": "ok" }, "intake_2": { "floor": 2290, - "reading": 4152, + "reading": 4185, "state": "ok" }, "purge": { @@ -13700,30 +13622,30 @@ } } }, - "fingerprint": "6ec972c15c7535c6367aa7ebfbdaea4a131c7fe6b93ad3bccc3d407f613fc585", - "image": "20260909150456 (dev)", + "fingerprint": "f1892fe8bcc19fdc26d277ee13bb35c137e0d45e8829c4ced957c1dd55bd8808", + "image": "20260909193551 (dev)", "log": [ - "16:08:43 start cooling.fan-gate-trips (auto, api) in campaign c-20260909160235-7649", - "16:08:43 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:08:43 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:08:43 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:08:43 baseline: pre: clean", - "16:08:43 mode: test needs grbl - already in grbl mode", - "16:08:43 original: {'cool_tach_exhaust_min_rpm': '', 'cool_purge_min_current': '', 'cool_fan_grace_s': ''}", - "16:08:53 exhaust trip leg: verdict AIRFLOW fire_ok False hold True gates_off [] (after 10 s)", - "16:09:07 purge trip leg: verdict AIRFLOW fire_ok False hold True gates_off [] (after 11 s)", - "16:09:09 exhaust off leg: verdict OK fire_ok True hold False gates_off ['exhaust'] (after 1 s)", - "16:09:13 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:09:26 restored: verdict OK fire_ok True hold False gates_off [] (after 16 s)", - "16:09:27 fans at run duty: {'exhaust': '11575/6400', 'intake_1': '4189/2290', 'intake_2': '4152/2290', 'air_assist': '11046/6000', 'purge': '630/300'}", - "16:09:27 baseline: post: clean", - "16:09:27 result PASS" + "20:07:02 start cooling.fan-gate-trips (auto, api) in campaign c-20260909200054-7947", + "20:07:02 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:07:02 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:07:02 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:07:02 baseline: pre: clean", + "20:07:02 mode: test needs grbl - already in grbl mode", + "20:07:02 original: {'cool_tach_exhaust_min_rpm': '', 'cool_purge_min_current': '', 'cool_fan_grace_s': ''}", + "20:07:15 exhaust trip leg: verdict AIRFLOW fire_ok False hold True gates_off [] (after 12 s)", + "20:07:28 purge trip leg: verdict AIRFLOW fire_ok False hold True gates_off [] (after 11 s)", + "20:07:30 exhaust off leg: verdict OK fire_ok True hold False gates_off ['exhaust'] (after 1 s)", + "20:07:32 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:07:47 restored: verdict OK fire_ok True hold False gates_off [] (after 16 s)", + "20:07:48 fans at run duty: {'exhaust': '11629/6400', 'intake_1': '4177/2290', 'intake_2': '4185/2290', 'air_assist': '11046/6000', 'purge': '630/300'}", + "20:07:48 baseline: post: clean", + "20:07:48 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cooling.fan-gate-trips", - "ts": "2026-09-09T16:09:27Z" + "ts": "2026-09-09T20:07:48Z" }, "requires": [ "cooling.gate-off" @@ -13789,30 +13711,30 @@ "src/main.c" ] ], - "fingerprint": "f586573ae452577f96f21acc5c6299af71541674369c2f62972adc700a957abb", + "fingerprint": "d8ff841df38ef2dfcc0cd0c9b53eb33aae648cadcbdc7e367e96ccf2a9d9f643", "hardware": "api", "id": "cooling.flow-under-load", "inherited": false, "kind": "live", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 105, + "campaign": "c-20260909204732-3fa9", + "duration_s": 120, "evidence": { "actions": [ { "by": "operator", "channel": "button", "state": "presence", - "took_s": 14.6, - "ts": "2026-09-09T16:54:16Z" + "took_s": 27.11, + "ts": "2026-09-09T21:41:51Z" }, { "by": "fixture", "channel": "button", "state": "arm", "took_s": 0.26, - "ts": "2026-09-09T16:54:16Z" + "ts": "2026-09-09T21:41:51Z" } ], "baseline": { @@ -13828,11 +13750,11 @@ }, "batch": { "group": "attended", - "ts": "2026-09-09T16:34:09Z" + "ts": "2026-09-09T21:25:38Z" }, "check_s": 50, "disarm_after_m2_s": 0.1, - "dt_c": 9.4, + "dt_c": 9.5, "emission_peak": 255, "fixture": { "channels": [ @@ -13845,7 +13767,7 @@ "released": [] }, "heater_seen": true, - "job_to_verdict_s": 73.7, + "job_to_verdict_s": 76.0, "kind": "coolant flow verified", "laser_share_c": 0.7, "limit_c": 14.4, @@ -13858,42 +13780,42 @@ }, "operator": { "ack_live": true, - "ts": "2026-09-09T16:54:01Z" + "ts": "2026-09-09T21:41:23Z" }, - "raw_rise_c": 13.2, - "rise_c": 12.5, - "verdict_line": "coolant flow verified (heater rise 12.5 C, dT 9.4 C; laser 0.7 off 13.2)", + "raw_rise_c": 14.0, + "rise_c": 13.3, + "verdict_line": "coolant flow verified (heater rise 13.3 C, dT 9.5 C; laser 0.7 off 14.0)", "verdicts_seen": [] }, - "fingerprint": "f586573ae452577f96f21acc5c6299af71541674369c2f62972adc700a957abb", - "image": "20260909150456 (dev)", + "fingerprint": "d8ff841df38ef2dfcc0cd0c9b53eb33aae648cadcbdc7e367e96ccf2a9d9f643", + "image": "20260909193551 (dev)", "log": [ - "16:54:01 start cooling.flow-under-load (live, api) in campaign c-20260909160235-7649", - "16:54:01 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:54:01 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:54:01 queued by the attended queue opened 2026-09-09T16:34:09Z", - "16:54:01 baseline: pre: clean", - "16:54:01 mode: test needs grbl - already in grbl mode", - "16:54:01 connect: Idle", - "16:54:01 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 35 mm +X and 10 mm +Y clear, and close the lid. Then press the button on the machine to start.", - "16:54:01 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", - "16:54:16 READY: operator present (press after 14.6 s); the bench takes the presses", - "16:54:16 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", - "16:54:16 ARM press by the fixture, button lit after 0.3 s", - "16:54:31 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:55:01 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:55:30 M2: ['ok']", - "16:55:30 engine: coolant flow verified (heater rise 12.5 C, dT 9.4 C; laser 0.7 off 13.2)", - "16:55:30 PASS: lit through the window, raw rise 13.2 C, laser 0.7 C off, judged 12.5 C against 14.4 (dT 9.4), window closed 0.1 s after M2", - "16:55:32 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:55:46 baseline: post: 1 leftover(s): cool=smoke/armed=False/hold=False (expected idle/unarmed/no hold) -> waited", - "16:55:46 result PASS" + "21:41:23 start cooling.flow-under-load (live, api) in campaign c-20260909204732-3fa9", + "21:41:23 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:41:23 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "21:41:23 queued by the attended queue opened 2026-09-09T21:25:38Z", + "21:41:23 baseline: pre: clean", + "21:41:23 mode: test needs grbl - already in grbl mode", + "21:41:23 connect: Idle", + "21:41:23 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 35 mm +X and 10 mm +Y clear, and close the lid. Then press the button on the machine to start.", + "21:41:23 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", + "21:41:51 READY: operator present (press after 27.1 s); the bench takes the presses", + "21:41:51 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", + "21:41:51 ARM press by the fixture, button lit after 0.3 s", + "21:41:54 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:42:24 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:42:55 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:43:07 M2: ['ok']", + "21:43:07 engine: coolant flow verified (heater rise 13.3 C, dT 9.5 C; laser 0.7 off 14.0)", + "21:43:07 PASS: lit through the window, raw rise 14.0 C, laser 0.7 C off, judged 13.3 C against 14.4 (dT 9.5), window closed 0.1 s after M2", + "21:43:23 baseline: post: 1 leftover(s): cool=smoke/armed=False/hold=False (expected idle/unarmed/no hold) -> waited", + "21:43:23 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cooling.flow-under-load", - "ts": "2026-09-09T16:55:46Z" + "ts": "2026-09-09T21:43:23Z" }, "requires": [ "laser.emission-witness", @@ -13916,14 +13838,14 @@ "src/main.c" ] ], - "fingerprint": "6dc0c17450b4d3be852f03bb07c4a69a94ca88f981752ecfd4c547570859d90c", + "fingerprint": "b67804d1f8360463164b65e789c812121458e801820b7f78ce4727e05ca724d7", "hardware": "api", "id": "laser.power-floor", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 0, "evidence": { "baseline": { @@ -13932,7 +13854,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "configured_floor": 12.0, "fixture": { @@ -13961,25 +13883,25 @@ "$36": 100.0 } }, - "fingerprint": "6dc0c17450b4d3be852f03bb07c4a69a94ca88f981752ecfd4c547570859d90c", - "image": "20260909150456 (dev)", + "fingerprint": "b67804d1f8360463164b65e789c812121458e801820b7f78ce4727e05ca724d7", + "image": "20260909193551 (dev)", "log": [ - "16:24:38 start laser.power-floor (auto, api) in campaign c-20260909160235-7649", - "16:24:38 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:24:38 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:24:38 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:24:38 baseline: pre: clean", - "16:24:38 mode: test needs grbl - already in grbl mode", - "16:24:38 $35=12.0% -> PWMSAR 15 of 127 ($31=0.0, $32=1.0, $36=100.0)", - "16:24:38 PASS: nonzero S never commands less than PWMSAR 15", - "16:24:39 baseline: post: clean", - "16:24:39 result PASS" + "20:23:11 start laser.power-floor (auto, api) in campaign c-20260909200054-7947", + "20:23:11 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:23:11 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:23:11 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:23:11 baseline: pre: clean", + "20:23:11 mode: test needs grbl - already in grbl mode", + "20:23:11 $35=12.0% -> PWMSAR 15 of 127 ($31=0.0, $32=1.0, $36=100.0)", + "20:23:11 PASS: nonzero S never commands less than PWMSAR 15", + "20:23:11 baseline: post: clean", + "20:23:11 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "laser.power-floor", - "ts": "2026-09-09T16:24:39Z" + "ts": "2026-09-09T20:23:11Z" }, "requires": [], "satisfied": true, @@ -14015,7 +13937,7 @@ "src/main.c" ] ], - "fingerprint": "719306d3c4bc07edd4a476c213ff3e6c6dfa4946f09cbd09b9b4f33283014fcb", + "fingerprint": "4a3d5170787a570096b9497d39ef84781a5d3d8da8e49aaf99824f8eb7fb53ab", "hardware": "api", "id": "laser.emission-witness", "inherited": false, @@ -14025,59 +13947,52 @@ { "answer": "Yes", "question": "Did the laser mark a 20 mm square outline on the scrap, all four sides?", - "ts": "2026-09-09T16:39:18Z" + "ts": "2026-09-09T21:27:32Z" } ], - "campaign": "c-20260909160235-7649", - "duration_s": 89, + "campaign": "c-20260909204732-3fa9", + "duration_s": 43, "evidence": { "actions": [ { "by": "operator", "channel": "button", "state": "presence", - "took_s": 55.79, - "ts": "2026-09-09T16:38:52Z" + "took_s": 6.44, + "ts": "2026-09-09T21:26:56Z" }, { "by": "fixture", "channel": "button", "state": "arm", - "took_s": 0.26, - "ts": "2026-09-09T16:38:52Z" + "took_s": 0.25, + "ts": "2026-09-09T21:26:56Z" } ], "armed_seen": true, "baseline": { - "post": [ - { - "action": "waited", - "expected": "idle/unarmed/no hold", - "found": "smoke/armed=False/hold=False", - "item": "cool" - } - ], + "post": [], "pre": [] }, "batch": { "group": "attended", - "ts": "2026-09-09T16:34:09Z" + "ts": "2026-09-09T21:25:38Z" }, "beam": { - "delta": 1137, + "delta": 959, "digital_seen": true, - "idle": 1529, - "peak": 2666, - "samples": 92 + "idle": 1659, + "peak": 2618, + "samples": 93 }, "button_dark": false, "button_latch_set_at": [], "button_latch_unlocked_max": 0, - "button_latch_unlocked_samples": 46, + "button_latch_unlocked_samples": 43, "disarm_after_idle_s": 0.0, "emission_end": 0, - "emission_peak": 156, - "exhaust_at_first_fire": 11376, + "emission_peak": 153, + "exhaust_at_first_fire": 11654, "exhaust_floor": 6400.0, "fixture": { "channels": [ @@ -14095,10 +14010,10 @@ "hv_min": 0, "idle_airflow_fire": [], "lid_ir_peak": [ - 58, - 59, + 57, + 57, 62, - 62 + 64 ], "mode": { "detail": "already in grbl mode", @@ -14109,18 +14024,18 @@ }, "operator": { "ack_live": true, - "ts": "2026-09-09T16:37:55Z" + "ts": "2026-09-09T21:26:49Z" }, "pgood_peak": 255, "pre_fire": { "armed": false, - "beam": 1529, + "beam": 1659, "beam_d": 0, "button": false, "button_latch": 1, "button_lit": false, "emission": 0, - "exhaust": 3184, + "exhaust": 3175, "faults": 0, "fire_watch": "armed", "gstate": null, @@ -14140,10 +14055,10 @@ "msgs": "", "pgood": 255, "phase": "idle", - "t": 1788971876.5217261, + "t": 1788989209.7429738, "verdict": "OK" }, - "samples": 92, + "samples": 93, "trail": [ [ 0.0, @@ -14158,7 +14073,7 @@ true, false, false, - 1819, + 1748, 0, null ], @@ -14175,7 +14090,7 @@ true, false, false, - 1818, + 1746, 0, "[MSG:Info: press the button to start the laser job]" ], @@ -14192,7 +14107,7 @@ true, false, false, - 1816, + 1747, 0, null ], @@ -14209,7 +14124,7 @@ true, true, false, - 1817, + 1749, 0, null ], @@ -14226,12 +14141,12 @@ true, false, false, - 1820, + 1751, 0, null ], [ - 0.92, + 0.87, "Idle", "idle", 0, @@ -14243,12 +14158,12 @@ true, false, false, - 1818, + 1751, 0, null ], [ - 1.17, + 1.07, "Idle", "idle", 0, @@ -14260,12 +14175,12 @@ true, false, false, - 1816, + 1756, 0, null ], [ - 1.37, + 1.27, "Idle", "idle", 0, @@ -14277,12 +14192,12 @@ true, false, false, - 1819, + 1759, 0, null ], [ - 1.57, + 1.47, "Idle", "idle", 0, @@ -14294,12 +14209,12 @@ true, false, false, - 1820, + 1757, 0, null ], [ - 1.77, + 1.69, "Idle", "idle", 0, @@ -14311,12 +14226,12 @@ true, false, false, - 1820, + 1760, 0, null ], [ - 1.97, + 1.9, "Idle", "idle", 0, @@ -14328,12 +14243,12 @@ true, false, false, - 1823, + 1764, 0, null ], [ - 2.21, + 2.1, "Idle", "idle", 0, @@ -14345,12 +14260,12 @@ true, false, false, - 1821, + 1762, 0, null ], [ - 2.41, + 2.3, "Idle", "idle", 0, @@ -14362,12 +14277,12 @@ true, false, false, - 1823, + 1761, 0, null ], [ - 2.62, + 2.5, "Idle", "idle", 0, @@ -14379,12 +14294,12 @@ true, false, false, - 1822, + 1766, 0, null ], [ - 2.82, + 2.7, "Idle", "idle", 0, @@ -14396,12 +14311,12 @@ true, false, false, - 1820, + 1767, 0, null ], [ - 3.02, + 2.92, "Idle", "idle", 0, @@ -14413,12 +14328,12 @@ true, false, false, - 1819, + 1767, 0, null ], [ - 3.22, + 3.12, "Idle", "idle", 0, @@ -14430,12 +14345,12 @@ true, false, false, - 1822, + 1768, 0, null ], [ - 3.42, + 3.32, "Idle", "idle", 0, @@ -14447,12 +14362,12 @@ true, false, false, - 1823, + 1769, 0, null ], [ - 3.62, + 3.52, "Idle", "idle", 0, @@ -14464,12 +14379,12 @@ true, false, false, - 1821, + 1767, 0, null ], [ - 3.82, + 3.72, "Idle", "idle", 0, @@ -14481,12 +14396,12 @@ true, false, false, - 1820, + 1768, 0, null ], [ - 4.02, + 3.92, "Idle", "idle", 0, @@ -14498,12 +14413,12 @@ true, false, false, - 1821, + 1771, 0, null ], [ - 4.26, + 4.12, "Idle", "idle", 0, @@ -14515,12 +14430,12 @@ true, false, false, - 1822, + 1772, 0, null ], [ - 4.46, + 4.32, "Idle", "idle", 0, @@ -14532,12 +14447,12 @@ true, false, false, - 1822, + 1773, 0, null ], [ - 4.66, + 4.52, "Idle", "idle", 0, @@ -14549,12 +14464,12 @@ true, false, false, - 1821, + 1773, 0, null ], [ - 4.86, + 4.72, "Idle", "idle", 0, @@ -14566,12 +14481,12 @@ true, false, false, - 1820, + 1775, 0, null ], [ - 5.06, + 4.96, "Idle", "idle", 0, @@ -14583,12 +14498,12 @@ true, false, false, - 1821, + 1777, 0, null ], [ - 5.26, + 5.16, "Idle", "idle", 0, @@ -14600,12 +14515,12 @@ true, false, false, - 1822, + 1777, 0, null ], [ - 5.47, + 5.36, "Idle", "idle", 0, @@ -14617,12 +14532,29 @@ true, false, false, - 1820, + 1778, 0, null ], [ - 5.67, + 5.56, + "Idle", + "idle", + 0, + true, + "run", + 33, + 0, + false, + true, + false, + false, + 1778, + 0, + null + ], + [ + 5.76, "Run", "idle", 0, @@ -14634,12 +14566,12 @@ true, false, false, - 1822, + 1778, 0, "[MSG:Info: laser armed (density, floor 12 %, curve custom)]" ], [ - 5.95, + 5.98, "Run", "running", 0, @@ -14651,12 +14583,12 @@ true, false, true, - 1821, + 1780, 0, null ], [ - 6.15, + 6.2, "Run", "running", 0, @@ -14668,15 +14600,15 @@ true, false, true, - 2666, - 595, + 2601, + 287, null ], [ - 6.36, + 6.41, "Run", "running", - 31, + 0, true, "run", 2, @@ -14685,15 +14617,15 @@ true, false, true, - 2625, - 546, + 2581, + 281, null ], [ - 6.61, + 6.62, "Run", "running", - 31, + 0, true, "run", 2, @@ -14702,15 +14634,15 @@ true, false, true, - 2636, - 588, + 2618, + 605, null ], [ - 6.82, + 6.83, "Run", "running", - 31, + 0, true, "run", 2, @@ -14719,117 +14651,15 @@ true, false, true, - 2626, - 350, + 2605, + 247, null ], [ - 7.03, + 7.04, "Run", "running", - 31, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2628, - 482, - null - ], - [ - 7.24, - "Run", - "running", - 140, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2599, - 277, - null - ], - [ - 7.45, - "Run", - "running", - 140, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2593, - 584, - null - ], - [ - 7.67, - "Run", - "running", - 140, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2622, - 665, - null - ], - [ - 7.88, - "Run", - "running", - 140, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2619, - 422, - null - ], - [ - 8.09, - "Run", - "running", - 140, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2606, - 399, - null - ], - [ - 8.3, - "Run", - "running", - 141, + 143, true, "run", 1, @@ -14838,83 +14668,15 @@ true, false, true, - 2621, - 318, + 2582, + 167, null ], [ - 8.51, + 7.26, "Run", "running", - 141, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2611, - 498, - null - ], - [ - 8.73, - "Run", - "running", - 141, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2617, - 249, - null - ], - [ - 8.94, - "Run", - "running", - 141, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2648, - 955, - null - ], - [ - 9.15, - "Run", - "running", - 141, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2603, - 192, - null - ], - [ - 9.36, - "Run", - "running", - 151, + 143, true, "run", 1, @@ -14923,15 +14685,32 @@ true, false, true, - 2596, - 530, + 2567, + 256, null ], [ - 9.57, + 7.47, "Run", "running", - 151, + 143, + true, + "run", + 2, + 0, + false, + true, + false, + true, + 2566, + 159, + null + ], + [ + 7.68, + "Run", + "running", + 143, true, "run", 1, @@ -14940,15 +14719,168 @@ true, false, true, - 2584, - 654, + 2549, + 373, null ], [ - 9.8, + 7.89, + "Run", + "running", + 143, + true, + "run", + 1, + 0, + false, + true, + false, + true, + 2554, + 271, + null + ], + [ + 8.1, + "Run", + "running", + 137, + true, + "run", + 1, + 0, + false, + true, + false, + true, + 2539, + 988, + null + ], + [ + 8.34, + "Run", + "running", + 137, + true, + "run", + 2, + 0, + false, + true, + false, + true, + 2544, + 245, + null + ], + [ + 8.55, + "Run", + "running", + 137, + true, + "run", + 1, + 0, + false, + true, + false, + true, + 2555, + 300, + null + ], + [ + 8.76, + "Run", + "running", + 137, + true, + "run", + 2, + 0, + false, + true, + false, + true, + 2564, + 1023, + null + ], + [ + 8.97, + "Run", + "running", + 137, + true, + "run", + 2, + 0, + false, + true, + false, + true, + 2531, + 164, + null + ], + [ + 9.18, + "Run", + "running", + 137, + true, + "run", + 2, + 0, + false, + true, + false, + true, + 2563, + 405, + null + ], + [ + 9.42, + "Run", + "running", + 137, + true, + "run", + 2, + 0, + false, + true, + false, + true, + 2543, + 285, + null + ], + [ + 9.64, + "Run", + "running", + 137, + true, + "run", + 2, + 0, + false, + true, + false, + true, + 2510, + 284, + null + ], + [ + 9.84, "Idle", "running", - 151, + 137, true, "run", 1, @@ -14957,15 +14889,15 @@ true, false, true, - 2609, - 189, + 2542, + 215, null ], [ - 10.05, + 10.07, "Idle", "idle", - 151, + 143, true, "run", 1, @@ -14974,15 +14906,15 @@ true, false, true, - 1838, + 1810, 0, null ], [ - 10.29, + 10.31, "Idle", "idle", - 119, + 143, true, "run", 1, @@ -14991,15 +14923,15 @@ true, false, true, - 1835, + 1806, 0, null ], [ - 10.53, + 10.56, "Idle", "idle", - 119, + 143, true, "run", 33, @@ -15008,15 +14940,15 @@ true, false, false, - 1832, + 1803, 0, null ], [ - 10.77, + 10.78, "Idle", "idle", - 119, + 143, true, "run", 33, @@ -15025,15 +14957,15 @@ true, false, false, - 1831, + 1804, 0, null ], [ - 11.02, + 11.03, "Idle", "idle", - 119, + 5, true, "run", 33, @@ -15042,15 +14974,15 @@ true, false, false, - 1832, + 1803, 0, null ], [ - 11.25, + 11.27, "Idle", "idle", - 0, + 5, true, "run", 33, @@ -15059,15 +14991,15 @@ true, false, false, - 1832, + 1805, 0, null ], [ - 11.49, + 11.52, "Idle", "idle", - 0, + 5, true, "run", 33, @@ -15076,15 +15008,15 @@ true, false, false, - 1833, + 1806, 0, null ], [ - 11.74, + 11.77, "Idle", "idle", - 0, + 5, true, "run", 33, @@ -15093,7 +15025,7 @@ true, false, false, - 1833, + 1805, 0, null ], @@ -15110,12 +15042,12 @@ true, false, false, - 1833, + 1804, 0, null ], [ - 12.22, + 12.24, "Run", "idle", 0, @@ -15127,12 +15059,12 @@ true, false, false, - 1832, + 1806, 0, null ], [ - 12.45, + 12.49, "Run", "running", 0, @@ -15144,12 +15076,12 @@ true, false, true, - 1831, + 1811, 0, null ], [ - 12.66, + 12.69, "Run", "running", 0, @@ -15161,12 +15093,12 @@ true, false, true, - 2622, - 447, + 2522, + 377, null ], [ - 12.87, + 12.94, "Run", "running", 0, @@ -15178,49 +15110,15 @@ true, false, true, - 2618, - 483, + 2503, + 552, null ], [ - 13.11, + 13.13, "Run", "running", - 0, - true, - "run", - 0, - 0, - false, - true, - false, - true, - 2631, - 578, - null - ], - [ - 13.33, - "Run", - "running", - 109, - true, - "run", - 1, - 0, - false, - true, - false, - true, - 2618, - 423, - null - ], - [ - 13.53, - "Run", - "running", - 109, + 67, true, "run", 2, @@ -15229,168 +15127,15 @@ true, false, true, - 2633, - 1023, + 2544, + 282, null ], [ - 13.74, + 13.34, "Run", "running", - 109, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2638, - 396, - null - ], - [ - 13.93, - "Run", - "running", - 109, - true, - "run", - 1, - 0, - false, - true, - false, - true, - 2611, - 174, - null - ], - [ - 14.19, - "Run", - "running", - 109, - true, - "run", - 1, - 0, - false, - true, - false, - true, - 2610, - 206, - null - ], - [ - 14.41, - "Run", - "running", - 156, - true, - "run", - 1, - 0, - false, - true, - false, - true, - 2608, - 234, - null - ], - [ - 14.63, - "Run", - "running", - 156, - true, - "run", - 1, - 0, - false, - true, - false, - true, - 2589, - 198, - null - ], - [ - 14.83, - "Run", - "running", - 156, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2598, - 838, - null - ], - [ - 15.04, - "Run", - "running", - 156, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2558, - 284, - null - ], - [ - 15.23, - "Run", - "running", - 144, - true, - "run", - 1, - 0, - false, - true, - false, - true, - 2574, - 224, - null - ], - [ - 15.46, - "Run", - "running", - 144, - true, - "run", - 2, - 0, - false, - true, - false, - true, - 2583, - 330, - null - ], - [ - 15.65, - "Run", - "running", - 144, + 67, true, "run", 1, @@ -15400,14 +15145,65 @@ false, true, 2555, - 249, + 414, null ], [ - 15.85, + 13.55, "Run", "running", - 144, + 67, + true, + "run", + 1, + 0, + false, + true, + false, + true, + 2560, + 145, + null + ], + [ + 13.76, + "Run", + "running", + 67, + true, + "run", + 1, + 0, + false, + true, + false, + true, + 2545, + 375, + null + ], + [ + 13.99, + "Run", + "running", + 67, + true, + "run", + 1, + 0, + false, + true, + false, + true, + 2574, + 479, + null + ], + [ + 14.2, + "Run", + "running", + 141, true, "run", 2, @@ -15416,32 +15212,66 @@ true, false, true, - 2612, - 878, + 2552, + 342, null ], [ - 16.05, + 14.41, "Run", "running", - 144, + 141, true, "run", - 2, + 1, 0, false, true, false, true, - 2584, - 155, + 2548, + 370, null ], [ - 16.25, - "Idle", + 14.61, + "Run", "running", - 140, + 141, + true, + "run", + 1, + 0, + false, + true, + false, + true, + 2554, + 427, + null + ], + [ + 14.81, + "Run", + "running", + 141, + true, + "run", + 1, + 0, + false, + true, + false, + true, + 2546, + 315, + null + ], + [ + 15.04, + "Run", + "running", + 143, true, "run", 2, @@ -15451,14 +15281,116 @@ false, true, 2574, - 285, + 270, + null + ], + [ + 15.26, + "Run", + "running", + 143, + true, + "run", + 2, + 0, + false, + true, + false, + true, + 2575, + 431, + null + ], + [ + 15.46, + "Run", + "running", + 143, + true, + "run", + 2, + 0, + false, + true, + false, + true, + 2581, + 333, + null + ], + [ + 15.67, + "Run", + "running", + 143, + true, + "run", + 1, + 0, + false, + true, + false, + true, + 2549, + 230, + null + ], + [ + 15.88, + "Run", + "running", + 143, + true, + "run", + 1, + 0, + false, + true, + false, + true, + 2554, + 359, + null + ], + [ + 16.15, + "Run", + "running", + 153, + true, + "run", + 2, + 0, + false, + true, + false, + true, + 2596, + 246, + null + ], + [ + 16.35, + "Idle", + "running", + 153, + true, + "run", + 2, + 0, + false, + true, + false, + true, + 2568, + 112, "[MSG:Pgm End]" ], [ - 16.53, + 16.55, "Idle", "running", - 140, + 153, false, "run", 13, @@ -15467,15 +15399,15 @@ true, false, true, - 1850, + 1841, 0, "[MSG:Info: laser disarmed - latch locked]" ], [ - 16.73, + 16.75, "Idle", "idle", - 140, + 153, false, "smoke", 13, @@ -15484,15 +15416,15 @@ true, false, true, - 1840, + 1819, 0, null ], [ - 16.93, + 16.95, "Idle", "idle", - 140, + 153, false, "smoke", 45, @@ -15501,15 +15433,15 @@ true, false, true, - 1840, + 1819, 0, null ], [ - 17.13, + 17.15, "Idle", "idle", - 140, + 84, false, "smoke", 45, @@ -15518,15 +15450,15 @@ true, false, false, - 1837, + 1819, 0, null ], [ - 17.33, + 17.37, "Idle", "idle", - 42, + 84, false, "smoke", 45, @@ -15535,15 +15467,15 @@ true, false, false, - 1837, + 1819, 0, null ], [ - 17.56, + 17.57, "Idle", "idle", - 42, + 84, false, "smoke", 45, @@ -15552,15 +15484,15 @@ true, false, false, - 1838, + 1817, 0, null ], [ - 17.76, + 17.77, "Idle", "idle", - 42, + 84, false, "smoke", 45, @@ -15569,15 +15501,15 @@ true, false, false, - 1835, + 1817, 0, null ], [ - 17.96, + 17.97, "Idle", "idle", - 42, + 84, false, "smoke", 45, @@ -15586,29 +15518,12 @@ true, false, false, - 1836, + 1817, 0, null ], [ - 18.16, - "Idle", - "idle", - 42, - false, - "smoke", - 45, - 1, - true, - true, - false, - false, - 1835, - 0, - null - ], - [ - 18.36, + 18.17, "Idle", "idle", 0, @@ -15620,12 +15535,12 @@ true, false, false, - 1837, + 1817, 0, null ], [ - 18.59, + 18.38, "Idle", "idle", 0, @@ -15637,12 +15552,12 @@ true, false, false, - 1838, + 1816, 0, null ], [ - 18.81, + 18.58, "Idle", "idle", 0, @@ -15654,12 +15569,12 @@ true, false, false, - 1835, + 1817, 0, null ], [ - 19.01, + 18.78, "Idle", "idle", 0, @@ -15671,12 +15586,12 @@ true, false, false, - 1835, + 1817, 0, null ], [ - 19.21, + 18.98, "Idle", "idle", 0, @@ -15688,12 +15603,12 @@ true, false, false, - 1836, + 1819, 0, null ], [ - 19.41, + 19.18, "Idle", "idle", 0, @@ -15705,7 +15620,24 @@ true, false, false, - 1835, + 1819, + 0, + null + ], + [ + 19.38, + "Idle", + "idle", + 0, + false, + "smoke", + 45, + 1, + true, + true, + false, + false, + 1821, 0, null ] @@ -15728,41 +15660,40 @@ "msgs" ] }, - "fingerprint": "719306d3c4bc07edd4a476c213ff3e6c6dfa4946f09cbd09b9b4f33283014fcb", - "image": "20260909150456 (dev)", + "fingerprint": "4a3d5170787a570096b9497d39ef84781a5d3d8da8e49aaf99824f8eb7fb53ab", + "image": "20260909193551 (dev)", "log": [ - "16:37:55 start laser.emission-witness (live, api) in campaign c-20260909160235-7649", - "16:37:55 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:37:55 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:37:55 queued by the attended queue opened 2026-09-09T16:34:09Z", - "16:37:56 baseline: pre: clean", - "16:37:56 mode: test needs grbl - already in grbl mode", - "16:37:56 connect: Idle", - "16:37:56 pre-fire: emission=0 hv=0 armed=False verdict=OK", - "16:37:56 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 20 mm +X and +Y clear, and close the lid. Then press the button on the machine to start.", - "16:37:56 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", - "16:38:26 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:38:52 READY: operator present (press after 55.8 s); the bench takes the presses", - "16:38:52 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", - "16:38:52 ARM press by the fixture, button lit after 0.3 s", - "16:38:56 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:39:12 beam detector: idle 1529, peak 2666, digital asserted True", - "16:39:12 emission_samples peak=156 end=0; hv 0..1023; lid_ir peak [58, 59, 62, 62]; armed seen True", - "16:39:12 dwell gap: button latch through the unlocked window max=0 over 46 samples (set at []); HV_ENABLE dipped=True, back with emission after it=True", - "16:39:12 exhaust at the first emission sample: 11376 rpm (floor 6400)", - "16:39:12 time-to-disarm after Idle: 0.0 s", - "16:39:12 button dark after 0.0 s", - "16:39:12 PROMPT: Did the laser mark a 20 mm square outline on the scrap, all four sides?", - "16:39:18 ANSWER: Yes", - "16:39:18 PASS: emission peak 156 -> 0, HV 0..1023, beam +1137, disarmed 0.0 s after Idle, button dark, mark confirmed", - "16:39:25 baseline: post: 1 leftover(s): cool=smoke/armed=False/hold=False (expected idle/unarmed/no hold) -> waited", - "16:39:25 result PASS" + "21:26:49 start laser.emission-witness (live, api) in campaign c-20260909204732-3fa9", + "21:26:49 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:26:49 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "21:26:49 queued by the attended queue opened 2026-09-09T21:25:38Z", + "21:26:49 baseline: pre: clean", + "21:26:49 mode: test needs grbl - already in grbl mode", + "21:26:49 connect: Idle", + "21:26:49 pre-fire: emission=0 hv=0 armed=False verdict=OK", + "21:26:49 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 20 mm +X and +Y clear, and close the lid. Then press the button on the machine to start.", + "21:26:49 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", + "21:26:56 READY: operator present (press after 6.4 s); the bench takes the presses", + "21:26:56 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", + "21:26:57 ARM press by the fixture, button lit after 0.3 s", + "21:27:16 beam detector: idle 1659, peak 2618, digital asserted True", + "21:27:16 emission_samples peak=153 end=0; hv 0..1023; lid_ir peak [57, 57, 62, 64]; armed seen True", + "21:27:16 dwell gap: button latch through the unlocked window max=0 over 43 samples (set at []); HV_ENABLE dipped=True, back with emission after it=True", + "21:27:16 exhaust at the first emission sample: 11654 rpm (floor 6400)", + "21:27:16 time-to-disarm after Idle: 0.0 s", + "21:27:16 button dark after 0.0 s", + "21:27:16 PROMPT: Did the laser mark a 20 mm square outline on the scrap, all four sides?", + "21:27:19 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:27:32 ANSWER: Yes", + "21:27:32 PASS: emission peak 153 -> 0, HV 0..1023, beam +959, disarmed 0.0 s after Idle, button dark, mark confirmed", + "21:27:32 baseline: post: clean", + "21:27:32 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "laser.emission-witness", - "ts": "2026-09-09T16:39:25Z" + "ts": "2026-09-09T21:27:32Z" }, "requires": [ "kernel.latch-locked-idle", @@ -15802,30 +15733,30 @@ "src/main.c" ] ], - "fingerprint": "7cd2af9a15bf206ca78b1bc0fb11e8cd3e3ab6cce4a71be0be77f779638c1c3e", + "fingerprint": "c7f943cd9b0d89752407640e37fa98456c814489b56c318b07a1eb29d6a89356", "hardware": "api", "id": "laser.m5-rapid-dark", "inherited": false, "kind": "live", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 58, + "campaign": "c-20260909204732-3fa9", + "duration_s": 46, "evidence": { "actions": [ { "by": "operator", "channel": "button", "state": "presence", - "took_s": 19.27, - "ts": "2026-09-09T16:56:07Z" + "took_s": 8.22, + "ts": "2026-09-09T21:43:33Z" }, { "by": "fixture", "channel": "button", "state": "arm", "took_s": 0.26, - "ts": "2026-09-09T16:56:07Z" + "ts": "2026-09-09T21:43:33Z" } ], "baseline": { @@ -15855,9 +15786,9 @@ }, "batch": { "group": "attended", - "ts": "2026-09-09T16:34:09Z" + "ts": "2026-09-09T21:25:38Z" }, - "emission_peak": 142, + "emission_peak": 153, "fixture": { "channels": [ "lid", @@ -15878,40 +15809,40 @@ }, "operator": { "ack_live": true, - "ts": "2026-09-09T16:55:46Z" + "ts": "2026-09-09T21:43:23Z" }, "relit_first": null, "relit_samples": 0, "samples": 83, - "tail_samples": 37 + "tail_samples": 35 }, - "fingerprint": "7cd2af9a15bf206ca78b1bc0fb11e8cd3e3ab6cce4a71be0be77f779638c1c3e", - "image": "20260909150456 (dev)", + "fingerprint": "c7f943cd9b0d89752407640e37fa98456c814489b56c318b07a1eb29d6a89356", + "image": "20260909193551 (dev)", "log": [ - "16:55:46 start laser.m5-rapid-dark (live, api) in campaign c-20260909160235-7649", - "16:55:46 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:55:46 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:55:46 queued by the attended queue opened 2026-09-09T16:34:09Z", - "16:55:46 baseline: pre: clean", - "16:55:46 mode: test needs grbl - already in grbl mode", - "16:55:47 connect: Idle", - "16:55:47 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 20 mm +X clear, and close the lid. Then press the button on the machine to start.", - "16:55:47 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", - "16:56:07 READY: operator present (press after 19.3 s); the bench takes the presses", - "16:56:07 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", - "16:56:07 ARM press by the fixture, button lit after 0.3 s", - "16:56:17 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:56:25 emission peak 142; dark from +9.7 s; 37 samples after it spanning 8.5 s, 0 with emission, HV max after dark 0", - "16:56:25 PASS: emission peak 142 on the G1, 0 through both rapids, HV 0 after the M5", - "16:56:44 baseline: head jogged back -20.006/-0.000 mm to its start", - "16:56:44 baseline: post: 2 leftover(s): cool=run/armed=False/hold=False (expected idle/unarmed/no hold) -> waited; position=[1067, 0, 0] (expected [0, 0, 0]) -> restored (jogged back -20.0/-0.0 mm)", - "16:56:44 result PASS" + "21:43:23 start laser.m5-rapid-dark (live, api) in campaign c-20260909204732-3fa9", + "21:43:23 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:43:23 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "21:43:23 queued by the attended queue opened 2026-09-09T21:25:38Z", + "21:43:24 baseline: pre: clean", + "21:43:24 mode: test needs grbl - already in grbl mode", + "21:43:24 connect: Idle", + "21:43:24 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 20 mm +X clear, and close the lid. Then press the button on the machine to start.", + "21:43:24 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", + "21:43:33 READY: operator present (press after 8.2 s); the bench takes the presses", + "21:43:33 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", + "21:43:33 ARM press by the fixture, button lit after 0.3 s", + "21:43:51 emission peak 153; dark from +10.0 s; 35 samples after it spanning 8.1 s, 0 with emission, HV max after dark 0", + "21:43:51 PASS: emission peak 153 on the G1, 0 through both rapids, HV 0 after the M5", + "21:43:54 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:44:10 baseline: head jogged back -20.006/-0.000 mm to its start", + "21:44:10 baseline: post: 2 leftover(s): cool=run/armed=False/hold=False (expected idle/unarmed/no hold) -> waited; position=[1067, 0, 0] (expected [0, 0, 0]) -> restored (jogged back -20.0/-0.0 mm)", + "21:44:10 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "laser.m5-rapid-dark", - "ts": "2026-09-09T16:56:44Z" + "ts": "2026-09-09T21:44:10Z" }, "requires": [ "laser.emission-witness" @@ -15949,30 +15880,30 @@ "src/main.c" ] ], - "fingerprint": "114dfccc5be267fb503dfe9fc5ff04d9ce3aaafdcf81d69e928c86d173f73be7", + "fingerprint": "6a689b31d800b43c7a214bae34c64e95c962520f20d74fbf23b8bea3c59c17c2", "hardware": "api", "id": "laser.disarm-in-hold", "inherited": false, "kind": "live", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 99, + "campaign": "c-20260909204732-3fa9", + "duration_s": 87, "evidence": { "actions": [ { "by": "operator", "channel": "button", "state": "presence", - "took_s": 11.43, - "ts": "2026-09-09T16:56:57Z" + "took_s": 2.68, + "ts": "2026-09-09T21:44:14Z" }, { "by": "fixture", "channel": "button", "state": "press", - "took_s": 6.1, - "ts": "2026-09-09T16:56:57Z" + "took_s": 3.63, + "ts": "2026-09-09T21:44:14Z" } ], "baseline": { @@ -15984,14 +15915,14 @@ "item": "cool" }, { - "action": "restored (jogged back -11.0/-0.0 mm)", + "action": "restored (jogged back -11.9/-0.0 mm)", "expected": [ 0, 0, 0 ], "found": [ - 589, + 637, 0, 0 ], @@ -16002,7 +15933,7 @@ }, "batch": { "group": "attended", - "ts": "2026-09-09T16:34:09Z" + "ts": "2026-09-09T21:25:38Z" }, "button_dark": false, "disarmed_after_s": 60.6, @@ -16027,41 +15958,40 @@ }, "operator": { "ack_live": true, - "ts": "2026-09-09T16:56:45Z" + "ts": "2026-09-09T21:44:10Z" } }, - "fingerprint": "114dfccc5be267fb503dfe9fc5ff04d9ce3aaafdcf81d69e928c86d173f73be7", - "image": "20260909150456 (dev)", + "fingerprint": "6a689b31d800b43c7a214bae34c64e95c962520f20d74fbf23b8bea3c59c17c2", + "image": "20260909193551 (dev)", "log": [ - "16:56:45 start laser.disarm-in-hold (live, api) in campaign c-20260909160235-7649", - "16:56:45 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:56:45 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:56:45 queued by the attended queue opened 2026-09-09T16:34:09Z", - "16:56:45 baseline: pre: clean", - "16:56:45 mode: test needs grbl - already in grbl mode", - "16:56:45 connect: Idle", - "16:56:45 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 40 mm +X clear, and close the lid. Then press the button on the machine to start.", - "16:56:45 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", - "16:56:57 READY: operator present (press after 11.4 s); the bench takes the presses", - "16:56:57 armed; waiting for motion to start (arm + your button press)...", - "16:56:57 ACT button press (fixture)", - "16:57:03 ACT button press: done after 6.1 s", - "16:57:03 moving under laser: Run; feed-hold in 2 s", - "16:57:05 feed-held mid-move: Hold:1; watching the disarm grace count down IN HOLD", - "16:57:16 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:57:48 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:58:08 button dark after 0.0 s", - "16:58:08 PASS: disarmed in Hold after 60.6 s, button dark", - "16:58:18 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:58:24 baseline: head jogged back -11.044/-0.000 mm to its start", - "16:58:24 baseline: post: 2 leftover(s): cool=smoke/armed=False/hold=False (expected idle/unarmed/no hold) -> waited; position=[589, 0, 0] (expected [0, 0, 0]) -> restored (jogged back -11.0/-0.0 mm)", - "16:58:24 result PASS" + "21:44:10 start laser.disarm-in-hold (live, api) in campaign c-20260909204732-3fa9", + "21:44:10 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:44:10 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "21:44:10 queued by the attended queue opened 2026-09-09T21:25:38Z", + "21:44:10 baseline: pre: clean", + "21:44:10 mode: test needs grbl - already in grbl mode", + "21:44:11 connect: Idle", + "21:44:11 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 40 mm +X clear, and close the lid. Then press the button on the machine to start.", + "21:44:11 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", + "21:44:14 READY: operator present (press after 2.7 s); the bench takes the presses", + "21:44:14 armed; waiting for motion to start (arm + your button press)...", + "21:44:14 ACT button press (fixture)", + "21:44:17 ACT button press: done after 3.6 s", + "21:44:17 moving under laser: Run; feed-hold in 2 s", + "21:44:19 feed-held mid-move: Hold:1; watching the disarm grace count down IN HOLD", + "21:44:41 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:45:11 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:45:22 button dark after 0.0 s", + "21:45:22 PASS: disarmed in Hold after 60.6 s, button dark", + "21:45:37 baseline: head jogged back -11.944/-0.000 mm to its start", + "21:45:37 baseline: post: 2 leftover(s): cool=smoke/armed=False/hold=False (expected idle/unarmed/no hold) -> waited; position=[637, 0, 0] (expected [0, 0, 0]) -> restored (jogged back -11.9/-0.0 mm)", + "21:45:37 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "laser.disarm-in-hold", - "ts": "2026-09-09T16:58:24Z" + "ts": "2026-09-09T21:45:37Z" }, "requires": [ "laser.emission-witness" @@ -16103,14 +16033,14 @@ "src/main.c" ] ], - "fingerprint": "0c0c2fa92f12f173a45ff8c323befc2be0b153e840ddaa4204329d70f4a614a1", + "fingerprint": "5738e1a5142fb6fe0124ca78148ce98e0d0d95236e33dcccec7414b834fba54f", "hardware": "api", "id": "laser.armed-kill", "inherited": false, "kind": "live", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909204732-3fa9", "duration_s": 47, "evidence": { "actions": [ @@ -16118,22 +16048,22 @@ "by": "operator", "channel": "button", "state": "presence", - "took_s": 4.12, - "ts": "2026-09-09T16:58:29Z" + "took_s": 2.36, + "ts": "2026-09-09T21:45:41Z" }, { "by": "fixture", "channel": "button", "state": "arm", "took_s": 0.25, - "ts": "2026-09-09T16:58:29Z" + "ts": "2026-09-09T21:45:41Z" }, { "by": "fixture", "channel": "button", "state": "arm", "took_s": 0.26, - "ts": "2026-09-09T16:58:49Z" + "ts": "2026-09-09T21:46:02Z" } ], "baseline": { @@ -16155,10 +16085,10 @@ }, "batch": { "group": "attended", - "ts": "2026-09-09T16:34:09Z" + "ts": "2026-09-09T21:25:38Z" }, - "beam_at_fire_kill": 2471, - "beam_at_fire_stop": 2523, + "beam_at_fire_kill": 2506, + "beam_at_fire_stop": 2488, "button_dark": false, "expected": { "kernel_not_running": true, @@ -16176,44 +16106,44 @@ "tail_zero": true, "trail": [ [ - 0.58, - 10, + 0.59, + 99, "idle", false ], [ 0.78, - 10, + 37, "idle", false ], [ - 0.98, - 45, + 0.99, + 37, "idle", false ], [ 1.18, - 45, + 37, "idle", false ], [ 1.39, - 45, + 37, "idle", false ], [ - 1.59, - 45, + 1.58, + 37, "idle", false ], [ 1.79, - 45, + 0, "idle", false ], @@ -16224,25 +16154,25 @@ false ], [ - 2.19, + 2.22, 0, "idle", false ], [ - 2.42, + 2.43, 0, "idle", false ], [ - 2.62, + 2.63, 0, "idle", false ], [ - 2.82, + 2.83, 0, "idle", false @@ -16254,175 +16184,175 @@ false ], [ - 3.22, + 3.23, 0, "idle", false ], [ - 3.42, + 3.43, 0, "idle", false ], [ - 3.62, + 3.63, 0, "idle", false ], [ - 3.82, + 3.83, 0, "idle", false ], [ - 4.02, + 4.03, 0, "idle", false ], [ - 4.22, + 4.23, 0, "idle", false ], [ - 4.42, + 4.43, 0, "idle", false ], [ - 4.64, + 4.63, 0, "idle", false ], [ - 4.84, + 4.83, 0, "idle", false ], [ - 5.04, + 5.03, 0, "idle", false ], [ - 5.25, + 5.23, 0, "idle", false ], [ - 5.45, + 5.42, 0, "idle", false ], [ - 5.68, + 5.63, 0, "idle", false ], [ - 5.88, + 5.83, 0, "idle", false ], [ - 6.08, + 6.02, 0, "idle", false ], [ - 6.28, + 6.22, 0, "idle", false ], [ - 6.48, + 6.42, 0, "idle", false ], [ - 6.68, + 6.64, 0, "idle", false ], [ - 6.88, + 6.84, 0, "idle", false ], [ - 7.08, + 7.04, 0, "idle", false ], [ - 7.28, + 7.24, 0, "idle", false ], [ - 7.48, + 7.43, 0, "idle", false ], [ - 7.68, + 7.64, 0, "idle", false ], [ - 7.9, + 7.83, 0, "idle", false ], [ - 8.1, + 8.04, 0, "idle", false ], [ - 8.3, + 8.24, 0, "idle", false ], [ - 8.5, + 8.44, 0, "idle", false ], [ - 8.7, + 8.64, 0, "idle", false ] ], - "zero_at_s": 1.99 + "zero_at_s": 1.79 }, "fixture": { "channels": [ @@ -16447,7 +16377,7 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 11355, + "pid": 16576, "why": "" }, "mode_after_start": { @@ -16456,76 +16386,76 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 11277, + "pid": 16499, "why": "" }, "operator": { "ack_live": true, - "ts": "2026-09-09T16:58:24Z" + "ts": "2026-09-09T21:45:37Z" }, "sigkill": { "kernel_not_running": true, "latch_locked": true, - "pid": 11277, + "pid": 16499, "tail_zero": true, "trail": [ [ 0.05, - 99, + 86, "running", true ], [ 0.25, - 99, + 86, "running", true ], [ 0.45, - 99, + 86, "underrun", true ], [ 0.65, - 99, + 86, "underrun", true ], [ - 0.87, - 99, + 0.85, + 86, "underrun", true ], [ - 1.07, - 37, + 1.08, + 47, "underrun", true ], [ 1.27, - 37, + 47, "underrun", false ], [ 1.43, - 37, + 47, "idle", false ], [ 1.6, - 37, + 47, "idle", false ], [ 1.77, - 37, + 47, "idle", false ], @@ -16548,7 +16478,7 @@ false ], [ - 2.45, + 2.46, 0, "idle", false @@ -16566,133 +16496,133 @@ false ], [ - 3.01, + 2.96, 0, "idle", false ], [ - 3.18, + 3.13, 0, "idle", false ], [ - 3.35, + 3.34, 0, "idle", false ], [ - 3.52, + 3.51, 0, "idle", false ], [ - 3.69, + 3.68, 0, "idle", false ], [ - 3.86, + 3.85, 0, "idle", false ], [ - 4.03, + 4.02, 0, "idle", false ], [ - 4.2, + 4.19, 0, "idle", false ], [ - 4.37, + 4.36, 0, "idle", false ], [ - 4.54, + 4.53, 0, "idle", false ], [ - 4.71, + 4.7, 0, "idle", false ], [ - 4.88, + 4.87, 0, "idle", false ], [ - 5.05, + 5.04, 0, "idle", false ], [ - 5.24, + 5.21, 0, "idle", false ], [ - 5.41, + 5.38, 0, "idle", false ], [ - 5.58, + 5.57, 0, "idle", false ], [ - 5.75, + 5.74, 0, "idle", false ], [ - 5.92, + 5.91, 0, "idle", false ], [ - 6.09, + 6.08, 0, "idle", false ], [ - 6.26, + 6.25, 0, "idle", false ], [ - 6.43, + 6.42, 0, "idle", false ], [ - 6.6, + 6.61, 0, "idle", false @@ -16719,130 +16649,130 @@ "zero_at_s": 1.94 } }, - "fingerprint": "0c0c2fa92f12f173a45ff8c323befc2be0b153e840ddaa4204329d70f4a614a1", - "image": "20260909150456 (dev)", + "fingerprint": "5738e1a5142fb6fe0124ca78148ce98e0d0d95236e33dcccec7414b834fba54f", + "image": "20260909193551 (dev)", "log": [ - "16:58:24 start laser.armed-kill (live, api) in campaign c-20260909160235-7649", - "16:58:24 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:58:24 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:58:24 queued by the attended queue opened 2026-09-09T16:34:09Z", - "16:58:24 baseline: pre: clean", - "16:58:24 mode: test needs grbl - already in grbl mode", - "16:58:24 connect: Idle", - "16:58:24 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 40 mm +X and +Y clear, and close the lid. Then press the button on the machine to start.", - "16:58:24 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", - "16:58:29 READY: operator present (press after 4.1 s); the bench takes the presses", - "16:58:29 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", - "16:58:30 ARM press by the fixture, button lit after 0.3 s", - "16:58:34 emission live (10) - stopping the controller NOW", - "16:58:34 POST /controller/stop -> 200 {'stopped': True} (0.51 s)", - "16:58:42 post-stop (0.58, 10, 'idle', False)", - "16:58:42 post-stop (0.78, 10, 'idle', False)", - "16:58:42 post-stop (0.98, 45, 'idle', False)", - "16:58:42 post-stop (1.18, 45, 'idle', False)", - "16:58:42 post-stop (1.39, 45, 'idle', False)", - "16:58:42 post-stop (1.59, 45, 'idle', False)", - "16:58:42 post-stop (1.79, 45, 'idle', False)", - "16:58:42 post-stop (1.99, 0, 'idle', False)", - "16:58:42 post-stop (2.19, 0, 'idle', False)", - "16:58:42 post-stop (2.42, 0, 'idle', False)", - "16:58:42 post-stop (2.62, 0, 'idle', False)", - "16:58:42 post-stop (2.82, 0, 'idle', False)", - "16:58:42 post-stop (3.02, 0, 'idle', False)", - "16:58:42 post-stop (3.22, 0, 'idle', False)", - "16:58:42 post-stop (3.42, 0, 'idle', False)", - "16:58:42 post-stop (3.62, 0, 'idle', False)", - "16:58:42 post-stop (3.82, 0, 'idle', False)", - "16:58:42 post-stop (4.02, 0, 'idle', False)", - "16:58:42 post-stop (4.22, 0, 'idle', False)", - "16:58:42 post-stop (4.42, 0, 'idle', False)", - "16:58:42 post-stop (4.64, 0, 'idle', False)", - "16:58:42 post-stop (4.84, 0, 'idle', False)", - "16:58:42 post-stop (5.04, 0, 'idle', False)", - "16:58:42 post-stop (5.25, 0, 'idle', False)", - "16:58:42 post-stop (5.45, 0, 'idle', False)", - "16:58:42 post-stop (5.68, 0, 'idle', False)", - "16:58:42 post-stop (5.88, 0, 'idle', False)", - "16:58:42 post-stop (6.08, 0, 'idle', False)", - "16:58:42 post-stop (6.28, 0, 'idle', False)", - "16:58:42 post-stop (6.48, 0, 'idle', False)", - "16:58:42 post-stop (6.68, 0, 'idle', False)", - "16:58:42 post-stop (6.88, 0, 'idle', False)", - "16:58:42 post-stop (7.08, 0, 'idle', False)", - "16:58:42 post-stop (7.28, 0, 'idle', False)", - "16:58:42 post-stop (7.48, 0, 'idle', False)", - "16:58:42 post-stop (7.68, 0, 'idle', False)", - "16:58:42 post-stop (7.9, 0, 'idle', False)", - "16:58:42 post-stop (8.1, 0, 'idle', False)", - "16:58:42 post-stop (8.3, 0, 'idle', False)", - "16:58:42 post-stop (8.5, 0, 'idle', False)", - "16:58:42 post-stop (8.7, 0, 'idle', False)", - "16:58:42 emission first 0 at +1.99 s; last 2 s all zero: True; kernel not running: True", - "16:58:42 the controller is stopped (supervision held); restarting it (no motion, no laser)", - "16:58:42 POST /controller/start -> 200 {'started': True}", - "16:58:48 /mode after start: {'mode': 'grbl', 'controller': 'running', 'pid': 11277, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", - "16:58:48 expected stop PASS: returned in 0.51 s, emission 0 at +1.99 s, controller restarted", - "16:58:49 connect: Idle", - "16:58:49 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 40 mm +X and +Y clear, and close the lid.", - "16:58:49 READY: presence already proved this test; the bench has the presses", - "16:58:49 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", - "16:58:49 ARM press by the fixture, button lit after 0.3 s", - "16:58:53 emission live (99) - SIGKILL controller pid 11277 NOW", - "16:58:54 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:59:01 post-kill (0.05, 99, 'running', True)", - "16:59:01 post-kill (0.25, 99, 'running', True)", - "16:59:01 post-kill (0.45, 99, 'underrun', True)", - "16:59:01 post-kill (0.65, 99, 'underrun', True)", - "16:59:01 post-kill (0.87, 99, 'underrun', True)", - "16:59:01 post-kill (1.07, 37, 'underrun', True)", - "16:59:01 post-kill (1.27, 37, 'underrun', False)", - "16:59:01 post-kill (1.43, 37, 'idle', False)", - "16:59:01 post-kill (1.6, 37, 'idle', False)", - "16:59:01 post-kill (1.77, 37, 'idle', False)", - "16:59:01 post-kill (1.94, 0, 'idle', False)", - "16:59:01 post-kill (2.11, 0, 'idle', False)", - "16:59:01 post-kill (2.28, 0, 'idle', False)", - "16:59:01 post-kill (2.45, 0, 'idle', False)", - "16:59:01 post-kill (2.62, 0, 'idle', False)", - "16:59:01 post-kill (2.79, 0, 'idle', False)", - "16:59:01 post-kill (3.01, 0, 'idle', False)", - "16:59:01 post-kill (3.18, 0, 'idle', False)", - "16:59:01 post-kill (3.35, 0, 'idle', False)", - "16:59:01 post-kill (3.52, 0, 'idle', False)", - "16:59:01 post-kill (3.69, 0, 'idle', False)", - "16:59:01 post-kill (3.86, 0, 'idle', False)", - "16:59:01 post-kill (4.03, 0, 'idle', False)", - "16:59:01 post-kill (4.2, 0, 'idle', False)", - "16:59:01 post-kill (4.37, 0, 'idle', False)", - "16:59:01 post-kill (4.54, 0, 'idle', False)", - "16:59:01 post-kill (4.71, 0, 'idle', False)", - "16:59:01 post-kill (4.88, 0, 'idle', False)", - "16:59:01 post-kill (5.05, 0, 'idle', False)", - "16:59:01 post-kill (5.24, 0, 'idle', False)", - "16:59:01 post-kill (5.41, 0, 'idle', False)", - "16:59:01 post-kill (5.58, 0, 'idle', False)", - "16:59:01 post-kill (5.75, 0, 'idle', False)", - "16:59:01 post-kill (5.92, 0, 'idle', False)", - "16:59:01 post-kill (6.09, 0, 'idle', False)", - "16:59:01 post-kill (6.26, 0, 'idle', False)", - "16:59:01 post-kill (6.43, 0, 'idle', False)", - "16:59:01 post-kill (6.6, 0, 'idle', False)", - "16:59:01 post-kill (6.77, 0, 'idle', False)", - "16:59:01 post-kill (6.94, 0, 'idle', False)", - "16:59:01 post-kill (7.11, 0, 'idle', False)", - "16:59:01 emission first 0 at +1.94 s; last 2 s all zero: True; kernel not running: True", - "16:59:01 latch locked after the kill: True", - "16:59:01 /mode after the kill: {'mode': 'grbl', 'controller': 'running', 'pid': 11355, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", - "16:59:01 button dark after 0.0 s", - "16:59:01 PASS: expected stop 0 at +1.99 s and SIGKILL 0 at +1.94 s, latch locked, controller respawned, button dark", - "16:59:11 baseline: post: 2 leftover(s): cool=smoke/armed=False/hold=False (expected idle/unarmed/no hold) -> waited; cnc/streaming=1 (expected 0) -> restored", - "16:59:11 result PASS" + "21:45:37 start laser.armed-kill (live, api) in campaign c-20260909204732-3fa9", + "21:45:37 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:45:37 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "21:45:37 queued by the attended queue opened 2026-09-09T21:25:38Z", + "21:45:38 baseline: pre: clean", + "21:45:38 mode: test needs grbl - already in grbl mode", + "21:45:38 connect: Idle", + "21:45:38 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 40 mm +X and +Y clear, and close the lid. Then press the button on the machine to start.", + "21:45:38 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", + "21:45:41 READY: operator present (press after 2.4 s); the bench takes the presses", + "21:45:41 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", + "21:45:41 ARM press by the fixture, button lit after 0.3 s", + "21:45:47 emission live (99) - stopping the controller NOW", + "21:45:47 POST /controller/stop -> 200 {'stopped': True} (0.51 s)", + "21:45:55 post-stop (0.59, 99, 'idle', False)", + "21:45:55 post-stop (0.78, 37, 'idle', False)", + "21:45:55 post-stop (0.99, 37, 'idle', False)", + "21:45:55 post-stop (1.18, 37, 'idle', False)", + "21:45:55 post-stop (1.39, 37, 'idle', False)", + "21:45:55 post-stop (1.58, 37, 'idle', False)", + "21:45:55 post-stop (1.79, 0, 'idle', False)", + "21:45:55 post-stop (1.99, 0, 'idle', False)", + "21:45:55 post-stop (2.22, 0, 'idle', False)", + "21:45:55 post-stop (2.43, 0, 'idle', False)", + "21:45:55 post-stop (2.63, 0, 'idle', False)", + "21:45:55 post-stop (2.83, 0, 'idle', False)", + "21:45:55 post-stop (3.02, 0, 'idle', False)", + "21:45:55 post-stop (3.23, 0, 'idle', False)", + "21:45:55 post-stop (3.43, 0, 'idle', False)", + "21:45:55 post-stop (3.63, 0, 'idle', False)", + "21:45:55 post-stop (3.83, 0, 'idle', False)", + "21:45:55 post-stop (4.03, 0, 'idle', False)", + "21:45:55 post-stop (4.23, 0, 'idle', False)", + "21:45:55 post-stop (4.43, 0, 'idle', False)", + "21:45:55 post-stop (4.63, 0, 'idle', False)", + "21:45:55 post-stop (4.83, 0, 'idle', False)", + "21:45:55 post-stop (5.03, 0, 'idle', False)", + "21:45:55 post-stop (5.23, 0, 'idle', False)", + "21:45:55 post-stop (5.42, 0, 'idle', False)", + "21:45:55 post-stop (5.63, 0, 'idle', False)", + "21:45:55 post-stop (5.83, 0, 'idle', False)", + "21:45:55 post-stop (6.02, 0, 'idle', False)", + "21:45:55 post-stop (6.22, 0, 'idle', False)", + "21:45:55 post-stop (6.42, 0, 'idle', False)", + "21:45:55 post-stop (6.64, 0, 'idle', False)", + "21:45:55 post-stop (6.84, 0, 'idle', False)", + "21:45:55 post-stop (7.04, 0, 'idle', False)", + "21:45:55 post-stop (7.24, 0, 'idle', False)", + "21:45:55 post-stop (7.43, 0, 'idle', False)", + "21:45:55 post-stop (7.64, 0, 'idle', False)", + "21:45:55 post-stop (7.83, 0, 'idle', False)", + "21:45:55 post-stop (8.04, 0, 'idle', False)", + "21:45:55 post-stop (8.24, 0, 'idle', False)", + "21:45:55 post-stop (8.44, 0, 'idle', False)", + "21:45:55 post-stop (8.64, 0, 'idle', False)", + "21:45:55 emission first 0 at +1.79 s; last 2 s all zero: True; kernel not running: True", + "21:45:55 the controller is stopped (supervision held); restarting it (no motion, no laser)", + "21:45:55 POST /controller/start -> 200 {'started': True}", + "21:46:01 /mode after start: {'mode': 'grbl', 'controller': 'running', 'pid': 16499, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", + "21:46:01 expected stop PASS: returned in 0.51 s, emission 0 at +1.79 s, controller restarted", + "21:46:02 connect: Idle", + "21:46:02 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 40 mm +X and +Y clear, and close the lid.", + "21:46:02 READY: presence already proved this test; the bench has the presses", + "21:46:02 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", + "21:46:02 ARM press by the fixture, button lit after 0.3 s", + "21:46:07 emission live (86) - SIGKILL controller pid 16499 NOW", + "21:46:08 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:46:14 post-kill (0.05, 86, 'running', True)", + "21:46:14 post-kill (0.25, 86, 'running', True)", + "21:46:14 post-kill (0.45, 86, 'underrun', True)", + "21:46:14 post-kill (0.65, 86, 'underrun', True)", + "21:46:14 post-kill (0.85, 86, 'underrun', True)", + "21:46:14 post-kill (1.08, 47, 'underrun', True)", + "21:46:14 post-kill (1.27, 47, 'underrun', False)", + "21:46:14 post-kill (1.43, 47, 'idle', False)", + "21:46:14 post-kill (1.6, 47, 'idle', False)", + "21:46:14 post-kill (1.77, 47, 'idle', False)", + "21:46:14 post-kill (1.94, 0, 'idle', False)", + "21:46:14 post-kill (2.11, 0, 'idle', False)", + "21:46:14 post-kill (2.28, 0, 'idle', False)", + "21:46:14 post-kill (2.46, 0, 'idle', False)", + "21:46:14 post-kill (2.62, 0, 'idle', False)", + "21:46:14 post-kill (2.79, 0, 'idle', False)", + "21:46:14 post-kill (2.96, 0, 'idle', False)", + "21:46:14 post-kill (3.13, 0, 'idle', False)", + "21:46:14 post-kill (3.34, 0, 'idle', False)", + "21:46:14 post-kill (3.51, 0, 'idle', False)", + "21:46:14 post-kill (3.68, 0, 'idle', False)", + "21:46:14 post-kill (3.85, 0, 'idle', False)", + "21:46:14 post-kill (4.02, 0, 'idle', False)", + "21:46:14 post-kill (4.19, 0, 'idle', False)", + "21:46:14 post-kill (4.36, 0, 'idle', False)", + "21:46:14 post-kill (4.53, 0, 'idle', False)", + "21:46:14 post-kill (4.7, 0, 'idle', False)", + "21:46:14 post-kill (4.87, 0, 'idle', False)", + "21:46:14 post-kill (5.04, 0, 'idle', False)", + "21:46:14 post-kill (5.21, 0, 'idle', False)", + "21:46:14 post-kill (5.38, 0, 'idle', False)", + "21:46:14 post-kill (5.57, 0, 'idle', False)", + "21:46:14 post-kill (5.74, 0, 'idle', False)", + "21:46:14 post-kill (5.91, 0, 'idle', False)", + "21:46:14 post-kill (6.08, 0, 'idle', False)", + "21:46:14 post-kill (6.25, 0, 'idle', False)", + "21:46:14 post-kill (6.42, 0, 'idle', False)", + "21:46:14 post-kill (6.61, 0, 'idle', False)", + "21:46:14 post-kill (6.77, 0, 'idle', False)", + "21:46:14 post-kill (6.94, 0, 'idle', False)", + "21:46:14 post-kill (7.11, 0, 'idle', False)", + "21:46:14 emission first 0 at +1.94 s; last 2 s all zero: True; kernel not running: True", + "21:46:14 latch locked after the kill: True", + "21:46:14 /mode after the kill: {'mode': 'grbl', 'controller': 'running', 'pid': 16576, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", + "21:46:14 button dark after 0.0 s", + "21:46:14 PASS: expected stop 0 at +1.79 s and SIGKILL 0 at +1.94 s, latch locked, controller respawned, button dark", + "21:46:25 baseline: post: 2 leftover(s): cool=smoke/armed=False/hold=False (expected idle/unarmed/no hold) -> waited; cnc/streaming=1 (expected 0) -> restored", + "21:46:25 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "laser.armed-kill", - "ts": "2026-09-09T16:59:11Z" + "ts": "2026-09-09T21:46:25Z" }, "requires": [ "laser.emission-witness", @@ -16893,15 +16823,15 @@ "src/glowforge_switch_map.h" ] ], - "fingerprint": "4017ffcdde3f96af42e1bdf607c14e475ab4143c7e1bf77ed2b9e7caa05edc27", + "fingerprint": "94e8d66ca30c8300893e636ed59757495156c45723461eb9e7c3676c40b810ac", "hardware": "api", "id": "laser.arm-wait-lid", - "inherited": false, + "inherited": true, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 2, + "campaign": "c-20260909200054-7947", + "duration_s": 18, "evidence": { "actions": [ { @@ -16909,25 +16839,32 @@ "channel": "lid", "state": "open", "took_s": 0.04, - "ts": "2026-09-09T16:24:40Z" + "ts": "2026-09-09T20:23:13Z" }, { "by": "fixture", "channel": "lid", "state": "close", - "took_s": 0.34, - "ts": "2026-09-09T16:24:40Z" + "took_s": 0.33, + "ts": "2026-09-09T20:23:13Z" } ], "armed_after": false, "armed_during_wait": true, "baseline": { - "post": [], + "post": [ + { + "action": "waited", + "expected": "idle/unarmed/no hold", + "found": "smoke/armed=False/hold=False", + "item": "cool" + } + ], "pre": [] }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "button_dark": false, "emission": 0, @@ -16955,33 +16892,33 @@ }, "state_after": "Idle" }, - "fingerprint": "4017ffcdde3f96af42e1bdf607c14e475ab4143c7e1bf77ed2b9e7caa05edc27", - "image": "20260909150456 (dev)", + "fingerprint": "94e8d66ca30c8300893e636ed59757495156c45723461eb9e7c3676c40b810ac", + "image": "20260909193551 (dev)", "log": [ - "16:24:39 start laser.arm-wait-lid (operator, api) in campaign c-20260909160235-7649", - "16:24:39 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:24:39 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:24:39 fixture: running unattended (no prompt can be answered)", - "16:24:39 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:24:39 baseline: pre: clean", - "16:24:39 mode: test needs grbl - already in grbl mode", - "16:24:39 connect: Idle", - "16:24:40 arm prompt seen; armed=True; asking the operator to open the lid", - "16:24:40 ACT lid open (fixture)", - "16:24:40 ACT lid open: done after 0.0 s", - "16:24:40 controller: ['[MSG:Info: press the button to start the laser job]', '[MSG:Warning: lid opened during arm - job canceled]']", - "16:24:40 button dark after 0.0 s", - "16:24:40 ACT lid close (fixture)", - "16:24:40 ACT lid close: done after 0.3 s", - "16:24:41 PASS: lid open during the arm wait canceled the job (clean reset, no alarm), armed=false, latch locked", - "16:24:41 baseline: post: clean", - "16:24:41 result PASS" + "20:23:12 start laser.arm-wait-lid (operator, api) in campaign c-20260909200054-7947", + "20:23:12 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:23:12 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:23:12 fixture: running unattended (no prompt can be answered)", + "20:23:12 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:23:12 baseline: pre: clean", + "20:23:12 mode: test needs grbl - already in grbl mode", + "20:23:12 connect: Idle", + "20:23:13 arm prompt seen; armed=True; asking the operator to open the lid", + "20:23:13 ACT lid open (fixture)", + "20:23:13 ACT lid open: done after 0.0 s", + "20:23:13 controller: ['[MSG:Info: press the button to start the laser job]', '[MSG:Warning: lid opened during arm - job canceled]']", + "20:23:13 button dark after 0.0 s", + "20:23:13 ACT lid close (fixture)", + "20:23:13 ACT lid close: done after 0.3 s", + "20:23:14 PASS: lid open during the arm wait canceled the job (clean reset, no alarm), armed=false, latch locked", + "20:23:30 baseline: post: 1 leftover(s): cool=smoke/armed=False/hold=False (expected idle/unarmed/no hold) -> waited", + "20:23:30 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "laser.arm-wait-lid", - "ts": "2026-09-09T16:24:41Z" + "ts": "2026-09-09T20:23:30Z" }, "requires": [ "kernel.latch-locked-idle", @@ -17028,14 +16965,14 @@ "src/glowforge_switch_map.h" ] ], - "fingerprint": "bcf3c509cc086c24cce64ffec0a4a312b63c0a817dd2fcfd95fba7ebdbf52abc", + "fingerprint": "527449e2b677e8bb1685b39cce8bb5688bf253028ae7344d46f20d16c210c407", "hardware": "api", "id": "laser.pause-resume-lid-cancel", "inherited": false, "kind": "live", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909204732-3fa9", "duration_s": 31, "evidence": { "actions": [ @@ -17043,43 +16980,43 @@ "by": "operator", "channel": "button", "state": "presence", - "took_s": 3.81, - "ts": "2026-09-09T16:59:16Z" + "took_s": 3.27, + "ts": "2026-09-09T21:46:30Z" }, { "by": "fixture", "channel": "button", "state": "arm", - "took_s": 0.26, - "ts": "2026-09-09T16:59:16Z" + "took_s": 0.25, + "ts": "2026-09-09T21:46:30Z" }, { "by": "fixture", "channel": "button", "state": "press", "took_s": 0.11, - "ts": "2026-09-09T16:59:21Z" + "ts": "2026-09-09T21:46:36Z" }, { "by": "fixture", "channel": "button", "state": "press", "took_s": 0.13, - "ts": "2026-09-09T16:59:25Z" + "ts": "2026-09-09T21:46:40Z" }, { "by": "fixture", "channel": "lid", "state": "open", - "took_s": 0.04, - "ts": "2026-09-09T16:59:26Z" + "took_s": 0.05, + "ts": "2026-09-09T21:46:41Z" }, { "by": "fixture", "channel": "lid", "state": "close", "took_s": 0.33, - "ts": "2026-09-09T16:59:34Z" + "ts": "2026-09-09T21:46:49Z" } ], "armed_after": false, @@ -17111,20 +17048,20 @@ }, "batch": { "group": "attended", - "ts": "2026-09-09T16:34:09Z" + "ts": "2026-09-09T21:25:38Z" }, "beam": { - "delta": 592, + "delta": 615, "digital_seen": true, "idle": 1870, - "peak": 2462, + "peak": 2485, "samples": 4 }, "button_dark": false, "button_latch": 1, "drift_mm": 0.019, - "emission_back_after_s": 0.49, - "emission_running": 117, + "emission_back_after_s": 0.48, + "emission_running": 85, "emission_zero_when_paused": true, "fixture": { "channels": [ @@ -17145,7 +17082,7 @@ "latch_locked": true, "latch_locked_while_paused": false, "lid_tail_zero": true, - "lid_zero_at_s": 1.87, + "lid_zero_at_s": 1.81, "messages": [ "[MSG:Check Door]", "[MSG:Info: laser disarmed - latch locked]", @@ -17162,87 +17099,87 @@ }, "operator": { "ack_live": true, - "ts": "2026-09-09T16:59:11Z" + "ts": "2026-09-09T21:46:25Z" }, "pause_message": true, "paused_trail": [ [ - 0.07, - 117, + 0.05, + 85, true ], [ - 0.32, - 117, + 0.3, + 85, true ], [ - 0.57, - 117, + 0.55, + 85, true ], [ - 0.82, - 75, + 0.8, + 79, true ], [ - 1.07, - 75, + 1.05, + 79, true ], [ - 1.32, - 75, + 1.3, + 79, true ], [ - 1.57, - 75, + 1.6, + 79, true ], [ - 1.82, + 1.84, 0, true ], [ - 2.07, + 2.09, 0, true ], [ - 2.32, + 2.34, 0, true ], [ - 2.57, + 2.59, 0, true ], [ - 2.82, + 2.84, 0, true ], [ - 3.07, + 3.09, 0, true ], [ - 3.35, + 3.34, 0, true ], [ - 3.6, + 3.59, 0, true ], [ - 3.85, + 3.84, 0, true ] @@ -17254,12 +17191,12 @@ 0 ], [ - 0.28, + 0.27, 0 ], [ - 0.49, - 35 + 0.48, + 32 ] ], "resumed_state": "Run", @@ -17270,100 +17207,101 @@ 3.422 ] }, - "fingerprint": "bcf3c509cc086c24cce64ffec0a4a312b63c0a817dd2fcfd95fba7ebdbf52abc", - "image": "20260909150456 (dev)", + "fingerprint": "527449e2b677e8bb1685b39cce8bb5688bf253028ae7344d46f20d16c210c407", + "image": "20260909193551 (dev)", "log": [ - "16:59:11 start laser.pause-resume-lid-cancel (live, api) in campaign c-20260909160235-7649", - "16:59:11 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:59:11 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:59:11 queued by the attended queue opened 2026-09-09T16:34:09Z", - "16:59:11 baseline: pre: clean", - "16:59:11 mode: test needs grbl - already in grbl mode", - "16:59:12 unlock: ['[MSG:Caution: Unlocked]', 'ok']", - "16:59:12 connect: Idle", - "16:59:12 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 40 mm +X and +Y clear, and close the lid. Then press the button on the machine to start.", - "16:59:12 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", - "16:59:16 READY: operator present (press after 3.8 s); the bench takes the presses", - "16:59:16 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", - "16:59:17 ARM press by the fixture, button lit after 0.3 s", - "16:59:21 emission live (117) - asking the operator to pause", - "16:59:21 ACT button press (fixture)", - "16:59:21 ACT button press: done after 0.1 s", - "16:59:25 paused (0.07, 117, True)", - "16:59:25 paused (0.32, 117, True)", - "16:59:25 paused (0.57, 117, True)", - "16:59:25 paused (0.82, 75, True)", - "16:59:25 paused (1.07, 75, True)", - "16:59:25 paused (1.32, 75, True)", - "16:59:25 paused (1.57, 75, True)", - "16:59:25 paused (1.82, 0, True)", - "16:59:25 paused (2.07, 0, True)", - "16:59:25 paused (2.32, 0, True)", - "16:59:25 paused (2.57, 0, True)", - "16:59:25 paused (2.82, 0, True)", - "16:59:25 paused (3.07, 0, True)", - "16:59:25 paused (3.35, 0, True)", - "16:59:25 paused (3.6, 0, True)", - "16:59:25 paused (3.85, 0, True)", - "16:59:25 paused: Hold:0, emission 0 = True, armed = True, latch locked = False", - "16:59:25 ACT button press (fixture)", - "16:59:25 ACT button press: done after 0.1 s", - "16:59:26 emission after the resume: [(0.06, 0), (0.28, 0), (0.49, 35)]", - "16:59:26 ACT lid open (fixture)", - "16:59:26 ACT lid open: done after 0.0 s", - "16:59:34 post-lid (0.05, 35, 'running', True)", - "16:59:34 post-lid (0.28, 35, 'running', False)", - "16:59:34 post-lid (0.51, 35, 'running', False)", - "16:59:34 post-lid (0.76, 30, 'running', False)", - "16:59:34 post-lid (0.98, 30, 'idle', False)", - "16:59:34 post-lid (1.2, 30, 'idle', False)", - "16:59:34 post-lid (1.42, 30, 'idle', False)", - "16:59:34 post-lid (1.64, 30, 'idle', False)", - "16:59:34 post-lid (1.87, 0, 'idle', False)", - "16:59:34 post-lid (2.09, 0, 'idle', False)", - "16:59:34 post-lid (2.31, 0, 'idle', False)", - "16:59:34 post-lid (2.53, 0, 'idle', False)", - "16:59:34 post-lid (2.75, 0, 'idle', False)", - "16:59:34 post-lid (2.97, 0, 'idle', False)", - "16:59:34 post-lid (3.19, 0, 'idle', False)", - "16:59:34 post-lid (3.41, 0, 'idle', False)", - "16:59:34 post-lid (3.63, 0, 'idle', False)", - "16:59:34 post-lid (3.85, 0, 'idle', False)", - "16:59:34 post-lid (4.09, 0, 'idle', False)", - "16:59:34 post-lid (4.31, 0, 'idle', False)", - "16:59:34 post-lid (4.53, 0, 'idle', False)", - "16:59:34 post-lid (4.75, 0, 'idle', False)", - "16:59:34 post-lid (4.97, 0, 'idle', False)", - "16:59:34 post-lid (5.19, 0, 'idle', False)", - "16:59:34 post-lid (5.43, 0, 'idle', False)", - "16:59:34 post-lid (5.66, 0, 'idle', False)", - "16:59:34 post-lid (5.88, 0, 'idle', False)", - "16:59:34 post-lid (6.1, 0, 'idle', False)", - "16:59:34 post-lid (6.32, 0, 'idle', False)", - "16:59:34 post-lid (6.54, 0, 'idle', False)", - "16:59:34 post-lid (6.76, 0, 'idle', False)", - "16:59:34 post-lid (6.98, 0, 'idle', False)", - "16:59:34 post-lid (7.2, 0, 'idle', False)", - "16:59:34 post-lid (7.42, 0, 'idle', False)", - "16:59:34 post-lid (7.64, 0, 'idle', False)", - "16:59:34 post-lid (7.86, 0, 'idle', False)", - "16:59:34 controller: ['[MSG:Check Door]', '[MSG:Info: laser disarmed - latch locked]', '[MSG:Warning: lid opened - job canceled, returning to the job start]', \"GrblHAL 1.1f ['$' or '$HELP' for help]\", '[MSG:Info: returned to the job start]']", - "16:59:34 returned: drift 0.019 mm; armed=False latch_locked=True button_latch=1", - "16:59:34 kernel counters: start (0.00, 0.00) -> now (0.02, 0.00), drift 0.020 mm", - "16:59:34 beam detector: idle 1870, peak 2462, digital asserted True", - "16:59:34 button dark after 0.0 s", - "16:59:34 ACT lid close (fixture)", - "16:59:34 ACT lid close: done after 0.3 s", - "16:59:35 PASS: button paused the burn (emission 0, armed kept, latch unlocked) and resumed it; the lid then canceled it - emission 0 at +1.87 s, reset without alarm, returned (drift 0.019 mm), button latch SET", - "16:59:42 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:59:42 baseline: post: 2 leftover(s): cool=smoke/armed=False/hold=False (expected idle/unarmed/no hold) -> waited; position=[1, 0, 0] (expected [0, 0, 0]) -> restored", - "16:59:42 result PASS" + "21:46:25 start laser.pause-resume-lid-cancel (live, api) in campaign c-20260909204732-3fa9", + "21:46:25 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:46:25 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "21:46:25 queued by the attended queue opened 2026-09-09T21:25:38Z", + "21:46:25 baseline: pre: clean", + "21:46:25 mode: test needs grbl - already in grbl mode", + "21:46:26 unlock: ['[MSG:Caution: Unlocked]', 'ok']", + "21:46:26 connect: Idle", + "21:46:26 NOTICE: LIVE FIRE. Eye protection on. Exhaust on. Extinguisher in reach. Put scrap under the head with 40 mm +X and +Y clear, and close the lid. Then press the button on the machine to start.", + "21:46:26 READY: waiting for the operator's press on the machine (the bench then does every press in this test)", + "21:46:30 READY: operator present (press after 3.3 s); the bench takes the presses", + "21:46:30 ARM: the fixture presses when the button lights (the bench's arm_press opt-in)", + "21:46:30 ARM press by the fixture, button lit after 0.3 s", + "21:46:36 emission live (85) - asking the operator to pause", + "21:46:36 ACT button press (fixture)", + "21:46:36 ACT button press: done after 0.1 s", + "21:46:40 paused (0.05, 85, True)", + "21:46:40 paused (0.3, 85, True)", + "21:46:40 paused (0.55, 85, True)", + "21:46:40 paused (0.8, 79, True)", + "21:46:40 paused (1.05, 79, True)", + "21:46:40 paused (1.3, 79, True)", + "21:46:40 paused (1.6, 79, True)", + "21:46:40 paused (1.84, 0, True)", + "21:46:40 paused (2.09, 0, True)", + "21:46:40 paused (2.34, 0, True)", + "21:46:40 paused (2.59, 0, True)", + "21:46:40 paused (2.84, 0, True)", + "21:46:40 paused (3.09, 0, True)", + "21:46:40 paused (3.34, 0, True)", + "21:46:40 paused (3.59, 0, True)", + "21:46:40 paused (3.84, 0, True)", + "21:46:40 paused: Hold:0, emission 0 = True, armed = True, latch locked = False", + "21:46:40 ACT button press (fixture)", + "21:46:40 ACT button press: done after 0.1 s", + "21:46:41 emission after the resume: [(0.06, 0), (0.27, 0), (0.48, 32)]", + "21:46:41 ACT lid open (fixture)", + "21:46:41 ACT lid open: done after 0.0 s", + "21:46:49 post-lid (0.06, 32, 'running', False)", + "21:46:49 post-lid (0.27, 32, 'running', False)", + "21:46:49 post-lid (0.49, 32, 'running', False)", + "21:46:49 post-lid (0.71, 34, 'running', False)", + "21:46:49 post-lid (0.93, 34, 'idle', False)", + "21:46:49 post-lid (1.15, 34, 'idle', False)", + "21:46:49 post-lid (1.37, 34, 'idle', False)", + "21:46:49 post-lid (1.59, 34, 'idle', False)", + "21:46:49 post-lid (1.81, 0, 'idle', False)", + "21:46:49 post-lid (2.03, 0, 'idle', False)", + "21:46:49 post-lid (2.25, 0, 'idle', False)", + "21:46:49 post-lid (2.47, 0, 'idle', False)", + "21:46:49 post-lid (2.69, 0, 'idle', False)", + "21:46:49 post-lid (2.91, 0, 'idle', False)", + "21:46:49 post-lid (3.13, 0, 'idle', False)", + "21:46:49 post-lid (3.35, 0, 'idle', False)", + "21:46:49 post-lid (3.57, 0, 'idle', False)", + "21:46:49 post-lid (3.79, 0, 'idle', False)", + "21:46:49 post-lid (4.01, 0, 'idle', False)", + "21:46:49 post-lid (4.23, 0, 'idle', False)", + "21:46:49 post-lid (4.45, 0, 'idle', False)", + "21:46:49 post-lid (4.67, 0, 'idle', False)", + "21:46:49 post-lid (4.89, 0, 'idle', False)", + "21:46:49 post-lid (5.11, 0, 'idle', False)", + "21:46:49 post-lid (5.33, 0, 'idle', False)", + "21:46:49 post-lid (5.55, 0, 'idle', False)", + "21:46:49 post-lid (5.77, 0, 'idle', False)", + "21:46:49 post-lid (5.99, 0, 'idle', False)", + "21:46:49 post-lid (6.21, 0, 'idle', False)", + "21:46:49 post-lid (6.43, 0, 'idle', False)", + "21:46:49 post-lid (6.65, 0, 'idle', False)", + "21:46:49 post-lid (6.87, 0, 'idle', False)", + "21:46:49 post-lid (7.09, 0, 'idle', False)", + "21:46:49 post-lid (7.32, 0, 'idle', False)", + "21:46:49 post-lid (7.53, 0, 'idle', False)", + "21:46:49 post-lid (7.75, 0, 'idle', False)", + "21:46:49 post-lid (7.97, 0, 'idle', False)", + "21:46:49 controller: ['[MSG:Check Door]', '[MSG:Info: laser disarmed - latch locked]', '[MSG:Warning: lid opened - job canceled, returning to the job start]', \"GrblHAL 1.1f ['$' or '$HELP' for help]\", '[MSG:Info: returned to the job start]']", + "21:46:49 returned: drift 0.019 mm; armed=False latch_locked=True button_latch=1", + "21:46:49 kernel counters: start (0.00, 0.00) -> now (0.02, 0.00), drift 0.020 mm", + "21:46:49 beam detector: idle 1870, peak 2485, digital asserted True", + "21:46:49 button dark after 0.0 s", + "21:46:49 ACT lid close (fixture)", + "21:46:49 ACT lid close: done after 0.3 s", + "21:46:50 PASS: button paused the burn (emission 0, armed kept, latch unlocked) and resumed it; the lid then canceled it - emission 0 at +1.81 s, reset without alarm, returned (drift 0.019 mm), button latch SET", + "21:46:56 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:46:57 baseline: post: 2 leftover(s): cool=smoke/armed=False/hold=False (expected idle/unarmed/no hold) -> waited; position=[1, 0, 0] (expected [0, 0, 0]) -> restored", + "21:46:57 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "laser.pause-resume-lid-cancel", - "ts": "2026-09-09T16:59:42Z" + "ts": "2026-09-09T21:46:57Z" }, "requires": [ "laser.emission-witness", @@ -17423,14 +17361,14 @@ "gfhardware/cam*" ] ], - "fingerprint": "906ec88e1b8c9a94a9821843311f5db7b2da1a9c3a0cc19fd84603da1787837f", + "fingerprint": "ebc532a0025c867f128fc4d9b8fa6c8e39693fb411b9a8cc711fa06968d588a1", "hardware": "api", "id": "camera.snapshot", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 15, "evidence": { "baseline": { @@ -17439,7 +17377,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "cam_status": { "buffers": "uncached", @@ -17516,34 +17454,34 @@ "released": [] }, "lid_lamp": "132", - "snapshot_bytes": 91239, - "snapshot_dark_bytes": 47182, - "snapshot_full_bytes": 168793, + "snapshot_bytes": 94271, + "snapshot_dark_bytes": 48929, + "snapshot_full_bytes": 200792, "stream_ctype": "multipart/x-mixed-replace; boundary=forgectrl-frame" }, - "fingerprint": "906ec88e1b8c9a94a9821843311f5db7b2da1a9c3a0cc19fd84603da1787837f", - "image": "20260909150456 (dev)", + "fingerprint": "ebc532a0025c867f128fc4d9b8fa6c8e39693fb411b9a8cc711fa06968d588a1", + "image": "20260909193551 (dev)", "log": [ - "16:10:07 start camera.snapshot (auto, api) in campaign c-20260909160235-7649", - "16:10:07 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:10:07 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:10:07 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:10:07 baseline: pre: clean", - "16:10:07 cam status: {'running': False, 'cam': 'lid', 'clients': 0, 'frames': 0, 'fps': 0.0, 'fps_cap': 0.0, 'hw_fps_skip': False, 'encoder': 'software', 'convert': 'cpu', 'buffers': 'uncached', 'sensor': 'OV5648', 'stream': {'width': 1296, 'height': 972}, 'snapshot': {'width': 2592, 'height': 1944}, 'h264': {'active': False, 'clients': 0}, 'health': {'captured': 0, 'corrupt': 0, 'restarts': 0}, 'capture_allowed': True, 'stopped_by_lid': False}", - "16:10:09 GET /cam/snapshot?cam=lid&res=half -> 200 (91239 bytes)", - "16:10:11 lamp 132 -> 91239 bytes; lamp off -> 47182 bytes", - "16:10:12 GET /cam/snapshot?cam=lid&res=full -> 200 (168793 bytes)", - "16:10:12 stream: multipart/x-mixed-replace; boundary=forgectrl-frame, first 65536 bytes", - "16:10:14 cam status after: {'running': True, 'cam': 'lid', 'clients': 0, 'frames': 2, 'fps': 0.3, 'fps_cap': 0.0, 'hw_fps_skip': False, 'encoder': 'vpu', 'convert': 'gpu', 'buffers': 'cached', 'sensor': 'OV5648', 'stream': {'width': 1296, 'height': 972}, 'snapshot': {'width': 2592, 'height': 1944}, 'h264': {'active': False, 'clients': 0}, 'health': {'captured': 65, 'corrupt': 0, 'restarts': 0}, 'capture_allowed': True, 'stopped_by_lid': False}", - "16:10:14 PASS: half-res snapshot 91239 bytes, 47182 with the lamp off; full-res 168793; stream multipart/x-mixed-replace; boundary=forgectrl-frame", - "16:10:23 baseline: post: clean", - "16:10:23 result PASS" + "20:08:28 start camera.snapshot (auto, api) in campaign c-20260909200054-7947", + "20:08:28 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:08:28 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:08:28 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:08:29 baseline: pre: clean", + "20:08:29 cam status: {'running': False, 'cam': 'lid', 'clients': 0, 'frames': 0, 'fps': 0.0, 'fps_cap': 0.0, 'hw_fps_skip': False, 'encoder': 'software', 'convert': 'cpu', 'buffers': 'uncached', 'sensor': 'OV5648', 'stream': {'width': 1296, 'height': 972}, 'snapshot': {'width': 2592, 'height': 1944}, 'h264': {'active': False, 'clients': 0}, 'health': {'captured': 0, 'corrupt': 0, 'restarts': 0}, 'capture_allowed': True, 'stopped_by_lid': False}", + "20:08:30 GET /cam/snapshot?cam=lid&res=half -> 200 (94271 bytes)", + "20:08:32 lamp 132 -> 94271 bytes; lamp off -> 48929 bytes", + "20:08:33 GET /cam/snapshot?cam=lid&res=full -> 200 (200792 bytes)", + "20:08:33 stream: multipart/x-mixed-replace; boundary=forgectrl-frame, first 65536 bytes", + "20:08:36 cam status after: {'running': True, 'cam': 'lid', 'clients': 0, 'frames': 2, 'fps': 0.3, 'fps_cap': 0.0, 'hw_fps_skip': False, 'encoder': 'vpu', 'convert': 'gpu', 'buffers': 'cached', 'sensor': 'OV5648', 'stream': {'width': 1296, 'height': 972}, 'snapshot': {'width': 2592, 'height': 1944}, 'h264': {'active': False, 'clients': 0}, 'health': {'captured': 65, 'corrupt': 0, 'restarts': 0}, 'capture_allowed': True, 'stopped_by_lid': False}", + "20:08:36 PASS: half-res snapshot 94271 bytes, 48929 with the lamp off; full-res 200792; stream multipart/x-mixed-replace; boundary=forgectrl-frame", + "20:08:44 baseline: post: clean", + "20:08:44 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "camera.snapshot", - "ts": "2026-09-09T16:10:23Z" + "ts": "2026-09-09T20:08:44Z" }, "requires": [ "forgectrl.panel-serves" @@ -17601,15 +17539,15 @@ "gfhardware/cam*" ] ], - "fingerprint": "a29bbec0b7b8e16a19fc1c75c5b4a6384c3dc4cca0cdd40d52ffb58aca1097e8", + "fingerprint": "605be7e7e128289e39dfff6e9f7ccb6e4760c5bb69feb31997ac3a117897de4d", "hardware": "api", "id": "camera.sensor-profile", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 13, + "campaign": "c-20260909200054-7947", + "duration_s": 12, "evidence": { "baseline": { "post": [], @@ -17617,7 +17555,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -17649,26 +17587,26 @@ ], "sensor": "OV5648" }, - "fingerprint": "a29bbec0b7b8e16a19fc1c75c5b4a6384c3dc4cca0cdd40d52ffb58aca1097e8", - "image": "20260909150456 (dev)", + "fingerprint": "605be7e7e128289e39dfff6e9f7ccb6e4760c5bb69feb31997ac3a117897de4d", + "image": "20260909193551 (dev)", "log": [ - "16:24:42 start camera.sensor-profile (auto, api) in campaign c-20260909160235-7649", - "16:24:42 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:24:42 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:24:42 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:24:42 baseline: pre: clean", - "16:24:42 sensor: OV5648", - "16:24:42 advertised: snapshot 2592x1944, stream 1296x972", - "16:24:44 full snapshot: (2592, 1944) (304633 bytes)", - "16:24:44 half snapshot: (1296, 972) (91927 bytes)", - "16:24:55 baseline: post: clean", - "16:24:55 result PASS" + "20:23:31 start camera.sensor-profile (auto, api) in campaign c-20260909200054-7947", + "20:23:31 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:23:31 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:23:31 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:23:31 baseline: pre: clean", + "20:23:31 sensor: OV5648", + "20:23:31 advertised: snapshot 2592x1944, stream 1296x972", + "20:23:33 full snapshot: (2592, 1944) (307221 bytes)", + "20:23:33 half snapshot: (1296, 972) (94880 bytes)", + "20:23:43 baseline: post: clean", + "20:23:43 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "camera.sensor-profile", - "ts": "2026-09-09T16:24:55Z" + "ts": "2026-09-09T20:23:43Z" }, "requires": [ "forgectrl.panel-serves" @@ -17726,15 +17664,15 @@ "gfhardware/cam*" ] ], - "fingerprint": "f8566cd19dbf8cdcf87a7b2150e7554498bb8c0602e50a3a7678bdcbe55abeac", + "fingerprint": "9e546fdc6f6f8c53159be8abc3bdf803910cc738f613c58469497118478d1a1b", "hardware": "api", "id": "camera.h264-stream", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 13, + "campaign": "c-20260909200054-7947", + "duration_s": 12, "evidence": { "baseline": { "post": [], @@ -17742,7 +17680,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "bytes": 65536, "cam_status": { @@ -17760,7 +17698,7 @@ "clients": 1 }, "health": { - "captured": 167, + "captured": 166, "corrupt": 0, "restarts": 0 }, @@ -17790,24 +17728,24 @@ "released": [] } }, - "fingerprint": "f8566cd19dbf8cdcf87a7b2150e7554498bb8c0602e50a3a7678bdcbe55abeac", - "image": "20260909150456 (dev)", + "fingerprint": "9e546fdc6f6f8c53159be8abc3bdf803910cc738f613c58469497118478d1a1b", + "image": "20260909193551 (dev)", "log": [ - "16:24:55 start camera.h264-stream (auto, api) in campaign c-20260909160235-7649", - "16:24:55 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:24:55 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:24:55 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:24:55 baseline: pre: clean", - "16:24:57 codec avc1.424020, content-type video/mp4", - "16:24:57 convert=gpu h264={'active': True, 'clients': 1}", - "16:25:08 baseline: post: clean", - "16:25:08 result PASS" + "20:23:44 start camera.h264-stream (auto, api) in campaign c-20260909200054-7947", + "20:23:44 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:23:44 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:23:44 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:23:44 baseline: pre: clean", + "20:23:46 codec avc1.424020, content-type video/mp4", + "20:23:46 convert=gpu h264={'active': True, 'clients': 1}", + "20:23:57 baseline: post: clean", + "20:23:57 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "camera.h264-stream", - "ts": "2026-09-09T16:25:08Z" + "ts": "2026-09-09T20:23:57Z" }, "requires": [ "forgectrl.panel-serves" @@ -17865,14 +17803,14 @@ "gfhardware/cam*" ] ], - "fingerprint": "98e8749b9a1f59891902d9856c2c7cf743025b151c4c1262018fb79c2e9f675f", + "fingerprint": "9dd8594da210dfbedcfd96cd2e00012b51d4e57223d426932d0e66f8126f26b2", "hardware": "api", "id": "camera.frame-health", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 12, "evidence": { "baseline": { @@ -17881,9 +17819,9 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, - "captured": 7, + "captured": 8, "corrupt": 0, "fixture": { "channels": [ @@ -17896,36 +17834,36 @@ "released": [] }, "health_after": { - "captured": 326, + "captured": 325, "corrupt": 0, "restarts": 0 }, "health_before": { - "captured": 319, + "captured": 317, "corrupt": 0, "restarts": 0 }, "restarts": 0 }, - "fingerprint": "98e8749b9a1f59891902d9856c2c7cf743025b151c4c1262018fb79c2e9f675f", - "image": "20260909150456 (dev)", + "fingerprint": "9dd8594da210dfbedcfd96cd2e00012b51d4e57223d426932d0e66f8126f26b2", + "image": "20260909193551 (dev)", "log": [ - "16:25:08 start camera.frame-health (auto, api) in campaign c-20260909160235-7649", - "16:25:08 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:25:08 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:25:08 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:25:08 baseline: pre: clean", - "16:25:08 before: {'captured': 319, 'corrupt': 0, 'restarts': 0}", - "16:25:10 after: {'captured': 326, 'corrupt': 0, 'restarts': 0}", - "16:25:10 captured 7 frames, 0 corrupt, 0 stream restarts", - "16:25:21 baseline: post: clean", - "16:25:21 result PASS" + "20:23:57 start camera.frame-health (auto, api) in campaign c-20260909200054-7947", + "20:23:57 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:23:57 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:23:57 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:23:57 baseline: pre: clean", + "20:23:57 before: {'captured': 317, 'corrupt': 0, 'restarts': 0}", + "20:23:59 after: {'captured': 325, 'corrupt': 0, 'restarts': 0}", + "20:23:59 captured 8 frames, 0 corrupt, 0 stream restarts", + "20:24:09 baseline: post: clean", + "20:24:09 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "camera.frame-health", - "ts": "2026-09-09T16:25:21Z" + "ts": "2026-09-09T20:24:09Z" }, "requires": [ "forgectrl.panel-serves" @@ -17995,14 +17933,14 @@ "forgefirm-app/ffmachine.py" ] ], - "fingerprint": "662bddc3d70d9e8ce2e958681f85d062acd6efdf25cdbccbd53a9fb7f0dca5f7", + "fingerprint": "80bbecb85773717145c3928f68a122b60e23759d238c7390ac36ebbbe2cd0f1e", "hardware": "api", "id": "camera.lid-privacy", - "inherited": false, + "inherited": true, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 15, "evidence": { "actions": [ @@ -18011,21 +17949,21 @@ "channel": "lid", "state": "close", "took_s": 0.04, - "ts": "2026-09-09T16:25:21Z" + "ts": "2026-09-09T20:24:10Z" }, { "by": "fixture", "channel": "lid", "state": "open", "took_s": 0.04, - "ts": "2026-09-09T16:25:23Z" + "ts": "2026-09-09T20:24:12Z" }, { "by": "fixture", "channel": "lid", "state": "close", - "took_s": 0.34, - "ts": "2026-09-09T16:25:23Z" + "took_s": 0.35, + "ts": "2026-09-09T20:24:12Z" } ], "baseline": { @@ -18034,9 +17972,9 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, - "closed_snapshot_bytes": 92524, + "closed_snapshot_bytes": 95356, "fixture": { "channels": [ "lid", @@ -18055,7 +17993,7 @@ "buffers": "cached", "cam": "lid", "capture_allowed": false, - "clients": 0, + "clients": 1, "convert": "gpu", "encoder": "vpu", "fps": 0.0, @@ -18066,7 +18004,7 @@ "clients": 0 }, "health": { - "captured": 485, + "captured": 484, "corrupt": 0, "restarts": 0 }, @@ -18083,37 +18021,37 @@ "width": 1296 } }, - "stream_bytes_after_lid_open": 369826 + "stream_bytes_after_lid_open": 370778 }, - "fingerprint": "662bddc3d70d9e8ce2e958681f85d062acd6efdf25cdbccbd53a9fb7f0dca5f7", - "image": "20260909150456 (dev)", + "fingerprint": "80bbecb85773717145c3928f68a122b60e23759d238c7390ac36ebbbe2cd0f1e", + "image": "20260909193551 (dev)", "log": [ - "16:25:21 start camera.lid-privacy (operator, api) in campaign c-20260909160235-7649", - "16:25:21 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:25:21 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:25:21 fixture: running unattended (no prompt can be answered)", - "16:25:21 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:25:21 baseline: pre: clean", - "16:25:21 ACT lid close (fixture)", - "16:25:21 ACT lid close: done after 0.0 s", - "16:25:23 lid closed: snapshot 92524 bytes", - "16:25:23 ACT lid open (fixture)", - "16:25:23 ACT lid open: done after 0.0 s", - "16:25:23 stream ended after 369826 further buffered bytes", - "16:25:23 lid open: snapshot -> 409 b'lid is open: the cameras only capture with the lid closed'", - "16:25:23 lid open: head snapshot -> 409", - "16:25:23 lid open: stream -> 409", - "16:25:23 ACT lid close (fixture)", - "16:25:24 ACT lid close: done after 0.3 s", - "16:25:26 lid closed again: snapshot 92424 bytes", - "16:25:36 baseline: post: clean", - "16:25:36 result PASS" + "20:24:10 start camera.lid-privacy (operator, api) in campaign c-20260909200054-7947", + "20:24:10 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:24:10 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:24:10 fixture: running unattended (no prompt can be answered)", + "20:24:10 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:24:10 baseline: pre: clean", + "20:24:10 ACT lid close (fixture)", + "20:24:10 ACT lid close: done after 0.0 s", + "20:24:12 lid closed: snapshot 95356 bytes", + "20:24:12 ACT lid open (fixture)", + "20:24:12 ACT lid open: done after 0.0 s", + "20:24:12 stream ended after 370778 further buffered bytes", + "20:24:12 lid open: snapshot -> 409 b'lid is open: the cameras only capture with the lid closed'", + "20:24:12 lid open: head snapshot -> 409", + "20:24:12 lid open: stream -> 409", + "20:24:12 ACT lid close (fixture)", + "20:24:13 ACT lid close: done after 0.3 s", + "20:24:14 lid closed again: snapshot 95284 bytes", + "20:24:25 baseline: post: clean", + "20:24:25 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "camera.lid-privacy", - "ts": "2026-09-09T16:25:36Z" + "ts": "2026-09-09T20:24:25Z" }, "requires": [ "forgectrl.panel-serves" @@ -18151,14 +18089,14 @@ "src/ui/help.js" ] ], - "fingerprint": "3f77f581c094adbc8b0434d73ed24ce752610c9f5c5ce896e6de65f37b011fb9", + "fingerprint": "e2a0218a7225463c9d782373f9d568497ed4f75cbcad211a63546caeef1ed0a6", "hardware": "api", "id": "camera.key-read", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 0, "evidence": { "baseline": { @@ -18167,7 +18105,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "fixture": { "channels": [ @@ -18182,27 +18120,27 @@ "key_len": 32, "rotated": true }, - "fingerprint": "3f77f581c094adbc8b0434d73ed24ce752610c9f5c5ce896e6de65f37b011fb9", - "image": "20260909150456 (dev)", + "fingerprint": "e2a0218a7225463c9d782373f9d568497ed4f75cbcad211a63546caeef1ed0a6", + "image": "20260909193551 (dev)", "log": [ - "16:25:36 start camera.key-read (auto, api) in campaign c-20260909160235-7649", - "16:25:36 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:25:36 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:25:36 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:25:36 baseline: pre: clean", - "16:25:36 GET http://172.16.1.97/cam/status (no key) -> 403", - "16:25:36 GET http://172.16.1.97/cam/status?key=... -> 200", - "16:25:36 GET https://172.16.1.97/cam/status (no key) -> 403", - "16:25:36 GET https://172.16.1.97/cam/status?key=... -> 200", - "16:25:37 POST /settings with the camera key -> 403", - "16:25:37 baseline: post: clean", - "16:25:37 result PASS" + "20:24:25 start camera.key-read (auto, api) in campaign c-20260909200054-7947", + "20:24:25 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:24:25 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:24:25 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:24:25 baseline: pre: clean", + "20:24:25 GET http://172.16.1.97/cam/status (no key) -> 403", + "20:24:25 GET http://172.16.1.97/cam/status?key=... -> 200", + "20:24:25 GET https://172.16.1.97/cam/status (no key) -> 403", + "20:24:25 GET https://172.16.1.97/cam/status?key=... -> 200", + "20:24:25 POST /settings with the camera key -> 403", + "20:24:26 baseline: post: clean", + "20:24:26 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "camera.key-read", - "ts": "2026-09-09T16:25:37Z" + "ts": "2026-09-09T20:24:26Z" }, "requires": [ "forgectrl.auth" @@ -18228,14 +18166,14 @@ "**" ] ], - "fingerprint": "fc89ee671dab25ea8dd56c875bdf173df1bd244ba31d636f742434fbdcc8590e", + "fingerprint": "f04e66d28ab15eba40b09f1650a707286920f0a16fe59ce813ca9dfe6f25a1f8", "hardware": "api", "id": "update.slots-and-signature", - "inherited": false, + "inherited": true, "kind": "auto", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 1, "evidence": { "apply": { @@ -18254,7 +18192,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "ffboot_l_rc": 0, "fixture": { @@ -18314,7 +18252,7 @@ "present": "yes", "state": "ok", "type": "forgefirm", - "version": "v0.1.0" + "version": "v0.0.1" }, "sd": { "booted": true, @@ -18324,7 +18262,7 @@ "present": "yes", "state": "ok", "type": "forgefirm", - "version": "20260909150456 (dev)" + "version": "20260909193551 (dev)" } }, "staged": { @@ -18341,29 +18279,29 @@ } } }, - "fingerprint": "fc89ee671dab25ea8dd56c875bdf173df1bd244ba31d636f742434fbdcc8590e", - "image": "20260909150456 (dev)", + "fingerprint": "f04e66d28ab15eba40b09f1650a707286920f0a16fe59ce813ca9dfe6f25a1f8", + "image": "20260909193551 (dev)", "log": [ - "16:06:03 start update.slots-and-signature (auto, api) in campaign c-20260909160235-7649", - "16:06:03 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:06:03 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:06:03 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:06:03 baseline: pre: clean", - "16:06:04 GET /slots -> 200 {'booted': '/dev/mmcblk1p1', 'env': {'mmcdev': '0', 'mmchwpart': '0', 'mmcpart': '1', 'mmcroot': '/dev/mmcblk1p1'}, 'slots': {'sd': {'device': '/dev/mmcblk1p1', 'present': 'yes', 'state': 'ok', 'type': 'forgefirm', 'version': '20260909150456 (dev)', 'kernel': 'yes', 'booted': True, 'next': True}, 'a': {'device': '/dev/mmcblk2p1', 'present': 'yes', 'state': 'ok', 'type': 'factory', 'version': 'v2.6.0-2228', 'kernel': 'yes', 'booted': False, 'next': False}, 'b': {'device': '/dev/mmcblk2p2', 'present': 'yes', 'state': 'ok', 'type': 'forgefirm', 'version': 'v0.1.0', 'kernel': 'yes', 'booted': False, 'next': False}}, 'archives': [{'file': 'factory-rootfs-20240612194245.img.gz', 'bytes': 37039693, 'version': '2.6.0-2228', 'date': '2024-06-12'}, {'file': 'factory-rootfs-20220810204015.img.gz', 'bytes': 26349275, 'version': '2.5.1-2192', 'date': '2022-08-10'}], 'staged': {'download': {'present': False, 'bytes': 0, 'version': ''}, 'upload': {'present': False, 'bytes': 0, 'version': ''}}}", - "16:06:04 ffboot -l -> rc 0\nenv.mmcdev=0\nenv.mmchwpart=0\nenv.mmcpart=1\nenv.mmcroot=/dev/mmcblk1p1\nbooted.root=/dev/mmcblk1p1\nslot.sd.device=/dev/mmcblk1p1\nslot.sd.present=yes\nslot.sd.state=ok\nslot.sd.type=forgefirm\nslot.sd.version=20260909150456 (dev)\nslot.sd.kernel=yes\nslot.sd.booted=yes\nslot.sd.next=yes\nslot.a.device=/dev/mmcblk2p1\nslot.a.present=yes\nslot.a.state=ok\nslot.a.type=factory\nslot.a.version=v2.6.0-2228\nslot.a.kernel=yes\nslot.b.device=/dev/mmcblk2p2\nslot.b.present=yes\nslot.b.state=ok\nslot.b.type=forgefirm\nslot.b.version=v0.1.0\nslot.b.kernel=yes\nslot.legacy.device=/dev/mmcblk2p4\nslot.legacy.present=no", - "16:06:04 GET /update/status -> 200 {'running': False, 'kind': '', 'phase': '', 'elapsed': 0, 'progress_bytes': -1, 'result': None}", - "16:06:04 fwup -V garbage -> rc 1: fwup: Unrecognized archive format", - "16:06:04 fwup -V signed: own key rc 0, shipped key rc 1", - "16:06:04 POST /update/apply slot=b file=upload (no confirm_unsigned) -> 202 {'started': True}", - "16:06:05 apply result: {'ok': False, 'error': 'archive is not signed with the ForgeFIRM release key (confirm_unsigned=1 to apply anyway)'}", - "16:06:05 baseline: post: clean", - "16:06:05 result PASS" + "20:04:21 start update.slots-and-signature (auto, api) in campaign c-20260909200054-7947", + "20:04:21 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:04:21 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:04:21 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:04:21 baseline: pre: clean", + "20:04:21 GET /slots -> 200 {'booted': '/dev/mmcblk1p1', 'env': {'mmcdev': '0', 'mmchwpart': '0', 'mmcpart': '1', 'mmcroot': '/dev/mmcblk1p1'}, 'slots': {'sd': {'device': '/dev/mmcblk1p1', 'present': 'yes', 'state': 'ok', 'type': 'forgefirm', 'version': '20260909193551 (dev)', 'kernel': 'yes', 'booted': True, 'next': True}, 'a': {'device': '/dev/mmcblk2p1', 'present': 'yes', 'state': 'ok', 'type': 'factory', 'version': 'v2.6.0-2228', 'kernel': 'yes', 'booted': False, 'next': False}, 'b': {'device': '/dev/mmcblk2p2', 'present': 'yes', 'state': 'ok', 'type': 'forgefirm', 'version': 'v0.0.1', 'kernel': 'yes', 'booted': False, 'next': False}}, 'archives': [{'file': 'factory-rootfs-20240612194245.img.gz', 'bytes': 37039693, 'version': '2.6.0-2228', 'date': '2024-06-12'}, {'file': 'factory-rootfs-20220810204015.img.gz', 'bytes': 26349275, 'version': '2.5.1-2192', 'date': '2022-08-10'}], 'staged': {'download': {'present': False, 'bytes': 0, 'version': ''}, 'upload': {'present': False, 'bytes': 0, 'version': ''}}}", + "20:04:21 ffboot -l -> rc 0\nenv.mmcdev=0\nenv.mmchwpart=0\nenv.mmcpart=1\nenv.mmcroot=/dev/mmcblk1p1\nbooted.root=/dev/mmcblk1p1\nslot.sd.device=/dev/mmcblk1p1\nslot.sd.present=yes\nslot.sd.state=ok\nslot.sd.type=forgefirm\nslot.sd.version=20260909193551 (dev)\nslot.sd.kernel=yes\nslot.sd.booted=yes\nslot.sd.next=yes\nslot.a.device=/dev/mmcblk2p1\nslot.a.present=yes\nslot.a.state=ok\nslot.a.type=factory\nslot.a.version=v2.6.0-2228\nslot.a.kernel=yes\nslot.b.device=/dev/mmcblk2p2\nslot.b.present=yes\nslot.b.state=ok\nslot.b.type=forgefirm\nslot.b.version=v0.0.1\nslot.b.kernel=yes\nslot.legacy.device=/dev/mmcblk2p4\nslot.legacy.present=no", + "20:04:21 GET /update/status -> 200 {'running': False, 'kind': '', 'phase': '', 'elapsed': 0, 'progress_bytes': -1, 'result': None}", + "20:04:22 fwup -V garbage -> rc 1: fwup: Unrecognized archive format", + "20:04:22 fwup -V signed: own key rc 0, shipped key rc 1", + "20:04:22 POST /update/apply slot=b file=upload (no confirm_unsigned) -> 202 {'started': True}", + "20:04:23 apply result: {'ok': False, 'error': 'archive is not signed with the ForgeFIRM release key (confirm_unsigned=1 to apply anyway)'}", + "20:04:23 baseline: post: clean", + "20:04:23 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "update.slots-and-signature", - "ts": "2026-09-09T16:06:05Z" + "ts": "2026-09-09T20:04:23Z" }, "requires": [ "forgectrl.auth" @@ -18481,15 +18419,15 @@ "src/**" ] ], - "fingerprint": "b89284100d321421c9e1601217c8b1ecc4898862eda829ac3e661160a7450299", + "fingerprint": "a977da727bd85edcb6ab09f59f600deb0d5f22a5b80c7f2c7328e22bc00712ef", "hardware": "api", "id": "cloud.mode-switch", - "inherited": false, + "inherited": true, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 100, + "campaign": "c-20260909200054-7947", + "duration_s": 102, "evidence": { "actions": [ { @@ -18497,14 +18435,14 @@ "channel": "lid", "state": "open", "took_s": 0.04, - "ts": "2026-09-09T16:25:37Z" + "ts": "2026-09-09T20:24:26Z" }, { "by": "fixture", "channel": "lid", "state": "close", "took_s": 0.33, - "ts": "2026-09-09T16:25:51Z" + "ts": "2026-09-09T20:24:43Z" } ], "baseline": { @@ -18513,7 +18451,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "cam_after": { "buffers": "cached", @@ -18530,7 +18468,7 @@ "clients": 0 }, "health": { - "captured": 1180, + "captured": 1149, "corrupt": 0, "restarts": 0 }, @@ -18562,7 +18500,7 @@ "clients": 0 }, "health": { - "captured": 640, + "captured": 639, "corrupt": 0, "restarts": 0 }, @@ -18594,7 +18532,7 @@ "clients": 0 }, "health": { - "captured": 640, + "captured": 639, "corrupt": 0, "restarts": 0 }, @@ -18622,25 +18560,25 @@ "released": [] }, "gf_probe": { - "checked_at": 1788971141, + "checked_at": 1788985469, "latest_gf_version": "2.6.0-2228", "tested_against_gf": "2.6.0-2228" }, - "gfhome_complete": "2026-09-09T16:27:11.048151+00:00 gfhome[5612] INFO gfhome:home homing complete (service quiet 10s, 4 motion windows)", + "gfhome_complete": "2026-09-09T20:26:01.189803+00:00 gfhome[6219] INFO gfhome:home homing complete (service quiet 10s, 4 motion windows)", "grbl_state": "Idle", "homed": true, "homing_mode": "gfcloud", - "homing_s": 44.3, - "hunt": "2026-09-09T16:25:50.750045+00:00 gfcloud[5369] INFO basemachine:_finish_action hunt [1583582688]: finished with event \":completed\"", + "homing_s": 46.2, + "hunt": "2026-09-09T20:24:41.846369+00:00 gfcloud[5962] INFO basemachine:_finish_action hunt [1583687284]: finished with event \":completed\"", "hunt_gates": [ { "accel_watch": "watch", "armed": false, - "down_c": 22.38, + "down_c": 23.71, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 2424, + "reading": 2141, "state": "idle" }, "exhaust": { @@ -18650,17 +18588,17 @@ }, "intake_1": { "floor": 2290, - "reading": 735, + "reading": 727, "state": "idle" }, "intake_2": { "floor": 2290, - "reading": 735, + "reading": 734, "state": "idle" }, "purge": { "floor": 300, - "reading": 631, + "reading": 632, "state": "idle" } }, @@ -18683,6 +18621,430 @@ "reason": "", "report_age_s": 0.1, "resume_ok": true, + "up_c": 23.63, + "verdict": "OK" + }, + { + "accel_watch": "watch", + "armed": false, + "down_c": 23.71, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 2141, + "state": "idle" + }, + "exhaust": { + "floor": 6400, + "reading": 0, + "state": "idle" + }, + "intake_1": { + "floor": 2290, + "reading": 727, + "state": "idle" + }, + "intake_2": { + "floor": 2290, + "reading": 734, + "state": "idle" + }, + "purge": { + "floor": 300, + "reading": 632, + "state": "idle" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "idle", + "quiet_hold": false, + "reason": "", + "report_age_s": 0.7, + "resume_ok": true, + "up_c": 23.63, + "verdict": "OK" + }, + { + "accel_watch": "watch", + "armed": false, + "down_c": 23.47, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 2132, + "state": "idle" + }, + "exhaust": { + "floor": 6400, + "reading": 0, + "state": "idle" + }, + "intake_1": { + "floor": 2290, + "reading": 727, + "state": "idle" + }, + "intake_2": { + "floor": 2290, + "reading": 734, + "state": "idle" + }, + "purge": { + "floor": 300, + "reading": 632, + "state": "idle" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "idle", + "quiet_hold": false, + "reason": "", + "report_age_s": 0.1, + "resume_ok": true, + "up_c": 23.71, + "verdict": "OK" + }, + { + "accel_watch": "watch", + "armed": false, + "down_c": 23.47, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 2132, + "state": "idle" + }, + "exhaust": { + "floor": 6400, + "reading": 0, + "state": "idle" + }, + "intake_1": { + "floor": 2290, + "reading": 727, + "state": "idle" + }, + "intake_2": { + "floor": 2290, + "reading": 734, + "state": "idle" + }, + "purge": { + "floor": 300, + "reading": 632, + "state": "idle" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "idle", + "quiet_hold": false, + "reason": "", + "report_age_s": 0.7, + "resume_ok": true, + "up_c": 23.71, + "verdict": "OK" + }, + { + "accel_watch": "watch", + "armed": false, + "down_c": 22.38, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 2455, + "state": "idle" + }, + "exhaust": { + "floor": 6400, + "reading": 0, + "state": "idle" + }, + "intake_1": { + "floor": 2290, + "reading": 724, + "state": "idle" + }, + "intake_2": { + "floor": 2290, + "reading": 729, + "state": "idle" + }, + "purge": { + "floor": 300, + "reading": 630, + "state": "idle" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "idle", + "quiet_hold": false, + "reason": "", + "report_age_s": 0.2, + "resume_ok": true, + "up_c": 22.77, + "verdict": "OK" + }, + { + "accel_watch": "watch", + "armed": false, + "down_c": 22.38, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 2455, + "state": "idle" + }, + "exhaust": { + "floor": 6400, + "reading": 0, + "state": "idle" + }, + "intake_1": { + "floor": 2290, + "reading": 724, + "state": "idle" + }, + "intake_2": { + "floor": 2290, + "reading": 729, + "state": "idle" + }, + "purge": { + "floor": 300, + "reading": 630, + "state": "idle" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "idle", + "quiet_hold": false, + "reason": "", + "report_age_s": 0.7, + "resume_ok": true, + "up_c": 22.77, + "verdict": "OK" + }, + { + "accel_watch": "watch", + "armed": false, + "down_c": 22.38, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 2573, + "state": "idle" + }, + "exhaust": { + "floor": 6400, + "reading": 0, + "state": "idle" + }, + "intake_1": { + "floor": 2290, + "reading": 724, + "state": "idle" + }, + "intake_2": { + "floor": 2290, + "reading": 729, + "state": "idle" + }, + "purge": { + "floor": 300, + "reading": 629, + "state": "idle" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "idle", + "quiet_hold": false, + "reason": "", + "report_age_s": 0.2, + "resume_ok": true, + "up_c": 22.62, + "verdict": "OK" + }, + { + "accel_watch": "watch", + "armed": false, + "down_c": 22.38, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 2573, + "state": "idle" + }, + "exhaust": { + "floor": 6400, + "reading": 0, + "state": "idle" + }, + "intake_1": { + "floor": 2290, + "reading": 724, + "state": "idle" + }, + "intake_2": { + "floor": 2290, + "reading": 729, + "state": "idle" + }, + "purge": { + "floor": 300, + "reading": 629, + "state": "idle" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "idle", + "quiet_hold": false, + "reason": "", + "report_age_s": 0.7, + "resume_ok": true, + "up_c": 22.62, + "verdict": "OK" + }, + { + "accel_watch": "watch", + "armed": false, + "down_c": 22.38, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 2615, + "state": "idle" + }, + "exhaust": { + "floor": 6400, + "reading": 0, + "state": "idle" + }, + "intake_1": { + "floor": 2290, + "reading": 724, + "state": "idle" + }, + "intake_2": { + "floor": 2290, + "reading": 729, + "state": "idle" + }, + "purge": { + "floor": 300, + "reading": 630, + "state": "idle" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "idle", + "quiet_hold": false, + "reason": "", + "report_age_s": 0.2, + "resume_ok": true, "up_c": 22.38, "verdict": "OK" }, @@ -18693,7 +19055,7 @@ "fan_gates": { "air_assist": { "floor": 6000, - "reading": 2601, + "reading": 2615, "state": "idle" }, "exhaust": { @@ -18703,17 +19065,17 @@ }, "intake_1": { "floor": 2290, - "reading": 735, + "reading": 724, "state": "idle" }, "intake_2": { "floor": 2290, - "reading": 728, + "reading": 729, "state": "idle" }, "purge": { "floor": 300, - "reading": 629, + "reading": 630, "state": "idle" } }, @@ -18734,19 +19096,19 @@ "phase": "idle", "quiet_hold": false, "reason": "", - "report_age_s": 0.6, + "report_age_s": 0.7, "resume_ok": true, - "up_c": 22.54, + "up_c": 22.38, "verdict": "OK" }, { "accel_watch": "watch", "armed": false, - "down_c": 22.38, + "down_c": 22.46, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 2601, + "reading": 2637, "state": "idle" }, "exhaust": { @@ -18756,17 +19118,17 @@ }, "intake_1": { "floor": 2290, - "reading": 735, + "reading": 724, "state": "idle" }, "intake_2": { "floor": 2290, - "reading": 728, + "reading": 734, "state": "idle" }, "purge": { "floor": 300, - "reading": 629, + "reading": 630, "state": "idle" } }, @@ -18787,19 +19149,19 @@ "phase": "idle", "quiet_hold": false, "reason": "", - "report_age_s": 0.1, + "report_age_s": 0.2, "resume_ok": true, - "up_c": 22.54, + "up_c": 22.69, "verdict": "OK" }, { "accel_watch": "watch", "armed": false, - "down_c": 22.38, + "down_c": 22.46, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 2660, + "reading": 2637, "state": "idle" }, "exhaust": { @@ -18809,17 +19171,17 @@ }, "intake_1": { "floor": 2290, - "reading": 731, + "reading": 724, "state": "idle" }, "intake_2": { "floor": 2290, - "reading": 728, + "reading": 734, "state": "idle" }, "purge": { "floor": 300, - "reading": 629, + "reading": 630, "state": "idle" } }, @@ -18840,7 +19202,60 @@ "phase": "idle", "quiet_hold": false, "reason": "", - "report_age_s": 0.6, + "report_age_s": 0.7, + "resume_ok": true, + "up_c": 22.69, + "verdict": "OK" + }, + { + "accel_watch": "watch", + "armed": false, + "down_c": 22.3, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 2653, + "state": "idle" + }, + "exhaust": { + "floor": 6400, + "reading": 0, + "state": "idle" + }, + "intake_1": { + "floor": 2290, + "reading": 724, + "state": "idle" + }, + "intake_2": { + "floor": 2290, + "reading": 734, + "state": "idle" + }, + "purge": { + "floor": 300, + "reading": 628, + "state": "idle" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "idle", + "quiet_hold": false, + "reason": "", + "report_age_s": 0.2, "resume_ok": true, "up_c": 22.46, "verdict": "OK" @@ -18848,11 +19263,11 @@ { "accel_watch": "watch", "armed": false, - "down_c": 22.38, + "down_c": 22.3, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 2660, + "reading": 2653, "state": "idle" }, "exhaust": { @@ -18862,12 +19277,65 @@ }, "intake_1": { "floor": 2290, - "reading": 731, + "reading": 724, "state": "idle" }, "intake_2": { "floor": 2290, - "reading": 728, + "reading": 734, + "state": "idle" + }, + "purge": { + "floor": 300, + "reading": 628, + "state": "idle" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "idle", + "quiet_hold": false, + "reason": "", + "report_age_s": 0.7, + "resume_ok": true, + "up_c": 22.46, + "verdict": "OK" + }, + { + "accel_watch": "watch", + "armed": false, + "down_c": 22.69, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 2661, + "state": "idle" + }, + "exhaust": { + "floor": 6400, + "reading": 0, + "state": "idle" + }, + "intake_1": { + "floor": 2290, + "reading": 757, + "state": "idle" + }, + "intake_2": { + "floor": 2290, + "reading": 729, "state": "idle" }, "purge": { @@ -18893,19 +19361,19 @@ "phase": "idle", "quiet_hold": false, "reason": "", - "report_age_s": 0.1, + "report_age_s": 0.2, "resume_ok": true, - "up_c": 22.46, + "up_c": 22.62, "verdict": "OK" }, { "accel_watch": "watch", "armed": false, - "down_c": 21.91, + "down_c": 22.69, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 2677, + "reading": 2661, "state": "idle" }, "exhaust": { @@ -18915,17 +19383,17 @@ }, "intake_1": { "floor": 2290, - "reading": 731, + "reading": 757, "state": "idle" }, "intake_2": { "floor": 2290, - "reading": 735, + "reading": 729, "state": "idle" }, "purge": { "floor": 300, - "reading": 630, + "reading": 629, "state": "idle" } }, @@ -18946,178 +19414,19 @@ "phase": "idle", "quiet_hold": false, "reason": "", - "report_age_s": 0.6, + "report_age_s": 0.4, "resume_ok": true, - "up_c": 22.15, + "up_c": 22.62, "verdict": "OK" }, { "accel_watch": "watch", "armed": false, - "down_c": 21.91, + "down_c": 22.46, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 2677, - "state": "idle" - }, - "exhaust": { - "floor": 6400, - "reading": 0, - "state": "idle" - }, - "intake_1": { - "floor": 2290, - "reading": 731, - "state": "idle" - }, - "intake_2": { - "floor": 2290, - "reading": 735, - "state": "idle" - }, - "purge": { - "floor": 300, - "reading": 630, - "state": "idle" - } - }, - "fire_ok": true, - "fire_watch": "armed", - "gates_off": [], - "hold": false, - "limits": { - "air_assist_min_rpm": 6000, - "coolant_critical_c": 38.0, - "coolant_max_c": 33.0, - "coolant_min_c": 5.0, - "coolant_resume_c": 31.0, - "coolant_source": "local", - "exhaust_min_rpm": 6400, - "intake_min_rpm": 2290 - }, - "phase": "idle", - "quiet_hold": false, - "reason": "", - "report_age_s": 0.1, - "resume_ok": true, - "up_c": 22.15, - "verdict": "OK" - }, - { - "accel_watch": "watch", - "armed": false, - "down_c": 21.37, - "fan_gates": { - "air_assist": { - "floor": 6000, - "reading": 2681, - "state": "idle" - }, - "exhaust": { - "floor": 6400, - "reading": 0, - "state": "idle" - }, - "intake_1": { - "floor": 2290, - "reading": 735, - "state": "idle" - }, - "intake_2": { - "floor": 2290, - "reading": 735, - "state": "idle" - }, - "purge": { - "floor": 300, - "reading": 630, - "state": "idle" - } - }, - "fire_ok": true, - "fire_watch": "armed", - "gates_off": [], - "hold": false, - "limits": { - "air_assist_min_rpm": 6000, - "coolant_critical_c": 38.0, - "coolant_max_c": 33.0, - "coolant_min_c": 5.0, - "coolant_resume_c": 31.0, - "coolant_source": "local", - "exhaust_min_rpm": 6400, - "intake_min_rpm": 2290 - }, - "phase": "idle", - "quiet_hold": false, - "reason": "", - "report_age_s": 0.6, - "resume_ok": true, - "up_c": 21.91, - "verdict": "OK" - }, - { - "accel_watch": "watch", - "armed": false, - "down_c": 21.37, - "fan_gates": { - "air_assist": { - "floor": 6000, - "reading": 2681, - "state": "idle" - }, - "exhaust": { - "floor": 6400, - "reading": 0, - "state": "idle" - }, - "intake_1": { - "floor": 2290, - "reading": 735, - "state": "idle" - }, - "intake_2": { - "floor": 2290, - "reading": 735, - "state": "idle" - }, - "purge": { - "floor": 300, - "reading": 630, - "state": "idle" - } - }, - "fire_ok": true, - "fire_watch": "armed", - "gates_off": [], - "hold": false, - "limits": { - "air_assist_min_rpm": 6000, - "coolant_critical_c": 38.0, - "coolant_max_c": 33.0, - "coolant_min_c": 5.0, - "coolant_resume_c": 31.0, - "coolant_source": "local", - "exhaust_min_rpm": 6400, - "intake_min_rpm": 2290 - }, - "phase": "idle", - "quiet_hold": false, - "reason": "", - "report_age_s": 0.1, - "resume_ok": true, - "up_c": 21.91, - "verdict": "OK" - }, - { - "accel_watch": "watch", - "armed": false, - "down_c": 22.07, - "fan_gates": { - "air_assist": { - "floor": 6000, - "reading": 2684, + "reading": 2674, "state": "unjudged" }, "exhaust": { @@ -19127,17 +19436,17 @@ }, "intake_1": { "floor": 2290, - "reading": 735, + "reading": 727, "state": "unjudged" }, "intake_2": { "floor": 2290, - "reading": 735, + "reading": 729, "state": "unjudged" }, "purge": { "floor": 300, - "reading": 630, + "reading": 629, "state": "grace" } }, @@ -19166,11 +19475,11 @@ { "accel_watch": "watch", "armed": false, - "down_c": 22.07, + "down_c": 22.46, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 2684, + "reading": 2674, "state": "unjudged" }, "exhaust": { @@ -19180,17 +19489,17 @@ }, "intake_1": { "floor": 2290, - "reading": 735, + "reading": 727, "state": "unjudged" }, "intake_2": { "floor": 2290, - "reading": 735, + "reading": 729, "state": "unjudged" }, "purge": { "floor": 300, - "reading": 630, + "reading": 629, "state": "grace" } }, @@ -19211,7 +19520,7 @@ "phase": "run", "quiet_hold": false, "reason": "", - "report_age_s": 0.1, + "report_age_s": 0.7, "resume_ok": true, "up_c": 22.38, "verdict": "OK" @@ -19219,117 +19528,11 @@ { "accel_watch": "watch", "armed": false, - "down_c": 22.54, + "down_c": 23.4, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 2695, - "state": "unjudged" - }, - "exhaust": { - "floor": 6400, - "reading": 0, - "state": "unjudged" - }, - "intake_1": { - "floor": 2290, - "reading": 735, - "state": "unjudged" - }, - "intake_2": { - "floor": 2290, - "reading": 728, - "state": "unjudged" - }, - "purge": { - "floor": 300, - "reading": 628, - "state": "grace" - } - }, - "fire_ok": true, - "fire_watch": "armed", - "gates_off": [], - "hold": false, - "limits": { - "air_assist_min_rpm": 6000, - "coolant_critical_c": 38.0, - "coolant_max_c": 33.0, - "coolant_min_c": 5.0, - "coolant_resume_c": 31.0, - "coolant_source": "local", - "exhaust_min_rpm": 6400, - "intake_min_rpm": 2290 - }, - "phase": "run", - "quiet_hold": false, - "reason": "", - "report_age_s": 0.6, - "resume_ok": true, - "up_c": 22.3, - "verdict": "OK" - }, - { - "accel_watch": "watch", - "armed": false, - "down_c": 22.54, - "fan_gates": { - "air_assist": { - "floor": 6000, - "reading": 2695, - "state": "unjudged" - }, - "exhaust": { - "floor": 6400, - "reading": 0, - "state": "unjudged" - }, - "intake_1": { - "floor": 2290, - "reading": 735, - "state": "unjudged" - }, - "intake_2": { - "floor": 2290, - "reading": 728, - "state": "unjudged" - }, - "purge": { - "floor": 300, - "reading": 628, - "state": "grace" - } - }, - "fire_ok": true, - "fire_watch": "armed", - "gates_off": [], - "hold": false, - "limits": { - "air_assist_min_rpm": 6000, - "coolant_critical_c": 38.0, - "coolant_max_c": 33.0, - "coolant_min_c": 5.0, - "coolant_resume_c": 31.0, - "coolant_source": "local", - "exhaust_min_rpm": 6400, - "intake_min_rpm": 2290 - }, - "phase": "run", - "quiet_hold": false, - "reason": "", - "report_age_s": 0.1, - "resume_ok": true, - "up_c": 22.3, - "verdict": "OK" - }, - { - "accel_watch": "watch", - "armed": false, - "down_c": 23.87, - "fan_gates": { - "air_assist": { - "floor": 6000, - "reading": 2544, + "reading": 2644, "state": "idle" }, "exhaust": { @@ -19339,17 +19542,17 @@ }, "intake_1": { "floor": 2290, - "reading": 732, + "reading": 727, "state": "idle" }, "intake_2": { "floor": 2290, - "reading": 728, + "reading": 729, "state": "idle" }, "purge": { "floor": 300, - "reading": 631, + "reading": 629, "state": "idle" } }, @@ -19370,19 +19573,19 @@ "phase": "idle", "quiet_hold": false, "reason": "", - "report_age_s": 0.1, + "report_age_s": 0.2, "resume_ok": true, - "up_c": 24.02, + "up_c": 23.63, "verdict": "OK" }, { "accel_watch": "watch", "armed": false, - "down_c": 23.87, + "down_c": 23.4, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 2544, + "reading": 2644, "state": "idle" }, "exhaust": { @@ -19392,17 +19595,17 @@ }, "intake_1": { "floor": 2290, - "reading": 732, + "reading": 727, "state": "idle" }, "intake_2": { "floor": 2290, - "reading": 728, + "reading": 729, "state": "idle" }, "purge": { "floor": 300, - "reading": 631, + "reading": 629, "state": "idle" } }, @@ -19423,13 +19626,66 @@ "phase": "idle", "quiet_hold": false, "reason": "", - "report_age_s": 0.1, + "report_age_s": 0.2, "resume_ok": true, - "up_c": 24.02, + "up_c": 23.63, + "verdict": "OK" + }, + { + "accel_watch": "watch", + "armed": false, + "down_c": 23.47, + "fan_gates": { + "air_assist": { + "floor": 6000, + "reading": 2383, + "state": "idle" + }, + "exhaust": { + "floor": 6400, + "reading": 0, + "state": "idle" + }, + "intake_1": { + "floor": 2290, + "reading": 727, + "state": "idle" + }, + "intake_2": { + "floor": 2290, + "reading": 734, + "state": "idle" + }, + "purge": { + "floor": 300, + "reading": 630, + "state": "idle" + } + }, + "fire_ok": true, + "fire_watch": "armed", + "gates_off": [], + "hold": false, + "limits": { + "air_assist_min_rpm": 6000, + "coolant_critical_c": 38.0, + "coolant_max_c": 33.0, + "coolant_min_c": 5.0, + "coolant_resume_c": 31.0, + "coolant_source": "local", + "exhaust_min_rpm": 6400, + "intake_min_rpm": 2290 + }, + "phase": "idle", + "quiet_hold": false, + "reason": "", + "report_age_s": 0.2, + "resume_ok": true, + "up_c": 23.63, "verdict": "OK" } ], - "hunt_line": "INFO basemachine:_finish_action hunt [1583582688]: finished with event \":completed\"", + "hunt_line": "INFO basemachine:_finish_action hunt [1583687284]: finished with event \":completed\"", "lens_homed": true, "lid_lamp": { "after_cloud": "236", @@ -19448,7 +19704,7 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 5598, + "pid": 6206, "why": "" }, "mode_before": { @@ -19457,7 +19713,7 @@ "local": false, "mode": "grbl", "motion": "verified", - "pid": 4549, + "pid": 5105, "why": "" }, "mode_cloud": { @@ -19466,60 +19722,60 @@ "local": false, "mode": "cloud", "motion": "verified", - "pid": 5369, + "pid": 5962, "why": "" }, "motions_after_lid_close": 4, "refusals_before_hunt_end": 0, "session": [ - "2026-09-09T16:25:41.509218+00:00 gfcloud[5369] INFO authentication:authenticate_machine SUCCESS", - "2026-09-09T16:25:42.636375+00:00 gfcloud[5369] INFO websocket:ws_connect ESTABLISHED" + "2026-09-09T20:24:29.687199+00:00 gfcloud[5962] INFO authentication:authenticate_machine SUCCESS", + "2026-09-09T20:24:30.807726+00:00 gfcloud[5962] INFO websocket:ws_connect ESTABLISHED" ] }, - "fingerprint": "b89284100d321421c9e1601217c8b1ecc4898862eda829ac3e661160a7450299", - "image": "20260909150456 (dev)", + "fingerprint": "a977da727bd85edcb6ab09f59f600deb0d5f22a5b80c7f2c7328e22bc00712ef", + "image": "20260909193551 (dev)", "log": [ - "16:25:37 start cloud.mode-switch (operator, api) in campaign c-20260909160235-7649", - "16:25:37 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:25:37 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:25:37 fixture: running unattended (no prompt can be answered)", - "16:25:37 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:25:37 baseline: pre: clean", - "16:25:37 mode: test needs grbl - already in grbl mode", - "16:25:37 mode before: {'mode': 'grbl', 'controller': 'running', 'pid': 4549, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", - "16:25:37 ACT lid open (fixture)", - "16:25:37 ACT lid open: done after 0.0 s", - "16:25:42 POST /mode controller=cloud -> 200 {'mode': 'cloud', 'controller': 'running', 'pid': 5369, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", - "16:25:42 mode after switch: {'mode': 'cloud', 'controller': 'running', 'pid': 5369, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", - "16:25:44 gfcloud: gfcloud[5369] INFO authentication:authenticate_machine SUCCESS", - "16:25:44 gfcloud: gfcloud[5369] INFO websocket:ws_connect ESTABLISHED", - "16:25:44 cloud session established: True; firmware probe: {'latest_gf_version': '2.6.0-2228', 'tested_against_gf': '2.6.0-2228', 'checked_at': 1788971141}", - "16:25:51 hunt: 15 status samples, 4 in phase run; verdicts ['OK']", - "16:25:51 hunt with the lid open: INFO basemachine:_finish_action hunt [1583582688]: finished with event \":completed\" (lens homed)", - "16:25:51 ACT lid close (fixture)", - "16:25:52 ACT lid close: done after 0.3 s", - "16:26:07 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:26:28 cloud mode stays up; the machine is quiet", - "16:26:28 4 service motion(s) completed after the lid closed", - "16:26:30 POST /mode controller=grbl -> 200 {'mode': 'grbl', 'controller': 'running', 'pid': 5598, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", - "16:26:30 mode after switch back: {'mode': 'grbl', 'controller': 'running', 'pid': 5598, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", - "16:26:33 grbl state after: Idle", - "16:26:33 position counters re-zeroed at the starting position; the baseline expects (0,0,0) at the end", - "16:26:33 head displacement since the switch: X 0.000 Y 0.000 mm", - "16:26:38 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:27:08 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:27:18 homing: homed=True after 44.3 s (kernel idle, grbl Idle)", - "16:27:18 gfhome: 2026-09-09T16:27:11.048151+00:00 gfhome[5612] INFO gfhome:home homing complete (service quiet 10s, 4 motion windows)", - "16:27:18 position counters re-zeroed at the starting position; the baseline expects (0,0,0) at the end", - "16:27:18 PASS: grbl -> cloud (session, hunt with the lid open, lens homed, airflow unjudged) -> grbl (port open, Idle), then $H homed in 44.3 s", - "16:27:18 baseline: post: clean", - "16:27:18 result PASS" + "20:24:26 start cloud.mode-switch (operator, api) in campaign c-20260909200054-7947", + "20:24:26 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:24:26 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:24:26 fixture: running unattended (no prompt can be answered)", + "20:24:26 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:24:26 baseline: pre: clean", + "20:24:26 mode: test needs grbl - already in grbl mode", + "20:24:26 mode before: {'mode': 'grbl', 'controller': 'running', 'pid': 5105, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", + "20:24:26 ACT lid open (fixture)", + "20:24:26 ACT lid open: done after 0.0 s", + "20:24:30 POST /mode controller=cloud -> 200 {'mode': 'cloud', 'controller': 'running', 'pid': 5962, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", + "20:24:30 mode after switch: {'mode': 'cloud', 'controller': 'running', 'pid': 5962, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", + "20:24:32 gfcloud: gfcloud[5962] INFO authentication:authenticate_machine SUCCESS", + "20:24:32 gfcloud: gfcloud[5962] INFO websocket:ws_connect ESTABLISHED", + "20:24:32 cloud session established: True; firmware probe: {'latest_gf_version': '2.6.0-2228', 'tested_against_gf': '2.6.0-2228', 'checked_at': 1788985469}", + "20:24:43 hunt: 21 status samples, 2 in phase run; verdicts ['OK']", + "20:24:43 hunt with the lid open: INFO basemachine:_finish_action hunt [1583687284]: finished with event \":completed\" (lens homed)", + "20:24:43 ACT lid close (fixture)", + "20:24:43 ACT lid close: done after 0.3 s", + "20:24:56 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:25:17 cloud mode stays up; the machine is quiet", + "20:25:17 4 service motion(s) completed after the lid closed", + "20:25:18 POST /mode controller=grbl -> 200 {'mode': 'grbl', 'controller': 'running', 'pid': 6206, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", + "20:25:18 mode after switch back: {'mode': 'grbl', 'controller': 'running', 'pid': 6206, 'motion': 'verified', 'gated': False, 'local': False, 'why': ''}", + "20:25:22 grbl state after: Idle", + "20:25:22 position counters re-zeroed at the starting position; the baseline expects (0,0,0) at the end", + "20:25:22 head displacement since the switch: X 0.000 Y 0.000 mm", + "20:25:28 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:25:58 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:26:08 homing: homed=True after 46.2 s (kernel idle, grbl Idle)", + "20:26:08 gfhome: 2026-09-09T20:26:01.189803+00:00 gfhome[6219] INFO gfhome:home homing complete (service quiet 10s, 4 motion windows)", + "20:26:08 position counters re-zeroed at the starting position; the baseline expects (0,0,0) at the end", + "20:26:08 PASS: grbl -> cloud (session, hunt with the lid open, lens homed, airflow unjudged) -> grbl (port open, Idle), then $H homed in 46.2 s", + "20:26:09 baseline: post: clean", + "20:26:09 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cloud.mode-switch", - "ts": "2026-09-09T16:27:18Z" + "ts": "2026-09-09T20:26:09Z" }, "requires": [ "forgectrl.auth", @@ -19622,7 +19878,7 @@ "src/main.c" ] ], - "fingerprint": "8fa48d6f97ec2f1ec86ee7a0bb9f6c154064f9e358fa7d0bbde1fdca7e90439b", + "fingerprint": "71d7c9afe97bde0c6eff8aaa28a83c835c1b388165caae2b91284d27cc5580aa", "hardware": "api", "id": "cloud.service-protocol", "inherited": false, @@ -19632,11 +19888,11 @@ { "answer": "Yes", "question": "Does the app show the print complete?", - "ts": "2026-09-09T17:00:41Z" + "ts": "2026-09-09T21:47:38Z" } ], - "campaign": "c-20260909160235-7649", - "duration_s": 73, + "campaign": "c-20260909204732-3fa9", + "duration_s": 55, "evidence": { "baseline": { "post": [], @@ -19644,14 +19900,14 @@ }, "batch": { "group": "attended", - "ts": "2026-09-09T16:34:09Z" + "ts": "2026-09-09T21:25:38Z" }, "downloads": [ - "2026-09-09_165951_hunt.info", - "2026-09-09_165958_motion.info", - "2026-09-09_170009_motion.info", - "2026-09-09_170017_motion.info", - "2026-09-09_170027_print.info" + "2026-09-09_214703_hunt.info", + "2026-09-09_214708_motion.info", + "2026-09-09_214720_motion.info", + "2026-09-09_214723_motion.info", + "2026-09-09_214729_print.info" ], "fixture": { "channels": [ @@ -19665,40 +19921,39 @@ }, "header_stfr": 10000, "header_tags": 134, - "hunt": "INFO basemachine:_finish_action hunt [1583596887]: finished with event \":completed\"", + "hunt": "INFO basemachine:_finish_action hunt [1583720750]: finished with event \":completed\"", "images_uploaded": 3, - "print": "INFO basemachine:_finish_action print [1583597163]: finished with event \":completed\"", + "print": "INFO basemachine:_finish_action print [1583720922]: finished with event \":completed\"", "pulse": "INFO websocket:fetch_motion pulse data is gzip-compressed, 405 byte body" }, - "fingerprint": "8fa48d6f97ec2f1ec86ee7a0bb9f6c154064f9e358fa7d0bbde1fdca7e90439b", - "image": "20260909150456 (dev)", + "fingerprint": "71d7c9afe97bde0c6eff8aaa28a83c835c1b388165caae2b91284d27cc5580aa", + "image": "20260909193551 (dev)", "log": [ - "16:59:43 start cloud.service-protocol (operator, api) in campaign c-20260909160235-7649", - "16:59:43 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:59:43 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:59:43 queued by the attended queue opened 2026-09-09T16:34:09Z", - "16:59:43 baseline: pre: clean", - "16:59:43 grbl mode: switching to cloud as the emulator", - "16:59:46 controller mode changed to cloud for the operator; the baseline keeps it", - "16:59:49 emulator session established: gfcloud[11733] INFO authentication:authenticate_machine SUCCESS; gfcloud[11733] INFO websocket:ws_connect ESTABLISHED", - "16:59:56 NOTICE: In the app the machine shows Ready (its bed image is the emulator's canned frame). Set up any small job and press Print. Nothing moves here; the test watches the service's print reach the emulator and complete.", - "17:00:14 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:00:28 print: INFO basemachine:_finish_action print [1583597163]: finished with event \":completed\"; 3 images uploaded; INFO websocket:fetch_motion pulse data is gzip-compressed, 405 byte body", - "17:00:28 the job's header: 134 tags, STfr 10000", - "17:00:28 PROMPT: Does the app show the print complete?", - "17:00:41 ANSWER: Yes", - "17:00:41 PASS: session, hunt, 3 image upload(s), a print downloaded (134-tag header) and completed, all against the real service with no hardware behind it", - "17:00:41 cloud mode: restarting the client with the machine, no hunt (was pid 11733)", - "17:00:44 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:00:56 the machine is back under the real client, no hunt", - "17:00:56 baseline: post: clean", - "17:00:56 result PASS" + "21:46:57 start cloud.service-protocol (operator, api) in campaign c-20260909204732-3fa9", + "21:46:57 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:46:57 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "21:46:57 queued by the attended queue opened 2026-09-09T21:25:38Z", + "21:46:57 baseline: pre: clean", + "21:46:57 grbl mode: switching to cloud as the emulator", + "21:47:00 controller mode changed to cloud for the operator; the baseline keeps it", + "21:47:03 emulator session established: gfcloud[16956] INFO authentication:authenticate_machine SUCCESS; gfcloud[16956] INFO websocket:ws_connect ESTABLISHED", + "21:47:06 NOTICE: In the app the machine shows Ready (its bed image is the emulator's canned frame). Set up any small job and press Print. Nothing moves here; the test watches the service's print reach the emulator and complete.", + "21:47:28 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:47:30 print: INFO basemachine:_finish_action print [1583720922]: finished with event \":completed\"; 3 images uploaded; INFO websocket:fetch_motion pulse data is gzip-compressed, 405 byte body", + "21:47:30 the job's header: 134 tags, STfr 10000", + "21:47:30 PROMPT: Does the app show the print complete?", + "21:47:38 ANSWER: Yes", + "21:47:38 PASS: session, hunt, 3 image upload(s), a print downloaded (134-tag header) and completed, all against the real service with no hardware behind it", + "21:47:38 cloud mode: restarting the client with the machine, no hunt (was pid 16956)", + "21:47:52 the machine is back under the real client, no hunt", + "21:47:53 baseline: post: clean", + "21:47:53 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cloud.service-protocol", - "ts": "2026-09-09T17:00:56Z" + "ts": "2026-09-09T21:47:53Z" }, "requires": [ "forgectrl.auth" @@ -19828,14 +20083,14 @@ "src/main.c" ] ], - "fingerprint": "5bef999590a320896e876f761fa9b798f738eda9e2e53526fd36f16dfc4a6e2b", + "fingerprint": "b1cd97167ac9c1c53f60f9fd1b81b61e24dd405ee33ac7d7500b1350a3b57933", "hardware": "api", "id": "cloud.lid-interlock-abort", "inherited": false, "kind": "live", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909204732-3fa9", "duration_s": 68, "evidence": { "actions": [ @@ -19844,67 +20099,63 @@ "channel": "button", "state": "press", "took_s": 6.76, - "ts": "2026-09-09T17:01:10Z" + "ts": "2026-09-09T20:59:33Z" }, { "by": "fixture", "channel": "lid", "state": "open", "took_s": 0.04, - "ts": "2026-09-09T17:01:17Z" + "ts": "2026-09-09T20:59:40Z" }, { "by": "fixture", "channel": "lid", "state": "close", "took_s": 0.33, - "ts": "2026-09-09T17:01:29Z" + "ts": "2026-09-09T20:59:52Z" }, { "by": "fixture", "channel": "button", "state": "press", "took_s": 4.51, - "ts": "2026-09-09T17:01:39Z" + "ts": "2026-09-09T21:00:02Z" }, { "by": "fixture", "channel": "interlock", "state": "open", "took_s": 0.04, - "ts": "2026-09-09T17:01:43Z" + "ts": "2026-09-09T21:00:07Z" }, { "by": "fixture", "channel": "lid", "state": "open", "took_s": 0.04, - "ts": "2026-09-09T17:01:44Z" + "ts": "2026-09-09T21:00:08Z" }, { "by": "fixture", "channel": "lid", "state": "close", "took_s": 0.33, - "ts": "2026-09-09T17:01:55Z" + "ts": "2026-09-09T21:00:19Z" }, { "by": "fixture", "channel": "interlock", "state": "close", "took_s": 0.33, - "ts": "2026-09-09T17:01:56Z" + "ts": "2026-09-09T21:00:20Z" } ], "baseline": { "post": [], "pre": [] }, - "batch": { - "group": "attended", - "ts": "2026-09-09T16:34:09Z" - }, - "edge_to_stop_ms": 9.0, + "edge_to_stop_ms": 8.3, "events_print1": [ "print:starting", "print:download:completed", @@ -19986,7 +20237,14 @@ }, "operator": { "ack_live": true, - "ts": "2026-09-09T17:00:56Z" + "ts": "2026-09-09T20:59:19Z" + }, + "prerequisites": { + "missing": [ + "laser.emission-witness" + ], + "overridden": true, + "ts": "2026-09-09T20:59:19Z" }, "restored": { "interlock_ok": true, @@ -19997,59 +20255,60 @@ "lid": false } }, - "fingerprint": "5bef999590a320896e876f761fa9b798f738eda9e2e53526fd36f16dfc4a6e2b", - "image": "20260909150456 (dev)", + "fingerprint": "b1cd97167ac9c1c53f60f9fd1b81b61e24dd405ee33ac7d7500b1350a3b57933", + "image": "20260909193551 (dev)", "log": [ - "17:00:56 start cloud.lid-interlock-abort (live, api) in campaign c-20260909160235-7649", - "17:00:56 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:00:56 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "17:00:56 queued by the attended queue opened 2026-09-09T16:34:09Z", - "17:00:56 baseline: pre: clean", - "17:00:56 cloud mode: restarting the client offline (was pid 11835)", - "17:01:00 offline service up: INFO offline:open OFFLINE service: no web session; listening on /run/gfcloud-offline.sock", - "17:01:09 job abort.puls: 486344 payload bytes, 49 s at STfr 10000", - "17:01:10 ACT button press (fixture)", - "17:01:17 ACT button press: done after 6.8 s", - "17:01:17 ACT lid open (fixture)", - "17:01:17 ACT lid open: done after 0.0 s", - "17:01:26 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:01:29 [lid] lid opened: seen", - "17:01:29 [lid] lid opened mid-run; stopping motion: seen", - "17:01:29 [lid] start return home: seen", - "17:01:29 [lid] return home complete: seen", - "17:01:29 [lid] print finished: seen", - "17:01:29 lid edge -> stop: 9.0 ms", - "17:01:29 [lid] kernel counters after the park: [0, 0, 0]", - "17:01:29 ACT lid close (fixture)", - "17:01:29 ACT lid close: done after 0.3 s", - "17:01:37 cloud mode stays up; the machine is quiet", - "17:01:39 ACT button press (fixture)", - "17:01:43 ACT button press: done after 4.5 s", - "17:01:43 ACT interlock open (fixture)", - "17:01:43 ACT interlock open: done after 0.0 s", - "17:01:44 ACT lid open (fixture)", - "17:01:44 ACT lid open: done after 0.0 s", - "17:01:55 [interlock] interlock opened mid-run; stopping motion: seen", - "17:01:55 [interlock] start return home: seen", - "17:01:55 [interlock] return home complete: seen", - "17:01:55 [interlock] print finished: seen", - "17:01:55 [interlock] kernel counters after the park: [0, 0, 0]", - "17:01:55 ACT lid close (fixture)", - "17:01:56 ACT lid close: done after 0.3 s", - "17:01:56 ACT interlock close (fixture)", - "17:01:56 ACT interlock close: done after 0.3 s", - "17:01:57 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:02:04 cloud mode stays up; the machine is quiet", - "17:02:04 PASS: lid open -> stop in 9.0 ms and park with the lid open; interlock open -> the same tail with the park running through a lid edge; both prints ':cancelled'", - "17:02:04 offline jobs removed from /tmp/forgetest", - "17:02:05 baseline: post: clean", - "17:02:05 result PASS" + "20:59:19 start cloud.lid-interlock-abort (live, api) in campaign c-20260909204732-3fa9", + "20:59:19 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:59:19 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:59:19 prerequisites overridden by the operator - not satisfied: laser.emission-witness", + "20:59:20 baseline: pre: clean", + "20:59:20 grbl mode: switching to cloud offline", + "20:59:23 controller mode changed to cloud for the operator; the baseline keeps it", + "20:59:24 offline service up: INFO offline:open OFFLINE service: no web session; listening on /run/gfcloud-offline.sock", + "20:59:32 job abort.puls: 486344 payload bytes, 49 s at STfr 10000", + "20:59:33 ACT button press (fixture)", + "20:59:40 ACT button press: done after 6.8 s", + "20:59:40 ACT lid open (fixture)", + "20:59:40 ACT lid open: done after 0.0 s", + "20:59:50 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:59:52 [lid] lid opened: seen", + "20:59:52 [lid] lid opened mid-run; stopping motion: seen", + "20:59:52 [lid] start return home: seen", + "20:59:52 [lid] return home complete: seen", + "20:59:52 [lid] print finished: seen", + "20:59:52 lid edge -> stop: 8.3 ms", + "20:59:52 [lid] kernel counters after the park: [0, 0, 0]", + "20:59:52 ACT lid close (fixture)", + "20:59:53 ACT lid close: done after 0.3 s", + "21:00:01 cloud mode stays up; the machine is quiet", + "21:00:02 ACT button press (fixture)", + "21:00:07 ACT button press: done after 4.5 s", + "21:00:07 ACT interlock open (fixture)", + "21:00:07 ACT interlock open: done after 0.0 s", + "21:00:08 ACT lid open (fixture)", + "21:00:08 ACT lid open: done after 0.0 s", + "21:00:19 [interlock] interlock opened mid-run; stopping motion: seen", + "21:00:19 [interlock] start return home: seen", + "21:00:19 [interlock] return home complete: seen", + "21:00:19 [interlock] print finished: seen", + "21:00:19 [interlock] kernel counters after the park: [0, 0, 0]", + "21:00:19 ACT lid close (fixture)", + "21:00:20 ACT lid close: done after 0.3 s", + "21:00:20 ACT interlock close (fixture)", + "21:00:20 ACT interlock close: done after 0.3 s", + "21:00:20 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:00:28 cloud mode stays up; the machine is quiet", + "21:00:28 PASS: lid open -> stop in 8.3 ms and park with the lid open; interlock open -> the same tail with the park running through a lid edge; both prints ':cancelled'", + "21:00:28 offline jobs removed from /tmp/forgetest", + "21:00:28 baseline: post: clean", + "21:00:28 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cloud.lid-interlock-abort", - "ts": "2026-09-09T17:02:05Z" + "ts": "2026-09-09T21:00:28Z" }, "requires": [ "laser.emission-witness" @@ -20179,14 +20438,14 @@ "src/main.c" ] ], - "fingerprint": "cb06a3d79baa40d9bc8db3e6b6b8f069805d6469dcbb81019031c2986539ea39", + "fingerprint": "d3826483dd4ca8396e0297b4ca0ff342183aedda9c31cfcac513dc7504ba587d", "hardware": "api", "id": "cloud.lid-during-button-wait", - "inherited": false, + "inherited": true, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", + "campaign": "c-20260909200054-7947", "duration_s": 38, "evidence": { "actions": [ @@ -20195,14 +20454,14 @@ "channel": "lid", "state": "open", "took_s": 0.05, - "ts": "2026-09-09T16:27:35Z" + "ts": "2026-09-09T20:26:26Z" }, { "by": "fixture", "channel": "lid", "state": "close", "took_s": 0.33, - "ts": "2026-09-09T16:27:48Z" + "ts": "2026-09-09T20:26:39Z" } ], "armed_after": false, @@ -20212,7 +20471,7 @@ }, "batch": { "group": "unattended", - "ts": "2026-09-09T16:02:35Z" + "ts": "2026-09-09T20:00:54Z" }, "button_dark": false, "events": [ @@ -20252,35 +20511,35 @@ "runs_started_after_wait": 0, "streaming_after": 0 }, - "fingerprint": "cb06a3d79baa40d9bc8db3e6b6b8f069805d6469dcbb81019031c2986539ea39", - "image": "20260909150456 (dev)", + "fingerprint": "d3826483dd4ca8396e0297b4ca0ff342183aedda9c31cfcac513dc7504ba587d", + "image": "20260909193551 (dev)", "log": [ - "16:27:18 start cloud.lid-during-button-wait (operator, api) in campaign c-20260909160235-7649", - "16:27:18 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:27:18 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:27:18 fixture: running unattended (no prompt can be answered)", - "16:27:18 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:27:18 baseline: pre: clean", - "16:27:18 grbl mode: switching to cloud offline", - "16:27:21 controller mode changed to cloud for the operator; the baseline keeps it", - "16:27:22 offline service up: INFO offline:open OFFLINE service: no web session; listening on /run/gfcloud-offline.sock", - "16:27:33 job wait.puls: 35015348 payload bytes, 3502 s at STfr 10000 (gzip)", - "16:27:35 ACT lid open (fixture)", - "16:27:35 ACT lid open: done after 0.1 s", - "16:27:48 ACT lid close (fixture)", - "16:27:49 ACT lid close: done after 0.3 s", - "16:27:49 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:27:57 cloud mode stays up; the machine is quiet", - "16:27:57 PASS: lid open at the button prompt canceled the print; latch locked, armed=false, button dark, ring empty with the feed stopped", - "16:27:57 offline jobs removed from /tmp/forgetest", - "16:27:57 baseline: post: clean", - "16:27:57 result PASS" + "20:26:09 start cloud.lid-during-button-wait (operator, api) in campaign c-20260909200054-7947", + "20:26:09 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:26:09 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:26:09 fixture: running unattended (no prompt can be answered)", + "20:26:09 queued by the unattended queue opened 2026-09-09T20:00:54Z", + "20:26:09 baseline: pre: clean", + "20:26:09 grbl mode: switching to cloud offline", + "20:26:12 controller mode changed to cloud for the operator; the baseline keeps it", + "20:26:13 offline service up: INFO offline:open OFFLINE service: no web session; listening on /run/gfcloud-offline.sock", + "20:26:23 job wait.puls: 35015348 payload bytes, 3502 s at STfr 10000 (gzip)", + "20:26:26 ACT lid open (fixture)", + "20:26:26 ACT lid open: done after 0.0 s", + "20:26:39 ACT lid close (fixture)", + "20:26:39 ACT lid close: done after 0.3 s", + "20:26:40 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:26:47 cloud mode stays up; the machine is quiet", + "20:26:47 PASS: lid open at the button prompt canceled the print; latch locked, armed=false, button dark, ring empty with the feed stopped", + "20:26:47 offline jobs removed from /tmp/forgetest", + "20:26:47 baseline: post: clean", + "20:26:47 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cloud.lid-during-button-wait", - "ts": "2026-09-09T16:27:57Z" + "ts": "2026-09-09T20:26:47Z" }, "requires": [], "satisfied": true, @@ -20420,23 +20679,23 @@ "src/main.c" ] ], - "fingerprint": "c0e8760c964a98ed7e78ab876d4b9068e39ccd850f667439ceb03d100c1dcf83", + "fingerprint": "38bba00938a450a24e9e5a50b1ab8f6c04f25a69c5d572d4f0649a38dfcc9cfe", "hardware": "api", "id": "cloud.verdict-hold", "inherited": false, "kind": "operator", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 316, + "campaign": "c-20260909204732-3fa9", + "duration_s": 186, "evidence": { "actions": [ { "by": "fixture", "channel": "button", "state": "press", - "took_s": 4.26, - "ts": "2026-09-09T16:27:59Z" + "took_s": 4.28, + "ts": "2026-09-09T20:47:47Z" } ], "armed_after": false, @@ -20451,10 +20710,6 @@ ], "pre": [] }, - "batch": { - "group": "unattended", - "ts": "2026-09-09T16:02:35Z" - }, "events": [ "print:starting", "print:download:completed", @@ -20492,30 +20747,30 @@ "cool_temp_start": "16" }, "print finished": "INFO basemachine:_finish_action print [9005]: finished with event \":completed\"", - "release_s": 262, + "release_s": 118, "warmup": { "accel_watch": "armed", "armed": true, - "down_c": 24.57, + "down_c": 26.4, "fan_gates": { "air_assist": { "floor": 6000, - "reading": 2807, + "reading": 2775, "state": "idle" }, "exhaust": { "floor": 6400, - "reading": 411, + "reading": 0, "state": "idle" }, "intake_1": { "floor": 2290, - "reading": 852, + "reading": 724, "state": "idle" }, "intake_2": { "floor": 2290, - "reading": 882, + "reading": 734, "state": "idle" }, "purge": { @@ -20541,47 +20796,41 @@ "phase": "warm-up", "quiet_hold": false, "reason": "", - "report_age_s": 1.0, + "report_age_s": 0.1, "resume_ok": false, - "up_c": 21.76, + "up_c": 22.93, "verdict": "WARMUP" } }, - "fingerprint": "c0e8760c964a98ed7e78ab876d4b9068e39ccd850f667439ceb03d100c1dcf83", - "image": "20260909150456 (dev)", + "fingerprint": "38bba00938a450a24e9e5a50b1ab8f6c04f25a69c5d572d4f0649a38dfcc9cfe", + "image": "20260909193551 (dev)", "log": [ - "16:27:57 start cloud.verdict-hold (operator, api) in campaign c-20260909160235-7649", - "16:27:57 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:27:57 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "16:27:57 fixture: running unattended (no prompt can be answered)", - "16:27:57 queued by the unattended queue opened 2026-09-09T16:02:35Z", - "16:27:57 baseline: pre: clean", - "16:27:57 the offline service is already up (pid 5770) - reusing it", - "16:27:57 job hold.puls: 324236 payload bytes, 32 s at STfr 10000", - "16:27:59 ACT button press (fixture)", - "16:28:03 ACT button press: done after 4.3 s", - "16:28:05 NOTICE: Warm-up: the loop heater brings the coolant to the gate; a few minutes. Do nothing.", - "16:28:28 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:28:58 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:29:28 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:29:58 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:30:29 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:30:59 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:31:29 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:31:59 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:32:30 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:33:00 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "16:33:10 PASS: the armed print waited 262 s on the warm-up, then ran and completed", - "16:33:10 restore: POST /settings {'cool_temp_min': '', 'cool_temp_start': '16'} -> 200", - "16:33:10 offline jobs removed from /tmp/forgetest", - "16:33:14 baseline: post: 1 leftover(s): cool=smoke/armed=False/hold=False (expected idle/unarmed/no hold) -> waited", - "16:33:14 result PASS" + "20:47:32 start cloud.verdict-hold (operator, api) in campaign c-20260909204732-3fa9", + "20:47:32 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:47:32 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "20:47:32 baseline: pre: clean", + "20:47:32 cloud mode: restarting the client offline (was pid 7480)", + "20:47:37 offline service up: INFO offline:open OFFLINE service: no web session; listening on /run/gfcloud-offline.sock", + "20:47:46 job hold.puls: 324236 payload bytes, 32 s at STfr 10000", + "20:47:47 ACT button press (fixture)", + "20:47:51 ACT button press: done after 4.3 s", + "20:47:53 NOTICE: Warm-up: the loop heater brings the coolant to the gate; a few minutes. Do nothing.", + "20:48:03 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:48:34 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:49:05 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:49:37 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:50:09 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "20:50:34 PASS: the armed print waited 118 s on the warm-up, then ran and completed", + "20:50:34 restore: POST /settings {'cool_temp_min': '', 'cool_temp_start': '16'} -> 200", + "20:50:34 offline jobs removed from /tmp/forgetest", + "20:50:39 baseline: post: 1 leftover(s): cool=smoke/armed=False/hold=False (expected idle/unarmed/no hold) -> waited", + "20:50:39 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cloud.verdict-hold", - "ts": "2026-09-09T16:33:14Z" + "ts": "2026-09-09T20:50:39Z" }, "requires": [ "cloud.lid-during-button-wait", @@ -20616,7 +20865,7 @@ "src/main.c" ] ], - "fingerprint": "bbf2f6456d85c7e143d95fe99535dc19700300a9556576983bbf5d3b1a40af77", + "fingerprint": "63215a1e3cd18bfb9193ac6c9d59cd3a334a025a157cf5e24f85dc36c25be560", "hardware": "api", "id": "cloud.pause-resume", "inherited": false, @@ -20626,31 +20875,31 @@ { "answer": "Done", "question": "In the Glowforge app: scrap on the bed, lid closed, a SMALL engrave or score job (about 30 s) set up. Click Done here, then press Print in the app and press the physical button when it lights white.", - "ts": "2026-09-09T17:02:53Z" + "ts": "2026-09-09T21:48:41Z" }, { "answer": "Yes", "question": "In the app: did the print's progress advance while it cut (not standing still, not jumping straight to nearly finished), and does the app show it complete?", - "ts": "2026-09-09T17:03:43Z" + "ts": "2026-09-09T21:49:17Z" } ], - "campaign": "c-20260909160235-7649", - "duration_s": 113, + "campaign": "c-20260909204732-3fa9", + "duration_s": 100, "evidence": { "actions": [ { "by": "fixture", "channel": "button", "state": "press", - "took_s": 1.02, - "ts": "2026-09-09T17:03:22Z" + "took_s": 1.26, + "ts": "2026-09-09T21:48:58Z" }, { "by": "fixture", "channel": "button", "state": "press", - "took_s": 1.02, - "ts": "2026-09-09T17:03:23Z" + "took_s": 1.01, + "ts": "2026-09-09T21:49:00Z" } ], "armed_after_resume": true, @@ -20660,11 +20909,11 @@ }, "batch": { "group": "attended", - "ts": "2026-09-09T16:34:09Z" + "ts": "2026-09-09T21:25:38Z" }, "effective_limits": [ - "2026-09-09T17:03:06.292321+00:00 forgectrl[6866] INFO cool: effective limits: coolant ceiling 33.0 C (local 33.0, header 50.0) resume 31.0 C; floors coolant 10.0 C (the job's), exhaust 6400 rpm, intak", - "2026-09-09T17:03:07.291164+00:00 forgectrl[6866] INFO cool: effective limits: coolant ceiling 33.0 C (local 33.0, header none 0.0) resume 31.0 C; floors coolant 5.0 C (local), exhaust 6400 rpm, intake" + "2026-09-09T21:48:44.457589+00:00 forgectrl[10700] INFO cool: effective limits: coolant ceiling 33.0 C (local 33.0, header 50.0) resume 31.0 C; floors coolant 10.0 C (the job's), exhaust 6400 rpm, inta", + "2026-09-09T21:48:45.457575+00:00 forgectrl[10700] INFO cool: effective limits: coolant ceiling 33.0 C (local 33.0, header none 0.0) resume 31.0 C; floors coolant 5.0 C (local), exhaust 6400 rpm, intak" ], "fixture": { "channels": [ @@ -20679,8 +20928,8 @@ "header_limits": "air_assist_min_rpm=116 coolant_max_c=33.0 coolant_min_c=5.0", "holds_before_the_print": [], "lifecycle": { - "cool down": "2026-09-09T17:03:27.943440+00:00 gfcloud[12088] INFO machine:_dwell cool down: holding 10.0 s", - "warm up": "2026-09-09T17:03:18.728679+00:00 gfcloud[12088] INFO machine:_dwell warm up: holding 3.0 s" + "cool down": "2026-09-09T21:49:04.183520+00:00 gfcloud[17082] INFO machine:_dwell cool down: holding 10.0 s", + "warm up": "2026-09-09T21:48:53.683665+00:00 gfcloud[17082] INFO machine:_dwell warm up: holding 3.0 s" }, "log": { "button pressed mid-run; pausing": true, @@ -20689,55 +20938,55 @@ "resuming (laser lead": true }, "log_end": { - "print finished": "INFO basemachine:_finish_action print [1583598478]: finished with event \":completed\"", + "print finished": "INFO basemachine:_finish_action print [1583721447]: finished with event \":completed\"", "return home complete": true }, "operator": { "ack_live": true, - "ts": "2026-09-09T17:02:05Z" + "ts": "2026-09-09T21:47:53Z" }, "progress_total": 40255, "relock_or_cancel_lines": 0 }, - "fingerprint": "bbf2f6456d85c7e143d95fe99535dc19700300a9556576983bbf5d3b1a40af77", - "image": "20260909150456 (dev)", + "fingerprint": "63215a1e3cd18bfb9193ac6c9d59cd3a334a025a157cf5e24f85dc36c25be560", + "image": "20260909193551 (dev)", "log": [ - "17:02:05 start cloud.pause-resume (live, api) in campaign c-20260909160235-7649", - "17:02:05 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:02:05 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "17:02:05 queued by the attended queue opened 2026-09-09T16:34:09Z", - "17:02:05 baseline: pre: clean", - "17:02:05 the running client is the offline service: restarting it with the service", - "17:02:05 cloud mode: restarting the cloud client for a fresh connect (was pid 11903)", - "17:02:11 cloud session established (pid 12088)", - "17:02:24 connect-time hunt: INFO basemachine:_finish_action hunt [1583598023]: finished with event \":completed\"", - "17:02:36 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:02:40 PROMPT: In the Glowforge app: scrap on the bed, lid closed, a SMALL engrave or score job (about 30 s) set up. Click Done here, then press Print in the app and press the physical button when it lights white.", - "17:02:53 ANSWER: Done", - "17:03:07 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:03:22 ACT button press (fixture)", - "17:03:23 ACT button press: done after 1.0 s", - "17:03:23 ACT button press (fixture)", - "17:03:24 ACT button press: done after 1.0 s", - "17:03:24 armed after the resume: True", - "17:03:38 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:03:39 warm-up: 2026-09-09T17:03:18.728679+00:00 gfcloud[12088] INFO machine:_dwell warm up: holding 3.0 s", - "17:03:39 rest: 2026-09-09T17:03:27.943440+00:00 gfcloud[12088] INFO machine:_dwell cool down: holding 10.0 s", - "17:03:39 progress reported against 40255 bytes", - "17:03:39 PROMPT: In the app: did the print's progress advance while it cut (not standing still, not jumping straight to nearly finished), and does the app show it complete?", - "17:03:43 ANSWER: Yes", - "17:03:43 job limits from the header (the print's): air_assist_min_rpm=116 coolant_max_c=33.0 coolant_min_c=5.0", - "17:03:43 engine effective limits: 2026-09-09T17:03:06.292321+00:00 forgectrl[6866] INFO cool: effective limits: coolant ceiling 33.0 C (local 33.0, header 50.0) resume 31.0 C; floors coolant 10.0 C (the job's), exhaust 6400 rpm, intak", - "17:03:58 cloud mode stays up; the machine is quiet", - "17:03:58 PASS: button pause/resume mid-print, warm-up and rest observed, progress reported, the job's limits passed through, job completed and parked", - "17:03:58 baseline: post: clean", - "17:03:58 result PASS" + "21:47:53 start cloud.pause-resume (live, api) in campaign c-20260909204732-3fa9", + "21:47:53 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:47:53 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "21:47:53 queued by the attended queue opened 2026-09-09T21:25:38Z", + "21:47:53 baseline: pre: clean", + "21:47:53 the running client (pid 17022) never hunted the machine under the service: restarting it with the hunt", + "21:47:53 cloud mode: restarting the cloud client for a fresh connect (was pid 17022)", + "21:47:59 cloud session established (pid 17082)", + "21:48:09 connect-time hunt: INFO basemachine:_finish_action hunt [1583721121]: finished with event \":completed\"", + "21:48:23 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:48:37 PROMPT: In the Glowforge app: scrap on the bed, lid closed, a SMALL engrave or score job (about 30 s) set up. Click Done here, then press Print in the app and press the physical button when it lights white.", + "21:48:41 ANSWER: Done", + "21:48:54 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:48:58 ACT button press (fixture)", + "21:49:00 ACT button press: done after 1.3 s", + "21:49:00 ACT button press (fixture)", + "21:49:01 ACT button press: done after 1.0 s", + "21:49:01 armed after the resume: True", + "21:49:15 warm-up: 2026-09-09T21:48:53.683665+00:00 gfcloud[17082] INFO machine:_dwell warm up: holding 3.0 s", + "21:49:15 rest: 2026-09-09T21:49:04.183520+00:00 gfcloud[17082] INFO machine:_dwell cool down: holding 10.0 s", + "21:49:15 progress reported against 40255 bytes", + "21:49:15 PROMPT: In the app: did the print's progress advance while it cut (not standing still, not jumping straight to nearly finished), and does the app show it complete?", + "21:49:17 ANSWER: Yes", + "21:49:17 job limits from the header (the print's): air_assist_min_rpm=116 coolant_max_c=33.0 coolant_min_c=5.0", + "21:49:17 engine effective limits: 2026-09-09T21:48:44.457589+00:00 forgectrl[10700] INFO cool: effective limits: coolant ceiling 33.0 C (local 33.0, header 50.0) resume 31.0 C; floors coolant 10.0 C (the job's), exhaust 6400 rpm, inta", + "21:49:25 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:49:34 cloud mode stays up; the machine is quiet", + "21:49:34 PASS: button pause/resume mid-print, warm-up and rest observed, progress reported, the job's limits passed through, job completed and parked", + "21:49:34 baseline: post: clean", + "21:49:34 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cloud.pause-resume", - "ts": "2026-09-09T17:03:58Z" + "ts": "2026-09-09T21:49:34Z" }, "requires": [ "laser.emission-witness" @@ -20867,37 +21116,37 @@ "src/main.c" ] ], - "fingerprint": "7d6d1af9c416486dbfa6326b45bb6ccf0b1639acec7d8b855cb63f167df58afe", + "fingerprint": "9652e09e222e673932e3675cdd198d0ecdb3f00432b38f6c861d2f74604245b5", "hardware": "api", "id": "cloud.oversize-stream", "inherited": false, "kind": "live", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 165, + "campaign": "c-20260909204732-3fa9", + "duration_s": 153, "evidence": { "actions": [ { "by": "fixture", "channel": "button", "state": "press", - "took_s": 4.52, - "ts": "2026-09-09T17:04:16Z" + "took_s": 5.26, + "ts": "2026-09-09T21:00:56Z" }, { "by": "fixture", "channel": "button", "state": "press", "took_s": 0.25, - "ts": "2026-09-09T17:06:21Z" + "ts": "2026-09-09T21:03:02Z" }, { "by": "fixture", "channel": "button", "state": "press", - "took_s": 0.78, - "ts": "2026-09-09T17:06:21Z" + "took_s": 0.75, + "ts": "2026-09-09T21:03:02Z" } ], "app_armed_after": false, @@ -20912,10 +21161,6 @@ "post": [], "pre": [] }, - "batch": { - "group": "attended", - "ts": "2026-09-09T16:34:09Z" - }, "button_dark": false, "events": [ "print:starting", @@ -20953,10 +21198,10 @@ "log": { "job is longer than the ring": true }, - "max_backtrack": 160544, + "max_backtrack": 161827, "operator": { "ack_live": true, - "ts": "2026-09-09T17:03:59Z" + "ts": "2026-09-09T21:00:51Z" }, "pause_log": { "button pressed mid-run; pausing": true, @@ -20964,6 +21209,13 @@ "paused at": true, "resuming (laser lead": true }, + "prerequisites": { + "missing": [ + "cloud.pause-resume" + ], + "overridden": true, + "ts": "2026-09-09T21:00:51Z" + }, "print_finished": "INFO basemachine:_finish_action print [9004]: finished with event \":cancelled\"", "progress_total": 35015348, "service_cancel": { @@ -20977,49 +21229,48 @@ "underruns_before": 4, "underruns_during": 4 }, - "fingerprint": "7d6d1af9c416486dbfa6326b45bb6ccf0b1639acec7d8b855cb63f167df58afe", - "image": "20260909150456 (dev)", + "fingerprint": "9652e09e222e673932e3675cdd198d0ecdb3f00432b38f6c861d2f74604245b5", + "image": "20260909193551 (dev)", "log": [ - "17:03:59 start cloud.oversize-stream (live, api) in campaign c-20260909160235-7649", - "17:03:59 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:03:59 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "17:03:59 queued by the attended queue opened 2026-09-09T16:34:09Z", - "17:03:59 baseline: pre: clean", - "17:03:59 cloud mode: restarting the client offline (was pid 12088)", - "17:04:03 offline service up: INFO offline:open OFFLINE service: no web session; listening on /run/gfcloud-offline.sock", - "17:04:14 job long.puls: 35015348 payload bytes, 3502 s at STfr 10000 (gzip)", - "17:04:16 ACT button press (fixture)", - "17:04:21 ACT button press: done after 4.5 s", - "17:04:21 program total at the start of the run: 33292288 bytes", - "17:04:21 NOTICE: Cutting: the test watches the ring being topped up for two minutes. Do nothing yet.", - "17:04:29 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:05:00 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:05:30 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:06:01 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:06:21 program total two minutes in: 34603008 bytes (+1310720)", - "17:06:21 progress reported against 35015348 bytes, kernel program total 34603008", - "17:06:21 max_backtrack while the feed runs: 160544 steps", - "17:06:21 ACT button press (fixture)", - "17:06:21 ACT button press: done after 0.3 s", - "17:06:21 ACT button press (fixture)", - "17:06:22 ACT button press: done after 0.8 s", - "17:06:22 canceled the print as the app would", - "17:06:32 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:06:35 [cancel] action canceled mid-run; stopping motion: seen", - "17:06:35 [cancel] start return home: seen", - "17:06:35 [cancel] return home complete: seen", - "17:06:35 [app] kernel counters after the park: [0, 0, 0]", - "17:06:43 cloud mode stays up; the machine is quiet", - "17:06:43 PASS: a job longer than the ring ran live-fed, total grew, no underrun; the app's cancel stopped it, parked, relocked and reported ':cancelled'", - "17:06:43 offline jobs removed from /tmp/forgetest", - "17:06:44 baseline: post: clean", - "17:06:44 result PASS" + "21:00:51 start cloud.oversize-stream (live, api) in campaign c-20260909204732-3fa9", + "21:00:51 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:00:51 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "21:00:51 prerequisites overridden by the operator - not satisfied: cloud.pause-resume", + "21:00:51 baseline: pre: clean", + "21:00:52 the offline service is already up (pid 10870) - reusing it", + "21:00:54 job long.puls: 35015348 payload bytes, 3502 s at STfr 10000 (gzip)", + "21:00:56 ACT button press (fixture)", + "21:01:02 ACT button press: done after 5.3 s", + "21:01:02 program total at the start of the run: 33292288 bytes", + "21:01:02 NOTICE: Cutting: the test watches the ring being topped up for two minutes. Do nothing yet.", + "21:01:22 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:01:52 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:02:23 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:02:53 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:03:02 program total two minutes in: 34603008 bytes (+1310720)", + "21:03:02 progress reported against 35015348 bytes, kernel program total 34603008", + "21:03:02 max_backtrack while the feed runs: 161827 steps", + "21:03:02 ACT button press (fixture)", + "21:03:02 ACT button press: done after 0.3 s", + "21:03:02 ACT button press (fixture)", + "21:03:03 ACT button press: done after 0.8 s", + "21:03:03 canceled the print as the app would", + "21:03:16 [cancel] action canceled mid-run; stopping motion: seen", + "21:03:16 [cancel] start return home: seen", + "21:03:16 [cancel] return home complete: seen", + "21:03:16 [app] kernel counters after the park: [0, 0, 0]", + "21:03:24 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:03:24 cloud mode stays up; the machine is quiet", + "21:03:24 PASS: a job longer than the ring ran live-fed, total grew, no underrun; the app's cancel stopped it, parked, relocked and reported ':cancelled'", + "21:03:24 offline jobs removed from /tmp/forgetest", + "21:03:24 baseline: post: clean", + "21:03:24 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cloud.oversize-stream", - "ts": "2026-09-09T17:06:44Z" + "ts": "2026-09-09T21:03:24Z" }, "requires": [ "cloud.lid-interlock-abort", @@ -21150,44 +21401,44 @@ "src/main.c" ] ], - "fingerprint": "e7fcc2ea845c6f63f1b39b092cfe328434d5fbf96b7e870f2064c76c32449be1", + "fingerprint": "f3f24c386731b322714538eb793e6ee92921f504db3bd801620e027dfa597347", "hardware": "api", "id": "cloud.paused-lid-cancel", "inherited": false, "kind": "live", "record": { "answers": [], - "campaign": "c-20260909160235-7649", - "duration_s": 28, + "campaign": "c-20260909204732-3fa9", + "duration_s": 30, "evidence": { "actions": [ { "by": "fixture", "channel": "button", "state": "press", - "took_s": 4.51, - "ts": "2026-09-09T17:06:46Z" + "took_s": 6.76, + "ts": "2026-09-09T21:03:40Z" }, { "by": "fixture", "channel": "button", "state": "press", - "took_s": 1.25, - "ts": "2026-09-09T17:06:50Z" + "took_s": 1.27, + "ts": "2026-09-09T21:03:47Z" }, { "by": "fixture", "channel": "lid", "state": "open", "took_s": 0.06, - "ts": "2026-09-09T17:06:51Z" + "ts": "2026-09-09T21:03:48Z" }, { "by": "fixture", "channel": "lid", "state": "close", - "took_s": 0.35, - "ts": "2026-09-09T17:07:04Z" + "took_s": 0.33, + "ts": "2026-09-09T21:04:01Z" } ], "armed_after": false, @@ -21195,10 +21446,6 @@ "post": [], "pre": [] }, - "batch": { - "group": "attended", - "ts": "2026-09-09T16:34:09Z" - }, "button_dark": false, "counters_after": [ 0, @@ -21246,46 +21493,53 @@ }, "operator": { "ack_live": true, - "ts": "2026-09-09T17:06:44Z" + "ts": "2026-09-09T21:03:39Z" }, "paused": { "button pressed mid-run; pausing": true, "paused at": true + }, + "prerequisites": { + "missing": [ + "cloud.pause-resume" + ], + "overridden": true, + "ts": "2026-09-09T21:03:39Z" } }, - "fingerprint": "e7fcc2ea845c6f63f1b39b092cfe328434d5fbf96b7e870f2064c76c32449be1", - "image": "20260909150456 (dev)", + "fingerprint": "f3f24c386731b322714538eb793e6ee92921f504db3bd801620e027dfa597347", + "image": "20260909193551 (dev)", "log": [ - "17:06:44 start cloud.paused-lid-cancel (live, api) in campaign c-20260909160235-7649", - "17:06:44 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", - "17:06:44 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", - "17:06:44 queued by the attended queue opened 2026-09-09T16:34:09Z", - "17:06:44 baseline: pre: clean", - "17:06:44 the offline service is already up (pid 12440) - reusing it", - "17:06:44 job paused.puls: 648452 payload bytes, 65 s at STfr 10000", - "17:06:46 ACT button press (fixture)", - "17:06:50 ACT button press: done after 4.5 s", - "17:06:50 ACT button press (fixture)", - "17:06:51 ACT button press: done after 1.3 s", - "17:06:51 ACT lid open (fixture)", - "17:06:51 ACT lid open: done after 0.1 s", - "17:07:03 [print] lid opened mid-run; stopping motion: seen", - "17:07:03 [print] start return home: seen", - "17:07:03 [print] return home complete: seen", - "17:07:03 [print] print finished: seen", - "17:07:04 ACT lid close (fixture)", - "17:07:04 ACT lid close: done after 0.4 s", - "17:07:12 cloud mode stays up; the machine is quiet", - "17:07:12 PASS: a paused print canceled by the lid stopped, parked, relocked and reported ':cancelled'", - "17:07:12 offline jobs removed from /tmp/forgetest", - "17:07:12 baseline: post: clean", - "17:07:12 result PASS" + "21:03:39 start cloud.paused-lid-cancel (live, api) in campaign c-20260909204732-3fa9", + "21:03:39 fixture up: forgefixture at 172.16.1.135, v1.0.0, covers lid, interlock, button", + "21:03:39 fixture: forgefixture at 172.16.1.135 covers lid, interlock, button", + "21:03:39 prerequisites overridden by the operator - not satisfied: cloud.pause-resume", + "21:03:39 baseline: pre: clean", + "21:03:39 the offline service is already up (pid 10870) - reusing it", + "21:03:39 job paused.puls: 648452 payload bytes, 65 s at STfr 10000", + "21:03:40 ACT button press (fixture)", + "21:03:47 ACT button press: done after 6.8 s", + "21:03:47 ACT button press (fixture)", + "21:03:48 ACT button press: done after 1.3 s", + "21:03:48 ACT lid open (fixture)", + "21:03:48 ACT lid open: done after 0.1 s", + "21:04:01 [print] lid opened mid-run; stopping motion: seen", + "21:04:01 [print] start return home: seen", + "21:04:01 [print] return home complete: seen", + "21:04:01 [print] print finished: seen", + "21:04:01 ACT lid close (fixture)", + "21:04:01 ACT lid close: done after 0.3 s", + "21:04:09 cloud mode stays up; the machine is quiet", + "21:04:09 PASS: a paused print canceled by the lid stopped, parked, relocked and reported ':cancelled'", + "21:04:09 offline jobs removed from /tmp/forgetest", + "21:04:09 baseline: post: clean", + "21:04:09 result PASS" ], - "manifest_sha": "58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84", + "manifest_sha": "d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d", "message": "", "result": "PASS", "test": "cloud.paused-lid-cancel", - "ts": "2026-09-09T17:07:12Z" + "ts": "2026-09-09T21:04:09Z" }, "requires": [ "cloud.pause-resume", diff --git a/releases/v0.0.1/acceptance.md b/releases/v0.0.1/acceptance.md index b9a500f..1094d45 100644 --- a/releases/v0.0.1/acceptance.md +++ b/releases/v0.0.1/acceptance.md @@ -1,97 +1,97 @@ -# ForgeFIRM acceptance - 20260909150456 (dev) +# ForgeFIRM acceptance - 20260909193551 (dev) -- Image: `20260909150456 (dev)` (forgefirm-image-dev) -- Manifest identity: `58b4d750b4244589ef26d802a50300c38bfa868fc460448386b4b530e100cf84` +- Image: `20260909193551 (dev)` (forgefirm-image-dev) +- Manifest identity: `d02c25b76481a559c9a67df278a181ed16912bd20c7ce7eb60f93ca140b1a64d` - Catalog: `e2a2fe18e70fee24f81780b33c7210a530bb6d3f5267503ed8a97ee493944241` -- Campaign: `c-20260909160235-7649` opened 2026-09-09T16:02:35Z -- Exported: 2026-09-09T17:13:20Z +- Campaign: `c-20260909204732-3fa9` opened 2026-09-09T20:47:32Z +- Exported: 2026-09-09T21:55:08Z - **Release authorized: YES** -- Tests: 83 total, 83 satisfied (0 inherited), 0 required +- Tests: 83 total, 83 satisfied (62 inherited), 0 required | Test | Kind | Result | Run at | Campaign | Inherited | |---|---|---|---|---|---| -| `image.health` | auto, core | PASS | 2026-09-09T16:02:36Z | `c-20260909160235-7649` | no | -| `image.license-bundle` | auto | PASS | 2026-09-09T16:02:40Z | `c-20260909160235-7649` | no | -| `kernel.latch-locked-idle` | auto, core | PASS | 2026-09-09T16:02:41Z | `c-20260909160235-7649` | no | -| `kernel.k1-k2` | auto, core, takeover | PASS | 2026-09-09T16:03:03Z | `c-20260909160235-7649` | no | -| `kernel.deadman-close` | auto, core, takeover | PASS | 2026-09-09T16:03:13Z | `c-20260909160235-7649` | no | -| `kernel.backtrack-bounds` | auto, core, takeover | PASS | 2026-09-09T16:03:31Z | `c-20260909160235-7649` | no | -| `kernel.fire-line` | auto, core, takeover | PASS | 2026-09-09T16:04:15Z | `c-20260909160235-7649` | no | -| `kernel.resume-lead` | auto, takeover | PASS | 2026-09-09T16:04:37Z | `c-20260909160235-7649` | no | -| `kernel.pic-soc-load` | auto | PASS | 2026-09-09T16:04:41Z | `c-20260909160235-7649` | no | -| `forgectrl.auth` | auto | PASS | 2026-09-09T16:04:42Z | `c-20260909160235-7649` | no | -| `forgectrl.settings-bounds` | auto | PASS | 2026-09-09T16:04:43Z | `c-20260909160235-7649` | no | -| `forgectrl.panel-serves` | auto | PASS | 2026-09-09T16:02:37Z | `c-20260909160235-7649` | no | -| `commission.gate-blocks-controllers` | auto, takeover | PASS | 2026-09-09T16:05:01Z | `c-20260909160235-7649` | no | -| `commission.override-until-reboot` | auto | PASS | 2026-09-09T16:05:02Z | `c-20260909160235-7649` | no | -| `commission.advisories-rehash` | auto, takeover | PASS | 2026-09-09T16:05:11Z | `c-20260909160235-7649` | no | -| `commission.account-login` | auto, takeover | PASS | 2026-09-09T16:06:01Z | `c-20260909160235-7649` | no | -| `commission.https-only-writes` | auto | PASS | 2026-09-09T16:06:01Z | `c-20260909160235-7649` | no | -| `commission.ssh-until-reboot` | auto | PASS | 2026-09-09T16:06:03Z | `c-20260909160235-7649` | no | -| `commission.cloud-disabled-surface` | auto | PASS | 2026-09-09T16:06:03Z | `c-20260909160235-7649` | no | -| `commission.factory-return` | auto | PASS | 2026-09-09T16:06:06Z | `c-20260909160235-7649` | no | -| `commission.mdns-announce` | auto | PASS | 2026-09-09T16:06:06Z | `c-20260909160235-7649` | no | -| `commission.first-run-flow` | operator, takeover | PASS | 2026-09-09T16:06:28Z | `c-20260909160235-7649` | no | -| `commission.first-run-page` | operator, takeover | PASS | 2026-09-09T16:36:40Z | `c-20260909160235-7649` | no | -| `commission.cert-page` | auto | PASS | 2026-09-09T16:06:28Z | `c-20260909160235-7649` | no | -| `commission.what-changed` | auto, takeover | PASS | 2026-09-09T16:06:37Z | `c-20260909160235-7649` | no | -| `commission.record-export` | auto | PASS | 2026-09-09T16:07:57Z | `c-20260909160235-7649` | no | -| `commission.mirror` | auto, takeover | PASS | 2026-09-09T16:08:30Z | `c-20260909160235-7649` | no | -| `commission.check-switches` | operator | PASS | 2026-09-09T16:08:35Z | `c-20260909160235-7649` | no | -| `commission.check-sensors` | auto | PASS | 2026-09-09T16:08:10Z | `c-20260909160235-7649` | no | -| `commission.check-airflow` | auto, takeover | PASS | 2026-09-09T16:10:07Z | `c-20260909160235-7649` | no | -| `commission.check-cameras` | operator | PASS | 2026-09-09T16:10:38Z | `c-20260909160235-7649` | no | -| `commission.check-motion` | auto, takeover | PASS | 2026-09-09T16:11:19Z | `c-20260909160235-7649` | no | -| `commission.check-flow-verify` | auto, takeover | PASS | 2026-09-09T16:18:38Z | `c-20260909160235-7649` | no | -| `commission.cloud-header-capture` | operator, takeover | PASS | 2026-09-09T16:37:55Z | `c-20260909160235-7649` | no | -| `commission.sheet` | live, takeover | PASS | 2026-09-09T16:54:01Z | `c-20260909160235-7649` | no | -| `logs.tree-tail-export` | auto | PASS | 2026-09-09T16:07:17Z | `c-20260909160235-7649` | no | -| `logs.routing` | auto | PASS | 2026-09-09T16:18:42Z | `c-20260909160235-7649` | no | -| `logs.level-settings` | auto | PASS | 2026-09-09T16:18:42Z | `c-20260909160235-7649` | no | -| `motion.pacing` | auto | PASS | 2026-09-09T16:10:53Z | `c-20260909160235-7649` | no | -| `motion.jog-roundtrip` | auto | PASS | 2026-09-09T16:18:56Z | `c-20260909160235-7649` | no | -| `motion.microstep-modes` | auto | PASS | 2026-09-09T16:19:20Z | `c-20260909160235-7649` | no | -| `motion.liveness-probe` | auto | PASS | 2026-09-09T16:19:29Z | `c-20260909160235-7649` | no | -| `motion.gate-waits-for-lid` | operator | PASS | 2026-09-09T16:19:45Z | `c-20260909160235-7649` | no | -| `motion.cancel-abort` | auto | PASS | 2026-09-09T16:19:52Z | `c-20260909160235-7649` | no | -| `motion.deadman` | auto | PASS | 2026-09-09T16:20:21Z | `c-20260909160235-7649` | no | -| `motion.button-hold-resume` | operator | PASS | 2026-09-09T16:20:32Z | `c-20260909160235-7649` | no | -| `motion.lid-cancel-home` | operator | PASS | 2026-09-09T16:20:48Z | `c-20260909160235-7649` | no | -| `motion.interlock-cancel-home` | operator | PASS | 2026-09-09T16:20:57Z | `c-20260909160235-7649` | no | -| `motion.lid-policy-hold` | operator | PASS | 2026-09-09T16:21:11Z | `c-20260909160235-7649` | no | -| `motion.step-timing-under-load` | auto | PASS | 2026-09-09T16:21:41Z | `c-20260909160235-7649` | no | -| `cooling.aa-offset-calibrate` | auto | PASS | 2026-09-09T16:12:52Z | `c-20260909160235-7649` | no | -| `cooling.flow-verify` | auto | PASS | 2026-09-09T16:15:33Z | `c-20260909160235-7649` | no | -| `cooling.fans-quiet-after-motion` | auto | PASS | 2026-09-09T16:22:37Z | `c-20260909160235-7649` | no | -| `cooling.gate-off` | auto | PASS | 2026-09-09T16:08:43Z | `c-20260909160235-7649` | no | -| `cooling.floor-and-warm-up` | auto | PASS | 2026-09-09T16:23:58Z | `c-20260909160235-7649` | no | -| `cooling.tec-drive` | auto | PASS | 2026-09-09T16:24:06Z | `c-20260909160235-7649` | no | -| `cooling.fire-watch-tiers` | auto | PASS | 2026-09-09T16:24:22Z | `c-20260909160235-7649` | no | -| `cooling.crash-watch-plumbing` | auto | PASS | 2026-09-09T16:24:29Z | `c-20260909160235-7649` | no | -| `cooling.critical-tier` | auto | PASS | 2026-09-09T16:24:38Z | `c-20260909160235-7649` | no | -| `cooling.fan-gate-trips` | auto | PASS | 2026-09-09T16:09:27Z | `c-20260909160235-7649` | no | -| `cooling.flow-under-load` | live | PASS | 2026-09-09T16:55:46Z | `c-20260909160235-7649` | no | -| `laser.power-floor` | auto | PASS | 2026-09-09T16:24:39Z | `c-20260909160235-7649` | no | -| `laser.emission-witness` | live, core | PASS | 2026-09-09T16:39:25Z | `c-20260909160235-7649` | no | -| `laser.m5-rapid-dark` | live | PASS | 2026-09-09T16:56:44Z | `c-20260909160235-7649` | no | -| `laser.disarm-in-hold` | live | PASS | 2026-09-09T16:58:24Z | `c-20260909160235-7649` | no | -| `laser.armed-kill` | live | PASS | 2026-09-09T16:59:11Z | `c-20260909160235-7649` | no | -| `laser.arm-wait-lid` | operator | PASS | 2026-09-09T16:24:41Z | `c-20260909160235-7649` | no | -| `laser.pause-resume-lid-cancel` | live | PASS | 2026-09-09T16:59:42Z | `c-20260909160235-7649` | no | -| `camera.snapshot` | auto | PASS | 2026-09-09T16:10:23Z | `c-20260909160235-7649` | no | -| `camera.sensor-profile` | auto | PASS | 2026-09-09T16:24:55Z | `c-20260909160235-7649` | no | -| `camera.h264-stream` | auto | PASS | 2026-09-09T16:25:08Z | `c-20260909160235-7649` | no | -| `camera.frame-health` | auto | PASS | 2026-09-09T16:25:21Z | `c-20260909160235-7649` | no | -| `camera.lid-privacy` | operator | PASS | 2026-09-09T16:25:36Z | `c-20260909160235-7649` | no | -| `camera.key-read` | auto | PASS | 2026-09-09T16:25:37Z | `c-20260909160235-7649` | no | -| `update.slots-and-signature` | auto | PASS | 2026-09-09T16:06:05Z | `c-20260909160235-7649` | no | -| `cloud.mode-switch` | operator | PASS | 2026-09-09T16:27:18Z | `c-20260909160235-7649` | no | -| `cloud.service-protocol` | operator | PASS | 2026-09-09T17:00:56Z | `c-20260909160235-7649` | no | -| `cloud.lid-interlock-abort` | live | PASS | 2026-09-09T17:02:05Z | `c-20260909160235-7649` | no | -| `cloud.lid-during-button-wait` | operator | PASS | 2026-09-09T16:27:57Z | `c-20260909160235-7649` | no | -| `cloud.verdict-hold` | operator | PASS | 2026-09-09T16:33:14Z | `c-20260909160235-7649` | no | -| `cloud.pause-resume` | live | PASS | 2026-09-09T17:03:58Z | `c-20260909160235-7649` | no | -| `cloud.oversize-stream` | live | PASS | 2026-09-09T17:06:44Z | `c-20260909160235-7649` | no | -| `cloud.paused-lid-cancel` | live | PASS | 2026-09-09T17:07:12Z | `c-20260909160235-7649` | no | +| `image.health` | auto, core | PASS | 2026-09-09T20:54:35Z | `c-20260909204732-3fa9` | no | +| `image.license-bundle` | auto | PASS | 2026-09-09T20:01:00Z | `c-20260909200054-7947` | yes | +| `kernel.latch-locked-idle` | auto, core | PASS | 2026-09-09T20:54:36Z | `c-20260909204732-3fa9` | no | +| `kernel.k1-k2` | auto, core, takeover | PASS | 2026-09-09T20:54:59Z | `c-20260909204732-3fa9` | no | +| `kernel.deadman-close` | auto, core, takeover | PASS | 2026-09-09T20:55:09Z | `c-20260909204732-3fa9` | no | +| `kernel.backtrack-bounds` | auto, core, takeover | PASS | 2026-09-09T20:55:28Z | `c-20260909204732-3fa9` | no | +| `kernel.fire-line` | auto, core, takeover | PASS | 2026-09-09T20:56:12Z | `c-20260909204732-3fa9` | no | +| `kernel.resume-lead` | auto, takeover | PASS | 2026-09-09T20:02:56Z | `c-20260909200054-7947` | yes | +| `kernel.pic-soc-load` | auto | PASS | 2026-09-09T20:03:00Z | `c-20260909200054-7947` | yes | +| `forgectrl.auth` | auto | PASS | 2026-09-09T20:03:01Z | `c-20260909200054-7947` | yes | +| `forgectrl.settings-bounds` | auto | PASS | 2026-09-09T20:03:01Z | `c-20260909200054-7947` | yes | +| `forgectrl.panel-serves` | auto | PASS | 2026-09-09T20:00:57Z | `c-20260909200054-7947` | yes | +| `commission.gate-blocks-controllers` | auto, takeover | PASS | 2026-09-09T20:03:20Z | `c-20260909200054-7947` | yes | +| `commission.override-until-reboot` | auto | PASS | 2026-09-09T20:03:20Z | `c-20260909200054-7947` | yes | +| `commission.advisories-rehash` | auto, takeover | PASS | 2026-09-09T20:03:29Z | `c-20260909200054-7947` | yes | +| `commission.account-login` | auto, takeover | PASS | 2026-09-09T20:04:19Z | `c-20260909200054-7947` | yes | +| `commission.https-only-writes` | auto | PASS | 2026-09-09T20:04:19Z | `c-20260909200054-7947` | yes | +| `commission.ssh-until-reboot` | auto | PASS | 2026-09-09T20:04:20Z | `c-20260909200054-7947` | yes | +| `commission.cloud-disabled-surface` | auto | PASS | 2026-09-09T20:04:21Z | `c-20260909200054-7947` | yes | +| `commission.factory-return` | auto | PASS | 2026-09-09T20:04:23Z | `c-20260909200054-7947` | yes | +| `commission.mdns-announce` | auto | PASS | 2026-09-09T20:04:24Z | `c-20260909200054-7947` | yes | +| `commission.first-run-flow` | operator, takeover | PASS | 2026-09-09T20:04:46Z | `c-20260909200054-7947` | yes | +| `commission.first-run-page` | operator, takeover | PASS | 2026-09-09T20:58:30Z | `c-20260909204732-3fa9` | no | +| `commission.cert-page` | auto | PASS | 2026-09-09T20:04:47Z | `c-20260909200054-7947` | yes | +| `commission.what-changed` | auto, takeover | PASS | 2026-09-09T20:04:56Z | `c-20260909200054-7947` | yes | +| `commission.record-export` | auto | PASS | 2026-09-09T20:06:17Z | `c-20260909200054-7947` | yes | +| `commission.mirror` | auto, takeover | PASS | 2026-09-09T20:06:49Z | `c-20260909200054-7947` | yes | +| `commission.check-switches` | operator | PASS | 2026-09-09T20:06:54Z | `c-20260909200054-7947` | yes | +| `commission.check-sensors` | auto | PASS | 2026-09-09T20:06:29Z | `c-20260909200054-7947` | yes | +| `commission.check-airflow` | auto, takeover | PASS | 2026-09-09T20:08:28Z | `c-20260909200054-7947` | yes | +| `commission.check-cameras` | operator | PASS | 2026-09-09T20:08:59Z | `c-20260909200054-7947` | yes | +| `commission.check-motion` | auto, takeover | PASS | 2026-09-09T20:09:40Z | `c-20260909200054-7947` | yes | +| `commission.check-flow-verify` | auto, takeover | PASS | 2026-09-09T20:17:05Z | `c-20260909200054-7947` | yes | +| `commission.cloud-header-capture` | operator, takeover | PASS | 2026-09-09T21:26:48Z | `c-20260909204732-3fa9` | no | +| `commission.sheet` | live, takeover | PASS | 2026-09-09T21:41:23Z | `c-20260909204732-3fa9` | no | +| `logs.tree-tail-export` | auto | PASS | 2026-09-09T20:05:36Z | `c-20260909200054-7947` | yes | +| `logs.routing` | auto | PASS | 2026-09-09T20:17:09Z | `c-20260909200054-7947` | yes | +| `logs.level-settings` | auto | PASS | 2026-09-09T20:17:09Z | `c-20260909200054-7947` | yes | +| `motion.pacing` | auto | PASS | 2026-09-09T20:09:14Z | `c-20260909200054-7947` | yes | +| `motion.jog-roundtrip` | auto | PASS | 2026-09-09T20:17:23Z | `c-20260909200054-7947` | yes | +| `motion.microstep-modes` | auto | PASS | 2026-09-09T20:17:48Z | `c-20260909200054-7947` | yes | +| `motion.liveness-probe` | auto | PASS | 2026-09-09T20:17:56Z | `c-20260909200054-7947` | yes | +| `motion.gate-waits-for-lid` | operator | PASS | 2026-09-09T20:18:12Z | `c-20260909200054-7947` | yes | +| `motion.cancel-abort` | auto | PASS | 2026-09-09T20:18:19Z | `c-20260909200054-7947` | yes | +| `motion.deadman` | auto | PASS | 2026-09-09T20:18:49Z | `c-20260909200054-7947` | yes | +| `motion.button-hold-resume` | operator | PASS | 2026-09-09T20:19:00Z | `c-20260909200054-7947` | yes | +| `motion.lid-cancel-home` | operator | PASS | 2026-09-09T20:19:16Z | `c-20260909200054-7947` | yes | +| `motion.interlock-cancel-home` | operator | PASS | 2026-09-09T20:19:25Z | `c-20260909200054-7947` | yes | +| `motion.lid-policy-hold` | operator | PASS | 2026-09-09T20:19:38Z | `c-20260909200054-7947` | yes | +| `motion.step-timing-under-load` | auto | PASS | 2026-09-09T20:20:09Z | `c-20260909200054-7947` | yes | +| `cooling.aa-offset-calibrate` | auto | PASS | 2026-09-09T20:11:13Z | `c-20260909200054-7947` | yes | +| `cooling.flow-verify` | auto | PASS | 2026-09-09T20:13:58Z | `c-20260909200054-7947` | yes | +| `cooling.fans-quiet-after-motion` | auto | PASS | 2026-09-09T20:21:04Z | `c-20260909200054-7947` | yes | +| `cooling.gate-off` | auto | PASS | 2026-09-09T20:07:02Z | `c-20260909200054-7947` | yes | +| `cooling.floor-and-warm-up` | auto | PASS | 2026-09-09T20:22:31Z | `c-20260909200054-7947` | yes | +| `cooling.tec-drive` | auto | PASS | 2026-09-09T20:22:39Z | `c-20260909200054-7947` | yes | +| `cooling.fire-watch-tiers` | auto | PASS | 2026-09-09T20:22:55Z | `c-20260909200054-7947` | yes | +| `cooling.crash-watch-plumbing` | auto | PASS | 2026-09-09T20:23:02Z | `c-20260909200054-7947` | yes | +| `cooling.critical-tier` | auto | PASS | 2026-09-09T20:23:11Z | `c-20260909200054-7947` | yes | +| `cooling.fan-gate-trips` | auto | PASS | 2026-09-09T20:07:48Z | `c-20260909200054-7947` | yes | +| `cooling.flow-under-load` | live | PASS | 2026-09-09T21:43:23Z | `c-20260909204732-3fa9` | no | +| `laser.power-floor` | auto | PASS | 2026-09-09T20:23:11Z | `c-20260909200054-7947` | yes | +| `laser.emission-witness` | live, core | PASS | 2026-09-09T21:27:32Z | `c-20260909204732-3fa9` | no | +| `laser.m5-rapid-dark` | live | PASS | 2026-09-09T21:44:10Z | `c-20260909204732-3fa9` | no | +| `laser.disarm-in-hold` | live | PASS | 2026-09-09T21:45:37Z | `c-20260909204732-3fa9` | no | +| `laser.armed-kill` | live | PASS | 2026-09-09T21:46:25Z | `c-20260909204732-3fa9` | no | +| `laser.arm-wait-lid` | operator | PASS | 2026-09-09T20:23:30Z | `c-20260909200054-7947` | yes | +| `laser.pause-resume-lid-cancel` | live | PASS | 2026-09-09T21:46:57Z | `c-20260909204732-3fa9` | no | +| `camera.snapshot` | auto | PASS | 2026-09-09T20:08:44Z | `c-20260909200054-7947` | yes | +| `camera.sensor-profile` | auto | PASS | 2026-09-09T20:23:43Z | `c-20260909200054-7947` | yes | +| `camera.h264-stream` | auto | PASS | 2026-09-09T20:23:57Z | `c-20260909200054-7947` | yes | +| `camera.frame-health` | auto | PASS | 2026-09-09T20:24:09Z | `c-20260909200054-7947` | yes | +| `camera.lid-privacy` | operator | PASS | 2026-09-09T20:24:25Z | `c-20260909200054-7947` | yes | +| `camera.key-read` | auto | PASS | 2026-09-09T20:24:26Z | `c-20260909200054-7947` | yes | +| `update.slots-and-signature` | auto | PASS | 2026-09-09T20:04:23Z | `c-20260909200054-7947` | yes | +| `cloud.mode-switch` | operator | PASS | 2026-09-09T20:26:09Z | `c-20260909200054-7947` | yes | +| `cloud.service-protocol` | operator | PASS | 2026-09-09T21:47:53Z | `c-20260909204732-3fa9` | no | +| `cloud.lid-interlock-abort` | live | PASS | 2026-09-09T21:00:28Z | `c-20260909204732-3fa9` | no | +| `cloud.lid-during-button-wait` | operator | PASS | 2026-09-09T20:26:47Z | `c-20260909200054-7947` | yes | +| `cloud.verdict-hold` | operator | PASS | 2026-09-09T20:50:39Z | `c-20260909204732-3fa9` | no | +| `cloud.pause-resume` | live | PASS | 2026-09-09T21:49:34Z | `c-20260909204732-3fa9` | no | +| `cloud.oversize-stream` | live | PASS | 2026-09-09T21:03:24Z | `c-20260909204732-3fa9` | no | +| `cloud.paused-lid-cancel` | live | PASS | 2026-09-09T21:04:09Z | `c-20260909204732-3fa9` | no | -Artifact sha256: `0984d4f8517148a64cbc9ddf1271f0371df890e15318f33ad5433567fec30a0f` +Artifact sha256: `2aa22f306e56792a8120de6d3b2b6817162f011544099da0c37540a0dae90b09`